You are viewing a plain text version of this content. The canonical link for it is here.
Posted to xmlrpc-dev@ws.apache.org by jo...@apache.org on 2006/05/12 22:34:09 UTC

svn commit: r405863 - in /webservices/xmlrpc/trunk: server/src/main/java/org/apache/xmlrpc/server/PropertyHandlerMapping.java src/changes/changes.xml src/site/fml/faq.fml

Author: jochen
Date: Fri May 12 13:34:09 2006
New Revision: 405863

URL: http://svn.apache.org/viewcvs?rev=405863&view=rev
Log:
Added support for initializable handlers, as suggested by Marc Petrovic.


Modified:
    webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/server/PropertyHandlerMapping.java
    webservices/xmlrpc/trunk/src/changes/changes.xml
    webservices/xmlrpc/trunk/src/site/fml/faq.fml

Modified: webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/server/PropertyHandlerMapping.java
URL: http://svn.apache.org/viewcvs/webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/server/PropertyHandlerMapping.java?rev=405863&r1=405862&r2=405863&view=diff
==============================================================================
--- webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/server/PropertyHandlerMapping.java (original)
+++ webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/server/PropertyHandlerMapping.java Fri May 12 13:34:09 2006
@@ -78,25 +78,29 @@
             Map.Entry entry = (Map.Entry) iter.next();
             String key = (String) entry.getKey();
             String value = (String) entry.getValue();
-            final Class c;
-            try {
-                c = pClassLoader.loadClass(value);
-            } catch (ClassNotFoundException e) {
-                throw new XmlRpcException("Unable to load class: " + value, e);
-            }
-            if (c == null) {
-                throw new XmlRpcException(0, "Loading class " + value + " returned null.");
-            }
-            final Object o;
-            try {
-                o = c.newInstance();
-            } catch (InstantiationException e) {
-                throw new XmlRpcException("Failed to instantiate class " + c.getName(), e);
-            } catch (IllegalAccessException e) {
-                throw new XmlRpcException("Illegal access when instantiating class " + c.getName(), e);
-            }
-            registerPublicMethods(map, key, c, o);
+            Object o = newHandlerObject(pClassLoader, value);
+            registerPublicMethods(map, key, o.getClass(), o);
         }
         return map;
+    }
+
+    protected Object newHandlerObject(ClassLoader pClassLoader, String pClassName)
+            throws XmlRpcException {
+        final Class c;
+        try {
+            c = pClassLoader.loadClass(pClassName);
+        } catch (ClassNotFoundException e) {
+            throw new XmlRpcException("Unable to load class: " + pClassName, e);
+        }
+        if (c == null) {
+            throw new XmlRpcException(0, "Loading class " + pClassName + " returned null.");
+        }
+        try {
+            return c.newInstance();
+        } catch (InstantiationException e) {
+            throw new XmlRpcException("Failed to instantiate class " + c.getName(), e);
+        } catch (IllegalAccessException e) {
+            throw new XmlRpcException("Illegal access when instantiating class " + c.getName(), e);
+        }
     }
 }

Modified: webservices/xmlrpc/trunk/src/changes/changes.xml
URL: http://svn.apache.org/viewcvs/webservices/xmlrpc/trunk/src/changes/changes.xml?rev=405863&r1=405862&r2=405863&view=diff
==============================================================================
--- webservices/xmlrpc/trunk/src/changes/changes.xml (original)
+++ webservices/xmlrpc/trunk/src/changes/changes.xml Fri May 12 13:34:09 2006
@@ -49,6 +49,10 @@
         doesn't support HTTP/1.1, so it refuses the "contentLengthOptional"
         setting from now on.
       </action>
+      <action dev="jochen" type="enhancement" due-to="Marc Petrovic"
+          due-to-email="mspetrovic@gmail.com">
+        Added support for initializable handlers.
+      </action>
     </release>
     <release version="3.0a1" date="17-Feb-2005">
       <action dev="jochen" type="enhancement">

Modified: webservices/xmlrpc/trunk/src/site/fml/faq.fml
URL: http://svn.apache.org/viewcvs/webservices/xmlrpc/trunk/src/site/fml/faq.fml?rev=405863&r1=405862&r2=405863&view=diff
==============================================================================
--- webservices/xmlrpc/trunk/src/site/fml/faq.fml (original)
+++ webservices/xmlrpc/trunk/src/site/fml/faq.fml Fri May 12 13:34:09 2006
@@ -98,5 +98,38 @@
         </ul>
       </answer>
     </faq>
+
+    <faq id="handler_initialization">
+      <question>How do I initalize the handler objects?</question>
+      <answer>
+        <p>The PropertyHandlerMapping assumes, that handlers are POJO's
+          (plain old java objects). However, this is not always desirable.
+          For example, sometimes it is assumes that handlers need to
+          be initialized by the servlet, which is configured through
+          parameters.</p>
+        <p>The recommended solution is to create a subclass of the
+          XmlRpcServlet, which in turn uses a subclass of the
+          PropertyHandlerMapping:</p>
+        <source><![CDATA[
+public interface InitializableHandler {
+    void init(HttpServlet pServlet) throws XmlRpcException;
+}
+
+public class MyXmlRpcServlet extends XmlRpcServlet {
+    protected PropertyHandlerMapping newPropertyHandlerMapping(URL url) throws IOException, XmlRpcException {
+		return new PropertyHandlerMapping(getClass().getClassLoader(), url){
+		    protected Object newHandlerObject(ClassLoader pClassLoader, String pClassName)
+		            throws XmlRpcException {
+		        Object o = super.newHandlerObject(pClassLoader, pClassName);
+		        ((InitializableHandler) o).init(MyXmlRpcServlet.this);
+		        return o;
+		    }
+		};
+	}
+    
+}
+        ]]></source>
+      </answer>
+    </faq>
   </part>
 </faqs>