Author: bdelacretaz
Date: Fri Jul 16 12:56:47 2010
New Revision: 964790

URL: http://svn.apache.org/viewvc?rev=964790&view=rev
Log:
SLING-550, use new SlingServlet service (requires SLING-1603 patch, no other 
patches)

Added:
    
sling/trunk/contrib/extensions/bgservlets/src/main/java/org/apache/sling/bgservlets/impl/BackgroundRequestExecutionJob.java
   (with props)
Removed:
    
sling/trunk/contrib/extensions/bgservlets/src/main/java/org/apache/sling/bgservlets/impl/FilterChainExecutionJob.java
Modified:
    sling/trunk/contrib/extensions/bgservlets/pom.xml
    
sling/trunk/contrib/extensions/bgservlets/src/main/java/org/apache/sling/bgservlets/impl/BackgroundHttpServletRequest.java
    
sling/trunk/contrib/extensions/bgservlets/src/main/java/org/apache/sling/bgservlets/impl/BackgroundServletStarterFilter.java

Modified: sling/trunk/contrib/extensions/bgservlets/pom.xml
URL: 
http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/bgservlets/pom.xml?rev=964790&r1=964789&r2=964790&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/bgservlets/pom.xml (original)
+++ sling/trunk/contrib/extensions/bgservlets/pom.xml Fri Jul 16 12:56:47 2010
@@ -81,7 +81,13 @@
     <dependency>
       <groupId>org.apache.sling</groupId>
       <artifactId>org.apache.sling.api</artifactId>
-      <version>2.0.8</version>
+      <version>2.0.9-SNAPSHOT</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.sling</groupId>
+      <artifactId>org.apache.sling.commons.auth</artifactId>
+      <version>0.9.0-SNAPSHOT</version>
       <scope>provided</scope>
     </dependency>
     <dependency>

Modified: 
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=964790&r1=964789&r2=964790&view=diff
==============================================================================
--- 
sling/trunk/contrib/extensions/bgservlets/src/main/java/org/apache/sling/bgservlets/impl/BackgroundHttpServletRequest.java
 (original)
+++ 
sling/trunk/contrib/extensions/bgservlets/src/main/java/org/apache/sling/bgservlets/impl/BackgroundHttpServletRequest.java
 Fri Jul 16 12:56:47 2010
@@ -27,7 +27,6 @@ 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;
@@ -35,21 +34,27 @@ 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 {
+public class BackgroundHttpServletRequest implements HttpServletRequest {
 
        private final String contextPath;
        private final String method;
        private final String pathInfo;
-       private final RequestProgressTracker requestProgressTracker;
+       private final String servletPath;
+       private final String queryString;
+       private final String requestURI;
+       private final StringBuffer requestURL;
+       private final String characterEncoding; 
+       private final int contentLength;
+       private final String contentType;
+       private final Locale locale;
+       private final String protocol;
+       private final String remoteAddr;
+       private final String remoteHost;
+       private final int remotePort;
+       private final int serverPort;
+       private final String scheme;
+       private final String remoteUser;
+       private final String serverName;
        
        private final Map<String, Object> attributes;
        private final Map<String, ?> parameters;
@@ -80,9 +85,7 @@ public class BackgroundHttpServletReques
        }
        
        @SuppressWarnings("unchecked")
-       BackgroundHttpServletRequest(HttpServletRequest r) {
-               
-               final SlingHttpServletRequest sr = (r instanceof 
SlingHttpServletRequest ? (SlingHttpServletRequest)r : null);
+       BackgroundHttpServletRequest(HttpServletRequest r,String [] 
parametersToRemove) {
                
                // Store objects which are safe to use outside
                // of the container's request/response cycle - the
@@ -91,18 +94,37 @@ public class BackgroundHttpServletReques
                contextPath = r.getContextPath();
                method = r.getMethod();
                pathInfo = r.getPathInfo();
-               
-               requestProgressTracker = (sr == null ? null : 
sr.getRequestProgressTracker());
-               
+               servletPath = r.getServletPath();
+               queryString = r.getQueryString();
+               requestURI = r.getRequestURI();
+               requestURL = r.getRequestURL();
+               characterEncoding = r.getCharacterEncoding();
+               contentLength = r.getContentLength();
+               contentType = r.getContentType();
+               locale = r.getLocale();
+               protocol = r.getProtocol();
+               remoteAddr = r.getRemoteAddr();
+               remoteHost = r.getRemoteHost();
+               remotePort = r.getRemotePort();
+               serverPort = r.getServerPort();
+               scheme = r.getScheme();
+               remoteUser = r.getRemoteUser();
+               serverName = r.getServerName();
+
                attributes = new HashMap<String, Object>();
+               /* Don't copy attributes, we consider this to be a "fresh" 
request
                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());
+               for(String key : parametersToRemove) {
+                       parameters.remove(key);
+               }
        }
        
        public String getAuthType() {
@@ -150,11 +172,11 @@ public class BackgroundHttpServletReques
        }
 
        public String getQueryString() {
-               throw new UnsupportedBackgroundOperationException();
+               return queryString;
        }
 
        public String getRemoteUser() {
-               throw new UnsupportedBackgroundOperationException();
+               return remoteUser;
        }
 
        public String getRequestedSessionId() {
@@ -162,15 +184,15 @@ public class BackgroundHttpServletReques
        }
 
        public String getRequestURI() {
-               throw new UnsupportedBackgroundOperationException();
+               return requestURI;
        }
 
        public StringBuffer getRequestURL() {
-               throw new UnsupportedBackgroundOperationException();
+               return requestURL;
        }
 
        public String getServletPath() {
-               throw new UnsupportedBackgroundOperationException();
+               return servletPath;
        }
 
        public HttpSession getSession() {
@@ -214,15 +236,15 @@ public class BackgroundHttpServletReques
        }
 
        public String getCharacterEncoding() {
-               throw new UnsupportedBackgroundOperationException();
+               return characterEncoding;
        }
 
        public int getContentLength() {
-               throw new UnsupportedBackgroundOperationException();
+               return contentLength;
        }
 
        public String getContentType() {
-               throw new UnsupportedBackgroundOperationException();
+               return contentType;
        }
 
        public ServletInputStream getInputStream() throws IOException {
@@ -234,10 +256,10 @@ public class BackgroundHttpServletReques
        }
 
        public Locale getLocale() {
-               throw new UnsupportedBackgroundOperationException();
+               return locale;
        }
 
-       public Enumeration getLocales() {
+       public Enumeration<?> getLocales() {
                throw new UnsupportedBackgroundOperationException();
        }
 
@@ -270,7 +292,7 @@ public class BackgroundHttpServletReques
        }
 
        public String getProtocol() {
-               throw new UnsupportedBackgroundOperationException();
+               return protocol;
        }
 
        public BufferedReader getReader() throws IOException {
@@ -282,15 +304,15 @@ public class BackgroundHttpServletReques
        }
 
        public String getRemoteAddr() {
-               throw new UnsupportedBackgroundOperationException();
+               return remoteAddr;
        }
 
        public String getRemoteHost() {
-               throw new UnsupportedBackgroundOperationException();
+               return remoteHost;
        }
 
        public int getRemotePort() {
-               throw new UnsupportedBackgroundOperationException();
+               return remotePort;
        }
 
        public RequestDispatcher getRequestDispatcher(String arg0) {
@@ -298,24 +320,23 @@ public class BackgroundHttpServletReques
        }
 
        public String getScheme() {
-               throw new UnsupportedBackgroundOperationException();
+               return scheme;
        }
 
        public String getServerName() {
-               throw new UnsupportedBackgroundOperationException();
+               return serverName;
        }
 
        public int getServerPort() {
-               throw new UnsupportedBackgroundOperationException();
+               return serverPort;
        }
 
        public boolean isSecure() {
-               throw new UnsupportedBackgroundOperationException();
+               return false;
        }
 
-       public void removeAttribute(String arg0) {
-               throw new UnsupportedBackgroundOperationException();
-               
+       public void removeAttribute(String name) {
+               attributes.remove(name);
        }
 
        public void setAttribute(String key, Object value) {
@@ -327,70 +348,4 @@ public class BackgroundHttpServletReques
                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();
-       }
 }

Added: 
sling/trunk/contrib/extensions/bgservlets/src/main/java/org/apache/sling/bgservlets/impl/BackgroundRequestExecutionJob.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/bgservlets/src/main/java/org/apache/sling/bgservlets/impl/BackgroundRequestExecutionJob.java?rev=964790&view=auto
==============================================================================
--- 
sling/trunk/contrib/extensions/bgservlets/src/main/java/org/apache/sling/bgservlets/impl/BackgroundRequestExecutionJob.java
 (added)
+++ 
sling/trunk/contrib/extensions/bgservlets/src/main/java/org/apache/sling/bgservlets/impl/BackgroundRequestExecutionJob.java
 Fri Jul 16 12:56:47 2010
@@ -0,0 +1,104 @@
+/*
+ * 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.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.sling.api.resource.LoginException;
+import org.apache.sling.api.resource.ResourceResolver;
+import org.apache.sling.api.resource.ResourceResolverFactory;
+import org.apache.sling.api.servlets.SlingServlet;
+import org.apache.sling.bgservlets.JobStatus;
+import org.apache.sling.commons.auth.impl.SlingAuthenticator;
+import org.apache.sling.commons.auth.spi.AuthenticationInfo;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/** Runnable that executes a FilterChain, using 
+ *     a ServletResponseWrapper to capture the output.
+ */
+class BackgroundRequestExecutionJob implements Runnable, JobStatus {
+       private final Logger log = LoggerFactory.getLogger(getClass());
+       private final HttpServletRequest request;
+       private final BackgroundHttpServletResponse response;
+       private final SuspendableOutputStream stream;
+       private final SlingServlet slingServlet;
+       private final String path;
+       
+       BackgroundRequestExecutionJob(SlingServlet slingServlet, 
ResourceResolverFactory rrf, HttpServletRequest request, 
+                       HttpServletResponse hsr, String [] parametersToRemove) 
throws IOException, LoginException {
+               this.request = new BackgroundHttpServletRequest(request, 
parametersToRemove);
+               this.slingServlet = slingServlet;
+               
+               // TODO we might 
+               // In a normal request the ResourceResolver is added to the 
request attributes
+               // by the authentication service, need to do the same here as 
we can't reuse the
+               // original one which is closed once main request is done
+               final AuthenticationInfo aa = 
(AuthenticationInfo)request.getAttribute(AuthenticationInfo.class.getName());
+               if(aa == null) {
+                       throw new IllegalArgumentException("Missing 
AuthenticationInfo attribute");
+               }
+               final ResourceResolver rr = rrf.getResourceResolver(aa);
+               
this.request.setAttribute(SlingAuthenticator.REQUEST_ATTRIBUTE_RESOLVER, rr);
+               
+               // 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 BackgroundHttpServletResponse(hsr, stream);
+       }
+       
+       public String toString() {
+               return getClass().getSimpleName() + ", state=" + getState() + 
", path=" + path;
+       }
+       
+       public void run() {
+               try {
+                       slingServlet.processRequest(request, response);
+               } catch(Exception e) {
+                       // TODO report errors in the background job's output
+                       log.error("Exception in background request processing", 
e);
+               } finally {
+                       try {
+                               response.cleanup();
+                       } catch(IOException ioe) {
+                               // TODO report errors in the background job's 
output
+                               log.error("ServletResponseWrapper cleanup 
failed", ioe);
+                       }
+               }
+       }
+
+       public String getPath() {
+               return path;
+       }
+
+       public State getState() {
+               return stream.getState();
+       }
+
+       public void requestStateChange(State s) {
+               stream.requestStateChange(s);
+       }
+}

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

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

Modified: 
sling/trunk/contrib/extensions/bgservlets/src/main/java/org/apache/sling/bgservlets/impl/BackgroundServletStarterFilter.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/bgservlets/src/main/java/org/apache/sling/bgservlets/impl/BackgroundServletStarterFilter.java?rev=964790&r1=964789&r2=964790&view=diff
==============================================================================
--- 
sling/trunk/contrib/extensions/bgservlets/src/main/java/org/apache/sling/bgservlets/impl/BackgroundServletStarterFilter.java
 (original)
+++ 
sling/trunk/contrib/extensions/bgservlets/src/main/java/org/apache/sling/bgservlets/impl/BackgroundServletStarterFilter.java
 Fri Jul 16 12:56:47 2010
@@ -34,6 +34,9 @@ import org.apache.felix.scr.annotations.
 import org.apache.felix.scr.annotations.Property;
 import org.apache.felix.scr.annotations.Reference;
 import org.apache.felix.scr.annotations.Service;
+import org.apache.sling.api.SlingHttpServletRequest;
+import org.apache.sling.api.resource.ResourceResolverFactory;
+import org.apache.sling.api.servlets.SlingServlet;
 import org.apache.sling.bgservlets.ExecutionEngine;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -56,10 +59,17 @@ public class BackgroundServletStarterFil
        @Reference
        private ExecutionEngine executionEngine;
        
+       @Reference
+       private SlingServlet slingServlet;
+       
+       @Reference
+       private ResourceResolverFactory resourceResolverFactory;
+       
        /** 
         * Request runs in the background if this request parameter is present 
         * TODO should be configurable, and maybe use other decision methods */
        public static final String BG_PARAM = "sling:bg";
+       private static final String [] PARAM_TO_REMOVE = { BG_PARAM };
        
        public void doFilter(final ServletRequest sreq, final ServletResponse 
sresp, 
                        final FilterChain chain) throws IOException, 
ServletException {
@@ -70,14 +80,26 @@ public class BackgroundServletStarterFil
                        throw new ServletException("response is not an 
HttpServletResponse: " + sresp.getClass().getName());
                }
                final HttpServletRequest request = (HttpServletRequest)sreq;
+               final SlingHttpServletRequest slingRequest = 
+                       (request instanceof SlingHttpServletRequest ? 
(SlingHttpServletRequest)request : null); 
                final HttpServletResponse response = 
(HttpServletResponse)sresp; 
-               if(sreq.getParameter(BG_PARAM) != null) {
-                       final FilterChainExecutionJob job = new 
FilterChainExecutionJob(chain, request, response);
-                       log.debug("{} request parameter present, running 
request in the background using {}", BG_PARAM, job);
-                       executionEngine.queueForExecution(job);
-                       
-                       // TODO not really an error, should send a nicer message
-                       response.sendError(HttpServletResponse.SC_ACCEPTED, 
"Running request in the background using " + job);
+               final String bgParam = sreq.getParameter(BG_PARAM); 
+               if(Boolean.valueOf(bgParam)) {
+                       try {
+                               final BackgroundRequestExecutionJob job = new 
BackgroundRequestExecutionJob(
+                                               slingServlet, 
resourceResolverFactory, request, response, PARAM_TO_REMOVE);
+                               log.debug("{} parameter true, running request 
in the background ({})", BG_PARAM, job);
+                               if(slingRequest != null) {
+                                       
slingRequest.getRequestProgressTracker().log(
+                                                       BG_PARAM + " parameter 
true, running request in background (" + job + ")");
+                               }
+                               executionEngine.queueForExecution(job);
+                               
+                               // TODO not really an error, should send a 
nicer message
+                               
response.sendError(HttpServletResponse.SC_ACCEPTED, "Running request in the 
background using " + job);
+                       } catch (org.apache.sling.api.resource.LoginException 
e) {
+                               throw new ServletException("LoginException in 
doFilter", e);
+                       }
                } else {
                        chain.doFilter(sreq, sresp);
                }


Reply via email to