You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-dev@axis.apache.org by Glen Daniels <gd...@macromedia.com> on 2002/03/13 16:39:44 UTC

RE: cvs commit: xml-axis/java/src/org/apache/axis/client Call.jav a

Yup, in fact we already do this (in RPCProvider).

--G

> -----Original Message-----
> From: R J Scheuerle Jr [mailto:scheu@us.ibm.com]
> Sent: Wednesday, March 13, 2002 10:19 AM
> To: axis-dev@xml.apache.org
> Subject: Re: cvs commit: xml-axis/java/src/org/apache/axis/client
> Call.java
> 
> 
> 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)
> 
> 
>                                                               
>                                                               
>                       gdaniels@apache.o                       
>                                                               
>                       rg                       To:       
> xml-axis-cvs@apache.org                                            
>                                                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 );
> 
> 
> 
> 
> 
>