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