scheu       2002/06/14 15:39:50

  Modified:    java/src/org/apache/axis/description ServiceDesc.java
               java/src/org/apache/axis/encoding/ser BeanDeserializer.java
               java/test/wsdl Java2WsdlAntTask.java Wsdl2javaTestSuite.xml
               java/test/wsdl/addrNoImplSEI AddressBook.wsdl Main.java
  Added:       java/test/wsdl/addrNoImplSEI
                        AddressBookNoImplSEISoapBindingImpl.java
  Removed:     java/test/wsdl/addrNoImplSEI AddressBookSOAPBindingImpl.java
  Log:
  Problem:
     The class passed to Java2WSDL may contain methods that
     throw exceptions that are not allowed in an SEI.
  
     The operations in the SEI must throw RemoteException
     plus application specific exceptions.  General exceptions
     (like java.lang.Exception or java.lang.NullPointerException)
     are not allowed in the SEI.
  
  Solution:
     Changed the ServiceDesc code that creates the FaultDesc objects.
     A FaultDesc is not created for exceptions in the 'java' or 'javax'
     packages.  (Simple Change)
  
     I recently added an addrNoImplSEI testcase which tests proper
     processing if the server-side impl does not implement the SEI.
     (This test is meant to somewhat simulate a server-side EJB).
  
     I enhanced this testcase to roundtrip Java2WSDL and WSDL2Java.
     I added some general purpose throw clauses to the Impl class to
     make sure tht Java2WSDL properly ignored the exceptions when
     generating the SEI.
  
  Revision  Changes    Path
  1.27      +11 -6     xml-axis/java/src/org/apache/axis/description/ServiceDesc.java
  
  Index: ServiceDesc.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/description/ServiceDesc.java,v
  retrieving revision 1.26
  retrieving revision 1.27
  diff -u -r1.26 -r1.27
  --- ServiceDesc.java  11 Jun 2002 14:53:54 -0000      1.26
  +++ ServiceDesc.java  14 Jun 2002 22:39:50 -0000      1.27
  @@ -740,7 +740,12 @@
   
           for (int i=0; i < exceptionTypes.length; i++) {
               // Every remote method declares a java.rmi.RemoteException
  -            if (exceptionTypes[i] != java.rmi.RemoteException.class) {
  +            // Only interested in application specific exceptions.
  +            // Ignore java and javax package exceptions.
  +            Class ex = exceptionTypes[i];
  +            if (ex != java.rmi.RemoteException.class &&
  +                !ex.getName().startsWith("java.") &&
  +                !ex.getName().startsWith("javax.")) {
                   
                   // For JSR 101 v.1.0, there is a simple fault mapping
                   // and a complexType fault mapping...both mappings
  @@ -756,7 +761,7 @@
                   
   
                   /* Old Simple Type Mode                  
  -                Field[] f = exceptionTypes[i].getDeclaredFields();
  +                Field[] f = ex.getDeclaredFields();
                   ArrayList exceptionParams = new ArrayList();
                   for (int j = 0; j < f.length; j++) {
                       int mod = f[j].getModifiers();
  @@ -771,7 +776,7 @@
                           exceptionParams.add(param);
                       }
                   }
  -                String pkgAndClsName = exceptionTypes[i].getName();
  +                String pkgAndClsName = ex.getName();
                   FaultDesc fault = new FaultDesc();
                   fault.setName(pkgAndClsName);
                   fault.setParameters(exceptionParams);                
  @@ -783,12 +788,12 @@
                   ParameterDesc param = new ParameterDesc(
                        new QName("", "fault"),
                        ParameterDesc.IN,
  -                     tm.getTypeQName(exceptionTypes[i]));
  -                param.setJavaType(exceptionTypes[i]);
  +                     tm.getTypeQName(ex));
  +                param.setJavaType(ex);
                   ArrayList exceptionParams = new ArrayList();
                   exceptionParams.add(param);
   
  -                String pkgAndClsName = exceptionTypes[i].getName();
  +                String pkgAndClsName = ex.getName();
                   FaultDesc fault = new FaultDesc();
                   fault.setName(pkgAndClsName);
                   fault.setParameters(exceptionParams);                
  
  
  
  1.32      +3 -3      
xml-axis/java/src/org/apache/axis/encoding/ser/BeanDeserializer.java
  
  Index: BeanDeserializer.java
  ===================================================================
  RCS file: 
/home/cvs/xml-axis/java/src/org/apache/axis/encoding/ser/BeanDeserializer.java,v
  retrieving revision 1.31
  retrieving revision 1.32
  diff -u -r1.31 -r1.32
  --- BeanDeserializer.java     11 Jun 2002 14:53:55 -0000      1.31
  +++ BeanDeserializer.java     14 Jun 2002 22:39:50 -0000      1.32
  @@ -301,15 +301,15 @@
                   // Success!  Register the target and deserializer.
                   collectionIndex = -1;
                   dSer.registerValueTarget(
  -                    new BeanPropertyTarget(value, propDesc));
  +                                         new BeanPropertyTarget(value, propDesc));
               } else {
                   // Success! This is a collection of properties so use the index
                   collectionIndex++;
                   dSer.registerValueTarget(
  -                     new BeanPropertyTarget(value, 
  +                                         new BeanPropertyTarget(value, 
                                               propDesc, 
                                               collectionIndex));
  -        }
  +            }
           }
           return (SOAPHandler)dSer;
       }
  
  
  
  1.13      +8 -0      xml-axis/java/test/wsdl/Java2WsdlAntTask.java
  
  Index: Java2WsdlAntTask.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/test/wsdl/Java2WsdlAntTask.java,v
  retrieving revision 1.12
  retrieving revision 1.13
  diff -u -r1.12 -r1.13
  --- Java2WsdlAntTask.java     31 May 2002 20:29:51 -0000      1.12
  +++ Java2WsdlAntTask.java     14 Jun 2002 22:39:50 -0000      1.13
  @@ -78,6 +78,7 @@
       private String output = "." ;
       private String className = "." ;
       private String servicePortName = null ;
  +    private String portTypeName = null ;
       private String implClass = null;
       private boolean useInheritedMethods = false;
       private String exclude = null;
  @@ -109,6 +110,8 @@
               }
               if (servicePortName != null)
                   emitter.setServicePortName(servicePortName);
  +            if (portTypeName != null)
  +                emitter.setPortTypeName(portTypeName);
               log("Java2WSDL " + className, Project.MSG_INFO);
               emitter.setCls(className);
               if (implClass != null)
  @@ -165,6 +168,11 @@
       // The setter for the "servicePortName" attribute
       public void setServicePortName(String parameter) {
           this.servicePortName = parameter;
  +    }
  +
  +    // The setter for the "portTypeName" attribute
  +    public void setPortTypeName(String parameter) {
  +        this.portTypeName = parameter;
       }
   
       // The setter for the "namespace" attribute
  
  
  
  1.104     +57 -1     xml-axis/java/test/wsdl/Wsdl2javaTestSuite.xml
  
  Index: Wsdl2javaTestSuite.xml
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/test/wsdl/Wsdl2javaTestSuite.xml,v
  retrieving revision 1.103
  retrieving revision 1.104
  diff -u -r1.103 -r1.104
  --- Wsdl2javaTestSuite.xml    12 Jun 2002 18:41:12 -0000      1.103
  +++ Wsdl2javaTestSuite.xml    14 Jun 2002 22:39:50 -0000      1.104
  @@ -73,7 +73,19 @@
           <mapping namespace="urn:MultiRefTest2" package="test.wsdl.multiref"/>
       </wsdl2java>
   
  -    <!-- AddressBook Sample -->
  +    <!-- AddressBook roundtrip example that does not implement SEI -->
  +    <!-- Summary -->
  +    <!-- Bootstrap the process by creating java classes from the original wsdl -->
  +    <!-- Compile the classes plus the provided Impl class -->
  +    <!--   The Impl class is supposed to simulate a server-side EJB -->
  +    <!--   It does not implement the SEI and it contains some additional throw 
clauses -->
  +    <!-- Run Java2WSDL on the Impl class to ensure a valid wsdl is generated -->
  +    <!-- Run WSDL2Java on the new wsdl to ensure valid java artifacts are generated 
-->
  +    <!--   This will ensure that java classes are not generated for 
NullPointerException -->
  +    <!-- Copy back over the original Impl and test classes.  -->
  +    <!--   They will be compiled and run as part of the test. -->
  +    <delete dir="${build.dir}/classes/test/wsdl/addrNoImplSEI"/>
  +    <delete dir="${build.dir}/work/test/wsdl/addrNoImplSEI"/>
       <wsdl2java url="test/wsdl/addrNoImplSEI/AddressBook.wsdl"
                  output="build/work"
                  deployscope="session"
  @@ -85,6 +97,50 @@
                  testcase="no">
           <mapping namespace="urn:AddrNoImplSEI" package="test.wsdl.addrNoImplSEI"/>
       </wsdl2java>
  +
  +    <!-- Copy over original classes -->
  +    <copy todir="${build.dir}/work/test/wsdl/addrNoImplSEI" overwrite="yes">
  +      <fileset dir="${test.dir}/wsdl/addrNoImplSEI">
  +        <include name="*.java"/>
  +      </fileset>
  +    </copy>
  +
  +    <!-- Compile the Web Service -->
  +    <javac srcdir="${build.dir}/work" destdir="${build.dest}" debug="${debug}">
  +      <classpath refid="test-classpath" />
  +      <include name="test/wsdl/addrNoImplSEI/**.java" />
  +      <exclude name="test/wsdl/addrNoImplSEI/*TestCase.java" />
  +      <exclude name="test/wsdl/addrNoImplSEI/Main.java" />
  +    </javac>
  +
  +    <!-- Now run java to wsdl to make sure we don't have any strange artifacts -->
  +    <java2wsdl output="build/work/test/wsdl/addrNoImplSEI/AddressBook.wsdl"
  +               className= 
"test.wsdl.addrNoImplSEI.AddressBookNoImplSEISoapBindingImpl"
  +               useInheritedMethods="false"
  +               portTypeName="AddressBookNoImplSEI"
  +               namespace="http://addrNoImplSEI.wsdl.test";
  +               location="http://localhost:8080/axis/services/AddressBookNoImplSEI";>
  +        <mapping namespace="urn:AddrNoImplSEI" package="test.wsdl.addrNoImplSEI"/>
  +    </java2wsdl> 
  +
  +    <!-- Now run wsdl to java to make sure we don't have any strange artifacts -->
  +    <wsdl2java url="build/work/test/wsdl/addrNoImplSEI/AddressBook.wsdl"
  +               output="build/work"
  +               deployscope="session"
  +               serverSide="yes"
  +               skeletonDeploy="no"
  +               noimports="no"
  +               verbose="no"
  +               typeMappingVersion="1.1"
  +               testcase="no">
  +        <mapping namespace="urn:AddrNoImplSEI" package="test.wsdl.addrNoImplSEI"/>
  +    </wsdl2java>
  +    <!-- Copy over original classes -->
  +    <copy todir="${build.dir}/work/test/wsdl/addrNoImplSEI" overwrite="yes">
  +      <fileset dir="${test.dir}/wsdl/addrNoImplSEI">
  +        <include name="*.java"/>
  +      </fileset>
  +    </copy>
   
       <!-- Operation style test (oneway, request/response, -->
       <!-- solicit/response, notification -->
  
  
  
  1.2       +4 -4      xml-axis/java/test/wsdl/addrNoImplSEI/AddressBook.wsdl
  
  Index: AddressBook.wsdl
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/test/wsdl/addrNoImplSEI/AddressBook.wsdl,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- AddressBook.wsdl  21 May 2002 17:15:50 -0000      1.1
  +++ AddressBook.wsdl  14 Jun 2002 22:39:50 -0000      1.2
  @@ -57,7 +57,7 @@
     </message>
   
     <!-- port type declns -->
  -  <portType name="AddressBook">
  +  <portType name="AddressBookNoImplSEI">
       <operation name="addEntry">
         <input message="tns:AddEntryRequest"/>
       </operation>
  @@ -68,7 +68,7 @@
     </portType>
   
     <!-- binding declns -->
  -  <binding name="AddressBookSOAPBinding" type="tns:AddressBook">
  +  <binding name="AddressBookNoImplSEISoapBinding" type="tns:AddressBookNoImplSEI">
       <soap:binding style="rpc"
                     transport="http://schemas.xmlsoap.org/soap/http"/>
       <operation name="addEntry">
  @@ -100,8 +100,8 @@
     </binding>
   
     <!-- service decln -->
  -  <service name="AddressBookService">
  -    <port name="AddressBookNoImplSEI" binding="tns:AddressBookSOAPBinding">
  +  <service name="AddressBookNoImplSEIService">
  +    <port name="AddressBookNoImplSEI" binding="tns:AddressBookNoImplSEISoapBinding">
         <soap:address 
location="http://localhost:8080/axis/services/AddressBookNoImplSEI"/>
       </port>
     </service>
  
  
  
  1.2       +18 -5     xml-axis/java/test/wsdl/addrNoImplSEI/Main.java
  
  Index: Main.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/test/wsdl/addrNoImplSEI/Main.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- Main.java 21 May 2002 17:15:50 -0000      1.1
  +++ Main.java 14 Jun 2002 22:39:50 -0000      1.2
  @@ -106,7 +106,7 @@
                                   ph.getExchange() + "-" + ph.getNumber());
       }
       
  -    private static Object doit (AddressBook ab) throws Exception {
  +    private static Object doit (AddressBookNoImplSEI ab) throws Exception {
           System.err.println (">> Storing address for '" + name1 + "'");
           ab.addEntry (name1, addr1);
           System.err.println (">> Querying address for '" + name1 + "'");
  @@ -121,6 +121,19 @@
           resp = ab.getAddressFromName (name1);
           System.err.println (">> Response is:");
           printAddress (resp);
  +        
  +        // Test NPE
  +        try {
  +            ab.addEntry(null, null);
  +            throw new Exception("Expected exception when calling addEntry with null 
params");
  +        } catch (java.rmi.RemoteException e) {
  +            if (e.detail instanceof java.lang.IllegalArgumentException) {
  +                // Good! Expected this!
  +            } else {
  +                throw e;  // This is not right!
  +            }            
  +        }
  +        
           return resp;
       }
       
  @@ -131,11 +144,11 @@
               System.err.println ("Using proxy without session maintenance.");
               System.err.println ("(queries without session should say:  \"ADDRESS 
NOT FOUND!\")");
   
  -            AddressBookService abs = new AddressBookServiceLocator();
  +            AddressBookNoImplSEIService abs = new 
AddressBookNoImplSEIServiceLocator();
               opts.setDefaultURL( abs.getAddressBookNoImplSEIAddress() );
               URL serviceURL = new URL(opts.getURL());
   
  -            AddressBook ab1 = null;
  +            AddressBookNoImplSEI ab1 = null;
               if (serviceURL == null) {
                   ab1 = abs.getAddressBookNoImplSEI();
               }
  @@ -148,14 +161,14 @@
               }
   
               System.err.println ("\n\nUsing proxy with session maintenance.");
  -            AddressBook ab2 = null;
  +            AddressBookNoImplSEI ab2 = null;
               if (serviceURL == null) {
                   ab2 = abs.getAddressBookNoImplSEI();
               }
               else {
                   ab2 = abs.getAddressBookNoImplSEI(serviceURL);
               }
  -            ((AddressBookSOAPBindingStub) ab2).setMaintainSession (true);
  +            ((AddressBookNoImplSEISoapBindingStub) ab2).setMaintainSession (true);
               ret = doit (ab2);
               if (ret == null) {
                   throw new Exception("session test expected non-null response, got 
"+ret);
  
  
  
  1.1                  
xml-axis/java/test/wsdl/addrNoImplSEI/AddressBookNoImplSEISoapBindingImpl.java
  
  Index: AddressBookNoImplSEISoapBindingImpl.java
  ===================================================================
  /**
   * AddressBookNoImplSEISOAPBindingImpl.java
   *
   * This file was hand modified from the Emmitter generated code.
   */
  
  package test.wsdl.addrNoImplSEI;
  
  import java.util.Hashtable;
  import java.util.Map;
  
  // Don't implement the AddressBook interface
  public class AddressBookNoImplSEISoapBindingImpl {
      private Map addresses = new Hashtable();
  
      public void addEntry(java.lang.String name, test.wsdl.addrNoImplSEI.Address 
address) 
          throws java.rmi.RemoteException, 
                 java.lang.IllegalArgumentException  // This should be accepted
      {
          if (address == null) {
              throw new java.lang.IllegalArgumentException(); 
          }
          this.addresses.put(name, address);
      }
      public test.wsdl.addrNoImplSEI.Address getAddressFromName(java.lang.String name) 
          throws java.rmi.RemoteException,
                 javax.xml.rpc.JAXRPCException // This should be accepted
      {
          return (test.wsdl.addrNoImplSEI.Address) this.addresses.get(name);
      }
  }
  
  
  


Reply via email to