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 <ignored>.<name> call by calling the handler for * <name> 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);