gdaniels    02/03/03 06:09:08

  Modified:    java/src/org/apache/axis/client Call.java
               java/src/org/apache/axis/deployment/wsdd WSDDConstants.java
                        WSDDOperation.java WSDDService.java
               java/src/org/apache/axis/handlers/soap SOAPService.java
               java/src/org/apache/axis/providers/java RPCProvider.java
               java/src/org/apache/axis/wsdl/toJava JavaDeployWriter.java
                        SymbolTable.java
  Log:
  Allow for operations defined with "element=''" in WSDL to return the
  appropriate (schema-defined) element name, instead of "<method>Result".
  
  We introduce a new WSDD element, <operation>, which lives under
  <service>, and right now has just name="" and returnQName=""
  attributes.  The WSDL2Java Emitter will correctly emit these for element-
  style operations.  This mechanism will be cleaned up soon, but it works
  (and will enable our server endpoints to pass the doc/lit interop3 tests)
  for now.
  
  Also fix a bug where timeout wasn't getting propagated to the
  MessageContext from the Call.
  
  Revision  Changes    Path
  1.85      +3 -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.84
  retrieving revision 1.85
  diff -u -r1.84 -r1.85
  --- Call.java 27 Feb 2002 17:32:17 -0000      1.84
  +++ Call.java 3 Mar 2002 14:09:08 -0000       1.85
  @@ -1631,6 +1631,9 @@
           if (SOAPActionURI != null) {
               msgContext.setSOAPActionURI(SOAPActionURI);
           }
  +        if (timeout != null) {
  +            msgContext.setTimeout(timeout.intValue());
  +        }
           msgContext.setEncodingStyle(encodingStyle);
   
           /**
  
  
  
  1.13      +2 -0      
xml-axis/java/src/org/apache/axis/deployment/wsdd/WSDDConstants.java
  
  Index: WSDDConstants.java
  ===================================================================
  RCS file: 
/home/cvs/xml-axis/java/src/org/apache/axis/deployment/wsdd/WSDDConstants.java,v
  retrieving revision 1.12
  retrieving revision 1.13
  diff -u -r1.12 -r1.13
  --- WSDDConstants.java        3 Dec 2001 03:31:31 -0000       1.12
  +++ WSDDConstants.java        3 Mar 2002 14:09:08 -0000       1.13
  @@ -115,4 +115,6 @@
                                                        "typeMapping");
       public static final QName BEANMAPPING_QNAME = new QName(WSDD_NS,
                                                        "beanMapping");
  +    public static final QName OPERATION_QNAME = new QName(WSDD_NS,
  +                                                          "operation");
   }
  
  
  
  1.12      +53 -1     
xml-axis/java/src/org/apache/axis/deployment/wsdd/WSDDOperation.java
  
  Index: WSDDOperation.java
  ===================================================================
  RCS file: 
/home/cvs/xml-axis/java/src/org/apache/axis/deployment/wsdd/WSDDOperation.java,v
  retrieving revision 1.11
  retrieving revision 1.12
  diff -u -r1.11 -r1.12
  --- WSDDOperation.java        7 Nov 2001 21:04:20 -0000       1.11
  +++ WSDDOperation.java        3 Mar 2002 14:09:08 -0000       1.12
  @@ -58,6 +58,9 @@
   import org.w3c.dom.Element;
   import org.w3c.dom.Node;
   import org.apache.axis.encoding.SerializationContext;
  +import org.apache.axis.utils.XMLUtils;
  +import org.apache.axis.description.OperationDesc;
  +import org.xml.sax.helpers.AttributesImpl;
   
   import javax.xml.rpc.namespace.QName;
   import java.io.IOException;
  @@ -68,6 +71,12 @@
   public class WSDDOperation
       extends WSDDElement
   {
  +    /** The operation name (String, or QName?) */
  +    private String name;
  +
  +    /** The return QName (if it should be different from <method>Result) */
  +    private QName returnQName;
  +
       /**
        *
        * @param e (Element) XXX
  @@ -77,6 +86,12 @@
           throws WSDDException
       {
           super(e);
  +
  +        name = e.getAttribute("name");
  +
  +        String retQNameStr = e.getAttribute("returnQName");
  +        if (retQNameStr != null && !retQNameStr.equals(""))
  +            returnQName = XMLUtils.getQNameFromString(retQNameStr, e);
       }
   
       /**
  @@ -84,9 +99,46 @@
        */
       public void writeToContext(SerializationContext context)
               throws IOException {
  +        AttributesImpl attrs = new AttributesImpl();
  +
  +        if (returnQName != null) {
  +            attrs.addAttribute("", "returnQName", "returnQName",
  +                               "CDATA", context.qName2String(returnQName));
  +        }
  +
  +        if (name != null) {
  +            attrs.addAttribute("", "name", "name", "CDATA", name);
  +        }
  +
  +        context.startElement(getElementName(), attrs);
  +        context.endElement();
       }
   
       protected QName getElementName() {
  -        return new QName("", "operation");
  +        return WSDDConstants.OPERATION_QNAME;
  +    }
  +
  +    public QName getReturnQName() {
  +        return returnQName;
  +    }
  +
  +    public void setReturnQName(QName returnQName) {
  +        this.returnQName = returnQName;
  +    }
  +
  +    public String getName() {
  +        return name;
  +    }
  +
  +    public void setName(String name) {
  +        this.name = name;
  +    }
  +
  +    public OperationDesc getOperationDesc()
  +    {
  +        OperationDesc desc = new OperationDesc();
  +        desc.setName(name);
  +        desc.setReturnQName(returnQName);
  +        return desc;
       }
   }
  
  
  
  1.43      +56 -38    
xml-axis/java/src/org/apache/axis/deployment/wsdd/WSDDService.java
  
  Index: WSDDService.java
  ===================================================================
  RCS file: 
/home/cvs/xml-axis/java/src/org/apache/axis/deployment/wsdd/WSDDService.java,v
  retrieving revision 1.42
  retrieving revision 1.43
  diff -u -r1.42 -r1.43
  --- WSDDService.java  28 Feb 2002 13:37:47 -0000      1.42
  +++ WSDDService.java  3 Mar 2002 14:09:08 -0000       1.43
  @@ -86,10 +86,11 @@
   {
       public static final QName elMapQName = new QName("", "elementMapping");
       public TypeMappingRegistry tmr = null;
  -    
  +
       private Vector faultFlows = new Vector();
       private Vector typeMappings = new Vector();
  -    
  +    private Vector operations = new Vector();
  +
       /** Which namespaces should auto-dispatch to this service? */
       private Vector namespaces = new Vector();
   
  @@ -97,25 +98,25 @@
       private HashMap qName2MethodMap = null;
   
       private String descriptionURL;
  -    
  +
       /** Style - document or RPC (the default) */
       private int style = SOAPService.STYLE_RPC;
   
       private SOAPService cachedService = null;
  -    
  +
       /**
        * Our provider - used to figure out which Handler we use as a service
        * pivot (see getInstance() below)
  -     */ 
  +     */
       private QName providerQName;
   
       /**
        * Default constructor
  -     */ 
  +     */
       public WSDDService()
       {
       }
  -    
  +
       /**
        *
        * @param e (Element) XXX
  @@ -125,21 +126,27 @@
           throws WSDDException
       {
           super(e);
  -        
  +
  +        Element [] operationElements = getChildElements(e, "operation");
  +        for (int i = 0; i < operationElements.length; i++) {
  +            WSDDOperation operation = new WSDDOperation(operationElements[i]);
  +            operations.add(operation);
  +        }
  +
           Element [] typeMappingElements = getChildElements(e, "typeMapping");
           for (int i = 0; i < typeMappingElements.length; i++) {
               WSDDTypeMapping mapping =
                       new WSDDTypeMapping(typeMappingElements[i]);
               typeMappings.add(mapping);
           }
  -        
  +
           Element [] beanMappingElements = getChildElements(e, "beanMapping");
           for (int i = 0; i < beanMappingElements.length; i++) {
               WSDDBeanMapping mapping =
                       new WSDDBeanMapping(beanMappingElements[i]);
               typeMappings.add(mapping);
           }
  -        
  +
           Element [] namespaceElements = getChildElements(e, "namespace");
           for (int i = 0; i < namespaceElements.length; i++) {
               // Register a namespace for this service
  @@ -150,7 +157,7 @@
           String typeStr = e.getAttribute("provider");
           if (typeStr != null && !typeStr.equals(""))
               providerQName = XMLUtils.getQNameFromString(typeStr, e);
  -        
  +
           String modeStr = e.getAttribute("style");
           if (modeStr != null && modeStr.equals("document")) {
               style = SOAPService.STYLE_DOCUMENT;
  @@ -173,22 +180,22 @@
   
       /**
        * Add a WSDDTypeMapping to the Service.
  -     * @param mapping 
  +     * @param mapping
        **/
       public void addTypeMapping(WSDDTypeMapping mapping) {
           typeMappings.add(mapping);
       }
  -   
  +
   
       protected QName getElementName()
       {
           return WSDDConstants.SERVICE_QNAME;
       }
  -    
  +
       /**
        * Get any service description URL which might be associated with this
        * service.
  -     * 
  +     *
        * @return a String containing a URL, or null.
        */
       public String getServiceDescriptionURL()
  @@ -198,7 +205,7 @@
   
       /**
        * Set the service description URL for this service.
  -     * 
  +     *
        * @param sdUrl a String containing a URL
        */
       public void setServiceDescriptionURL(String sdUrl)
  @@ -216,14 +223,14 @@
   
       /**
        * Get the service style - document or RPC
  -     */ 
  +     */
       public int getStyle() {
           return style;
       }
   
       /**
        * Set the service style - document or RPC
  -     */ 
  +     */
       public void setStyle(int style) {
           this.style = style;
       }
  @@ -238,12 +245,12 @@
           faultFlows.toArray(t);
           return t;
       }
  -    
  +
       /**
        * Obtain the list of namespaces registered for this service
        * @return a Vector of namespaces (Strings) which should dispatch to
        *         this service
  -     */ 
  +     */
       public Vector getNamespaces()
       {
           return namespaces;
  @@ -279,10 +286,10 @@
           if (cachedService != null) {
               return cachedService;
           }
  -        
  +
           Handler reqHandler = null;
           WSDDChain request = getRequestFlow();
  - 
  +
           if (request != null) {
               reqHandler = request.getInstance(registry);
           }
  @@ -308,7 +315,7 @@
           if (response != null) {
               respHandler = response.getInstance(registry);
           }
  -  
  +
           SOAPService service = new SOAPService(reqHandler, providerHandler,
                                                 respHandler);
           service.setStyle(style);
  @@ -340,6 +347,12 @@
   
           service.setElementMap(qName2MethodMap);
   
  +        for (Iterator i = operations.iterator(); i.hasNext();) {
  +            WSDDOperation operation = (WSDDOperation) i.next();
  +            service.addOperationDesc(operation.getName(),
  +                                     operation.getOperationDesc());
  +        }
  +
           cachedService = service;
           return service;
       }
  @@ -370,28 +383,28 @@
                   tm.setSupportedNamespaces(new String[] {encodingStyle});
                   tmr.register(encodingStyle, tm);
               }
  -            
  +
               SerializerFactory   ser   = null;
               DeserializerFactory deser = null;
  -            
  +
               // Try to construct a serializerFactory by introspecting for the
               // following:
               // public static create(Class javaType, QName xmlType)
               // public <constructor>(Class javaType, QName xmlType)
               // public <constructor>()
  -            // 
  -            // The BaseSerializerFactory createFactory() method is a utility 
  +            //
  +            // The BaseSerializerFactory createFactory() method is a utility
               // that does this for us.
               if (mapping.getSerializerName() != null &&
                   !mapping.getSerializerName().equals("")) {
  -                ser = BaseSerializerFactory.createFactory(mapping.getSerializer(), 
  +                ser = BaseSerializerFactory.createFactory(mapping.getSerializer(),
                                                             
mapping.getLanguageSpecificType(),
                                                             mapping.getQName());
               }
  -            
  +
               if (mapping.getDeserializerName() != null &&
                   !mapping.getDeserializerName().equals("")) {
  -                deser = 
BaseDeserializerFactory.createFactory(mapping.getDeserializer(), 
  +                deser = 
BaseDeserializerFactory.createFactory(mapping.getDeserializer(),
                                                             
mapping.getLanguageSpecificType(),
                                                             mapping.getQName());
               }
  @@ -421,8 +434,13 @@
           if (style == SOAPService.STYLE_DOCUMENT) {
               attrs.addAttribute("", "style", "style", "CDATA", "document");
           }
  -        
  +
           context.startElement(WSDDConstants.SERVICE_QNAME, attrs);
  +
  +        for (int i = 0; i < operations.size(); i++) {
  +            WSDDOperation operation = (WSDDOperation) operations.elementAt(i);
  +            operation.writeToContext(context);
  +        }
           writeFlowsToContext(context);
           writeParamsToContext(context);
   
  @@ -449,7 +467,7 @@
           for (int i=0; i < typeMappings.size(); i++) {
               ((WSDDTypeMapping) typeMappings.elementAt(i)).writeToContext(context);
           }
  -        
  +
           for (int i=0; i < namespaces.size(); i++ ) {
               context.startElement(new QName("", "namespace"), null);
               context.writeString((String)namespaces.get(i));
  @@ -458,7 +476,7 @@
   
           context.endElement();
       }
  -    
  +
       public void setCachedService(SOAPService service)
       {
           cachedService = service;
  @@ -467,19 +485,19 @@
       public void deployToRegistry(WSDDDeployment registry)
       {
           registry.addService(this);
  -        
  +
           // Register the name of the service as a valid namespace, just for
           // backwards compatibility
           registry.registerNamespaceForService(getQName().getLocalPart(), this);
  -        
  +
           for (int i = 0; i < namespaces.size(); i++) {
               String namespace = (String) namespaces.elementAt(i);
  -            registry.registerNamespaceForService(namespace, this);            
  +            registry.registerNamespaceForService(namespace, this);
           }
  -        
  +
           super.deployToRegistry(registry);
       }
  -    
  +
       public void removeNamespaceMappings(WSDDDeployment registry)
       {
           for (int i = 0; i < namespaces.size(); i++) {
  
  
  
  1.49      +17 -0     xml-axis/java/src/org/apache/axis/handlers/soap/SOAPService.java
  
  Index: SOAPService.java
  ===================================================================
  RCS file: 
/home/cvs/xml-axis/java/src/org/apache/axis/handlers/soap/SOAPService.java,v
  retrieving revision 1.48
  retrieving revision 1.49
  diff -u -r1.48 -r1.49
  --- SOAPService.java  28 Feb 2002 13:37:47 -0000      1.48
  +++ SOAPService.java  3 Mar 2002 14:09:08 -0000       1.49
  @@ -62,6 +62,7 @@
   import org.apache.axis.Message;
   import org.apache.axis.MessageContext;
   import org.apache.axis.SimpleTargetedChain;
  +import org.apache.axis.description.OperationDesc;
   import org.apache.axis.providers.java.MsgProvider;
   import org.apache.axis.encoding.DeserializerFactory;
   import org.apache.axis.encoding.Serializer;
  @@ -122,6 +123,22 @@
        * not in wrapped mode.
        */
       private HashMap qName2MethodMap = null;
  +
  +    private HashMap method2OperationMap = null;
  +
  +    public void addOperationDesc(String method, OperationDesc operation)
  +    {
  +        if (method2OperationMap == null)
  +            method2OperationMap = new HashMap();
  +        method2OperationMap.put(method, operation);
  +    }
  +
  +    public OperationDesc getOperationDescByName(String methodName)
  +    {
  +        if (method2OperationMap == null)
  +            return null;
  +        return (OperationDesc)method2OperationMap.get(methodName);
  +    }
   
       /**
        * SOAPRequestHandler is used to inject SOAP semantics just before
  
  
  
  1.43      +26 -4     
xml-axis/java/src/org/apache/axis/providers/java/RPCProvider.java
  
  Index: RPCProvider.java
  ===================================================================
  RCS file: 
/home/cvs/xml-axis/java/src/org/apache/axis/providers/java/RPCProvider.java,v
  retrieving revision 1.42
  retrieving revision 1.43
  diff -u -r1.42 -r1.43
  --- RPCProvider.java  25 Feb 2002 10:53:40 -0000      1.42
  +++ RPCProvider.java  3 Mar 2002 14:09:08 -0000       1.43
  @@ -58,6 +58,8 @@
   import org.apache.axis.AxisFault;
   import org.apache.axis.Constants;
   import org.apache.axis.MessageContext;
  +import org.apache.axis.description.OperationDesc;
  +import org.apache.axis.handlers.soap.SOAPService;
   import org.apache.axis.message.RPCElement;
   import org.apache.axis.message.RPCParam;
   import org.apache.axis.message.SOAPEnvelope;
  @@ -67,6 +69,7 @@
   import org.apache.commons.logging.Log;
   import org.apache.commons.logging.LogFactory;
   
  +import javax.xml.rpc.namespace.QName;
   import java.lang.reflect.Method;
   import java.lang.reflect.InvocationTargetException;
   import java.util.StringTokenizer;
  @@ -291,6 +294,7 @@
               resBody.setPrefix( body.getPrefix() );
               resBody.setNamespaceURI( body.getNamespaceURI() );
               resBody.setEncodingStyle(msgContext.getEncodingStyle());
  +            SOAPService service = msgContext.getService();
               if ( objRes != null ) {
                   // In the old skeleton a param list was returned, which 
                   // contained the RPC params.  Preserve this for now.
  @@ -307,11 +311,13 @@
                       }
                   }
                   else {
  -                    RPCParam param = new RPCParam(getParameterName(obj, 
method[m],-1, mName), objRes);
  +                    QName returnQName = getReturnQName(service, mName);
  +                    RPCParam param = new RPCParam(returnQName, objRes);
                       resBody.addParam(param);
                   }
               } else if (method[m].getReturnType() != Void.TYPE) {
  -                RPCParam param = new RPCParam(getParameterName(obj, method[m],-1, 
mName), objRes);
  +                QName returnQName = getReturnQName(service, mName);
  +                RPCParam param = new RPCParam(returnQName, objRes);
                   resBody.addParam(param);
               }
   
  @@ -377,10 +383,26 @@
                   } else {
                       parmName = mName + "Result" + i;
                   }
  -            } else {
  -                parmName = mName + "Result";  
               }
           }
           return parmName;
  +    }
  +
  +    protected QName getReturnQName(SOAPService service, String methodName)
  +    {
  +        QName ret = null;
  +
  +        if (service != null) {
  +            OperationDesc oper = service.getOperationDescByName(methodName);
  +            if (oper != null) {
  +                ret = oper.getReturnQName();
  +            }
  +        }
  +
  +        if (ret == null) {
  +            ret = new QName("", methodName + "Result");
  +        }
  +
  +        return ret;
       }
   }
  
  
  
  1.22      +23 -2     
xml-axis/java/src/org/apache/axis/wsdl/toJava/JavaDeployWriter.java
  
  Index: JavaDeployWriter.java
  ===================================================================
  RCS file: 
/home/cvs/xml-axis/java/src/org/apache/axis/wsdl/toJava/JavaDeployWriter.java,v
  retrieving revision 1.21
  retrieving revision 1.22
  diff -u -r1.21 -r1.22
  --- JavaDeployWriter.java     28 Feb 2002 17:34:06 -0000      1.21
  +++ JavaDeployWriter.java     3 Mar 2002 14:09:08 -0000       1.22
  @@ -60,6 +60,7 @@
   import java.util.Iterator;
   import java.util.Map;
   import java.util.Vector;
  +import java.util.List;
   
   import javax.wsdl.Binding;
   import javax.wsdl.BindingOperation;
  @@ -189,13 +190,33 @@
           BindingEntry bEntry = symbolTable.getBindingEntry(binding.getQName());
           String serviceName = port.getName();
   
  -        boolean isRPC = true;
  +        boolean isRPC = (bEntry.getBindingStyle() == BindingEntry.STYLE_RPC);
           boolean hasLiteral = bEntry.hasLiteral();
   
           String prefix = Constants.NSPREFIX_WSDD_JAVA;
           pw.println("  <service name=\"" + serviceName
                   + "\" provider=\"" + (isRPC ? prefix +":RPC" : prefix +":MSG")
  -                + "\"" + (hasLiteral ? " style=\"document\"" : "") +  ">");
  +                + "\"" + (hasLiteral ? " style=\"literal\"" : "") + ">");
  +
  +        List operations = binding.getBindingOperations();
  +        for (Iterator i = operations.iterator(); i.hasNext();) {
  +            BindingOperation bOperation = (BindingOperation) i.next();
  +            Operation operation = bOperation.getOperation();
  +            // We pass "" as the namespace argument because we're just
  +            // interested in the return type for now.
  +            Parameters params =
  +                    symbolTable.getOperationParameters(operation, "", bEntry);
  +            if (params.returnType instanceof DefinedElement) {
  +                QName returnQName = params.returnType.getQName();
  +                pw.print("      <operation name=\"" + operation.getName() +
  +                         "\" returnQName=\"retNS:" +
  +                         returnQName.getLocalPart() +
  +                         "\" xmlns:retNS=\"" +
  +                         returnQName.getNamespaceURI() +
  +                         "\"");
  +                pw.println("/>");
  +            }
  +        }
   
           writeDeployBinding(binding);
           writeDeployTypes(hasLiteral);
  
  
  
  1.39      +9 -2      xml-axis/java/src/org/apache/axis/wsdl/toJava/SymbolTable.java
  
  Index: SymbolTable.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/wsdl/toJava/SymbolTable.java,v
  retrieving revision 1.38
  retrieving revision 1.39
  diff -u -r1.38 -r1.39
  --- SymbolTable.java  28 Feb 2002 15:56:16 -0000      1.38
  +++ SymbolTable.java  3 Mar 2002 14:09:08 -0000       1.39
  @@ -868,7 +868,7 @@
        * Rather than do that processing 3 times, it is done once, here, and stored in 
the
        * Parameters object.
        */
  -    private Parameters getOperationParameters(Operation operation, 
  +    public Parameters getOperationParameters(Operation operation,
                                                 String namespace, 
                                                 BindingEntry bindingEntry) throws 
IOException {
           Parameters parameters = new Parameters();
  @@ -1039,8 +1039,15 @@
        */
       private void addOutParm(Vector outputs, int outdex, Parameters parameters, 
boolean trim) {
           Parameter p = new Parameter();
  -        p.setName((String) outputs.get(outdex));
           p.type = (TypeEntry) outputs.get(outdex - 1);
  +
  +        if (p.type instanceof DefinedElement) {
  +            DefinedElement de = (DefinedElement)p.type;
  +            p.setQName(de.getQName());
  +        } else {
  +            p.setName((String) outputs.get(outdex));
  +        }
  +
           if (trim) {
               outputs.remove(outdex);
               outputs.remove(outdex - 1);
  
  
  


Reply via email to