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
-----------------------------------------------------------
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-dev