Hi Jason,

I just responsed on the castor-user list, sorry for the delay, I'm just
getting around to Castor related mail today.

--Keith

Jason Dillon wrote:
> 
> Hi.  I did not get any responses about this problem on the user list, so I
> am trying the dev list in the hope of at least some comments.
> 
> --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-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