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="[EMAIL PROTECTED]">
+        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>


Reply via email to