Author: jochen
Date: Thu Jul 20 16:39:39 2006
New Revision: 424116
URL: http://svn.apache.org/viewvc?rev=424116&view=rev
Log:
Replaced the InitializableHandler with the RequestProcessorFactoryFactory,
as discussed with Jimisola Laursen who requested an additional
InstantiationHandler.
Added:
webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/server/RequestProcessorFactoryFactory.java
Added:
webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/server/RequestProcessorFactoryFactory.java
URL:
http://svn.apache.org/viewvc/webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/server/RequestProcessorFactoryFactory.java?rev=424116&view=auto
==============================================================================
---
webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/server/RequestProcessorFactoryFactory.java
(added)
+++
webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/server/RequestProcessorFactoryFactory.java
Thu Jul 20 16:39:39 2006
@@ -0,0 +1,154 @@
+/*
+ * Copyright 2006 The Apache Software Foundation.
+ *
+ * Licensed 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.xmlrpc.server;
+
+import org.apache.xmlrpc.XmlRpcException;
+import org.apache.xmlrpc.XmlRpcRequest;
+import org.apache.xmlrpc.metadata.Util;
+
+
+/**
+ * <p>The request processor is the object, which is actually performing
+ * the request. There is nothing magic about the request processor:
+ * It may very well be a POJO. The [EMAIL PROTECTED]
RequestProcessorFactoryFactory}
+ * is passed to the [EMAIL PROTECTED] AbstractReflectiveHandlerMapping} at
startup.
+ * The mapping uses this factory to create instances of
+ * [EMAIL PROTECTED] RequestProcessorFactory}, which are used to initialize
+ * the [EMAIL PROTECTED] ReflectiveXmlRpcHandler}. The handler in turn uses its
+ * factory to create the actual request processor when a request comes
+ * in.</p>
+ * <p>However, the question arises, when and how the request processor
+ * is created and whether it needs request specific initialization.
+ * The [EMAIL PROTECTED] RequestProcessorFactoryFactory} is an object, which
makes
+ * that logic pluggable. Unfortunately, we aren't done with a single
+ * factory: We even need a factory for factories. The rationale is
+ * best explained by looking at the different use cases and how to
+ * implement them.</p>
+ * <p>The default [EMAIL PROTECTED] RequestProcessorFactoryFactory} is the
+ * [EMAIL PROTECTED] RequestSpecificProcessorFactoryFactory}. It creates a new
+ * processor instance for any request. In other words, it allows to
+ * request processor to have some state. This is fine, if the request
+ * processor is a lightweight object or needs request specific
+ * initialization. In this case, the actual request processor is
+ * created and invoked when
+ * calling [EMAIL PROTECTED]
RequestProcessorFactory#getRequestProcessor(XmlRpcRequest)}.</p>
+ * <p>An alternative implementation is the
+ * [EMAIL PROTECTED] StatelessProcessorFactoryFactory}, which may be used to
+ * create stateless request processors. Stateless request processors
+ * are typically heavyweight objects, which have an expensive
+ * initialization phase. The processor factory, which is created by
+ * [EMAIL PROTECTED] #getRequestProcessorFactory(Class pClass)} contains an
+ * initialized singleton, which is returned by
+ * [EMAIL PROTECTED]
RequestProcessorFactory#getRequestProcessor(XmlRpcRequest)}.</p>
+ * <p>Other alternatives might be a
+ * [EMAIL PROTECTED] RequestProcessorFactoryFactory}, which maintains a pool
+ * of [EMAIL PROTECTED] RequestProcessorFactory} instances. The instances are
+ * configured by calling
+ * [EMAIL PROTECTED]
RequestProcessorFactory#getRequestProcessor(XmlRpcRequest)}.</p>
+ */
+public interface RequestProcessorFactoryFactory {
+ /**
+ * This is the factory for request processors. This factory is itself
+ * created by a call to
+ * [EMAIL PROTECTED]
RequestProcessorFactoryFactory#getRequestProcessorFactory(Class)}.
+ */
+ public interface RequestProcessorFactory {
+ /**
+ * This method is invoked for any request in order to create and
+ * configure the request processor. The returned object is an
+ * instance of the class parameter in
+ * [EMAIL PROTECTED]
RequestProcessorFactoryFactory#getRequestProcessorFactory(Class)}.
+ */
+ public Object getRequestProcessor(XmlRpcRequest pRequest) throws
XmlRpcException;
+ }
+
+ /**
+ * This method is invoked at startup. It creates a factory for instances of
+ * <code>pClass</code>.
+ */
+ public RequestProcessorFactory getRequestProcessorFactory(Class pClass)
throws XmlRpcException;
+
+ /**
+ * This is the default implementation of [EMAIL PROTECTED]
RequestProcessorFactoryFactory}.
+ * A new instance is created and initialized for any request. The instance
may
+ * be configured by overwriting [EMAIL PROTECTED]
#getRequestProcessor(Class, XmlRpcRequest)}.
+ */
+ public static class RequestSpecificProcessorFactoryFactory
+ implements RequestProcessorFactoryFactory {
+ /**
+ * Subclasses may override this method for request specific
conficuration.
+ * A typical subclass will look like this:
+ * <pre>
+ * public class MyRequestProcessorFactoryFactory
+ * extends RequestProcessorFactoryFactory {
+ * protected Object getRequestProcessor(Class pClass,
XmlRpcRequest pRequest) {
+ * Object result = super.getRequestProcessor(pClass,
pRequest);
+ * // Configure the object here
+ * ...
+ * return result;
+ * }
+ * }
+ * </pre>
+ */
+ protected Object getRequestProcessor(Class pClass, XmlRpcRequest
pRequest) throws XmlRpcException {
+ return Util.newInstance(pClass);
+ }
+ public RequestProcessorFactory getRequestProcessorFactory(final Class
pClass) throws XmlRpcException {
+ return new RequestProcessorFactory(){
+ public Object getRequestProcessor(XmlRpcRequest pRequest)
throws XmlRpcException {
+ return
RequestSpecificProcessorFactoryFactory.this.getRequestProcessor(pClass,
pRequest);
+ }
+ };
+ }
+ }
+
+ /**
+ * This is an alternative implementation of [EMAIL PROTECTED]
RequestProcessorFactoryFactory}.
+ * It creates stateless request processors, which are able to process
concurrent
+ * requests without request specific initialization.
+ */
+ public static class StatelessProcessorFactoryFactory
+ implements RequestProcessorFactoryFactory {
+ /**
+ * Subclasses may override this method for class specific
configuration. Note,
+ * that this method will be called at startup only! A typical subclass
will
+ * look like this:
+ * <pre>
+ * public class MyRequestProcessorFactoryFactory
+ * extends StatelessProcessorFactoryFactory {
+ * protected Object getRequestProcessor(Class pClass) {
+ * Object result = super.getRequestProcessor(pClass);
+ * // Configure the object here
+ * ...
+ * return result;
+ * }
+ * }
+ * </pre>
+ */
+ protected Object getRequestProcessor(Class pClass) throws
XmlRpcException {
+ return Util.newInstance(pClass);
+ }
+ public RequestProcessorFactory getRequestProcessorFactory(Class pClass)
+ throws XmlRpcException {
+ final Object processor = getRequestProcessor(pClass);
+ return new RequestProcessorFactory(){
+ public Object getRequestProcessor(XmlRpcRequest pRequest)
throws XmlRpcException {
+ return processor;
+ }
+ };
+ }
+ }
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]