Hi Alexei, Can you please post the code you are using to set the mapping and marshall your objects?
Arnaud -----Original Message----- From: Oleksiy Mishchenko [mailto:[EMAIL PROTECTED]] Sent: Thursday, December 12, 2002 10:18 AM To: [EMAIL PROTECTED] Subject: Re: [castor-dev] Marshaling heterogeneous collections Claude, � I have downloaded Castor-XML version 0.9.4.1 and just tried to use it. The result is the same: Castor maps the content of the heterogeneous Vector�using getters of the�interface specified�for�the items of this Vector in the�mapping file (IProcessor) and nothing more (does not explore a real class implemented it: e.g. processorIO). The real classes�are�definitely defined in the mapping as well, but... Is there any solution?!! � � Thanks � Alexei � -----Original Message----- From: Oleksiy Mishchenko [mailto:[EMAIL PROTECTED]] Sent: 11 December 2002 17:15 To: [EMAIL PROTECTED] Subject: Re: [castor-dev] Marshaling heterogeneous collections Hi Claude, � Great thanks for the information. At the moment I use Castor version 0.9.4. I have done everything you suggested me (added auto-naming attribute and updated Engine with setProcessors(Vector processors)), but my new output looks like following: � <engine>� ���� <iprocessor>� ��������<type>processorCPU</type> ��������....... ���� </iprocessor>� ���� <iprocessor>� ��������<type>processorIO</type> ��������....... ���� </iprocessor>� </engine> Real classes I use are different of course. It seems to me�that Castor explores just�the interface IProcessor instead of the real classes. I don't see any�attributes and elements which are specific for the real classes. Each�real�class is�defined in the mapping file with an element <map-to> and describes the mapping of�all its fields. What could be�wrong? � � Cheers � Alexei -----Original Message----- From: Claude Vedovini [mailto:[EMAIL PROTECTED]] Sent: 11 December 2002 15:51 To: [EMAIL PROTECTED] Subject: Re: [castor-dev] Marshaling heterogeneous collections Hi, Try with the following mapping: <mapping> ������� <class name="Engine"> ������� ������� <map-to xml="engine" /> ������� ������� <field name="processors" type="IProcessor" collection="vector"> ������� ������� ������� <bind-xml auto-naming="deriveByClass" node="element" /> ������� ������� </field> ������� </class> ������� <class name="processorCPU"> ������� ������� <map-to xml="cpu"/> ������� ������� ... ������� </class> ������� <class name="processorIO"> ������� ������� <map-to xml="pio"/> ������� ������� ... ������� </class> ������� <class name="processorVideo"> ������� ������� <map-to xml="pvideo"/> ������� ������� ... ������� </class> </mapping> Where you define specific sub-classes fields in place of the elipsis. you could even define the mapping to IProcessor and then "extends" the other mappings Engine should have the following form: public class Engine { ������� private Vector processors; ������� public void setProcessors(Vector processors) �� { ������� ������� this.processors = processors; ������� } ������� public Vector getProcessors() { ������� ������� return processors; ������� } } NOTE: this will only works with version 0.9.4.x of Castor Have fun, Claude > -----Original Message----- > From: Oleksiy Mishchenko > [mailto:[EMAIL PROTECTED]] > Sent: 11 December 2002 16:05 > To: [EMAIL PROTECTED] > Subject: [castor-dev] Marshaling heterogeneous collections > > > Hello, > > I have been exploring a possibility of using the Castor XML Mapping > facilities for our needs. > Everything I have tried works perfect and complies with our > requirements. > However, I am confronted with some difficulties concerning marshaling. > I'm trying to map a Java class containing a collection of > heterogeneous > items, which are inherited from the same abstract class, to > an XML document. > > Let me show the details using the Castor' classic example > taken from the URI > http://castor.exolab.org/xml-mapping.html#5.-xsi:type . > Assume we have an architecture following the example but > gently modified to > demonstrate our real needs. We added a collection of the > Vector type that > should contain heterogeneous processors implementing the interface > IProcessor: > public interface IProcessor > { > ����� public void process(); > } > public class processorCPU� implements IProcessor {...} > public class processorIO����� implements IProcessor {...} > public class processorVideo implements IProcessor {...} > .. > public class Engine > { > ����� private Vector processors; > ����� public void addProcessor(IProcessor processor) > ����� { > ����� ������� processors.add(processor); > ����� } > ����� public Vector getProcessors() > ����� { > ����� ������� return processors; > ����� } > } > > We would like to see an XML configuration file as following: > > <engine> > ����� <cpu/> > ����� <pio/> > ����� <pvideo/> > </engine> >������������ > > At first I tried to use a mapping file that looks like below: > > <mapping> > ����� <class name="Engine"> > ����� ������� <map-to xml="engine" /> > ����� ������� <field name="processorCPU" type="IProcessor" > required="false" > ����� ������� ������� set-method="addProcessor" > get-method="getProcessors"> > ����� ������� ������� <bind-xml name="cpu" node="element" /> > ����� ������� </field> > ����� ������� <field name="processorIO" type="IProcessor" > required="false" > > ����� ������� ������� set-method="addProcessor" > get-method="getProcessors"> > ����� ������� ������� <bind-xml name="pio" node="element" /> > ����� ������� </field> > ����� ������� <field name="processorVideo" type="IProcessor" > required="false" > ����� ������� ������� set-method="addProcessor" > get-method="getProcessors"> > ����� ������� ������� <bind-xml name="pvideo" node="element" /> > ����� ������� </field> > ����� </class> > </mapping> > > It works fine in a scope of unmarshaling, because of > polymorphism and nature > of the Vector collection. However, it is obvious that the method > getProcessors() returns a whole collection of the > heterogeneous elements, > like: processorCPU, processorIO and processorVideo. > The problem is that the Castor Mapping framework calls this > method as many > times as a number of corresponding fields present in the > mapping file (in > described case it is 3). Having not any opportunity to > identify, which XML > field Castor requests the data for, during processing a call > of the method > getProcessors() I cannot restrict the content of the returned > Vector in > order to present the objects of the necessary types only. > > I clearly realize that Castor's behavior in this situation is > absolutely > right and an actual problem is in the mapping, which has to > be properly > specified. It is important to denote that we would like to > avoid specific > tricks like using an attribute xsi:type="java:..." because, > despite the fact > it works correctly in the Castor framework, the prefix java > prevents the XML > document to be validated by other software we apply (e.g. XML Spy). > Moreover, we want our XML documents would not contain any > development tool > or programming language specific features. > > The question is: could you please give me any hint how to achieve the > functionality we need with the Castor API? Should I create > some specific > handler in an application implementing something like the FieldHandler > interface etc. or there is any other way to solve the problem? > > > Your any help is much appreciated. > > Alexei > [EMAIL PROTECTED] > > ----------------------------------------------------------- > If you wish to unsubscribe from this mailing, send mail to > [EMAIL PROTECTED] with a subject of: > ����� unsubscribe castor-dev > ________________________________________________________________________ __ � This email and any files transmitted with it are CONFIDENTIAL and intended solely for the use of the individual or entity to which they are addressed. � Any unauthorized copying, disclosure, or distribution of the material within this email is strictly forbidden. � Any views or opinions presented within this e-mail are solely those of the author and do not necessarily represent those of Odyssey Asset Management Systems SA unless otherwise specifically stated. � An electronic message is not binding on its sender.� Any message referring to a binding engagement must be confirmed in writing and duly signed. � If you have received this email in error, please notify the sender immediately and delete the original. ----------------------------------------------------------- If you wish to unsubscribe from this mailing, send mail to [EMAIL PROTECTED] with a subject of: unsubscribe castor-dev
