You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@chemistry.apache.org by fm...@apache.org on 2016/01/22 17:00:47 UTC

svn commit: r1726247 - in /chemistry/opencmis/trunk: ./ chemistry-opencmis-client/chemistry-opencmis-client-bindings/src/main/java/org/apache/chemistry/opencmis/client/bindings/spi/atompub/ chemistry-opencmis-client/chemistry-opencmis-client-bindings/s...

Author: fmui
Date: Fri Jan 22 16:00:46 2016
New Revision: 1726247

URL: http://svn.apache.org/viewvc?rev=1726247&view=rev
Log:
CMIS-967: added support for asynchronous servlets

Added:
    chemistry/opencmis/trunk/chemistry-opencmis-commons/chemistry-opencmis-commons-api/src/main/java/org/apache/chemistry/opencmis/commons/exceptions/CmisTooManyRequestsException.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-async/
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-async/pom.xml
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-async/src/
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-async/src/main/
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-async/src/main/java/
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-async/src/main/java/org/
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-async/src/main/java/org/apache/
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-async/src/main/java/org/apache/chemistry/
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-async/src/main/java/org/apache/chemistry/opencmis/
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-async/src/main/java/org/apache/chemistry/opencmis/server/
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-async/src/main/java/org/apache/chemistry/opencmis/server/async/
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-async/src/main/java/org/apache/chemistry/opencmis/server/async/AsyncCmisExecutor.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-async/src/main/java/org/apache/chemistry/opencmis/server/async/AsyncCmisServiceFactory.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-async/src/main/java/org/apache/chemistry/opencmis/server/async/impl/
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-async/src/main/java/org/apache/chemistry/opencmis/server/async/impl/AbstractAsyncServiceFactory.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-async/src/main/java/org/apache/chemistry/opencmis/server/async/impl/AsyncCmisServlet.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-async/src/main/java/org/apache/chemistry/opencmis/server/async/impl/CmisAsyncHelper.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-async/src/main/java/org/apache/chemistry/opencmis/server/async/impl/CmisRequestRunner.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-async/src/main/java/org/apache/chemistry/opencmis/server/async/impl/SimpleAsyncCmisExecutor.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-async/src/main/java/org/apache/chemistry/opencmis/server/async/impl/SimpleCmisAsyncListener.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-async/src/main/java/org/apache/chemistry/opencmis/server/async/impl/atompub/
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-async/src/main/java/org/apache/chemistry/opencmis/server/async/impl/atompub/AsyncCmisAtomPubServlet.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-async/src/main/java/org/apache/chemistry/opencmis/server/async/impl/browser/
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-async/src/main/java/org/apache/chemistry/opencmis/server/async/impl/browser/AsyncCmisBrowserBindingServlet.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-async/src/main/java/org/apache/chemistry/opencmis/server/async/impl/webservices/
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-async/src/main/java/org/apache/chemistry/opencmis/server/async/impl/webservices/AsyncCmisWebServicesServlet.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings-war/src/main/webapp/WEB-INF/web-async.xml
Modified:
    chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-bindings/src/main/java/org/apache/chemistry/opencmis/client/bindings/spi/atompub/AbstractAtomPubService.java
    chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-bindings/src/main/java/org/apache/chemistry/opencmis/client/bindings/spi/browser/AbstractBrowserBindingService.java
    chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-bindings/src/main/java/org/apache/chemistry/opencmis/client/bindings/spi/webservices/AbstractPortProvider.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings-war/pom.xml
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/atompub/CmisAtomPubServlet.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/CmisBrowserBindingServlet.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/webservices/CmisWebServicesServlet.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/pom.xml
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/server/InMemoryServiceFactoryImpl.java
    chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/ConnectionErrorDialog.java
    chemistry/opencmis/trunk/pom.xml

Modified: chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-bindings/src/main/java/org/apache/chemistry/opencmis/client/bindings/spi/atompub/AbstractAtomPubService.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-bindings/src/main/java/org/apache/chemistry/opencmis/client/bindings/spi/atompub/AbstractAtomPubService.java?rev=1726247&r1=1726246&r2=1726247&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-bindings/src/main/java/org/apache/chemistry/opencmis/client/bindings/spi/atompub/AbstractAtomPubService.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-bindings/src/main/java/org/apache/chemistry/opencmis/client/bindings/spi/atompub/AbstractAtomPubService.java Fri Jan 22 16:00:46 2016
@@ -73,6 +73,7 @@ import org.apache.chemistry.opencmis.com
 import org.apache.chemistry.opencmis.commons.exceptions.CmisServiceUnavailableException;
 import org.apache.chemistry.opencmis.commons.exceptions.CmisStorageException;
 import org.apache.chemistry.opencmis.commons.exceptions.CmisStreamNotSupportedException;
+import org.apache.chemistry.opencmis.commons.exceptions.CmisTooManyRequestsException;
 import org.apache.chemistry.opencmis.commons.exceptions.CmisUnauthorizedException;
 import org.apache.chemistry.opencmis.commons.exceptions.CmisUpdateConflictException;
 import org.apache.chemistry.opencmis.commons.exceptions.CmisVersioningException;
@@ -511,6 +512,8 @@ public abstract class AbstractAtomPubSer
                 return new CmisNameConstraintViolationException(message, errorContent, additionalData, t);
             }
             return new CmisConstraintException(message, errorContent, additionalData, t);
+        case 429:
+            return new CmisTooManyRequestsException(message, errorContent, additionalData, t);
         case 503:
             return new CmisServiceUnavailableException(message, errorContent, additionalData, t);
         default:

Modified: chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-bindings/src/main/java/org/apache/chemistry/opencmis/client/bindings/spi/browser/AbstractBrowserBindingService.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-bindings/src/main/java/org/apache/chemistry/opencmis/client/bindings/spi/browser/AbstractBrowserBindingService.java?rev=1726247&r1=1726246&r2=1726247&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-bindings/src/main/java/org/apache/chemistry/opencmis/client/bindings/spi/browser/AbstractBrowserBindingService.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-bindings/src/main/java/org/apache/chemistry/opencmis/client/bindings/spi/browser/AbstractBrowserBindingService.java Fri Jan 22 16:00:46 2016
@@ -56,6 +56,7 @@ import org.apache.chemistry.opencmis.com
 import org.apache.chemistry.opencmis.commons.exceptions.CmisServiceUnavailableException;
 import org.apache.chemistry.opencmis.commons.exceptions.CmisStorageException;
 import org.apache.chemistry.opencmis.commons.exceptions.CmisStreamNotSupportedException;
+import org.apache.chemistry.opencmis.commons.exceptions.CmisTooManyRequestsException;
 import org.apache.chemistry.opencmis.commons.exceptions.CmisUnauthorizedException;
 import org.apache.chemistry.opencmis.commons.exceptions.CmisUpdateConflictException;
 import org.apache.chemistry.opencmis.commons.exceptions.CmisVersioningException;
@@ -331,6 +332,8 @@ public abstract class AbstractBrowserBin
             return new CmisProxyAuthenticationException(message, errorContent, t);
         case 409:
             return new CmisConstraintException(message, errorContent, t);
+        case 429:
+            return new CmisTooManyRequestsException(message, errorContent, t);
         case 503:
             return new CmisServiceUnavailableException(message, errorContent, t);
         default:

Modified: chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-bindings/src/main/java/org/apache/chemistry/opencmis/client/bindings/spi/webservices/AbstractPortProvider.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-bindings/src/main/java/org/apache/chemistry/opencmis/client/bindings/spi/webservices/AbstractPortProvider.java?rev=1726247&r1=1726246&r2=1726247&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-bindings/src/main/java/org/apache/chemistry/opencmis/client/bindings/spi/webservices/AbstractPortProvider.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-bindings/src/main/java/org/apache/chemistry/opencmis/client/bindings/spi/webservices/AbstractPortProvider.java Fri Jan 22 16:00:46 2016
@@ -57,6 +57,7 @@ import org.apache.chemistry.opencmis.com
 import org.apache.chemistry.opencmis.commons.exceptions.CmisObjectNotFoundException;
 import org.apache.chemistry.opencmis.commons.exceptions.CmisProxyAuthenticationException;
 import org.apache.chemistry.opencmis.commons.exceptions.CmisRuntimeException;
+import org.apache.chemistry.opencmis.commons.exceptions.CmisTooManyRequestsException;
 import org.apache.chemistry.opencmis.commons.exceptions.CmisUnauthorizedException;
 import org.apache.chemistry.opencmis.commons.impl.IOUtils;
 import org.apache.chemistry.opencmis.commons.impl.UrlBuilder;
@@ -524,6 +525,8 @@ public abstract class AbstractPortProvid
                 throw new CmisObjectNotFoundException(message, he);
             } else if (he.getStatusCode() == 407) {
                 throw new CmisProxyAuthenticationException(message, he);
+            } else if (he.getStatusCode() == 429) {
+                throw new CmisTooManyRequestsException(message, he);
             } else if (he.getStatusCode() == 301 || he.getStatusCode() == 302 || he.getStatusCode() == 303
                     || he.getStatusCode() == 307) {
                 throw new CmisConnectionException("Redirects are not supported (HTTP status code " + he.getStatusCode()

Added: chemistry/opencmis/trunk/chemistry-opencmis-commons/chemistry-opencmis-commons-api/src/main/java/org/apache/chemistry/opencmis/commons/exceptions/CmisTooManyRequestsException.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-commons/chemistry-opencmis-commons-api/src/main/java/org/apache/chemistry/opencmis/commons/exceptions/CmisTooManyRequestsException.java?rev=1726247&view=auto
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-commons/chemistry-opencmis-commons-api/src/main/java/org/apache/chemistry/opencmis/commons/exceptions/CmisTooManyRequestsException.java (added)
+++ chemistry/opencmis/trunk/chemistry-opencmis-commons/chemistry-opencmis-commons-api/src/main/java/org/apache/chemistry/opencmis/commons/exceptions/CmisTooManyRequestsException.java Fri Jan 22 16:00:46 2016
@@ -0,0 +1,163 @@
+/*
+ * 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.chemistry.opencmis.commons.exceptions;
+
+import java.math.BigInteger;
+import java.util.Map;
+
+/**
+ * Too Many Requests exception.
+ * 
+ * (This is exception is not defined in the CMIS specification and is therefore
+ * derived from {@link CmisRuntimeException}.)
+ */
+public class CmisTooManyRequestsException extends CmisRuntimeException {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * Default constructor.
+     */
+    public CmisTooManyRequestsException() {
+        super();
+    }
+
+    /**
+     * Constructor.
+     * 
+     * @param message
+     *            error message
+     * @param code
+     *            error code
+     * @param cause
+     *            the cause
+     */
+    public CmisTooManyRequestsException(String message, BigInteger code, Throwable cause) {
+        super(message, code, cause);
+    }
+
+    /**
+     * Constructor.
+     * 
+     * @param message
+     *            error message
+     * @param errorContent
+     *            error page content
+     */
+    public CmisTooManyRequestsException(String message, String errorContent) {
+        super(message, errorContent);
+    }
+
+    /**
+     * Constructor.
+     * 
+     * @param message
+     *            error message
+     * @param code
+     *            error code
+     */
+    public CmisTooManyRequestsException(String message, BigInteger code) {
+        super(message, code);
+    }
+
+    /**
+     * Constructor.
+     * 
+     * @param message
+     *            error message
+     * @param code
+     *            error code
+     * @param errorContent
+     *            error page content
+     */
+    public CmisTooManyRequestsException(String message, BigInteger code, String errorContent) {
+        super(message, code, errorContent);
+    }
+
+    /**
+     * Constructor.
+     * 
+     * @param message
+     *            error message
+     * @param code
+     *            error code
+     * @param errorContent
+     *            error page content
+     * @param additionalData
+     *            additional data
+     */
+    public CmisTooManyRequestsException(String message, BigInteger code, String errorContent,
+            Map<String, String> additionalData) {
+        super(message, code, errorContent, additionalData);
+    }
+
+    /**
+     * Constructor.
+     * 
+     * @param message
+     *            error message
+     * @param errorContent
+     *            error page content
+     * @param additionalData
+     *            additional data
+     * @param cause
+     *            the cause
+     */
+    public CmisTooManyRequestsException(String message, String errorContent, Map<String, String> additionalData,
+            Throwable cause) {
+        super(message, errorContent, additionalData, cause);
+    }
+
+    /**
+     * Constructor.
+     * 
+     * @param message
+     *            error message
+     * @param errorContent
+     *            error page content
+     * @param cause
+     *            the cause
+     */
+    public CmisTooManyRequestsException(String message, String errorContent, Throwable cause) {
+        super(message, errorContent, cause);
+    }
+
+    /**
+     * Constructor.
+     * 
+     * @param message
+     *            error message
+     * @param cause
+     *            the cause
+     */
+    public CmisTooManyRequestsException(String message, Throwable cause) {
+        super(message, BigInteger.ZERO, cause);
+    }
+
+    /**
+     * Constructor.
+     * 
+     * @param message
+     *            error message
+     */
+    public CmisTooManyRequestsException(String message) {
+        super(message, BigInteger.ZERO);
+    }
+
+}

Added: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-async/pom.xml
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-async/pom.xml?rev=1726247&view=auto
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-async/pom.xml (added)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-async/pom.xml Fri Jan 22 16:00:46 2016
@@ -0,0 +1,54 @@
+<?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.chemistry.opencmis</groupId>
+        <artifactId>chemistry-opencmis</artifactId>
+        <version>1.0.0-SNAPSHOT</version>
+        <relativePath>../../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>chemistry-opencmis-server-async</artifactId>
+    <name>OpenCMIS Server Async Implementation</name>
+    <packaging>jar</packaging>
+
+    <properties>
+        <parentBasedir>../../</parentBasedir>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>chemistry-opencmis-server-bindings</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>javax.servlet</groupId>
+            <artifactId>javax.servlet-api</artifactId>
+            <version>3.0.1</version>
+            <scope>provided</scope>
+        </dependency>
+    </dependencies>
+</project>

Added: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-async/src/main/java/org/apache/chemistry/opencmis/server/async/AsyncCmisExecutor.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-async/src/main/java/org/apache/chemistry/opencmis/server/async/AsyncCmisExecutor.java?rev=1726247&view=auto
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-async/src/main/java/org/apache/chemistry/opencmis/server/async/AsyncCmisExecutor.java (added)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-async/src/main/java/org/apache/chemistry/opencmis/server/async/AsyncCmisExecutor.java Fri Jan 22 16:00:46 2016
@@ -0,0 +1,42 @@
+/*
+ * 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.chemistry.opencmis.server.async;
+
+import java.util.concurrent.RejectedExecutionException;
+
+import javax.servlet.AsyncContext;
+
+/**
+ * Implementations of this interface are responsible for executing a CMIS
+ * request asynchronously.
+ */
+public interface AsyncCmisExecutor {
+
+    /**
+     * Executes a CMIS request.
+     * 
+     * @param asyncContext
+     *            the {@link AsyncContext} object
+     * @param runnable
+     *            the {@link Runnable} that executes the request
+     * @throws RejectedExecutionException
+     *             if the request could not be scheduled for execution
+     */
+    void execute(AsyncContext asyncContext, Runnable runnable);
+}

Added: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-async/src/main/java/org/apache/chemistry/opencmis/server/async/AsyncCmisServiceFactory.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-async/src/main/java/org/apache/chemistry/opencmis/server/async/AsyncCmisServiceFactory.java?rev=1726247&view=auto
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-async/src/main/java/org/apache/chemistry/opencmis/server/async/AsyncCmisServiceFactory.java (added)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-async/src/main/java/org/apache/chemistry/opencmis/server/async/AsyncCmisServiceFactory.java Fri Jan 22 16:00:46 2016
@@ -0,0 +1,47 @@
+/*
+ * 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.chemistry.opencmis.server.async;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.chemistry.opencmis.commons.server.CmisService;
+import org.apache.chemistry.opencmis.commons.server.CmisServiceFactory;
+
+/**
+ * Factory for {@link CmisService} objects that support asynchronous execution.
+ */
+public interface AsyncCmisServiceFactory extends CmisServiceFactory {
+
+    /**
+     * Returns an {@link AsyncCmisExecutor} instance that handles the
+     * asynchronous execution of this request.
+     *
+     * If this method returns {@code null} the request is executed
+     * synchronously.
+     * 
+     * @param request
+     *            the request object
+     * @param response
+     *            the response object
+     * 
+     * @return the {@link AsyncCmisExecutor} instance or {@code null}
+     */
+    AsyncCmisExecutor getAsyncCmisExecutor(HttpServletRequest request, HttpServletResponse response);
+}

Added: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-async/src/main/java/org/apache/chemistry/opencmis/server/async/impl/AbstractAsyncServiceFactory.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-async/src/main/java/org/apache/chemistry/opencmis/server/async/impl/AbstractAsyncServiceFactory.java?rev=1726247&view=auto
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-async/src/main/java/org/apache/chemistry/opencmis/server/async/impl/AbstractAsyncServiceFactory.java (added)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-async/src/main/java/org/apache/chemistry/opencmis/server/async/impl/AbstractAsyncServiceFactory.java Fri Jan 22 16:00:46 2016
@@ -0,0 +1,58 @@
+/*
+ * 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.chemistry.opencmis.server.async.impl;
+
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.chemistry.opencmis.commons.impl.server.AbstractServiceFactory;
+import org.apache.chemistry.opencmis.server.async.AsyncCmisExecutor;
+import org.apache.chemistry.opencmis.server.async.AsyncCmisServiceFactory;
+
+/**
+ * An {@link AsyncCmisServiceFactory} implementation that sets up one simple
+ * {@code ThreadPoolExecutor} for executing asynchronous all CMIS requests.
+ */
+public abstract class AbstractAsyncServiceFactory extends AbstractServiceFactory implements AsyncCmisServiceFactory {
+
+    private SimpleAsyncCmisExecutor executor;
+
+    @Override
+    public void init(Map<String, String> parameters) {
+        super.init(parameters);
+        executor = new SimpleAsyncCmisExecutor();
+    }
+
+    @Override
+    public void destroy() {
+        if (executor != null) {
+            executor.destroy();
+        }
+
+        super.destroy();
+    }
+
+    @Override
+    public AsyncCmisExecutor getAsyncCmisExecutor(HttpServletRequest request, HttpServletResponse response) {
+        // all requests share one thread pool
+        return executor;
+    }
+}

Added: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-async/src/main/java/org/apache/chemistry/opencmis/server/async/impl/AsyncCmisServlet.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-async/src/main/java/org/apache/chemistry/opencmis/server/async/impl/AsyncCmisServlet.java?rev=1726247&view=auto
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-async/src/main/java/org/apache/chemistry/opencmis/server/async/impl/AsyncCmisServlet.java (added)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-async/src/main/java/org/apache/chemistry/opencmis/server/async/impl/AsyncCmisServlet.java Fri Jan 22 16:00:46 2016
@@ -0,0 +1,48 @@
+/*
+ * 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.chemistry.opencmis.server.async.impl;
+
+import java.io.IOException;
+
+import javax.servlet.Servlet;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * Marks a servlet as an asynchronous CMIS servlet.
+ */
+public interface AsyncCmisServlet extends Servlet {
+
+    /**
+     * Executes the synchronous part of this servlet.
+     * 
+     * It is called in the thread that eventually executes the CMIS call. This
+     * can be a servlet thread or a thread in a different thread pool.
+     */
+    void executeSync(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException;
+
+    /**
+     * Sends an error to client.
+     * 
+     * This method should only be use to signal problems with scheduling a CMIS
+     * call in thread pool.
+     */
+    void sendError(Exception ex, HttpServletRequest request, HttpServletResponse response) throws IOException;
+}

Added: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-async/src/main/java/org/apache/chemistry/opencmis/server/async/impl/CmisAsyncHelper.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-async/src/main/java/org/apache/chemistry/opencmis/server/async/impl/CmisAsyncHelper.java?rev=1726247&view=auto
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-async/src/main/java/org/apache/chemistry/opencmis/server/async/impl/CmisAsyncHelper.java (added)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-async/src/main/java/org/apache/chemistry/opencmis/server/async/impl/CmisAsyncHelper.java Fri Jan 22 16:00:46 2016
@@ -0,0 +1,89 @@
+/*
+ * 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.chemistry.opencmis.server.async.impl;
+
+import java.io.IOException;
+import java.util.concurrent.RejectedExecutionException;
+
+import javax.servlet.AsyncContext;
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.chemistry.opencmis.commons.exceptions.CmisServiceUnavailableException;
+import org.apache.chemistry.opencmis.commons.server.CmisServiceFactory;
+import org.apache.chemistry.opencmis.server.async.AsyncCmisExecutor;
+import org.apache.chemistry.opencmis.server.async.AsyncCmisServiceFactory;
+import org.apache.chemistry.opencmis.server.impl.CmisRepositoryContextListener;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public final class CmisAsyncHelper {
+
+    private static final Logger LOG = LoggerFactory.getLogger(CmisAsyncHelper.class);
+
+    /**
+     * Gets the service factory and get the AsyncCmisExecutor instance.
+     */
+    public static AsyncCmisExecutor getAsyncCmisExecutor(ServletConfig config, HttpServletRequest request,
+            HttpServletResponse response) throws ServletException {
+        CmisServiceFactory serviceFactory = CmisRepositoryContextListener.getServiceFactory(config.getServletContext());
+        if (!(serviceFactory instanceof AsyncCmisServiceFactory)) {
+            throw new ServletException("CMIS service factory does not support asynchronous execution!");
+        }
+
+        return ((AsyncCmisServiceFactory) serviceFactory).getAsyncCmisExecutor(request, response);
+    }
+
+    /**
+     * Executes a request asynchronously.
+     */
+    public static void executeAsync(AsyncCmisServlet servlet, HttpServletRequest request, HttpServletResponse response)
+            throws ServletException, IOException {
+        AsyncCmisExecutor executor = getAsyncCmisExecutor(servlet.getServletConfig(), request, response);
+
+        if (executor == null) {
+            // there is no executor -> execute synchronously
+            servlet.executeSync(request, response);
+        } else {
+            // there is an executor -> start asynchronous execution
+            AsyncContext asyncContext = request.startAsync();
+
+            try {
+                executor.execute(asyncContext, new CmisRequestRunner(asyncContext, servlet));
+            } catch (RejectedExecutionException ree) {
+                if (LOG.isWarnEnabled()) {
+                    LOG.warn("Submitting async request failed: {}", ree.toString(), ree);
+                }
+
+                servlet.sendError(new CmisServiceUnavailableException("CMIS server is busy", ree), request, response);
+                asyncContext.complete();
+            } catch (Exception e) {
+                LOG.error("Executing async request failed: {}", e.toString(), e);
+
+                servlet.sendError(e, request, response);
+                asyncContext.complete();
+            }
+        }
+    }
+
+    private CmisAsyncHelper() {
+    }
+}

Added: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-async/src/main/java/org/apache/chemistry/opencmis/server/async/impl/CmisRequestRunner.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-async/src/main/java/org/apache/chemistry/opencmis/server/async/impl/CmisRequestRunner.java?rev=1726247&view=auto
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-async/src/main/java/org/apache/chemistry/opencmis/server/async/impl/CmisRequestRunner.java (added)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-async/src/main/java/org/apache/chemistry/opencmis/server/async/impl/CmisRequestRunner.java Fri Jan 22 16:00:46 2016
@@ -0,0 +1,64 @@
+/*
+ * 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.chemistry.opencmis.server.async.impl;
+
+import java.io.IOException;
+
+import javax.servlet.AsyncContext;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Runner that executes an asynchronous CMIS request.
+ */
+public class CmisRequestRunner implements Runnable {
+    private static final Logger LOG = LoggerFactory.getLogger(CmisRequestRunner.class);
+
+    private final AsyncContext asyncContext;
+    private final AsyncCmisServlet asyncServlet;
+
+    public CmisRequestRunner(AsyncContext asyncContext, AsyncCmisServlet asyncServlet) {
+        this.asyncContext = asyncContext;
+        this.asyncServlet = asyncServlet;
+    }
+
+    @Override
+    public void run() {
+        try {
+            asyncServlet.executeSync((HttpServletRequest) asyncContext.getRequest(),
+                    (HttpServletResponse) asyncContext.getResponse());
+        } catch (Exception e) {
+            LOG.error("Async Excpetion: {}", e.toString(), e);
+
+            try {
+                asyncServlet.sendError(e, (HttpServletRequest) asyncContext.getRequest(),
+                        (HttpServletResponse) asyncContext.getResponse());
+            } catch (IOException ioe) {
+                if (LOG.isWarnEnabled()) {
+                    LOG.warn("Failed to send error responds: {}", ioe.toString(), ioe);
+                }
+            }
+        } finally {
+            asyncContext.complete();
+        }
+    }
+}

Added: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-async/src/main/java/org/apache/chemistry/opencmis/server/async/impl/SimpleAsyncCmisExecutor.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-async/src/main/java/org/apache/chemistry/opencmis/server/async/impl/SimpleAsyncCmisExecutor.java?rev=1726247&view=auto
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-async/src/main/java/org/apache/chemistry/opencmis/server/async/impl/SimpleAsyncCmisExecutor.java (added)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-async/src/main/java/org/apache/chemistry/opencmis/server/async/impl/SimpleAsyncCmisExecutor.java Fri Jan 22 16:00:46 2016
@@ -0,0 +1,91 @@
+package org.apache.chemistry.opencmis.server.async.impl;
+
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+
+import javax.servlet.AsyncContext;
+
+import org.apache.chemistry.opencmis.server.async.AsyncCmisExecutor;
+
+/**
+ * A simple {@link AsyncCmisExecutor} implementation that uses a
+ * {@code ThreadPoolExecutor} for executing asynchronous CMIS requests.
+ */
+public class SimpleAsyncCmisExecutor implements AsyncCmisExecutor {
+
+    private static int cmisThreadInitNumber = 0;
+
+    private ExecutorService executorService;
+    private long timeout;
+
+    public SimpleAsyncCmisExecutor() {
+        executorService = createExecutorService();
+        timeout = 24 * 60 * 60 * 1000; // 24 hours
+    }
+
+    private static synchronized int nextThreadNum() {
+        return cmisThreadInitNumber++;
+    }
+
+    /**
+     * Creates an ExecutorService instance.
+     */
+    private ExecutorService createExecutorService() {
+        final ThreadGroup threadGroup = new ThreadGroup("cmis-thread-group");
+        final ThreadFactory threadFactory = new ThreadFactory() {
+            @Override
+            public Thread newThread(Runnable r) {
+                return new Thread(threadGroup, r, "cmis-" + nextThreadNum());
+            }
+        };
+
+        int processors = Runtime.getRuntime().availableProcessors();
+        int maximumPoolSize = processors * 100;
+        int corePoolSize = processors;
+        int queueSize = maximumPoolSize / 2;
+
+        ThreadPoolExecutor threadPoolexecutor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, 60L,
+                TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(queueSize), threadFactory);
+
+        return threadPoolexecutor;
+    }
+
+    /**
+     * Waits until all running threads are stopped.
+     */
+    public void destroy() {
+        executorService.shutdown();
+    }
+
+    /**
+     * Gets the timeout for the AsyncContext.
+     * 
+     * @return the timeout in milliseconds
+     */
+    public long getTimeout() {
+        return timeout;
+    }
+
+    /**
+     * Sets the timeout for the AsyncContext.
+     * 
+     * @param timeout
+     *            the timeout in milliseconds
+     * 
+     * @see AsyncContext#setTimeout(long)
+     */
+    public void setTimeout(long timeout) {
+        this.timeout = timeout;
+    }
+
+    @Override
+    public void execute(AsyncContext asyncContext, Runnable runable) {
+        asyncContext.setTimeout(timeout);
+        asyncContext.addListener(new SimpleCmisAsyncListener());
+
+        executorService.submit(runable);
+    }
+}

Added: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-async/src/main/java/org/apache/chemistry/opencmis/server/async/impl/SimpleCmisAsyncListener.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-async/src/main/java/org/apache/chemistry/opencmis/server/async/impl/SimpleCmisAsyncListener.java?rev=1726247&view=auto
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-async/src/main/java/org/apache/chemistry/opencmis/server/async/impl/SimpleCmisAsyncListener.java (added)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-async/src/main/java/org/apache/chemistry/opencmis/server/async/impl/SimpleCmisAsyncListener.java Fri Jan 22 16:00:46 2016
@@ -0,0 +1,61 @@
+/*
+ * 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.chemistry.opencmis.server.async.impl;
+
+import java.io.IOException;
+
+import javax.servlet.AsyncEvent;
+import javax.servlet.AsyncListener;
+import javax.servlet.annotation.WebListener;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Simple listener for asynchronous events (for debugging and error messages).
+ */
+@WebListener
+public class SimpleCmisAsyncListener implements AsyncListener {
+
+    private static final Logger LOG = LoggerFactory.getLogger(SimpleCmisAsyncListener.class);
+
+    @Override
+    public void onComplete(AsyncEvent asyncEvent) throws IOException {
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("Request complete.");
+        }
+    }
+
+    @Override
+    public void onError(AsyncEvent asyncEvent) throws IOException {
+        LOG.error("Request failed!", asyncEvent.getThrowable());
+    }
+
+    @Override
+    public void onStartAsync(AsyncEvent asyncEvent) throws IOException {
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("Request starts.");
+        }
+    }
+
+    @Override
+    public void onTimeout(AsyncEvent asyncEvent) throws IOException {
+        LOG.error("Request timed out!", asyncEvent.getThrowable());
+    }
+}

Added: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-async/src/main/java/org/apache/chemistry/opencmis/server/async/impl/atompub/AsyncCmisAtomPubServlet.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-async/src/main/java/org/apache/chemistry/opencmis/server/async/impl/atompub/AsyncCmisAtomPubServlet.java?rev=1726247&view=auto
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-async/src/main/java/org/apache/chemistry/opencmis/server/async/impl/atompub/AsyncCmisAtomPubServlet.java (added)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-async/src/main/java/org/apache/chemistry/opencmis/server/async/impl/atompub/AsyncCmisAtomPubServlet.java Fri Jan 22 16:00:46 2016
@@ -0,0 +1,54 @@
+/*
+ * 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.chemistry.opencmis.server.async.impl.atompub;
+
+import java.io.IOException;
+
+import javax.servlet.ServletException;
+import javax.servlet.annotation.WebServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.chemistry.opencmis.server.async.impl.AsyncCmisServlet;
+import org.apache.chemistry.opencmis.server.async.impl.CmisAsyncHelper;
+import org.apache.chemistry.opencmis.server.impl.atompub.CmisAtomPubServlet;
+
+/**
+ * Async CMIS AtomPub servlet.
+ */
+@WebServlet(asyncSupported = true)
+public class AsyncCmisAtomPubServlet extends CmisAtomPubServlet implements AsyncCmisServlet {
+
+    private static final long serialVersionUID = 1L;
+
+    @Override
+    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
+        CmisAsyncHelper.executeAsync(this, req, resp);
+    }
+
+    @Override
+    public void executeSync(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
+        super.service(req, resp);
+    }
+
+    @Override
+    public void sendError(Exception ex, HttpServletRequest request, HttpServletResponse response) throws IOException {
+        printError(ex, request, response);
+    }
+}

Added: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-async/src/main/java/org/apache/chemistry/opencmis/server/async/impl/browser/AsyncCmisBrowserBindingServlet.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-async/src/main/java/org/apache/chemistry/opencmis/server/async/impl/browser/AsyncCmisBrowserBindingServlet.java?rev=1726247&view=auto
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-async/src/main/java/org/apache/chemistry/opencmis/server/async/impl/browser/AsyncCmisBrowserBindingServlet.java (added)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-async/src/main/java/org/apache/chemistry/opencmis/server/async/impl/browser/AsyncCmisBrowserBindingServlet.java Fri Jan 22 16:00:46 2016
@@ -0,0 +1,54 @@
+/*
+ * 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.chemistry.opencmis.server.async.impl.browser;
+
+import java.io.IOException;
+
+import javax.servlet.ServletException;
+import javax.servlet.annotation.WebServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.chemistry.opencmis.server.async.impl.AsyncCmisServlet;
+import org.apache.chemistry.opencmis.server.async.impl.CmisAsyncHelper;
+import org.apache.chemistry.opencmis.server.impl.browser.CmisBrowserBindingServlet;
+
+/**
+ * Async CMIS Browser binding servlet.
+ */
+@WebServlet(asyncSupported = true)
+public class AsyncCmisBrowserBindingServlet extends CmisBrowserBindingServlet implements AsyncCmisServlet {
+
+    private static final long serialVersionUID = 1L;
+
+    @Override
+    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
+        CmisAsyncHelper.executeAsync(this, req, resp);
+    }
+
+    @Override
+    public void executeSync(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
+        super.service(req, resp);
+    }
+
+    @Override
+    public void sendError(Exception ex, HttpServletRequest request, HttpServletResponse response) throws IOException {
+        printError(null, ex, request, response);
+    }
+}

Added: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-async/src/main/java/org/apache/chemistry/opencmis/server/async/impl/webservices/AsyncCmisWebServicesServlet.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-async/src/main/java/org/apache/chemistry/opencmis/server/async/impl/webservices/AsyncCmisWebServicesServlet.java?rev=1726247&view=auto
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-async/src/main/java/org/apache/chemistry/opencmis/server/async/impl/webservices/AsyncCmisWebServicesServlet.java (added)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-async/src/main/java/org/apache/chemistry/opencmis/server/async/impl/webservices/AsyncCmisWebServicesServlet.java Fri Jan 22 16:00:46 2016
@@ -0,0 +1,59 @@
+/*
+ * 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.chemistry.opencmis.server.async.impl.webservices;
+
+import java.io.IOException;
+
+import javax.servlet.ServletException;
+import javax.servlet.annotation.WebServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.chemistry.opencmis.commons.exceptions.CmisServiceUnavailableException;
+import org.apache.chemistry.opencmis.server.async.impl.AsyncCmisServlet;
+import org.apache.chemistry.opencmis.server.async.impl.CmisAsyncHelper;
+import org.apache.chemistry.opencmis.server.impl.webservices.CmisWebServicesServlet;
+
+/**
+ * Async CMIS Web Services servlet.
+ */
+@WebServlet(asyncSupported = true)
+public class AsyncCmisWebServicesServlet extends CmisWebServicesServlet implements AsyncCmisServlet {
+
+    private static final long serialVersionUID = 1L;
+
+    @Override
+    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
+        CmisAsyncHelper.executeAsync(this, req, resp);
+    }
+
+    @Override
+    public void executeSync(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
+        super.service(req, resp);
+    }
+
+    @Override
+    public void sendError(Exception ex, HttpServletRequest request, HttpServletResponse response) throws IOException {
+        if (ex instanceof CmisServiceUnavailableException) {
+            response.sendError(503, ex.getMessage());
+        } else {
+            printError(request, response, ex.getMessage());
+        }
+    }
+}

Modified: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings-war/pom.xml
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings-war/pom.xml?rev=1726247&r1=1726246&r2=1726247&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings-war/pom.xml (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings-war/pom.xml Fri Jan 22 16:00:46 2016
@@ -33,13 +33,11 @@
             <artifactId>chemistry-opencmis-server-bindings</artifactId>
             <version>${project.version}</version>
         </dependency>
-         <!--
         <dependency>
             <groupId>${project.groupId}</groupId>
             <artifactId>chemistry-opencmis-server-async</artifactId>
             <version>${project.version}</version>
         </dependency>
-        -->
         <!-- Uncomment for CORS support 
         <dependency>
             <groupId>com.thetransactioncompany</groupId>
@@ -47,19 +45,5 @@
             <version>2.1.2</version>
         </dependency>
         -->
-        <!--
-        <dependency>
-            <groupId>javax.servlet</groupId>
-            <artifactId>servlet-api</artifactId>
-            <version>2.4</version>
-            <scope>provided</scope>
-        </dependency>
-         -->
-        <dependency>
-            <groupId>javax.servlet</groupId>
-            <artifactId>javax.servlet-api</artifactId>
-            <version>3.0.1</version>
-            <scope>provided</scope>
-        </dependency>
     </dependencies>
 </project>

Added: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings-war/src/main/webapp/WEB-INF/web-async.xml
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings-war/src/main/webapp/WEB-INF/web-async.xml?rev=1726247&view=auto
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings-war/src/main/webapp/WEB-INF/web-async.xml (added)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings-war/src/main/webapp/WEB-INF/web-async.xml Fri Jan 22 16:00:46 2016
@@ -0,0 +1,267 @@
+<?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.  
+-->
+<web-app version="3.0"
+    xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
+    
+    <display-name>OpenCMIS Server</display-name>
+
+    <welcome-file-list>
+        <welcome-file>index.jsp</welcome-file>
+        <welcome-file>index.html</welcome-file>
+    </welcome-file-list>
+
+    <listener>
+        <listener-class>org.apache.chemistry.opencmis.server.impl.CmisRepositoryContextListener</listener-class>
+    </listener>
+    
+    <!-- 
+         A servlet filter that logs all requests in files. Useful for monitoring and debugging.
+         Use it with care! It can generate a huge amount of files and will slow down performance
+         significantly.
+    -->
+    <!-- - ->
+    <filter>
+           <filter-name>LoggingFilter</filter-name>
+          <filter-class>org.apache.chemistry.opencmis.server.support.filter.LoggingFilter</filter-class>
+           <init-param>
+              <param-name>LogDir</param-name>
+              <param-value></param-value>
+           </init-param>
+           <init-param>
+              <param-name>PrettyPrint</param-name>
+              <param-value>true</param-value>
+           </init-param>
+           <init-param>
+              <param-name>LogHeader</param-name>
+              <param-value>true</param-value>
+           </init-param>
+           <init-param>
+              <param-name>Indent</param-name>
+              <param-value>4</param-value>
+           </init-param>
+    </filter>
+    
+    <filter-mapping>
+           <filter-name>LoggingFilter</filter-name>
+           <servlet-name>cmisatom10</servlet-name> 
+    </filter-mapping>
+    <filter-mapping>
+           <filter-name>LoggingFilter</filter-name>
+           <servlet-name>cmisatom11</servlet-name> 
+    </filter-mapping>
+    <filter-mapping>
+           <filter-name>LoggingFilter</filter-name>
+           <servlet-name>cmisws10</servlet-name> 
+    </filter-mapping>
+    <filter-mapping>
+           <filter-name>LoggingFilter</filter-name>
+           <servlet-name>cmisws11</servlet-name> 
+    </filter-mapping>
+    <filter-mapping>
+           <filter-name>LoggingFilter</filter-name>
+           <servlet-name>cmisbrowser</servlet-name> 
+    </filter-mapping>
+    <!- -   -->
+
+    <!--
+        Uncomment the following filter if the OpenCMIS server runs behind a proxy server or a load balancer.
+        The value of the 'trustedProxies' parameter is a regular expression. It must match the IP address of the proxy or load balancer.
+    -->
+    <!--
+    <filter>
+           <filter-name>ProxyFilter</filter-name>
+          <filter-class>org.apache.chemistry.opencmis.server.filter.ProxyFilter</filter-class>
+        <init-param>
+            <param-name>trustedProxies</param-name>
+            <param-value>10\.\d{1,3}\.\d{1,3}\.\d{1,3}|192\.168\.\d{1,3}\.\d{1,3}|169\.254\.\d{1,3}\.\d{1,3}|127\.\d{1,3}\.\d{1,3}\.\d{1,3}</param-value>
+        </init-param>
+    </filter>
+
+    <filter-mapping>
+           <filter-name>ProxyFilter</filter-name>
+           <servlet-name>cmisatom10</servlet-name> 
+    </filter-mapping>
+    <filter-mapping>
+           <filter-name>ProxyFilter</filter-name>
+           <servlet-name>cmisatom11</servlet-name> 
+    </filter-mapping>
+    <filter-mapping>
+           <filter-name>ProxyFilter</filter-name>
+           <servlet-name>cmisbrowser</servlet-name> 
+    </filter-mapping>    
+    -->
+
+    <!--
+        Uncomment the following filter to enable CORS support for the browser binding.
+        See http://software.dzhuvinov.com/cors-filter.html for details.
+        Put the CORS libraries into the WEB-INF/lib directory or uncomment the CORS dependency in the pom.xml.
+    -->
+    <!--
+    <filter>
+        <filter-name>CORS</filter-name>
+        <filter-class>com.thetransactioncompany.cors.CORSFilter</filter-class>
+        <init-param>
+            <param-name>cors.allowGenericHttpRequests</param-name>
+            <param-value>true</param-value>
+        </init-param>
+        <init-param>
+            <param-name>cors.allowOrigin</param-name>
+            <param-value>*</param-value>
+        </init-param>
+        <init-param>
+            <param-name>cors.allowSubdomains</param-name>
+            <param-value>false</param-value>
+        </init-param>
+        <init-param>
+            <param-name>cors.supportedMethods</param-name>
+            <param-value>GET, POST</param-value>
+        </init-param>
+        <init-param>
+            <param-name>cors.supportedHeaders</param-name>
+            <param-value>*</param-value>
+        </init-param>
+        <init-param>
+            <param-name>cors.exposedHeaders</param-name>
+            <param-value></param-value>
+        </init-param>
+        <init-param>
+            <param-name>cors.supportsCredentials</param-name>
+            <param-value>true</param-value>
+        </init-param>
+        <init-param>
+            <param-name>cors.maxAge</param-name>
+            <param-value>3600</param-value>
+        </init-param>
+        <init-param>
+            <param-name>cors.tagRequests</param-name>
+            <param-value>false</param-value>
+        </init-param>
+    </filter>
+
+    <filter-mapping>
+        <filter-name>CORS</filter-name>
+        <servlet-name>cmisbrowser</servlet-name>
+    </filter-mapping>
+    -->
+
+    <servlet>
+        <servlet-name>cmisws10</servlet-name>
+        <servlet-class>org.apache.chemistry.opencmis.server.async.impl.webservices.AsyncCmisWebServicesServlet</servlet-class>
+        <init-param>
+            <param-name>cmisVersion</param-name>
+            <param-value>1.0</param-value>
+        </init-param>
+        <load-on-startup>1</load-on-startup>
+        <async-supported>true</async-supported>
+    </servlet>
+    
+    <servlet>
+        <servlet-name>cmisws11</servlet-name>
+        <servlet-class>org.apache.chemistry.opencmis.server.async.impl.webservices.AsyncCmisWebServicesServlet</servlet-class>
+        <init-param>
+            <param-name>cmisVersion</param-name>
+            <param-value>1.1</param-value>
+        </init-param>
+        <load-on-startup>1</load-on-startup>
+        <async-supported>true</async-supported>
+    </servlet>
+
+    <servlet>
+        <servlet-name>cmisatom10</servlet-name>
+        <servlet-class>org.apache.chemistry.opencmis.server.async.impl.atompub.AsyncCmisAtomPubServlet</servlet-class>
+        <init-param>
+            <param-name>callContextHandler</param-name>
+            <param-value>org.apache.chemistry.opencmis.server.shared.BasicAuthCallContextHandler</param-value>
+        </init-param>
+        <init-param>
+            <param-name>cmisVersion</param-name>
+            <param-value>1.0</param-value>
+        </init-param>
+        <load-on-startup>2</load-on-startup>
+        <async-supported>true</async-supported>
+    </servlet>
+
+    <servlet>
+        <servlet-name>cmisatom11</servlet-name>
+        <servlet-class>org.apache.chemistry.opencmis.server.async.impl.atompub.AsyncCmisAtomPubServlet</servlet-class>
+        <init-param>
+            <param-name>callContextHandler</param-name>
+            <param-value>org.apache.chemistry.opencmis.server.shared.BasicAuthCallContextHandler</param-value>
+        </init-param>
+        <init-param>
+            <param-name>cmisVersion</param-name>
+            <param-value>1.1</param-value>
+        </init-param>
+        <load-on-startup>2</load-on-startup>
+        <async-supported>true</async-supported>
+    </servlet>
+    
+    <servlet>
+        <servlet-name>cmisbrowser</servlet-name>
+        <servlet-class>org.apache.chemistry.opencmis.server.async.impl.browser.AsyncCmisBrowserBindingServlet</servlet-class>
+        <init-param>
+            <param-name>callContextHandler</param-name>
+            <param-value>org.apache.chemistry.opencmis.server.impl.browser.token.TokenCallContextHandler</param-value>
+        </init-param>
+        <load-on-startup>2</load-on-startup>
+        <async-supported>true</async-supported>
+    </servlet>
+    
+    <servlet>
+        <servlet-name>cmisendpoints</servlet-name>
+        <servlet-class>org.apache.chemistry.opencmis.server.impl.endpoints.SimpleCmisEndpointsDocumentServlet</servlet-class>
+        <init-param>
+            <param-name>template</param-name>
+            <param-value>/WEB-INF/cmis-endpoints.json</param-value>
+        </init-param>
+        <load-on-startup>3</load-on-startup>
+    </servlet>
+
+    <servlet-mapping>
+        <servlet-name>cmisws10</servlet-name>
+        <url-pattern>/services/*</url-pattern>
+    </servlet-mapping>
+
+    <servlet-mapping>
+        <servlet-name>cmisws11</servlet-name>
+        <url-pattern>/services11/*</url-pattern>
+    </servlet-mapping>
+
+    <servlet-mapping>
+        <servlet-name>cmisatom10</servlet-name>
+        <url-pattern>/atom/*</url-pattern>
+    </servlet-mapping>
+    
+    <servlet-mapping>
+        <servlet-name>cmisatom11</servlet-name>
+        <url-pattern>/atom11/*</url-pattern>
+    </servlet-mapping>
+
+    <servlet-mapping>
+        <servlet-name>cmisbrowser</servlet-name>
+        <url-pattern>/browser/*</url-pattern>
+    </servlet-mapping>
+
+    <servlet-mapping>
+        <servlet-name>cmisendpoints</servlet-name>
+        <url-pattern>/cmis-endpoints.json</url-pattern>
+    </servlet-mapping>
+</web-app>

Modified: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/atompub/CmisAtomPubServlet.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/atompub/CmisAtomPubServlet.java?rev=1726247&r1=1726246&r2=1726247&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/atompub/CmisAtomPubServlet.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/atompub/CmisAtomPubServlet.java Fri Jan 22 16:00:46 2016
@@ -69,6 +69,7 @@ import org.apache.chemistry.opencmis.com
 import org.apache.chemistry.opencmis.commons.exceptions.CmisServiceUnavailableException;
 import org.apache.chemistry.opencmis.commons.exceptions.CmisStorageException;
 import org.apache.chemistry.opencmis.commons.exceptions.CmisStreamNotSupportedException;
+import org.apache.chemistry.opencmis.commons.exceptions.CmisTooManyRequestsException;
 import org.apache.chemistry.opencmis.commons.exceptions.CmisUnauthorizedException;
 import org.apache.chemistry.opencmis.commons.exceptions.CmisUpdateConflictException;
 import org.apache.chemistry.opencmis.commons.exceptions.CmisVersioningException;
@@ -300,6 +301,8 @@ public class CmisAtomPubServlet extends
             return 409;
         } else if (ex instanceof CmisVersioningException) {
             return 409;
+        } else if (ex instanceof CmisTooManyRequestsException) {
+            return 429;
         } else if (ex instanceof CmisServiceUnavailableException) {
             return 503;
         }

Modified: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/CmisBrowserBindingServlet.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/CmisBrowserBindingServlet.java?rev=1726247&r1=1726246&r2=1726247&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/CmisBrowserBindingServlet.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/CmisBrowserBindingServlet.java Fri Jan 22 16:00:46 2016
@@ -98,6 +98,7 @@ import org.apache.chemistry.opencmis.com
 import org.apache.chemistry.opencmis.commons.exceptions.CmisServiceUnavailableException;
 import org.apache.chemistry.opencmis.commons.exceptions.CmisStorageException;
 import org.apache.chemistry.opencmis.commons.exceptions.CmisStreamNotSupportedException;
+import org.apache.chemistry.opencmis.commons.exceptions.CmisTooManyRequestsException;
 import org.apache.chemistry.opencmis.commons.exceptions.CmisUnauthorizedException;
 import org.apache.chemistry.opencmis.commons.exceptions.CmisUpdateConflictException;
 import org.apache.chemistry.opencmis.commons.exceptions.CmisVersioningException;
@@ -119,6 +120,9 @@ import org.apache.chemistry.opencmis.ser
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+/**
+ * CMIS Browser binding servlet.
+ */
 public class CmisBrowserBindingServlet extends AbstractCmisHttpServlet {
 
     private static final long serialVersionUID = 1L;
@@ -467,6 +471,8 @@ public class CmisBrowserBindingServlet e
                 return 409;
             } else if (ex instanceof CmisVersioningException) {
                 return 409;
+            } else if (ex instanceof CmisTooManyRequestsException) {
+                return 429;
             } else if (ex instanceof CmisServiceUnavailableException) {
                 return 503;
             }

Modified: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/webservices/CmisWebServicesServlet.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/webservices/CmisWebServicesServlet.java?rev=1726247&r1=1726246&r2=1726247&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/webservices/CmisWebServicesServlet.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/webservices/CmisWebServicesServlet.java Fri Jan 22 16:00:46 2016
@@ -48,6 +48,9 @@ import org.apache.cxf.transport.servlet.
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+/**
+ * CMIS Web Services servlet.
+ */
 public class CmisWebServicesServlet extends CXFServlet {
 
     public static final String PARAM_CMIS_VERSION = "cmisVersion";
@@ -207,8 +210,8 @@ public class CmisWebServicesServlet exte
         pw.flush();
     }
 
-    private void printError(HttpServletRequest request, HttpServletResponse response, String message)
-            throws ServletException, IOException {
+    protected void printError(HttpServletRequest request, HttpServletResponse response, String message)
+            throws IOException {
         response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
         response.setContentType("text/xml");
         response.setCharacterEncoding(IOUtils.UTF8);

Modified: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/pom.xml
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/pom.xml?rev=1726247&r1=1726246&r2=1726247&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/pom.xml (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/pom.xml Fri Jan 22 16:00:46 2016
@@ -108,6 +108,11 @@
         </dependency>
         <dependency>
             <groupId>${project.groupId}</groupId>
+            <artifactId>chemistry-opencmis-server-async</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
             <artifactId>chemistry-opencmis-server-bindings-war</artifactId>
             <version>${project.version}</version>
             <scope>provided</scope>
@@ -122,8 +127,8 @@
         -->
         <dependency>
             <groupId>javax.servlet</groupId>
-            <artifactId>servlet-api</artifactId>
-            <version>2.4</version>
+            <artifactId>javax.servlet-api</artifactId>
+            <version>3.0.1</version>
             <scope>provided</scope>
         </dependency>
         <dependency>

Modified: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/server/InMemoryServiceFactoryImpl.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/server/InMemoryServiceFactoryImpl.java?rev=1726247&r1=1726246&r2=1726247&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/server/InMemoryServiceFactoryImpl.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/server/InMemoryServiceFactoryImpl.java Fri Jan 22 16:00:46 2016
@@ -51,7 +51,6 @@ import org.apache.chemistry.opencmis.com
 import org.apache.chemistry.opencmis.commons.impl.XMLUtils;
 import org.apache.chemistry.opencmis.commons.impl.dataobjects.AbstractTypeDefinition;
 import org.apache.chemistry.opencmis.commons.impl.dataobjects.BindingsObjectFactoryImpl;
-import org.apache.chemistry.opencmis.commons.impl.server.AbstractServiceFactory;
 import org.apache.chemistry.opencmis.commons.server.CallContext;
 import org.apache.chemistry.opencmis.commons.server.CmisService;
 import org.apache.chemistry.opencmis.commons.spi.BindingsObjectFactory;
@@ -61,13 +60,14 @@ import org.apache.chemistry.opencmis.inm
 import org.apache.chemistry.opencmis.inmemory.storedobj.api.StoreManager;
 import org.apache.chemistry.opencmis.inmemory.storedobj.impl.StoreManagerFactory;
 import org.apache.chemistry.opencmis.inmemory.storedobj.impl.StoreManagerImpl;
+import org.apache.chemistry.opencmis.server.async.impl.AbstractAsyncServiceFactory;
 import org.apache.chemistry.opencmis.server.support.TypeManager;
 import org.apache.chemistry.opencmis.server.support.wrapper.ConformanceCmisServiceWrapper;
 import org.apache.chemistry.opencmis.util.repository.ObjectGenerator;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class InMemoryServiceFactoryImpl extends AbstractServiceFactory {
+public class InMemoryServiceFactoryImpl extends AbstractAsyncServiceFactory {
 
     private static final Logger LOG = LoggerFactory.getLogger(InMemoryServiceFactoryImpl.class.getName());
     private static final BigInteger DEFAULT_MAX_ITEMS_OBJECTS = BigInteger.valueOf(1000);
@@ -90,6 +90,8 @@ public class InMemoryServiceFactoryImpl
         LOG.info("Initializing in-memory repository...");
         LOG.debug("Init paramaters: " + parameters);
 
+        super.init(parameters);
+
         String overrideCtxParam = parameters.get(ConfigConstants.OVERRIDE_CALL_CONTEXT);
         if (null != overrideCtxParam) {
             fUseOverrideCtx = true;
@@ -157,7 +159,7 @@ public class InMemoryServiceFactoryImpl
         ConformanceCmisServiceWrapper wrapperService;
         InMemoryService inMemoryService = new InMemoryService(storeManager, contextToUse);
         wrapperService = new ConformanceCmisServiceWrapper(inMemoryService, DEFAULT_MAX_ITEMS_TYPES,
-        		DEFAULT_DEPTH_TYPES, DEFAULT_MAX_ITEMS_OBJECTS, DEFAULT_DEPTH_OBJECTS);
+                DEFAULT_DEPTH_TYPES, DEFAULT_MAX_ITEMS_OBJECTS, DEFAULT_DEPTH_OBJECTS);
 
         return inMemoryService; // wrapperService;
     }
@@ -188,6 +190,8 @@ public class InMemoryServiceFactoryImpl
         if (null != cleanManager) {
             cleanManager.stopCleanRepositoryJob();
         }
+
+        super.destroy();
     }
 
     public StoreManager getStoreManger() {
@@ -501,7 +505,7 @@ public class InMemoryServiceFactoryImpl
             } catch (Exception e) {
                 LOG.error("Could not create folder hierarchy with documents. ", e);
             }
-            destroy();
+            svc.close();
         } // if
 
     } // fillRepositoryIfConfigured

Modified: chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/ConnectionErrorDialog.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/ConnectionErrorDialog.java?rev=1726247&r1=1726246&r2=1726247&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/ConnectionErrorDialog.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/ConnectionErrorDialog.java Fri Jan 22 16:00:46 2016
@@ -47,6 +47,7 @@ import org.apache.chemistry.opencmis.com
 import org.apache.chemistry.opencmis.commons.exceptions.CmisPermissionDeniedException;
 import org.apache.chemistry.opencmis.commons.exceptions.CmisProxyAuthenticationException;
 import org.apache.chemistry.opencmis.commons.exceptions.CmisRuntimeException;
+import org.apache.chemistry.opencmis.commons.exceptions.CmisTooManyRequestsException;
 import org.apache.chemistry.opencmis.commons.exceptions.CmisUnauthorizedException;
 import org.apache.chemistry.opencmis.commons.impl.json.parser.JSONParseException;
 import org.xml.sax.SAXParseException;
@@ -149,6 +150,8 @@ public class ConnectionErrorDialog exten
             return "The proxy server requires valid credentials.<br>Check the session parameters "
                     + "'org.apache.chemistry.opencmis.binding.proxyuser' and "
                     + "'org.apache.chemistry.opencmis.binding.proxypassword'." + getProxyConfig();
+        } else if (exception instanceof CmisTooManyRequestsException) {
+            return "The server indicated that you made too many request. Wait or contact the server administrator.";
         } else if (exception instanceof CmisRuntimeException) {
             return "Something fatal happend on the client or server side."
                     + "<br>Check your URL, the binding, and your proxy settings."

Modified: chemistry/opencmis/trunk/pom.xml
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/pom.xml?rev=1726247&r1=1726246&r2=1726247&view=diff
==============================================================================
--- chemistry/opencmis/trunk/pom.xml (original)
+++ chemistry/opencmis/trunk/pom.xml Fri Jan 22 16:00:46 2016
@@ -187,6 +187,7 @@
         <!-- <module>chemistry-opencmis-server/chemistry-opencmis-server-jcr</module> -->
         <module>chemistry-opencmis-server/chemistry-opencmis-server-archetype</module>
         <module>chemistry-opencmis-server/chemistry-opencmis-server-extension-archetype</module>
+        <module>chemistry-opencmis-server/chemistry-opencmis-server-async</module>
         <module>chemistry-opencmis-bridge/chemistry-opencmis-bridge</module>
         <module>chemistry-opencmis-test/chemistry-opencmis-test-fit</module>
         <module>chemistry-opencmis-test/chemistry-opencmis-test-tck</module>