butek 2002/10/08 13:33:25 Modified: java/samples/echo Tag: explicitHeaderWork deploy.wsdd java/src/org/apache/axis/client Tag: explicitHeaderWork Call.java java/src/org/apache/axis/description Tag: explicitHeaderWork OperationDesc.java java/src/org/apache/axis/message Tag: explicitHeaderWork RPCElement.java RPCHandler.java java/src/org/apache/axis/wsdl/symbolTable Tag: explicitHeaderWork SymbolTable.java java/src/org/apache/axis/wsdl/toJava Tag: explicitHeaderWork JavaDeployWriter.java JavaSkelWriter.java JavaStubWriter.java java/test/wsdl/inheritance Tag: explicitHeaderWork InheritanceTestCase.java Added: java/test/wsdl/header Tag: explicitHeaderWork build.xml header.wsdl Log: Output (and return) headers now work. To get these to work, we had to explicitly define the return QName so that it could be gathered either from the header or the body by name. With this change, problems in two tests were exposed: - samples/echo test failed because it wasn't defining all operations. - test/wsdl/inheritance failed. It does WSDL2Java->Java2WSDL-> WSDL2Java. We lose the return name through this process and the test case was using the Locator from the FIRST WSDL2Java when it should have been using the Locator from the SECOND WSDL2Java. Revision Changes Path No revision No revision 1.23.6.1 +30 -0 xml-axis/java/samples/echo/deploy.wsdd Index: deploy.wsdd =================================================================== RCS file: /home/cvs/xml-axis/java/samples/echo/deploy.wsdd,v retrieving revision 1.23 retrieving revision 1.23.6.1 diff -u -r1.23 -r1.23.6.1 --- deploy.wsdd 2 Sep 2002 18:20:05 -0000 1.23 +++ deploy.wsdd 8 Oct 2002 20:33:23 -0000 1.23.6.1 @@ -164,5 +164,35 @@ <operation name="echoMapArray" returnQName="return" returnType="RTypeNS:ArrayOf_apachesoap_Map" xmlns:RTypeNS="http://soapinterop.org/" > <parameter name="input" type="tns:ArrayOf_apachesoap_Map" xmlns:tns="http://soapinterop.org/"/> </operation> + <operation name="echoToken" qname="operNS:echoToken" xmlns:operNS="http://soapinterop.org/" returnQName="return" returnType="rtns:token" xmlns:rtns="http://www.w3.org/2001/XMLSchema" > + <parameter name="inputToken" type="tns:token" xmlns:tns="http://www.w3.org/2001/XMLSchema"/> + </operation> + <operation name="echoNormalizedString" qname="operNS:echoNormalizedString" xmlns:operNS="http://soapinterop.org/" returnQName="return" returnType="rtns:normalizedString" xmlns:rtns="http://www.w3.org/2001/XMLSchema" > + <parameter name="inputNormalizedString" type="tns:normalizedString" xmlns:tns="http://www.w3.org/2001/XMLSchema"/> + </operation> + <operation name="echoUnsignedLong" qname="operNS:echoUnsignedLong" xmlns:operNS="http://soapinterop.org/" returnQName="return" returnType="rtns:unsignedLong" xmlns:rtns="http://www.w3.org/2001/XMLSchema" > + <parameter name="inputUnsignedLong" type="tns:unsignedLong" xmlns:tns="http://www.w3.org/2001/XMLSchema"/> + </operation> + <operation name="echoUnsignedInt" qname="operNS:echoUnsignedInt" xmlns:operNS="http://soapinterop.org/" returnQName="return" returnType="rtns:unsignedInt" xmlns:rtns="http://www.w3.org/2001/XMLSchema" > + <parameter name="inputUnsignedInt" type="tns:unsignedInt" xmlns:tns="http://www.w3.org/2001/XMLSchema"/> + </operation> + <operation name="echoUnsignedShort" qname="operNS:echoUnsignedShort" xmlns:operNS="http://soapinterop.org/" returnQName="return" returnType="rtns:unsignedShort" xmlns:rtns="http://www.w3.org/2001/XMLSchema" > + <parameter name="inputUnsignedShort" type="tns:unsignedShort" xmlns:tns="http://www.w3.org/2001/XMLSchema"/> + </operation> + <operation name="echoUnsignedByte" qname="operNS:echoUnsignedByte" xmlns:operNS="http://soapinterop.org/" returnQName="return" returnType="rtns:unsignedByte" xmlns:rtns="http://www.w3.org/2001/XMLSchema" > + <parameter name="inputUnsignedByte" type="tns:unsignedByte" xmlns:tns="http://www.w3.org/2001/XMLSchema"/> + </operation> + <operation name="echoNonNegativeInteger" qname="operNS:echoNonNegativeInteger" xmlns:operNS="http://soapinterop.org/" returnQName="return" returnType="rtns:nonNegativeInteger" xmlns:rtns="http://www.w3.org/2001/XMLSchema" > + <parameter name="inputNonNegativeInteger" type="tns:nonNegativeInteger" xmlns:tns="http://www.w3.org/2001/XMLSchema"/> + </operation> + <operation name="echoPositiveInteger" qname="operNS:echoPositiveInteger" xmlns:operNS="http://soapinterop.org/" returnQName="return" returnType="rtns:positiveInteger" xmlns:rtns="http://www.w3.org/2001/XMLSchema" > + <parameter name="inputPositiveInteger" type="tns:positiveInteger" xmlns:tns="http://www.w3.org/2001/XMLSchema"/> + </operation> + <operation name="echoNonPositiveInteger" qname="operNS:echoNonPositiveInteger" xmlns:operNS="http://soapinterop.org/" returnQName="return" returnType="rtns:nonPositiveInteger" xmlns:rtns="http://www.w3.org/2001/XMLSchema" > + <parameter name="inputNonPositiveInteger" type="tns:nonPositiveInteger" xmlns:tns="http://www.w3.org/2001/XMLSchema"/> + </operation> + <operation name="echoNegativeInteger" qname="operNS:echoNegativeInteger" xmlns:operNS="http://soapinterop.org/" returnQName="return" returnType="rtns:negativeInteger" xmlns:rtns="http://www.w3.org/2001/XMLSchema" > + <parameter name="inputNegativeInteger" type="tns:negativeInteger" xmlns:tns="http://www.w3.org/2001/XMLSchema"/> + </operation> </service> </deployment> No revision No revision 1.180.4.4 +39 -12 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.180.4.3 retrieving revision 1.180.4.4 diff -u -r1.180.4.3 -r1.180.4.4 --- Call.java 4 Oct 2002 20:20:55 -0000 1.180.4.3 +++ Call.java 8 Oct 2002 20:33:23 -0000 1.180.4.4 @@ -199,9 +199,6 @@ // The desired return Java type, so we can do conversions if needed private Class returnJavaType = null; - // If a parameter is sent as a header, this flag will be set to true; - private boolean headerParameters = false; - 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"; @@ -837,33 +834,47 @@ } /** - * Adds a parameter type as a soap:header. Note that we do not - * currently support an INOUT parameter split between header and - * body of the soap message. It's either header both ways or - * body both ways. + * Adds a parameter type as a soap:header. + * @param paramName - Name of the parameter + * @param xmlType - XML datatype of the parameter + * @param javaType - The Java class of the parameter + * @param parameterMode - Mode of the parameter-whether IN, OUT or INOUT + * @param headerMode - Mode of the header. Even if this is an INOUT + * parameter, it need not be in the header in both + * directions. + * @exception JAXRPCException - if isParameterAndReturnSpecRequired returns + * false, then addParameter MAY throw + * JAXRPCException....actually Axis allows + * modification in such cases */ public void addParameterAsHeader(QName paramName, QName xmlType, - Class javaType, ParameterMode parameterMode) { + Class javaType, ParameterMode parameterMode, + ParameterMode headerMode) { ParameterDesc param = new ParameterDesc(); param.setQName(paramName); param.setTypeQName(xmlType); param.setJavaType(javaType); if (parameterMode == ParameterMode.IN) { param.setMode(ParameterDesc.IN); - param.setInHeader(true); } else if (parameterMode == ParameterMode.INOUT) { param.setMode(ParameterDesc.INOUT); - param.setInHeader(true); - param.setOutHeader(true); } else if (parameterMode == ParameterMode.OUT) { param.setMode(ParameterDesc.OUT); + } + if (headerMode == ParameterMode.IN) { + param.setInHeader(true); + } + else if (headerMode == ParameterMode.INOUT) { + param.setInHeader(true); + param.setOutHeader(true); + } + else if (headerMode == ParameterMode.OUT) { param.setOutHeader(true); } operation.addParameter(param); parmAndRetReq = true; - headerParameters = true; } // addParameterAsHeader /** @@ -931,6 +942,22 @@ returnJavaType = javaType; operation.setReturnClass(javaType); // Use specified type as the operation return } + + /** + * Set the return type as a header + */ + public void setReturnTypeAsHeader(QName xmlType) { + setReturnType(xmlType); + operation.setReturnHeader(true); + } // setReturnTypeAsHeader + + /** + * Set the return type as a header + */ + public void setReturnTypeAsHeader(QName xmlType, Class javaType) { + setReturnType(xmlType, javaType); + operation.setReturnHeader(true); + } // setReturnTypeAsHeader /** * Returns the QName of the type of the return value of this Call - or null if No revision No revision 1.23.4.3 +6 -0 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.23.4.2 retrieving revision 1.23.4.3 diff -u -r1.23.4.2 -r1.23.4.3 --- OperationDesc.java 4 Oct 2002 20:20:56 -0000 1.23.4.2 +++ OperationDesc.java 8 Oct 2002 20:33:23 -0000 1.23.4.3 @@ -306,10 +306,16 @@ this.method = method; } + /** + * Is the return value in the header of the response message? + */ public boolean isReturnHeader() { return returnDesc.isOutHeader(); } + /** + * Set whether the return value is in the response message. + */ public void setReturnHeader(boolean value) { returnDesc.setOutHeader(value); } No revision No revision 1.76.4.4 +2 -2 xml-axis/java/src/org/apache/axis/message/RPCElement.java Index: RPCElement.java =================================================================== RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/message/RPCElement.java,v retrieving revision 1.76.4.3 retrieving revision 1.76.4.4 diff -u -r1.76.4.3 -r1.76.4.4 --- RPCElement.java 4 Oct 2002 20:20:56 -0000 1.76.4.3 +++ RPCElement.java 8 Oct 2002 20:33:24 -0000 1.76.4.4 @@ -164,7 +164,7 @@ // We're going to need this below, so create one. RPCHandler rpcHandler = new RPCHandler(this, isResponse); - if (operations != null && !msgContext.isClient()) { + if (operations != null) { int numParams = (getChildren() == null) ? 0 : getChildren().size(); SAXException savedException = null; @@ -248,7 +248,7 @@ if (savedException != null) { throw savedException; - } else { + } else if (!msgContext.isClient()) { throw new SAXException( Messages.getMessage("noSuchOperation", name)); } 1.65.4.2 +1 -1 xml-axis/java/src/org/apache/axis/message/RPCHandler.java Index: RPCHandler.java =================================================================== RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/message/RPCHandler.java,v retrieving revision 1.65.4.1 retrieving revision 1.65.4.2 diff -u -r1.65.4.1 -r1.65.4.2 --- RPCHandler.java 2 Oct 2002 20:39:06 -0000 1.65.4.1 +++ RPCHandler.java 8 Oct 2002 20:33:24 -0000 1.65.4.2 @@ -216,6 +216,7 @@ } else { paramDesc = operation.getInputParamByQName(qname); } + // If that didn't work, try position // FIXME : Do we need to be in EITHER named OR positional @@ -230,7 +231,6 @@ paramDesc = operation.getParameter(params.size() - 1); } } - if (paramDesc == null) { throw new SAXException(Messages.getMessage("noParmDesc")); No revision No revision 1.41.6.4 +2 -1 xml-axis/java/src/org/apache/axis/wsdl/symbolTable/SymbolTable.java Index: SymbolTable.java =================================================================== RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/wsdl/symbolTable/SymbolTable.java,v retrieving revision 1.41.6.3 retrieving revision 1.41.6.4 diff -u -r1.41.6.3 -r1.41.6.4 --- SymbolTable.java 4 Oct 2002 20:20:57 -0000 1.41.6.3 +++ SymbolTable.java 8 Oct 2002 20:33:24 -0000 1.41.6.4 @@ -996,7 +996,7 @@ } } } - } // populate Parameters + } // populateParameters /** * For the given operation, this method returns the parameter info conveniently collated. @@ -1112,6 +1112,7 @@ // out parameters. if (outputs.size() == 1) { parameters.returnParam = (Parameter)outputs.get(0); + parameters.returnParam.setMode(Parameter.OUT); if (parameters.returnParam.getType() instanceof DefinedElement) { parameters.returnParam.setQName( ((DefinedElement)parameters.returnParam.getType()) No revision No revision 1.65.4.4 +3 -0 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.65.4.3 retrieving revision 1.65.4.4 diff -u -r1.65.4.3 -r1.65.4.4 --- JavaDeployWriter.java 4 Oct 2002 20:20:57 -0000 1.65.4.3 +++ JavaDeployWriter.java 8 Oct 2002 20:33:24 -0000 1.65.4.4 @@ -425,6 +425,9 @@ Utils.genQNameAttributeString(returnType, "rtns") + "\""); } + if (params.returnParam != null && params.returnParam.isOutHeader()) { + pw.print(" returnHeader=\"true\""); + } pw.println(" >"); Vector paramList = params.list; 1.49.6.4 +5 -1 xml-axis/java/src/org/apache/axis/wsdl/toJava/JavaSkelWriter.java Index: JavaSkelWriter.java =================================================================== RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/wsdl/toJava/JavaSkelWriter.java,v retrieving revision 1.49.6.3 retrieving revision 1.49.6.4 diff -u -r1.49.6.3 -r1.49.6.4 --- JavaSkelWriter.java 4 Oct 2002 20:20:57 -0000 1.49.6.3 +++ JavaSkelWriter.java 8 Oct 2002 20:33:24 -0000 1.49.6.4 @@ -220,7 +220,11 @@ if (retType != null) { pw.println(" _oper.setReturnType(" + - Utils.getNewQName(retType) + ");"); + Utils.getNewQName(retType) + ");"); + if (parameters.returnParam != null && + parameters.returnParam.isOutHeader()) { + pw.println(" _oper.setReturnHeader(true);"); + } } // If we need to know the QName (if we have a namespace or 1.98.4.4 +28 -19 xml-axis/java/src/org/apache/axis/wsdl/toJava/JavaStubWriter.java Index: JavaStubWriter.java =================================================================== RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/wsdl/toJava/JavaStubWriter.java,v retrieving revision 1.98.4.3 retrieving revision 1.98.4.4 diff -u -r1.98.4.3 -r1.98.4.4 --- JavaStubWriter.java 4 Oct 2002 20:20:58 -0000 1.98.4.3 +++ JavaStubWriter.java 8 Oct 2002 20:33:24 -0000 1.98.4.4 @@ -520,10 +520,19 @@ // Generate the addParameter call with the // name qname, typeQName, optional javaType, and mode - if (p.getMode() != Parameter.OUT && p.isInHeader()) { - pw.println(" _call.addParameterAsHeader(" + paramNameText + ", " + boolean isInHeader = p.isInHeader(); + boolean isOutHeader = p.isOutHeader(); + if (isInHeader || isOutHeader) { + String headerMode = isInHeader ? + (isOutHeader ? "javax.xml.rpc.ParameterMode.INOUT" : + "javax.xml.rpc.ParameterMode.IN") : + "javax.xml.rpc.ParameterMode.OUT"; + pw.println(" _call.addParameterAsHeader(" + + paramNameText + ", " + paramTypeText + ", " - + javaType + "javax.xml.rpc.ParameterMode.IN);"); + + javaType + + "javax.xml.rpc.ParameterMode.IN, " + + headerMode + ");"); } else if (p.getMode() == Parameter.IN) { pw.println(" _call.addParameter(" + paramNameText + ", " @@ -546,7 +555,7 @@ // Get the QName for the return Type QName returnType = Utils.getXSIType(parms.returnParam); - + // Get the javaType String javaType = null; if (parms.returnParam.getMIMEType() != null) { @@ -556,12 +565,21 @@ javaType = parms.returnParam.getType().getName(); } if (javaType == null) { - pw.println(" _call.setReturnType(" + - Utils.getNewQName(returnType) + ");"); - } else { - pw.println(" _call.setReturnType(" + - Utils.getNewQName(returnType) + - ", " + javaType + ".class);"); + javaType = ""; + } + else { + javaType = ", " + javaType + ".class"; + } + String method = "setReturnType"; + if (parms.returnParam.isOutHeader()) { + method = "setReturnTypeAsHeader"; + } + pw.println(" _call." + method + "(" + + Utils.getNewQName(returnType) + + javaType + ");"); + QName returnQName = parms.returnParam.getQName(); + if (returnQName != null) { + pw.println(" _call.setReturnQName(" + Utils.getNewQName(returnQName) + ");"); } } else { @@ -612,15 +630,6 @@ Part p = (Part)partsMap.values().iterator().next(); QName q = p.getElementName(); pw.println(" _call.setOperationName(" + Utils.getNewQName(q) + ");" ); - - // Special return info for wrapped - the QName of the element - // which is the return type - if (parms.returnParam != null) { - QName returnQName = parms.returnParam.getQName(); - if (returnQName != null) { - pw.println(" _call.setReturnQName(" + Utils.getNewQName(returnQName) + ");" ); - } - } } else { QName elementQName = Utils.getOperationQName(operation, bEntry, symbolTable); No revision No revision 1.1.2.1 +85 -0 xml-axis/java/test/wsdl/header/Attic/build.xml 1.1.2.1 +96 -0 xml-axis/java/test/wsdl/header/Attic/header.wsdl No revision No revision 1.4.12.1 +1 -1 xml-axis/java/test/wsdl/inheritance/InheritanceTestCase.java Index: InheritanceTestCase.java =================================================================== RCS file: /home/cvs/xml-axis/java/test/wsdl/inheritance/InheritanceTestCase.java,v retrieving revision 1.4 retrieving revision 1.4.12.1 diff -u -r1.4 -r1.4.12.1 --- InheritanceTestCase.java 24 May 2002 18:11:12 -0000 1.4 +++ InheritanceTestCase.java 8 Oct 2002 20:33:24 -0000 1.4.12.1 @@ -108,7 +108,7 @@ public void testInheritanceTest() { test.wsdl.inheritance.InheritancePortType binding; try { - binding = new InheritanceTestLocator().getInheritanceTest(); + binding = new InheritancePortTypeServiceLocator().getInheritanceTest(); } catch (ServiceException jre) { throw new junit.framework.AssertionFailedError("JAX-RPC ServiceException caught: " + jre); }