Author: jochen
Date: Fri Jul 14 00:22:02 2006
New Revision: 421821

URL: http://svn.apache.org/viewvc?rev=421821&view=rev
Log:
ReflectiveXmlRpcHandler.execute fails to properly lookup method
PR: XMLRPC-94
Submitted-by: Chris Conrad, [EMAIL PROTECTED]

Modified:
    webservices/xmlrpc/trunk/pom.xml
    
webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/server/ReflectiveXmlRpcHandler.java
    webservices/xmlrpc/trunk/src/changes/changes.xml

Modified: webservices/xmlrpc/trunk/pom.xml
URL: 
http://svn.apache.org/viewvc/webservices/xmlrpc/trunk/pom.xml?rev=421821&r1=421820&r2=421821&view=diff
==============================================================================
--- webservices/xmlrpc/trunk/pom.xml (original)
+++ webservices/xmlrpc/trunk/pom.xml Fri Jul 14 00:22:02 2006
@@ -124,6 +124,10 @@
             <email>[EMAIL PROTECTED]</email>
         </contributor>
         <contributor>
+            <name>Chris Conrad</name>
+            <email>[EMAIL PROTECTED]</email>
+        </contributor>
+        <contributor>
             <name>Brad Karp</name>
             <email>[EMAIL PROTECTED]</email>
         </contributor>

Modified: 
webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/server/ReflectiveXmlRpcHandler.java
URL: 
http://svn.apache.org/viewvc/webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/server/ReflectiveXmlRpcHandler.java?rev=421821&r1=421820&r2=421821&view=diff
==============================================================================
--- 
webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/server/ReflectiveXmlRpcHandler.java
 (original)
+++ 
webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/server/ReflectiveXmlRpcHandler.java
 Fri Jul 14 00:22:02 2006
@@ -1,161 +1,161 @@
-/*
- * Copyright 1999,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 java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-
-import org.apache.xmlrpc.XmlRpcException;
-import org.apache.xmlrpc.XmlRpcHandler;
-import org.apache.xmlrpc.XmlRpcRequest;
-import org.apache.xmlrpc.common.TypeConverter;
-import org.apache.xmlrpc.common.TypeConverterFactory;
-import org.apache.xmlrpc.common.XmlRpcNotAuthorizedException;
-import org.apache.xmlrpc.metadata.Util;
-import 
org.apache.xmlrpc.server.AbstractReflectiveHandlerMapping.AuthenticationHandler;
-import 
org.apache.xmlrpc.server.AbstractReflectiveHandlerMapping.InitializationHandler;
-
-
-/** Default implementation of [EMAIL PROTECTED] XmlRpcHandler}.
- */
-public class ReflectiveXmlRpcHandler implements XmlRpcHandler {
-    private static class MethodData {
-        final Method method;
-        final TypeConverter[] typeConverters;
-        MethodData(Method pMethod, TypeConverterFactory pTypeConverterFactory) 
{
-            method = pMethod;
-            Class[] paramClasses = method.getParameterTypes();
-            typeConverters = new TypeConverter[paramClasses.length];
-            for (int i = 0;  i < paramClasses.length;  i++) {
-                typeConverters[i] = 
pTypeConverterFactory.getTypeConverter(paramClasses[i]);
-            }
-        }
-    }
-    private final AbstractReflectiveHandlerMapping mapping;
-       private final Class clazz;
-       private final MethodData[] methods;
-    private final Object theInstance;
-
-       /** Creates a new instance.
-        * @param pMapping The mapping, which creates this handler.
-        * @param pClass The class, which has been inspected to create
-        * this handler. Typically, this will be the same as
-        * <pre>pInstance.getClass()</pre>. It is used for diagnostic
-        * messages only.
-        * @param pInstanceIsStateless The handler
-        * can operate in either of two operation modes:
-        * <ol>
-        *   <li>The object, which is actually performing the requests,
-        *     is initialized at startup. In other words, there is only
-        *     one object, which is performing all the requests.
-        *     Obviously, this is the faster operation mode. On the
-        *     other hand, it has the disadvantage, that the object
-        *     must be stateless.</li>
-        *   <li>A new object is created for any request. This is slower,
-        *     because the object needs to be initialized. On the other
-        *     hand, it allows for stateful objects, which may take
-        *     request specific configuration like the clients IP address,
-        *     and the like.</li>
-        * </ol>
-        * @param pMethods The method, which will be invoked for
-        * executing the handler. 
-        */
-       public ReflectiveXmlRpcHandler(AbstractReflectiveHandlerMapping 
pMapping,
-                TypeConverterFactory pTypeConverterFactory,
-                               Class pClass, boolean pInstanceIsStateless, 
Method[] pMethods)
-            throws XmlRpcException {
-               mapping = pMapping;
-               clazz = pClass;
-               methods = new MethodData[pMethods.length];
-        for (int i = 0;  i < methods.length;  i++) {
-            methods[i] = new MethodData(pMethods[i], pTypeConverterFactory); 
-        }
-        theInstance = pInstanceIsStateless ? newInstance() : null;
-       }
-
-    private Object getInstance(XmlRpcRequest pRequest) throws XmlRpcException {
-        final InitializationHandler ih = mapping.getInitializationHandler();
-        if (ih == null) {
-            return theInstance == null ? newInstance() : theInstance;
-        } else {
-            final Object instance = newInstance();
-            ih.init(pRequest, instance);
-            return instance;
-        }
-    }
-
-       public Object execute(XmlRpcRequest pRequest) throws XmlRpcException {
-           AuthenticationHandler authHandler = 
mapping.getAuthenticationHandler();
-           if (authHandler != null  &&  !authHandler.isAuthorized(pRequest)) {
-               throw new XmlRpcNotAuthorizedException("Not authorized");
-           }
-           Object[] args = new Object[pRequest.getParameterCount()];
-           for (int j = 0;  j < args.length;  j++) {
-               args[j] = pRequest.getParameter(j);
-           }
-           Object instance = getInstance(pRequest);
-           for (int i = 0;  i < methods.length;  i++) {
-            MethodData methodData = methods[i];
-            TypeConverter[] converters = methodData.typeConverters;
-            if (args.length == converters.length) {
-                boolean matching = true;
-                for (int j = 0;  j < args.length;  j++) {
-                    if (!converters[j].isConvertable(args[i])) {
-                        matching = false;
-                        break;
-                    }
-                }
-                if (matching) {
-                    for (int j = 0;  j < args.length;  j++) {
-                        args[i] = converters[i].convert(args[i]);
-                    }
-                    return invoke(instance, methodData.method, args);
-                }
-            }
-           }
-           throw new XmlRpcException("No method matching arguments: " + 
Util.getSignature(args));
-    }
-
-    private Object invoke(Object pInstance, Method pMethod, Object[] pArgs) 
throws XmlRpcException {
-        try {
-               return pMethod.invoke(pInstance, pArgs);
-           } catch (IllegalAccessException e) {
-               throw new XmlRpcException("Illegal access to method "
-                                         + pMethod.getName() + " in class "
-                                         + clazz.getName(), e);
-           } catch (IllegalArgumentException e) {
-               throw new XmlRpcException("Illegal argument for method "
-                                         + pMethod.getName() + " in class "
-                                         + clazz.getName(), e);
-           } catch (InvocationTargetException e) {
-               Throwable t = e.getTargetException();
-               throw new XmlRpcException("Failed to invoke method "
-                                         + pMethod.getName() + " in class "
-                                         + clazz.getName() + ": "
-                                         + t.getMessage(), t);
-           }
-       }
-
-    protected Object newInstance() throws XmlRpcException {
-        try {
-            return clazz.newInstance();
-        } catch (InstantiationException e) {
-            throw new XmlRpcException("Failed to instantiate class " + 
clazz.getName(), e);
-        } catch (IllegalAccessException e) {
-            throw new XmlRpcException("Illegal access when instantiating class 
" + clazz.getName(), e);
-        }
-    }
-}
\ No newline at end of file
+/*
+ * Copyright 1999,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 java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+import org.apache.xmlrpc.XmlRpcException;
+import org.apache.xmlrpc.XmlRpcHandler;
+import org.apache.xmlrpc.XmlRpcRequest;
+import org.apache.xmlrpc.common.TypeConverter;
+import org.apache.xmlrpc.common.TypeConverterFactory;
+import org.apache.xmlrpc.common.XmlRpcNotAuthorizedException;
+import org.apache.xmlrpc.metadata.Util;
+import 
org.apache.xmlrpc.server.AbstractReflectiveHandlerMapping.AuthenticationHandler;
+import 
org.apache.xmlrpc.server.AbstractReflectiveHandlerMapping.InitializationHandler;
+
+
+/** Default implementation of [EMAIL PROTECTED] XmlRpcHandler}.
+ */
+public class ReflectiveXmlRpcHandler implements XmlRpcHandler {
+    private static class MethodData {
+        final Method method;
+        final TypeConverter[] typeConverters;
+        MethodData(Method pMethod, TypeConverterFactory pTypeConverterFactory) 
{
+            method = pMethod;
+            Class[] paramClasses = method.getParameterTypes();
+            typeConverters = new TypeConverter[paramClasses.length];
+            for (int i = 0;  i < paramClasses.length;  i++) {
+                typeConverters[i] = 
pTypeConverterFactory.getTypeConverter(paramClasses[i]);
+            }
+        }
+    }
+    private final AbstractReflectiveHandlerMapping mapping;
+       private final Class clazz;
+       private final MethodData[] methods;
+    private final Object theInstance;
+
+       /** Creates a new instance.
+        * @param pMapping The mapping, which creates this handler.
+        * @param pClass The class, which has been inspected to create
+        * this handler. Typically, this will be the same as
+        * <pre>pInstance.getClass()</pre>. It is used for diagnostic
+        * messages only.
+        * @param pInstanceIsStateless The handler
+        * can operate in either of two operation modes:
+        * <ol>
+        *   <li>The object, which is actually performing the requests,
+        *     is initialized at startup. In other words, there is only
+        *     one object, which is performing all the requests.
+        *     Obviously, this is the faster operation mode. On the
+        *     other hand, it has the disadvantage, that the object
+        *     must be stateless.</li>
+        *   <li>A new object is created for any request. This is slower,
+        *     because the object needs to be initialized. On the other
+        *     hand, it allows for stateful objects, which may take
+        *     request specific configuration like the clients IP address,
+        *     and the like.</li>
+        * </ol>
+        * @param pMethods The method, which will be invoked for
+        * executing the handler. 
+        */
+       public ReflectiveXmlRpcHandler(AbstractReflectiveHandlerMapping 
pMapping,
+                TypeConverterFactory pTypeConverterFactory,
+                               Class pClass, boolean pInstanceIsStateless, 
Method[] pMethods)
+            throws XmlRpcException {
+               mapping = pMapping;
+               clazz = pClass;
+               methods = new MethodData[pMethods.length];
+        for (int i = 0;  i < methods.length;  i++) {
+            methods[i] = new MethodData(pMethods[i], pTypeConverterFactory); 
+        }
+        theInstance = pInstanceIsStateless ? newInstance() : null;
+       }
+
+    private Object getInstance(XmlRpcRequest pRequest) throws XmlRpcException {
+        final InitializationHandler ih = mapping.getInitializationHandler();
+        if (ih == null) {
+            return theInstance == null ? newInstance() : theInstance;
+        } else {
+            final Object instance = newInstance();
+            ih.init(pRequest, instance);
+            return instance;
+        }
+    }
+
+       public Object execute(XmlRpcRequest pRequest) throws XmlRpcException {
+           AuthenticationHandler authHandler = 
mapping.getAuthenticationHandler();
+           if (authHandler != null  &&  !authHandler.isAuthorized(pRequest)) {
+               throw new XmlRpcNotAuthorizedException("Not authorized");
+           }
+           Object[] args = new Object[pRequest.getParameterCount()];
+           for (int j = 0;  j < args.length;  j++) {
+               args[j] = pRequest.getParameter(j);
+           }
+           Object instance = getInstance(pRequest);
+           for (int i = 0;  i < methods.length;  i++) {
+            MethodData methodData = methods[i];
+            TypeConverter[] converters = methodData.typeConverters;
+            if (args.length == converters.length) {
+                boolean matching = true;
+                for (int j = 0;  j < args.length;  j++) {
+                    if (!converters[j].isConvertable(args[j])) {
+                        matching = false;
+                        break;
+                    }
+                }
+                if (matching) {
+                    for (int j = 0;  j < args.length;  j++) {
+                        args[j] = converters[j].convert(args[j]);
+                    }
+                    return invoke(instance, methodData.method, args);
+                }
+            }
+           }
+           throw new XmlRpcException("No method matching arguments: " + 
Util.getSignature(args));
+    }
+
+    private Object invoke(Object pInstance, Method pMethod, Object[] pArgs) 
throws XmlRpcException {
+        try {
+               return pMethod.invoke(pInstance, pArgs);
+           } catch (IllegalAccessException e) {
+               throw new XmlRpcException("Illegal access to method "
+                                         + pMethod.getName() + " in class "
+                                         + clazz.getName(), e);
+           } catch (IllegalArgumentException e) {
+               throw new XmlRpcException("Illegal argument for method "
+                                         + pMethod.getName() + " in class "
+                                         + clazz.getName(), e);
+           } catch (InvocationTargetException e) {
+               Throwable t = e.getTargetException();
+               throw new XmlRpcException("Failed to invoke method "
+                                         + pMethod.getName() + " in class "
+                                         + clazz.getName() + ": "
+                                         + t.getMessage(), t);
+           }
+       }
+
+    protected Object newInstance() throws XmlRpcException {
+        try {
+            return clazz.newInstance();
+        } catch (InstantiationException e) {
+            throw new XmlRpcException("Failed to instantiate class " + 
clazz.getName(), e);
+        } catch (IllegalAccessException e) {
+            throw new XmlRpcException("Illegal access when instantiating class 
" + clazz.getName(), e);
+        }
+    }
+}

Modified: webservices/xmlrpc/trunk/src/changes/changes.xml
URL: 
http://svn.apache.org/viewvc/webservices/xmlrpc/trunk/src/changes/changes.xml?rev=421821&r1=421820&r2=421821&view=diff
==============================================================================
--- webservices/xmlrpc/trunk/src/changes/changes.xml (original)
+++ webservices/xmlrpc/trunk/src/changes/changes.xml Fri Jul 14 00:22:02 2006
@@ -8,10 +8,15 @@
           due-to-email="[EMAIL PROTECTED]">
         Added a missing "synchronized" to the TimingOutCallback.
       </action>
+      <action dev="jochen" type="fix" due-to="Chris Conrad"
+          due-to-email="[EMAIL PROTECTED]">
+        Fixed an invalid index, that caused the ReflectiveXmlRpcHandler to fail
+        detecting a method.
+      </action>
     </release>
     <release version="3.0b1" date="24-Jun-2006">
       <action dev="hgomez" type="add">
-        add connectionTimeout and replyTimeout in RPC clients.
+        Add connectionTimeout and replyTimeout in RPC clients.
         CommonsTransport support connection and reply timeout, 
liteHttpTransport only support reply timeout
       </action>
       <action dev="jochen" type="fix" due-to="Marek Ludha"



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to