blob: d6b321e998e49d29f386c3da660afb96932b2ba1 [file] [log] [blame]
/*
* Copyright 2007 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.google.gwt.dev.shell;
import com.google.gwt.dev.cfg.ModuleDef;
import com.google.gwt.dev.resource.Resource;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.lang.ref.WeakReference;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Enumeration;
import java.util.Set;
import javax.servlet.RequestDispatcher;
import javax.servlet.Servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
/**
* ServletContext proxy that implements the getResource and getResourceAsStream
* members so that they can work with the {@link GWTShellServlet}.
*/
class HostedModeServletContextProxy implements ServletContext {
private final ServletContext context;
/**
* Avoid pinning my moduleDef.
*/
private final WeakReference<ModuleDef> moduleDefRef;
private final WorkDirs workDirs;
HostedModeServletContextProxy(ServletContext context, ModuleDef moduleDef,
WorkDirs workDirs) {
this.context = context;
this.moduleDefRef = new WeakReference<ModuleDef>(moduleDef);
this.workDirs = workDirs;
}
/**
* @param arg0
* @return
* @see javax.servlet.ServletContext#getAttribute(java.lang.String)
*/
public Object getAttribute(String arg0) {
return context.getAttribute(arg0);
}
/**
* @return
* @see javax.servlet.ServletContext#getAttributeNames()
*/
@SuppressWarnings("unchecked")
public Enumeration<String> getAttributeNames() {
return context.getAttributeNames();
}
/**
* @param arg0
* @return
* @see javax.servlet.ServletContext#getContext(java.lang.String)
*/
public ServletContext getContext(String arg0) {
return context.getContext(arg0);
}
public String getContextPath() {
return context.getContextPath();
}
/**
* @param arg0
* @return
* @see javax.servlet.ServletContext#getInitParameter(java.lang.String)
*/
public String getInitParameter(String arg0) {
return context.getInitParameter(arg0);
}
/**
* @return
* @see javax.servlet.ServletContext#getInitParameterNames()
*/
public Enumeration<?> getInitParameterNames() {
return context.getInitParameterNames();
}
/**
* @return
* @see javax.servlet.ServletContext#getMajorVersion()
*/
public int getMajorVersion() {
return context.getMajorVersion();
}
/**
* @param arg0
* @return
* @see javax.servlet.ServletContext#getMimeType(java.lang.String)
*/
public String getMimeType(String arg0) {
return context.getMimeType(arg0);
}
/**
* @return
* @see javax.servlet.ServletContext#getMinorVersion()
*/
public int getMinorVersion() {
return context.getMinorVersion();
}
/**
* @param arg0
* @return
* @see javax.servlet.ServletContext#getNamedDispatcher(java.lang.String)
*/
public RequestDispatcher getNamedDispatcher(String arg0) {
return context.getNamedDispatcher(arg0);
}
/**
* @param arg0
* @return
* @see javax.servlet.ServletContext#getRealPath(java.lang.String)
*/
public String getRealPath(String arg0) {
return context.getRealPath(arg0);
}
/**
* @param arg0
* @return
* @see javax.servlet.ServletContext#getRequestDispatcher(java.lang.String)
*/
public RequestDispatcher getRequestDispatcher(String arg0) {
return context.getRequestDispatcher(arg0);
}
/**
* @param arg0
* @return
* @throws MalformedURLException
* @see javax.servlet.ServletContext#getResource(java.lang.String)
*/
@SuppressWarnings("deprecation")
public URL getResource(String path) throws MalformedURLException {
ModuleDef moduleDef = moduleDefRef.get();
assert (moduleDef != null) : "GWTShellServlet should have guaranteed that a"
+ " live servlet will never process a request for a dead module; if you"
+ " are using this servlet outside the context of processing a call,"
+ " then don't do that";
String moduleContext = "/" + moduleDef.getName() + "/";
if (!path.startsWith(moduleContext)) {
// Check for a renamed module
moduleContext = "/" + moduleDef.getCanonicalName() + "/";
if (!path.startsWith(moduleContext)) {
// This path is in a different context; just return null
return null;
}
}
String partialPath = path.substring(moduleContext.length());
// Try to get the resource from the application's public path
Resource publicResource = moduleDef.findPublicFile(partialPath);
if (publicResource != null) {
return publicResource.getURL();
}
// Otherwise try the path in the shell's public generated directory
File shellDir = workDirs.getShellPublicGenDir(moduleDef);
File requestedFile = new File(shellDir, partialPath);
if (requestedFile.exists()) {
return requestedFile.toURI().toURL();
}
/*
* If the user is coming from compiled web-mode, check the linker output
* directory for the file. We'll default to using the output directory of
* the first linker defined in the <set-linker> tab.
*/
File linkDir = workDirs.getCompilerOutputDir(moduleDef);
requestedFile = new File(linkDir, partialPath);
if (requestedFile.exists()) {
try {
return requestedFile.toURI().toURL();
} catch (MalformedURLException e) {
// ignore since it was speculative anyway
}
}
return null;
}
/**
* @param arg0
* @return
* @see javax.servlet.ServletContext#getResourceAsStream(java.lang.String)
*/
public InputStream getResourceAsStream(String arg0) {
URL url;
try {
url = getResource(arg0);
if (url != null) {
return url.openStream();
}
} catch (MalformedURLException e) {
// Ignore the exception; return null
} catch (IOException e) {
// Ignore the exception; return null
}
return null;
}
/**
*
* @param path
* @return
* @see javax.servlet.ServletContext#getResourcePaths(java.lang.String)
*/
@SuppressWarnings("unchecked")
public Set<String> getResourcePaths(String path) {
return context.getResourcePaths(path);
}
/**
* @return
* @see javax.servlet.ServletContext#getServerInfo()
*/
public String getServerInfo() {
return context.getServerInfo();
}
/**
* @param arg0
* @return
* @throws ServletException
* @deprecated
* @see javax.servlet.ServletContext#getServlet(java.lang.String)
*/
@Deprecated
public Servlet getServlet(String arg0) throws ServletException {
return context.getServlet(arg0);
}
/**
* @return
* @see javax.servlet.ServletContext#getServletContextName()
*/
public String getServletContextName() {
return context.getServletContextName();
}
/**
* @return
* @deprecated
* @see javax.servlet.ServletContext#getServletNames()
*/
@Deprecated
@SuppressWarnings("unchecked")
public Enumeration<String> getServletNames() {
return context.getServletNames();
}
/**
* @return
* @deprecated
* @see javax.servlet.ServletContext#getServlets()
*/
@Deprecated
@SuppressWarnings("unchecked")
public Enumeration<Servlet> getServlets() {
return context.getServlets();
}
/**
* @param arg0
* @param arg1
* @deprecated
* @see javax.servlet.ServletContext#log(java.lang.Exception,
* java.lang.String)
*/
@Deprecated
public void log(Exception arg0, String arg1) {
context.log(arg0, arg1);
}
/**
* @param arg0
* @see javax.servlet.ServletContext#log(java.lang.String)
*/
public void log(String arg0) {
context.log(arg0);
}
/**
* @param arg0
* @param arg1
* @see javax.servlet.ServletContext#log(java.lang.String,java.lang.Throwable)
*/
public void log(String arg0, Throwable arg1) {
context.log(arg0, arg1);
}
/**
* @param arg0
* @see javax.servlet.ServletContext#removeAttribute(java.lang.String)
*/
public void removeAttribute(String arg0) {
context.removeAttribute(arg0);
}
/**
* @param arg0
* @param arg1
* @see javax.servlet.ServletContext#setAttribute(java.lang.String,java.lang.Object)
*/
public void setAttribute(String arg0, Object arg1) {
context.setAttribute(arg0, arg1);
}
}