Hi Jason,

Thanks for resending the message as plain text.

I'll try out your test case and see if I can see what's going on. I
agree that the missing wrapper element seems to be what's causing the
newer versions to struggle. Normally Castor treats collections as
"containers" meaning that they are not first class objects and only
their contents are marshalled. However, in the case of "Object
getObject()" a wrapper element is really needed for collections,
otherwise there will be no way of knowing how to rebuild the collection
upon unmarshalling.

I'll see if I can track down where Castor is getting confused.

--Keith


Jason Dillon wrote:
> 
> A plain text version, in case that was causing anyone to ignore this message
> ;-)
> 
> --jason
> 
> ________________________________________
> From: Jason Dillon [mailto:[EMAIL PROTECTED]
> Sent: Tuesday, May 18, 2004 2:56 PM
> To: [EMAIL PROTECTED]
> Cc: [EMAIL PROTECTED]
> Subject: [castor-user] Problems marshalling class with an Object field in
> Castor v0.9.4. 3+
> 
> Hi, I have been trying to track down a problem with later versions of
> Castor, where it is not marshalling a class with an Object field (that
> happens to be an ArrayList instance, but could be a String as well)... but
> have had no luck and my brain is starting to hurt :-/
> First off, I am trying to use the _default_ marshalling/unmarshalling
> behavior _with-out_ a mapping file.
> Basically, I have a class like:
> <snip>
> // ...
> public class SimpleObject
> {
>     private Object value;
> 
>     public SimpleObject()
>     {
>         super();
>     }
> 
>     public SimpleObject(Object value)
>     {
>         setValue(value);
>     }
> 
>     public void setValue(Object value)
>     {
>         this.value = value;
>     }
> 
>     public Object getValue()
>     {
>         return value;
>     }
> }
> </snip>
> So, value could be a String or a List or really anything...
> And a testcase like:
> <snip>
> // ...
> public class CastorNoMappingTestCase
>     extends TestCase
> {
>     protected void log(String msg)
>     {
>         System.err.println(msg);
>     }
> 
>     protected Marshaller getMarshaller(final Writer writer) throws Exception
>     {
>         Marshaller marshaller = new Marshaller(writer);
>         // marshaller.setMarshalExtendedType(true);
>         // marshaller.setSuppressXSIType(false);
>         marshaller.setNamespaceMapping("xsi",
> "http://www.w3.org/2001/XMLSchema-instance";);
>         return marshaller;
>     }
> 
>     protected Object chew(final Object input, final Class type) throws
> Exception
>     {
>         StringWriter writer = new StringWriter();
>         Marshaller marshaller = getMarshaller(writer);
>         marshaller.marshal(input);
> 
>         writer.flush();
>         String xml = writer.toString();
>         assertNotNull(xml);
>         log("XML: " + xml);
> 
>         Reader reader = new StringReader(xml);
>         Unmarshaller unmarshaller = new Unmarshaller(type);
>         Object target = unmarshaller.unmarshal(reader);
>         assertNotNull(target);
> 
>         return target;
>     }
> 
>     protected Object chew(final Object input) throws Exception
>     {
>         return chew(input, input.getClass());
>     }
> 
>     public void testSimpleObject_ArrayList_chew() throws Exception
>     {
>         List list = new ArrayList();
>         list.add("a");
>         list.add("b");
> 
>         SimpleObject obj1 = new SimpleObject(list);
>         Object obj2 = chew(obj1);
> 
>         SimpleObject obj3 = (SimpleObject)obj2;
>         assertEquals(obj1.getValue(), obj3.getValue());
>     }
> 
>     public void testSimpleObject_ArrayList2_chew() throws Exception
>     {
>         List list1 = new ArrayList();
>         List list2 = new ArrayList();
>         list2.add("c");
>         list2.add("d");
>         list1.add(list2);
> 
>         SimpleObject obj1 = new SimpleObject(list1);
>         Object obj2 = chew(obj1);
> 
>         SimpleObject obj3 = (SimpleObject)obj2;
>         assertEquals(obj1.getValue(), obj3.getValue());
>     }
> }
> </snip>
> Castor version 0.9.4.2 (and previous, at least until 0.9.3.21) will marshall
> and unmarshall this class with no errors.
> Castor 0.9.4.2 (from http://www.ibiblio.org/maven/castor/jars) produces
> this:
> <snip>
> Tests run: 2, Failures: 0, Errors: 0, Time elapsed: 0.562 sec
> ------------- Standard Error -----------------
> XML: <?xml version="1.0" encoding="UTF-8"?>
> <simple-object xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
> xmlns="">
>     <value xsi:type="java:java.util.ArrayList">
>         <string xsi:type="java:java.lang.String">a</string>
>         <string xsi:type="java:java.lang.String">b</string>
>     </value>
> </simple-object>
> XML: <?xml version="1.0" encoding="UTF-8"?>
> <simple-object xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
> xmlns="">
>     <value xsi:type="java:java.util.ArrayList">
>         <null xsi:type="java:java.util.ArrayList">
>             <string xsi:type="java:java.lang.String">c</string>
>             <string xsi:type="java:java.lang.String">d</string>
>         </null>
>     </value>
> </simple-object>
> ------------- ---------------- ---------------
> </snip>
> But Castor version 0.9.4.3+ fail.  Specifically 0.9.4.3 and 0.9.5.3.
> Castor 0.9.4.3 (from http://www.ibiblio.org/maven/castor/jars) produces
> this:
> <snip>
> Tests run: 2, Failures: 1, Errors: 1, Time elapsed: 0.688 sec
> ------------- Standard Error -----------------
> XML: <?xml version="1.0" encoding="UTF-8"?>
> <simple-object xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";>
>     <value xsi:type="java:java.lang.String">a</value>
>     <value xsi:type="java:java.lang.String">b</value>
> </simple-object>
> XML: <?xml version="1.0" encoding="UTF-8"?>
> <simple-object xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";>
>     <value xsi:type="java:java.util.ArrayList">
>         <string xsi:type="java:java.lang.String">c</string>
>         <string xsi:type="java:java.lang.String">d</string>
>     </value>
> </simple-object>
> ------------- ---------------- ---------------
> Testcase: testSimpleObject_ArrayList_chew(CastorNoMappingTestCase):
> Caused an ERROR
> element "value" occurs more than once. (XMLFieldDesciptor: value AS value)
> ValidationException: element "value" occurs more than once.
> (XMLFieldDesciptor: value AS value)
>         at
> org.exolab.castor.xml.UnmarshalHandler.endElement(UnmarshalHandler.java:730)
>         at org.apache.xerces.parsers.AbstractSAXParser.endElement(Unknown
> Source)
>         at
> org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanEndElement(Unknown
> Source)
>         at
> org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatc
> her.dispatch(Unknown Source)
>         at
> org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown
> Source)
>         at org.apache.xerces.parsers.XML11Configuration.parse(Unknown
> Source)
>         at org.apache.xerces.parsers.XML11Configuration.parse(Unknown
> Source)
>         at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
>         at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
>         at
> org.exolab.castor.xml.Unmarshaller.unmarshal(Unmarshaller.java:555)
>         at
> org.exolab.castor.xml.Unmarshaller.unmarshal(Unmarshaller.java:487)
>         at CastorNoMappingTestCase.chew(CastorNoMappingTestCase.java:52)
>         at CastorNoMappingTestCase.chew(CastorNoMappingTestCase.java:60)
>         at
> CastorNoMappingTestCase.testSimpleObject_ArrayList_chew(CastorNoMappingTestC
> ase.java:70)
> Testcase: testSimpleObject_ArrayList2_chew(CastorNoMappingTestCase):
> FAILED
> expected:<[[c, d]]> but was:<[c, d]>
> junit.framework.AssertionFailedError: expected:<[[c, d]]> but was:<[c, d]>
>         at
> CastorNoMappingTestCase.testSimpleObject_ArrayList2_chew(CastorNoMappingTest
> Case.java:88)
> </snip>
> And Castor 0.9.5.3 (from http://www.ibiblio.org/maven/castor/jars) produces
> output
> very similar.  Specifically the output 'XML:' is identical.
>  * * *
> Comparing the two outputs it appears as if the first level container element
> is eaten somewhere, which is then causing some duplicate elements to get
> written.  The second stack trace shows the same thing, where I was expecting
> a List within a List, but only got back a single List.
> I have searched the net for the past few days, sifted through the mailing
> lists. I did find a few people seeing this particular ValidationException,
> but no solutions.
> Anyone have a clue?  Looks like something changes between Castor 0.9.4.2 and
> 0.9.4.3 which broke Castors ability to marshal and unmarshall objects like
> SimpleObject with no mapping.  BTW, the no mapping part is critical, as the
> system I am trying to fix this for relies upon the fact that Castor will do
> the right thing with an object with out a mapping.
> Also, a side note about XMLNaming (rather DefaultNaming), it does not
> properly handle nested classes (classes which have a '$' in the class
> name).  Not really a big deal from a production level, but a pain in the ass
> when trying to write test cases for castor using nested mock object classes.
> Unfortunally 0.9.4.2 does not pay attention to the
> 'org.exolab.castor.xml.naming' in my castor.properties file, so I will have
> to live with out nested class (un)marshalling for now.
> Finally, just incase anyone asks here is the castor.properites which is on
> my  classpath:
> <snip>
> # ...
> org.exolab.castor.parser=org.apache.xerces.parsers.SAXParser
> org.exolab.castor.serializer=org.apache.xml.serialize.XMLSerializer
> org.exolab.castor.regexp=org.exolab.castor.util.JakartaRegExpEvaluator
> org.exolab.castor.indent=true
> org.exolab.castor.parser.validation=false
> org.exolab.castor.parser.namespaces=false
> org.exolab.castor.marshalling.validation=true
> org.exolab.castor.xml.naming=XMLNamingImpl
> org.exolab.castor.debug=false
> org.exolab.castor.mapping.collections=\
>   org.exolab.castor.mapping.loader.J1CollectionHandlers,\
>   org.exolab.castor.mapping.loader.J2CollectionHandlers
> org.exolab.castor.builder.type.j2=\
>   org.exolab.castor.builder.FieldInfoFactoryJ2
> org.exolab.castor.builder.type.j1=\
>   org.exolab.castor.builder.FieldInfoFactory
> org.exolab.castor.builder.type.odmg=\
>   org.exolab.castor.builder.FieldInfoFactoryODMG30
> </snip>
>  * * *
> If you have ANY idea what is going on here... any idea... please drop some
> knowledge.
> Thanks,
> --jason
> 
>   ------------------------------------------------------------------------
> 
>    footerName: footer
>          Type: Plain Text (text/plain)
> 
>   ------------------------------------------------------------------------
> -----------------------------------------------------------
> If you wish to unsubscribe from this mailing, send mail to
> [EMAIL PROTECTED] with a subject of:
>         unsubscribe castor-user



----------------------------------------------------------- 
If you wish to unsubscribe from this mailing, send mail to
[EMAIL PROTECTED] with a subject of:
        unsubscribe castor-user

Reply via email to