Has anyone written up a migration guide for getting from ApacheSOAP
(2.2/2.3) to    AXIS? - particularly use of custom serializers/deserializers
and mapping registries?  The documentation for custom mappings looks a bit
unfinished :-) and I'm going through the source now to figure out what's
going on under the covers, but any writeups (or pointers to pertinent
messages in the archives) would be helpful.

In particular, I'm investigating switching over one particular use of
ApacheSOAP to AXIS where

 (a) WSDL may be fetched in a running JVM, that WSDL may then be parsed and
used by our own stuff (eg, not WSDL2Java or similar command line usage) and
then a SOAP Call built based on the WSDL,
 and where (b) some of the parameters passed in the SOAP call may be XML
based complex types, but where they do NOT come from unique Java classes
representing those classes, but rather from a proprietary XML based object
format (eg, many different XML complex types may be represented by the same
Java Class) (not JDOM or DOM - but will likely be doing that too in the near
future).

- In ApacheSOAP, along with the default simple type mappings, we register a
DEFAULT serializer and deserializer for ANY unknown types, to map to this
particular XML representation (obviously allowing other mappings to override
it).  Those will only be picked up if there's not a mapping registry match
by QName and encoding type first.
- That default mapping doesn't seem to have the same support level in AXIS
since if you try to pass a null QName in to a register mapping call, you get
back a JAX-RPC exception complaining about that null QName

Example (ApacheSOAP 2.2 / 2.3):
     SOAPMappingRegistry smr = new SOAPMappingRegistry(xsd2001);
    ...
    // Map the IXml class with any name to a custom IXmlSerializer - we'll
take care of adding xsi:type info
    IXmlSerializer ss = new IXmlSerializer();
    smr.mapTypes( Constants.NS_URI_SOAP_ENC, null, IXml.class, ss, null);
    ...
    // Default any unknown (eg, not XSD simple types or other previously
registered type mappings) to IXml
    Deserializer ds = new IXmlDeserializer();
    smr.mapTypes(Constants.NS_URI_SOAP_ENC, null, null, null, ds);

It's non-obvious how to do such default mappings (without breaking anything
else) in AXIS from just the published docs - I'm guessing it can be done
based on a quick skim of the AXIS type mapping registry code, but was
looking for any recommendations on the right way to do such a default
mapping (fallback, if NO other mapping found).

Also, to make sure this runtime usage of AXIS (eg, where we're registering
everything via API, NOT individual type mapping descriptors and restarts of
AXIS) works as well as ApacheSOAP for us , I tried out equivalent uses of
ApacheSOAP (with our default mapping setup) and AXIS, from a SOAP Interop
Round2a test, to see how far I get, before attempting a full migration to
AXIS. 
- Pass pretty much all  Round2 tests using ApacheSOAP 2.2 (with some fixes I
had previously pulled in from 2.3)
-  Without messing with ANY mapping/return type info, I can get this setup
(using our same client code but on top of AXIS1.1beta) to pass all the
echoSimpleType Round2 interop tests (INCLUDING arrays of those types), plus
echoBase64, with minimal changes to our code to swap ApacheSOAP API calls to
AXIS, against all those SOAP InteropRound2 servers returning XSI type info
in the transport data.
- By adding a setReturnType call to specify what we expect back for each
interop test service/method, we can then pass the simple type round 2 tests
against  the rest of the round2 interop servers that don't specify type info
in the response data.
- BUT, to specify a return type, you have to specify parameters types/names?
Why is one tied to the other?  (anyway, that was trivial for me to do since
I had the data for the WSDL from each Interop server - and it worked after
specifying that).

Ok, now that I got that far I went and ported our IXml (our own XML Java
representation for efficiency/speed/leniency for simple uses of XML)
Serializer and Deserializer from ApacheSOAP to AXIS and created factories
for each.
- Specifying the IXmlSerializer/factory for use with IXml.class via
      call.registerTypeMapping(IXml.class, qname, 
                                           new
IXmlAXISSerializerFactory(IXml.class, qn),
                                           null);
allowed me to get one step further and then make outgoing requests that took
IXml parameters (SOAPStruct represented as XML - for echoStruct in the SOAP
Interop Round2 tests) (I didn't hook up the deserializer yet since I was
looking to do that with the above defaults saying anything coming back that
we don't recognize as an XSD simple type or custom mapped type, use
IXmlDeserializtion to represent it as XML)...

Anyway, after registering this additional type mapping, I'm finding that ALL
the other echoSimpleType (eg, echoString, echoInteger ...) Round2 tests are
now failing trying to deserialize the responses.  So, by doing nothing more
than adding a serializer mapping, I appear to have toasted the default
deserialization mappings for the XSD simple types.  It's still serializing
the outgoing XSD simple type parameters for these tests as far as I can
tell, but just can't deserialize the result parameters...  That makes little
sense to me - if adding a serialization mapping was going to override all
default mappings, I would've expected it to break all default serialization
mappings for simple types too, not just deserialization of those types.
Anybody got an explanation for that?

Should I be able to call Call.registerTypeMapping(...) to register an
additional type  mapping, WITHOUT losing the XSD Default type mappings that
AXIS provides if you don't otherwise mess with it?  I was expecting it to
work that way...  If not, what's the recommended way to add a TypeMapping
(programmatically, not just via descriptor) while still delagating back to
the Default Type Mapping if a custom mapping isn't found or doesn't
match...?

Thanks in advance, I'm sure (at least I hope :-) the answers will become
obvious once I've spent some more time down in the guts of AXIS
implementation of TypeMapping Registries and such - but was hoping to get a
primer somewhere or advice on best practices for messing with type mappings
programmatically, for custom mappings and custom default mappings.

..Mike



Reply via email to