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/06/24 04:59:45 UTC

svn commit: r416856 - in /webservices/xmlrpc/trunk: client/src/main/java/org/apache/xmlrpc/client/ client/src/main/java/org/apache/xmlrpc/client/util/ common/src/main/java/org/apache/xmlrpc/common/ server/src/main/java/org/apache/xmlrpc/metadata/ serve...

Author: jochen
Date: Fri Jun 23 19:59:44 2006
New Revision: 416856

URL: http://svn.apache.org/viewvc?rev=416856&view=rev
Log:
Added partial support for automatic conversion of object arrays
to lists, or vectors. Same for maps to hash tables, or properties.

Added:
    webservices/xmlrpc/trunk/common/src/main/java/org/apache/xmlrpc/common/TypeConverter.java
    webservices/xmlrpc/trunk/common/src/main/java/org/apache/xmlrpc/common/TypeConverterFactory.java
    webservices/xmlrpc/trunk/common/src/main/java/org/apache/xmlrpc/common/TypeConverterFactoryImpl.java
    webservices/xmlrpc/trunk/tests/src/test/java/org/apache/xmlrpc/test/JiraTest.java
    webservices/xmlrpc/trunk/tests/src/test/resources/org/apache/xmlrpc/test/JiraTest.properties
Modified:
    webservices/xmlrpc/trunk/client/src/main/java/org/apache/xmlrpc/client/XmlRpcLocalTransport.java
    webservices/xmlrpc/trunk/client/src/main/java/org/apache/xmlrpc/client/util/ClientFactory.java
    webservices/xmlrpc/trunk/common/src/main/java/org/apache/xmlrpc/common/LocalStreamConnection.java
    webservices/xmlrpc/trunk/common/src/main/java/org/apache/xmlrpc/common/ServerStreamConnection.java
    webservices/xmlrpc/trunk/common/src/main/java/org/apache/xmlrpc/common/XmlRpcRequestProcessor.java
    webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/metadata/ReflectiveXmlRpcMetaDataHandler.java
    webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/metadata/Util.java
    webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/server/AbstractReflectiveHandlerMapping.java
    webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/server/DynamicHandlerMapping.java
    webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/server/PropertyHandlerMapping.java
    webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/server/ReflectiveXmlRpcHandler.java
    webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/server/XmlRpcLocalStreamServer.java
    webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/server/XmlRpcServer.java
    webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/webserver/XmlRpcServlet.java
    webservices/xmlrpc/trunk/src/changes/changes.xml
    webservices/xmlrpc/trunk/tests/src/test/java/org/apache/xmlrpc/test/BaseTest.java
    webservices/xmlrpc/trunk/tests/src/test/java/org/apache/xmlrpc/test/DynamicProxyTest.java
    webservices/xmlrpc/trunk/tests/src/test/java/org/apache/xmlrpc/test/XmlRpcTestCase.java

Modified: webservices/xmlrpc/trunk/client/src/main/java/org/apache/xmlrpc/client/XmlRpcLocalTransport.java
URL: http://svn.apache.org/viewvc/webservices/xmlrpc/trunk/client/src/main/java/org/apache/xmlrpc/client/XmlRpcLocalTransport.java?rev=416856&r1=416855&r2=416856&view=diff
==============================================================================
--- webservices/xmlrpc/trunk/client/src/main/java/org/apache/xmlrpc/client/XmlRpcLocalTransport.java (original)
+++ webservices/xmlrpc/trunk/client/src/main/java/org/apache/xmlrpc/client/XmlRpcLocalTransport.java Fri Jun 23 19:59:44 2006
@@ -15,6 +15,7 @@
  */
 package org.apache.xmlrpc.client;
 
+import java.util.Collection;
 import java.util.Date;
 import java.util.Iterator;
 import java.util.Map;
@@ -22,7 +23,10 @@
 import org.apache.xmlrpc.XmlRpcConfig;
 import org.apache.xmlrpc.XmlRpcException;
 import org.apache.xmlrpc.XmlRpcRequest;
+import org.apache.xmlrpc.common.TypeConverter;
+import org.apache.xmlrpc.common.TypeConverterFactory;
 import org.apache.xmlrpc.common.XmlRpcExtensionException;
+import org.apache.xmlrpc.common.XmlRpcRequestProcessor;
 
 /** The default implementation of a local transport.
  */
@@ -45,6 +49,13 @@
 				}
 			}
 			return false;
+        } else if (pObject instanceof Collection) {
+            for (Iterator iter = ((Collection) pObject).iterator();  iter.hasNext();  ) {
+                if (isExtensionType(iter.next())) {
+                    return true;
+                }
+            }
+            return false;
 		} else if (pObject instanceof Map) {
 			Map map = (Map) pObject;
 			for (Iterator iter = map.entrySet().iterator();  iter.hasNext();  ) {
@@ -72,9 +83,10 @@
 				}
 			}
 		}
-		Object result;
+		final XmlRpcRequestProcessor server = ((XmlRpcLocalClientConfig) config).getXmlRpcServer();
+        Object result;
 		try {
-			result = ((XmlRpcLocalClientConfig) config).getXmlRpcServer().execute(pRequest);
+			result = server.execute(pRequest);
 		} catch (Throwable t) {
 			if (t instanceof XmlRpcClientException) {
 				throw (XmlRpcClientException) t;
@@ -88,6 +100,12 @@
 				throw new XmlRpcExtensionException("Result has invalid type, if isEnabledForExtensions() == false");
 			}
 		}
-		return result;
+
+		if (result == null) {
+		    return null;
+        }
+        final TypeConverterFactory typeConverterFactory = server.getTypeConverterFactory();
+        final TypeConverter typeConverter = typeConverterFactory.getTypeConverter(result.getClass());
+        return typeConverter.backConvert(result);
 	}
 }

Modified: webservices/xmlrpc/trunk/client/src/main/java/org/apache/xmlrpc/client/util/ClientFactory.java
URL: http://svn.apache.org/viewvc/webservices/xmlrpc/trunk/client/src/main/java/org/apache/xmlrpc/client/util/ClientFactory.java?rev=416856&r1=416855&r2=416856&view=diff
==============================================================================
--- webservices/xmlrpc/trunk/client/src/main/java/org/apache/xmlrpc/client/util/ClientFactory.java (original)
+++ webservices/xmlrpc/trunk/client/src/main/java/org/apache/xmlrpc/client/util/ClientFactory.java Fri Jun 23 19:59:44 2006
@@ -20,6 +20,9 @@
 import java.lang.reflect.Proxy;
 
 import org.apache.xmlrpc.client.XmlRpcClient;
+import org.apache.xmlrpc.common.TypeConverter;
+import org.apache.xmlrpc.common.TypeConverterFactory;
+import org.apache.xmlrpc.common.TypeConverterFactoryImpl;
 
 
 /**
@@ -31,16 +34,32 @@
  */
 public class ClientFactory {
     private final XmlRpcClient client;
+    private final TypeConverterFactory typeConverterFactory;
     private boolean objectMethodLocal;
 
     /** Creates a new instance.
      * @param pClient A fully configured XML-RPC client, which is
      *   used internally to perform XML-RPC calls.
+     * @param pTypeConverterFactory Creates instances of {@link TypeConverterFactory},
+     *   which are used to transform the result object in its target representation.
      */
-    public ClientFactory(XmlRpcClient pClient) {
+    public ClientFactory(XmlRpcClient pClient, TypeConverterFactory pTypeConverterFactory) {
+        typeConverterFactory = pTypeConverterFactory;
         client = pClient;
     }
 
+    /** Creates a new instance. Shortcut for
+     * <pre>
+     *   new ClientFactory(pClient, new TypeConverterFactoryImpl());
+     * </pre>
+     * @param pClient A fully configured XML-RPC client, which is
+     *   used internally to perform XML-RPC calls.
+     * @see TypeConverterFactoryImpl
+     */
+    public ClientFactory(XmlRpcClient pClient) {
+        this(pClient, new TypeConverterFactoryImpl());
+    }
+
     /** Returns the factories client.
      */
     public XmlRpcClient getClient() {
@@ -82,7 +101,9 @@
                     return pMethod.invoke(pProxy, pArgs);
                 }
                 String methodName = pClass.getName() + "." + pMethod.getName();
-                return client.execute(methodName, pArgs);
+                Object result = client.execute(methodName, pArgs);
+                TypeConverter typeConverter = typeConverterFactory.getTypeConverter(pMethod.getReturnType());
+                return typeConverter.convert(result);
             }
         });
     }

Modified: webservices/xmlrpc/trunk/common/src/main/java/org/apache/xmlrpc/common/LocalStreamConnection.java
URL: http://svn.apache.org/viewvc/webservices/xmlrpc/trunk/common/src/main/java/org/apache/xmlrpc/common/LocalStreamConnection.java?rev=416856&r1=416855&r2=416856&view=diff
==============================================================================
--- webservices/xmlrpc/trunk/common/src/main/java/org/apache/xmlrpc/common/LocalStreamConnection.java (original)
+++ webservices/xmlrpc/trunk/common/src/main/java/org/apache/xmlrpc/common/LocalStreamConnection.java Fri Jun 23 19:59:44 2006
@@ -1,3 +1,18 @@
+/*
+ * Copyright 1999,2005 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.common;
 
 import java.io.ByteArrayOutputStream;

Modified: webservices/xmlrpc/trunk/common/src/main/java/org/apache/xmlrpc/common/ServerStreamConnection.java
URL: http://svn.apache.org/viewvc/webservices/xmlrpc/trunk/common/src/main/java/org/apache/xmlrpc/common/ServerStreamConnection.java?rev=416856&r1=416855&r2=416856&view=diff
==============================================================================
--- webservices/xmlrpc/trunk/common/src/main/java/org/apache/xmlrpc/common/ServerStreamConnection.java (original)
+++ webservices/xmlrpc/trunk/common/src/main/java/org/apache/xmlrpc/common/ServerStreamConnection.java Fri Jun 23 19:59:44 2006
@@ -1,3 +1,18 @@
+/*
+ * Copyright 1999,2005 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.common;
 
 import java.io.IOException;

Added: webservices/xmlrpc/trunk/common/src/main/java/org/apache/xmlrpc/common/TypeConverter.java
URL: http://svn.apache.org/viewvc/webservices/xmlrpc/trunk/common/src/main/java/org/apache/xmlrpc/common/TypeConverter.java?rev=416856&view=auto
==============================================================================
--- webservices/xmlrpc/trunk/common/src/main/java/org/apache/xmlrpc/common/TypeConverter.java (added)
+++ webservices/xmlrpc/trunk/common/src/main/java/org/apache/xmlrpc/common/TypeConverter.java Fri Jun 23 19:59:44 2006
@@ -0,0 +1,44 @@
+/*
+ * Copyright 1999,2005 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.common;
+
+import java.util.List;
+import java.util.Vector;
+
+
+/** A {@link TypeConverter} is used when actually calling the
+ * handler method or actually returning the result object. It's
+ * purpose is to convert a single parameter or the return value
+ * from a generic representation (for example an array of objects)
+ * to an alternative representation, which is actually used in
+ * the methods signature (for example {@link List}, or
+ * {@link Vector}.
+ */
+public interface TypeConverter {
+    /** Returns, whether the {@link TypeConverter} is
+     * ready to handle the given object. If so,
+     * {@link #convert(Object)} may be called.
+     */
+    boolean isConvertable(Object pObject);
+    /** Converts the given object into the required
+     * representation.
+     */
+    Object convert(Object pObject);
+    /** Converts the given object into its generic
+     * representation.
+     */
+    Object backConvert(Object result);
+}

Added: webservices/xmlrpc/trunk/common/src/main/java/org/apache/xmlrpc/common/TypeConverterFactory.java
URL: http://svn.apache.org/viewvc/webservices/xmlrpc/trunk/common/src/main/java/org/apache/xmlrpc/common/TypeConverterFactory.java?rev=416856&view=auto
==============================================================================
--- webservices/xmlrpc/trunk/common/src/main/java/org/apache/xmlrpc/common/TypeConverterFactory.java (added)
+++ webservices/xmlrpc/trunk/common/src/main/java/org/apache/xmlrpc/common/TypeConverterFactory.java Fri Jun 23 19:59:44 2006
@@ -0,0 +1,27 @@
+/*
+ * Copyright 1999,2005 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.common;
+
+
+/** A {@link TypeConverterFactory} is called for creating instances
+ * of {@link TypeConverter}.
+ */
+public interface TypeConverterFactory {
+    /** Creates an instance of {@link TypeFactory}, which may be
+     * used to create instances of the given class.
+     */
+    TypeConverter getTypeConverter(Class pClass);
+}

Added: webservices/xmlrpc/trunk/common/src/main/java/org/apache/xmlrpc/common/TypeConverterFactoryImpl.java
URL: http://svn.apache.org/viewvc/webservices/xmlrpc/trunk/common/src/main/java/org/apache/xmlrpc/common/TypeConverterFactoryImpl.java?rev=416856&view=auto
==============================================================================
--- webservices/xmlrpc/trunk/common/src/main/java/org/apache/xmlrpc/common/TypeConverterFactoryImpl.java (added)
+++ webservices/xmlrpc/trunk/common/src/main/java/org/apache/xmlrpc/common/TypeConverterFactoryImpl.java Fri Jun 23 19:59:44 2006
@@ -0,0 +1,291 @@
+/*
+ * Copyright 1999,2005 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.common;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Collection;
+import java.util.Date;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Vector;
+
+import org.w3c.dom.Document;
+
+
+/** Default implementation of {@link TypeConverterFactory}.
+ */
+public class TypeConverterFactoryImpl implements TypeConverterFactory {
+    private static class IdentityTypeConverter implements TypeConverter {
+        private final Class clazz;
+        IdentityTypeConverter(Class pClass) {
+            clazz = pClass;
+        }
+        public boolean isConvertable(Object pObject) {
+            return pObject == null  ||  clazz.isAssignableFrom(pObject.getClass());
+        }
+        public Object convert(Object pObject) {
+            return pObject;
+        }
+        public Object backConvert(Object pObject) {
+            return pObject;
+        }
+    }
+
+    private static abstract class ListTypeConverter implements TypeConverter {
+        private final Class clazz;
+        ListTypeConverter(Class pClass) {
+            clazz = pClass;
+        }
+        protected abstract List newList(int pSize);
+
+        public boolean isConvertable(Object pObject) {
+            return pObject == null  ||  pObject instanceof Object[]  ||  pObject instanceof Collection;
+        }
+
+        public Object convert(Object pObject) {
+            if (pObject == null) {
+                return null;
+            }
+            if (clazz.isAssignableFrom(pObject.getClass())) {
+                return pObject;
+            }
+            if (pObject instanceof Object[]) {
+                Object[] objects = (Object[]) pObject;
+                List result = newList(objects.length);
+                for (int i = 0;  i < objects.length;  i++) {
+                    result.add(objects[i]);
+                }
+                return result;
+            }
+            Collection collection = (Collection) pObject;
+            List result = newList(collection.size());
+            result.addAll(collection);
+            return result;
+        }
+
+        public Object backConvert(Object pObject) {
+            return ((List) pObject).toArray();
+        }
+    }
+
+    private static class PrimitiveTypeConverter implements TypeConverter {
+        private final Class clazz;
+        PrimitiveTypeConverter(Class pClass) {
+            clazz = pClass;
+        }
+        public boolean isConvertable(Object pObject) {
+            return pObject != null  &&  pObject.getClass().isAssignableFrom(clazz);
+        }
+        public Object convert(Object pObject) {
+            return pObject;
+        }
+        public Object backConvert(Object pObject) {
+            return pObject;
+        }
+    }
+
+    private static final TypeConverter mapTypeConverter = new IdentityTypeConverter(Map.class);
+    private static final TypeConverter objectArrayTypeConverter = new IdentityTypeConverter(Object[].class);
+    private static final TypeConverter byteArrayTypeConverter = new IdentityTypeConverter(byte[].class);
+    private static final TypeConverter stringTypeConverter = new IdentityTypeConverter(String.class);
+    private static final TypeConverter booleanTypeConverter = new IdentityTypeConverter(Boolean.class);
+    private static final TypeConverter characterTypeConverter = new IdentityTypeConverter(Character.class);
+    private static final TypeConverter byteTypeConverter = new IdentityTypeConverter(Byte.class);
+    private static final TypeConverter shortTypeConverter = new IdentityTypeConverter(Short.class);
+    private static final TypeConverter integerTypeConverter = new IdentityTypeConverter(Integer.class);
+    private static final TypeConverter longTypeConverter = new IdentityTypeConverter(Long.class);
+    private static final TypeConverter bigDecimalTypeConverter = new IdentityTypeConverter(BigDecimal.class);
+    private static final TypeConverter bigIntegerTypeConverter = new IdentityTypeConverter(BigInteger.class);
+    private static final TypeConverter floatTypeConverter = new IdentityTypeConverter(Float.class);
+    private static final TypeConverter doubleTypeConverter = new IdentityTypeConverter(Double.class);
+    private static final TypeConverter dateTypeConverter = new IdentityTypeConverter(Date.class);
+    private static final TypeConverter calendarTypeConverter = new IdentityTypeConverter(Calendar.class);
+    private static final TypeConverter domTypeConverter = new IdentityTypeConverter(Document.class);
+    private static final TypeConverter primitiveBooleanTypeConverter = new PrimitiveTypeConverter(Boolean.class);
+    private static final TypeConverter primitiveCharTypeConverter = new PrimitiveTypeConverter(Character.class);
+    private static final TypeConverter primitiveByteTypeConverter = new PrimitiveTypeConverter(Byte.class);
+    private static final TypeConverter primitiveShortTypeConverter = new PrimitiveTypeConverter(Short.class);
+    private static final TypeConverter primitiveIntTypeConverter = new PrimitiveTypeConverter(Integer.class);
+    private static final TypeConverter primitiveLongTypeConverter = new PrimitiveTypeConverter(Long.class);
+    private static final TypeConverter primitiveFloatTypeConverter = new PrimitiveTypeConverter(Float.class);
+    private static final TypeConverter primitiveDoubleTypeConverter = new PrimitiveTypeConverter(Double.class);
+
+    private static final TypeConverter propertiesTypeConverter = new TypeConverter() {
+        public boolean isConvertable(Object pObject) {
+            return pObject == null  ||  pObject instanceof Map;
+        }
+
+        public Object convert(Object pObject) {
+            if (pObject == null) {
+                return null;
+            }
+            Properties props = new Properties();
+            props.putAll((Map) pObject);
+            return props;
+        }
+
+        public Object backConvert(Object pObject) {
+            return pObject;
+        }
+    };
+
+    private static final TypeConverter hashTableTypeConverter = new TypeConverter() {
+        public boolean isConvertable(Object pObject) {
+            return pObject == null  ||  pObject instanceof Map;
+        }
+
+        public Object convert(Object pObject) {
+            if (pObject == null) {
+                return null;
+            }
+            return new Hashtable((Map) pObject);
+        }
+
+        public Object backConvert(Object pObject) {
+            return pObject;
+        }
+    };
+
+    private static final TypeConverter listTypeConverter = new ListTypeConverter(List.class) {
+        protected List newList(int pSize) {
+            return new ArrayList(pSize);
+        }
+    };
+
+    private static final TypeConverter vectorTypeConverter = new ListTypeConverter(Vector.class) {
+        protected List newList(int pSize) {
+            return new Vector(pSize);
+        }
+    };
+
+    private static class CastCheckingTypeConverter implements TypeConverter {
+        private final Class clazz;
+        CastCheckingTypeConverter(Class pClass) {
+            clazz = pClass;
+        }
+        public boolean isConvertable(Object pObject) {
+            return pObject == null  ||  clazz.isAssignableFrom(pObject.getClass());
+        }
+        public Object convert(Object pObject) {
+            return pObject;
+        }
+        public Object backConvert(Object pObject) {
+            return pObject;
+        }
+    }
+
+    /** Returns a type converter for the given class.
+     */
+    public TypeConverter getTypeConverter(Class pClass) {
+        if (pClass.isAssignableFrom(boolean.class)) {
+            return primitiveBooleanTypeConverter;
+        }
+        if (pClass.isAssignableFrom(char.class)) {
+            return primitiveCharTypeConverter;
+        }
+        if (pClass.isAssignableFrom(byte.class)) {
+            return primitiveByteTypeConverter;
+        }
+        if (pClass.isAssignableFrom(short.class)) {
+            return primitiveShortTypeConverter;
+        }
+        if (pClass.isAssignableFrom(int.class)) {
+            return primitiveIntTypeConverter;
+        }
+        if (pClass.isAssignableFrom(long.class)) {
+            return primitiveLongTypeConverter;
+        }
+        if (pClass.isAssignableFrom(float.class)) {
+            return primitiveFloatTypeConverter;
+        }
+        if (pClass.isAssignableFrom(double.class)) {
+            return primitiveDoubleTypeConverter;
+        }
+        if (pClass.isAssignableFrom(String.class)) {
+            return stringTypeConverter;
+        }
+        if (pClass.isAssignableFrom(Boolean.class)) {
+            return booleanTypeConverter;
+        }
+        if (pClass.isAssignableFrom(Character.class)) {
+            return characterTypeConverter;
+        }
+        if (pClass.isAssignableFrom(Byte.class)) {
+            return byteTypeConverter;
+        }
+        if (pClass.isAssignableFrom(Short.class)) {
+            return shortTypeConverter;
+        }
+        if (pClass.isAssignableFrom(Integer.class)) {
+            return integerTypeConverter;
+        }
+        if (pClass.isAssignableFrom(Long.class)) {
+            return longTypeConverter;
+        }
+        if (pClass.isAssignableFrom(BigDecimal.class)) {
+            return bigDecimalTypeConverter;
+        }
+        if (pClass.isAssignableFrom(BigInteger.class)) {
+            return bigIntegerTypeConverter;
+        }
+        if (pClass.isAssignableFrom(Float.class)) {
+            return floatTypeConverter;
+        }
+        if (pClass.isAssignableFrom(Double.class)) {
+            return doubleTypeConverter;
+        }
+        if (pClass.isAssignableFrom(Date.class)) {
+            return dateTypeConverter;
+        }
+        if (pClass.isAssignableFrom(Calendar.class)) {
+            return calendarTypeConverter;
+        }
+        if (pClass.isAssignableFrom(Object[].class)) {
+            return objectArrayTypeConverter;
+        }
+        if (pClass.isAssignableFrom(List.class)) {
+            return listTypeConverter;
+        }
+        if (pClass.isAssignableFrom(Vector.class)) {
+            return vectorTypeConverter;
+        }
+        if (pClass.isAssignableFrom(Map.class)) {
+            return mapTypeConverter;
+        }
+        if (pClass.isAssignableFrom(Hashtable.class)) {
+            return hashTableTypeConverter;
+        }
+        if (pClass.isAssignableFrom(Properties.class)) {
+            return propertiesTypeConverter;
+        }
+        if (pClass.isAssignableFrom(byte[].class)) {
+            return byteArrayTypeConverter;
+        }
+        if (pClass.isAssignableFrom(Document.class)) {
+            return domTypeConverter;
+        }
+        if (Serializable.class.isAssignableFrom(pClass)) {
+            return new CastCheckingTypeConverter(pClass);
+        }
+        throw new IllegalStateException("Invalid parameter or result type: " + pClass.getName());
+    }
+}

Modified: webservices/xmlrpc/trunk/common/src/main/java/org/apache/xmlrpc/common/XmlRpcRequestProcessor.java
URL: http://svn.apache.org/viewvc/webservices/xmlrpc/trunk/common/src/main/java/org/apache/xmlrpc/common/XmlRpcRequestProcessor.java?rev=416856&r1=416855&r2=416856&view=diff
==============================================================================
--- webservices/xmlrpc/trunk/common/src/main/java/org/apache/xmlrpc/common/XmlRpcRequestProcessor.java (original)
+++ webservices/xmlrpc/trunk/common/src/main/java/org/apache/xmlrpc/common/XmlRpcRequestProcessor.java Fri Jun 23 19:59:44 2006
@@ -13,4 +13,8 @@
 	 * @throws XmlRpcException Processing the request failed.
 	 */
 	Object execute(XmlRpcRequest pRequest) throws XmlRpcException;
+
+	/** Returns the request processors {@link TypeConverterFactory}.
+	 */
+    TypeConverterFactory getTypeConverterFactory();
 }

Modified: webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/metadata/ReflectiveXmlRpcMetaDataHandler.java
URL: http://svn.apache.org/viewvc/webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/metadata/ReflectiveXmlRpcMetaDataHandler.java?rev=416856&r1=416855&r2=416856&view=diff
==============================================================================
--- webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/metadata/ReflectiveXmlRpcMetaDataHandler.java (original)
+++ webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/metadata/ReflectiveXmlRpcMetaDataHandler.java Fri Jun 23 19:59:44 2006
@@ -18,6 +18,7 @@
 import java.lang.reflect.Method;
 
 import org.apache.xmlrpc.XmlRpcException;
+import org.apache.xmlrpc.common.TypeConverterFactory;
 import org.apache.xmlrpc.server.AbstractReflectiveHandlerMapping;
 import org.apache.xmlrpc.server.ReflectiveXmlRpcHandler;
 
@@ -58,10 +59,11 @@
 	 * by {@link #getMethodHelp()}.
 	 */
 	public ReflectiveXmlRpcMetaDataHandler(AbstractReflectiveHandlerMapping pMapping,
+                TypeConverterFactory pTypeConverterFactory,
 			    Class pClass, boolean pInstanceIsStateless, Method[] pMethods,
 			    String[][] pSignatures, String pMethodHelp)
             throws XmlRpcException {
-		super(pMapping, pClass, pInstanceIsStateless, pMethods);
+		super(pMapping, pTypeConverterFactory, pClass, pInstanceIsStateless, pMethods);
 		signatures = pSignatures;
 		methodHelp = pMethodHelp;
 	}

Modified: webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/metadata/Util.java
URL: http://svn.apache.org/viewvc/webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/metadata/Util.java?rev=416856&r1=416855&r2=416856&view=diff
==============================================================================
--- webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/metadata/Util.java (original)
+++ webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/metadata/Util.java Fri Jun 23 19:59:44 2006
@@ -185,62 +185,6 @@
 		return sb.toString();
 	}
 
-	/** Returns, whether the given methods signature is matched by
-     * the given parameter set.
-	 */
-    public static boolean isMatching(Method method, Object[] args) {
-        Class[] parameterClasses = method.getParameterTypes();
-        if (parameterClasses.length != args.length) {
-            return false;
-        }
-        for (int i = 0;  i < args.length;  i++) {
-            if (!isMatching(parameterClasses[i], args[i])) {
-                return false;
-            }
-        }
-        return true;
-    }
-
-    /** Returns, whether the given parameter matches the given
-     * type.
-     */
-    public static boolean isMatching(Class pParameterType, Object pArg) {
-        if (pArg == null) {
-            return !pParameterType.isPrimitive();
-        }
-        final Class c;
-        if (pParameterType.isPrimitive()) {
-            c = getObjectClass(pParameterType);
-        } else {
-            c = pParameterType;
-        }
-        return c.isAssignableFrom(pArg.getClass());
-    }
-
-    /** Given a primitive class, returns the corresponding object class.
-     */
-    public static Class getObjectClass(Class pPrimitiveClass) {
-        if (byte.class.equals(pPrimitiveClass)) {
-            return Byte.class;
-        } else if (short.class.equals(pPrimitiveClass)) {
-            return Short.class;
-        } else if (int.class.equals(pPrimitiveClass)) {
-            return Integer.class;
-        } else if (long.class.equals(pPrimitiveClass)) {
-            return Long.class;
-        } else if (float.class.equals(pPrimitiveClass)) {
-            return Float.class;
-        } else if (double.class.equals(pPrimitiveClass)) {
-            return Double.class;
-        } else if (char.class.equals(pPrimitiveClass)) {
-            return Character.class;
-        } else if (boolean.class.equals(pPrimitiveClass)) {
-            return Boolean.class;
-        } else {
-            throw new IllegalStateException("Invalid primitive class: " + pPrimitiveClass.getName());
-        }
-    }
-
     /** Returns a signature for the given parameter set. This is used
      * in error messages.
      */

Modified: webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/server/AbstractReflectiveHandlerMapping.java
URL: http://svn.apache.org/viewvc/webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/server/AbstractReflectiveHandlerMapping.java?rev=416856&r1=416855&r2=416856&view=diff
==============================================================================
--- webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/server/AbstractReflectiveHandlerMapping.java (original)
+++ webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/server/AbstractReflectiveHandlerMapping.java Fri Jun 23 19:59:44 2006
@@ -26,6 +26,7 @@
 import org.apache.xmlrpc.XmlRpcException;
 import org.apache.xmlrpc.XmlRpcHandler;
 import org.apache.xmlrpc.XmlRpcRequest;
+import org.apache.xmlrpc.common.TypeConverterFactory;
 import org.apache.xmlrpc.metadata.ReflectiveXmlRpcMetaDataHandler;
 import org.apache.xmlrpc.metadata.Util;
 import org.apache.xmlrpc.metadata.XmlRpcListableHandlerMapping;
@@ -59,10 +60,11 @@
             throws XmlRpcException;
     }
 
+    private final TypeConverterFactory typeConverterFactory;
+    private final boolean instanceIsStateless;
     protected Map handlerMap = new HashMap();
     private AuthenticationHandler authenticationHandler;
     private InitializationHandler initializationHandler;
-    private final boolean instanceIsStateless;
 
     /** Creates a new instance.
      * @param pInstanceIsStateless The handler
@@ -81,7 +83,9 @@
      *     and the like.</li>
      * </ol>
      */
-    protected AbstractReflectiveHandlerMapping(boolean pInstanceIsStateless) {
+    protected AbstractReflectiveHandlerMapping(TypeConverterFactory pTypeConverterFactory,
+                boolean pInstanceIsStateless) {
+        typeConverterFactory = pTypeConverterFactory;
         instanceIsStateless = pInstanceIsStateless;
     }
     
@@ -178,10 +182,11 @@
     	String[][] sig = getSignature(pMethods);
     	String help = getMethodHelp(pClass, pMethods);
     	if (sig == null  ||  help == null) {
-    		return new ReflectiveXmlRpcHandler(this, pClass, instanceIsStateless, pMethods);
+    		return new ReflectiveXmlRpcHandler(this, typeConverterFactory,
+                    pClass, instanceIsStateless, pMethods);
     	}
-    	return new ReflectiveXmlRpcMetaDataHandler(this, pClass, instanceIsStateless,
-    			pMethods, sig, help);
+    	return new ReflectiveXmlRpcMetaDataHandler(this, typeConverterFactory,
+                pClass, instanceIsStateless, pMethods, sig, help);
     }
 
     /** Creates a signature for the given method.

Modified: webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/server/DynamicHandlerMapping.java
URL: http://svn.apache.org/viewvc/webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/server/DynamicHandlerMapping.java?rev=416856&r1=416855&r2=416856&view=diff
==============================================================================
--- webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/server/DynamicHandlerMapping.java (original)
+++ webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/server/DynamicHandlerMapping.java Fri Jun 23 19:59:44 2006
@@ -3,6 +3,7 @@
 import java.util.Iterator;
 
 import org.apache.xmlrpc.XmlRpcException;
+import org.apache.xmlrpc.common.TypeConverterFactory;
 
 
 /** A handler mapping, which requires explicit registration
@@ -26,8 +27,9 @@
      *     and the like.</li>
      * </ol>
      */
-    public DynamicHandlerMapping(boolean pInstanceIsStateless) {
-        super(pInstanceIsStateless);
+    public DynamicHandlerMapping(TypeConverterFactory pTypeConverterFactory,
+                boolean pInstanceIsStateless) {
+        super(pTypeConverterFactory, pInstanceIsStateless);
     }
 
 	/** Adds handlers for the given object to the mapping.

Modified: webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/server/PropertyHandlerMapping.java
URL: http://svn.apache.org/viewvc/webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/server/PropertyHandlerMapping.java?rev=416856&r1=416855&r2=416856&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 Jun 23 19:59:44 2006
@@ -23,6 +23,7 @@
 import java.util.Properties;
 
 import org.apache.xmlrpc.XmlRpcException;
+import org.apache.xmlrpc.common.TypeConverterFactory;
 
 
 /** A handler mapping based on a property file. The property file
@@ -64,9 +65,10 @@
      * @throws XmlRpcException Initializing the handlers failed.
      */
     public PropertyHandlerMapping(ClassLoader pClassLoader, URL pURL,
+                TypeConverterFactory pTypeConverterFactory,
                 boolean pInstanceIsStateless)
             throws IOException, XmlRpcException {
-        super(pInstanceIsStateless);
+        super(pTypeConverterFactory, pInstanceIsStateless);
         handlerMap = load(pClassLoader, pURL);
     }
 
@@ -94,9 +96,11 @@
      * @throws XmlRpcException Initializing the handlers failed.
      */
     public PropertyHandlerMapping(ClassLoader pClassLoader, String pResource,
+                TypeConverterFactory pTypeConverterFactory,
                 boolean pInstanceIsStateless)
             throws IOException, XmlRpcException {
-        this(pClassLoader, asURL(pClassLoader, pResource), pInstanceIsStateless);
+        this(pClassLoader, asURL(pClassLoader, pResource), pTypeConverterFactory,
+                pInstanceIsStateless);
     }
 
     private static URL asURL(ClassLoader pClassLoader, String pResource) throws IOException {

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=416856&r1=416855&r2=416856&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 Jun 23 19:59:44 2006
@@ -21,6 +21,8 @@
 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;
@@ -30,9 +32,21 @@
 /** Default implementation of {@link XmlRpcHandler}.
  */
 public class ReflectiveXmlRpcHandler implements XmlRpcHandler {
-	private final AbstractReflectiveHandlerMapping mapping;
+    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 Method[] methods;
+	private final MethodData[] methods;
     private final Object theInstance;
 
 	/** Creates a new instance.
@@ -60,11 +74,15 @@
 	 * executing the handler. 
 	 */
 	public ReflectiveXmlRpcHandler(AbstractReflectiveHandlerMapping pMapping,
+                TypeConverterFactory pTypeConverterFactory,
 				Class pClass, boolean pInstanceIsStateless, Method[] pMethods)
             throws XmlRpcException {
 		mapping = pMapping;
 		clazz = pClass;
-		methods = pMethods;
+		methods = new MethodData[pMethods.length];
+        for (int i = 0;  i < methods.length;  i++) {
+            methods[i] = new MethodData(pMethods[i], pTypeConverterFactory); 
+        }
         theInstance = pInstanceIsStateless ? newInstance() : null;
 	}
 
@@ -89,16 +107,26 @@
 	        args[j] = pRequest.getParameter(j);
 	    }
 	    Object instance = getInstance(pRequest);
-        if (methods.length == 1) {
-            return invoke(instance, methods[0], args);
-        } else {
-            for (int i = 0;  i < methods.length;  i++) {
-                if (Util.isMatching(methods[i], args)) {
-                    return invoke(instance, methods[i], args);
+	    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));
-        }
+	    }
+	    throw new XmlRpcException("No method matching arguments: " + Util.getSignature(args));
     }
 
     private Object invoke(Object pInstance, Method pMethod, Object[] pArgs) throws XmlRpcException {

Modified: webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/server/XmlRpcLocalStreamServer.java
URL: http://svn.apache.org/viewvc/webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/server/XmlRpcLocalStreamServer.java?rev=416856&r1=416855&r2=416856&view=diff
==============================================================================
--- webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/server/XmlRpcLocalStreamServer.java (original)
+++ webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/server/XmlRpcLocalStreamServer.java Fri Jun 23 19:59:44 2006
@@ -1,15 +1,9 @@
 package org.apache.xmlrpc.server;
 
-import java.io.IOException;
-import java.io.OutputStream;
-
 import org.apache.xmlrpc.XmlRpcException;
 import org.apache.xmlrpc.XmlRpcRequest;
-import org.apache.xmlrpc.common.LocalStreamConnection;
-import org.apache.xmlrpc.common.ServerStreamConnection;
 import org.apache.xmlrpc.common.XmlRpcRequestProcessor;
 import org.apache.xmlrpc.common.XmlRpcRequestProcessorFactory;
-import org.apache.xmlrpc.common.XmlRpcStreamRequestConfig;
 
 
 /** Server part of a local stream transport.

Modified: webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/server/XmlRpcServer.java
URL: http://svn.apache.org/viewvc/webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/server/XmlRpcServer.java?rev=416856&r1=416855&r2=416856&view=diff
==============================================================================
--- webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/server/XmlRpcServer.java (original)
+++ webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/server/XmlRpcServer.java Fri Jun 23 19:59:44 2006
@@ -18,6 +18,8 @@
 import org.apache.xmlrpc.XmlRpcConfig;
 import org.apache.xmlrpc.XmlRpcException;
 import org.apache.xmlrpc.XmlRpcRequest;
+import org.apache.xmlrpc.common.TypeConverterFactory;
+import org.apache.xmlrpc.common.TypeConverterFactoryImpl;
 import org.apache.xmlrpc.common.XmlRpcController;
 import org.apache.xmlrpc.common.XmlRpcRequestProcessor;
 import org.apache.xmlrpc.common.XmlRpcWorkerFactory;
@@ -32,11 +34,21 @@
 public class XmlRpcServer extends XmlRpcController
 		implements XmlRpcRequestProcessor {
 	private XmlRpcHandlerMapping handlerMapping;
+    private TypeConverterFactory typeConverterFactory = new TypeConverterFactoryImpl();
 	private XmlRpcServerConfig config = new XmlRpcServerConfigImpl();
 
 	protected XmlRpcWorkerFactory getDefaultXmlRpcWorkerFactory() {
 		return new XmlRpcServerWorkerFactory(this);
 	}
+
+    /** Sets the servers {@link TypeConverterFactory}.
+     */
+    public void setTypeConverterFactory(TypeConverterFactory pFactory) {
+        typeConverterFactory = pFactory;
+    }
+    public TypeConverterFactory getTypeConverterFactory() {
+        return typeConverterFactory;
+    }
 
 	/** Sets the servers configuration.
 	 * @param pConfig The new server configuration.

Modified: webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/webserver/XmlRpcServlet.java
URL: http://svn.apache.org/viewvc/webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/webserver/XmlRpcServlet.java?rev=416856&r1=416855&r2=416856&view=diff
==============================================================================
--- webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/webserver/XmlRpcServlet.java (original)
+++ webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/webserver/XmlRpcServlet.java Fri Jun 23 19:59:44 2006
@@ -29,6 +29,7 @@
 import org.apache.xmlrpc.server.PropertyHandlerMapping;
 import org.apache.xmlrpc.server.XmlRpcHandlerMapping;
 import org.apache.xmlrpc.server.XmlRpcServer;
+import org.apache.xmlrpc.server.XmlRpcServerConfig;
 import org.apache.xmlrpc.server.XmlRpcServerConfigImpl;
 
 
@@ -104,7 +105,9 @@
 	 * {@link #newXmlRpcHandlerMapping()}.
 	 */
 	protected PropertyHandlerMapping newPropertyHandlerMapping(URL url) throws IOException, XmlRpcException {
-		return new PropertyHandlerMapping(getClass().getClassLoader(), url, false);
+		return new PropertyHandlerMapping(getClass().getClassLoader(), url,
+                server.getTypeConverterFactory(),
+                false);
 	}
 
 	/** Creates a new instance of {@link org.apache.xmlrpc.webserver.RequestData}

Modified: webservices/xmlrpc/trunk/src/changes/changes.xml
URL: http://svn.apache.org/viewvc/webservices/xmlrpc/trunk/src/changes/changes.xml?rev=416856&r1=416855&r2=416856&view=diff
==============================================================================
--- webservices/xmlrpc/trunk/src/changes/changes.xml (original)
+++ webservices/xmlrpc/trunk/src/changes/changes.xml Fri Jun 23 19:59:44 2006
@@ -70,6 +70,10 @@
         It is now possible to create and initialize handler objects per
         request.
       </action>
+      <action dev="jochen" type="fix" issue="XMLRPC-89">
+        Added partial support for automatic conversion of object arrays
+        to lists, or vectors. Same for maps to hash tables, or properties.
+      </action>
     </release>
     <release version="3.0a1" date="17-Feb-2005">
       <action dev="jochen" type="add">

Modified: webservices/xmlrpc/trunk/tests/src/test/java/org/apache/xmlrpc/test/BaseTest.java
URL: http://svn.apache.org/viewvc/webservices/xmlrpc/trunk/tests/src/test/java/org/apache/xmlrpc/test/BaseTest.java?rev=416856&r1=416855&r2=416856&view=diff
==============================================================================
--- webservices/xmlrpc/trunk/tests/src/test/java/org/apache/xmlrpc/test/BaseTest.java (original)
+++ webservices/xmlrpc/trunk/tests/src/test/java/org/apache/xmlrpc/test/BaseTest.java Fri Jun 23 19:59:44 2006
@@ -31,8 +31,6 @@
 
 import org.apache.xmlrpc.XmlRpcException;
 import org.apache.xmlrpc.client.XmlRpcClient;
-import org.apache.xmlrpc.client.XmlRpcClientConfig;
-import org.apache.xmlrpc.client.XmlRpcClientConfigImpl;
 import org.apache.xmlrpc.common.XmlRpcExtensionException;
 import org.apache.xmlrpc.server.PropertyHandlerMapping;
 import org.apache.xmlrpc.server.XmlRpcHandlerMapping;
@@ -281,9 +279,10 @@
         }
     }
 
-	protected XmlRpcHandlerMapping getHandlerMapping() throws IOException, XmlRpcException {
+    protected XmlRpcHandlerMapping getHandlerMapping() throws IOException, XmlRpcException {
 		return new PropertyHandlerMapping(getClass().getClassLoader(),
 										  getClass().getResource("BaseTest.properties"),
+                                          getTypeConverterFactory(),
                                           true);
 	}
 

Modified: webservices/xmlrpc/trunk/tests/src/test/java/org/apache/xmlrpc/test/DynamicProxyTest.java
URL: http://svn.apache.org/viewvc/webservices/xmlrpc/trunk/tests/src/test/java/org/apache/xmlrpc/test/DynamicProxyTest.java?rev=416856&r1=416855&r2=416856&view=diff
==============================================================================
--- webservices/xmlrpc/trunk/tests/src/test/java/org/apache/xmlrpc/test/DynamicProxyTest.java (original)
+++ webservices/xmlrpc/trunk/tests/src/test/java/org/apache/xmlrpc/test/DynamicProxyTest.java Fri Jun 23 19:59:44 2006
@@ -48,6 +48,7 @@
     protected XmlRpcHandlerMapping getHandlerMapping() throws IOException, XmlRpcException {
         return new PropertyHandlerMapping(getClass().getClassLoader(),
                                           getClass().getResource("DynamicProxyTest.properties"),
+                                          getTypeConverterFactory(),
                                           true);
     }
 

Added: webservices/xmlrpc/trunk/tests/src/test/java/org/apache/xmlrpc/test/JiraTest.java
URL: http://svn.apache.org/viewvc/webservices/xmlrpc/trunk/tests/src/test/java/org/apache/xmlrpc/test/JiraTest.java?rev=416856&view=auto
==============================================================================
--- webservices/xmlrpc/trunk/tests/src/test/java/org/apache/xmlrpc/test/JiraTest.java (added)
+++ webservices/xmlrpc/trunk/tests/src/test/java/org/apache/xmlrpc/test/JiraTest.java Fri Jun 23 19:59:44 2006
@@ -0,0 +1,192 @@
+/*
+ * Copyright 1999,2005 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.test;
+
+import java.io.IOException;
+import java.util.Collections;
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Vector;
+
+import org.apache.xmlrpc.XmlRpcException;
+import org.apache.xmlrpc.client.XmlRpcClient;
+import org.apache.xmlrpc.client.util.ClientFactory;
+import org.apache.xmlrpc.server.PropertyHandlerMapping;
+import org.apache.xmlrpc.server.XmlRpcHandlerMapping;
+
+
+/**
+ * Test case for various jira issues.
+ */ 
+public class JiraTest extends XmlRpcTestCase {
+    /** Interface of the handler for {@link JiraTest#testXMLRPC89()}
+     */
+    public interface XMLRPC89Handler {
+        /**
+         * Returns the reversed vector.
+         */
+        Vector reverse(Vector pVector);
+        /**
+         * Returns the same hashtable, but doubles the
+         * values.
+         */
+        Hashtable doubledValues(Hashtable pMap);
+        /**
+         * Returns the same properties, but doubles the
+         * values.
+         */
+        Properties doubledPropertyValues(Properties pMap);
+    }
+    /**
+     * Handler for {@link JiraTest#testXMLRPC89()}
+     */ 
+    public static class XMLRPC89HandlerImpl implements XMLRPC89Handler {
+        public Vector reverse(Vector pVector) {
+            Vector result = new Vector(pVector.size());
+            result.addAll(pVector);
+            Collections.reverse(result);
+            return result;
+        }
+        public Hashtable doubledValues(Hashtable pMap) {
+            final Hashtable result;
+            if (pMap instanceof Properties) {
+                result = new Properties();
+            } else {
+                result = new Hashtable();
+            }
+            result.putAll(pMap);
+            for (Iterator iter = result.entrySet().iterator();  iter.hasNext();  ) {
+                Map.Entry entry = (Map.Entry) iter.next();
+                Object value = entry.getValue();
+                final Integer i;
+                if (pMap instanceof Properties) {
+                    i = Integer.valueOf((String) value);
+                } else {
+                    i = (Integer) value;
+                }
+                Integer iDoubled = new Integer(i.intValue()*2);
+                if (pMap instanceof Properties) {
+                    entry.setValue(iDoubled.toString());
+                } else {
+                    entry.setValue(iDoubled);
+                }
+            }
+            return result;
+        }
+        public Properties doubledPropertyValues(Properties pProperties) {
+            return (Properties) doubledValues(pProperties);
+        }
+    }
+
+    protected XmlRpcHandlerMapping getHandlerMapping() throws IOException,
+            XmlRpcException {
+        return new PropertyHandlerMapping(getClass().getClassLoader(),
+                getClass().getResource("JiraTest.properties"),
+                getTypeConverterFactory(),
+                true);
+    }
+
+    /**
+     * Test case for <a href="http://issues.apache.org/jira/browse/XMLRPC-89">
+     * XMLRPC-89</a>
+     */
+    public void testXMLRPC89() throws Exception {
+        for (int i = 0;  i < providers.length;  i++) {
+            testXMLRPC89Vector(providers[i]);
+            testXMLRPC89Hashtable(providers[i]);
+            testXMLRPC89Properties(providers[i]);
+        }
+    }
+
+    private void testXMLRPC89Vector(ClientProvider pProvider) throws Exception {
+        Vector values = new Vector();
+        for (int i = 0;  i < 3;  i++) {
+            values.add(new Integer(i));
+        }
+        Vector params = new Vector();
+        params.add(values);
+        XmlRpcClient client = pProvider.getClient();
+        client.setConfig(getConfig(pProvider));
+        Object res = client.execute(XMLRPC89Handler.class.getName() + ".reverse", params);
+        Object[] result = (Object[]) res;
+        assertNotNull(result);
+        assertEquals(3, result.length);
+        for (int i = 0;  i < 3;  i++) {
+            assertEquals(new Integer(2-i), result[i]);
+        }
+
+        ClientFactory factory = new ClientFactory(client);
+        XMLRPC89Handler handler = (XMLRPC89Handler) factory.newInstance(XMLRPC89Handler.class);
+        Vector resultVector = handler.reverse(values);
+        assertNotNull(resultVector);
+        assertEquals(3, resultVector.size());
+        for (int i = 0;  i < 3;  i++) {
+            assertEquals(new Integer(2-i), resultVector.get(i));
+        }
+    }
+
+    private void verifyXMLRPC89Hashtable(Map pMap) {
+        assertNotNull(pMap);
+        assertEquals(3, pMap.size());
+        for (int i = 0;  i < 3;  i++) {
+            Integer j = (Integer) pMap.get(String.valueOf(i));
+            assertEquals(i*2, j.intValue());
+        }
+    }
+
+    private void testXMLRPC89Hashtable(ClientProvider pProvider) throws Exception {
+        Hashtable values = new Hashtable();
+        for (int i = 0;  i < 3;  i++) {
+            values.put(String.valueOf(i), new Integer(i));
+        }
+        XmlRpcClient client = pProvider.getClient();
+        client.setConfig(getConfig(pProvider));
+        Object res = client.execute(XMLRPC89Handler.class.getName() + ".doubledValues", new Object[]{values});
+        verifyXMLRPC89Hashtable((Map) res);
+
+        ClientFactory factory = new ClientFactory(client);
+        XMLRPC89Handler handler = (XMLRPC89Handler) factory.newInstance(XMLRPC89Handler.class);
+        Hashtable result = handler.doubledValues(values);
+        verifyXMLRPC89Hashtable(result);
+    }
+
+    private void verifyXMLRPC89Properties(Map pMap) {
+        assertNotNull(pMap);
+        assertEquals(3, pMap.size());
+        for (int i = 0;  i < 3;  i++) {
+            String j = (String) pMap.get(String.valueOf(i));
+            assertEquals(i*2, Integer.parseInt(j));
+        }
+    }
+
+    private void testXMLRPC89Properties(ClientProvider pProvider) throws Exception {
+        Properties values = new Properties();
+        for (int i = 0;  i < 3;  i++) {
+            values.put(String.valueOf(i), String.valueOf(i));
+        }
+        XmlRpcClient client = pProvider.getClient();
+        client.setConfig(getConfig(pProvider));
+        Object res = client.execute(XMLRPC89Handler.class.getName() + ".doubledPropertyValues", new Object[]{values});
+        verifyXMLRPC89Properties((Map) res);
+
+        ClientFactory factory = new ClientFactory(client);
+        XMLRPC89Handler handler = (XMLRPC89Handler) factory.newInstance(XMLRPC89Handler.class);
+        Properties result = handler.doubledPropertyValues(values);
+        verifyXMLRPC89Properties(result);
+    }
+}

Modified: webservices/xmlrpc/trunk/tests/src/test/java/org/apache/xmlrpc/test/XmlRpcTestCase.java
URL: http://svn.apache.org/viewvc/webservices/xmlrpc/trunk/tests/src/test/java/org/apache/xmlrpc/test/XmlRpcTestCase.java?rev=416856&r1=416855&r2=416856&view=diff
==============================================================================
--- webservices/xmlrpc/trunk/tests/src/test/java/org/apache/xmlrpc/test/XmlRpcTestCase.java (original)
+++ webservices/xmlrpc/trunk/tests/src/test/java/org/apache/xmlrpc/test/XmlRpcTestCase.java Fri Jun 23 19:59:44 2006
@@ -20,6 +20,8 @@
 import org.apache.xmlrpc.XmlRpcException;
 import org.apache.xmlrpc.client.XmlRpcClientConfig;
 import org.apache.xmlrpc.client.XmlRpcClientConfigImpl;
+import org.apache.xmlrpc.common.TypeConverterFactory;
+import org.apache.xmlrpc.common.TypeConverterFactoryImpl;
 import org.apache.xmlrpc.server.XmlRpcHandlerMapping;
 
 import junit.framework.TestCase;
@@ -57,5 +59,9 @@
                 new ServletWebServerProvider(mapping, false)
             };
         }
+    }
+
+    protected TypeConverterFactory getTypeConverterFactory() {
+        return new TypeConverterFactoryImpl();
     }
 }

Added: webservices/xmlrpc/trunk/tests/src/test/resources/org/apache/xmlrpc/test/JiraTest.properties
URL: http://svn.apache.org/viewvc/webservices/xmlrpc/trunk/tests/src/test/resources/org/apache/xmlrpc/test/JiraTest.properties?rev=416856&view=auto
==============================================================================
--- webservices/xmlrpc/trunk/tests/src/test/resources/org/apache/xmlrpc/test/JiraTest.properties (added)
+++ webservices/xmlrpc/trunk/tests/src/test/resources/org/apache/xmlrpc/test/JiraTest.properties Fri Jun 23 19:59:44 2006
@@ -0,0 +1 @@
+org.apache.xmlrpc.test.JiraTest$XMLRPC89Handler=org.apache.xmlrpc.test.JiraTest$XMLRPC89HandlerImpl



---------------------------------------------------------------------
To unsubscribe, e-mail: xmlrpc-dev-unsubscribe@ws.apache.org
For additional commands, e-mail: xmlrpc-dev-help@ws.apache.org