I instead did the following but I am wondering if there is a cleaner solution. The ones I saw you write look like they require alot of maintenance too.

_cdr = new ClassDescriptorResolverImpl();
_cdr.associate(ButtonPress.class, new ButtonPressDescripto());
_cdr.associate(Device.class, new DeviceDescriptor());
.......25 more of these
_cdr.associate(Something.class, new SomethingDescriptor());

This seems like a maintenance nightmare though. Every time someone regenerates new classes, he has to remember to go add the class and descriptor to the Resolver. Is there a cleaner way?

Maybe a subclass of ClassDescriptorResolverImpl should be generated for generated source code. If users have non-generated classes also, there could be a heirarchy of these resolvers just like ClassLoaders and ResourceBundles.
Our plan is to keep to the CSTA schema standard, which means we will regenerate these classes and new ones might appear. I have no way of knowing if new ones appear, so I will have to diff the new with the old. Maybe I will write something to generate a ClasDescriptorResolver that auto adds all the generated classes and can have the normal Resolver as it's parent.
I will have to think about this some more. If you have any ideas, let me know please,
thanks for the suggestions below
Dean

[EMAIL PROTECTED] wrote:

You have a few options at this point.
First, be sure you've compiled the generated *Descriptor.java files
and they're in the cp.

1) _cdr = new ClassDescriptorResolverImpl();

_cdr.resolve(/* one option for top level class */);
_cdr.resolve(/* a different option for top level class */);
_cdr.resolve(/* yet a third option for top level class */);
_myUnmarshaller = new Unmarshaller((Class)null);
_myUnmarshaller.setResolver(_cdr); //Now you can safely unmarshall.

2) In the instance document, add an xsi:type attribute
on the node that you'll pass to the unmarshaller.
You don't need to specify it for the child nodes, b/c
this info is code generated into the *Descriptor.java files.
Here is an example:

<?xml version="1.0" encoding="UTF-8"?>
<Wrapper>
<Aclass xsi:type="java:pollux.AxClass" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";>
<sString>string23</sString>
<xInt>23</xInt>
</Aclass>
</Wrapper>



3) Instead of using xsi:type, you can specify a namespace.
This option is nice because you can easily change
your package structure without breaking the client.

See this post for an example: http://www.mail-archive.com/[email protected]/msg09658.html

Hope this help,

--Erik

> -----Original Message-----
> From: Dean Hiller [mailto:[EMAIL PROTECTED]]
> Sent: Thursday, December 05, 2002 7:42 AM
> To: [EMAIL PROTECTED]
> Subject: Re: [castor-dev] unmarshalling unkown xml with > generated code
> > > That didnt' seem to work, throws an exception saying > "The class for the > root element 'ButtonPress' could not be found from the > UnmarshalHandler. > I am looking at the UnmarshalHandler and the classDesc > returned from > _cdResolver.resolveByXMLName(name, namespace, null); is > null. Because > of this, the exception is thrown. _cdResolver is a > ClassDescriptorResolverImpl, so I am now looking at > that. It loads from > the mapping first(which I don't have as I read this is > for non-generated > source code). It then goes through the cached > elements. The cache size > is 0. There are no elements in the cache. Am I > missing something?
> thanks very much for your help,
> Dean
> > [EMAIL PROTECTED] wrote:
> > >Use this:
> >
> > _myUnmarshaller = new Unmarshaller((Class)null);
> >
> >
> > > -----Original Message-----
> > > From: Dean Hiller [mailto:[EMAIL PROTECTED]]
> > > Sent: Wednesday, December 04, 2002 3:56 PM
> > > To: [EMAIL PROTECTED]
> > > Subject: [castor-dev] unmarshalling unkown xml with > > > generated code
> > > > > > > > > I am sorry, the mail archives seem to be down, so I > > > could not search > > > them yet.
> > > > > > I see Mapping is supposed to be used for non-generated > > > code from what I > > > read so far. How do I unmarshal objects where I don't > > > know what the xml > > > is ahead of time. I can't seem to just do this
> > > > > > UnMarshaller u = new UnMarshaller();
> > > Object o = u.unmarshal(myStream);
> > > if(o instanceof Device).......
> > > else if(o instanceof System).....
> > > > > > I am sure castor can handle this. I am just not sure > > > how to do it.
> > > thanks for any help in this,
> > > Dean
> > > > > > > ----------------------------------------------------------- > > > 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
> >
----------------------------------------------------------- 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