Author: jason.greene(a)jboss.com
Date: 2007-01-12 01:19:37 -0500 (Fri, 12 Jan 2007)
New Revision: 1936
Modified:
trunk/jbossws-core/src/main/java/org/jboss/ws/core/CommonClient.java
trunk/jbossws-core/src/main/java/org/jboss/ws/core/EndpointInvocation.java
trunk/jbossws-core/src/main/java/org/jboss/ws/metadata/builder/jaxws/JAXWSWebServiceMetaDataBuilder.java
trunk/jbossws-core/src/main/java/org/jboss/ws/metadata/umdm/ParameterMetaData.java
trunk/jbossws-core/src/main/java/org/jboss/ws/tools/jaxws/WSDLGenerator.java
Log:
Revert 1777 which broke @WebService processing
Fixed JBWS-1447 - Handle @WebResult(header=true) with doc wrapped
Fixed CTS regression in a number of areas
Modified: trunk/jbossws-core/src/main/java/org/jboss/ws/core/CommonClient.java
===================================================================
--- trunk/jbossws-core/src/main/java/org/jboss/ws/core/CommonClient.java 2007-01-11
15:40:23 UTC (rev 1935)
+++ trunk/jbossws-core/src/main/java/org/jboss/ws/core/CommonClient.java 2007-01-12
06:19:37 UTC (rev 1936)
@@ -182,7 +182,7 @@
{
UnifiedMetaData wsMetaData = new UnifiedMetaData();
wsMetaData.setClassLoader(Thread.currentThread().getContextClassLoader());
-
+
ServiceMetaData serviceMetaData = new ServiceMetaData(wsMetaData, new
QName(Constants.NS_JBOSSWS_URI, "AnonymousService"));
wsMetaData.addService(serviceMetaData);
@@ -313,7 +313,7 @@
{
// unbind the return values
SOAPMessage resMessage = msgContext.getSOAPMessage();
- binding.unbindResponseMessage(opMetaData, resMessage, epInv,
unboundHeaders);
+ binding.unbindResponseMessage(opMetaData, resMessage, epInv,
unboundHeaders);
}
handlerPass = handlerPass && callResponseHandlerChain(portName,
HandlerType.ENDPOINT);
@@ -376,13 +376,22 @@
{
ParameterMode paramMode = paramMetaData.getMode();
- if (paramMode == ParameterMode.INOUT || paramMode == ParameterMode.OUT)
+ int index = paramMetaData.getIndex();
+ if (index == -1 || paramMode == ParameterMode.INOUT || paramMode ==
ParameterMode.OUT)
{
QName xmlName = paramMetaData.getXmlName();
Object value = epInv.getResponseParamValue(xmlName);
- int index = paramMetaData.getIndex();
- log.debug("holder [" + index + "] " + xmlName);
- HolderUtils.setHolderValue(inParams[index], value);
+ // document/literal wrapped return value header
+ if (index == -1)
+ {
+ retValue = value;
+ }
+ else
+ {
+ if (log.isTraceEnabled())
+ log.trace("holder [" + index + "] " + xmlName);
+ HolderUtils.setHolderValue(inParams[index], value);
+ }
}
}
Modified: trunk/jbossws-core/src/main/java/org/jboss/ws/core/EndpointInvocation.java
===================================================================
--- trunk/jbossws-core/src/main/java/org/jboss/ws/core/EndpointInvocation.java 2007-01-11
15:40:23 UTC (rev 1935)
+++ trunk/jbossws-core/src/main/java/org/jboss/ws/core/EndpointInvocation.java 2007-01-12
06:19:37 UTC (rev 1936)
@@ -248,6 +248,12 @@
{
for (ParameterMetaData paramMetaData : opMetaData.getParameters())
{
+ int index = paramMetaData.getIndex();
+
+ // doc/lit wrapped return headers are OUT, so skip
+ if (index < 0)
+ continue;
+
QName xmlName = paramMetaData.getXmlName();
Class javaType = paramMetaData.getJavaType();
@@ -258,7 +264,7 @@
}
else
{
- value = inputParams[paramMetaData.getIndex()];
+ value = inputParams[index];
if (value != null)
{
Class inputType = value.getClass();
Modified:
trunk/jbossws-core/src/main/java/org/jboss/ws/metadata/builder/jaxws/JAXWSWebServiceMetaDataBuilder.java
===================================================================
---
trunk/jbossws-core/src/main/java/org/jboss/ws/metadata/builder/jaxws/JAXWSWebServiceMetaDataBuilder.java 2007-01-11
15:40:23 UTC (rev 1935)
+++
trunk/jbossws-core/src/main/java/org/jboss/ws/metadata/builder/jaxws/JAXWSWebServiceMetaDataBuilder.java 2007-01-12
06:19:37 UTC (rev 1936)
@@ -555,7 +555,19 @@
paramMetaData.setIndex(i);
paramMetaData.setMode(mode);
- if (anWebParam != null && anWebParam.partName().length() > 0)
+ /*
+ * Note: The TCK enforces the following rule in the spec regarding
+ * partName: "This is only used if the operation is rpc style or if
+ * the operation is document style and the parameter style is BARE."
+ *
+ * This seems to be a flaw in the spec, because the intention is
+ * obviously to prevent the ambiguity of wrapped parameters that
+ * specify different partName values. There is, however, no reason
+ * that this limitation should apply to header parameters since they
+ * are never wrapped. In order to comply we adhere to this confusing
+ * rule, although I will ask for clarification.
+ */
+ if (anWebParam != null && !opMetaData.isDocumentWrapped() &&
anWebParam.partName().length() > 0)
paramMetaData.setPartName(anWebParam.partName());
opMetaData.addParameter(paramMetaData);
@@ -575,10 +587,10 @@
WebResult anWebResult = method.getAnnotation(WebResult.class);
boolean isHeader = anWebResult != null && anWebResult.header();
- boolean isWrapped = opMetaData.isDocumentWrapped() && !isHeader;
+ boolean isWrappedBody = opMetaData.isDocumentWrapped() && !isHeader;
QName xmlName = getWebResultName(opMetaData, anWebResult);
- if (isWrapped)
+ if (isWrappedBody)
{
WrappedParameter wrapped = new WrappedParameter(xmlName, returnTypeName,
convertToVariable(xmlName.getLocalPart()), -1);
wrapped.setTypeArguments(convertTypeArguments(returnType,
genericReturnType));
@@ -590,11 +602,30 @@
{
ParameterMetaData retMetaData = new ParameterMetaData(opMetaData, xmlName,
returnTypeName);
retMetaData.setInHeader(isHeader);
- if (anWebResult != null && anWebResult.partName().length() > 0)
- retMetaData.setPartName(anWebResult.partName());
+ retMetaData.setIndex(-1);
+ retMetaData.setMode(ParameterMode.OUT);
- opMetaData.setReturnParameter(retMetaData);
+ // Special case: If we have a document/literal wrapped message, then
+ // the return metadata must be the wrapper type that is sent in the
+ // body. So, in order to handle headers that are mapped to the java
+ // return value, we have to add them to a parameter with an index of
+ // -1 to signify the return value. All other binding styles use the
+ // expected return value mechanism.
+ if (opMetaData.isDocumentWrapped())
+ {
+ opMetaData.addParameter(retMetaData);
+ }
+ else
+ {
+ // See above comment in the parameter for loop section as to why
+ // we prevent customization of part names on document wrapped
+ // header parameters.
+ if (anWebResult != null && anWebResult.partName().length() >
0)
+ retMetaData.setPartName(anWebResult.partName());
+ opMetaData.setReturnParameter(retMetaData);
+ }
+
javaTypes.add(returnType);
typeRefs.add(new TypeReference(xmlName, genericReturnType,
method.getAnnotations()));
}
@@ -668,7 +699,10 @@
if (anWebService.portName().length() > 0 ||
anWebService.serviceName().length() > 0 || anWebService.endpointInterface().length()
> 0)
throw new
WSException("@WebService[portName,serviceName,endpointInterface] MUST NOT be defined
on: " + seiName);
- // @WebService[name] is allowed, but what should we do with it?
+ // Redfine the interface or "PortType" name
+ name = anWebService.name();
+ if (name.length() == 0)
+ name = WSDLUtils.getJustClassName(seiClass);
interfaceNS = anWebService.targetNamespace();
if (interfaceNS.length() == 0)
Modified:
trunk/jbossws-core/src/main/java/org/jboss/ws/metadata/umdm/ParameterMetaData.java
===================================================================
---
trunk/jbossws-core/src/main/java/org/jboss/ws/metadata/umdm/ParameterMetaData.java 2007-01-11
15:40:23 UTC (rev 1935)
+++
trunk/jbossws-core/src/main/java/org/jboss/ws/metadata/umdm/ParameterMetaData.java 2007-01-12
06:19:37 UTC (rev 1936)
@@ -131,11 +131,11 @@
Type valueType = (holder ? HolderUtils.getValueType(actualType) : actualType);
Class valueClass = JavaUtils.erasure(valueType);
-
+
List<Class> anyTypes = new ArrayList<Class>();
anyTypes.add(javax.xml.soap.SOAPElement.class);
anyTypes.add(org.w3c.dom.Element.class);
-
+
boolean matched;
if (exact)
{
@@ -340,6 +340,12 @@
return index;
}
+ /**
+ * Sets the method parameter index of the parameter this meta data corresponds to. A
value of -1 indicates
+ * that this parameter is mapped to the return value.
+ *
+ * @param index the method parameter offset, or -1 for a return value
+ */
public void setIndex(int index)
{
this.index = index;
Modified: trunk/jbossws-core/src/main/java/org/jboss/ws/tools/jaxws/WSDLGenerator.java
===================================================================
---
trunk/jbossws-core/src/main/java/org/jboss/ws/tools/jaxws/WSDLGenerator.java 2007-01-11
15:40:23 UTC (rev 1935)
+++
trunk/jbossws-core/src/main/java/org/jboss/ws/tools/jaxws/WSDLGenerator.java 2007-01-12
06:19:37 UTC (rev 1936)
@@ -186,12 +186,24 @@
ParameterMetaData returnParameter = operation.getReturnParameter();
if (returnParameter != null)
{
- output.setElement(returnParameter.getXmlName());
- output.setPartName(returnParameter.getPartName());
+ QName xmlName = returnParameter.getXmlName();
+ String partName = returnParameter.getPartName();
+ if (returnParameter.isInHeader())
+ {
+ WSDLSOAPHeader header = new WSDLSOAPHeader(xmlName, partName);
+ header.setIncludeInSignature(true);
+ bindingOutput.addSoapHeader(header);
+ }
+ else
+ {
+ output.setElement(xmlName);
+ output.setPartName(partName);
+ }
addSignatureItem(interfaceOperation, returnParameter, true);
}
- // If there is no return parameter, it will be set later with an INOUT or OUT
parameter
+ // If there is no return parameter, it will most likely be set later with an
INOUT or OUT parameter.
+ // Otherwise, a null element means there is a 0 body element part, which is
allowed by BP 1.0
interfaceOperation.addOutput(output);
bindingOperation.addOutput(bindingOutput);
}
@@ -246,12 +258,23 @@
bindingOutput = new WSDLBindingOperationOutput(bindingOperation);
output.setElement(new QName(operationName.getNamespaceURI(),
operationName.getLocalPart() + "Response"));
- ParameterMetaData returnParam = operation.getReturnParameter();
- if (returnParam != null)
+ ParameterMetaData returnParameter = operation.getReturnParameter();
+ if (returnParameter != null)
{
- WSDLRPCPart part = new WSDLRPCPart(returnParam.getPartName(),
returnParam.getXmlType());
- output.addChildPart(part);
- addSignatureItem(interfaceOperation, returnParam, true);
+ QName xmlName = returnParameter.getXmlName();
+ String partName = returnParameter.getPartName();
+ if (returnParameter.isInHeader())
+ {
+ WSDLSOAPHeader header = new WSDLSOAPHeader(xmlName, partName);
+ header.setIncludeInSignature(true);
+ bindingOutput.addSoapHeader(header);
+ }
+ else
+ {
+ WSDLRPCPart part = new WSDLRPCPart(returnParameter.getPartName(),
returnParameter.getXmlType());
+ output.addChildPart(part);
+ }
+ addSignatureItem(interfaceOperation, returnParameter, true);
}
interfaceOperation.addOutput(output);