Author: thomas.diesler(a)jboss.com
Date: 2007-03-27 18:26:52 -0400 (Tue, 27 Mar 2007)
New Revision: 2698
Modified:
branches/jbossws-1.2.1/jbossws-core/src/java/org/jboss/ws/core/jaxrpc/TypeMappingImpl.java
branches/jbossws-1.2.1/jbossws-core/src/java/org/jboss/ws/core/jaxrpc/binding/SOAPArrayDeserializer.java
branches/jbossws-1.2.1/jbossws-core/src/java/org/jboss/ws/core/jaxrpc/binding/SOAPArraySerializer.java
branches/jbossws-1.2.1/jbossws-core/src/java/org/jboss/ws/core/soap/HRefInlineHandler.java
branches/jbossws-1.2.1/jbossws-core/src/java/org/jboss/ws/metadata/builder/jaxrpc/JAXRPCMetaDataBuilder.java
branches/jbossws-1.2.1/jbossws-core/src/java/org/jboss/ws/metadata/umdm/ParameterMetaData.java
Log:
Fix soap Array compXMLType detection
Modified:
branches/jbossws-1.2.1/jbossws-core/src/java/org/jboss/ws/core/jaxrpc/TypeMappingImpl.java
===================================================================
---
branches/jbossws-1.2.1/jbossws-core/src/java/org/jboss/ws/core/jaxrpc/TypeMappingImpl.java 2007-03-27
19:40:09 UTC (rev 2697)
+++
branches/jbossws-1.2.1/jbossws-core/src/java/org/jboss/ws/core/jaxrpc/TypeMappingImpl.java 2007-03-27
22:26:52 UTC (rev 2698)
@@ -294,6 +294,18 @@
return xmlType;
}
+ /** Get the QNames that was registered last for this javaType */
+ public List<QName> getXMLTypes(Class javaType)
+ {
+ List<QName> xmlTypes = new ArrayList<QName>();
+
+ for (KeyPair kPair : getKeyPairs(null, javaType))
+ {
+ xmlTypes.add(kPair.getXmlType().toQName());
+ }
+ return xmlTypes;
+ }
+
/**
* Get the QName that was registered last for this javaType
* @param javaType class for which XML Type is needed
Modified:
branches/jbossws-1.2.1/jbossws-core/src/java/org/jboss/ws/core/jaxrpc/binding/SOAPArrayDeserializer.java
===================================================================
---
branches/jbossws-1.2.1/jbossws-core/src/java/org/jboss/ws/core/jaxrpc/binding/SOAPArrayDeserializer.java 2007-03-27
19:40:09 UTC (rev 2697)
+++
branches/jbossws-1.2.1/jbossws-core/src/java/org/jboss/ws/core/jaxrpc/binding/SOAPArrayDeserializer.java 2007-03-27
22:26:52 UTC (rev 2698)
@@ -62,25 +62,22 @@
try
{
ParameterMetaData paramMetaData =
(ParameterMetaData)serContext.getProperty(ParameterMetaData.class.getName());
- QName compXmlType = paramMetaData.getSOAPArrayCompType();
- int[] arrDims = getDimensionsFromAttribute(soapElement);
- Class compJavaType = getComponentTypeFromAttribute(soapElement, serContext);
- Object[] retArray = (Object[])Array.newInstance(compJavaType, arrDims);
+ QName compXmlType = getComponentTypeFromAttribute(soapElement);
+ paramMetaData.setSOAPArrayCompType(compXmlType);
- TypeMappingImpl typeMapping = serContext.getTypeMapping();
if (compXmlType == null)
- {
- compXmlType = typeMapping.getXMLType(compJavaType);
- paramMetaData.setSOAPArrayCompType(compXmlType);
- }
+ throw new WSException("Cannot obtain component xmlType: " +
paramMetaData.getPartName());
- if (compXmlType == null)
- throw new WSException("Cannot obtain component xmlType for: " +
compJavaType);
+ Class compJavaType = getJavaTypeForComponentType(compXmlType, serContext);
// Get the component type deserializer factory
log.debug("Get component deserializer for: [javaType=" +
compJavaType.getName() + ",xmlType=" + compXmlType + "]");
+ int[] arrDims = getDimensionsFromAttribute(soapElement);
+ Object[] retArray = (Object[])Array.newInstance(compJavaType, arrDims);
+
+ TypeMappingImpl typeMapping = serContext.getTypeMapping();
DeserializerFactoryBase compDeserializerFactory =
(DeserializerFactoryBase)typeMapping.getDeserializer(compJavaType, compXmlType);
if (compDeserializerFactory == null)
{
@@ -163,7 +160,7 @@
return arrDims;
}
- private Class getComponentTypeFromAttribute(Element arrayElement, SerializationContext
serContext)
+ private QName getComponentTypeFromAttribute(Element arrayElement)
{
QName attrQName = new QName(Constants.URI_SOAP11_ENC, "arrayType");
QName arrayType = DOMUtils.getAttributeValueAsQName(arrayElement, attrQName);
@@ -175,6 +172,11 @@
int dimIndex = localPart.indexOf("[");
QName compXmlType = new QName(nsURI, localPart.substring(0, dimIndex));
+ return compXmlType;
+ }
+
+ private Class getJavaTypeForComponentType(QName compXmlType, SerializationContext
serContext)
+ {
TypeMappingImpl typeMapping = serContext.getTypeMapping();
Class javaType = typeMapping.getJavaType(compXmlType);
if (javaType == null)
Modified:
branches/jbossws-1.2.1/jbossws-core/src/java/org/jboss/ws/core/jaxrpc/binding/SOAPArraySerializer.java
===================================================================
---
branches/jbossws-1.2.1/jbossws-core/src/java/org/jboss/ws/core/jaxrpc/binding/SOAPArraySerializer.java 2007-03-27
19:40:09 UTC (rev 2697)
+++
branches/jbossws-1.2.1/jbossws-core/src/java/org/jboss/ws/core/jaxrpc/binding/SOAPArraySerializer.java 2007-03-27
22:26:52 UTC (rev 2698)
@@ -119,7 +119,7 @@
String nodeName = new NameImpl(compXmlName).getQualifiedName();
- buffer = new StringBuilder("<" + nodeName + " xmlns:" +
Constants.PREFIX_SOAP11_ENC + "='http://schemas.xmlsoap.org/soap/encoding/'
");
+ buffer = new StringBuilder("<" + nodeName + " xmlns:" +
Constants.PREFIX_SOAP11_ENC + "='" + Constants.URI_SOAP11_ENC + "'
");
if (!(value instanceof Object[]))
throw new WSException("Unsupported array type: " + javaType);
@@ -141,7 +141,8 @@
buffer.append(arrayType);
buffer.append(" xmlns:" + Constants.PREFIX_XSI + "='" +
Constants.NS_SCHEMA_XSI + "'");
- buffer.append(" xmlns:" + compXmlType.getPrefix() + "='"
+ compXmlType.getNamespaceURI() + "'");
+ if (compXmlType.getNamespaceURI().equals(Constants.URI_SOAP11_ENC) == false)
+ buffer.append(" xmlns:" + compXmlType.getPrefix() +
"='" + compXmlType.getNamespaceURI() + "'");
if (compXmlName.getNamespaceURI().length() > 0 &&
compXmlName.getNamespaceURI().equals(compXmlType.getNamespaceURI()) == false)
buffer.append(" xmlns:" + compXmlName.getPrefix() +
"='" + compXmlName.getNamespaceURI() + "'");
Modified:
branches/jbossws-1.2.1/jbossws-core/src/java/org/jboss/ws/core/soap/HRefInlineHandler.java
===================================================================
---
branches/jbossws-1.2.1/jbossws-core/src/java/org/jboss/ws/core/soap/HRefInlineHandler.java 2007-03-27
19:40:09 UTC (rev 2697)
+++
branches/jbossws-1.2.1/jbossws-core/src/java/org/jboss/ws/core/soap/HRefInlineHandler.java 2007-03-27
22:26:52 UTC (rev 2698)
@@ -30,8 +30,10 @@
import javax.xml.soap.SOAPBodyElement;
import javax.xml.soap.SOAPElement;
import javax.xml.soap.SOAPException;
+import javax.xml.soap.Text;
import org.jboss.logging.Logger;
+import org.jboss.ws.core.utils.DOMUtils;
import org.jboss.ws.core.utils.DOMWriter;
import org.w3c.dom.Attr;
import org.w3c.dom.Element;
@@ -48,6 +50,7 @@
// provide logging
private static Logger log = Logger.getLogger(HRefInlineHandler.class);
+ private SOAPFactoryImpl soapFactory = new SOAPFactoryImpl();
private SOAPBody soapBody;
public HRefInlineHandler(SOAPBody soapBody)
@@ -60,19 +63,16 @@
String bodyStr = DOMWriter.printNode(soapBody, true);
log.debug("Begin processHRefs:\n" + bodyStr);
+ SOAPBodyElement bodyElement = (SOAPBodyElement)soapBody.getChildElements().next();
+ processElement(bodyElement);
+
Iterator it = soapBody.getChildElements();
while (it.hasNext())
{
- // Process the first body element, remove the others
+ // Remove id elements
SOAPElement soapElement = (SOAPElement)it.next();
- if (soapElement instanceof SOAPBodyElement)
- {
- processElement(soapElement);
- }
- else
- {
+ if ((soapElement instanceof SOAPBodyElement) == false)
soapBody.removeChild(soapElement);
- }
}
bodyStr = DOMWriter.printNode(soapBody, true);
@@ -100,7 +100,7 @@
private void processHRef(SOAPElement hrefElement, String href) throws SOAPException
{
- SOAPContentElement idElement = null;
+ SOAPElement idElement = null;
Iterator it = soapBody.getChildElements();
while (it.hasNext())
@@ -108,7 +108,7 @@
SOAPElement auxElement = (SOAPElement)it.next();
if (href.equals("#" + auxElement.getAttribute("id")))
{
- idElement = (SOAPContentElement)auxElement;
+ idElement = (SOAPElement)auxElement;
break;
}
}
@@ -119,20 +119,26 @@
// process nested hrefs
processElement(idElement);
- // Remove old content
- hrefElement.removeContents();
-
// Copy most attributes, except id
copyMostAttributes(hrefElement, idElement);
// Append id element children
- if (idElement.getChildElements().hasNext())
+ if (DOMUtils.hasChildElements(idElement))
{
Iterator itid = idElement.getChildElements();
while (itid.hasNext())
{
Node childNode = (Node)itid.next();
- hrefElement.appendChild(childNode);
+ if (childNode instanceof SOAPElement)
+ {
+ SOAPElement childClone = soapFactory.createElement((SOAPElement)childNode,
true);
+ hrefElement.addChildElement(childClone);
+ }
+ else if (childNode instanceof Text)
+ {
+ String value = childNode.getValue();
+ hrefElement.setValue(value);
+ }
}
}
// If no children, copy the value
Modified:
branches/jbossws-1.2.1/jbossws-core/src/java/org/jboss/ws/metadata/builder/jaxrpc/JAXRPCMetaDataBuilder.java
===================================================================
---
branches/jbossws-1.2.1/jbossws-core/src/java/org/jboss/ws/metadata/builder/jaxrpc/JAXRPCMetaDataBuilder.java 2007-03-27
19:40:09 UTC (rev 2697)
+++
branches/jbossws-1.2.1/jbossws-core/src/java/org/jboss/ws/metadata/builder/jaxrpc/JAXRPCMetaDataBuilder.java 2007-03-27
22:26:52 UTC (rev 2698)
@@ -37,6 +37,7 @@
import org.jboss.logging.Logger;
import org.jboss.ws.Constants;
import org.jboss.ws.WSException;
+import org.jboss.ws.core.jaxrpc.EncodedTypeMapping;
import org.jboss.ws.core.jaxrpc.LiteralTypeMapping;
import org.jboss.ws.core.jaxrpc.Style;
import org.jboss.ws.core.jaxrpc.TypeMappingImpl;
@@ -63,7 +64,6 @@
import org.jboss.ws.metadata.umdm.TypeMappingMetaData;
import org.jboss.ws.metadata.umdm.TypesMetaData;
import org.jboss.ws.metadata.umdm.WrappedParameter;
-import org.jboss.ws.metadata.wsdl.WSDLBinding;
import org.jboss.ws.metadata.wsdl.WSDLBindingOperation;
import org.jboss.ws.metadata.wsdl.WSDLBindingOperationInput;
import org.jboss.ws.metadata.wsdl.WSDLBindingOperationOutput;
@@ -371,6 +371,7 @@
}
}
+ setupSOAPArrayParameter(outMetaData);
return outMetaData;
}
@@ -483,7 +484,17 @@
if (xmlTypeLocalPart.indexOf("ArrayOfArrayOf") >= 0)
compJavaType = compJavaType.getComponentType();
- QName compXMLType = new LiteralTypeMapping().getXMLType(compJavaType);
+ boolean isSoapEnc =
xmlTypeLocalPart.toLowerCase().indexOf("soapenc") > 0;
+ TypeMappingImpl typeMapping = isSoapEnc ? new EncodedTypeMapping() : new
LiteralTypeMapping();
+ QName compXMLType = typeMapping.getXMLType(compJavaType);
+
+ if (compXMLType != null)
+ {
+ boolean isBase64 =
compXMLType.getLocalPart().startsWith("base64");
+ if (isBase64 &&
xmlTypeLocalPart.toLowerCase().indexOf("hex") > 0)
+ compXMLType = isSoapEnc ? Constants.TYPE_SOAP11_HEXBINARY :
Constants.TYPE_LITERAL_HEXBINARY;
+ }
+
paramMetaData.setSOAPArrayCompType(compXMLType);
}
catch (ClassNotFoundException e)
@@ -839,6 +850,7 @@
}
setupXOPAttachmentParameter(wsdlOperation, outMetaData);
+ setupSOAPArrayParameter(outMetaData);
}
if (hasReturnMapping)
Modified:
branches/jbossws-1.2.1/jbossws-core/src/java/org/jboss/ws/metadata/umdm/ParameterMetaData.java
===================================================================
---
branches/jbossws-1.2.1/jbossws-core/src/java/org/jboss/ws/metadata/umdm/ParameterMetaData.java 2007-03-27
19:40:09 UTC (rev 2697)
+++
branches/jbossws-1.2.1/jbossws-core/src/java/org/jboss/ws/metadata/umdm/ParameterMetaData.java 2007-03-27
22:26:52 UTC (rev 2698)
@@ -367,9 +367,15 @@
return soapArrayCompType;
}
- public void setSOAPArrayCompType(QName xmlType)
+ public void setSOAPArrayCompType(QName compXmlType)
{
- this.soapArrayCompType = xmlType;
+ if (compXmlType != null && !compXmlType.equals(soapArrayCompType))
+ {
+ String logmsg = "SOAPArrayCompType: [xmlType=" + xmlType +
",compType=" + compXmlType + "]";
+ log.debug((soapArrayCompType == null ? "set" : "reset") +
logmsg);
+ }
+
+ this.soapArrayCompType = compXmlType;
}