Re: Passing an array of strings

2009-07-08 Thread Ken Tanaka

Stano,
Thanks for the quick response. I did a lot of web searches but somehow 
missed the FAQ right there on the Apache web site.


I'll try out the decodeList since that will be cleaner. Your suggestion 
would also be a nice addition to the FAQ.


-Ken

Stanislav Miklik wrote:

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  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.


...



Re: Passing an array of strings

2009-07-08 Thread Stanislav Miklik
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  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 dirListing = new ArrayList();
>   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 dirListing =
> //(ArrayList) 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
> 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 ls(String dirName) {
>   Random rng = new Random();
>   int listLength = 2000;
>   ArrayList listing = new ArrayList(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.
>


Passing an array of strings

2009-07-08 Thread Ken Tanaka
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 dirListing = new ArrayList();
   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 dirListing =
//(ArrayList) 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 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 ls(String dirName) {
   Random rng = new Random();
   int listLength = 2000;
   ArrayList listing = new ArrayList(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.