| /* |
| * 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); |
| } |
| } |