Hi.

I recently filed a Bugzilla report 
(http://nagoya.apache.org/bugzilla/show_bug.cgi?id=14182) on this issue.  I hope 
someone else can come up with a
fix faster than I can... however, it's rather a serious problem for me, so I'm trying 
to puzzle through this myself.  Here's what I've found thus far.

In org.apache.axis.encoding.DefaultTypeMappingImpl, you find the following during 
default type mapping initialization:

        // The closest match for anytype is Object
        myRegister(Constants.XSD_ANYTYPE,    java.lang.Object.class,
                   null, null);

This causes "xsd:anyType" to be bound to java.lang.Object.  This registration sets up 
a number of mappings, including QName->JavaType and
JavaType->QName.  It's the latter of these which plays a part in this defect.

When registering a QName that is part of the XML Schema Namespace, Axis registers that 
mapping for all versions of the XML Schema.  Thus, the above
will cause the following QName->JavaType mappings:

1) {http://www.w3.org/1999/XMLSchema}anyType -> java.lang.Object
2) {http://www.w3.org/2000/10/XMLSchema}anyType -> java.lang.Object
3) {http://www.w3.org/2001/XMLSchema}anyType ->java.lang.Object

The order of the above is the order in which this internal registering happens.  The 
"problemmatic" portion of this is the setting up of the
JavaType->QName mapping.  In this case, since the same Java type is the key of the 
map, only the first mapping is used.  This is ensured by the
following code, found in org.apache.axis.encoding.TypeMappingImpl#internalRegister 
(Line 290):

        if ((sf != null) || (class2Pair.get(javaType) == null))
            class2Pair.put(javaType, pair);

This code ensures that a JavaType->QName mapping is not overridden.  I don't know if 
this is wrong behavior or not... but it's the current
functionality.

Later on in the WSDL-generation process, the actual WSDL Messages and Parts are 
constructed.  As part of this construction, the ParameterDesc for the
java.lang.Object object is retrieved, and the getTypeQName method is called on this 
ParameterDesc.  This always returns
{http://www.w3.org/1999/XMLSchema}anyType since that was the first type mapping 
registered for java.lang.Object.

When Types.writeType for this QName is invoked, this is shortcircuited to always emit 
"xsd:anyType," where "xsd" presumably is supposed to be the
latest support XML Schema version (i.e., http://www.w3.org/2001/XMLSchema, right now). 
 I think this might be meaningless data for this issue.

Finally, when handed off to WSDL4J in order to convert the generated WSDL to an XML 
Document, WSDL4J will eventually call ParameterDesc.getTypeQName
for java.lang.Object and receive {http://www.w3.org/1999/XMLSchema}anyType.  However, 
this XML Namespace has net been registered with the XML
Document, hence an exception is raised...

So, that's what I know.  I don't know if the solution is to be found somewhere in the 
above, or if it is somewhere else.  However, the crux of the
issue seems to be that the JavaType->QName mapping is only accepting the first mapping 
passed its way.  It seems that it should employ a
last-one-registered wins tactic when dealing with this... and in fact, that's the 
tactic employed if a serialization factory is provided during
registration.  However, since java.lang.Object doesn't provide a serialization 
factory, it ends up with this somewhat odd behavior.

Is the right thing simply to special case TypeMappingImpl#internalRegister so that 
java.lang.Object employs a last-one-registered wins behavior?
Something else? 

Cheers,
--Doug

Doug Bitting
Agile Software
1 Almaden Blvd
San Jose, CA  95113
(408) 999-7120


Reply via email to