Author: thomas.diesler(a)jboss.com
Date: 2007-03-26 18:22:44 -0400 (Mon, 26 Mar 2007)
New Revision: 2687
Modified:
branches/jbossws-1.2.1/jbossws-core/src/java/org/jboss/ws/core/CommonSOAPBinding.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/jaxrpc/binding/SerializerSupport.java
branches/jbossws-1.2.1/jbossws-core/src/java/org/jboss/ws/core/soap/ObjectContent.java
branches/jbossws-1.2.1/jbossws-core/src/java/org/jboss/ws/metadata/umdm/ParameterMetaData.java
Log:
Fix soap array serializer
Modified:
branches/jbossws-1.2.1/jbossws-core/src/java/org/jboss/ws/core/CommonSOAPBinding.java
===================================================================
---
branches/jbossws-1.2.1/jbossws-core/src/java/org/jboss/ws/core/CommonSOAPBinding.java 2007-03-26
17:47:39 UTC (rev 2686)
+++
branches/jbossws-1.2.1/jbossws-core/src/java/org/jboss/ws/core/CommonSOAPBinding.java 2007-03-26
22:22:44 UTC (rev 2687)
@@ -722,8 +722,6 @@
}
Name soapName = new NameImpl(xmlName.getLocalPart(), xmlName.getPrefix(),
xmlName.getNamespaceURI());
- if (paramMetaData.isSOAPArrayParam())
- soapName = new NameImpl("Array", Constants.PREFIX_SOAP11_ENC,
Constants.URI_SOAP11_ENC);
SOAPContentElement contentElement;
if (soapElement instanceof SOAPHeader)
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-26
17:47:39 UTC (rev 2686)
+++
branches/jbossws-1.2.1/jbossws-core/src/java/org/jboss/ws/core/jaxrpc/binding/SOAPArraySerializer.java 2007-03-26
22:22:44 UTC (rev 2687)
@@ -30,6 +30,8 @@
import org.jboss.ws.Constants;
import org.jboss.ws.WSException;
import org.jboss.ws.core.jaxrpc.TypeMappingImpl;
+import org.jboss.ws.core.soap.NameImpl;
+import org.jboss.ws.core.soap.SOAPContentElement;
import org.jboss.ws.core.soap.XMLFragment;
import org.jboss.ws.core.utils.JavaUtils;
import org.jboss.ws.metadata.umdm.ParameterMetaData;
@@ -46,10 +48,10 @@
// provide logging
private static final Logger log = Logger.getLogger(SOAPArraySerializer.class);
+ private ParameterMetaData paramMetaData;
private SerializerSupport compSerializer;
private NullValueSerializer nullSerializer;
private boolean isArrayComponentType;
- private boolean xsiNamespaceInserted;
private StringBuilder buffer;
public SOAPArraySerializer() throws BindingException
@@ -57,16 +59,26 @@
nullSerializer = new NullValueSerializer();
}
- /**
- */
+ public Result serialize(SOAPContentElement soapElement, SerializationContext
serContext) throws BindingException
+ {
+ paramMetaData = soapElement.getParamMetaData();
+ QName xmlName = soapElement.getElementQName();
+ QName xmlType = soapElement.getXmlType();
+ Object value = soapElement.getObjectValue();
+ NamedNodeMap attributes = soapElement.getAttributes();
+ return serialize(xmlName, xmlType, value, serContext, attributes);
+ }
+
public Result serialize(QName xmlName, QName xmlType, Object value,
SerializationContext serContext, NamedNodeMap attributes) throws BindingException
{
- if(log.isDebugEnabled()) log.debug("serialize: [xmlName=" + xmlName +
",xmlType=" + xmlType + ",valueType=" + value.getClass().getName() +
"]");
+ log.debug("serialize: [xmlName=" + xmlName + ",xmlType=" +
xmlType + ",valueType=" + value.getClass().getName() + "]");
try
{
- ParameterMetaData paramMetaData =
(ParameterMetaData)serContext.getProperty(ParameterMetaData.class.getName());
+ if (paramMetaData == null)
+ throw new IllegalStateException("Use serialize(SOAPContenentElement,
SerializationContext)");
+
+ QName compXmlName = paramMetaData.getXmlName();
QName compXmlType = paramMetaData.getSOAPArrayCompType();
- QName compXmlName = paramMetaData.getXmlName();
Class javaType = paramMetaData.getJavaType();
Class compJavaType = javaType.getComponentType();
@@ -88,7 +100,7 @@
throw new WSException("Cannot obtain component xmlType for: " +
compJavaType);
// Get the component type serializer factory
- if(log.isDebugEnabled()) log.debug("Get component serializer for:
[javaType=" + compJavaType.getName() + ",xmlType=" + compXmlType +
"]");
+ log.debug("Get component serializer for: [javaType=" +
compJavaType.getName() + ",xmlType=" + compXmlType + "]");
SerializerFactoryBase compSerializerFactory =
(SerializerFactoryBase)typeMapping.getSerializer(compJavaType, compXmlType);
if (compSerializerFactory == null)
{
@@ -105,36 +117,41 @@
if (JavaUtils.isPrimitive(value.getClass()))
value = JavaUtils.getWrapperValueArray(value);
- buffer = new StringBuilder("<" + Constants.PREFIX_SOAP11_ENC +
":Array "+
-
"xmlns:"+Constants.PREFIX_SOAP11_ENC+"='http://schemas.xmlsoap.org/soap/encoding/'
");
+ String nodeName = new NameImpl(compXmlName).getQualifiedName();
- if (value instanceof Object[])
- {
- Object[] objArr = (Object[])value;
- String arrayDim = "" + objArr.length;
+ buffer = new StringBuilder("<" + nodeName + " xmlns:" +
Constants.PREFIX_SOAP11_ENC + "='http://schemas.xmlsoap.org/soap/encoding/'
");
- // Get multiple array dimension
- Object[] subArr = (Object[])value;
- while (isArrayComponentType == false && subArr.length > 0
&& subArr[0] instanceof Object[])
- {
- subArr = (Object[])subArr[0];
- arrayDim += "," + subArr.length;
- }
+ if (!(value instanceof Object[]))
+ throw new WSException("Unsupported array type: " + javaType);
- compXmlType = serContext.getNamespaceRegistry().registerQName(compXmlType);
- String arrayType = Constants.PREFIX_SOAP11_ENC + ":arrayType='"
+ compXmlType.getPrefix() + ":" + compXmlType.getLocalPart() + "[" +
arrayDim + "]'";
- String compns = " xmlns:" + compXmlType.getPrefix() +
"='" + compXmlType.getNamespaceURI() + "'";
- buffer.append(arrayType + compns + ">");
+ Object[] objArr = (Object[])value;
+ String arrayDim = "" + objArr.length;
- serializeArrayComponents(compXmlName, compXmlType, serContext, objArr);
- }
- else
+ // Get multiple array dimension
+ Object[] subArr = (Object[])value;
+ while (isArrayComponentType == false && subArr.length > 0 &&
subArr[0] instanceof Object[])
{
- throw new WSException("Unsupported array type: " + javaType);
+ subArr = (Object[])subArr[0];
+ arrayDim += "," + subArr.length;
}
- buffer.append("</" + Constants.PREFIX_SOAP11_ENC +
":Array>");
- if(log.isDebugEnabled()) log.debug("serialized: " + buffer);
+ compXmlType = serContext.getNamespaceRegistry().registerQName(compXmlType);
+ compXmlName = serContext.getNamespaceRegistry().registerQName(compXmlName);
+ String arrayType = Constants.PREFIX_SOAP11_ENC + ":arrayType='" +
compXmlType.getPrefix() + ":" + compXmlType.getLocalPart() + "[" +
arrayDim + "]'";
+
+ buffer.append(arrayType);
+ buffer.append(" xmlns:" + Constants.PREFIX_XSI + "='" +
Constants.NS_SCHEMA_XSI + "'");
+ 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() + "'");
+
+ buffer.append(">");
+
+ serializeArrayComponents(compXmlName, compXmlType, serContext, objArr);
+
+ buffer.append("</" + nodeName + ">");
+
+ log.debug("serialized: " + buffer);
return stringToResult(buffer.toString());
}
catch (RuntimeException e)
@@ -147,13 +164,13 @@
}
}
- private void serializeArrayComponents(QName compXmlName, QName compXmlType,
SerializationContext serContext, Object[] objArr) throws BindingException
+ private void serializeArrayComponents(QName xmlName, QName xmlType,
SerializationContext serContext, Object[] objArr) throws BindingException
{
for (Object compValue : objArr)
{
if (isArrayComponentType == false && compValue instanceof Object[])
{
- serializeArrayComponents(compXmlName, compXmlType, serContext,
(Object[])compValue);
+ serializeArrayComponents(xmlName, xmlType, serContext, (Object[])compValue);
}
else
{
@@ -163,15 +180,9 @@
if (compValue == null)
{
ser = nullSerializer;
- if (xsiNamespaceInserted == false)
- {
- xsiNamespaceInserted = true;
- int insIndex = ("<" + Constants.PREFIX_SOAP11_ENC +
":Array ").length();
- buffer.insert(insIndex, "xmlns:" + Constants.PREFIX_XSI +
"='" + Constants.NS_SCHEMA_XSI + "' ");
- }
}
- Result result = ser.serialize(compXmlName, compXmlType, compValue,
serContext, null);
+ Result result = ser.serialize(new QName("item"), xmlType,
compValue, serContext, null);
XMLFragment fragment = new XMLFragment(result);
buffer.append(fragment.toStringFragment());
}
Modified:
branches/jbossws-1.2.1/jbossws-core/src/java/org/jboss/ws/core/jaxrpc/binding/SerializerSupport.java
===================================================================
---
branches/jbossws-1.2.1/jbossws-core/src/java/org/jboss/ws/core/jaxrpc/binding/SerializerSupport.java 2007-03-26
17:47:39 UTC (rev 2686)
+++
branches/jbossws-1.2.1/jbossws-core/src/java/org/jboss/ws/core/jaxrpc/binding/SerializerSupport.java 2007-03-26
22:22:44 UTC (rev 2687)
@@ -34,6 +34,7 @@
import org.jboss.util.NotImplementedException;
import org.jboss.ws.Constants;
import org.jboss.ws.WSException;
+import org.jboss.ws.core.soap.SOAPContentElement;
import org.jboss.ws.core.utils.IOUtils;
import org.jboss.xb.binding.NamespaceRegistry;
import org.w3c.dom.NamedNodeMap;
@@ -48,24 +49,37 @@
*/
public abstract class SerializerSupport implements Serializer
{
+
+ public Result serialize(SOAPContentElement soapElement, SerializationContext
serContext) throws BindingException
+ {
+ QName xmlName = soapElement.getElementQName();
+ QName xmlType = soapElement.getXmlType();
+ NamedNodeMap attributes = soapElement.getAttributes();
+ Object objectValue = soapElement.getObjectValue();
+ return serialize(xmlName, xmlType, objectValue, serContext, attributes);
+ }
+
/** Serialize an object value to an XML fragment
*
* @param xmlName The root element name of the resulting fragment
* @param xmlType The associated schema type
* @param value The value to serialize
* @param serContext The serialization context
- * @param attributes TODO
* @param attributes The attributes on this element
*/
public abstract Result serialize(QName xmlName, QName xmlType, Object value,
SerializationContext serContext, NamedNodeMap attributes) throws BindingException;
- protected Result stringToResult(String xmlFragment) {
+ protected Result stringToResult(String xmlFragment)
+ {
BufferedStreamResult result = null;
- try {
+ try
+ {
ByteArrayInputStream in = new ByteArrayInputStream(xmlFragment.getBytes());
result = new BufferedStreamResult();
IOUtils.copyStream(result.getOutputStream(), in);
- } catch (IOException e) {
+ }
+ catch (IOException e)
+ {
WSException.rethrow(e);
}
@@ -74,7 +88,8 @@
/** Wrap the value string in a XML fragment with the given name
*/
- protected String wrapValueStr(QName xmlName, String valueStr, NamespaceRegistry
nsRegistry, Set<String> additionalNamespaces, NamedNodeMap attributes, boolean
normalize)
+ protected String wrapValueStr(QName xmlName, String valueStr, NamespaceRegistry
nsRegistry, Set<String> additionalNamespaces, NamedNodeMap attributes,
+ boolean normalize)
{
String nsURI = xmlName.getNamespaceURI();
String localPart = xmlName.getLocalPart();
@@ -125,7 +140,7 @@
}
else
{
- if(normalize)
+ if (normalize)
valueStr = normalize(valueStr);
xmlFragment = "<" + elName + nsAttr + ">" + valueStr +
"</" + elName + ">";
}
Modified:
branches/jbossws-1.2.1/jbossws-core/src/java/org/jboss/ws/core/soap/ObjectContent.java
===================================================================
---
branches/jbossws-1.2.1/jbossws-core/src/java/org/jboss/ws/core/soap/ObjectContent.java 2007-03-26
17:47:39 UTC (rev 2686)
+++
branches/jbossws-1.2.1/jbossws-core/src/java/org/jboss/ws/core/soap/ObjectContent.java 2007-03-26
22:22:44 UTC (rev 2687)
@@ -123,7 +123,6 @@
{
QName xmlType = container.getXmlType();
Class javaType = container.getJavaType();
- QName xmlName = container.getElementQName();
log.debug("getXMLFragment from Object [xmlType=" + xmlType +
",javaType=" + javaType + "]");
@@ -132,7 +131,6 @@
throw new WSException("MessageContext not available");
SerializationContext serContext = msgContext.getSerializationContext();
- serContext.setProperty(ParameterMetaData.class.getName(),
container.getParamMetaData());
serContext.setJavaType(javaType);
TypeMappingImpl typeMapping = serContext.getTypeMapping();
@@ -150,7 +148,8 @@
ser = new NullValueSerializer();
}
- Result result = ser.serialize(xmlName, xmlType, getObjectValue(), serContext,
null);
+ Result result = ser.serialize(container, serContext);
+
xmlFragment = new XMLFragment(result);
log.debug("xmlFragment: " + xmlFragment);
}
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-26
17:47:39 UTC (rev 2686)
+++
branches/jbossws-1.2.1/jbossws-core/src/java/org/jboss/ws/metadata/umdm/ParameterMetaData.java 2007-03-26
22:22:44 UTC (rev 2687)
@@ -40,8 +40,8 @@
import org.jboss.ws.core.jaxws.DynamicWrapperGenerator;
import org.jboss.ws.core.utils.HolderUtils;
import org.jboss.ws.core.utils.JavaUtils;
+import org.jboss.ws.extensions.xop.jaxws.AttachmentScanResult;
import org.jboss.ws.extensions.xop.jaxws.ReflectiveAttachmentRefScanner;
-import org.jboss.ws.extensions.xop.jaxws.AttachmentScanResult;
import org.jboss.ws.metadata.acessor.ReflectiveMethodAccessor;
import org.jboss.ws.metadata.umdm.EndpointMetaData.Type;
@@ -548,29 +548,30 @@
buffer.append("\n xmlName=" + getXmlName());
buffer.append("\n partName=" + getPartName());
buffer.append("\n xmlType=" + getXmlType());
+
+ if (soapArrayParam)
+ buffer.append("\n soapArrayCompType=" + soapArrayCompType);
+
buffer.append("\n javaType=" + getJavaTypeName());
buffer.append("\n mode=" + getMode());
buffer.append("\n inHeader=" + isInHeader());
buffer.append("\n index=" + index);
- if (soapArrayParam)
- buffer.append("\n soapArrayCompType=" + soapArrayCompType);
-
if (isSwA())
{
buffer.append("\n isSwA=" + isSwA());
buffer.append("\n mimeTypes=" + getMimeTypes());
}
- if (wrappedParameters != null)
- buffer.append("\n wrappedParameters=" + wrappedParameters);
-
if (isXOP())
{
buffer.append("\n isXOP=" + isXOP());
buffer.append("\n mimeTypes=" + getMimeTypes());
}
+ if (wrappedParameters != null)
+ buffer.append("\n wrappedParameters=" + wrappedParameters);
+
return buffer.toString();
}
}