| /******************************************************************************* |
| * Copyright (c) 2008, 2010 VMware Inc. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * VMware Inc. - initial contribution |
| *******************************************************************************/ |
| |
| package org.eclipse.virgo.snaps.core.internal.webapp; |
| |
| import java.io.IOException; |
| import java.io.InputStream; |
| import java.net.MalformedURLException; |
| import java.net.URL; |
| import java.util.Enumeration; |
| import java.util.EventListener; |
| import java.util.HashSet; |
| import java.util.Map; |
| import java.util.Set; |
| import java.util.Vector; |
| import java.util.concurrent.ConcurrentHashMap; |
| |
| import javax.servlet.Filter; |
| import javax.servlet.FilterRegistration; |
| import javax.servlet.RequestDispatcher; |
| import javax.servlet.Servlet; |
| import javax.servlet.ServletContext; |
| import javax.servlet.ServletException; |
| import javax.servlet.ServletRegistration; |
| import javax.servlet.ServletRegistration.Dynamic; |
| import javax.servlet.SessionCookieConfig; |
| import javax.servlet.SessionTrackingMode; |
| import javax.servlet.descriptor.JspConfigDescriptor; |
| |
| import org.eclipse.virgo.snaps.core.internal.SnapException; |
| import org.eclipse.virgo.util.common.IterableEnumeration; |
| import org.osgi.framework.Bundle; |
| |
| /** |
| * TODO Document SnapServletContext |
| * <p /> |
| * |
| * <strong>Concurrent Semantics</strong><br /> |
| * |
| * TODO Document concurrent semantics of SnapServletContext |
| * |
| */ |
| public class SnapServletContext implements ServletContext { |
| |
| private static final String HOST_PATH_PREFIX = "host:"; |
| |
| private final ServletContext delegate; |
| |
| private final Bundle snapBundle; |
| |
| private final String snapContextPath; |
| |
| private final Map<String, Object> attributes = new ConcurrentHashMap<String, Object>(); |
| |
| public SnapServletContext(ServletContext delegate, Bundle snapBundle, String snapContextPath) { |
| this.delegate = delegate; |
| this.snapBundle = snapBundle; |
| this.snapContextPath = snapContextPath; |
| } |
| |
| public String getSnapContextPath() { |
| return this.snapContextPath; |
| } |
| |
| /** |
| * @param name |
| * @return |
| * @see javax.servlet.ServletContext#getAttribute(java.lang.String) |
| */ |
| public Object getAttribute(String name) { |
| Object attribute = this.attributes.get(name); |
| if (attribute == null) { |
| attribute = delegate.getAttribute(name); |
| } |
| return attribute; |
| } |
| |
| /** |
| * @return |
| * @see javax.servlet.ServletContext#getAttributeNames() |
| */ |
| public Enumeration<String> getAttributeNames() { |
| Set<String> attributeNamesSet = new HashSet<String>(this.attributes.keySet()); |
| IterableEnumeration<String> delegateAttributeNames = new IterableEnumeration<String>((Enumeration<String>) delegate.getAttributeNames()); |
| for (String delegateAttributeName : delegateAttributeNames) { |
| attributeNamesSet.add(delegateAttributeName); |
| } |
| Vector<String> attributeNames = new Vector<String>(); |
| for (String attributeName : attributeNamesSet) { |
| attributeNames.add(attributeName); |
| } |
| return attributeNames.elements(); |
| } |
| |
| /** |
| * @param uripath |
| * @return |
| * @see javax.servlet.ServletContext#getContext(java.lang.String) |
| */ |
| public ServletContext getContext(String uripath) { |
| return delegate.getContext(uripath); |
| } |
| |
| /** |
| * @return |
| * @see javax.servlet.ServletContext#getContextPath() |
| */ |
| public String getContextPath() { |
| return delegate.getContextPath(); |
| } |
| |
| /** |
| * @param name |
| * @return |
| * @see javax.servlet.ServletContext#getInitParameter(java.lang.String) |
| */ |
| public String getInitParameter(String name) { |
| return delegate.getInitParameter(name); |
| } |
| |
| /** |
| * @return |
| * @see javax.servlet.ServletContext#getInitParameterNames() |
| */ |
| public Enumeration<String> getInitParameterNames() { |
| return delegate.getInitParameterNames(); |
| } |
| |
| /** |
| * @return |
| * @see javax.servlet.ServletContext#getMajorVersion() |
| */ |
| public int getMajorVersion() { |
| return delegate.getMajorVersion(); |
| } |
| |
| /** |
| * @param file |
| * @return |
| * @see javax.servlet.ServletContext#getMimeType(java.lang.String) |
| */ |
| public String getMimeType(String file) { |
| return delegate.getMimeType(file); |
| } |
| |
| /** |
| * @return |
| * @see javax.servlet.ServletContext#getMinorVersion() |
| */ |
| public int getMinorVersion() { |
| return delegate.getMinorVersion(); |
| } |
| |
| /** |
| * @param name |
| * @return |
| * @see javax.servlet.ServletContext#getNamedDispatcher(java.lang.String) |
| */ |
| public RequestDispatcher getNamedDispatcher(String name) { |
| return delegate.getNamedDispatcher(name); |
| } |
| |
| /** |
| * @param path |
| * @return |
| * @see javax.servlet.ServletContext#getRealPath(java.lang.String) |
| */ |
| public String getRealPath(String path) { |
| return delegate.getRealPath(path); |
| } |
| |
| /** |
| * @param path |
| * @return |
| * @see javax.servlet.ServletContext#getRequestDispatcher(java.lang.String) |
| */ |
| public RequestDispatcher getRequestDispatcher(String path) { |
| return delegate.getRequestDispatcher(path); |
| } |
| |
| /** |
| * @param path |
| * @return |
| * @throws MalformedURLException |
| * @see javax.servlet.ServletContext#getResource(java.lang.String) |
| */ |
| public URL getResource(String path) throws MalformedURLException { |
| boolean hostOnly = false; |
| if (path.startsWith(HOST_PATH_PREFIX)) { |
| path = path.substring(HOST_PATH_PREFIX.length()); |
| hostOnly = true; |
| } |
| if (path == null || !path.startsWith("/")) { |
| throw new MalformedURLException(String.format("'%s' is not a valid resource path", path)); |
| } |
| if (hostOnly) { |
| return delegate.getResource(path); |
| } else { |
| URL resource = getLocalResource(path); |
| if (resource == null) { |
| resource = delegate.getResource(path); |
| } |
| return resource; |
| } |
| } |
| |
| private URL getLocalResource(String path) { |
| URL entry = this.snapBundle.getEntry(path); |
| if (entry == null && path.startsWith(this.snapContextPath)) { |
| entry = this.snapBundle.getEntry(path.substring(this.snapContextPath.length())); |
| } |
| return entry; |
| } |
| |
| /** |
| * @param path |
| * @return |
| * @see javax.servlet.ServletContext#getResourceAsStream(java.lang.String) |
| */ |
| public InputStream getResourceAsStream(String path) { |
| if (path.startsWith(HOST_PATH_PREFIX)) { |
| path = path.substring(HOST_PATH_PREFIX.length()); |
| } else { |
| URL resource = getLocalResource(path); |
| if (resource != null) { |
| try { |
| return resource.openStream(); |
| } catch (IOException e) { |
| throw new SnapException("Failed to open stream for resource " + resource + " in bundle " + this.snapBundle, e); |
| } |
| } |
| } |
| return delegate.getResourceAsStream(path); |
| } |
| |
| /** |
| * @param path |
| * @return |
| * @see javax.servlet.ServletContext#getResourcePaths(java.lang.String) |
| */ |
| public Set<String> getResourcePaths(String path) { |
| Enumeration<?> entryPaths = this.snapBundle.getEntryPaths(path); |
| if (entryPaths == null) { |
| return null; |
| } else { |
| Set<String> resourcePaths = new HashSet<String>(); |
| while (entryPaths.hasMoreElements()) { |
| String entryPath = (String) entryPaths.nextElement(); |
| if (path.startsWith("/") && !entryPath.startsWith("/")) { |
| entryPath = "/" + entryPath; |
| } |
| resourcePaths.add((String) entryPath); |
| } |
| return resourcePaths; |
| } |
| } |
| |
| /** |
| * @return |
| * @see javax.servlet.ServletContext#getServerInfo() |
| */ |
| public String getServerInfo() { |
| return delegate.getServerInfo(); |
| } |
| |
| /** |
| * @param name |
| * @return |
| * @throws ServletException |
| * @deprecated |
| * @see javax.servlet.ServletContext#getServlet(java.lang.String) |
| */ |
| public Servlet getServlet(String name) throws ServletException { |
| return delegate.getServlet(name); |
| } |
| |
| /** |
| * @return |
| * @see javax.servlet.ServletContext#getServletContextName() |
| */ |
| public String getServletContextName() { |
| return delegate.getServletContextName(); |
| } |
| |
| /** |
| * @return |
| * @deprecated |
| * @see javax.servlet.ServletContext#getServletNames() |
| */ |
| public Enumeration<String> getServletNames() { |
| return delegate.getServletNames(); |
| } |
| |
| /** |
| * @return |
| * @deprecated |
| * @see javax.servlet.ServletContext#getServlets() |
| */ |
| public Enumeration<Servlet> getServlets() { |
| return delegate.getServlets(); |
| } |
| |
| /** |
| * @param exception |
| * @param msg |
| * @deprecated |
| * @see javax.servlet.ServletContext#log(java.lang.Exception, java.lang.String) |
| */ |
| public void log(Exception exception, String msg) { |
| delegate.log(exception, msg); |
| } |
| |
| /** |
| * @param message |
| * @param throwable |
| * @see javax.servlet.ServletContext#log(java.lang.String, java.lang.Throwable) |
| */ |
| public void log(String message, Throwable throwable) { |
| delegate.log(message, throwable); |
| } |
| |
| /** |
| * @param msg |
| * @see javax.servlet.ServletContext#log(java.lang.String) |
| */ |
| public void log(String msg) { |
| delegate.log(msg); |
| } |
| |
| /** |
| * @param name |
| * @see javax.servlet.ServletContext#removeAttribute(java.lang.String) |
| */ |
| public void removeAttribute(String name) { |
| delegate.removeAttribute(name); |
| } |
| |
| /** |
| * @param name |
| * @param object |
| * @see javax.servlet.ServletContext#setAttribute(java.lang.String, java.lang.Object) |
| */ |
| public void setAttribute(String name, Object object) { |
| this.attributes.put(name, object); |
| } |
| |
| @Override |
| public int getEffectiveMajorVersion() { |
| return this.delegate.getEffectiveMajorVersion(); |
| } |
| |
| @Override |
| public int getEffectiveMinorVersion() { |
| return this.delegate.getEffectiveMinorVersion(); |
| } |
| |
| @Override |
| public boolean setInitParameter(String name, String value) { |
| return this.delegate.setInitParameter(name, value); |
| } |
| |
| @Override |
| public Dynamic addServlet(String servletName, String className) { |
| return this.delegate.addServlet(servletName, className); |
| } |
| |
| @Override |
| public Dynamic addServlet(String servletName, Servlet servlet) { |
| return this.delegate.addServlet(servletName, servlet); |
| } |
| |
| @Override |
| public Dynamic addServlet(String servletName, Class<? extends Servlet> servletClass) { |
| return this.delegate.addServlet(servletName, servletClass); |
| } |
| |
| @Override |
| public <T extends Servlet> T createServlet(Class<T> clazz) throws ServletException { |
| return this.delegate.createServlet(clazz); |
| } |
| |
| @Override |
| public ServletRegistration getServletRegistration(String servletName) { |
| return this.delegate.getServletRegistration(servletName); |
| } |
| |
| @Override |
| public Map<String, ? extends ServletRegistration> getServletRegistrations() { |
| return this.delegate.getServletRegistrations(); |
| } |
| |
| @Override |
| public javax.servlet.FilterRegistration.Dynamic addFilter(String filterName, String className) { |
| return this.delegate.addFilter(filterName, className); |
| } |
| |
| @Override |
| public javax.servlet.FilterRegistration.Dynamic addFilter(String filterName, Filter filter) { |
| return this.delegate.addFilter(filterName, filter); |
| } |
| |
| @Override |
| public javax.servlet.FilterRegistration.Dynamic addFilter(String filterName, Class<? extends Filter> filterClass) { |
| return this.delegate.addFilter(filterName, filterClass); |
| } |
| |
| @Override |
| public <T extends Filter> T createFilter(Class<T> clazz) throws ServletException { |
| return this.delegate.createFilter(clazz); |
| } |
| |
| @Override |
| public FilterRegistration getFilterRegistration(String filterName) { |
| return this.delegate.getFilterRegistration(filterName); |
| } |
| |
| @Override |
| public Map<String, ? extends FilterRegistration> getFilterRegistrations() { |
| return this.delegate.getFilterRegistrations(); |
| } |
| |
| @Override |
| public SessionCookieConfig getSessionCookieConfig() { |
| return this.delegate.getSessionCookieConfig(); |
| } |
| |
| @Override |
| public void setSessionTrackingModes(Set<SessionTrackingMode> sessionTrackingModes) { |
| this.delegate.setSessionTrackingModes(sessionTrackingModes); |
| } |
| |
| @Override |
| public Set<SessionTrackingMode> getDefaultSessionTrackingModes() { |
| return this.delegate.getDefaultSessionTrackingModes(); |
| } |
| |
| @Override |
| public Set<SessionTrackingMode> getEffectiveSessionTrackingModes() { |
| return this.delegate.getEffectiveSessionTrackingModes(); |
| } |
| |
| @Override |
| public void addListener(String className) { |
| this.delegate.addListener(className); |
| } |
| |
| @Override |
| public <T extends EventListener> void addListener(T t) { |
| this.delegate.addListener(t); |
| } |
| |
| @Override |
| public void addListener(Class<? extends EventListener> listenerClass) { |
| this.delegate.addListener(listenerClass); |
| } |
| |
| @Override |
| public <T extends EventListener> T createListener(Class<T> clazz) throws ServletException { |
| return this.delegate.createListener(clazz); |
| } |
| |
| @Override |
| public JspConfigDescriptor getJspConfigDescriptor() { |
| return this.delegate.getJspConfigDescriptor(); |
| } |
| |
| @Override |
| public ClassLoader getClassLoader() { |
| return this.delegate.getClassLoader(); |
| } |
| |
| @Override |
| public void declareRoles(String... roleNames) { |
| this.delegate.declareRoles(roleNames); |
| } |
| |
| @Override |
| public String getVirtualServerName() { |
| return this.delegate.getVirtualServerName(); |
| } |
| } |