| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You 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 org.apache.felix.http.proxy; |
| |
| 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.Map; |
| import java.util.Set; |
| |
| import javax.servlet.Filter; |
| import javax.servlet.FilterRegistration; |
| import javax.servlet.RequestDispatcher; |
| import javax.servlet.Servlet; |
| import javax.servlet.ServletConfig; |
| 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 javax.servlet.http.HttpServlet; |
| import javax.servlet.http.HttpServletRequest; |
| import javax.servlet.http.HttpServletRequestWrapper; |
| import javax.servlet.http.HttpServletResponse; |
| |
| import org.osgi.framework.BundleContext; |
| |
| public abstract class AbstractProxyServlet |
| extends HttpServlet |
| { |
| private volatile DispatcherTracker tracker; |
| |
| private volatile boolean initialized = false; |
| |
| private volatile ServletContext servletContext; |
| |
| @Override |
| public void init(ServletConfig config) |
| throws ServletException |
| { |
| super.init(config); |
| } |
| |
| private void doInit() |
| throws Exception |
| { |
| final ServletConfig origConfig = getServletConfig(); |
| ServletConfig config = origConfig; |
| if ( this.servletContext != null ) { |
| config = new ServletConfig() { |
| |
| @Override |
| public String getServletName() { |
| return origConfig.getServletName(); |
| } |
| |
| @Override |
| public ServletContext getServletContext() { |
| return servletContext; |
| } |
| |
| @Override |
| public Enumeration<String> getInitParameterNames() { |
| return origConfig.getInitParameterNames(); |
| } |
| |
| @Override |
| public String getInitParameter(String name) { |
| return origConfig.getInitParameter(name); |
| } |
| }; |
| } |
| this.tracker = new DispatcherTracker(getBundleContext(), null, config); |
| this.tracker.open(); |
| } |
| |
| @Override |
| protected void service(final HttpServletRequest req, final HttpServletResponse res) |
| throws ServletException, IOException |
| { |
| if ( !initialized ) { |
| synchronized ( this ) { |
| if (!initialized ) { |
| if ( ! "".equals(req.getServletPath()) ) { |
| this.servletContext = new ServletContextWrapper(req.getServletContext(), req.getContextPath() + req.getServletPath()); |
| } |
| |
| try { |
| doInit(); |
| } catch (ServletException e) { |
| throw e; |
| } catch (Exception e) { |
| throw new ServletException(e); |
| } |
| |
| this.initialized = true; |
| } |
| } |
| } |
| |
| final HttpServlet dispatcher = this.tracker.getDispatcher(); |
| if (dispatcher != null) { |
| final HttpServletRequest r = (this.servletContext == null ? req : new BridgeHttpServletRequest(req, this.servletContext)); |
| dispatcher.service(r, res); |
| } else { |
| res.sendError(HttpServletResponse.SC_SERVICE_UNAVAILABLE); |
| } |
| } |
| |
| @Override |
| public void destroy() |
| { |
| if ( this.tracker != null ) { |
| this.tracker.close(); |
| this.tracker = null; |
| } |
| super.destroy(); |
| } |
| |
| protected abstract BundleContext getBundleContext() |
| throws ServletException; |
| |
| |
| private static final class BridgeHttpServletRequest extends HttpServletRequestWrapper |
| { |
| private final ServletContext context; |
| |
| public BridgeHttpServletRequest(final HttpServletRequest req, final ServletContext context) |
| { |
| super(req); |
| this.context = context; |
| } |
| |
| @Override |
| public String getServletPath() |
| { |
| return ""; |
| } |
| |
| @Override |
| public String getContextPath() |
| { |
| return this.context.getContextPath(); |
| } |
| |
| @Override |
| public ServletContext getServletContext() { |
| return this.context; |
| } |
| |
| |
| } |
| |
| private static final class ServletContextWrapper implements ServletContext |
| { |
| private final ServletContext delegatee; |
| |
| private final String path; |
| |
| public ServletContextWrapper(final ServletContext sc, final String path) |
| { |
| this.delegatee = sc; |
| this.path = path; |
| } |
| |
| @Override |
| public String getContextPath() { |
| return path; |
| } |
| |
| @Override |
| public ServletContext getContext(String uripath) { |
| return delegatee.getContext(uripath); |
| } |
| |
| @Override |
| public int getMajorVersion() { |
| return delegatee.getMajorVersion(); |
| } |
| |
| @Override |
| public int getMinorVersion() { |
| return delegatee.getMinorVersion(); |
| } |
| |
| @Override |
| public int getEffectiveMajorVersion() { |
| return delegatee.getEffectiveMajorVersion(); |
| } |
| |
| @Override |
| public int getEffectiveMinorVersion() { |
| return delegatee.getEffectiveMinorVersion(); |
| } |
| |
| @Override |
| public String getMimeType(String file) { |
| return delegatee.getMimeType(file); |
| } |
| |
| @Override |
| public Set<String> getResourcePaths(String path) { |
| return delegatee.getResourcePaths(path); |
| } |
| |
| @Override |
| public URL getResource(String path) throws MalformedURLException { |
| return delegatee.getResource(path); |
| } |
| |
| @Override |
| public InputStream getResourceAsStream(String path) { |
| return delegatee.getResourceAsStream(path); |
| } |
| |
| @Override |
| public RequestDispatcher getRequestDispatcher(String path) { |
| return delegatee.getRequestDispatcher(path); |
| } |
| |
| @Override |
| public RequestDispatcher getNamedDispatcher(String name) { |
| return delegatee.getNamedDispatcher(name); |
| } |
| |
| @Override |
| public Servlet getServlet(String name) throws ServletException { |
| return delegatee.getServlet(name); |
| } |
| |
| @Override |
| public Enumeration<Servlet> getServlets() { |
| return delegatee.getServlets(); |
| } |
| |
| @Override |
| public Enumeration<String> getServletNames() { |
| return delegatee.getServletNames(); |
| } |
| |
| @Override |
| public void log(String msg) { |
| delegatee.log(msg); |
| } |
| |
| @Override |
| public void log(Exception exception, String msg) { |
| delegatee.log(exception, msg); |
| } |
| |
| @Override |
| public void log(String message, Throwable throwable) { |
| delegatee.log(message, throwable); |
| } |
| |
| @Override |
| public String getRealPath(String path) { |
| return delegatee.getRealPath(path); |
| } |
| |
| @Override |
| public String getServerInfo() { |
| return delegatee.getServerInfo(); |
| } |
| |
| @Override |
| public String getInitParameter(String name) { |
| return delegatee.getInitParameter(name); |
| } |
| |
| @Override |
| public Enumeration<String> getInitParameterNames() { |
| return delegatee.getInitParameterNames(); |
| } |
| |
| @Override |
| public boolean setInitParameter(String name, String value) { |
| return delegatee.setInitParameter(name, value); |
| } |
| |
| @Override |
| public Object getAttribute(String name) { |
| return delegatee.getAttribute(name); |
| } |
| |
| @Override |
| public Enumeration<String> getAttributeNames() { |
| return delegatee.getAttributeNames(); |
| } |
| |
| @Override |
| public void setAttribute(String name, Object object) { |
| delegatee.setAttribute(name, object); |
| } |
| |
| @Override |
| public void removeAttribute(String name) { |
| delegatee.removeAttribute(name); |
| } |
| |
| @Override |
| public String getServletContextName() { |
| return delegatee.getServletContextName(); |
| } |
| |
| @Override |
| public Dynamic addServlet(String servletName, String className) { |
| return delegatee.addServlet(servletName, className); |
| } |
| |
| @Override |
| public Dynamic addServlet(String servletName, Servlet servlet) { |
| return delegatee.addServlet(servletName, servlet); |
| } |
| |
| @Override |
| public Dynamic addServlet(String servletName, Class<? extends Servlet> servletClass) { |
| return delegatee.addServlet(servletName, servletClass); |
| } |
| |
| @Override |
| public <T extends Servlet> T createServlet(Class<T> clazz) throws ServletException { |
| return delegatee.createServlet(clazz); |
| } |
| |
| @Override |
| public ServletRegistration getServletRegistration(String servletName) { |
| return delegatee.getServletRegistration(servletName); |
| } |
| |
| @Override |
| public Map<String, ? extends ServletRegistration> getServletRegistrations() { |
| return delegatee.getServletRegistrations(); |
| } |
| |
| @Override |
| public javax.servlet.FilterRegistration.Dynamic addFilter(String filterName, String className) { |
| return delegatee.addFilter(filterName, className); |
| } |
| |
| @Override |
| public javax.servlet.FilterRegistration.Dynamic addFilter(String filterName, Filter filter) { |
| return delegatee.addFilter(filterName, filter); |
| } |
| |
| @Override |
| public javax.servlet.FilterRegistration.Dynamic addFilter(String filterName, |
| Class<? extends Filter> filterClass) { |
| return delegatee.addFilter(filterName, filterClass); |
| } |
| |
| @Override |
| public <T extends Filter> T createFilter(Class<T> clazz) throws ServletException { |
| return delegatee.createFilter(clazz); |
| } |
| |
| @Override |
| public FilterRegistration getFilterRegistration(String filterName) { |
| return delegatee.getFilterRegistration(filterName); |
| } |
| |
| @Override |
| public Map<String, ? extends FilterRegistration> getFilterRegistrations() { |
| return delegatee.getFilterRegistrations(); |
| } |
| |
| @Override |
| public SessionCookieConfig getSessionCookieConfig() { |
| return delegatee.getSessionCookieConfig(); |
| } |
| |
| @Override |
| public void setSessionTrackingModes(Set<SessionTrackingMode> sessionTrackingModes) { |
| delegatee.setSessionTrackingModes(sessionTrackingModes); |
| } |
| |
| @Override |
| public Set<SessionTrackingMode> getDefaultSessionTrackingModes() { |
| return delegatee.getDefaultSessionTrackingModes(); |
| } |
| |
| @Override |
| public Set<SessionTrackingMode> getEffectiveSessionTrackingModes() { |
| return delegatee.getEffectiveSessionTrackingModes(); |
| } |
| |
| @Override |
| public void addListener(String className) { |
| delegatee.addListener(className); |
| } |
| |
| @Override |
| public <T extends EventListener> void addListener(T t) { |
| delegatee.addListener(t); |
| } |
| |
| @Override |
| public void addListener(Class<? extends EventListener> listenerClass) { |
| delegatee.addListener(listenerClass); |
| } |
| |
| @Override |
| public <T extends EventListener> T createListener(Class<T> clazz) throws ServletException { |
| return delegatee.createListener(clazz); |
| } |
| |
| @Override |
| public JspConfigDescriptor getJspConfigDescriptor() { |
| return delegatee.getJspConfigDescriptor(); |
| } |
| |
| @Override |
| public ClassLoader getClassLoader() { |
| return delegatee.getClassLoader(); |
| } |
| |
| @Override |
| public void declareRoles(String... roleNames) { |
| delegatee.declareRoles(roleNames); |
| } |
| |
| @Override |
| public String getVirtualServerName() { |
| return delegatee.getVirtualServerName(); |
| } |
| |
| // 4.0.0 |
| |
| @Override |
| public Dynamic addJspFile(String servletName, String jspFile) { |
| return delegatee.addJspFile(servletName, jspFile); |
| } |
| |
| @Override |
| public int getSessionTimeout() { |
| return delegatee.getSessionTimeout(); |
| } |
| |
| @Override |
| public void setSessionTimeout(int sessionTimeout) { |
| delegatee.setSessionTimeout(sessionTimeout); |
| } |
| |
| @Override |
| public String getRequestCharacterEncoding() { |
| return delegatee.getRequestCharacterEncoding(); |
| } |
| |
| @Override |
| public void setRequestCharacterEncoding(String encoding) { |
| delegatee.setRequestCharacterEncoding(encoding); |
| } |
| |
| @Override |
| public String getResponseCharacterEncoding() { |
| return delegatee.getResponseCharacterEncoding(); |
| } |
| |
| @Override |
| public void setResponseCharacterEncoding(String encoding) { |
| delegatee.setResponseCharacterEncoding(encoding); |
| } |
| } |
| } |