Hi Christian, I believe Castor instantiates AnyNode after failing to derive a proper class name from the mapping file (if any) or from the ClassDescriptor resolver. It also looks like the mapping file is an "all or nothing" strategy so I have not been digging much farther in that direction (although there might be tricks I am not aware of).
I also agree with you it would be really nice if org.exolab.castor.builder.nspackages property worked at runtime. So currently I provide the unmarshaller with a custom CD resolver which extends org.exolab.castor.xml.util.ClassDescriptorResolverImpl The method I override is: public XMLClassDescriptor resolve(String className, ClassLoader loader); Basically, if the className is not a soap class, I instantiate the classDescriptor corresponding to the className with a Class.forName(), hard-coding the package name from where to get the classDescriptor definition, and return it. The custom CD resolver is also a useful approach for extending the castor-generated classes and still loading the generated descriptors. Hope this helps, Vincent -----Original Message----- From: Christian Bj�rnbak [mailto:cb@;touristonline.dk] Sent: Thursday, October 17, 2002 2:27 PM To: [EMAIL PROTECTED] Subject: Re: [castor-dev] SourceGenerator on multiple namespaces Hi Vincent I have now succesfully generated the classes, thanks.. When I do Unmarshaller.unmarshal I now get Envelope object containing a Body element and a Header object within these the ebXML objects are substituted with AnyNode objects. So on to the next problems. You say there are 3 ways to solve the mapping. 1) Map all the namespaces to the same java package.. Not nice since a have > 100 classes - very messy... 2) Write a ClassDescriptor Resolver. Is there anywhere I can find an example implementation af a ClassDescriptor resolver?? 3) If I do the mapping file do I have to do a complete mapping or only a partial mapping around the namespace changes (from envelope.xsd to msg-header...xsd)? Note to the castor developers: This would be much easier if the org.exolab.castor.builder.nspackages property also worked runtime... /Christian Bj�rnbak On Thursday 17 October 2002 09:30, Figari, Vincent wrote: > Hi Christian, > > About your questions: > > 1) I use the "type" generation option with the same soap xsd file > that you are using and have no problem. I guess the default "element" > generation is not adequate for this kind of xsd. > > 2) Personally I instantiate a Unmarshaller object and feed it with > the FileReader. This looks a more flexible approach, specially for > setting-up the Unmarsahller with your own ClassDescriptor resolver. > > 3) If you use a mapping file, you can explicitly map the xml names > unmarshalled from under the soap <body> to your Java class names. > If you do not use one, Castor will attempt to derive a default > class name from the xml name, and find the class in the same package > as the generated soap Body class. This is where the custom ClassDescriptor > mentioned above is a very convenient way of helping Castor to locate > the classes among different packages. > > Finally there seems to be a name space problem when > marshalling a soap message (cf > http://www.mail-archive.com/castor-dev@;exolab.org/msg09562.html ). I hope > to hear from Arnaud on this one, I am still a bit new to Castor source code > to investigate it myself ;-) > > Hope this helps, > > Vincent > > > > -----Original Message----- > From: Christian Bj�rnbak [mailto:cb@;touristonline.dk] > Sent: Thursday, October 17, 2002 8:39 AM > To: [EMAIL PROTECTED] > Subject: [castor-dev] SourceGenerator on multiple namespaces > > > This is a confirmation of an earlier question including two questions. > > First some background: > > I'm trying to convert an ebXML message which is contained in a SOAP message > into Java using castor. > > An ebXML message instance looks like: > > <?xml version="1.0" encoding="utf-8"?> > <SOAP-ENV:Envelope > xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" > xmlns:eb="http://www.ebxml.org/namespaces/messageHeader" > xmlns:xlink="http://www.w3.org/1999/xlink"> > <SOAP-ENV:Header> > <eb:MessageHeader SOAP-ENV:actor="1" version="1.0"> > <eb:From> > <eb:PartyId>mailto:queryresponse@;companyb.com</eb:PartyId> > </eb:From> > <eb:To> > <eb:PartyId>mailto:query@;companya.com</eb:PartyId> > </eb:To> > <eb:CPAId>NULL</eb:CPAId> > > <eb:ConversationId>[EMAIL PROTECTED]</eb:ConversationId> > <eb:Service eb:type="OTA">HotelBooking</eb:Service> > <eb:Action>OTA_HotelAvailNotifRQ</eb:Action> > <eb:MessageData> > > <eb:MessageId>[EMAIL PROTECTED]</eb:MessageId> > <eb:Timestamp>2001-07-20T9:31:12Z</eb:Timestamp> > </eb:MessageData> > <eb:QualityOfServiceInfo eb:deliverySematics="BestEffort"/> > </eb:MessageHeader> > </SOAP-ENV:Header> > <SOAP-ENV:Body> > <eb:Manifest> > <eb:Reference xlink:href="cid:transfer1@;companya.com" > xlink:type="simple"> > <eb:Description>Hotel Availability Notification > Request</eb:Description> > </eb:Reference> > </eb:Manifest> > </SOAP-ENV:Body> > </SOAP-ENV:Envelope> > > Here it's the <SOAP-ENV:Envelope> which is the root, but in the schemas it > the ebXML schema which imports the rest. > > The top of the ebXML schema looks like this: > > <schema > targetNamespace="http://www.oasis-open.org/committees/ebxml-msg/schema/msg- >header-2_0.xsd" xmlns:xml="http://www.w3.org/XML/1998/namespace" > xmlns:tns="http://www.oasis-open.org/committees/ebxml-msg/schema/msg-header >-2_0.xsd" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" > xmlns:xlink="http://www.w3.org/1999/xlink" > xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" > xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" > attributeFormDefault="qualified" version="2.0"> > <import namespace="http://www.w3.org/2000/09/xmldsig#" > schemaLocation="http://www.w3.org/TR/xmldsig-core/xmldsig-core-schema.xsd"> ></import> <import namespace="http://www.w3.org/1999/xlink" > schemaLocation="http://www.oasis-open.org/committees/ebxml-msg/schema/xlink >.xsd"></import> <import > namespace="http://schemas.xmlsoap.org/soap/envelope/" > schemaLocation="http://www.oasis-open.org/committees/ebxml-msg/schema/envel >ope.xsd"></import> <import namespace="http://www.w3.org/XML/1998/namespace" > schemaLocation="http://www.w3.org/2001/03/xml.xsd"></import> > > I've added the following namespace mapping into castorbuilder.properties: > > org.exolab.castor.builder.nspackages=\ > > http://www.oasis-open.org/committees/ebxml-msg/schema/msg-header-2_0.xsd=to >.integration.ebxml.message,\ > http://www.w3.org/2000/09/xmldsig#=to.integration.ebxml.message.xmldsig,\ > http://www.w3.org/1999/xlink=to.integration.ebxml.message.xlink,\ > http://schemas.xmlsoap.org/soap/envelope/=to.integration.ebxml.message.enve >lope,\ http://www.w3.org/XML/1998/namespace=to.integration.ebxml.message.xml > > Now to the questions: > > 1) When I generate the classes for the SOAP envelope schema (which is > attached) the SourceGenerator first generates a non-abstract class and then > asks to overwrite it with an abstract class... What's going on?? > > 2) When I want to unmarshal the ebXML message I do a > to.integration.ebxml.message.envelope.Envelope envelope = > to.integration.ebxml.message.envelope.Envelope.unmarshal(new > FileReader(file)); - Right? > > 3) In the SOAP Envelope schema the schema type "any" are used everywhere > ebXML tags should be inserted. How does castor know where to find the ebXML > classes when unmarshalling e.g. SOAP Header element??? > > /Christian Bj�rnbak > > ----------------------------------------------------------- > If you wish to unsubscribe from this mailing, send mail to > [EMAIL PROTECTED] with a subject of: > unsubscribe castor-dev ----------------------------------------------------------- If you wish to unsubscribe from this mailing, send mail to [EMAIL PROTECTED] with a subject of: unsubscribe castor-dev ----------------------------------------------------------- If you wish to unsubscribe from this mailing, send mail to [EMAIL PROTECTED] with a subject of: unsubscribe castor-dev
