Thanks. But rather than tediously having to copy code via clipboard, can
I please ask you to create a new Jira issue and *attach* all classes and
supporting files.
Thanks in advance
Werner
Urso G.R. Wieske wrote:
> Hi Werner
>
> I have sent you the student, teacher and course classes. student and
> teacher extends person class, which is also included.
> Plus the test class which marshalls the student.
>
> Don't get confused about the different id variables in the classes.
> I started to experiment ....... !! :-(
> I started with the property id, which is of type Integer. But I read that
> ID/IDREF in XML syntax are not allowed to be of integer type. (ID should
> be treated as identifiers similar to progamming language identifiers.)
> Besides, each ID/IDREF in XML should identify a node uniquely.
> With this in mind I added the property objectId which would prefix a
> string before the id value to make object-id a global identifier in XML
> representation.
> This did not solve my problem.....
> Then I introduced the property ID (uppercase). At this point I had become
> totally confused in the process of making the marshalling of student to
> work.
>
> That's the reason for all the code mess up.
> In all cases, I was not able to get the correct marshalling of student.
>
> I hope you can manage to reproduce this problem and hopefully give a
> solution.
> I can't imagine I am the first person with this problem. I sought for
> similar cases on the web, but did not find anything.
>
>
> package acme;
>
> import java.util.List;
>
> /**
> *
> */
>
> /**
> * @author UWieske
> * @castor.class xml="student" extends="acme.Person"
> */
> public class Student extends Person {
>
> /**
> *
> */
> private static final long serialVersionUID = 1L;
>
> private List<Course> courses;
>
> private Boolean certified;
>
>
> /**
> * @castor.field type="boolean"
> * @castor.field-xml name="is-certified"
> * @return
> */
> public Boolean getCertified() {
> return certified;
> }
>
> public void setCertified(Boolean certified) {
> this.certified = certified;
> }
>
> /**
> * @castor.field collection="arraylist" type="acme.Course"
> * @castor.field-xml name="course" location="courses"
> *
> * @return
> */
> public List<Course> getCourses() {
> return courses;
> }
>
> public void setCourses(List<Course> courses) {
> this.courses = courses;
> }
>
>
>
> public String getObjectId() {
> return "student-"+ this.getId();
> }
>
>
> public void setObjectId(String objectId) {
> setId(new
> Integer(objectId.substring(objectId.lastIndexOf('-'))));
> }
>
> }
>
>
>
>
>
>
>
> package acme;
>
> import java.io.Serializable;
>
> /**
> * @author UWieske
> * @castor.class xml="person" identity="objectId"
> */
> public class Person implements Serializable {
>
> /**
> *
> */
> private static final long serialVersionUID = 1L;
>
> private Integer id;
>
> private String firstname;
>
> private String lastname;
>
> private String ID;
>
> public Person() {
>
> }
>
> public Person(Integer id, String fname, String lname) {
> this.id = id;
> this.firstname = fname;
> this.lastname = lname;
> }
>
> /**
> * @castor.field
> * @castor.field-xml
> * @return
> */
> public String getFirstname() {
> return firstname;
> }
>
> public void setFirstname(String firstname) {
> this.firstname = firstname;
> }
>
> /**
> * @castor.field
> * @castor.field-xml name="id" node="attribute"
> * @return
> */
> public Integer getId() {
> return id;
> }
>
> public void setId(Integer id) {
> this.id = id;
> }
>
> /**
> * @castor.field
> * @castor.field-xml
> * @return
> */
> public String getLastname() {
> return lastname;
> }
>
>
> public void setLastname(String lastname) {
> this.lastname = lastname;
> }
>
> /**
> * @castor.field
> * @castor.field-xml name="object-id" node="attribute"
> * @return
> */
> public String getObjectId() {
> return "person-"+ id;
> }
>
> /**
> *
> * @return
> */
> public String getID() {
> return ID;
> }
>
> public void setID(String id) {
> ID = id;
> }
>
> }
>
>
>
>
>
> package acme;
>
> import java.util.List;
>
> /**
> * @castor.class xml="teacher" extends="acme.Person"
> * @author UWieske
> *
> */
> public class Teacher extends Person {
>
> /**
> *
> */
> private static final long serialVersionUID = 1L;
>
> private List<Course> courses;
> private List<Student> pupils;
>
>
> public List<Course> getCourses() {
> return courses;
> }
>
> public void setCourses(List<Course> courses) {
> this.courses = courses;
> }
>
> /**
> * @castor.field collection="arraylist" type="acme.Student"
> * @castor.field-xml name="pupil" location="pupils" reference="false"
> *
> *
> * @return
> */
> public List<Student> getPupils() {
> return pupils;
> }
>
> public void setPupils(List<Student> pupils) {
> this.pupils = pupils;
> }
>
>
>
> public String getObjectId() {
> return "teacher-"+ this.getId();
> }
>
>
> }
>
>
>
> package acme;
>
> import java.io.Serializable;
> import java.util.List;
>
> /**
> * @castor.class xml="course" identity="objectId"
> * @author UWieske
> *
> */
> public class Course implements Serializable {
>
> /**
> *
> */
> private static final long serialVersionUID = 1L;
>
> private Integer id;
>
> private String code;
>
> private String name;
>
> private List<Teacher> teachers;
>
> /**
> * @castor.field
> * @castor.field-xml
> * @return
> */
> public String getCode() {
> return code;
> }
>
> public void setCode(String code) {
> this.code = code;
> }
>
> /**
> * @castor.field
> * @castor.field-xml node="attribute"
> * @return
> */
> public int getId() {
> return id;
> }
>
> public void setId(Integer id) {
> this.id = id;
> }
>
> /**
> * @castor.field
> * @castor.field-xml
> * @return
> */
> public String getName() {
> return name;
> }
>
> public void setName(String name) {
> this.name = name;
> }
>
> /**
> * @castor.field collection="arraylist" type="acme.Teacher"
> * @castor.field-xml name="teacher" location="teachers"
> * @return
> */
> public List<Teacher> getTeachers() {
> return teachers;
> }
>
> public void setTeachers(List<Teacher> teachers) {
> this.teachers = teachers;
> }
>
>
> /**
> * @castor.field
> * @castor.field-xml name="object-id" node="attribute"
> * @return
> */
> public String getObjectId() {
> return "course-"+ this.getId();
> }
>
>
>
> }
>
>
> package acme;
>
> import java.io.FileWriter;
> import java.io.IOException;
> import java.io.Writer;
> import java.util.ArrayList;
> import org.exolab.castor.mapping.Mapping;
> import org.exolab.castor.mapping.MappingException;
> import org.exolab.castor.xml.MarshalException;
> import org.exolab.castor.xml.Marshaller;
> import org.exolab.castor.xml.ValidationException;
>
> import junit.framework.TestCase;
>
> /**
> * @author UWieske
> *
> */
> public class MarahallerTest extends TestCase {
>
> /* (non-Javadoc)
> * @see junit.framework.TestCase#setUp()
> */
> protected void setUp() throws Exception {
> super.setUp();
> }
>
> /* (non-Javadoc)
> * @see junit.framework.TestCase#tearDown()
> */
> protected void tearDown() throws Exception {
> super.tearDown();
> }
>
> public void testMarshall() {
>
> Student stud = createStudent();
>
> // Load Mapping
> Mapping mapping = new Mapping();
>
> //Create a File to marshal to
> Writer writer;
> try {
>
> mapping.loadMapping("target/xdoclet/mapping.xml");
> writer = new FileWriter("test.xml");
> Marshaller marshaller = new Marshaller(writer);
> marshaller.setMapping(mapping);
>
>
> marshaller.marshal(stud);
> } catch (IOException e) {
> // TODO Auto-generated catch block
> e.printStackTrace();
> } catch (MarshalException e) {
> // TODO Auto-generated catch block
> e.printStackTrace();
> } catch (ValidationException e) {
> // TODO Auto-generated catch block
> e.printStackTrace();
> } catch (MappingException e) {
> // TODO Auto-generated catch block
> e.printStackTrace();
> }
>
>
> }
>
>
>
>
> private Student createStudent() {
>
>
> Student s1 = new Student();
>
> //Student 1
> s1.setId(1);
> s1.setID("STUDENT-1");
> s1.setLastname("Doe");
> s1.setFirstname("John");
> s1.setCertified(true);
>
> //Student 1 followes two courses, i.e. course c1 and c2
> ArrayList<Course> courses = new ArrayList<Course>();
> Course c1 = new Course();
> c1.setCode("EN123");
> c1.setName("English");
> c1.setId(3);
> courses.add(c1);
>
> Course c2 = new Course();
> c2.setCode("SP111");
> c2.setName("Spanish");
> c2.setId(new Integer(232)) ;
> courses.add(c2);
>
> s1.setCourses(courses);
>
>
> // Course 1 is being given by teacher 1
> ArrayList<Teacher> teachersC1 = new ArrayList<Teacher>();
> Teacher t1 = new Teacher();
> t1.setId(34);
> t1.setID("TEACHER-34");
> t1.setLastname("Rodman");
> t1.setFirstname("Dennis");
> teachersC1.add(t1);
> c1.setTeachers(teachersC1);
>
> // Teacher t1 is responsible for student s2
> ArrayList<Student> pupilsT1 = new ArrayList<Student>();
> Student s2 = new Student();
> s2.setId(2);
> s2.setID("STUDENT-2");
> s2.setLastname("Jacky");
> s2.setFirstname("Onasis");
> s2.setCertified(false);
> pupilsT1.add(s2);
> t1.setPupils(pupilsT1);
>
>
> // Course 2 is being given by teachers 2 and 3
> ArrayList<Teacher> teachersC2 = new ArrayList<Teacher>();
> Teacher t2 = new Teacher();
> t2.setId(324);
> t2.setID("TEACHER-324");
> t2.setLastname("Newman");
> t2.setFirstname("Paul");
> teachersC2.add(t2);
>
> Teacher t3 = new Teacher();
> t3.setId(315);
> t3.setID("TEACHER-315");
> t3.setLastname("Clinton");
> t3.setFirstname("Bill");
> teachersC2.add(t3);
> c2.setTeachers(teachersC2);
>
> // Teacher t3 is responsible for students 1, 2 and 3
> ArrayList<Student> pupilsT3 = new ArrayList<Student>();
> pupilsT3.add(s1); // THIS STUDENT IS NOT MARSHALLED??!
> pupilsT3.add(s2);
>
> Student s3 = new Student();
> s3.setId(55);
> s3.setID("STUDENT-55");
> s3.setLastname("Jacky");
> s3.setFirstname("Onasis");
> s3.setCertified(false);
> pupilsT3.add(s3);
>
> t3.setPupils(pupilsT3);
>
>
> return s1;
>
> }
>
>
> }
>
>
>
>
>
>
>
> Kind Regards
>
> Urso
>
> " Werner Guttmann"
>> Urso,
>>
>> I need the Student class (as well as any classes referenced from it) as
>> well.
>>
>> Thanks
>> Werner
>>
>>
>> ________________________________
>>
>> From: Urso Wieske [mailto:[EMAIL PROTECTED]
>> Sent: Mittwoch, 24. Jänner 2007 14:59
>> To: [email protected]
>> Subject: RE: [castor-user] Marshalling Non-Hierarchical object models
>>
>>
>>
>> Hi Werner,
>>
>>
>>
>> Check my quote in comments in the XML file: "<!-- ? WHERE IS my pupil 1
>> (student 1) John Doe ???????? -->".......
>>
>> What's the problem here? I should have had an entry of John Doe at that
>> point.
>>
>>
>>
>> Kind regards
>>
>> Urso
>>
>>
>>
>>
>>
>> My marshalled XML file looks like this:
>>
>>
>>
>> <?xml version="1.0" encoding="UTF-8"?>
>>
>> <student id="1" object-id="student-1">
>>
>> <firstname>John</firstname>
>>
>> <lastname>Doe</lastname>
>>
>> <is-certified>true</is-certified>
>>
>> <courses>
>>
>> <course id="3" object-id="course-3">
>>
>> <code>EN123</code>
>>
>> <name>English</name>
>>
>> <teachers>
>>
>> <teacher id="34" object-id="teacher-34">
>>
>> <firstname>Dennis</firstname>
>>
>> <lastname>Rodman</lastname>
>>
>> <pupils>
>>
>> <pupil id="2" object-id="student-2">
>>
>> <firstname>Onasis</firstname>
>>
>> <lastname>Jacky</lastname>
>>
>> <is-certified>false</is-certified>
>>
>> <courses/>
>>
>> </pupil>
>>
>> </pupils>
>>
>> </teacher>
>>
>> </teachers>
>>
>> </course>
>>
>> <course id="232" object-id="course-232">
>>
>> <code>SP111</code>
>>
>> <name>Spanish</name>
>>
>> <teachers>
>>
>> <teacher id="324" object-id="teacher-324">
>>
>> <firstname>Paul</firstname>
>>
>> <lastname>Newman</lastname>
>>
>> <pupils/>
>>
>> </teacher>
>>
>> <teacher id="315" object-id="teacher-315">
>>
>> <firstname>Bill</firstname>
>>
>> <lastname>Clinton</lastname>
>>
>> <pupils>
>>
>> <!-- ? WHERE IS my pupil 1 (student 1) John Doe
>> ???????? -->
>>
>>
>>
>> <pupil id="2" object-id="student-2">
>>
>> <firstname>Onasis</firstname>
>>
>> <lastname>Jacky</lastname>
>>
>> <is-certified>false</is-certified>
>>
>> <courses/>
>>
>> </pupil>
>>
>> <pupil id="55" object-id="student-55">
>>
>> <firstname>Onasis</firstname>
>>
>> <lastname>Jacky</lastname>
>>
>> <is-certified>false</is-certified>
>>
>> <courses/>
>>
>> </pupil>
>>
>> </pupils>
>>
>> </teacher>
>>
>> </teachers>
>>
>> </course>
>>
>> </courses>
>>
>> </student>
>>
>>
>>
>> MAPPING:
>>
>> My mapping looks like this:
>>
>>
>>
>>
>>
>>
>>
>> <?xml version="1.0" encoding="UTF-8"?>
>>
>> <!DOCTYPE mapping PUBLIC "-//EXOLAB/Castor Mapping DTD Version 1.0//EN"
>> "http://castor.codehaus.org/mapping.dtd">
>>
>>
>>
>> <!--Generated file. Do not edit.-->
>>
>> <mapping>
>>
>> <class identity="objectId" name="acme.School">
>>
>> <map-to xml="school"/>
>>
>> <field name="students" collection="arraylist" type="acme.Student">
>>
>> <bind-xml name="student" location="students"/>
>>
>> </field>
>>
>> </class>
>>
>> <class identity="objectId" name="acme.Person">
>>
>> <map-to xml="person"/>
>>
>> <field name="firstname" type="string">
>>
>> <bind-xml/>
>>
>> </field>
>>
>> <field name="id" type="java.lang.Integer">
>>
>> <bind-xml name="id" node="attribute"/>
>>
>> </field>
>>
>> <field name="lastname" type="string">
>>
>> <bind-xml/>
>>
>> </field>
>>
>> <field name="objectId" type="string">
>>
>> <bind-xml name="object-id" node="attribute"/>
>>
>> </field>
>>
>> </class>
>>
>> <class extends="acme.Person" name="acme.Teacher">
>>
>> <map-to xml="teacher"/>
>>
>> <field name="pupils" collection="arraylist" type="acme.Student">
>>
>> <bind-xml name="pupil" location="pupils" reference="false"/>
>>
>> </field>
>>
>> </class>
>>
>> <class extends="acme.Person" name="acme.Student">
>>
>> <map-to xml="student"/>
>>
>> <field name="certified" type="boolean">
>>
>> <bind-xml name="is-certified"/>
>>
>> </field>
>>
>> <field name="courses" collection="arraylist" type="acme.Course">
>>
>> <bind-xml name="course" location="courses"/>
>>
>> </field>
>>
>> </class>
>>
>> <class identity="objectId" name="acme.Course">
>>
>> <map-to xml="course"/>
>>
>> <field name="code" type="string">
>>
>> <bind-xml/>
>>
>> </field>
>>
>> <field name="id" type="integer">
>>
>> <bind-xml node="attribute"/>
>>
>> </field>
>>
>> <field name="name" type="string">
>>
>> <bind-xml/>
>>
>> </field>
>>
>> <field name="teachers" collection="arraylist" type="acme.Teacher">
>>
>> <bind-xml name="teacher" location="teachers"/>
>>
>> </field>
>>
>> <field name="objectId" type="string">
>>
>> <bind-xml name="object-id" node="attribute"/>
>>
>> </field>
>>
>> </class>
>>
>> <!--start merging from source: <undefined merge
>> dir>/class-mappings.xml-->
>>
>> <!--to specify aditional class mappings put file "class-mappings.xml"
>> into
>>
>> merge directory.
>>
>> Define root element as <j:jelly
>> xmlns:j="jelly:core">-->
>>
>> <!--end merging from source: <undefined merge
>> dir>/class-mappings.xml-->
>>
>> </mapping>
>>
>>
>>
>>
>>
>> My test function from my TestCase: (part of it)
>>
>>
>>
>> public void testMarshall() {
>>
>>
>>
>> Student stud = createStudent();
>>
>>
>>
>> // Load Mapping
>>
>> Mapping mapping = new Mapping();
>>
>>
>>
>> //Create a File to marshal to
>>
>> Writer writer;
>>
>> try {
>>
>>
>>
>>
>> mapping.loadMapping("target/xdoclet/mapping.xml");
>>
>> writer = new FileWriter("test.xml");
>>
>> Marshaller marshaller = new
>> Marshaller(writer);
>>
>> marshaller.setMapping(mapping);
>>
>>
>>
>>
>>
>> marshaller.marshal(stud);
>>
>> } catch (IOException e) {
>>
>> // TODO Auto-generated catch block
>>
>> e.printStackTrace();
>>
>> } catch (MarshalException e) {
>>
>> // TODO Auto-generated catch block
>>
>> e.printStackTrace();
>>
>> } catch (ValidationException e) {
>>
>> // TODO Auto-generated catch block
>>
>> e.printStackTrace();
>>
>> } catch (MappingException e) {
>>
>> // TODO Auto-generated catch block
>>
>> e.printStackTrace();
>>
>> }
>>
>>
>>
>>
>>
>> }
>>
>>
>>
>>
>>
>>
>>
>>
>>
>> private Student createStudent() {
>>
>>
>>
>>
>>
>> Student s1 = new Student();
>>
>>
>>
>> //Student 1
>>
>> s1.setId(1);
>>
>> s1.setID("STUDENT-1");
>>
>> s1.setLastname("Doe");
>>
>> s1.setFirstname("John");
>>
>> s1.setCertified(true);
>>
>>
>>
>> //Student 1 followes two courses, i.e. course c1
>> and c2
>>
>> ArrayList<Course> courses = new
>> ArrayList<Course>();
>>
>> Course c1 = new Course();
>>
>> c1.setCode("EN123");
>>
>> c1.setName("English");
>>
>> c1.setId(3);
>>
>> courses.add(c1);
>>
>>
>>
>> Course c2 = new Course();
>>
>> c2.setCode("SP111");
>>
>> c2.setName("Spanish");
>>
>> c2.setId(new Integer(232)) ;
>>
>> courses.add(c2);
>>
>>
>>
>> s1.setCourses(courses);
>>
>>
>>
>>
>>
>> // Course 1 is being given by teacher 1
>>
>> ArrayList<Teacher> teachersC1 = new
>> ArrayList<Teacher>();
>>
>> Teacher t1 = new Teacher();
>>
>> t1.setId(34);
>>
>> t1.setID("TEACHER-34");
>>
>> t1.setLastname("Rodman");
>>
>> t1.setFirstname("Dennis");
>>
>> teachersC1.add(t1);
>>
>> c1.setTeachers(teachersC1);
>>
>>
>>
>> // Teacher t1 is responsible for student s2
>>
>> ArrayList<Student> pupilsT1 = new
>> ArrayList<Student>();
>>
>> Student s2 = new Student();
>>
>> s2.setId(2);
>>
>> s2.setID("STUDENT-2");
>>
>> s2.setLastname("Jacky");
>>
>> s2.setFirstname("Onasis");
>>
>> s2.setCertified(false);
>>
>> pupilsT1.add(s2);
>>
>> t1.setPupils(pupilsT1);
>>
>>
>>
>>
>>
>> // Course 2 is being given by teachers 2 and 3
>>
>> ArrayList<Teacher> teachersC2 = new
>> ArrayList<Teacher>();
>>
>> Teacher t2 = new Teacher();
>>
>> t2.setId(324);
>>
>> t2.setID("TEACHER-324");
>>
>> t2.setLastname("Newman");
>>
>> t2.setFirstname("Paul");
>>
>> teachersC2.add(t2);
>>
>>
>>
>> Teacher t3 = new Teacher();
>>
>> t3.setId(315);
>>
>> t3.setID("TEACHER-315");
>>
>> t3.setLastname("Clinton");
>>
>> t3.setFirstname("Bill");
>>
>> teachersC2.add(t3);
>>
>> c2.setTeachers(teachersC2);
>>
>>
>>
>> // Teacher t3 is responsible for students 1, 2
>> and 3
>>
>> ArrayList<Student> pupilsT3 = new
>> ArrayList<Student>();
>>
>> pupilsT3.add(s1); // THIS STUDENT IS NOT
>> MARSHALLED??!
>>
>> pupilsT3.add(s2);
>>
>>
>>
>> Student s3 = new Student();
>>
>> s3.setId(55);
>>
>> s3.setID("STUDENT-55");
>>
>> s3.setLastname("Jacky");
>>
>> s3.setFirstname("Onasis");
>>
>> s3.setCertified(false);
>>
>> pupilsT3.add(s3);
>>
>>
>>
>> t3.setPupils(pupilsT3);
>>
>>
>>
>>
>>
>> return s1;
>>
>>
>>
>> }
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>> ________________________________
>>
>>
>> Van: Werner Guttmann [mailto:[EMAIL PROTECTED]
>> Verzonden: dinsdag 23 januari 2007 11:49
>> Aan: [email protected]
>> Onderwerp: RE: [castor-user] Marshalling Non-Hierarchical object models
>>
>>
>>
>> Urso,
>>
>>
>>
>> without being able to 'peek' at the xml file, domain objects, etc, in
>> detail, i guess we cannot be of any help to you.
>>
>>
>>
>> Werner
>>
>>
>>
>>
>> ________________________________
>>
>>
>> From: Urso Wieske [mailto:[EMAIL PROTECTED]
>> Sent: Montag, 22. Jänner 2007 18:02
>> To: [email protected]
>> Subject: [castor-user] Marshalling Non-Hierarchical object
>> models
>>
>> Hi,
>>
>>
>>
>> I am trying to marshall my object model to XML.
>>
>> I have the following problem within my object graph:
>>
>>
>>
>>
>>
>> ROOT: student1 -> {course1, course2, course3}
>>
>> course1-> {student1, student2}
>>
>>
>>
>> The above means "student1 has three courses (1,2,3) and course1
>> contains
>> is attended by two students (1,2).
>>
>> Notice the student1 in the collection of course1 is actually a
>> reference
>> back to the root element student1.
>>
>>
>>
>> When I marshall the above structure, I expect a reference in the
>> collection {student1,student2} of course1.
>>
>>
>>
>> The thing is: ONLY student2 is present in the collection of
>> course1 !
>> (Student1 has disappeared !...?? )
>>
>>
>>
>> I checked with the Castor HOW-TOs with respect to the usage of
>> references.
>>
>> I declared identity attributes on all classes in my mapping. I
>> declared
>> the attribute reference to true in the bind-xml tags...
>>
>> I think I followed all steps properly.
>>
>>
>>
>> But this seems not to work?
>>
>> Can someone point me to the problem and solution?
>>
>>
>>
>>
>>
>> Kind regards
>>
>> Urso
>>
>>
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe from this list please visit:
>
> http://xircles.codehaus.org/manage_email
>
---------------------------------------------------------------------
To unsubscribe from this list please visit:
http://xircles.codehaus.org/manage_email