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

Reply via email to