Re: Passing an array of strings
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
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
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.