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>