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