Any luck find and/or fixing this problem? Sorry, to keep bugging ya =]
--jason > -----Original Message----- > From: Keith Visco [mailto:[EMAIL PROTECTED] > Sent: Friday, May 21, 2004 12:32 PM > To: [EMAIL PROTECTED] > Subject: Re: [castor-user] Problems marshalling class with an Object > fieldin > > > > 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:73 > 0) > > at > org.apache.xerces.parsers.AbstractSAXParser.endElement(Unknown > > Source) > > at > > > org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanEndElement(Unkno > wn > > Source) > > at > > > org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispa > tc > > 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(CastorNoMappingTes > tC > > 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(CastorNoMappingTe > st > > 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 ----------------------------------------------------------- If you wish to unsubscribe from this mailing, send mail to [EMAIL PROTECTED] with a subject of: unsubscribe castor-user
