Author: jason.greene(a)jboss.com
Date: 2007-01-17 10:29:14 -0500 (Wed, 17 Jan 2007)
New Revision: 1989
Modified:
trunk/jbossws-core/src/main/java/org/jboss/ws/core/EndpointInvocation.java
trunk/jbossws-core/src/main/java/org/jboss/ws/core/jaxrpc/binding/Base64Serializer.java
trunk/jbossws-core/src/main/java/org/jboss/ws/core/jaxrpc/binding/CalendarSerializer.java
trunk/jbossws-core/src/main/java/org/jboss/ws/core/jaxrpc/binding/DateSerializer.java
trunk/jbossws-core/src/main/java/org/jboss/ws/core/jaxrpc/binding/HexSerializer.java
trunk/jbossws-core/src/main/java/org/jboss/ws/core/jaxrpc/binding/NullValueSerializer.java
trunk/jbossws-core/src/main/java/org/jboss/ws/core/jaxrpc/binding/QNameSerializer.java
trunk/jbossws-core/src/main/java/org/jboss/ws/core/jaxrpc/binding/SerializationContext.java
trunk/jbossws-core/src/main/java/org/jboss/ws/core/jaxrpc/binding/SerializerSupport.java
trunk/jbossws-core/src/main/java/org/jboss/ws/core/jaxrpc/binding/SimpleSerializer.java
trunk/jbossws-core/src/main/java/org/jboss/ws/core/jaxws/JAXBDeserializer.java
trunk/jbossws-core/src/main/java/org/jboss/ws/core/jaxws/JAXBSerializer.java
trunk/jbossws-core/src/main/java/org/jboss/ws/core/jaxws/SOAPFaultHelperJAXWS.java
trunk/jbossws-core/src/main/java/org/jboss/ws/core/soap/SOAPContentElement.java
trunk/jbossws-core/src/main/java/org/jboss/ws/metadata/umdm/EndpointMetaData.java
Log:
Fixed JBCTS-453 - jaxws/ee/w2j/document/literal/marshalltest
Fixed QNameSerializer to handle ns declarations correctly
Enhanced wrapValueStr to allow for additional ns declarations
Added support for marshalling java.lang.Object with JAXB
Added the notion of context types to the SerializationContext
Fixed type substitution in JAXBSerializer/JAXBDeserializer
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-17
14:46:03 UTC (rev 1988)
+++ trunk/jbossws-core/src/main/java/org/jboss/ws/core/EndpointInvocation.java 2007-01-17
15:29:14 UTC (rev 1989)
@@ -47,6 +47,7 @@
import org.jboss.ws.metadata.umdm.OperationMetaData;
import org.jboss.ws.metadata.umdm.ParameterMetaData;
import org.jboss.ws.metadata.umdm.WrappedParameter;
+import org.w3c.dom.Element;
/** A web service invocation.
*
@@ -187,7 +188,7 @@
{
QName xmlName = paramMetaData.getXmlName();
QName xmlType = paramMetaData.getXmlType();
- Class javaType = paramMetaData.getJavaType();
+ Class<?> javaType = paramMetaData.getJavaType();
String javaName = paramMetaData.getJavaTypeName();
if (xmlType == null)
@@ -229,8 +230,11 @@
}
else if (paramValue instanceof SOAPContentElement)
{
- // For type other than xsd:anyType we return the object value
- if (xmlType.getLocalPart().equals("anyType") == false)
+ // If this is bound to a SOAPElement, or Element, then we can return
+ // the content element as is.
+ // Note, that it is possible for a Java type to be bound to an any
+ // type, so checking the xml type is not sufficient.
+ if (! Element.class.isAssignableFrom(javaType))
{
SOAPContentElement soapElement = (SOAPContentElement)paramValue;
retValue = soapElement.getObjectValue();
Modified:
trunk/jbossws-core/src/main/java/org/jboss/ws/core/jaxrpc/binding/Base64Serializer.java
===================================================================
---
trunk/jbossws-core/src/main/java/org/jboss/ws/core/jaxrpc/binding/Base64Serializer.java 2007-01-17
14:46:03 UTC (rev 1988)
+++
trunk/jbossws-core/src/main/java/org/jboss/ws/core/jaxrpc/binding/Base64Serializer.java 2007-01-17
15:29:14 UTC (rev 1989)
@@ -63,13 +63,13 @@
xopObject.setContentType("application/octet-stream");
String cid = xopMarshaller.addMtomAttachment(xopObject,
xmlName.getNamespaceURI(), xmlType.getLocalPart() );
String xopInclude = "<xop:Include
xmlns:xop='http://www.w3.org/2004/08/xop/include'
href='"+cid+"'/>";
- xmlFragment = wrapValueStr(xmlName, xopInclude, nsRegistry, attributes, false);
+ xmlFragment = wrapValueStr(xmlName, xopInclude, nsRegistry, null, attributes,
false);
}
else
{
value = JavaUtils.getPrimitiveValueArray(value);
String valueStr = SimpleTypeBindings.marshalBase64((byte[])value);
- xmlFragment = wrapValueStr(xmlName, valueStr, nsRegistry, attributes, true);
+ xmlFragment = wrapValueStr(xmlName, valueStr, nsRegistry, null, attributes,
true);
}
return xmlFragment;
}
Modified:
trunk/jbossws-core/src/main/java/org/jboss/ws/core/jaxrpc/binding/CalendarSerializer.java
===================================================================
---
trunk/jbossws-core/src/main/java/org/jboss/ws/core/jaxrpc/binding/CalendarSerializer.java 2007-01-17
14:46:03 UTC (rev 1988)
+++
trunk/jbossws-core/src/main/java/org/jboss/ws/core/jaxrpc/binding/CalendarSerializer.java 2007-01-17
15:29:14 UTC (rev 1989)
@@ -48,11 +48,11 @@
public String serialize(QName xmlName, QName xmlType, Object value,
SerializationContext serContext, NamedNodeMap attributes) throws BindingException
{
log.debug("serialize: [xmlName=" + xmlName + ",xmlType=" +
xmlType + "]");
-
+
String valueStr = SimpleTypeBindings.marshalDateTime((Calendar)value);
NamespaceRegistry nsRegistry = serContext.getNamespaceRegistry();
- String xmlFragment = wrapValueStr(xmlName, valueStr, nsRegistry, attributes,
true);
+ String xmlFragment = wrapValueStr(xmlName, valueStr, nsRegistry, null, attributes,
true);
return xmlFragment;
}
}
Modified:
trunk/jbossws-core/src/main/java/org/jboss/ws/core/jaxrpc/binding/DateSerializer.java
===================================================================
---
trunk/jbossws-core/src/main/java/org/jboss/ws/core/jaxrpc/binding/DateSerializer.java 2007-01-17
14:46:03 UTC (rev 1988)
+++
trunk/jbossws-core/src/main/java/org/jboss/ws/core/jaxrpc/binding/DateSerializer.java 2007-01-17
15:29:14 UTC (rev 1989)
@@ -62,7 +62,7 @@
String valueStr = SimpleTypeBindings.marshalDateTime((Calendar)value);
NamespaceRegistry nsRegistry = serContext.getNamespaceRegistry();
- String xmlFragment = wrapValueStr(xmlName, valueStr, nsRegistry, attributes,
true);
+ String xmlFragment = wrapValueStr(xmlName, valueStr, nsRegistry, null, attributes,
true);
return xmlFragment;
}
}
Modified:
trunk/jbossws-core/src/main/java/org/jboss/ws/core/jaxrpc/binding/HexSerializer.java
===================================================================
---
trunk/jbossws-core/src/main/java/org/jboss/ws/core/jaxrpc/binding/HexSerializer.java 2007-01-17
14:46:03 UTC (rev 1988)
+++
trunk/jbossws-core/src/main/java/org/jboss/ws/core/jaxrpc/binding/HexSerializer.java 2007-01-17
15:29:14 UTC (rev 1989)
@@ -54,7 +54,7 @@
String valueStr = SimpleTypeBindings.marshalHexBinary((byte[])value);
NamespaceRegistry nsRegistry = serContext.getNamespaceRegistry();
- String xmlFragment = wrapValueStr(xmlName, valueStr, nsRegistry, attributes,
true);
+ String xmlFragment = wrapValueStr(xmlName, valueStr, nsRegistry, null, attributes,
true);
return xmlFragment;
}
}
Modified:
trunk/jbossws-core/src/main/java/org/jboss/ws/core/jaxrpc/binding/NullValueSerializer.java
===================================================================
---
trunk/jbossws-core/src/main/java/org/jboss/ws/core/jaxrpc/binding/NullValueSerializer.java 2007-01-17
14:46:03 UTC (rev 1988)
+++
trunk/jbossws-core/src/main/java/org/jboss/ws/core/jaxrpc/binding/NullValueSerializer.java 2007-01-17
15:29:14 UTC (rev 1989)
@@ -46,13 +46,13 @@
/**
* Serializes an object null value.
- *
+ *
* If a message part of an RPC parameter is defined like this
- *
+ *
* <message name='SomeMessage'>
* <part name='partName' element='someElement'/>
* </message>
- *
+ *
* it is possible that the element definition does not allow
* null values. In that case an error should be generated.
*/
@@ -62,7 +62,7 @@
NamespaceRegistry nsRegistry = serContext.getNamespaceRegistry();
nsRegistry.registerURI(Constants.NS_SCHEMA_XSI, Constants.PREFIX_XSI);
- String xmlFragment = wrapValueStr(xmlName, null, nsRegistry, attributes, true);
+ String xmlFragment = wrapValueStr(xmlName, null, nsRegistry, null, attributes,
true);
return xmlFragment;
}
}
Modified:
trunk/jbossws-core/src/main/java/org/jboss/ws/core/jaxrpc/binding/QNameSerializer.java
===================================================================
---
trunk/jbossws-core/src/main/java/org/jboss/ws/core/jaxrpc/binding/QNameSerializer.java 2007-01-17
14:46:03 UTC (rev 1988)
+++
trunk/jbossws-core/src/main/java/org/jboss/ws/core/jaxrpc/binding/QNameSerializer.java 2007-01-17
15:29:14 UTC (rev 1989)
@@ -23,12 +23,12 @@
// $Id$
+import java.util.HashSet;
+import java.util.Set;
+
import javax.xml.namespace.QName;
import org.jboss.logging.Logger;
-import org.jboss.ws.core.jaxrpc.binding.BindingException;
-import org.jboss.ws.core.jaxrpc.binding.SerializationContext;
-import org.jboss.ws.core.jaxrpc.binding.SerializerSupport;
import org.jboss.xb.binding.NamespaceRegistry;
import org.jboss.xb.binding.SimpleTypeBindings;
import org.w3c.dom.NamedNodeMap;
@@ -52,26 +52,19 @@
String nsURI = qnameValue.getNamespaceURI();
NamespaceRegistry nsRegistry = serContext.getNamespaceRegistry();
-
+ Set<String> additionalNamespaces = new HashSet<String>();
// Remove prefix and register again
if (nsURI.length() > 0)
{
- qnameValue = new QName(qnameValue.getNamespaceURI(),
qnameValue.getLocalPart());
+ qnameValue = new QName(nsURI, qnameValue.getLocalPart());
qnameValue = nsRegistry.registerQName(qnameValue);
+ if (!nsURI.equals(xmlName.getNamespaceURI()))
+ additionalNamespaces.add(nsURI);
}
String valueStr = SimpleTypeBindings.marshalQName(qnameValue, nsRegistry);
- String xmlFragment = wrapValueStr(xmlName, valueStr, nsRegistry, attributes,
true);
- // Insert the NS declaration for the qnameValue
- if (nsURI.length() > 0)
- {
- StringBuilder buffer = new StringBuilder(xmlFragment);
- int indexGT = xmlFragment.indexOf(">");
- String prefix = qnameValue.getPrefix();
- buffer.insert(indexGT, " xmlns:" + prefix + "='" + nsURI
+ "'");
- xmlFragment = buffer.toString();
- }
+ String xmlFragment = wrapValueStr(xmlName, valueStr, nsRegistry,
additionalNamespaces, attributes, true);
return xmlFragment;
}
Modified:
trunk/jbossws-core/src/main/java/org/jboss/ws/core/jaxrpc/binding/SerializationContext.java
===================================================================
---
trunk/jbossws-core/src/main/java/org/jboss/ws/core/jaxrpc/binding/SerializationContext.java 2007-01-17
14:46:03 UTC (rev 1988)
+++
trunk/jbossws-core/src/main/java/org/jboss/ws/core/jaxrpc/binding/SerializationContext.java 2007-01-17
15:29:14 UTC (rev 1989)
@@ -31,12 +31,14 @@
/**
* An abstract serialization context
- *
+ *
* @author Thomas.Diesler(a)jboss.org
* @since 04-Dec-2004
*/
public abstract class SerializationContext
{
+ public static final String CONTEXT_TYPES =
"org.jboss.ws.jaxrpc.binding.contextTypes";
+
// The type mapping that is valid for this serialization context
private TypeMappingImpl typeMapping;
// The namespace registry that is valid for this serialization context
Modified:
trunk/jbossws-core/src/main/java/org/jboss/ws/core/jaxrpc/binding/SerializerSupport.java
===================================================================
---
trunk/jbossws-core/src/main/java/org/jboss/ws/core/jaxrpc/binding/SerializerSupport.java 2007-01-17
14:46:03 UTC (rev 1988)
+++
trunk/jbossws-core/src/main/java/org/jboss/ws/core/jaxrpc/binding/SerializerSupport.java 2007-01-17
15:29:14 UTC (rev 1989)
@@ -23,6 +23,8 @@
// $Id$
+import java.util.Set;
+
import javax.xml.namespace.QName;
import javax.xml.rpc.encoding.Serializer;
@@ -54,11 +56,10 @@
/** Wrap the value string in a XML fragment with the given name
*/
- protected String wrapValueStr(QName xmlName, String valueStr, NamespaceRegistry
nsRegistry, 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();
- String prefix = xmlName.getPrefix();
StringBuilder nsAttr = new StringBuilder("");
if (attributes != null)
@@ -76,20 +77,28 @@
if (nsURI.length() > 0)
{
xmlName = nsRegistry.registerQName(xmlName);
- prefix = xmlName.getPrefix();
+ String prefix = xmlName.getPrefix();
elName = prefix + ":" + localPart;
- String xmlns = " xmlns:" + prefix + "='" + nsURI +
"'";
- if (nsAttr.indexOf(xmlns) < 0)
- {
- nsAttr.append(xmlns);
- }
+ nsAttr.append(" xmlns:" + prefix + "='" + nsURI +
"'");
}
else
{
elName = localPart;
}
+ if (additionalNamespaces != null)
+ {
+ for (String ns : additionalNamespaces)
+ {
+ if (ns.equals(nsURI))
+ continue;
+
+ String prefix = nsRegistry.getPrefix(ns);
+ nsAttr.append(" xmlns:" + prefix + "='" + ns +
"'");
+ }
+ }
+
String xmlFragment;
if (valueStr == null)
{
Modified:
trunk/jbossws-core/src/main/java/org/jboss/ws/core/jaxrpc/binding/SimpleSerializer.java
===================================================================
---
trunk/jbossws-core/src/main/java/org/jboss/ws/core/jaxrpc/binding/SimpleSerializer.java 2007-01-17
14:46:03 UTC (rev 1988)
+++
trunk/jbossws-core/src/main/java/org/jboss/ws/core/jaxrpc/binding/SimpleSerializer.java 2007-01-17
15:29:14 UTC (rev 1989)
@@ -68,7 +68,7 @@
valueStr = SimpleTypeBindings.marshal(xmlType.getLocalPart(), value,
nsRegistry);
}
- String xmlFragment = wrapValueStr(xmlName, valueStr, nsRegistry, attributes,
true);
+ String xmlFragment = wrapValueStr(xmlName, valueStr, nsRegistry, null, attributes,
true);
return xmlFragment;
}
}
Modified: trunk/jbossws-core/src/main/java/org/jboss/ws/core/jaxws/JAXBDeserializer.java
===================================================================
---
trunk/jbossws-core/src/main/java/org/jboss/ws/core/jaxws/JAXBDeserializer.java 2007-01-17
14:46:03 UTC (rev 1988)
+++
trunk/jbossws-core/src/main/java/org/jboss/ws/core/jaxws/JAXBDeserializer.java 2007-01-17
15:29:14 UTC (rev 1989)
@@ -24,6 +24,7 @@
// $Id$
import java.io.ByteArrayInputStream;
+import java.util.List;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
@@ -38,6 +39,7 @@
import org.jboss.ws.core.jaxrpc.binding.ComplexTypeDeserializer;
import org.jboss.ws.core.jaxrpc.binding.SerializationContext;
import org.jboss.ws.extensions.xop.jaxws.AttachmentUnmarshallerImpl;
+import org.jboss.ws.metadata.umdm.ParameterMetaData;
/**
* A Deserializer that can handle complex types by delegating to JAXB.
@@ -55,23 +57,25 @@
}
@Override
- public Object deserialize(QName xmlName, QName xmlType, String val,
SerializationContext serContext)
+ public Object deserialize(QName xmlName, QName xmlType, String val,
SerializationContext serContext)
{
log.debug("deserialize: [xmlName=" + xmlName + ",xmlType=" +
xmlType + "]");
Object value = null;
try
{
+ Class[] types =
(Class[])serContext.getProperty(SerializationContext.CONTEXT_TYPES);
+
TypeMappingImpl typeMapping = serContext.getTypeMapping();
Class javaType = typeMapping.getJavaType(xmlType);
- JAXBContext jaxbContext = JAXBContext.newInstance(javaType);
+ JAXBContext jaxbContext = JAXBContext.newInstance(types);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
unmarshaller.setAttachmentUnmarshaller( new AttachmentUnmarshallerImpl());
-
+
ByteArrayInputStream ins = new
ByteArrayInputStream(val.getBytes("UTF-8"));
JAXBElement jbe = unmarshaller.unmarshal(new StreamSource(ins), javaType);
value = jbe.getValue();
-
+
log.debug("deserialized: " + (value != null ?
value.getClass().getName() : null));
}
catch (Exception ex)
@@ -82,14 +86,14 @@
}
- // 4.21 Conformance (Marshalling failure): If an error occurs when using the supplied
JAXBContext to marshall
+ // 4.21 Conformance (Marshalling failure): If an error occurs when using the supplied
JAXBContext to marshall
// a request or unmarshall a response, an implementation MUST throw a
WebServiceException whose
// cause is set to the original JAXBException.
private void handleUnmarshallException(Exception ex)
{
if (ex instanceof WebServiceException)
throw (WebServiceException)ex;
-
+
throw new WebServiceException(ex);
}
}
Modified: trunk/jbossws-core/src/main/java/org/jboss/ws/core/jaxws/JAXBSerializer.java
===================================================================
---
trunk/jbossws-core/src/main/java/org/jboss/ws/core/jaxws/JAXBSerializer.java 2007-01-17
14:46:03 UTC (rev 1988)
+++
trunk/jbossws-core/src/main/java/org/jboss/ws/core/jaxws/JAXBSerializer.java 2007-01-17
15:29:14 UTC (rev 1989)
@@ -75,7 +75,7 @@
{
if(JavaUtils.isAssignableFrom(type, value.getClass()))
{
- javaType = value.getClass();
+ javaType = type;
break;
}
}
@@ -91,9 +91,9 @@
JAXBContext jaxbContext = JAXBContext.newInstance(javaType);
Marshaller marshaller = jaxbContext.createMarshaller();
- marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
+ marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
marshaller.setAttachmentMarshaller(new AttachmentMarshallerImpl());
-
+
StringWriter strwr = new StringWriter();
marshaller.marshal(new JAXBElement(xmlName, javaType, value), strwr);
xmlFragment = strwr.toString();
@@ -106,15 +106,15 @@
}
return xmlFragment;
}
-
- // 4.21 Conformance (Marshalling failure): If an error occurs when using the supplied
JAXBContext to marshall
+
+ // 4.21 Conformance (Marshalling failure): If an error occurs when using the supplied
JAXBContext to marshall
// a request or unmarshall a response, an implementation MUST throw a
WebServiceException whose
// cause is set to the original JAXBException.
private void handleMarshallException(Exception ex)
{
if (ex instanceof WebServiceException)
throw (WebServiceException)ex;
-
+
throw new WebServiceException(ex);
}
}
Modified:
trunk/jbossws-core/src/main/java/org/jboss/ws/core/jaxws/SOAPFaultHelperJAXWS.java
===================================================================
---
trunk/jbossws-core/src/main/java/org/jboss/ws/core/jaxws/SOAPFaultHelperJAXWS.java 2007-01-17
14:46:03 UTC (rev 1988)
+++
trunk/jbossws-core/src/main/java/org/jboss/ws/core/jaxws/SOAPFaultHelperJAXWS.java 2007-01-17
15:29:14 UTC (rev 1989)
@@ -95,7 +95,7 @@
//
http://jira.jboss.org/jira/browse/JBWS-955
// Cannot deserialize fault detail
String prefix = deElement.getPrefix();
- if (prefix.length() > 0)
+ if (prefix != null && prefix.length() > 0)
{
String nsURI = deElement.getNamespaceURI();
String attrValue = deElement.getAttribute("xmlns:" +
prefix);
@@ -115,6 +115,9 @@
// Try jaxb deserialization
try
{
+ Class[] types =
opMetaData.getEndpointMetaData().getRegisteredTypes().toArray(new Class[0]);
+ serContext.setProperty(SerializationContext.CONTEXT_TYPES, types);
+
String xmlFragment = DOMWriter.printNode(deElement, false);
DeserializerSupport des =
(DeserializerSupport)desFactory.getDeserializer();
Object faultBean = des.deserialize(xmlName, xmlType, xmlFragment,
serContext);
Modified: trunk/jbossws-core/src/main/java/org/jboss/ws/core/soap/SOAPContentElement.java
===================================================================
---
trunk/jbossws-core/src/main/java/org/jboss/ws/core/soap/SOAPContentElement.java 2007-01-17
14:46:03 UTC (rev 1988)
+++
trunk/jbossws-core/src/main/java/org/jboss/ws/core/soap/SOAPContentElement.java 2007-01-17
15:29:14 UTC (rev 1989)
@@ -30,6 +30,7 @@
import java.lang.reflect.Array;
import java.lang.reflect.Method;
import java.util.Iterator;
+import java.util.List;
import javax.activation.DataHandler;
import javax.activation.DataSource;
@@ -249,7 +250,10 @@
throw new WSException("MessageContext not available");
SerializationContext serContext = msgContext.getSerializationContext();
- serContext.setProperty(ParameterMetaData.class.getName(), getParamMetaData());
+ ParameterMetaData pmd = getParamMetaData();
+ serContext.setProperty(ParameterMetaData.class.getName(), pmd);
+ List<Class> registeredTypes =
pmd.getOperationMetaData().getEndpointMetaData().getRegisteredTypes();
+ serContext.setProperty(SerializationContext.CONTEXT_TYPES,
registeredTypes.toArray(new Class[0]));
try
{
@@ -323,7 +327,7 @@
if(!JavaUtils.isAssignableFrom(javaType, obj.getClass()))
{
- throw new WSException("Java type '" + javaType +
"' is not assignable from: " + objType.getName());
+ throw new WSException("Java type '" + javaType +
"' is not assignable from: " + objType.getName());
}
}
}
Modified:
trunk/jbossws-core/src/main/java/org/jboss/ws/metadata/umdm/EndpointMetaData.java
===================================================================
---
trunk/jbossws-core/src/main/java/org/jboss/ws/metadata/umdm/EndpointMetaData.java 2007-01-17
14:46:03 UTC (rev 1988)
+++
trunk/jbossws-core/src/main/java/org/jboss/ws/metadata/umdm/EndpointMetaData.java 2007-01-17
15:29:14 UTC (rev 1989)
@@ -24,7 +24,14 @@
// $Id$
import java.lang.reflect.Method;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Observable;
+import java.util.Properties;
import javax.jws.soap.SOAPBinding.ParameterStyle;
import javax.xml.namespace.QName;
@@ -114,6 +121,8 @@
private boolean handlersInitialized;
// Maps the java method to the operation meta data
private Map<Method, OperationMetaData> opMetaDataCache = new HashMap<Method,
OperationMetaData>();
+ // All of the registered types
+ private List<Class> registeredTypes = new ArrayList<Class>();
private ConfigObservable configObservable = new ConfigObservable();
@@ -510,16 +519,18 @@
private void eagerInitializeTypes()
{
TypeMappingImpl typeMapping = serviceMetaData.getTypeMapping();
- for (TypeMappingMetaData tmMetaData :
serviceMetaData.getTypesMetaData().getTypeMappings())
+ List<TypeMappingMetaData> typeMappings =
serviceMetaData.getTypesMetaData().getTypeMappings();
+ registeredTypes = new ArrayList<Class>(typeMappings.size());
+ for (TypeMappingMetaData tmMetaData : typeMappings)
{
String javaTypeName = tmMetaData.getJavaTypeName();
QName xmlType = tmMetaData.getXmlType();
if (xmlType != null)
{
- List<Class> registeredTypes = typeMapping.getJavaTypes(xmlType);
+ List<Class> types = typeMapping.getJavaTypes(xmlType);
boolean registered = false;
- for (Class current : registeredTypes) {
+ for (Class current : types) {
if (current.getName().equals(javaTypeName))
{
registered = true;
@@ -537,6 +548,9 @@
if (JavaUtils.isPrimitive(javaTypeName))
javaType = JavaUtils.getWrapperType(javaType);
+ // Needed for runtime JAXB context
+ registeredTypes.add(javaType);
+
if (getEncodingStyle() == Use.ENCODED && javaType.isArray())
{
typeMapping.register(javaType, xmlType, new
SOAPArraySerializerFactory(), new SOAPArrayDeserializerFactory());
@@ -648,6 +662,11 @@
this.configObservable.notifyObservers(configName);
}
+ public List<Class> getRegisteredTypes()
+ {
+ return Collections.unmodifiableList(registeredTypes);
+ }
+
public void update(Observable observable, Object object) {
log.trace("Ingore configuration change notification");
}