You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ju...@apache.org on 2011/05/05 23:38:59 UTC

svn commit: r1099977 - in /sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/helper: ExternalServletContextWrapper.java SlingServletContext.java

Author: justin
Date: Thu May  5 21:38:58 2011
New Revision: 1099977

URL: http://svn.apache.org/viewvc?rev=1099977&view=rev
Log:
SLING-2073 - adding wrapper around other servlet context to unwrap SlingHttpServletRequest / SlingHttpServletResponse (or wrappers thereof) when doing cross-ctx include/forward

Added:
    sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/helper/ExternalServletContextWrapper.java
Modified:
    sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/helper/SlingServletContext.java

Added: sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/helper/ExternalServletContextWrapper.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/helper/ExternalServletContextWrapper.java?rev=1099977&view=auto
==============================================================================
--- sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/helper/ExternalServletContextWrapper.java (added)
+++ sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/helper/ExternalServletContextWrapper.java Thu May  5 21:38:58 2011
@@ -0,0 +1,196 @@
+/*
+ * 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.sling.engine.impl.helper;
+
+import java.io.IOException;
+import java.io.InputStream;
+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;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletRequestWrapper;
+import javax.servlet.ServletResponse;
+import javax.servlet.ServletResponseWrapper;
+
+import org.apache.sling.engine.impl.SlingHttpServletRequestImpl;
+import org.apache.sling.engine.impl.SlingHttpServletResponseImpl;
+
+/**
+ * Wrapper around a ServletContext for an external servlet context, i.e. one
+ * returned by servletContext.getContext(String)
+ */
+class ExternalServletContextWrapper implements ServletContext {
+
+    private final ServletContext delegate;
+
+    public ExternalServletContextWrapper(ServletContext sc) {
+        this.delegate = sc;
+    }
+
+    public ServletContext getContext(String s) {
+        return delegate.getContext(s);
+    }
+
+    public int getMajorVersion() {
+        return delegate.getMajorVersion();
+    }
+
+    public int getMinorVersion() {
+        return delegate.getMinorVersion();
+    }
+
+    public String getMimeType(String s) {
+        return delegate.getMimeType(s);
+    }
+
+    public Set getResourcePaths(String s) {
+        return delegate.getResourcePaths(s);
+    }
+
+    public URL getResource(String s) throws MalformedURLException {
+        return delegate.getResource(s);
+    }
+
+    public InputStream getResourceAsStream(String s) {
+        return delegate.getResourceAsStream(s);
+    }
+
+    public RequestDispatcher getRequestDispatcher(String s) {
+        return new RequestDispatcherWrapper(delegate.getRequestDispatcher(s));
+    }
+
+    public RequestDispatcher getNamedDispatcher(String s) {
+        return new RequestDispatcherWrapper(delegate.getNamedDispatcher(s));
+    }
+
+    public Servlet getServlet(String s) throws ServletException {
+        return delegate.getServlet(s);
+    }
+
+    public Enumeration getServlets() {
+        return delegate.getServlets();
+    }
+
+    public Enumeration getServletNames() {
+        return delegate.getServletNames();
+    }
+
+    public void log(String s) {
+        delegate.log(s);
+    }
+
+    public void log(Exception exception, String s) {
+        delegate.log(exception, s);
+    }
+
+    public void log(String s, Throwable throwable) {
+        delegate.log(s, throwable);
+    }
+
+    public String getRealPath(String s) {
+        return delegate.getRealPath(s);
+    }
+
+    public String getServerInfo() {
+        return delegate.getServerInfo();
+    }
+
+    public String getInitParameter(String s) {
+        return delegate.getInitParameter(s);
+    }
+
+    public Enumeration getInitParameterNames() {
+        return delegate.getInitParameterNames();
+    }
+
+    public Object getAttribute(String s) {
+        return delegate.getAttribute(s);
+    }
+
+    public Enumeration getAttributeNames() {
+        return delegate.getAttributeNames();
+    }
+
+    public void setAttribute(String s, Object obj) {
+        delegate.setAttribute(s, obj);
+    }
+
+    public void removeAttribute(String s) {
+        delegate.removeAttribute(s);
+    }
+
+    public String getServletContextName() {
+        return delegate.getServletContextName();
+    }
+
+    class RequestDispatcherWrapper implements RequestDispatcher {
+
+        private final RequestDispatcher delegate;
+
+        public RequestDispatcherWrapper(final RequestDispatcher rd) {
+            this.delegate = rd;
+        }
+
+        public void forward(final ServletRequest request, final ServletResponse response) throws ServletException,
+                IOException {
+            delegate.forward(unwrapServletRequest(request), unwrapServletResponse(response));
+        }
+
+        public void include(final ServletRequest request, final ServletResponse response) throws ServletException,
+                IOException {
+            delegate.include(unwrapServletRequest(request), unwrapServletResponse(response));
+        }
+
+        private ServletRequest unwrapServletRequest(ServletRequest request) {
+            ServletRequest lastRequest = request;
+            while (request != null) {
+                if (request instanceof SlingHttpServletRequestImpl) {
+                    return ((SlingHttpServletRequestImpl) request).getRequest();
+                } else if (request instanceof ServletRequestWrapper) {
+                    lastRequest = request;
+                    request = ((ServletRequestWrapper) request).getRequest();
+                } else {
+                    return request;
+                }
+            }
+            return lastRequest;
+        }
+
+        private ServletResponse unwrapServletResponse(ServletResponse response) {
+            ServletResponse lastResponse = response;
+            while (response != null) {
+                if (response instanceof SlingHttpServletRequestImpl) {
+                    return ((SlingHttpServletResponseImpl) response).getResponse();
+                } else if (response instanceof ServletRequestWrapper) {
+                    lastResponse = response;
+                    response = ((ServletResponseWrapper) response).getResponse();
+                } else {
+                    return response;
+                }
+            }
+            return lastResponse;
+        }
+
+    }
+
+}

Modified: sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/helper/SlingServletContext.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/helper/SlingServletContext.java?rev=1099977&r1=1099976&r2=1099977&view=diff
==============================================================================
--- sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/helper/SlingServletContext.java (original)
+++ sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/helper/SlingServletContext.java Thu May  5 21:38:58 2011
@@ -406,7 +406,10 @@ public class SlingServletContext impleme
     public ServletContext getContext(String uripath) {
         ServletContext delegatee = getServletContext();
         if (delegatee != null) {
-            return delegatee.getContext(uripath);
+            ServletContext otherContext = delegatee.getContext(uripath);
+            if (otherContext != null && otherContext != delegatee) {
+                return new ExternalServletContextWrapper(otherContext);
+            }
         }
 
         return null;