On Sat, 2004-05-01 at 03:18, Daniel Rall wrote:
> Sebastian Dransfeld wrote:
> > Is there any plan of making xml-rpc support List and Map, not only
> > Vector and Hashtable?
> 
> This is a reasonable enhancement to the 2.x stream.  If you want to see this 
> happen, you're likely to have to submit patches and associated change log yourself.

I did send a patch a while ago. This patch changes everything over to
List and Map, and it removes the Exceptions thrown by Base64, since
these aren't in jakarta-commons-codec-1.2 anymore. After applying this
patch 'ant test' will complete without failures.

The secure version of xml-rpc will fail because I haven't updated it. An
overhaul seems very needed, because deprecated messages flourish when
compiling it.

Sebastian
diff -ur ws-xmlrpc.old/src/java/org/apache/xmlrpc/applet/SimpleXmlRpcClient.java ws-xmlrpc/src/java/org/apache/xmlrpc/applet/SimpleXmlRpcClient.java
--- ws-xmlrpc.old/src/java/org/apache/xmlrpc/applet/SimpleXmlRpcClient.java	2003-05-01 18:53:16.000000000 +0200
+++ ws-xmlrpc/src/java/org/apache/xmlrpc/applet/SimpleXmlRpcClient.java	2004-03-20 17:27:37.686561890 +0100
@@ -249,12 +249,7 @@
         else if (what instanceof byte[])
         {
             writer.startElement("base64");
-            try {
-                writer.write(base64.encode((byte[]) what));
-            }
-            catch (EncoderException e) {
-                throw new RuntimeException("Incompatible version of org.apache.commons.codec.binary.Base64 used, and an error occurred.");
-            }
+            writer.write(base64.encode((byte[]) what));
             writer.endElement("base64");
         }
         else if (what instanceof Vector)
@@ -649,16 +644,7 @@
                     }
                     break;
                 case BASE64:
-                    try {
-                        value = base64.decode(cdata.getBytes());
-                    }
-                    catch (DecoderException e) {
-                        /* FIXME: what should we do here?  Probably an Exception?
-                         * tabling because this class is slated for complete overhaul
-                         * using the core library.
-                         */ 
-                        value = cdata;
-                    }
+                    value = base64.decode(cdata.getBytes());
                     break;
                 case STRING:
                     value = cdata;
diff -ur ws-xmlrpc.old/src/java/org/apache/xmlrpc/AuthDemo.java ws-xmlrpc/src/java/org/apache/xmlrpc/AuthDemo.java
--- ws-xmlrpc.old/src/java/org/apache/xmlrpc/AuthDemo.java	2002-03-20 16:11:03.000000000 +0100
+++ ws-xmlrpc/src/java/org/apache/xmlrpc/AuthDemo.java	2004-03-20 17:40:29.626841282 +0100
@@ -55,7 +55,7 @@
  * <http://www.apache.org/>.
  */
 
-import java.util.Vector;
+import java.util.List;
 
 /**
  *
@@ -67,7 +67,7 @@
     /**
      *
      */
-    public Object execute(String method, Vector v, String user, String password)
+    public Object execute(String method, List v, String user, String password)
             throws Exception
     {
         // our simplistic authentication guidelines never fail ;)
diff -ur ws-xmlrpc.old/src/java/org/apache/xmlrpc/AuthenticatedXmlRpcHandler.java ws-xmlrpc/src/java/org/apache/xmlrpc/AuthenticatedXmlRpcHandler.java
--- ws-xmlrpc.old/src/java/org/apache/xmlrpc/AuthenticatedXmlRpcHandler.java	2002-09-27 19:17:01.000000000 +0200
+++ ws-xmlrpc/src/java/org/apache/xmlrpc/AuthenticatedXmlRpcHandler.java	2004-03-20 17:42:14.777310752 +0100
@@ -55,7 +55,7 @@
  * <http://www.apache.org/>.
  */
 
-import java.util.Vector;
+import java.util.List;
 
 /**
  * An XML-RPC handler that also handles HTTP authentication.
@@ -78,7 +78,7 @@
      * exception of this type must be thrown.
      * @see org.apache.xmlrpc.AuthenticationFailed
      */
-    public Object execute(String method, Vector params, String user,
+    public Object execute(String method, List params, String user,
                           String password)
         throws Exception;
 }
diff -ur ws-xmlrpc.old/src/java/org/apache/xmlrpc/ContextXmlRpcHandler.java ws-xmlrpc/src/java/org/apache/xmlrpc/ContextXmlRpcHandler.java
--- ws-xmlrpc.old/src/java/org/apache/xmlrpc/ContextXmlRpcHandler.java	2002-10-21 15:08:50.000000000 +0200
+++ ws-xmlrpc/src/java/org/apache/xmlrpc/ContextXmlRpcHandler.java	2004-03-20 17:38:47.627756507 +0100
@@ -55,7 +55,7 @@
  * <http://www.apache.org/>.
  */
 
-import java.util.Vector;
+import java.util.List;
 
 /**
  * An XML-RPC handler that also handles user authentication.
@@ -74,6 +74,6 @@
      * exception of this type must be thrown.
      * @see org.apache.xmlrpc.AuthenticationFailed
      */
-    public Object execute(String method, Vector params, XmlRpcContext context)
+    public Object execute(String method, List params, XmlRpcContext context)
             throws Exception;
 }
diff -ur ws-xmlrpc.old/src/java/org/apache/xmlrpc/DefaultTypeFactory.java ws-xmlrpc/src/java/org/apache/xmlrpc/DefaultTypeFactory.java
--- ws-xmlrpc.old/src/java/org/apache/xmlrpc/DefaultTypeFactory.java	2003-05-01 18:53:15.000000000 +0200
+++ ws-xmlrpc/src/java/org/apache/xmlrpc/DefaultTypeFactory.java	2004-03-20 17:28:11.951871621 +0100
@@ -127,13 +127,7 @@
 
     public Object createBase64(String cdata)
     {
-        try {
-            return base64Codec.decode(cdata.getBytes());
-        }
-        catch (DecoderException e) {
-            //TODO: consider throwing an exception here?
-            return new byte[0];
-        }
+        return base64Codec.decode(cdata.getBytes());
     }
 
     public Object createString(String cdata)
diff -ur ws-xmlrpc.old/src/java/org/apache/xmlrpc/Echo.java ws-xmlrpc/src/java/org/apache/xmlrpc/Echo.java
--- ws-xmlrpc.old/src/java/org/apache/xmlrpc/Echo.java	2002-03-20 16:11:03.000000000 +0100
+++ ws-xmlrpc/src/java/org/apache/xmlrpc/Echo.java	2004-03-20 17:34:57.812627693 +0100
@@ -55,7 +55,7 @@
  * <http://www.apache.org/>.
  */
 
-import java.util.Vector;
+import java.util.List;
 
 /**
  * A simple handler which echos its input parameters.
@@ -72,7 +72,7 @@
      * @param parameters Handler input parameters.
      * @return The input parameters.
      */
-    public Object execute(String method, Vector parameters)
+    public Object execute(String method, List parameters)
             throws Exception
     {
         return parameters;
diff -ur ws-xmlrpc.old/src/java/org/apache/xmlrpc/Invoker.java ws-xmlrpc/src/java/org/apache/xmlrpc/Invoker.java
--- ws-xmlrpc.old/src/java/org/apache/xmlrpc/Invoker.java	2002-08-27 21:20:41.000000000 +0200
+++ ws-xmlrpc/src/java/org/apache/xmlrpc/Invoker.java	2004-03-20 17:34:20.533906328 +0100
@@ -57,7 +57,7 @@
 
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
-import java.util.Vector;
+import java.util.List;
 
 /**
  * Introspects handlers using Java Reflection to call methods matching
@@ -86,7 +86,7 @@
     /**
      * main method, sucht methode in object, wenn gefunden dann aufrufen.
      */
-    public Object execute(String methodName, Vector params) throws Exception
+    public Object execute(String methodName, List params) throws Exception
     {
         // Array mit Classtype bilden, ObjectAry mit Values bilden
         Class[] argClasses = null;
@@ -97,7 +97,7 @@
             argValues = new Object[params.size()];
             for (int i = 0; i < params.size(); i++)
             {
-                argValues[i] = params.elementAt(i);
+                argValues[i] = params.get(i);
                 if (argValues[i] instanceof Integer)
                 {
                     argClasses[i] = Integer.TYPE;
diff -ur ws-xmlrpc.old/src/java/org/apache/xmlrpc/MultiCall.java ws-xmlrpc/src/java/org/apache/xmlrpc/MultiCall.java
--- ws-xmlrpc.old/src/java/org/apache/xmlrpc/MultiCall.java	2003-05-21 18:06:03.000000000 +0200
+++ ws-xmlrpc/src/java/org/apache/xmlrpc/MultiCall.java	2004-03-20 17:48:03.562210831 +0100
@@ -55,7 +55,9 @@
  * <http://www.apache.org/>.
  */
 
+import java.util.Map;
 import java.util.Hashtable;
+import java.util.List;
 import java.util.Vector;
 
 /**
@@ -71,7 +73,7 @@
 public class MultiCall
 implements ContextXmlRpcHandler
 {
-    public Object execute(String method, Vector params, XmlRpcContext context)
+    public Object execute(String method, List params, XmlRpcContext context)
             throws Exception
     {
         if ("multicall".equals(method))
@@ -82,17 +84,17 @@
         throw new NoSuchMethodException("No method '" + method + "' in " + this.getClass().getName());
     }
 
-    public Vector multicall(Vector requests, XmlRpcContext context)
+    public Vector multicall(List requests, XmlRpcContext context)
     {
         // The array of calls is passed as a single parameter of type array.
-        requests=(Vector)requests.elementAt(0);
+        requests=(List)requests.get(0);
         Vector response = new Vector();
         XmlRpcServerRequest request;
         for (int i = 0; i < requests.size(); i++)
         {
             try
             {
-                Hashtable call = (Hashtable) requests.elementAt(i);
+                Map call = (Map) requests.get(i);
                 request = new XmlRpcRequest((String) call.get("methodName"),
                                             (Vector) call.get("params"));
                 Object handler = context.getHandlerMapping().getHandler(request.getMethodName());
diff -ur ws-xmlrpc.old/src/java/org/apache/xmlrpc/SystemHandler.java ws-xmlrpc/src/java/org/apache/xmlrpc/SystemHandler.java
--- ws-xmlrpc.old/src/java/org/apache/xmlrpc/SystemHandler.java	2002-10-21 15:08:50.000000000 +0200
+++ ws-xmlrpc/src/java/org/apache/xmlrpc/SystemHandler.java	2004-03-20 17:41:55.234126541 +0100
@@ -55,7 +55,7 @@
  * <http://www.apache.org/>.
  */
 
-import java.util.Vector;
+import java.util.List;
 
 /**
  * Wraps calls to the XML-RPC standard system.* methods (such as
@@ -146,7 +146,7 @@
      * Execute a &lt;ignored&gt;.&lt;name&gt; call by calling the handler for
      * &lt;name&gt; in the the system handler mapping.
      */
-    public Object execute(String method, Vector params, XmlRpcContext context)
+    public Object execute(String method, List params, XmlRpcContext context)
             throws Exception
     {
         Object handler = null;
diff -ur ws-xmlrpc.old/src/java/org/apache/xmlrpc/util/HttpUtil.java ws-xmlrpc/src/java/org/apache/xmlrpc/util/HttpUtil.java
--- ws-xmlrpc.old/src/java/org/apache/xmlrpc/util/HttpUtil.java	2003-05-01 18:53:16.000000000 +0200
+++ ws-xmlrpc/src/java/org/apache/xmlrpc/util/HttpUtil.java	2004-03-20 17:25:06.127153721 +0100
@@ -85,15 +85,8 @@
         }
         else
         {
-            try {
-                auth = new String(base64.encode((user + ':' + password)
-                        .getBytes())).trim();
-            }
-            catch (EncoderException e) {
-                // EncoderException is never thrown in the body of Base64.encode(byte[]) in version 1.1
-                // TODO: possibly throw an exception from this method or refactor this class
-                throw new RuntimeException("Incompatible version of org.apache.commons.codec.binary.Base64 used, and an error condition was encountered.");
-            }
+            auth = new String(base64.encode((user + ':' + password)
+                    .getBytes())).trim();
         }
         return auth;
     }
diff -ur ws-xmlrpc.old/src/java/org/apache/xmlrpc/XmlRpcClient.java ws-xmlrpc/src/java/org/apache/xmlrpc/XmlRpcClient.java
--- ws-xmlrpc.old/src/java/org/apache/xmlrpc/XmlRpcClient.java	2003-01-29 01:57:14.000000000 +0100
+++ ws-xmlrpc/src/java/org/apache/xmlrpc/XmlRpcClient.java	2004-03-20 17:32:39.363659723 +0100
@@ -63,8 +63,8 @@
 import java.net.URL;
 import java.net.URLConnection;
 import java.util.EmptyStackException;
-import java.util.Hashtable;
 import java.util.Stack;
+import java.util.List;
 import java.util.Vector;
 import org.xml.sax.AttributeList;
 import org.xml.sax.SAXException;
@@ -178,7 +178,7 @@
      * @exception IOException: If the call could not be made because of lower
      *          level problems.
      */
-    public Object execute(String method, Vector params)
+    public Object execute(String method, List params)
             throws XmlRpcException, IOException
     {
         /* Setting user and password on transport if setBasicAuthentication was 
@@ -223,7 +223,7 @@
      * If the callback parameter is not null, it will be called later to handle
      * the result or error when the call is finished.
      */
-    public void executeAsync(String method, Vector params,
+    public void executeAsync(String method, List params,
             AsyncCallback callback)
     {
         XmlRpcRequest request = new XmlRpcRequest(method, params);
diff -ur ws-xmlrpc.old/src/java/org/apache/xmlrpc/XmlRpcHandler.java ws-xmlrpc/src/java/org/apache/xmlrpc/XmlRpcHandler.java
--- ws-xmlrpc.old/src/java/org/apache/xmlrpc/XmlRpcHandler.java	2002-03-20 16:11:03.000000000 +0100
+++ ws-xmlrpc/src/java/org/apache/xmlrpc/XmlRpcHandler.java	2004-03-20 17:32:09.802431524 +0100
@@ -55,7 +55,7 @@
  * <http://www.apache.org/>.
  */
 
-import java.util.Vector;
+import java.util.List;
 
 /**
  * The XML-RPC server uses this interface to call a method of an RPC handler.
@@ -72,6 +72,6 @@
     /**
      * Return the result, or throw an Exception if something went wrong.
      */
-    public Object execute (String method, Vector params)
+    public Object execute (String method, List params)
             throws Exception;
 }
diff -ur ws-xmlrpc.old/src/java/org/apache/xmlrpc/XmlRpcRequest.java ws-xmlrpc/src/java/org/apache/xmlrpc/XmlRpcRequest.java
--- ws-xmlrpc.old/src/java/org/apache/xmlrpc/XmlRpcRequest.java	2002-12-05 09:49:24.000000000 +0100
+++ ws-xmlrpc/src/java/org/apache/xmlrpc/XmlRpcRequest.java	2004-03-20 17:36:10.825372024 +0100
@@ -55,7 +55,7 @@
  * <http://www.apache.org/>.
  */
 
-import java.util.Vector;
+import java.util.List;
 
 /**
  * Default implementation of an XML-RPC request for both client and server.
@@ -68,9 +68,9 @@
 implements XmlRpcServerRequest, XmlRpcClientRequest
 {
     protected final String methodName;
-    protected final Vector parameters;
+    protected final List parameters;
 
-    public XmlRpcRequest(String methodName, Vector parameters)
+    public XmlRpcRequest(String methodName, List parameters)
     {
         this.parameters = parameters;
         this.methodName = methodName;
@@ -81,14 +81,14 @@
         return parameters.size();
     }
     
-    public Vector getParameters()
+    public List getParameters()
     {
         return parameters;
     }
 
     public Object getParameter(int index)
     {
-        return parameters.elementAt(index);
+        return parameters.get(index);
     }
 
     public String getMethodName()
diff -ur ws-xmlrpc.old/src/java/org/apache/xmlrpc/XmlRpcServerRequest.java ws-xmlrpc/src/java/org/apache/xmlrpc/XmlRpcServerRequest.java
--- ws-xmlrpc.old/src/java/org/apache/xmlrpc/XmlRpcServerRequest.java	2002-12-05 09:49:24.000000000 +0100
+++ ws-xmlrpc/src/java/org/apache/xmlrpc/XmlRpcServerRequest.java	2004-03-20 17:36:34.029841373 +0100
@@ -55,7 +55,7 @@
  * <http://www.apache.org/>.
  */
 
-import java.util.Vector;
+import java.util.List;
 
 /**
  * Interface to an XML-RPC request made to the server.
@@ -66,7 +66,7 @@
  */
 public interface XmlRpcServerRequest
 {
-    public Vector getParameters();
+    public List getParameters();
     public Object getParameter(int index);
     public String getMethodName();
 }
diff -ur ws-xmlrpc.old/src/java/org/apache/xmlrpc/XmlWriter.java ws-xmlrpc/src/java/org/apache/xmlrpc/XmlWriter.java
--- ws-xmlrpc.old/src/java/org/apache/xmlrpc/XmlWriter.java	2004-03-20 17:12:28.112155431 +0100
+++ ws-xmlrpc/src/java/org/apache/xmlrpc/XmlWriter.java	2004-03-20 17:26:11.122463448 +0100
@@ -60,10 +60,10 @@
 import java.io.OutputStreamWriter;
 import java.io.UnsupportedEncodingException;
 import java.util.Date;
-import java.util.Enumeration;
-import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.List;
 import java.util.Properties;
-import java.util.Vector;
 
 import org.apache.xmlrpc.util.DateTool;
 import org.apache.commons.codec.binary.Base64;
@@ -211,12 +211,7 @@
         else if (obj instanceof byte[])
         {
             startElement("base64");
-            try {
-                this.write(base64Codec.encode((byte[]) obj));
-            }
-            catch (EncoderException e) {
-                throw new XmlRpcClientException("Unable to Base 64 encode byte array", e);
-            }
+            this.write(base64Codec.encode((byte[]) obj));
             endElement("base64");
         }
         else if (obj instanceof Object[])
@@ -231,27 +226,27 @@
             endElement("data");
             endElement("array");
         }
-        else if (obj instanceof Vector)
+        else if (obj instanceof List)
         {
             startElement("array");
             startElement("data");
-            Vector array = (Vector) obj;
-            int size = array.size();
-            for (int i = 0; i < size; i++)
+            List array = (List) obj;
+            for (Iterator it = array.iterator(); it.hasNext(); )
             {
-                writeObject(array.elementAt(i));
+                writeObject(it.next());
             }
             endElement("data");
             endElement("array");
         }
-        else if (obj instanceof Hashtable)
+        else if (obj instanceof Map)
         {
             startElement("struct");
-            Hashtable struct = (Hashtable) obj;
-            for (Enumeration e = struct.keys(); e.hasMoreElements(); )
+            Map struct = (Map) obj;
+            for (Iterator it = struct.entrySet().iterator(); it.hasNext(); )
             {
-                String key = (String) e.nextElement();
-                Object value = struct.get(key);
+                Map.Entry me = (Map.Entry) it.next();
+                String key = (String) me.getKey();
+                Object value = me.getValue();
                 startElement("member");
                 startElement("name");
                 chardata(key);

Reply via email to