You are viewing a plain text version of this content. The canonical link for it is here.
Posted to soap-dev@xml.apache.org by wc...@locus.apache.org on 2000/11/29 00:02:07 UTC
cvs commit: xml-soap/java/src/org/apache/soap/util/xml XMLJavaMappingRegistry.java
wcloeten 00/11/28 15:02:06
Modified: java/src/org/apache/soap/encoding SOAPMappingRegistry.java
java/src/org/apache/soap/encoding/soapenc
ParameterSerializer.java
java/src/org/apache/soap/util/xml
XMLJavaMappingRegistry.java
Log:
unmarshall hooks for MIME multipart support
Revision Changes Path
1.12 +49 -46 xml-soap/java/src/org/apache/soap/encoding/SOAPMappingRegistry.java
Index: SOAPMappingRegistry.java
===================================================================
RCS file: /home/cvs/xml-soap/java/src/org/apache/soap/encoding/SOAPMappingRegistry.java,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -r1.11 -r1.12
--- SOAPMappingRegistry.java 2000/09/05 03:47:24 1.11
+++ SOAPMappingRegistry.java 2000/11/28 23:02:03 1.12
@@ -92,11 +92,14 @@
private static final QName byteQName = new QName(schemaURI, "byte");
private static final QName qNameQName = new QName(schemaURI, "QName");
private static final QName arrayQName = new QName(soapEncURI, "Array");
+ private static final QName objectQName = new QName(
+ Constants.NS_URI_SCHEMA_XSD, "ur-type");
private final ParameterSerializer paramSer = new ParameterSerializer();
private final ArraySerializer arraySer = new ArraySerializer();
private final VectorSerializer vectorSer = new VectorSerializer();
private final MapSerializer mapSer = new MapSerializer();
+ public static final MimePartSerializer partSer = new MimePartSerializer();
private final XMLParameterSerializer xmlParamSer =
new XMLParameterSerializer();
@@ -109,17 +112,34 @@
// Register array deserializer for SOAP-ENC encoding style.
mapTypes(soapEncURI, arrayQName, null, null, arraySer);
+ // Register parameter serializer for literal xml encoding style.
+ mapTypes(Constants.NS_URI_LITERAL_XML, RPCConstants.Q_ELEM_PARAMETER,
+ Parameter.class, xmlParamSer, xmlParamSer);
+
+ /*
+ * Register inputstreams, data handlers, data sources as Mime parts.
+ * The order is important! When deserializing an array of these objects,
+ * DataHandler must be the target class.
+ * Note that the QName is set to ur-type, so an array of attachments
+ * will be serialized as that type. It is crucial that
+ * java.lang.Object is mapped to ur-type behind this section.
+ */
+ mapTypes(soapEncURI, objectQName, javax.mail.internet.MimeBodyPart.class,
+ partSer, null);
+ mapTypes(soapEncURI, objectQName, java.io.InputStream.class,
+ partSer, null);
+ mapTypes(soapEncURI, objectQName, javax.activation.DataSource.class,
+ partSer, null);
+ mapTypes(soapEncURI, objectQName, javax.activation.DataHandler.class,
+ partSer, null);
+
/*
Map xsd:ur-type to java.lang.Object (no serializer/deserializer,
just an association).
*/
- mapTypes(Constants.NS_URI_SOAP_ENC,
- new QName(Constants.NS_URI_SCHEMA_XSD, "ur-type"),
+ mapTypes(Constants.NS_URI_SOAP_ENC, objectQName,
Object.class, null, null);
- // Register parameter serializer for literal xml encoding style.
- mapTypes(Constants.NS_URI_LITERAL_XML, RPCConstants.Q_ELEM_PARAMETER,
- Parameter.class, xmlParamSer, xmlParamSer);
try {
Class XMISerializer =
@@ -139,6 +159,7 @@
} catch (IllegalAccessException iae) {
} catch (InstantiationException ie) {
} catch (ClassNotFoundException cnfe) {
+ } catch (NoClassDefFoundError ncdfe) {
// If the class can't be loaded, continue without it...
@@ -149,8 +170,7 @@
public void marshall(String inScopeEncStyle, Class javaType, Object src,
Object context, Writer sink, NSStack nsStack,
XMLJavaMappingRegistry xjmr)
- throws IllegalArgumentException, IOException
- {
+ throws IllegalArgumentException, IOException {
nsStack.pushScope();
SoapEncUtils.generateStructureHeader(inScopeEncStyle,
@@ -166,48 +186,30 @@
}
};
- Deserializer deser = new Deserializer()
- {
+ Deserializer deser = new Deserializer() {
public Bean unmarshall(String inScopeEncStyle, QName elementType,
Node src, XMLJavaMappingRegistry xjmr)
- throws IllegalArgumentException
- {
+ throws IllegalArgumentException {
Element root = (Element)src;
String value = DOMUtils.getChildCharacterData(root);
- if (elementType.equals(stringQName))
- {
+ if (elementType.equals(stringQName)) {
return new Bean(String.class, value);
- }
- else if (elementType.equals(booleanQName))
- {
+ } else if (elementType.equals(booleanQName)) {
return new Bean(boolean.class, new Boolean(value));
- }
- else if (elementType.equals(doubleQName))
- {
+ } else if (elementType.equals(doubleQName)) {
return new Bean(double.class, new Double(value));
- }
- else if (elementType.equals(floatQName))
- {
+ } else if (elementType.equals(floatQName)) {
return new Bean(float.class, new Float(value));
- }
- else if (elementType.equals(longQName))
- {
+ } else if (elementType.equals(longQName)) {
return new Bean(long.class, new Long(value));
- }
- else if (elementType.equals(intQName))
- {
+ } else if (elementType.equals(intQName)) {
return new Bean(int.class, new Integer(value));
- }
- else if (elementType.equals(shortQName))
- {
+ } else if (elementType.equals(shortQName)) {
return new Bean(short.class, new Short(value));
- }
- else if (elementType.equals(byteQName))
- {
+ } else if (elementType.equals(byteQName)) {
return new Bean(byte.class, new Byte(value));
}
-
throw new IllegalArgumentException("I don't know how to " +
"deserialize a '" + elementType +
"' using encoding style '" +
@@ -241,13 +243,14 @@
mapTypes(soapEncURI, shortQName, short.class, ser, deser);
mapTypes(soapEncURI, byteQName, Byte.class, ser, null);
mapTypes(soapEncURI, byteQName, byte.class, ser, deser);
-
- QNameSerializer qSer = new QNameSerializer();
- mapTypes(soapEncURI, qNameQName, QName.class, qSer, qSer);
-
- /** Basic collection types - these should map fine to Perl, Python, C++...
- * (but an encoding like this needs to be agreed upon)
- */
+
+ QNameSerializer qSer = new QNameSerializer();
+ mapTypes(soapEncURI, qNameQName, QName.class, qSer, qSer);
+
+ /**
+ * Basic collection types - these should map fine to Perl, Python, C++...
+ * (but an encoding like this needs to be agreed upon)
+ */
mapTypes(soapEncURI, new QName(Constants.NS_URI_XML_SOAP, "Vector"),
Vector.class, vectorSer, vectorSer);
mapTypes(soapEncURI, new QName(Constants.NS_URI_XML_SOAP, "Map"),
@@ -258,8 +261,8 @@
*/
Base64Serializer base64Ser = new Base64Serializer();
QName base64QName = new QName(soapEncURI, "base64");
- mapTypes(soapEncURI, base64QName, byte[].class, base64Ser, base64Ser);
+ mapTypes(soapEncURI, base64QName, byte[].class, base64Ser, base64Ser);
}
/**
@@ -312,9 +315,9 @@
&& encodingStyleURI != null
&& encodingStyleURI.equals(soapEncURI))
{
- if (javaType.isArray()) {
- return arraySer;
- }
+ if (javaType.isArray()) {
+ return arraySer;
+ }
}
throw e;
}
1.4 +23 -8 xml-soap/java/src/org/apache/soap/encoding/soapenc/ParameterSerializer.java
Index: ParameterSerializer.java
===================================================================
RCS file: /home/cvs/xml-soap/java/src/org/apache/soap/encoding/soapenc/ParameterSerializer.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- ParameterSerializer.java 2000/09/01 03:52:46 1.3
+++ ParameterSerializer.java 2000/11/28 23:02:05 1.4
@@ -109,14 +109,29 @@
{
Element paramEl = (Element)src;
String name = paramEl.getTagName();
- QName soapType = SoapEncUtils.getAttributeValue(paramEl,
- Constants.NS_URI_SCHEMA_XSI, Constants.ATTR_TYPE, "parameter", true);
- Bean bean = (SoapEncUtils.isNull(paramEl)
- && !new QName(Constants.NS_URI_SOAP_ENC,
- "Array").equals(soapType)
- ? new Bean(xjmr.queryJavaType(soapType, inScopeEncStyle),
- null)
- : xjmr.unmarshall(inScopeEncStyle, soapType, paramEl));
+ Bean bean;
+
+ // If the element contains an href= parameter, shortcut to
+ // MimePartSerializer.
+ String href = paramEl.getAttribute(Constants.ATTR_REFERENCE);
+ if(href != null && !href.equals(""))
+ {
+ bean = (new MimePartSerializer()).unmarshall(inScopeEncStyle,
+ elementType, src, xjmr);
+ }
+ else {
+ QName soapType = SoapEncUtils.getAttributeValue(paramEl,
+ Constants.NS_URI_SCHEMA_XSI,
+ Constants.ATTR_TYPE,
+ "parameter", true);
+ bean = (SoapEncUtils.isNull(paramEl)
+ && !new QName(Constants.NS_URI_SOAP_ENC,
+ "Array").equals(soapType)
+ ? new Bean(xjmr.queryJavaType(soapType, inScopeEncStyle),
+ null)
+ : xjmr.unmarshall(inScopeEncStyle, soapType, paramEl));
+ }
+
Parameter parameter = new Parameter(name, bean.type,
bean.value, null);
1.4 +17 -2 xml-soap/java/src/org/apache/soap/util/xml/XMLJavaMappingRegistry.java
Index: XMLJavaMappingRegistry.java
===================================================================
RCS file: /home/cvs/xml-soap/java/src/org/apache/soap/util/xml/XMLJavaMappingRegistry.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- XMLJavaMappingRegistry.java 2000/09/01 03:53:11 1.3
+++ XMLJavaMappingRegistry.java 2000/11/28 23:02:05 1.4
@@ -61,6 +61,10 @@
import java.util.*;
import org.w3c.dom.*;
import org.apache.soap.util.*;
+import org.apache.soap.Constants;
+import org.apache.soap.rpc.SOAPContext;
+import org.apache.soap.encoding.soapenc.MimePartSerializer;
+import org.apache.soap.encoding.SOAPMappingRegistry;
/**
* An <code>XMLJavaMappingRegistry</code> ...
@@ -211,8 +215,19 @@
public Bean unmarshall(String inScopeEncStyle, QName elementType, Node src)
throws IllegalArgumentException
{
- Deserializer ds = (Deserializer)queryDeserializer(elementType,
- inScopeEncStyle);
+ Deserializer ds = null;
+ try {
+ ds = (Deserializer)queryDeserializer(elementType,
+ inScopeEncStyle);
+ } catch(IllegalArgumentException iae) {
+ // If the element contains an href= parameter and could not be
+ // resolved , use MimePartSerializer.
+ String href = ((Element)src).getAttribute(Constants.ATTR_REFERENCE);
+ if (href != null && !href.equals(""))
+ ds = SOAPMappingRegistry.partSer;
+ else
+ throw iae;
+ }
return ds.unmarshall(inScopeEncStyle, elementType, src, this);
}