Author: bdelacretaz
Date: Wed Jul 14 15:19:44 2010
New Revision: 964078

URL: http://svn.apache.org/viewvc?rev=964078&view=rev
Log:
SLING-550 - use request/response objects that are safe to use outside of http 
request/response cycle. Requires SLING-1596 patch

Added:
    
sling/trunk/contrib/extensions/bgservlets/src/main/java/org/apache/sling/bgservlets/impl/BackgroundHttpServletRequest.java
   (with props)
    
sling/trunk/contrib/extensions/bgservlets/src/main/java/org/apache/sling/bgservlets/impl/BackgroundHttpServletResponse.java
      - copied, changed from r964041, 
sling/trunk/contrib/extensions/bgservlets/src/main/java/org/apache/sling/bgservlets/impl/ServletResponseWrapper.java
Removed:
    
sling/trunk/contrib/extensions/bgservlets/src/main/java/org/apache/sling/bgservlets/impl/ServletResponseWrapper.java
Modified:
    
sling/trunk/contrib/extensions/bgservlets/src/main/java/org/apache/sling/bgservlets/impl/FilterChainExecutionJob.java

Added: 
sling/trunk/contrib/extensions/bgservlets/src/main/java/org/apache/sling/bgservlets/impl/BackgroundHttpServletRequest.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/bgservlets/src/main/java/org/apache/sling/bgservlets/impl/BackgroundHttpServletRequest.java?rev=964078&view=auto
==============================================================================
--- 
sling/trunk/contrib/extensions/bgservlets/src/main/java/org/apache/sling/bgservlets/impl/BackgroundHttpServletRequest.java
 (added)
+++ 
sling/trunk/contrib/extensions/bgservlets/src/main/java/org/apache/sling/bgservlets/impl/BackgroundHttpServletRequest.java
 Wed Jul 14 15:19:44 2010
@@ -0,0 +1,396 @@
+/*
+ * 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.bgservlets.impl;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.security.Principal;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Locale;
+import java.util.Map;
+import java.util.ResourceBundle;
+
+import javax.servlet.RequestDispatcher;
+import javax.servlet.ServletInputStream;
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+
+import org.apache.sling.api.SlingHttpServletRequest;
+import org.apache.sling.api.request.RequestDispatcherOptions;
+import org.apache.sling.api.request.RequestParameter;
+import org.apache.sling.api.request.RequestParameterMap;
+import org.apache.sling.api.request.RequestPathInfo;
+import org.apache.sling.api.request.RequestProgressTracker;
+import org.apache.sling.api.resource.Resource;
+import org.apache.sling.api.resource.ResourceResolver;
+
+public class BackgroundHttpServletRequest implements SlingHttpServletRequest {
+
+       private final String contextPath;
+       private final String method;
+       private final String pathInfo;
+       private final RequestProgressTracker requestProgressTracker;
+       
+       private final Map<String, Object> attributes;
+       private final Map<String, ?> parameters;
+       
+       static class IteratorEnumeration<T> implements Enumeration<T> {
+               private final Iterator<T> it;
+               IteratorEnumeration(Iterator<T> it) {
+                       this.it = it;
+               }
+               public boolean hasMoreElements() {
+                       return it.hasNext();
+               }
+               public T nextElement() {
+                       return it.next();
+               }
+       }
+       
+       /** We throw this for any method for which we do not have data that's
+        *      safe to use outside of the container's request/response cycle.
+        *      Start by throwing this everywhere and implement methods as 
needed,
+        *      if their data is safe to use.
+        */
+       @SuppressWarnings("serial")
+       class UnsupportedBackgroundOperationException extends 
UnsupportedOperationException {
+               UnsupportedBackgroundOperationException() {
+                       super("This operation is not supported for background 
requests");
+               }
+       }
+       
+       @SuppressWarnings("unchecked")
+       BackgroundHttpServletRequest(HttpServletRequest r) {
+               
+               final SlingHttpServletRequest sr = (r instanceof 
SlingHttpServletRequest ? (SlingHttpServletRequest)r : null);
+               
+               // Store objects which are safe to use outside
+               // of the container's request/response cycle - the
+               // goal is to release r once this request starts
+               // executing in the background
+               contextPath = r.getContextPath();
+               method = r.getMethod();
+               pathInfo = r.getPathInfo();
+               
+               requestProgressTracker = (sr == null ? null : 
sr.getRequestProgressTracker());
+               
+               attributes = new HashMap<String, Object>();
+               final Enumeration<?> e = r.getAttributeNames();
+               while(e.hasMoreElements()) {
+                       final String key = (String)e.nextElement();
+                       attributes.put(key, r.getAttribute(key));
+               }
+               
+               parameters = new HashMap<String, String>();
+               parameters.putAll(r.getParameterMap());
+       }
+       
+       public String getAuthType() {
+               return null;
+       }
+
+       public String getContextPath() {
+               return contextPath;
+       }
+
+       public Cookie[] getCookies() {
+               return null;
+       }
+
+       public long getDateHeader(String arg0) {
+               return 0;
+       }
+
+       public String getHeader(String arg0) {
+               return null;
+       }
+
+       public Enumeration<?> getHeaderNames() {
+               return null;
+       }
+
+       public Enumeration<?> getHeaders(String name) {
+               return null;
+       }
+
+       public int getIntHeader(String name) {
+               return 0;
+       }
+
+       public String getMethod() {
+               return method;
+       }
+
+       public String getPathInfo() {
+               return pathInfo;
+       }
+
+       public String getPathTranslated() {
+               throw new UnsupportedBackgroundOperationException();
+       }
+
+       public String getQueryString() {
+               throw new UnsupportedBackgroundOperationException();
+       }
+
+       public String getRemoteUser() {
+               throw new UnsupportedBackgroundOperationException();
+       }
+
+       public String getRequestedSessionId() {
+               throw new UnsupportedBackgroundOperationException();
+       }
+
+       public String getRequestURI() {
+               throw new UnsupportedBackgroundOperationException();
+       }
+
+       public StringBuffer getRequestURL() {
+               throw new UnsupportedBackgroundOperationException();
+       }
+
+       public String getServletPath() {
+               throw new UnsupportedBackgroundOperationException();
+       }
+
+       public HttpSession getSession() {
+               throw new UnsupportedBackgroundOperationException();
+       }
+
+       public HttpSession getSession(boolean arg0) {
+               throw new UnsupportedBackgroundOperationException();
+       }
+
+       public Principal getUserPrincipal() {
+               throw new UnsupportedBackgroundOperationException();
+       }
+
+       public boolean isRequestedSessionIdFromCookie() {
+               throw new UnsupportedBackgroundOperationException();
+       }
+
+       public boolean isRequestedSessionIdFromUrl() {
+               throw new UnsupportedBackgroundOperationException();
+       }
+
+       public boolean isRequestedSessionIdFromURL() {
+               throw new UnsupportedBackgroundOperationException();
+       }
+
+       public boolean isRequestedSessionIdValid() {
+               throw new UnsupportedBackgroundOperationException();
+       }
+
+       public boolean isUserInRole(String arg0) {
+               throw new UnsupportedBackgroundOperationException();
+       }
+
+       public Object getAttribute(String name) {
+               return attributes.get(name);
+       }
+
+       public Enumeration<?> getAttributeNames() {
+               return new 
IteratorEnumeration<String>(attributes.keySet().iterator());
+       }
+
+       public String getCharacterEncoding() {
+               throw new UnsupportedBackgroundOperationException();
+       }
+
+       public int getContentLength() {
+               throw new UnsupportedBackgroundOperationException();
+       }
+
+       public String getContentType() {
+               throw new UnsupportedBackgroundOperationException();
+       }
+
+       public ServletInputStream getInputStream() throws IOException {
+               throw new UnsupportedBackgroundOperationException();
+       }
+
+       public String getLocalAddr() {
+               throw new UnsupportedBackgroundOperationException();
+       }
+
+       public Locale getLocale() {
+               throw new UnsupportedBackgroundOperationException();
+       }
+
+       public Enumeration getLocales() {
+               throw new UnsupportedBackgroundOperationException();
+       }
+
+       public String getLocalName() {
+               throw new UnsupportedBackgroundOperationException();
+       }
+
+       public int getLocalPort() {
+               throw new UnsupportedBackgroundOperationException();
+       }
+
+       public String getParameter(String name) {
+               final Object obj = parameters.get(name);
+               if(obj instanceof String[]) {
+                       return ((String[])obj)[0];
+               }
+               return (String)obj;
+       }
+
+       public Map<?,?> getParameterMap() {
+               return parameters;
+       }
+
+       public Enumeration<?> getParameterNames() {
+               return new 
IteratorEnumeration<String>(parameters.keySet().iterator());
+       }
+
+       public String[] getParameterValues(String key) {
+               throw new UnsupportedBackgroundOperationException();
+       }
+
+       public String getProtocol() {
+               throw new UnsupportedBackgroundOperationException();
+       }
+
+       public BufferedReader getReader() throws IOException {
+               throw new UnsupportedBackgroundOperationException();
+       }
+
+       public String getRealPath(String arg0) {
+               throw new UnsupportedBackgroundOperationException();
+       }
+
+       public String getRemoteAddr() {
+               throw new UnsupportedBackgroundOperationException();
+       }
+
+       public String getRemoteHost() {
+               throw new UnsupportedBackgroundOperationException();
+       }
+
+       public int getRemotePort() {
+               throw new UnsupportedBackgroundOperationException();
+       }
+
+       public RequestDispatcher getRequestDispatcher(String arg0) {
+               throw new UnsupportedBackgroundOperationException();
+       }
+
+       public String getScheme() {
+               throw new UnsupportedBackgroundOperationException();
+       }
+
+       public String getServerName() {
+               throw new UnsupportedBackgroundOperationException();
+       }
+
+       public int getServerPort() {
+               throw new UnsupportedBackgroundOperationException();
+       }
+
+       public boolean isSecure() {
+               throw new UnsupportedBackgroundOperationException();
+       }
+
+       public void removeAttribute(String arg0) {
+               throw new UnsupportedBackgroundOperationException();
+               
+       }
+
+       public void setAttribute(String key, Object value) {
+               attributes.put(key, value);
+       }
+
+       public void setCharacterEncoding(String arg0)
+                       throws UnsupportedEncodingException {
+               throw new UnsupportedBackgroundOperationException();
+               
+       }
+
+       public Cookie getCookie(String arg0) {
+               throw new UnsupportedBackgroundOperationException();
+       }
+
+       public RequestDispatcher getRequestDispatcher(Resource arg0,
+                       RequestDispatcherOptions arg1) {
+               throw new UnsupportedBackgroundOperationException();
+       }
+
+       public RequestDispatcher getRequestDispatcher(Resource arg0) {
+               throw new UnsupportedBackgroundOperationException();
+       }
+
+       public RequestDispatcher getRequestDispatcher(String arg0,
+                       RequestDispatcherOptions arg1) {
+               throw new UnsupportedBackgroundOperationException();
+       }
+
+       public RequestParameter getRequestParameter(String arg0) {
+               throw new UnsupportedBackgroundOperationException();
+       }
+
+       public RequestParameterMap getRequestParameterMap() {
+               throw new UnsupportedBackgroundOperationException();
+       }
+
+       public RequestParameter[] getRequestParameters(String arg0) {
+               throw new UnsupportedBackgroundOperationException();
+       }
+
+       public RequestPathInfo getRequestPathInfo() {
+               throw new UnsupportedBackgroundOperationException();
+       }
+
+       public RequestProgressTracker getRequestProgressTracker() {
+               return requestProgressTracker;
+       }
+
+       public Resource getResource() {
+               throw new UnsupportedBackgroundOperationException();
+       }
+
+       public ResourceBundle getResourceBundle(Locale arg0) {
+               throw new UnsupportedBackgroundOperationException();
+       }
+
+       public ResourceBundle getResourceBundle(String arg0, Locale arg1) {
+               throw new UnsupportedBackgroundOperationException();
+       }
+
+       public ResourceResolver getResourceResolver() {
+               throw new UnsupportedBackgroundOperationException();
+       }
+
+       public String getResponseContentType() {
+               throw new UnsupportedBackgroundOperationException();
+       }
+
+       public Enumeration<String> getResponseContentTypes() {
+               throw new UnsupportedBackgroundOperationException();
+       }
+
+       public <AdapterType> AdapterType adaptTo(Class<AdapterType> arg0) {
+               throw new UnsupportedBackgroundOperationException();
+       }
+}

Propchange: 
sling/trunk/contrib/extensions/bgservlets/src/main/java/org/apache/sling/bgservlets/impl/BackgroundHttpServletRequest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
sling/trunk/contrib/extensions/bgservlets/src/main/java/org/apache/sling/bgservlets/impl/BackgroundHttpServletRequest.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision Rev URL

Copied: 
sling/trunk/contrib/extensions/bgservlets/src/main/java/org/apache/sling/bgservlets/impl/BackgroundHttpServletResponse.java
 (from r964041, 
sling/trunk/contrib/extensions/bgservlets/src/main/java/org/apache/sling/bgservlets/impl/ServletResponseWrapper.java)
URL: 
http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/bgservlets/src/main/java/org/apache/sling/bgservlets/impl/BackgroundHttpServletResponse.java?p2=sling/trunk/contrib/extensions/bgservlets/src/main/java/org/apache/sling/bgservlets/impl/BackgroundHttpServletResponse.java&p1=sling/trunk/contrib/extensions/bgservlets/src/main/java/org/apache/sling/bgservlets/impl/ServletResponseWrapper.java&r1=964041&r2=964078&rev=964078&view=diff
==============================================================================
--- 
sling/trunk/contrib/extensions/bgservlets/src/main/java/org/apache/sling/bgservlets/impl/ServletResponseWrapper.java
 (original)
+++ 
sling/trunk/contrib/extensions/bgservlets/src/main/java/org/apache/sling/bgservlets/impl/BackgroundHttpServletResponse.java
 Wed Jul 14 15:19:44 2010
@@ -22,16 +22,20 @@ import java.io.IOException;
 import java.io.OutputStream;
 import java.io.OutputStreamWriter;
 import java.io.PrintWriter;
+import java.util.Locale;
 
 import javax.servlet.ServletOutputStream;
+import javax.servlet.http.Cookie;
 import javax.servlet.http.HttpServletResponse;
-import javax.servlet.http.HttpServletResponseWrapper;
 
-/** Wraps an HttpServletResponse for background processing */
-class ServletResponseWrapper extends HttpServletResponseWrapper {
+import org.apache.sling.api.SlingHttpServletResponse;
+
+/** Minimal HttpServletResponse for background processing */
+class BackgroundHttpServletResponse implements SlingHttpServletResponse {
 
        private final ServletOutputStream stream;
        private final PrintWriter writer;
+       private final SlingHttpServletResponse wrappedResponse;
        
        static class ServletOutputStreamWrapper extends ServletOutputStream {
 
@@ -58,25 +62,136 @@ class ServletResponseWrapper extends Htt
                
        }
        
-       ServletResponseWrapper(HttpServletResponse response, OutputStream os) 
throws IOException {
-               super(response);
+       BackgroundHttpServletResponse(HttpServletResponse hsr, OutputStream os) 
throws IOException {
                stream = new ServletOutputStreamWrapper(os);
                writer = new PrintWriter(new OutputStreamWriter(stream));
+               wrappedResponse = (hsr instanceof SlingHttpServletResponse ? 
(SlingHttpServletResponse)hsr : null);
        }
        
        void cleanup() throws IOException {
                stream.flush();
                stream.close();
        }
-       
-       @Override
+
+
        public ServletOutputStream getOutputStream() throws IOException {
                return stream;
        }
 
-       @Override
        public PrintWriter getWriter() throws IOException {
                return writer;
        }
 
+       public void addCookie(Cookie arg0) {
+       }
+
+       public void addDateHeader(String arg0, long arg1) {
+       }
+
+       public void addHeader(String arg0, String arg1) {
+       }
+
+       public void addIntHeader(String arg0, int arg1) {
+       }
+
+       public boolean containsHeader(String arg0) {
+               return false;
+       }
+
+       public String encodeRedirectUrl(String arg0) {
+               return null;
+       }
+
+       public String encodeRedirectURL(String arg0) {
+               return null;
+       }
+
+       public String encodeUrl(String arg0) {
+               return null;
+       }
+
+       public String encodeURL(String arg0) {
+               return null;
+       }
+
+       public void sendError(int arg0, String arg1) throws IOException {
+               // TODO
+       }
+
+       public void sendError(int arg0) throws IOException {
+               // TODO
+       }
+
+       public void sendRedirect(String arg0) throws IOException {
+               // TODO
+       }
+
+       public void setDateHeader(String arg0, long arg1) {
+       }
+
+       public void setHeader(String arg0, String arg1) {
+       }
+
+       public void setIntHeader(String arg0, int arg1) {
+       }
+
+       public void setStatus(int arg0, String arg1) {
+               // TODO
+       }
+
+       public void setStatus(int arg0) {
+               // TODO
+       }
+
+       public void flushBuffer() throws IOException {
+               stream.flush();
+       }
+
+       public int getBufferSize() {
+               return 0;
+       }
+
+       public String getCharacterEncoding() {
+               return null;
+       }
+
+       public String getContentType() {
+               return null;
+       }
+
+       public Locale getLocale() {
+               return null;
+       }
+
+       public boolean isCommitted() {
+               return false;
+       }
+
+       public void reset() {
+       }
+
+       public void resetBuffer() {
+       }
+
+       public void setBufferSize(int arg0) {
+       }
+
+       public void setCharacterEncoding(String arg0) {
+       }
+
+       public void setContentLength(int arg0) {
+       }
+
+       public void setContentType(String arg0) {
+       }
+
+       public void setLocale(Locale arg0) {
+       }
+
+       public <AdapterType> AdapterType adaptTo(Class<AdapterType> t) {
+               if(wrappedResponse != null) {
+                       return wrappedResponse.adaptTo(t);
+               }
+               return null;
+       }
 }
\ No newline at end of file

Modified: 
sling/trunk/contrib/extensions/bgservlets/src/main/java/org/apache/sling/bgservlets/impl/FilterChainExecutionJob.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/bgservlets/src/main/java/org/apache/sling/bgservlets/impl/FilterChainExecutionJob.java?rev=964078&r1=964077&r2=964078&view=diff
==============================================================================
--- 
sling/trunk/contrib/extensions/bgservlets/src/main/java/org/apache/sling/bgservlets/impl/FilterChainExecutionJob.java
 (original)
+++ 
sling/trunk/contrib/extensions/bgservlets/src/main/java/org/apache/sling/bgservlets/impl/FilterChainExecutionJob.java
 Wed Jul 14 15:19:44 2010
@@ -26,6 +26,8 @@ import javax.servlet.FilterChain;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
+import org.apache.sling.api.SlingHttpServletRequest;
+import org.apache.sling.api.wrappers.SlingHttpServletRequestWrapper;
 import org.apache.sling.bgservlets.JobStatus;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -36,23 +38,21 @@ import org.slf4j.LoggerFactory;
 class FilterChainExecutionJob implements Runnable, JobStatus {
        private final Logger log = LoggerFactory.getLogger(getClass());
        private final FilterChain chain;
-       private final ServletResponseWrapper response;
+       private final BackgroundHttpServletResponse response;
        private final SuspendableOutputStream stream;
        private final String path;
-       
-       // TODO is it ok to keep a reference to the request until run() is 
called??
-       private final HttpServletRequest request;
+       private final SlingHttpServletRequest request;
        
        FilterChainExecutionJob(FilterChain chain, HttpServletRequest request, 
HttpServletResponse hsr) throws IOException {
                this.chain = chain;
-               this.request = request;
+               this.request = new SlingHttpServletRequestWrapper(new 
BackgroundHttpServletRequest(request));
                
                // TODO write output to the Sling repository. For now: just a 
temp file
                final File output = 
File.createTempFile(getClass().getSimpleName(), ".data");
                output.deleteOnExit();
                path = output.getAbsolutePath();
                stream = new SuspendableOutputStream(new 
FileOutputStream(output));
-               response  = new ServletResponseWrapper(hsr, stream);
+               response  = new BackgroundHttpServletResponse(hsr, stream);
        }
        
        public String toString() {


Reply via email to