Great addition Glen! Related question:
If the server-side operation signature has a List parameter, should the runtime automatically convert the incoming Array to a List ? Rich Scheuerle XML & Web Services Development 512-838-5115 (IBM TL 678-5115) [EMAIL PROTECTED] rg To: [EMAIL PROTECTED] cc: 03/13/2002 12:02 Subject: cvs commit: xml-axis/java/src/org/apache/axis/client Call.java AM Please respond to axis-dev gdaniels 02/03/12 22:02:46 Modified: java/test/encoding TestArrayListConversions.java java/src/org/apache/axis/client Call.java Log: Add a convenience API to Call to allow specifying a desired return type (i.e. Java class) to which we will attempt to convert the result, and a unit test which exercises it. Revision Changes Path 1.15 +24 -0 xml-axis/java/test/encoding/TestArrayListConversions.java Index: TestArrayListConversions.java =================================================================== RCS file: /home/cvs/xml-axis/java/test/encoding/TestArrayListConversions.java,v retrieving revision 1.14 retrieving revision 1.15 diff -u -r1.14 -r1.15 --- TestArrayListConversions.java 28 Jan 2002 18:23:03 -0000 1.14 +++ TestArrayListConversions.java 13 Mar 2002 06:02:46 -0000 1.15 @@ -97,12 +97,36 @@ if (!equals(v, ret)) assertEquals("Echo Array mangled the result. Result is underneath\n" + ret, v, ret); } + /** + * Test the setReturnClass() API on Call by asking the runtime to + * give us back a Vector instead of an array. Confirm we get a Vector + * back, and that it matches the data we send. + */ + public void testReturnAsVector() throws Exception { + LinkedList l = new LinkedList(); + l.add("Linked list item #1"); + l.add("Second linked list item"); + l.add("This will be a SOAP Array then a Vector!"); + + call.setOperationName(new QName(SERVICE_NAME, "echoArray")); + call.setReturnClass(Vector.class); + Object ret = call.invoke(new Object[]{l}); + assertEquals("Return wasn't a Vector!", Vector.class, ret.getClass()); + Vector v = (Vector)ret; + assertEquals("Sizes were different", l.size(), v.size()); + for (int i = 0; i < l.size(); i++) { + String s = (String)l.get(i); + assertEquals("Value " + i + " didn't match", s, v.get(i)); + } + } + public static void main(String[] args) { TestArrayListConversions tester = new TestArrayListConversions ("TestArrayListConversions"); try { tester.testArrayConversion(); tester.testLinkedListConversion(); tester.testVectorConversion(); + tester.testReturnAsVector(); } catch (Exception e) { e.printStackTrace(); } 1.91 +28 -0 xml-axis/java/src/org/apache/axis/client/Call.java Index: Call.java =================================================================== RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/client/Call.java,v retrieving revision 1.90 retrieving revision 1.91 diff -u -r1.90 -r1.91 --- Call.java 8 Mar 2002 17:27:08 -0000 1.90 +++ Call.java 13 Mar 2002 06:02:46 -0000 1.91 @@ -174,6 +174,9 @@ // A place to store any client-specified headers private Vector myHeaders = null; + // The desired return Java type, so we can do conversions if needed + private Class returnJavaType = null; + public static final String SEND_TYPE_ATTR = "send_type_attr" ; public static final String TRANSPORT_NAME = "transport_name" ; public static final String TRANSPORT_PROPERTY = "java.protocol.handler.pkgs"; @@ -728,6 +731,25 @@ } /** + * Sets the desired return Java Class. This is a convenience method + * which will cause the Call to automatically convert return values + * into a desired class if possible. For instance, we return object + * arrays by default now for SOAP arrays - you could specify: + * + * setReturnClass(Vector.class) + * + * and you'd get a Vector back from invoke() instead of having to do + * the conversion yourself. + * + * @param cls the desired return class. + */ + public void setReturnClass(Class cls) { + returnJavaType = cls; + // NOTE: Should be setting XML type based on this as well at some + // point, so you can just use this. + } + + /** * Clears the list of parameters. * @exception JAXRPCException - if isParameterAndReturnSpecRequired returns false, then * removeAllParameters will throw JAXRPCException. @@ -1596,6 +1618,12 @@ if (log.isDebugEnabled()) { log.debug(JavaUtils.getMessage("exit00", "Call::invoke(RPCElement)") ); + } + + // Convert type if needed + if (returnJavaType != null && + !(returnJavaType.isAssignableFrom(result.getClass()))) { + result = JavaUtils.convert(result, returnJavaType); } return( result );