Hi,

AFAIK, you are right, option A is the way how it works (see:
http://ws.apache.org/xmlrpc/faq.html#arrays)
My only advice, make small tooling, eg.

   public static List decodeList(Object element) {
      if (element == null) {
         return null;
      }
      if (element instanceof List) {
         return (List) element;
      }
      if (element.getClass().isArray()) {
         int length = Array.getLength(element);
         LinkedList result = new LinkedList();
         for (int i = 0; i < length; i++) {
            result.add (Array.get(element, i));
         }
         return result;
      }
      return null;
   }

With such method you can have option B.

Best regards
Stano

On Wed, Jul 8, 2009 at 23:37, Ken Tanaka <ken.tan...@noaa.gov> wrote:

> I'm using an xmlrpc-client 3.1.2 application to talk to an xmlrpc-server
> 3.1.2 server and want to pass an array of strings. I figure people on this
> list must have done this before.
>
> This code below is working, but could probably be written better. Does
> anyone have suggestions on cleaning up the 5 lines following the comment
> "OPTION A?. The two lines (commented out) following the comment "OPTION B"
> are what I would have expected to work, but throw 'Exception in thread
> "main" java.lang.ClassCastException: [Ljava.lang.Object;'
>
> Thanks in advance for any suggestions.
>
> -Ken
>
> - Begin client code listing ----------------------------
>
> package gov.noaa.eds.adicXmlRpcClient;
>
> import java.net.MalformedURLException;
> import java.net.URL;
> import java.util.ArrayList;
> import org.apache.xmlrpc.XmlRpcException;
> import org.apache.xmlrpc.client.XmlRpcClient;
> import org.apache.xmlrpc.client.XmlRpcClientConfigImpl;
>
> /**
> * This client will use the adicXmlRpcServer.
> */
> public class App {
>
>   public static void main(String[] args) {
>       System.out.println("Starting adicXmlRpcServer test");
>
>       XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl();
>       try {
>           config.setServerURL(new URL("
> http://127.0.0.1:8084/adicXmlRpcServer/xmlrpc";));
>       } catch (MalformedURLException ex) {
>           ex.printStackTrace();
>       }
>       XmlRpcClient client = new XmlRpcClient();
>       client.setConfig(config);
>       Object[] params = new Object[] {new String("testDir")};
>
>       try {
>           /* OPTION A (next 5 lines):
>            * This works, but looks ugly. Is there a better way to receive
>            * an ArrayList of strings from the xml-rpc server?
>            */
>           Object[] result = (Object[]) client.execute("DirList.ls",
> params);
>           ArrayList<String> dirListing = new ArrayList<String>();
>           for (Object o : result) {
>               dirListing.add(o.toString());
>           }
>
>           /* OPTION B (next 2 lines):
>            * This doesn't work, but is the way I would like the code to
>            * work. Java runtime doesn't like the cast.
>            */
> //            ArrayList<String> dirListing =
> //                    (ArrayList<String>) client.execute("DirList.ls",
> params);
>
>           System.out.println("Listing Length=" + dirListing.size());
>           System.out.println("  First 10:");
>           for (int i = 0; i < 10; i++) {
>               System.out.println("    " + dirListing.get(i));
>           }
>       } catch (XmlRpcException ex) {
>           ex.printStackTrace();
>       }
>   }
> }
>
> - End client code listing ----------------------------
>
> In case it helps to know the server code, I'm sending an ArrayList<String>
> at the other end:
>
> - Begin server code listing ----------------------------
>
> /*
> * FILE: DirList.java
> */
> package gov.noaa.eds.adicXmlRpc;
>
> import java.util.ArrayList;
> import java.util.Random;
>
> /**
> * Provide directory listing functionality.
> */
> public class DirList {
>
>   /**
>    * Return a directory listing.
>    * Currently generates made up names.
>    * @param dirName directory name for which to get a listing.
>    * @return a list of filenames for dirName
>    */
>   public ArrayList<String> ls(String dirName) {
>       Random rng = new Random();
>       int listLength = 2000;
>       ArrayList<String> listing = new ArrayList<String>(listLength);
>       for (int i = 0; i < listLength; i++) {
>           int filenameLen = 1 + rng.nextInt(40);
>           StringBuffer filename = new StringBuffer("sample_");
>           for (int f = 0; f < filenameLen; f++) {
>
> filename.append("abcdefghijklmnopqrstuvwxyz".charAt(rng.nextInt(26)));
>           }
>           listing.add(filename.toString());
>       }
>       return listing;
>   }
> }
>
> - End server code listing ----------------------------
>
> If anyone wants I can also post the XmlRpcServlet.properties, web.xml or
> maven pom.xml files, but those probably aren't needed.
>

Reply via email to