I've attached a patch for this. I've also attached a patch for the
interop sample deployment descriptor, which was using empty namespaces
with a prefix [ xmlns:x="" ] which isn't valid, and Xerces (2.0.1) was
throwing an error.


Cheers
Simon
www.pocketsoap.com

On Sun, 9 Jun 2002 01:13:53 +0600, in soap you wrote:

>Hi Simon,
>
>Was this in the 2.3 codebase? If so I agree this'll be a big
>problem and probably sufficient cause for a 2.3.1 to be 
>released ASAP.
>
>I agree it needs to be fixed right to work with both XSD
>versions.
>
>Thanks!
>
>Sanjiva.
>
>----- Original Message ----- 
>From: "Simon Fell" <[EMAIL PROTECTED]>
>To: <[EMAIL PROTECTED]>
>Sent: Saturday, June 08, 2002 8:45 AM
>Subject: xsi:null handling
>
>
>> I noticed that Apache SOAP always serializes NULLs with
>> xsi:null="true", the problem is that for the 2001 schema version there
>> is no null attribute it got renamed to nil.
>> 
>> The quick fix is to change the definition of ATTR_NULL in
>> constants.java, however it looks like the code supports both 1999 and
>> 2001 schema, so really it needs to pick the correct attribute name
>> based on the schema version in use.
>> 
>> This will be a significant interop issue for people using nulls
>> between Apache and non-Apache toolkits.
>> 
>> Cheers
>> Simon
>> www.pocketsoap.com

Index: DeploymentDescriptor.xml
===================================================================
RCS file: /home/cvspublic/xml-soap/java/samples/interop/DeploymentDescriptor.xml,v
retrieving revision 1.12
diff -u -r1.12 DeploymentDescriptor.xml
--- DeploymentDescriptor.xml    31 Jan 2002 17:42:28 -0000      1.12
+++ DeploymentDescriptor.xml    9 Jun 2002 18:49:28 -0000
@@ -9,30 +9,30 @@
 
   <isd:faultListener>org.apache.soap.server.DOMFaultListener</isd:faultListener>
 
-  <isd:mappings>
+  <isd:mappings xmlns="">
     <isd:map encodingStyle="http://schemas.xmlsoap.org/soap/encoding/";
-             xmlns:x="" qname="x:inputInteger"
+             qname="inputInteger"
              xml2JavaClassName="org.apache.soap.encoding.soapenc.IntDeserializer"/>
     <isd:map encodingStyle="http://schemas.xmlsoap.org/soap/encoding/";
-             xmlns:x="" qname="x:inputFloat"
+             qname="inputFloat"
              xml2JavaClassName="org.apache.soap.encoding.soapenc.FloatDeserializer"/>
     <isd:map encodingStyle="http://schemas.xmlsoap.org/soap/encoding/";
-             xmlns:x="" qname="x:inputString"
+             qname="inputString"
              xml2JavaClassName="org.apache.soap.encoding.soapenc.StringDeserializer"/>
     <isd:map encodingStyle="http://schemas.xmlsoap.org/soap/encoding/";
-             xmlns:x="" qname="x:inputStruct"
+             qname="inputStruct"
              xml2JavaClassName="samples.interop.DataSerializer"/>
     <isd:map encodingStyle="http://schemas.xmlsoap.org/soap/encoding/";
-             xmlns:x="" qname="x:inputIntegerArray"
+             qname="inputIntegerArray"
              xml2JavaClassName="org.apache.soap.encoding.soapenc.ArraySerializer"/>
     <isd:map encodingStyle="http://schemas.xmlsoap.org/soap/encoding/";
-             xmlns:x="" qname="x:inputFloatArray"
+             qname="inputFloatArray"
              xml2JavaClassName="org.apache.soap.encoding.soapenc.ArraySerializer"/>
     <isd:map encodingStyle="http://schemas.xmlsoap.org/soap/encoding/";
-             xmlns:x="" qname="x:inputStringArray"
+             qname="inputStringArray"
              xml2JavaClassName="org.apache.soap.encoding.soapenc.ArraySerializer"/>
     <isd:map encodingStyle="http://schemas.xmlsoap.org/soap/encoding/";
-             xmlns:x="" qname="x:inputStructArray"
+             qname="inputStructArray"
              xml2JavaClassName="org.apache.soap.encoding.soapenc.ArraySerializer"/>
 
     <isd:map encodingStyle="http://schemas.xmlsoap.org/soap/encoding/";
@@ -46,24 +46,24 @@
              xml2JavaClassName="org.apache.soap.encoding.soapenc.ArraySerializer"/>
 
     <isd:map encodingStyle="http://schemas.xmlsoap.org/soap/encoding/";
-             xmlns:x="" qname="x:inputBase64"
+             qname="inputBase64"
              xml2JavaClassName="org.apache.soap.encoding.soapenc.Base64Serializer"/>
 
     <isd:map encodingStyle="http://schemas.xmlsoap.org/soap/encoding/";
-             xmlns:x="" qname="x:inputHexBinary"
+             qname="inputHexBinary"
              xml2JavaClassName="org.apache.soap.encoding.soapenc.HexDeserializer"/>
 
     <isd:map encodingStyle="http://schemas.xmlsoap.org/soap/encoding/";
-             xmlns:x="" qname="x:inputDate"
+             qname="inputDate"
              xml2JavaClassName="org.apache.soap.encoding.soapenc.DateSerializer"/>
     <isd:map encodingStyle="http://schemas.xmlsoap.org/soap/encoding/";
-             xmlns:x="" qname="x:inputDecimal"
+             qname="inputDecimal"
              
xml2JavaClassName="org.apache.soap.encoding.soapenc.DecimalDeserializer"/>
     <isd:map encodingStyle="http://schemas.xmlsoap.org/soap/encoding/";
-             xmlns:x="" qname="x:inputBoolean"
+             qname="inputBoolean"
              
xml2JavaClassName="org.apache.soap.encoding.soapenc.BooleanDeserializer"/>
     <isd:map encodingStyle="http://schemas.xmlsoap.org/soap/encoding/";
-             xmlns:x="" qname="x:inputMap"
+             qname="inputMap"
              
xml2JavaClassName="org.apache.soap.encoding.soapenc.HashtableSerializer"/>
   </isd:mappings>    
 </isd:service>
Index: org/apache/soap/Constants.java
===================================================================
RCS file: /home/cvspublic/xml-soap/java/src/org/apache/soap/Constants.java,v
retrieving revision 1.24
diff -u -r1.24 Constants.java
--- org/apache/soap/Constants.java      10 Nov 2001 02:28:09 -0000      1.24
+++ org/apache/soap/Constants.java      9 Jun 2002 18:31:55 -0000
@@ -165,6 +165,7 @@
   public static final String ATTR_MUST_UNDERSTAND = "mustUnderstand";
   public static final String ATTR_TYPE = "type";
   public static final String ATTR_NULL = "null";
+  public static final String ATTR_NIL  = "nil";
   public static final String ATTR_ARRAY_TYPE = "arrayType";
   public static final String ATTR_REFERENCE = "href";
   public static final String ATTR_ID = "id";
Index: org/apache/soap/encoding/soapenc/SoapEncUtils.java
===================================================================
RCS file: 
/home/cvspublic/xml-soap/java/src/org/apache/soap/encoding/soapenc/SoapEncUtils.java,v
retrieving revision 1.9
diff -u -r1.9 SoapEncUtils.java
--- org/apache/soap/encoding/soapenc/SoapEncUtils.java  29 May 2002 18:45:43 -0000     
 1.9
+++ org/apache/soap/encoding/soapenc/SoapEncUtils.java  9 Jun 2002 18:31:56 -0000
@@ -164,7 +164,7 @@
       Constants.NS_URI_CURRENT_SCHEMA_XSI, sink);
     String elementTypeNSPrefix = nsStack.getPrefixFromURI(
       elementType.getNamespaceURI(), sink);
-
+        
     sink.write(' ' + xsiNSPrefix + ':' + Constants.ATTR_TYPE + "=\"" +
                elementTypeNSPrefix + ':' +
                elementType.getLocalPart() + '\"');
@@ -198,18 +198,25 @@
 
     if (isNull)
     {
-      sink.write(' ' + xsiNSPrefix + ':' + Constants.ATTR_NULL + "=\"" +
+      sink.write(' ' + xsiNSPrefix + ':' + nilName() + "=\"" +
                  Constants.ATTRVAL_TRUE + "\"/");
     }
 
     sink.write('>');
   }
 
+  private static String nilName()
+  {
+    return Constants.NS_URI_CURRENT_SCHEMA_XSI == 
+           Constants.NS_URI_2001_SCHEMA_XSI ?
+        Constants.ATTR_NIL : Constants.ATTR_NULL ;
+  }
+  
   public static boolean isNull(Element element)
   {
     String nullValue = DOMUtils.getAttributeNS(element,
                                                Constants.NS_URI_CURRENT_SCHEMA_XSI,
-                                               Constants.ATTR_NULL);
+                                               nilName() );
 
     return nullValue != null && decodeBooleanValue(nullValue);
   }

Reply via email to