You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@abdera.apache.org by jm...@apache.org on 2006/09/08 19:25:45 UTC
svn commit: r441582 - in /incubator/abdera/java/trunk:
examples/src/main/java/org/apache/abdera/examples/appserver/
server/src/main/java/org/apache/abdera/protocol/server/
server/src/main/java/org/apache/abdera/protocol/server/servlet/
server/src/main/...
Author: jmsnell
Date: Fri Sep 8 10:25:44 2006
New Revision: 441582
URL: http://svn.apache.org/viewvc?view=rev&rev=441582
Log:
RequestHandlers should be stateless and thread safe.
In order to make things a bit more efficient, introduce a pooling model for
RequestHandlers and provide an AbstractRequestHandlerFactory implementation
that provides a simple stack-based pool. There's no max-instance limit on this
so folks in high-transaction environments should be careful.
Added:
incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/util/AbstractRequestHandlerFactory.java
Modified:
incubator/abdera/java/trunk/examples/src/main/java/org/apache/abdera/examples/appserver/SimpleRequestHandler.java
incubator/abdera/java/trunk/examples/src/main/java/org/apache/abdera/examples/appserver/SimpleRequestHandlerFactory.java
incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/RequestHandler.java
incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/RequestHandlerFactory.java
incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/servlet/AbderaServlet.java
incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/util/AbstractRequestHandler.java
Modified: incubator/abdera/java/trunk/examples/src/main/java/org/apache/abdera/examples/appserver/SimpleRequestHandler.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/examples/src/main/java/org/apache/abdera/examples/appserver/SimpleRequestHandler.java?view=diff&rev=441582&r1=441581&r2=441582
==============================================================================
--- incubator/abdera/java/trunk/examples/src/main/java/org/apache/abdera/examples/appserver/SimpleRequestHandler.java (original)
+++ incubator/abdera/java/trunk/examples/src/main/java/org/apache/abdera/examples/appserver/SimpleRequestHandler.java Fri Sep 8 10:25:44 2006
@@ -46,6 +46,21 @@
import org.apache.abdera.util.Constants;
import org.apache.abdera.util.MimeTypeHelper;
+/**
+ * <p>RequestHandlers are the components that actually do the work in the APP
+ * server. That is, the RequestHandler is responsible for interfacing with
+ * the back end data storage and translating the APP GET, POST, PUT, DELETE
+ * operations into operations on the data store, and for parsing the Atom
+ * posts into something the datastore can understand.</p>
+ *
+ * <p>The AbstractRequestHandler helper class makes things a bit easier by
+ * providing hooks for checking whether or not the requested resource has
+ * been modified (to support If-Modified-Since), checking to see if the resource
+ * exists (to support 404 or 410 responses), validating the request (to support
+ * 400 Bad Request responses), etc.</p>
+ *
+ * <p>RequestHandler implementations SHOULD be thread safe</p>
+ */
public class SimpleRequestHandler
extends AbstractRequestHandler {
Modified: incubator/abdera/java/trunk/examples/src/main/java/org/apache/abdera/examples/appserver/SimpleRequestHandlerFactory.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/examples/src/main/java/org/apache/abdera/examples/appserver/SimpleRequestHandlerFactory.java?view=diff&rev=441582&r1=441581&r2=441582
==============================================================================
--- incubator/abdera/java/trunk/examples/src/main/java/org/apache/abdera/examples/appserver/SimpleRequestHandlerFactory.java (original)
+++ incubator/abdera/java/trunk/examples/src/main/java/org/apache/abdera/examples/appserver/SimpleRequestHandlerFactory.java Fri Sep 8 10:25:44 2006
@@ -18,19 +18,18 @@
package org.apache.abdera.examples.appserver;
import org.apache.abdera.protocol.server.AbderaServer;
-import org.apache.abdera.protocol.server.RequestContext;
import org.apache.abdera.protocol.server.RequestHandler;
import org.apache.abdera.protocol.server.RequestHandlerFactory;
-import org.apache.abdera.protocol.server.exceptions.AbderaServerException;
+import org.apache.abdera.protocol.server.util.AbstractRequestHandlerFactory;
-public class SimpleRequestHandlerFactory
+public class SimpleRequestHandlerFactory
+ extends AbstractRequestHandlerFactory
implements RequestHandlerFactory {
- public RequestHandler newRequestHandler(
- AbderaServer abderaServer,
- RequestContext requestContext)
- throws AbderaServerException {
- return new SimpleRequestHandler(abderaServer);
+ @Override
+ protected RequestHandler newRequestHandlerInstance(
+ AbderaServer abderaServer) {
+ return new SimpleRequestHandler(abderaServer);
}
}
Modified: incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/RequestHandler.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/RequestHandler.java?view=diff&rev=441582&r1=441581&r2=441582
==============================================================================
--- incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/RequestHandler.java (original)
+++ incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/RequestHandler.java Fri Sep 8 10:25:44 2006
@@ -19,10 +19,19 @@
import org.apache.abdera.protocol.server.exceptions.AbderaServerException;
+/**
+ * RequestHandlers SHOULD be thread safe and stateless
+ */
public interface RequestHandler {
ResponseContext invoke(
RequestContext requestContext)
throws AbderaServerException;
+
+ /**
+ * RequestHandlers that do have reason to store request specific state MUST
+ * clean that internal state when the clean method is invoked.
+ */
+ void clean();
}
Modified: incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/RequestHandlerFactory.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/RequestHandlerFactory.java?view=diff&rev=441582&r1=441581&r2=441582
==============================================================================
--- incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/RequestHandlerFactory.java (original)
+++ incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/RequestHandlerFactory.java Fri Sep 8 10:25:44 2006
@@ -22,8 +22,9 @@
public interface RequestHandlerFactory {
RequestHandler newRequestHandler(
- AbderaServer abderaServer,
- RequestContext requestContext)
+ AbderaServer abderaServer)
throws AbderaServerException;
+
+ void releaseRequestHandler(RequestHandler handler);
}
Modified: incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/servlet/AbderaServlet.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/servlet/AbderaServlet.java?view=diff&rev=441582&r1=441581&r2=441582
==============================================================================
--- incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/servlet/AbderaServlet.java (original)
+++ incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/servlet/AbderaServlet.java Fri Sep 8 10:25:44 2006
@@ -110,10 +110,11 @@
RequestContext requestContext = getRequestContext(request);
ResponseContext responseContext = null;
RequestHandler handler = null;
+ RequestHandlerFactory factory = null;
try {
- RequestHandlerFactory factory = getRequestHandlerFactory();
+ factory = getRequestHandlerFactory();
if (factory != null)
- handler = factory.newRequestHandler(abderaServer,requestContext);
+ handler = factory.newRequestHandler(abderaServer);
if (handler != null) {
responseContext = handler.invoke(requestContext);
} else {
@@ -121,10 +122,13 @@
AbderaServerException.Code.NOTFOUND,
"Handler Not Found", "");
}
- } catch (AbderaServerException exception) {
+ } catch (AbderaServerException exception) {
responseContext = exception;
} catch (Throwable t) {
responseContext = new AbderaServerException(t);
+ } finally {
+ if (factory != null && handler != null)
+ factory.releaseRequestHandler(handler);
}
doOutput(response, responseContext);
}
@@ -152,8 +156,7 @@
response.setHeader(entry.getKey(), value.toString());
}
}
- }
-
+ }
if (context.hasEntity())
context.writeTo(response.getOutputStream());
} else {
Modified: incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/util/AbstractRequestHandler.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/util/AbstractRequestHandler.java?view=diff&rev=441582&r1=441581&r2=441582
==============================================================================
--- incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/util/AbstractRequestHandler.java (original)
+++ incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/util/AbstractRequestHandler.java Fri Sep 8 10:25:44 2006
@@ -27,6 +27,10 @@
public AbstractRequestHandler() {}
+ public void clean() {
+ // by default, there is nothing to clean
+ }
+
public ResponseContext invoke(
RequestContext requestContext)
throws AbderaServerException {
@@ -129,6 +133,5 @@
getResourceType(requestContext)));
throw notallowed;
}
-
}
Added: incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/util/AbstractRequestHandlerFactory.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/util/AbstractRequestHandlerFactory.java?view=auto&rev=441582
==============================================================================
--- incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/util/AbstractRequestHandlerFactory.java (added)
+++ incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/util/AbstractRequestHandlerFactory.java Fri Sep 8 10:25:44 2006
@@ -0,0 +1,54 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements. 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. For additional information regarding
+* copyright in this work, please see the NOTICE file in the top level
+* directory of this distribution.
+*/
+package org.apache.abdera.protocol.server.util;
+
+import java.util.Stack;
+
+import org.apache.abdera.protocol.server.AbderaServer;
+import org.apache.abdera.protocol.server.RequestHandler;
+import org.apache.abdera.protocol.server.RequestHandlerFactory;
+import org.apache.abdera.protocol.server.exceptions.AbderaServerException;
+
+public abstract class AbstractRequestHandlerFactory
+ implements RequestHandlerFactory {
+
+ private static Stack<RequestHandler> requestHandlerPool = new Stack<RequestHandler>();
+
+ public RequestHandler newRequestHandler(
+ AbderaServer abderaServer)
+ throws AbderaServerException {
+ RequestHandler rh = getRequestHandler(abderaServer);
+ return rh;
+ }
+
+ private synchronized RequestHandler getRequestHandler(
+ AbderaServer abderaServer) {
+ if (!requestHandlerPool.empty())
+ return requestHandlerPool.pop();
+ return newRequestHandlerInstance(abderaServer);
+ }
+
+ public synchronized void releaseRequestHandler(RequestHandler handler) {
+ handler.clean(); // tell the handler to clean any internal state
+ requestHandlerPool.push(handler);
+ }
+
+ protected abstract RequestHandler newRequestHandlerInstance(
+ AbderaServer abderaServer);
+
+}