tomj        2002/10/14 13:01:36

  Modified:    java/src/org/apache/axis/wsdl/fromJava Emitter.java
  Log:
  Some improvements on generating WSDL from Java for faults.
  Now we actually generate reasonable fault information for the
  Group H fault interop services.
  
  Of particular note, I added a name= attirbute to the <fault> tag in WSDD.
  This allows us to round trip various names nicely.
  
  Revision  Changes    Path
  1.73      +50 -31    xml-axis/java/src/org/apache/axis/wsdl/fromJava/Emitter.java
  
  Index: Emitter.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/wsdl/fromJava/Emitter.java,v
  retrieving revision 1.72
  retrieving revision 1.73
  diff -u -r1.72 -r1.73
  --- Emitter.java      14 Oct 2002 17:36:19 -0000      1.72
  +++ Emitter.java      14 Oct 2002 20:01:36 -0000      1.73
  @@ -60,6 +60,7 @@
   import com.ibm.wsdl.extensions.soap.SOAPBodyImpl;
   import com.ibm.wsdl.extensions.soap.SOAPFaultImpl;
   import com.ibm.wsdl.extensions.soap.SOAPOperationImpl;
  +import com.ibm.wsdl.BindingFaultImpl;
   
   import org.apache.axis.AxisFault;
   import org.apache.axis.Constants;
  @@ -874,8 +875,7 @@
               // Add the fault to the binding
               BindingFault bFault = def.createBindingFault();
               bFault.setName(faultDesc.getName());
  -            SOAPFault soapFault = writeSOAPFault(desc.getElementQName(),
  -                    faultDesc.getName());
  +            SOAPFault soapFault = writeSOAPFault(faultDesc);
               bFault.addExtensibilityElement(soapFault);
               bindingOper.addBindingFault(bFault);
               
  @@ -968,10 +968,26 @@
           output = writeSOAPBody(desc.getReturnQName());
   
           bindingOutput.addExtensibilityElement(output);
  -
  +        
  +        // Ad input and output to operation
           bindingOper.setBindingInput(bindingInput);
           bindingOper.setBindingOutput(bindingOutput);
   
  +        // Faults clause
  +        ArrayList faultList = desc.getFaults();
  +        if (faultList != null) {
  +            for (Iterator it = faultList.iterator(); it.hasNext();) {
  +                FaultDesc faultDesc = (FaultDesc) it.next();
  +                // Get a soap:fault
  +                ExtensibilityElement soapFault = writeSOAPFault(faultDesc);
  +                // Get a wsdl:fault to put the soap:fault in
  +                BindingFault bindingFault = new BindingFaultImpl();
  +                bindingFault.setName(faultDesc.getName());
  +                bindingFault.addExtensibilityElement(soapFault);
  +                bindingOper.addBindingFault(bindingFault);
  +            }
  +        }
  +        
           binding.addBindingOperation(bindingOper);
   
           return bindingOper;
  @@ -997,26 +1013,33 @@
           return soapBody;
       } // writeSOAPBody
   
  -    private SOAPFault writeSOAPFault(QName operQName, String faultName) {
  -        SOAPFault soapFault = new SOAPFaultImpl();
  -        if (use == Use.ENCODED) {
  +    private SOAPFault writeSOAPFault(FaultDesc faultDesc) {
  +        SOAPFault soapFault = new com.ibm.wsdl.extensions.soap.SOAPFaultImpl();
  +        if (use != Use.ENCODED) {
  +            soapFault.setUse("literal");
  +            // no namespace for literal, gets it from the element
  +        } else {
               soapFault.setUse("encoded");
               soapFault.setEncodingStyles(encodingList);
  -        } else {
  -            soapFault.setUse("literal");
  -        }
  -        if (targetService == null)
  -            soapFault.setNamespaceURI(intfNS);
  -        else
  -            soapFault.setNamespaceURI(targetService);
  -        if (operQName != null &&
  -            !operQName.getNamespaceURI().equals("")) {
  -            soapFault.setNamespaceURI(operQName.getNamespaceURI());
  +            
  +            // Set the namespace from the fault QName if it exists
  +            // otherwise use the target (or interface) namespace
  +            QName faultQName = faultDesc.getQName();
  +            if (faultQName != null &&
  +                    !faultQName.getNamespaceURI().equals("")) {
  +                soapFault.setNamespaceURI(faultQName.getNamespaceURI());
  +            } else {
  +                if (targetService == null) {
  +                    soapFault.setNamespaceURI(intfNS);
  +                } else {
  +                    soapFault.setNamespaceURI(targetService);
  +                }
  +            }
           }
  -        soapFault.setName(faultName);
           return soapFault;
       } // writeSOAPFault
  -
  +    
  +    
       /** Create a Request Message
        *
        * @param def
  @@ -1093,21 +1116,16 @@
           throws WSDLException, AxisFault
       {
   
  -        String pkgAndClsName = exception.getName();
  +        String pkgAndClsName = exception.getClassName();
           String clsName = pkgAndClsName.substring(pkgAndClsName.lastIndexOf('.') + 1,
                                                    pkgAndClsName.length());
   
  -        // There are inconsistencies in the JSR 101 version 0.7 specification
  -        // with regards to whether the java exception class name is mapped to
  -        // the wsdl:fault name= attribute or is mapped to the wsdl:message of
  -        // the wsdl:fault message= attribute.  Currently WSDL2Java uses the
  -        // latter mapping to generate the java exception class.
  -        //
  +        // Do this to cover the complex type case with no meta data
  +        exception.setName(clsName);
  +        
           // The following code uses the class name for both the name= attribute
           // and the message= attribute.
   
  -        exception.setName(clsName);
  -
           Message msg = (Message) exceptionMsg.get(pkgAndClsName);
   
           if (msg == null) {
  @@ -1118,11 +1136,12 @@
               msg.setUndefined(false);
   
               ArrayList parameters = exception.getParameters();
  -            for (int i=0; i<parameters.size(); i++) {
  -                ParameterDesc parameter = (ParameterDesc) parameters.get(i);
  -                writePartToMessage(def, msg, true, parameter);
  +            if (parameters != null) {
  +                for (int i=0; i<parameters.size(); i++) {
  +                    ParameterDesc parameter = (ParameterDesc) parameters.get(i);
  +                    writePartToMessage(def, msg, true, parameter);
  +                }
               }
  -
               exceptionMsg.put(pkgAndClsName, msg);
           }
   
  
  
  


Reply via email to