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 gd...@apache.org on 2001/03/19 07:20:52 UTC
cvs commit: xml-soap/java/src/org/apache/soap/util/xml DOMUtils.java XMLJavaMappingRegistry.java XMLParserLiaison.java XercesParserLiaison.java
gdaniels 01/03/18 22:20:52
Modified: java/src/org/apache/soap Constants.java Envelope.java
Utils.java
java/src/org/apache/soap/encoding SOAPMappingRegistry.java
java/src/org/apache/soap/encoding/soapenc
ArraySerializer.java MapSerializer.java
ParameterSerializer.java QNameSerializer.java
SoapEncUtils.java UrTypeDeserializer.java
VectorSerializer.java
java/src/org/apache/soap/rpc RPCMessage.java
java/src/org/apache/soap/server DeploymentDescriptor.java
RPCRouter.java TypeMappingSerializer.java
java/src/org/apache/soap/util/xml DOMUtils.java
XMLJavaMappingRegistry.java XMLParserLiaison.java
XercesParserLiaison.java
Log:
A few changes to interop better with Microsoft SOAP stacks,
and also heading towards friendlier behaviour in general.
* We now deserialize (but don't generate) multi-ref accessors.
Check for the "href" attribute in a number of places, and
deserialize the referenced element instead of the ref
itself. This required putting in DOMUtils.getElementByID(),
which really should be dealt with by Xerces, but wasn't
working. If we can get the DOM version working, we can lose
the DOMUtils one, but this works for now, and we'll get
this nailed for Axis anyhow.
* First slice at dealing with multiple Schema URIs. Mostly
changes to Constants and SOAPMappingRegistry - we now will
happily ACCEPT schema types with either the 1999 schema
URIs or the 2000/10 ones. We SEND by default whatever the
Constants.NS_URI_CURRENT_SCHEMA values say. In the future
we should a) be able to set our "default" schema on the fly,
b) correctly respond with whatever schema URIs we were
called with (for the server side), and c) easily deal with
new schema revs if they happen. NOTE: this needs to be
consistency-checked with the 1999 and 2000 XSD specs.
* There is now a new optional attribute in the deployment
descriptor XML - if "checkMustUnderstands='true'" in the
isd:service element, we are being told by the deployer
that no header processing is done by this service. In
this case, to be a good SOAP citizen, we do a quick check
for any headers marked "mustUnderstand='1'" in any messages
we receive, and throw a MustUnderstand fault if we find any.
* Add a read(String sourceDesc, InputStream inStream) method
to XMLParserLiason and XercesParserLiason. This can be used
to hand an InputStream directly to the parser, which will
then happily consume byte-order marks; this is currently
not the case with the Reader-based system. I did not check
in the actual code to use this yet, as I don't fully grok its
effect on the MIME processing code.
* Add a default encoding style to the SOAPMappingRegistry. If
the query*() methods are called with a null encodingStyle
(you aren't technically required to send one), we'll try
whatever this is set to. Right now the RPC code sets this
to SOAP_ENC.
Revision Changes Path
1.15 +65 -2 xml-soap/java/src/org/apache/soap/Constants.java
Index: Constants.java
===================================================================
RCS file: /home/cvs/xml-soap/java/src/org/apache/soap/Constants.java,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -r1.14 -r1.15
--- Constants.java 2001/01/19 09:25:54 1.14
+++ Constants.java 2001/03/19 06:20:50 1.15
@@ -82,10 +82,20 @@
"http://schemas.xmlsoap.org/soap/envelope/";
public static final String NS_URI_SOAP_ENC =
"http://schemas.xmlsoap.org/soap/encoding/";
- public static final String NS_URI_SCHEMA_XSI =
+
+ public static final String NS_URI_1999_SCHEMA_XSI =
"http://www.w3.org/1999/XMLSchema-instance";
- public static final String NS_URI_SCHEMA_XSD =
+ public static final String NS_URI_1999_SCHEMA_XSD =
"http://www.w3.org/1999/XMLSchema";
+ public static final String NS_URI_2000_SCHEMA_XSI =
+ "http://www.w3.org/2000/10/XMLSchema-instance";
+ public static final String NS_URI_2000_SCHEMA_XSD =
+ "http://www.w3.org/2000/10/XMLSchema";
+ public static final String NS_URI_CURRENT_SCHEMA_XSI =
+ NS_URI_1999_SCHEMA_XSI;
+ public static final String NS_URI_CURRENT_SCHEMA_XSD =
+ NS_URI_1999_SCHEMA_XSD;
+
public static final String NS_URI_XML_SOAP =
"http://xml.apache.org/xml-soap";
public static final String NS_URI_XML_SOAP_DEPLOYMENT =
@@ -192,5 +202,58 @@
public static String BAG_HTTPSESSION = "HttpSession" ;
public static String BAG_HTTPSERVLETREQUEST = "HttpServletRequest" ;
public static String BAG_HTTPSERVLETRESPONSE = "HttpServletResponse" ;
+
+ //////////////////////////////////////////////////////
+ // Type QNames for the various schemas
+ public static final QName string1999QName =
+ new QName(Constants.NS_URI_1999_SCHEMA_XSD, "string");
+ public static final QName int1999QName =
+ new QName(Constants.NS_URI_1999_SCHEMA_XSD, "int");
+ public static final QName float1999QName =
+ new QName(Constants.NS_URI_1999_SCHEMA_XSD, "float");
+ public static final QName double1999QName =
+ new QName(Constants.NS_URI_1999_SCHEMA_XSD, "double");
+ public static final QName date1999QName =
+ new QName(Constants.NS_URI_1999_SCHEMA_XSD, "date");
+ public static final QName boolean1999QName =
+ new QName(Constants.NS_URI_1999_SCHEMA_XSD, "boolean");
+ public static final QName long1999QName =
+ new QName(Constants.NS_URI_1999_SCHEMA_XSD, "long");
+ public static final QName short1999QName =
+ new QName(Constants.NS_URI_1999_SCHEMA_XSD, "short");
+ public static final QName byte1999QName =
+ new QName(Constants.NS_URI_1999_SCHEMA_XSD, "byte");
+ public static final QName qName1999QName =
+ new QName(Constants.NS_URI_1999_SCHEMA_XSD, "QName");
+ public static final QName timeInst1999QName =
+ new QName(Constants.NS_URI_1999_SCHEMA_XSD, "timeInstant");
+ public static final QName object1999QName =
+ new QName(Constants.NS_URI_1999_SCHEMA_XSD, "ur-type");
+
+ public static final QName string2000QName =
+ new QName(Constants.NS_URI_2000_SCHEMA_XSD, "string");
+ public static final QName int2000QName =
+ new QName(Constants.NS_URI_2000_SCHEMA_XSD, "int");
+ public static final QName float2000QName =
+ new QName(Constants.NS_URI_2000_SCHEMA_XSD, "float");
+ public static final QName double2000QName =
+ new QName(Constants.NS_URI_2000_SCHEMA_XSD, "double");
+ public static final QName date2000QName =
+ new QName(Constants.NS_URI_2000_SCHEMA_XSD, "date");
+ public static final QName boolean2000QName =
+ new QName(Constants.NS_URI_2000_SCHEMA_XSD, "boolean");
+ public static final QName long2000QName =
+ new QName(Constants.NS_URI_2000_SCHEMA_XSD, "long");
+ public static final QName short2000QName =
+ new QName(Constants.NS_URI_2000_SCHEMA_XSD, "short");
+ public static final QName byte2000QName =
+ new QName(Constants.NS_URI_2000_SCHEMA_XSD, "byte");
+ public static final QName qName2000QName =
+ new QName(Constants.NS_URI_2000_SCHEMA_XSD, "QName");
+ public static final QName timeInst2000QName =
+ new QName(Constants.NS_URI_2000_SCHEMA_XSD, "timeInstant");
+ public static final QName object2000QName =
+ new QName(Constants.NS_URI_2000_SCHEMA_XSD, "anyType");
+
}
1.7 +2 -2 xml-soap/java/src/org/apache/soap/Envelope.java
Index: Envelope.java
===================================================================
RCS file: /home/cvs/xml-soap/java/src/org/apache/soap/Envelope.java,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- Envelope.java 2001/02/14 02:29:27 1.6
+++ Envelope.java 2001/03/19 06:20:50 1.7
@@ -87,11 +87,11 @@
// Declare the "xsi" namespace.
declareNamespace(Constants.NS_PRE_SCHEMA_XSI,
- Constants.NS_URI_SCHEMA_XSI);
+ Constants.NS_URI_CURRENT_SCHEMA_XSI);
// Declare the "xsd" namespace.
declareNamespace(Constants.NS_PRE_SCHEMA_XSD,
- Constants.NS_URI_SCHEMA_XSD);
+ Constants.NS_URI_CURRENT_SCHEMA_XSD);
}
public void setAttribute(QName attrQName, String value)
1.5 +16 -0 xml-soap/java/src/org/apache/soap/Utils.java
Index: Utils.java
===================================================================
RCS file: /home/cvs/xml-soap/java/src/org/apache/soap/Utils.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- Utils.java 2000/09/01 02:38:00 1.4
+++ Utils.java 2001/03/19 06:20:50 1.5
@@ -163,4 +163,20 @@
details.addElement(elem);
return details;
}
+
+ /**
+ * Check for mustUnderstand headers, and throw a mustUnderstand
+ * Fault if we find any.
+ */
+ public static void checkMustUnderstands(Header header) throws SOAPException
+ {
+ System.out.println("Checking mustUnderstands...");
+ Vector entries = header.getHeaderEntries();
+ for (int i = 0; i < entries.size(); i++) {
+ Element el = (Element)entries.elementAt(i);
+ String val = el.getAttributeNS(Constants.NS_URI_SOAP_ENV, Constants.ATTR_MUST_UNDERSTAND);
+ if (val != null && val.equals("1"))
+ throw new SOAPException("mustUnderstand", "Didn't understand header '" + el.getLocalName() + "'");
+ }
+ }
}
1.16 +223 -140 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.15
retrieving revision 1.16
diff -u -r1.15 -r1.16
--- SOAPMappingRegistry.java 2001/02/19 23:34:50 1.15
+++ SOAPMappingRegistry.java 2001/03/19 06:20:50 1.16
@@ -77,39 +77,218 @@
* @author Sanjiva Weerawarana (sanjiva@watson.ibm.com)
* @author Francisco Curbera (curbera@us.ibm.com)
* @author Sam Ruby (rubys@us.ibm.com)
+ * @author Glen Daniels (gdaniels@allaire.com)
*/
public class SOAPMappingRegistry extends XMLJavaMappingRegistry
{
private static final String soapEncURI = Constants.NS_URI_SOAP_ENC;
- private static final String schemaURI = Constants.NS_URI_SCHEMA_XSD;
- private static final QName stringQName = new QName(schemaURI, "string");
- private static final QName booleanQName = new QName(schemaURI, "boolean");
- private static final QName doubleQName = new QName(schemaURI, "double");
- private static final QName floatQName = new QName(schemaURI, "float");
- private static final QName longQName = new QName(schemaURI, "long");
- private static final QName intQName = new QName(schemaURI, "int");
- private static final QName shortQName = new QName(schemaURI, "short");
- 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 timeQName = new QName(schemaURI, "timeInstant");
- private static final QName dateQName = new QName(schemaURI, "date");
- private static final QName objectQName = new QName(
- Constants.NS_URI_SCHEMA_XSD, "ur-type");
+ private final StringDeserializer stringDeser = new StringDeserializer();
+ private final IntDeserializer intDeser = new IntDeserializer();
+ private final FloatDeserializer floatDeser = new FloatDeserializer();
+ private final DoubleDeserializer doubleDeser = new DoubleDeserializer();
+ private final BooleanDeserializer booleanDeser = new BooleanDeserializer();
+ private final LongDeserializer longDeser = new LongDeserializer();
+ private final ShortDeserializer shortDeser = new ShortDeserializer();
+ private final ByteDeserializer byteDeser = new ByteDeserializer();
+
+ private final QNameSerializer qNameSer = new QNameSerializer();
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();
+ new XMLParameterSerializer();
private final DateSerializer dateSer = new DateSerializer();
private final CalendarSerializer calSer = new CalendarSerializer();
private final UrTypeDeserializer objDeser = new UrTypeDeserializer();
+
+ /** The following stuff is here to deal with the slight differences
+ * between 1999 schema and 2000/10 schema. This system allows us to
+ * register type mappings for both sets of QNames, and to default to
+ * whichever one is set as current.
+ *
+ * !!! The order of the elements in these arrays is critical. Be
+ * careful when editing.
+ */
+ QName schema1999QNames [] = {
+ Constants.string1999QName,
+ Constants.int1999QName,
+ Constants.int1999QName,
+ Constants.float1999QName,
+ Constants.float1999QName,
+ Constants.double1999QName,
+ Constants.double1999QName,
+ Constants.boolean1999QName,
+ Constants.boolean1999QName,
+ Constants.long1999QName,
+ Constants.long1999QName,
+ Constants.short1999QName,
+ Constants.short1999QName,
+ Constants.byte1999QName,
+ Constants.byte1999QName,
+ Constants.qName1999QName,
+ Constants.date1999QName,
+ Constants.timeInst1999QName,
+ Constants.object1999QName,
+ Constants.object1999QName,
+ Constants.object1999QName,
+ Constants.object1999QName,
+ Constants.object1999QName,
+ };
+
+ QName schema2000QNames [] = {
+ Constants.string2000QName,
+ Constants.int2000QName,
+ Constants.int2000QName,
+ Constants.float2000QName,
+ Constants.float2000QName,
+ Constants.double2000QName,
+ Constants.double2000QName,
+ Constants.boolean2000QName,
+ Constants.boolean2000QName,
+ Constants.long2000QName,
+ Constants.long2000QName,
+ Constants.short2000QName,
+ Constants.short2000QName,
+ Constants.byte2000QName,
+ Constants.byte2000QName,
+ Constants.qName2000QName,
+ Constants.date2000QName,
+ Constants.timeInst2000QName,
+ Constants.object2000QName,
+ Constants.object2000QName,
+ Constants.object2000QName,
+ Constants.object2000QName,
+ Constants.object2000QName,
+ };
+
+ public String schemaURI = Constants.NS_URI_1999_SCHEMA_XSD;
+ QName [] schemaQNames = schema1999QNames;
+
+ Class classes [] = {
+ String.class,
+ Integer.class,
+ int.class,
+ Float.class,
+ float.class,
+ Double.class,
+ double.class,
+ Boolean.class,
+ boolean.class,
+ Long.class,
+ long.class,
+ Short.class,
+ short.class,
+ Byte.class,
+ byte.class,
+ QName.class,
+ GregorianCalendar.class,
+ Date.class,
+ javax.mail.internet.MimeBodyPart.class,
+ java.io.InputStream.class,
+ javax.activation.DataSource.class,
+ javax.activation.DataHandler.class,
+ Object.class,
+ };
+
+ Serializer ser = new Serializer()
+ {
+ public void marshall(String inScopeEncStyle, Class javaType, Object src,
+ Object context, Writer sink, NSStack nsStack,
+ XMLJavaMappingRegistry xjmr, SOAPContext ctx)
+ throws IllegalArgumentException, IOException {
+ nsStack.pushScope();
+
+ SoapEncUtils.generateStructureHeader(inScopeEncStyle,
+ javaType,
+ context,
+ sink,
+ nsStack,
+ xjmr);
+
+ sink.write(Utils.cleanString(src.toString()) + "</" + context + '>');
+
+ nsStack.popScope();
+ }
+ };
+ Serializer serializers [] = {
+ ser,
+ ser,
+ ser,
+ ser,
+ ser,
+ ser,
+ ser,
+ ser,
+ ser,
+ ser,
+ ser,
+ ser,
+ ser,
+ ser,
+ ser,
+ qNameSer,
+ calSer,
+ dateSer,
+ partSer,
+ partSer,
+ partSer,
+ partSer,
+ null,
+ };
+
+ Deserializer deserializers [] = {
+ stringDeser,
+ null,
+ intDeser,
+ null,
+ floatDeser,
+ null,
+ doubleDeser,
+ null,
+ booleanDeser,
+ null,
+ longDeser,
+ null,
+ shortDeser,
+ null,
+ byteDeser,
+ qNameSer,
+ calSer,
+ dateSer,
+ null,
+ null,
+ null,
+ null,
+ objDeser,
+ };
+
public SOAPMappingRegistry()
{
+ this(Constants.NS_URI_CURRENT_SCHEMA_XSD);
+ }
+
+ public SOAPMappingRegistry(String schemaURI)
+ {
+ // Set up the correct "current" schema typeset.
+ if (schemaURI.equals(Constants.NS_URI_1999_SCHEMA_XSD)) {
+ schemaQNames = schema1999QNames;
+ mapSchemaTypes(schema2000QNames, false);
+ } else if (schemaURI.equals(Constants.NS_URI_2000_SCHEMA_XSD)) {
+ schemaQNames = schema2000QNames;
+ mapSchemaTypes(schema1999QNames, false);
+ } else {
+ System.out.println("WARNING: Unrecognized Schema URI '" + schemaURI +
+ "' specified. Defaulting to ");
+ }
+
+ mapSchemaTypes(schemaQNames, true);
+
// Register parameter serializer for SOAP-ENC encoding style.
mapTypes(soapEncURI, RPCConstants.Q_ELEM_PARAMETER, Parameter.class,
paramSer, paramSer);
@@ -121,36 +300,11 @@
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, objectQName,
- Object.class, null, objDeser);
-
-
try {
Class XMISerializer =
- Class.forName("org.apache.soap.util.xml.XMISerializer");
+ Class.forName("org.apache.soap.util.xml.XMISerializer");
Class XMIParameterSerializer =
- Class.forName("org.apache.soap.encoding.xmi.XMIParameterSerializer");
+ Class.forName("org.apache.soap.encoding.xmi.XMIParameterSerializer");
// Register default serializers for XMI encoding style.
mapTypes(Constants.NS_URI_XMI_ENC, null, null,
@@ -166,114 +320,43 @@
} catch (ClassNotFoundException cnfe) {
} catch (NoClassDefFoundError ncdfe) {
- // If the class can't be loaded, continue without it...
+ // If the class can't be loaded, continue without it...
}
- Serializer ser = new Serializer()
- {
- public void marshall(String inScopeEncStyle, Class javaType, Object src,
- Object context, Writer sink, NSStack nsStack,
- XMLJavaMappingRegistry xjmr, SOAPContext ctx)
- throws IllegalArgumentException, IOException {
- nsStack.pushScope();
-
- SoapEncUtils.generateStructureHeader(inScopeEncStyle,
- javaType,
- context,
- sink,
- nsStack,
- xjmr);
-
- sink.write(Utils.cleanString(src.toString()) + "</" + context + '>');
-
- nsStack.popScope();
- }
- };
-
- Deserializer deser = new Deserializer() {
- public Bean unmarshall(String inScopeEncStyle, QName elementType,
- Node src, XMLJavaMappingRegistry xjmr, SOAPContext ctx)
- throws IllegalArgumentException {
- Element root = (Element)src;
- String value = DOMUtils.getChildCharacterData(root);
-
- if (elementType.equals(stringQName)) {
- return new Bean(String.class, value);
- } else if (elementType.equals(booleanQName)) {
- return new Bean(boolean.class, new Boolean(value));
- } else if (elementType.equals(doubleQName)) {
- return new Bean(double.class, new Double(value));
- } else if (elementType.equals(floatQName)) {
- return new Bean(float.class, new Float(value));
- } else if (elementType.equals(longQName)) {
- return new Bean(long.class, new Long(value));
- } else if (elementType.equals(intQName)) {
- return new Bean(int.class, new Integer(value));
- } else if (elementType.equals(shortQName)) {
- return new Bean(short.class, new Short(value));
- } 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 '" +
- inScopeEncStyle + "'.");
- }
- };
-
- /*
- Register mapping of element type to/from Java type along with
- the serializer and deserializer for it. Note that we register
- the same serializer for primitives and their object wrapper
- counterparts. What this means is that once encoded into
- SOAP_ENC, a primitive int and an Integer, for example, are
- indistinguishable. We believe (at least for now :-)) that this
- is the right thing to do .. that is, upon seeing an element
- like <foo xsi:type="xsd:int">53343</foo> we should always get
- a primitive int out of it.
- */
- mapTypes(soapEncURI, stringQName, String.class, ser, deser);
- mapTypes(soapEncURI, booleanQName, Boolean.class, ser, null);
- mapTypes(soapEncURI, booleanQName, boolean.class, ser, deser);
- mapTypes(soapEncURI, doubleQName, Double.class, ser, null);
- mapTypes(soapEncURI, doubleQName, double.class, ser, deser);
- mapTypes(soapEncURI, floatQName, Float.class, ser, null);
- mapTypes(soapEncURI, floatQName, float.class, ser, deser);
- mapTypes(soapEncURI, longQName, Long.class, ser, null);
- mapTypes(soapEncURI, longQName, long.class, ser, deser);
- mapTypes(soapEncURI, intQName, Integer.class, ser, null);
- mapTypes(soapEncURI, intQName, int.class, ser, deser);
- mapTypes(soapEncURI, shortQName, Short.class, ser, null);
- 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)
- */
+ * 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);
+ Vector.class, vectorSer, vectorSer);
mapTypes(soapEncURI, new QName(Constants.NS_URI_XML_SOAP, "Map"),
- Hashtable.class, mapSer, mapSer);
+ Hashtable.class, mapSer, mapSer);
/*
- Map a Java byte array to the SOAP-ENC:base64 subtype.
+ Map a Java byte array to the SOAP-ENC:base64 subtype.
*/
Base64Serializer base64Ser = new Base64Serializer();
QName base64QName = new QName(soapEncURI, "base64");
mapTypes(soapEncURI, base64QName, byte[].class, base64Ser, base64Ser);
-
- /** Dates
- */
- mapTypes(soapEncURI, timeQName, java.util.Date.class, dateSer, dateSer);
- mapTypes(soapEncURI, dateQName, java.util.GregorianCalendar.class,
- calSer, calSer);
}
+
+ /** Map a set of schema types defined in the arrays above. If
+ * the "serialize" arg is set to true, we'll map the serializer
+ * side (i.e. when output gets generated it'll be as those QNames),
+ * otherwise we just do deserializers.
+ */
+ public void mapSchemaTypes(QName [] schemaQNames, boolean serialize)
+ {
+ for (int i = 0; i < schemaQNames.length; i++) {
+ QName qName = schemaQNames[i];
+ Class cls = classes[i];
+ Serializer ser = serialize ? serializers[i] : null;
+ Deserializer dser = deserializers[i];
+
+ mapTypes(soapEncURI, qName, cls, ser, dser);
+ }
+ }
/**
* This function overrides the one in XMLJavaMappingRegistry for the sole
@@ -325,9 +408,9 @@
&& encodingStyleURI != null
&& encodingStyleURI.equals(soapEncURI))
{
- if (javaType.isArray()) {
- return arraySer;
- }
+ if (javaType.isArray()) {
+ return arraySer;
+ }
}
throw e;
}
1.6 +15 -2 xml-soap/java/src/org/apache/soap/encoding/soapenc/ArraySerializer.java
Index: ArraySerializer.java
===================================================================
RCS file: /home/cvs/xml-soap/java/src/org/apache/soap/encoding/soapenc/ArraySerializer.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- ArraySerializer.java 2001/01/08 12:25:14 1.5
+++ ArraySerializer.java 2001/03/19 06:20:51 1.6
@@ -169,14 +169,27 @@
? declEncStyle
: inScopeEncStyle;
QName declItemType = SoapEncUtils.getAttributeValue(tempEl,
- Constants.NS_URI_SCHEMA_XSI, Constants.ATTR_TYPE, "array item",
+ Constants.NS_URI_CURRENT_SCHEMA_XSI, Constants.ATTR_TYPE, "array item",
false);
QName actualItemType = declItemType != null
? declItemType
: arrayItemType;
+
+ // If it's a local reference, follow it.
+ String href = tempEl.getAttribute(Constants.ATTR_REFERENCE);
+ Element actualEl = tempEl;
+
+ if(href != null && !href.equals("") && (href.charAt(0) == '#'))
+ {
+ href = href.substring(1);
+ actualEl = DOMUtils.getElementByID(src.getOwnerDocument().getDocumentElement(),href);
+ if (actualEl == null) {
+ throw new IllegalArgumentException("No such ID '" + href + "'");
+ }
+ }
Bean itemBean = xjmr.unmarshall(actualEncStyle, actualItemType,
- tempEl, ctx);
+ actualEl, ctx);
Array.set(array, i, itemBean.value);
1.5 +1 -1 xml-soap/java/src/org/apache/soap/encoding/soapenc/MapSerializer.java
Index: MapSerializer.java
===================================================================
RCS file: /home/cvs/xml-soap/java/src/org/apache/soap/encoding/soapenc/MapSerializer.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- MapSerializer.java 2001/01/08 12:25:14 1.4
+++ MapSerializer.java 2001/03/19 06:20:51 1.5
@@ -199,7 +199,7 @@
? declEncStyle
: inScopeEncStyle;
QName declItemType = SoapEncUtils.getAttributeValue(targetEl,
- Constants.NS_URI_SCHEMA_XSI, Constants.ATTR_TYPE, STR_ITEM, false);
+ Constants.NS_URI_CURRENT_SCHEMA_XSI, Constants.ATTR_TYPE, STR_ITEM, false);
return xjmr.unmarshall(actualEncStyle, declItemType, targetEl, ctx);
}
1.7 +32 -2 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.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- ParameterSerializer.java 2001/01/09 05:35:26 1.6
+++ ParameterSerializer.java 2001/03/19 06:20:51 1.7
@@ -112,21 +112,51 @@
{
Element paramEl = (Element)src;
String name = paramEl.getTagName();
- Bean bean;
+ Bean bean = null;
// If the element contains an href= parameter, shortcut to
// MimePartSerializer.
String href = paramEl.getAttribute(Constants.ATTR_REFERENCE);
if(href != null && !href.equals(""))
{
+ // First, check to see if it's a local ref
+ if (href.charAt(0) == '#') {
+ href = href.substring(1);
+ Element el = DOMUtils.getElementByID(src.getOwnerDocument().getDocumentElement(),href);
+ if (el == null) {
+ throw new IllegalArgumentException("No such ID '" + href + "'");
+ }
+
+ QName soapType =
+ SoapEncUtils.getAttributeValue(paramEl,
+ Constants.NS_URI_CURRENT_SCHEMA_XSI,
+ Constants.ATTR_TYPE,
+ "parameter", false);
+
+ if (soapType == null) {
+ // no xsi:type attribute found: determine the type as the
+ // qualified name of the parameter element (if the parameter
+ // element is qualified) or as the qname formed by an empty
+ // namespace URI and the tag name of the parameter element.
+ // is that a legal qname???
+ String paramNamespaceURI = paramEl.getNamespaceURI();
+ if (paramNamespaceURI != null) {
+ soapType = new QName(paramNamespaceURI, name);
+ } else {
+ soapType = new QName("", name);
+ }
+ bean = xjmr.unmarshall(inScopeEncStyle, soapType, el, ctx);
+ }
+ } else {
bean = (new MimePartSerializer()).unmarshall(inScopeEncStyle,
elementType, src,
xjmr, ctx);
+ }
}
else {
QName soapType =
SoapEncUtils.getAttributeValue(paramEl,
- Constants.NS_URI_SCHEMA_XSI,
+ Constants.NS_URI_CURRENT_SCHEMA_XSI,
Constants.ATTR_TYPE,
"parameter", false);
1.3 +1 -1 xml-soap/java/src/org/apache/soap/encoding/soapenc/QNameSerializer.java
Index: QNameSerializer.java
===================================================================
RCS file: /home/cvs/xml-soap/java/src/org/apache/soap/encoding/soapenc/QNameSerializer.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- QNameSerializer.java 2001/01/08 12:25:15 1.2
+++ QNameSerializer.java 2001/03/19 06:20:51 1.3
@@ -28,7 +28,7 @@
Constants.NS_URI_SOAP_ENC);
String xsiNSPrefix =
- nsStack.getPrefixFromURI(Constants.NS_URI_SCHEMA_XSI, sink);
+ nsStack.getPrefixFromURI(Constants.NS_URI_CURRENT_SCHEMA_XSI, sink);
String elementTypeNSPrefix =
nsStack.getPrefixFromURI(elementType.getNamespaceURI(), sink);
1.5 +2 -2 xml-soap/java/src/org/apache/soap/encoding/soapenc/SoapEncUtils.java
Index: SoapEncUtils.java
===================================================================
RCS file: /home/cvs/xml-soap/java/src/org/apache/soap/encoding/soapenc/SoapEncUtils.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- SoapEncUtils.java 2000/09/01 03:52:46 1.4
+++ SoapEncUtils.java 2001/03/19 06:20:51 1.5
@@ -133,7 +133,7 @@
// Get prefixes for the needed namespaces.
String xsiNSPrefix = nsStack.getPrefixFromURI(
- Constants.NS_URI_SCHEMA_XSI, sink);
+ Constants.NS_URI_CURRENT_SCHEMA_XSI, sink);
String elementTypeNSPrefix = nsStack.getPrefixFromURI(
elementType.getNamespaceURI(), sink);
@@ -180,7 +180,7 @@
public static boolean isNull(Element element)
{
String nullValue = DOMUtils.getAttributeNS(element,
- Constants.NS_URI_SCHEMA_XSI,
+ Constants.NS_URI_CURRENT_SCHEMA_XSI,
Constants.ATTR_NULL);
return nullValue != null
1.2 +10 -1 xml-soap/java/src/org/apache/soap/encoding/soapenc/UrTypeDeserializer.java
Index: UrTypeDeserializer.java
===================================================================
RCS file: /home/cvs/xml-soap/java/src/org/apache/soap/encoding/soapenc/UrTypeDeserializer.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- UrTypeDeserializer.java 2001/02/19 23:34:51 1.1
+++ UrTypeDeserializer.java 2001/03/19 06:20:51 1.2
@@ -66,6 +66,7 @@
import org.apache.soap.util.xml.*;
import org.apache.soap.*;
import org.apache.soap.rpc.*;
+import org.apache.soap.encoding.SOAPMappingRegistry;
/**
* An <code>UrTypeDeserializer</code> deserializes <code>xsd:ur-type</code>
@@ -83,7 +84,15 @@
{
Element root = (Element)src;
if (!SoapEncUtils.isNull(root)) {
- throw new IllegalArgumentException("Can't yet deserialize non-null Objects");
+ String href = root.getAttribute(Constants.ATTR_REFERENCE);
+ if (href != null && !href.equals(""))
+ return SOAPMappingRegistry.partSer.unmarshall(inScopeEncStyle,
+ elementType,
+ src,
+ xjmr,
+ ctx);
+
+ throw new IllegalArgumentException("Can't yet deserialize non-null Objects");
}
return new Bean(Object.class, null);
1.5 +4 -4 xml-soap/java/src/org/apache/soap/encoding/soapenc/VectorSerializer.java
Index: VectorSerializer.java
===================================================================
RCS file: /home/cvs/xml-soap/java/src/org/apache/soap/encoding/soapenc/VectorSerializer.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- VectorSerializer.java 2001/01/08 12:25:15 1.4
+++ VectorSerializer.java 2001/03/19 06:20:51 1.5
@@ -179,10 +179,10 @@
String actualEncStyle = declEncStyle != null
? declEncStyle
: inScopeEncStyle;
- QName declItemType = SoapEncUtils.getAttributeValue(tempEl,
- Constants.NS_URI_SCHEMA_XSI, Constants.ATTR_TYPE, "Vector item",
- false);
- QName actualItemType = declItemType;
+ QName declItemType = SoapEncUtils.getAttributeValue(tempEl,
+ Constants.NS_URI_CURRENT_SCHEMA_XSI, Constants.ATTR_TYPE, "Vector item",
+ false);
+ QName actualItemType = declItemType;
Bean itemBean = xjmr.unmarshall(actualEncStyle, actualItemType,
tempEl, ctx);
1.13 +5 -1 xml-soap/java/src/org/apache/soap/rpc/RPCMessage.java
Index: RPCMessage.java
===================================================================
RCS file: /home/cvs/xml-soap/java/src/org/apache/soap/rpc/RPCMessage.java,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -r1.12 -r1.13
--- RPCMessage.java 2001/02/14 02:29:27 1.12
+++ RPCMessage.java 2001/03/19 06:20:51 1.13
@@ -387,6 +387,10 @@
// I'm on the client unmarshalling a response.
smr = respSMR;
}
+
+ // For RPC, default to SOAP section 5 encoding if no
+ // encodingStyle attribute is set.
+ smr.setDefaultEncodingStyle(Constants.NS_URI_SOAP_ENC);
/*
Sanity check: the name of the method element should be the
@@ -407,7 +411,7 @@
}
} else {
methodName = tagName;
- }
+ }
Element tempEl = DOMUtils.getFirstChildElement(root);
1.23 +30 -4 xml-soap/java/src/org/apache/soap/server/DeploymentDescriptor.java
Index: DeploymentDescriptor.java
===================================================================
RCS file: /home/cvs/xml-soap/java/src/org/apache/soap/server/DeploymentDescriptor.java,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -r1.22 -r1.23
--- DeploymentDescriptor.java 2001/02/27 19:06:55 1.22
+++ DeploymentDescriptor.java 2001/03/19 06:20:52 1.23
@@ -105,6 +105,13 @@
transient SOAPMappingRegistry cachedSMR;
protected String[] faultListener;
private transient SOAPFaultRouter fr;
+
+ // Should I throw a mustUnderstand fault if I get
+ // any mustUnderstand headers? If you deploy a
+ // service that doesn't process headers at all,
+ // this option should technically be set to be
+ // a good SOAP citizen.
+ protected boolean checkMustUnderstands = false;
private String defaultSMRClass = null;
/**
@@ -127,6 +134,16 @@
return id;
}
+ public boolean shouldCheckMustUnderstands()
+ {
+ return checkMustUnderstands;
+ }
+
+ public void setCheckMustUnderstands(boolean doIt)
+ {
+ checkMustUnderstands = doIt;
+ }
+
/**
* Type of the service: message or procedural service. Defaults to being
* a procedural service. The difference is that if its procedural then
@@ -308,6 +325,9 @@
pw.println ("<isd:service xmlns:isd=\"" +
Constants.NS_URI_XML_SOAP_DEPLOYMENT + "\" id=\"" + id + "\"" +
(serviceType != SERVICE_TYPE_RPC ? " type=\"message\"" : "") +
+ " checkMustUnderstands=\"" + (checkMustUnderstands ? "true" :
+ "false") +
+ "\"" +
">");
byte pt = providerType;
@@ -439,6 +459,13 @@
"missing in deployment descriptor");
}
dd.setID (id);
+
+ // If we've been marked as checking mustUnderstands, do it.
+ String checkMustUnderstands = DOMUtils.getAttribute(root, "checkMustUnderstands");
+ if (checkMustUnderstands != null) {
+ if (checkMustUnderstands.equals("true"))
+ dd.checkMustUnderstands = true;
+ }
// check type of service
String serviceTypeStr = DOMUtils.getAttribute (root, "type");
@@ -602,8 +629,7 @@
methods[i] = st.nextToken ();
}
dd.setMethods (methods);
-
-
+
//read the fault listeners
nl = root.getElementsByTagNameNS (Constants.NS_URI_XML_SOAP_DEPLOYMENT,
"faultListener");
@@ -729,11 +755,11 @@
smr = (SOAPMappingRegistry)defaultSMRClass.newInstance();
}
catch (Exception e) {
- smr = new SOAPMappingRegistry();
+ smr = new SOAPMappingRegistry();
}
}
else {
- smr = new SOAPMappingRegistry ();
+ smr = new SOAPMappingRegistry();
}
}
if (maps != null) {
1.9 +5 -0 xml-soap/java/src/org/apache/soap/server/RPCRouter.java
Index: RPCRouter.java
===================================================================
RCS file: /home/cvs/xml-soap/java/src/org/apache/soap/server/RPCRouter.java,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- RPCRouter.java 2001/01/16 14:26:41 1.8
+++ RPCRouter.java 2001/03/19 06:20:52 1.9
@@ -37,6 +37,11 @@
"Unable to determine object id from call: is the method element " +
"namespaced?");
}
+
+ // If I'm supposed to check mustUnderstands, do it now.
+ if (dd.shouldCheckMustUnderstands() && callEnv.getHeader() != null) {
+ Utils.checkMustUnderstands(callEnv.getHeader());
+ }
// now extract the call from the call envelope with the given
// deployment information about the object. Note that I still
1.8 +4 -4 xml-soap/java/src/org/apache/soap/server/TypeMappingSerializer.java
Index: TypeMappingSerializer.java
===================================================================
RCS file: /home/cvs/xml-soap/java/src/org/apache/soap/server/TypeMappingSerializer.java,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- TypeMappingSerializer.java 2001/01/09 05:15:04 1.7
+++ TypeMappingSerializer.java 2001/03/19 06:20:52 1.8
@@ -97,13 +97,13 @@
sink.write (StringUtils.lineSeparator);
// these namespaces being defined by the envelope stuff
- String xsiPrefix = nsStack.getPrefixFromURI (Constants.NS_URI_SCHEMA_XSI);
- String xsdPrefix = nsStack.getPrefixFromURI (Constants.NS_URI_SCHEMA_XSD);
+ String xsiPrefix = nsStack.getPrefixFromURI (Constants.NS_URI_CURRENT_SCHEMA_XSI);
+ String xsdPrefix = nsStack.getPrefixFromURI (Constants.NS_URI_CURRENT_SCHEMA_XSD);
if ((xsiPrefix == null) || (xsdPrefix == null)) {
throw new IllegalArgumentException ("required namespace names '" +
- Constants.NS_URI_SCHEMA_XSI +
+ Constants.NS_URI_CURRENT_SCHEMA_XSI +
"' and/or '" +
- Constants.NS_URI_SCHEMA_XSD +
+ Constants.NS_URI_CURRENT_SCHEMA_XSD +
"' is not defined.");
}
1.3 +21 -0 xml-soap/java/src/org/apache/soap/util/xml/DOMUtils.java
Index: DOMUtils.java
===================================================================
RCS file: /home/cvs/xml-soap/java/src/org/apache/soap/util/xml/DOMUtils.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- DOMUtils.java 2000/09/01 03:53:08 1.2
+++ DOMUtils.java 2001/03/19 06:20:52 1.3
@@ -262,4 +262,25 @@
return null;
}
+
+ public static Element getElementByID(Element el, String id)
+ {
+ if (el == null)
+ return null;
+ String thisId = el.getAttribute("id");
+ if (id.equals(thisId))
+ return el;
+
+ NodeList list = el.getChildNodes();
+ for (int i = 0; i < list.getLength(); i++) {
+ Node node = list.item(i);
+ if (node instanceof Element) {
+ Element ret = getElementByID((Element)node, id);
+ if (ret != null)
+ return ret;
+ }
+ }
+
+ return null;
+ }
}
1.6 +25 -0 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.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- XMLJavaMappingRegistry.java 2001/01/08 12:25:30 1.5
+++ XMLJavaMappingRegistry.java 2001/03/19 06:20:52 1.6
@@ -79,6 +79,16 @@
private Hashtable dsReg = new Hashtable();
private Hashtable xml2JavaReg = new Hashtable();
private Hashtable java2XMLReg = new Hashtable();
+ private String defaultEncodingStyle = null;
+
+ /** Set the default encoding style. If the query*() calls
+ * are invoked with a null encodingStyleURI parameter, we'll
+ * use this instead.
+ */
+ public void setDefaultEncodingStyle(String defEncStyle)
+ {
+ defaultEncodingStyle = defEncStyle;
+ }
// To register the default, set both types to null.
public void mapTypes(String encodingStyleURI, QName elementType,
@@ -108,6 +118,9 @@
public Serializer querySerializer(Class javaType, String encodingStyleURI)
throws IllegalArgumentException
{
+ if (encodingStyleURI == null) {
+ encodingStyleURI = defaultEncodingStyle;
+ }
String java2XMLKey = getKey(javaType, encodingStyleURI);
Serializer s = (Serializer)sReg.get(java2XMLKey);
@@ -139,6 +152,10 @@
String encodingStyleURI)
throws IllegalArgumentException
{
+ if (encodingStyleURI == null) {
+ encodingStyleURI = defaultEncodingStyle;
+ }
+
String xml2JavaKey = getKey(elementType, encodingStyleURI);
Deserializer ds = (Deserializer)dsReg.get(xml2JavaKey);
@@ -168,6 +185,10 @@
public QName queryElementType(Class javaType, String encodingStyleURI)
throws IllegalArgumentException
{
+ if (encodingStyleURI == null) {
+ encodingStyleURI = defaultEncodingStyle;
+ }
+
String java2XMLkey = getKey(javaType, encodingStyleURI);
QName elementType = (QName)java2XMLReg.get(java2XMLkey);
@@ -187,6 +208,10 @@
public Class queryJavaType(QName elementType, String encodingStyleURI)
throws IllegalArgumentException
{
+ if (encodingStyleURI == null) {
+ encodingStyleURI = defaultEncodingStyle;
+ }
+
String xml2JavaKey = getKey(elementType, encodingStyleURI);
Class javaType = (Class)xml2JavaReg.get(xml2JavaKey);
1.3 +1 -0 xml-soap/java/src/org/apache/soap/util/xml/XMLParserLiaison.java
Index: XMLParserLiaison.java
===================================================================
RCS file: /home/cvs/xml-soap/java/src/org/apache/soap/util/xml/XMLParserLiaison.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- XMLParserLiaison.java 2000/05/30 10:24:46 1.2
+++ XMLParserLiaison.java 2001/03/19 06:20:52 1.3
@@ -71,6 +71,7 @@
public interface XMLParserLiaison
{
public Document read (String sourceDesc, Reader reader);
+ public Document read (String sourceDesc, InputStream inStream);
public Document createDocument ();
}
1.4 +24 -0 xml-soap/java/src/org/apache/soap/util/xml/XercesParserLiaison.java
Index: XercesParserLiaison.java
===================================================================
RCS file: /home/cvs/xml-soap/java/src/org/apache/soap/util/xml/XercesParserLiaison.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- XercesParserLiaison.java 2000/09/01 03:53:11 1.3
+++ XercesParserLiaison.java 2001/03/19 06:20:52 1.4
@@ -98,6 +98,30 @@
}
}
+ public Document read(String sourceDesc, InputStream inStream)
+ {
+ DOMParser parser = new DOMParser();
+ InputSource in = new InputSource(inStream);
+
+ try
+ {
+ parser.setFeature("http://xml.org/sax/features/namespaces", true);
+ parser.parse(in);
+
+ return parser.getDocument();
+ }
+ catch (SAXException e)
+ {
+ e.printStackTrace();
+ return null;
+ }
+ catch (IOException e)
+ {
+ e.printStackTrace();
+ return null;
+ }
+ }
+
public Document createDocument()
{
return new DocumentImpl();