gdaniels    2003/02/22 08:49:16

  Modified:    java/src/org/apache/axis/wsdl/fromJava Types.java
                        Emitter.java
               java/src/org/apache/axis/description OperationDesc.java
  Log:
  * Split what used to be writeWrapperForPart() in Types into
    two pieces, writeWrapperElement() and writeWrappedParameter().
    This enables us to correctly generate wrapper elements for
    methods with no args/parts and makes the code much more
    explicit about what's going on.
  
  * Emitter now passes down its style when creating its own
    ServiceDescs.
  
  * Make wrapped generation in Emitter use the new Types
    methods, clean up code some.
  
  * Add getAll[In/Out]Params() to OperationDesc, needed by
    wrapped WSDL generator.
  
  Revision  Changes    Path
  1.71      +63 -35    xml-axis/java/src/org/apache/axis/wsdl/fromJava/Types.java
  
  Index: Types.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/wsdl/fromJava/Types.java,v
  retrieving revision 1.70
  retrieving revision 1.71
  diff -u -r1.70 -r1.71
  --- Types.java        16 Jan 2003 18:43:06 -0000      1.70
  +++ Types.java        22 Feb 2003 16:49:15 -0000      1.71
  @@ -379,51 +379,81 @@
       }
   
       /**
  -     * Write wrapper for part.
  +     * Write the element definition for a WRAPPED operation.  This will
  +     * write out any necessary namespace/schema declarations, an an element
  +     * definition with an internal (anonymous) complexType.  The name of the
  +     * element will be *foo*Request or *foo*Response depending on whether the
  +     * request boolean is true.  If the operation contains parameters, then
  +     * we also generate a >sequence< node underneath the complexType,
  +     * and return it for later use by writeWrappedParameter() below.
        *
  -     * @param wrapper <code>QName</code> of the wrapper element
  -     * @param name is the name of an element to add to the wrapper element.
  -     * @param type is the QName of the type of the element.
  -     * @return true if the wrapperQName was created, false if it already exists.
  -     */
  -    public boolean writeWrapperForPart(QName wrapper, String name, QName type, 
Class javaType)
  -        throws AxisFault {
  -
  +     * @param qname the desired element QName 
  +     * @param request true if we're writing the request wrapper, false if
  +     *        writing the response.
  +     * @param hasParams true if there are parameters, and thus a sequence
  +     *        node is needed
  +     * @return a DOM Element for the sequence, inside which we'll write the
  +     *         parameters as elements, or null if there are no parameters
  +     */ 
  +    public Element writeWrapperElement(QName qname,
  +                                       boolean request,
  +                                       boolean hasParams) {
           // Make sure a types section is present
           if (wsdlTypesElem == null) {
               writeWsdlTypesElement();
           }
   
           // Write the namespace definition for the wrapper
  -        writeTypeNamespace(wrapper);
  -
  -        // See if the wrapper already exists.
  -        Element sequence = (Element) wrapperMap.get(wrapper);
  -        boolean isNew = (sequence == null);
  -
  -        // Create a type if this is a new wrapper
  -        if (isNew) {
  -            // Create an <element> for the wrapper
  -            Element wrapperElement =
  -                docHolder.createElement("element");
  -            writeSchemaElement(wrapper, wrapperElement);
  -            wrapperElement.setAttribute("name",
  -                                         wrapper.getLocalPart());
  -
  -            // Create an anonymous <complexType> for the wrapper
  -            Element complexType = docHolder.createElement("complexType");
  -            wrapperElement.appendChild(complexType);
  -
  -            // Create a <sequence> under the complexType and save it.
  -            sequence = docHolder.createElement("sequence");
  +        writeTypeNamespace(qname);
  +        
  +        // Create an <element> for the wrapper
  +        Element wrapperElement = docHolder.createElement("element");
  +        writeSchemaElement(qname, wrapperElement);
  +        wrapperElement.setAttribute("name", qname.getLocalPart());
  +
  +        // Create an anonymous <complexType> for the wrapper
  +        Element complexType = docHolder.createElement("complexType");
  +        wrapperElement.appendChild(complexType);
  +
  +        // If we have parameters in the operation, create a <sequence>
  +        // under the complexType and return it.
  +        if (hasParams) {
  +            Element sequence = docHolder.createElement("sequence");
               complexType.appendChild(sequence);
  -            wrapperMap.put(wrapper, sequence);
  -
  +            return sequence;
           }
  +        
  +        return null;
  +    }
  +    
  +    /**
  +     * Write a parameter (a sub-element) into a sequence generated by
  +     * writeWrapperElement() above.
  +     *
  +     * @param sequence the &lt;sequence&gt; in which we're writing
  +     * @param name is the name of an element to add to the wrapper element.
  +     * @param type is the QName of the type of the element.
  +     */
  +    public void writeWrappedParameter(Element sequence, String name,
  +                                      QName type, Class javaType)
  +        throws AxisFault {
   
  +        if (javaType == void.class) {
  +            return;
  +        }
  +        
  +        if (type == null) {
  +            type = writeTypeForPart(javaType, type);
  +        }
  +        
  +        if (type == null) {
  +            // throw an Exception!!
  +        }
  +        
           Element childElem;
           if (isAnonymousType(type)) {
  -            childElem = createElementWithAnonymousType(name, javaType, false, 
docHolder);
  +            childElem = createElementWithAnonymousType(name, javaType,
  +                                                       false, docHolder);
           } else {
               // Create the child <element> and add it to the wrapper <sequence>
               childElem = docHolder.createElement("element");
  @@ -434,8 +464,6 @@
               childElem.setAttribute("type", prefixedName);
           }
           sequence.appendChild(childElem);
  -
  -        return isNew;
       }
   
       private boolean isAnonymousType(QName type) {
  
  
  
  1.83      +106 -64   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.82
  retrieving revision 1.83
  diff -u -r1.82 -r1.83
  --- Emitter.java      6 Jan 2003 22:25:00 -0000       1.82
  +++ Emitter.java      22 Feb 2003 16:49:15 -0000      1.83
  @@ -482,6 +482,7 @@
               serviceDesc.setStopClasses(stopClasses);
               serviceDesc.setAllowedMethods(allowedMethods);
               serviceDesc.setDisallowedMethods(disallowedMethods);
  +            serviceDesc.setStyle(style);
   
               // If the class passed in is a portType,
               // there may be an implClass that is used to
  @@ -1084,7 +1085,7 @@
       {
           Message msg = def.createMessage();
   
  -        QName qName = createMessageName(def, oper.getName(), "Request");
  +        QName qName = createMessageName(def, oper.getName() + "Request");
           
           msg.setQName(qName);
           msg.setUndefined(false);
  @@ -1104,6 +1105,11 @@
               part.setName("part");
               part.setElementName(qname);
               msg.addPart(part);
  +        } else if (oper.getStyle() == Style.WRAPPED) {
  +            // If we're WRAPPED, write the wrapper element first, and then
  +            // fill in any params.  If there aren't any params, we'll see
  +            // an empty <complexType/> for the wrapper element.
  +            writeWrapperPart(def, msg, oper, true);
           } else {
               // Otherwise, write parts for the parameters.
               ArrayList parameters = oper.getParameters();
  @@ -1115,7 +1121,79 @@
   
           return msg;
       }
  -
  +    
  +    private QName getRequestQName(OperationDesc oper) {
  +        QName qname = oper.getElementQName();
  +        if (qname == null) {
  +            qname = new QName(oper.getName());
  +        }
  +        return qname;
  +    }
  +    private QName getResponseQName(OperationDesc oper) {
  +        QName qname = oper.getElementQName();
  +        if (qname == null) {
  +            return new QName(oper.getName() + "Response");
  +        }
  +        return new QName(qname.getNamespaceURI(),
  +                         qname.getLocalPart() + "Response");
  +    }
  +    /**
  +     * Write out the schema definition for a WRAPPED operation request or
  +     * response.
  +     * 
  +     * @param oper
  +     * @param request
  +     */ 
  +    public void writeWrapperPart(Definition def, Message msg,
  +                                 OperationDesc oper, boolean request)
  +            throws AxisFault {
  +        QName qname = request ? getRequestQName(oper) : getResponseQName(oper) ;
  +        boolean hasParams = false;
  +        if (request) {
  +            hasParams = (oper.getNumInParams() > 0);
  +        } else {
  +            if (oper.getReturnClass() != void.class) {
  +                hasParams = true;
  +            } else {
  +                hasParams = (oper.getNumOutParams() > 0);
  +            }
  +        }
  +        
  +        // First write the wrapper element itself.
  +        Element sequence = types.writeWrapperElement(qname, request, hasParams);
  +        
  +        // If we got anything back above, there must be parameters in the
  +        // operation, and it's a <sequence> node in which to write them...
  +        if (sequence != null) {
  +            ArrayList parameters = request ? oper.getAllInParams() :
  +                    oper.getAllOutParams();
  +            if (!request) {
  +                String retName;
  +                if (oper.getReturnQName() == null) {
  +                    retName = oper.getName() + "Return";
  +                } else {
  +                    retName = oper.getReturnQName().getLocalPart();
  +                }
  +                types.writeWrappedParameter(sequence, retName,
  +                                            oper.getReturnType(),
  +                                            oper.getReturnClass());
  +            }
  +            for(int i=0; i<parameters.size(); i++) {
  +                ParameterDesc parameter = (ParameterDesc) parameters.get(i);
  +                types.writeWrappedParameter(sequence,
  +                                            parameter.getName(), // QName??
  +                                            parameter.getTypeQName(), 
  +                                            parameter.getJavaType());
  +            }            
  +        }
  +        
  +        // Finally write the part itself
  +        Part part = def.createPart();
  +        part.setName("parameters");  // We always se "parameters"
  +        part.setElementName(qname);
  +        msg.addPart(part);        
  +    }
  +    
       /** Create a Response Message
        *
        * @param def
  @@ -1128,28 +1206,32 @@
       {
           Message msg = def.createMessage();
   
  -        QName qName = createMessageName(def, desc.getName(), "Response");
  +        QName qName = createMessageName(def, desc.getName() + "Response");
   
           msg.setQName(qName);
           msg.setUndefined(false);
   
  -        // Write the part
  -        ParameterDesc retParam = new ParameterDesc();
  -        if (desc.getReturnQName() == null) {
  -            retParam.setName(desc.getName()+"Return");
  +        if (desc.getStyle() == Style.WRAPPED) {
  +            writeWrapperPart(def, msg, desc, false);            
           } else {
  -            retParam.setQName(desc.getReturnQName());
  -        }
  -        retParam.setTypeQName(desc.getReturnType());
  -        retParam.setMode(ParameterDesc.OUT);
  -        retParam.setIsReturn(true);
  -        retParam.setJavaType(desc.getReturnClass());
  -        writePartToMessage(def, msg, false, retParam);
  -
  -        ArrayList parameters = desc.getParameters();
  -        for (Iterator i = parameters.iterator(); i.hasNext();) {
  -            ParameterDesc param = (ParameterDesc)i.next();
  -            writePartToMessage(def, msg, false, param);
  +            // Write the part
  +            ParameterDesc retParam = new ParameterDesc();
  +            if (desc.getReturnQName() == null) {
  +                retParam.setName(desc.getName()+"Return");
  +            } else {
  +                retParam.setQName(desc.getReturnQName());
  +            }
  +            retParam.setTypeQName(desc.getReturnType());
  +            retParam.setMode(ParameterDesc.OUT);
  +            retParam.setIsReturn(true);
  +            retParam.setJavaType(desc.getReturnClass());
  +            writePartToMessage(def, msg, false, retParam);
  +            
  +            ArrayList parameters = desc.getAllOutParams();
  +            for (Iterator i = parameters.iterator(); i.hasNext();) {
  +                ParameterDesc param = (ParameterDesc)i.next();
  +                writePartToMessage(def, msg, false, param);
  +            }
           }
           return msg;
       }
  @@ -1180,7 +1262,7 @@
   
           if (msg == null) {
               msg = def.createMessage();
  -            QName qName = createMessageName(def, clsName, "");
  +            QName qName = createMessageName(def, clsName);
   
               msg.setQName(qName);
               msg.setUndefined(false);
  @@ -1244,43 +1326,7 @@
               javaType = JavaUtils.getHolderValueType(javaType);
           }
   
  -        if (style == Style.WRAPPED) {
  -            // Write type representing the param
  -            QName typeQName = 
  -                types.writeTypeForPart(javaType,
  -                                       param.getTypeQName());
  -
  -            // Get the QName of the wrapper element
  -            QName wrapperQName = null;
  -            if (request) {
  -                wrapperQName = 
  -                    new QName(
  -                        msg.getQName().getNamespaceURI(),
  -                        msg.getQName().getLocalPart().substring(0,
  -                           msg.getQName().getLocalPart().indexOf("Request"))); 
  -            } else {
  -                wrapperQName = msg.getQName();
  -            }
  -            
  -            if (typeQName != null) {
  -                // Write/Get the wrapper element
  -                // and append a child element repesenting
  -                // the parameter
  -                if (types.writeWrapperForPart(wrapperQName,
  -                                              param.getName(),
  -                                              typeQName, javaType)) {
  -                    // If wrapper element is written
  -                    // add <part name="parameters" element=wrapper_elem />
  -                    // Really shouldn't matter what name is used, but
  -                    // .NET could be using "parameters" as an indication
  -                    // that this is wrapped mode.
  -                    part.setName("parameters");
  -                    part.setElementName(wrapperQName);
  -                    msg.addPart(part);
  -                }
  -            }
  -        } else if (use == Use.ENCODED || 
  -                   style == Style.RPC) {
  +        if (use == Use.ENCODED || style == Style.RPC) {
               // Add the type representing the param
               // For convenience, add an element for the param
               // Write <part name=param_name type=param_type>
  @@ -1315,18 +1361,14 @@
       /*
        * Return a message QName which has not already been defined in the WSDL
        */
  -    private QName createMessageName(Definition def,
  -                                               String methodName,
  -                                               String suffix) {
  +    private QName createMessageName(Definition def, String methodName) {
   
  -        QName qName = new QName(intfNS,
  -                                        methodName.concat(suffix));
  +        QName qName = new QName(intfNS, methodName);
   
           // Check the make sure there isn't a message with this name already
           int messageNumber = 1;
           while (def.getMessage(qName) != null) {
  -            StringBuffer namebuf =
  -                new StringBuffer(methodName.concat(suffix));
  +            StringBuffer namebuf = new StringBuffer(methodName);
               namebuf.append(messageNumber);
               qName = new QName(intfNS, namebuf.toString());
               messageNumber++;
  
  
  
  1.33      +55 -7     xml-axis/java/src/org/apache/axis/description/OperationDesc.java
  
  Index: OperationDesc.java
  ===================================================================
  RCS file: 
/home/cvs/xml-axis/java/src/org/apache/axis/description/OperationDesc.java,v
  retrieving revision 1.32
  retrieving revision 1.33
  diff -u -r1.32 -r1.33
  --- OperationDesc.java        15 Jan 2003 23:11:18 -0000      1.32
  +++ OperationDesc.java        22 Feb 2003 16:49:16 -0000      1.33
  @@ -111,6 +111,8 @@
   
       /** The number of "in" params (i.e. IN or INOUT) for this operation */
       private int numInParams = 0;
  +    /** The number of "out" params (i.e. OUT or INOUT) for this operation */
  +    private int numOutParams = 0;
   
       /** A unique SOAPAction value for this operation */
       private String soapAction = null;
  @@ -258,6 +260,10 @@
               (param.getMode() == ParameterDesc.INOUT)) {
               param.setOrder(numInParams++);
           }
  +        if ((param.getMode() == ParameterDesc.OUT) ||
  +            (param.getMode() == ParameterDesc.INOUT)) {
  +            numOutParams++;
  +        }
          log.debug("@" + Integer.toHexString(hashCode())  + " added parameter >" + 
param + "@" + Integer.toHexString(param.hashCode()) + "<total parameters:" 
+getNumParams());
       }
       
  @@ -291,19 +297,24 @@
        * @param newParameters an ArrayList of ParameterDescs
        */
       public void setParameters(ArrayList newParameters) {
  -       parameters = new ArrayList(); //Keep numInParams correct.
  -       numInParams = 0;
  -
  -       for( java.util.ListIterator li= newParameters.listIterator();
  -         li.hasNext(); ){
  -           addParameter((ParameterDesc) li.next());
  -       }
  +        parameters = new ArrayList(); //Keep numInParams correct.
  +        numInParams = 0;
  +        numOutParams = 0;
  +        
  +        for( java.util.ListIterator li= newParameters.listIterator();
  +             li.hasNext(); ){
  +            addParameter((ParameterDesc) li.next());
  +        }
       }
       
       public int getNumInParams() {
           return numInParams;
       }
   
  +    public int getNumOutParams() {
  +        return numOutParams;
  +    }
  +
       public int getNumParams() {
           return parameters.size();
       }
  @@ -380,6 +391,43 @@
           return param;
       }
   
  +    /**
  +     * Return a list of ALL "in" params (including INOUTs)
  +     * 
  +     * Note: if we were sure the order went IN->INOUT->OUT, we could optimize
  +     * this.
  +     * 
  +     * @return
  +     */ 
  +    public ArrayList getAllInParams() {
  +        ArrayList result = new ArrayList();
  +        for (Iterator i = parameters.iterator(); i.hasNext();) {
  +            ParameterDesc desc = (ParameterDesc) i.next();
  +            if (desc.getMode() != ParameterDesc.OUT) {
  +                result.add(desc);
  +            }
  +        }
  +        return result;
  +    }
  +    
  +    /**
  +     * Return a list of ALL "out" params (including INOUTs)
  +     * 
  +     * Note: if we were sure the order went IN->INOUT->OUT, we could optimize
  +     * this.
  +     * 
  +     * @return
  +     */ 
  +    public ArrayList getAllOutParams() {
  +        ArrayList result = new ArrayList();
  +        for (Iterator i = parameters.iterator(); i.hasNext();) {
  +            ParameterDesc desc = (ParameterDesc) i.next();
  +            if (desc.getMode() != ParameterDesc.IN) {
  +                result.add(desc);
  +            }
  +        }
  +        return result;        
  +    }
       /**
        * Returns an ordered list of out params (NOT inouts)
        */
  
  
  

Reply via email to