Author: bdelacretaz
Date: Tue Jul 13 11:58:51 2010
New Revision: 963686
URL: http://svn.apache.org/viewvc?rev=963686&view=rev
Log:
SLING-550 - first shot at background servlets engine, works for some simple
cases, no job control yet
Added:
sling/trunk/contrib/extensions/bgservlets/ (with props)
sling/trunk/contrib/extensions/bgservlets/pom.xml (with props)
sling/trunk/contrib/extensions/bgservlets/src/
sling/trunk/contrib/extensions/bgservlets/src/main/
sling/trunk/contrib/extensions/bgservlets/src/main/java/
sling/trunk/contrib/extensions/bgservlets/src/main/java/org/
sling/trunk/contrib/extensions/bgservlets/src/main/java/org/apache/
sling/trunk/contrib/extensions/bgservlets/src/main/java/org/apache/sling/
sling/trunk/contrib/extensions/bgservlets/src/main/java/org/apache/sling/bgservlets/
sling/trunk/contrib/extensions/bgservlets/src/main/java/org/apache/sling/bgservlets/ExecutionEngine.java
(with props)
sling/trunk/contrib/extensions/bgservlets/src/main/java/org/apache/sling/bgservlets/impl/
sling/trunk/contrib/extensions/bgservlets/src/main/java/org/apache/sling/bgservlets/impl/BackgroundServletStarterFilter.java
(with props)
sling/trunk/contrib/extensions/bgservlets/src/main/java/org/apache/sling/bgservlets/impl/BackgroundTestServlet.java
(with props)
sling/trunk/contrib/extensions/bgservlets/src/main/java/org/apache/sling/bgservlets/impl/ExecutionEngineImpl.java
(with props)
sling/trunk/contrib/extensions/bgservlets/src/main/java/org/apache/sling/bgservlets/impl/FilterChainExecutionJob.java
(with props)
sling/trunk/contrib/extensions/bgservlets/src/main/java/org/apache/sling/bgservlets/impl/ServletResponseWrapper.java
(with props)
Propchange: sling/trunk/contrib/extensions/bgservlets/
------------------------------------------------------------------------------
--- svn:ignore (added)
+++ svn:ignore Tue Jul 13 11:58:51 2010
@@ -0,0 +1,13 @@
+target
+bin
+derby.log
+*.iml
+*.ipr
+*.iws
+.settings
+.project
+.classpath
+.externalToolBuilders
+maven-eclipse.xml
+
+
Added: sling/trunk/contrib/extensions/bgservlets/pom.xml
URL:
http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/bgservlets/pom.xml?rev=963686&view=auto
==============================================================================
--- sling/trunk/contrib/extensions/bgservlets/pom.xml (added)
+++ sling/trunk/contrib/extensions/bgservlets/pom.xml Tue Jul 13 11:58:51 2010
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8"?>
+ <!--
+ 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.
+ -->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.apache.sling</groupId>
+ <artifactId>sling</artifactId>
+ <version>9</version>
+ <relativePath>../../../parent/pom.xml</relativePath>
+ </parent>
+
+ <artifactId>org.apache.sling.bgservlets</artifactId>
+ <version>0.0.1-SNAPSHOT</version>
+ <packaging>bundle</packaging>
+
+ <name>Apache Sling Background Servlets Engine</name>
+ <description>
+ Allows scripts and servlets to run as background tasks
+ which can be suspended, resumed, stopped and restarted.
+ </description>
+
+ <scm>
+
<connection>scm:svn:http://svn.apache.org/repos/asf/sling/trunk/contrib/extensions/bgservlets</connection>
+
<developerConnection>scm:svn:https://svn.apache.org/repos/asf/sling/trunk/contrib/extensions/bgservlets</developerConnection>
+
<url>http://svn.apache.org/repos/asf/sling/trunk/contrib/extensions/bgservlets</url>
+ </scm>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>maven-scr-plugin</artifactId>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>maven-bundle-plugin</artifactId>
+ <extensions>true</extensions>
+ <configuration>
+ <instructions>
+ <Export-Package>org.apache.sling.bgservlets</Export-Package>
+
<Private-Package>org.apache.sling.bgservlets.impl.*</Private-Package>
+ </instructions>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.osgi</groupId>
+ <artifactId>org.osgi.core</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.osgi</groupId>
+ <artifactId>org.osgi.compendium</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>org.apache.felix.scr.annotations</artifactId>
+ <version>1.2.0</version>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.sling</groupId>
+ <artifactId>org.apache.sling.api</artifactId>
+ <version>2.0.8</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>javax.servlet</groupId>
+ <artifactId>servlet-api</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-api</artifactId>
+ </dependency>
+ </dependencies>
+</project>
\ No newline at end of file
Propchange: sling/trunk/contrib/extensions/bgservlets/pom.xml
------------------------------------------------------------------------------
svn:eol-style = native
Added:
sling/trunk/contrib/extensions/bgservlets/src/main/java/org/apache/sling/bgservlets/ExecutionEngine.java
URL:
http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/bgservlets/src/main/java/org/apache/sling/bgservlets/ExecutionEngine.java?rev=963686&view=auto
==============================================================================
---
sling/trunk/contrib/extensions/bgservlets/src/main/java/org/apache/sling/bgservlets/ExecutionEngine.java
(added)
+++
sling/trunk/contrib/extensions/bgservlets/src/main/java/org/apache/sling/bgservlets/ExecutionEngine.java
Tue Jul 13 11:58:51 2010
@@ -0,0 +1,28 @@
+/*
+ * 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;
+
+/** Service that executes Runnables, will later allow
+ * them to be suspended, resumed, stopped and restarted.
+ */
+public interface ExecutionEngine {
+
+ /** Add a job to the execution queue */
+ void queueForExecution(Runnable job);
+}
\ No newline at end of file
Propchange:
sling/trunk/contrib/extensions/bgservlets/src/main/java/org/apache/sling/bgservlets/ExecutionEngine.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange:
sling/trunk/contrib/extensions/bgservlets/src/main/java/org/apache/sling/bgservlets/ExecutionEngine.java
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision Rev URL
Added:
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=963686&view=auto
==============================================================================
---
sling/trunk/contrib/extensions/bgservlets/src/main/java/org/apache/sling/bgservlets/impl/BackgroundServletStarterFilter.java
(added)
+++
sling/trunk/contrib/extensions/bgservlets/src/main/java/org/apache/sling/bgservlets/impl/BackgroundServletStarterFilter.java
Tue Jul 13 11:58:51 2010
@@ -0,0 +1,91 @@
+/*
+ * 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.IOException;
+
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Properties;
+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.bgservlets.ExecutionEngine;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/** Filter that runs the current request in the background
+ * if specific request parameters are set.
+ * TODO: define the position of this filter in the chain,
+ * and how do we enforce it?
+ */
+...@component
+...@service
+...@properties({
+ @Property(name="filter.scope", value="request"),
+ @Property(name="filter.order", intValue=java.lang.Integer.MIN_VALUE)
+})
+public class BackgroundServletStarterFilter implements Filter{
+
+ private final Logger log = LoggerFactory.getLogger(getClass());
+
+ @Reference
+ private ExecutionEngine executionEngine;
+
+ /**
+ * 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";
+
+ public void doFilter(final ServletRequest sreq, final ServletResponse
sresp,
+ final FilterChain chain) throws IOException,
ServletException {
+ if(!(sreq instanceof HttpServletRequest)) {
+ throw new ServletException("request is not an
HttpServletRequest: " + sresp.getClass().getName());
+ }
+ if(!(sresp instanceof HttpServletResponse)) {
+ throw new ServletException("response is not an
HttpServletResponse: " + sresp.getClass().getName());
+ }
+ final HttpServletRequest request = (HttpServletRequest)sreq;
+ 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);
+ } else {
+ chain.doFilter(sreq, sresp);
+ }
+ }
+
+ public void destroy() {
+ }
+
+ public void init(FilterConfig cfg) throws ServletException {
+ }
+}
\ No newline at end of file
Propchange:
sling/trunk/contrib/extensions/bgservlets/src/main/java/org/apache/sling/bgservlets/impl/BackgroundServletStarterFilter.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange:
sling/trunk/contrib/extensions/bgservlets/src/main/java/org/apache/sling/bgservlets/impl/BackgroundServletStarterFilter.java
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision Rev URL
Added:
sling/trunk/contrib/extensions/bgservlets/src/main/java/org/apache/sling/bgservlets/impl/BackgroundTestServlet.java
URL:
http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/bgservlets/src/main/java/org/apache/sling/bgservlets/impl/BackgroundTestServlet.java?rev=963686&view=auto
==============================================================================
---
sling/trunk/contrib/extensions/bgservlets/src/main/java/org/apache/sling/bgservlets/impl/BackgroundTestServlet.java
(added)
+++
sling/trunk/contrib/extensions/bgservlets/src/main/java/org/apache/sling/bgservlets/impl/BackgroundTestServlet.java
Tue Jul 13 11:58:51 2010
@@ -0,0 +1,78 @@
+/*
+ * 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.IOException;
+import java.io.PrintWriter;
+
+import javax.servlet.ServletException;
+
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Property;
+import org.apache.felix.scr.annotations.Service;
+import org.apache.sling.api.SlingHttpServletRequest;
+import org.apache.sling.api.SlingHttpServletResponse;
+import org.apache.sling.api.servlets.SlingSafeMethodsServlet;
+
+/** Servlet used for interactive testing of the background
+ * servlets engine.
+ * TODO remove once we have better tests.
+ */
+...@component
+...@service
+...@suppresswarnings("serial")
+...@property(name="sling.servlet.paths", value="/system/bgservlets/test")
+public class BackgroundTestServlet extends SlingSafeMethodsServlet {
+
+ @Override
+ protected void doGet(SlingHttpServletRequest request,
+ SlingHttpServletResponse response) throws
ServletException,
+ IOException {
+ response.setContentType("text/plain");
+ final PrintWriter w = response.getWriter();
+
+ final int cycles = getIntParam(request, "cycles", 10);
+ final int interval = getIntParam(request, "interval", 1);
+ final int flushEvery = getIntParam(request, "flushEvery", 2);
+
+ for(int i=1; i <= cycles; i++) {
+ if(i % flushEvery == 0) {
+ w.println("Flushing output");
+ w.flush();
+ }
+ w.printf("Cycle %d of %d\n", i, cycles);
+ try {
+ Thread.sleep(interval * 1000);
+ } catch(InterruptedException iex) {
+ throw new
ServletException("InterruptedException", iex);
+ }
+ }
+ w.println("All done.");
+ w.flush();
+ }
+
+ private int getIntParam(SlingHttpServletRequest request, String name,
int defaultValue) {
+ int result = defaultValue;
+ final String str = request.getParameter(name);
+ if(str != null) {
+ result = Integer.parseInt(str);
+ }
+ return result;
+ }
+}
Propchange:
sling/trunk/contrib/extensions/bgservlets/src/main/java/org/apache/sling/bgservlets/impl/BackgroundTestServlet.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange:
sling/trunk/contrib/extensions/bgservlets/src/main/java/org/apache/sling/bgservlets/impl/BackgroundTestServlet.java
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision Rev URL
Added:
sling/trunk/contrib/extensions/bgservlets/src/main/java/org/apache/sling/bgservlets/impl/ExecutionEngineImpl.java
URL:
http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/bgservlets/src/main/java/org/apache/sling/bgservlets/impl/ExecutionEngineImpl.java?rev=963686&view=auto
==============================================================================
---
sling/trunk/contrib/extensions/bgservlets/src/main/java/org/apache/sling/bgservlets/impl/ExecutionEngineImpl.java
(added)
+++
sling/trunk/contrib/extensions/bgservlets/src/main/java/org/apache/sling/bgservlets/impl/ExecutionEngineImpl.java
Tue Jul 13 11:58:51 2010
@@ -0,0 +1,74 @@
+/*
+ * 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.util.concurrent.ArrayBlockingQueue;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.Executor;
+import java.util.concurrent.RejectedExecutionHandler;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Service;
+import org.apache.sling.api.SlingException;
+import org.apache.sling.bgservlets.ExecutionEngine;
+import org.osgi.service.component.ComponentContext;
+
+/** Simple ExecutionEngine
+ * TODO should use Sling's thread pool, and check synergies
+ * with scheduler services */
+...@component
+...@service
+public class ExecutionEngineImpl implements ExecutionEngine {
+
+ private Executor executor;
+
+ @SuppressWarnings("serial")
+ public static class QueueFullException extends SlingException {
+ QueueFullException(Runnable r) {
+ super("Execution queue is full, cannot execute " + r);
+ }
+ }
+
+ public void activate(ComponentContext context) {
+ // TODO configurable!
+ final int corePoolSize = 2;
+ int maximumPoolSize = 2;
+ long keepAliveTime = 30;
+ TimeUnit unit = TimeUnit.SECONDS;
+ BlockingQueue<Runnable> workQueue = new
ArrayBlockingQueue<Runnable>(4);
+ RejectedExecutionHandler handler = new RejectedExecutionHandler() {
+ public void rejectedExecution(Runnable r,
ThreadPoolExecutor executor) {
+ throw new QueueFullException(r);
+ }
+ };
+ executor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize,
keepAliveTime, unit, workQueue, handler);
+ }
+
+ public void deactivate(ComponentContext context) {
+ // TODO how to shutdown executor?
+ executor = null;
+ }
+
+ public void queueForExecution(Runnable job) {
+ // TODO wrap job in our own Runnable to detect start/end etc.
+ executor.execute(job);
+ }
+}
Propchange:
sling/trunk/contrib/extensions/bgservlets/src/main/java/org/apache/sling/bgservlets/impl/ExecutionEngineImpl.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange:
sling/trunk/contrib/extensions/bgservlets/src/main/java/org/apache/sling/bgservlets/impl/ExecutionEngineImpl.java
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision Rev URL
Added:
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=963686&view=auto
==============================================================================
---
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/FilterChainExecutionJob.java
Tue Jul 13 11:58:51 2010
@@ -0,0 +1,68 @@
+/*
+ * 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.IOException;
+
+import javax.servlet.FilterChain;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/** Runnable that executes a FilterChain, using
+ * a ServletResponseWrapper to capture the output.
+ */
+class FilterChainExecutionJob implements Runnable {
+ private final Logger log = LoggerFactory.getLogger(getClass());
+ private final FilterChain chain;
+ private final ServletResponseWrapper response;
+
+ // TODO is it ok to keep a reference to the request until run() is
called??
+ private final HttpServletRequest request;
+
+ FilterChainExecutionJob(FilterChain chain, HttpServletRequest request,
HttpServletResponse hsr) throws IOException {
+ this.chain = chain;
+ this.request = request;
+ response = new ServletResponseWrapper(hsr);
+ }
+
+ public String toString() {
+ return "Background request job: " + response;
+ }
+
+ public void run() {
+ log.info("{} execution starts", this);
+ try {
+ chain.doFilter(request, response);
+ } catch(Exception e) {
+ // TODO report errors in the background job's output
+ log.error("chain.doFilter failed", e);
+ } finally {
+ try {
+ response.cleanup();
+ } catch(IOException ioe) {
+ // TODO report errors in the background job's
output
+ log.error("ServletResponseWrapper cleanup
failed", ioe);
+ }
+ }
+ log.info("{} execution ends", this);
+ }
+}
Propchange:
sling/trunk/contrib/extensions/bgservlets/src/main/java/org/apache/sling/bgservlets/impl/FilterChainExecutionJob.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange:
sling/trunk/contrib/extensions/bgservlets/src/main/java/org/apache/sling/bgservlets/impl/FilterChainExecutionJob.java
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision Rev URL
Added:
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/ServletResponseWrapper.java?rev=963686&view=auto
==============================================================================
---
sling/trunk/contrib/extensions/bgservlets/src/main/java/org/apache/sling/bgservlets/impl/ServletResponseWrapper.java
(added)
+++
sling/trunk/contrib/extensions/bgservlets/src/main/java/org/apache/sling/bgservlets/impl/ServletResponseWrapper.java
Tue Jul 13 11:58:51 2010
@@ -0,0 +1,93 @@
+/*
+ * 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 java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.PrintWriter;
+
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpServletResponseWrapper;
+
+/** Wraps an HttpServletResponse for background processing */
+class ServletResponseWrapper extends HttpServletResponseWrapper {
+
+ private final String outputPath;
+ private final ServletOutputStream stream;
+ private final PrintWriter writer;
+
+ static class CustomOutputStream extends ServletOutputStream {
+
+ private final OutputStream os;
+
+ CustomOutputStream(OutputStream os) {
+ this.os = os;
+ }
+
+ @Override
+ public void write(int b) throws IOException {
+ os.write(b);
+ }
+
+ @Override
+ public void close() throws IOException {
+ os.close();
+ }
+
+ @Override
+ public void flush() throws IOException {
+ os.flush();
+ }
+
+ }
+
+ ServletResponseWrapper(HttpServletResponse response) throws IOException
{
+ super(response);
+ // TODO write output to the Sling repository. For now: just a
temp file
+ final File output =
File.createTempFile(getClass().getSimpleName(), ".data");
+ output.deleteOnExit();
+ outputPath = output.getAbsolutePath();
+ stream = new CustomOutputStream(new FileOutputStream(output));
+ writer = new PrintWriter(new OutputStreamWriter(stream));
+ }
+
+ public String toString() {
+ return getClass().getName() + ":" + outputPath;
+ }
+
+ void cleanup() throws IOException {
+ stream.flush();
+ stream.close();
+ }
+
+ @Override
+ public ServletOutputStream getOutputStream() throws IOException {
+ return stream;
+ }
+
+ @Override
+ public PrintWriter getWriter() throws IOException {
+ return writer;
+ }
+
+}
\ No newline at end of file
Propchange:
sling/trunk/contrib/extensions/bgservlets/src/main/java/org/apache/sling/bgservlets/impl/ServletResponseWrapper.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange:
sling/trunk/contrib/extensions/bgservlets/src/main/java/org/apache/sling/bgservlets/impl/ServletResponseWrapper.java
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision Rev URL