Thanks!

Defining the extra <structure> element fixed my issue.  

However I did want to try to "normalize" the collection element so that
it could be reused using an "abstract" mapping which you eluded to.  Can
you provide an example of this type of abstract mapping for a
java.util.Set which can then be reused with  my two different type of
<structure> (color/option) elements?

 

-----Original Message-----
From: [EMAIL PROTECTED]
[mailto:[EMAIL PROTECTED] On Behalf Of Dennis
Sosnoski
Sent: Sunday, February 03, 2008 5:10 PM
To: JiBX users
Subject: Re: [jibx-users] Un-Marshalling different object types in
collection using custom IdDefRefMapperBase not working

Hi Karim,

Your binding says that the <features> collections consists only of 
<option> elements:

<collection name="features" field="features" usage="optional"
create-type="java.util.HashSet">
  <structure name="option"
marshaller="com.edmunds.vehicle.jibx.VdmIdRefMapper"
      unmarshaller="com.edmunds.vehicle.jibx.VdmIdRefMapper"/>
</collection>

so when a different element start tag is found (<color>) you get an 
exception. If you want to mix several different types of child elements 
in the collections you're best off adding a <structure> definition for 
each one, with a specific type="..." to show which Java type matches up 
with each child element. If you do this, you'll probably also want to 
add ordered="false" on the <collection> element, so that the child 
elements can be in any order.

I think you could also make your VdmIdRefMapper handle the element names

for the items in the collection directly, and remove the name="option" 
attribute from the <structure> definition. I won't guarantee this will 
work properly (there are a lot of issues around the code generation not 
knowing what element name to expect), but I think the current code 
allows it. In this case you'd only have the single <structure> within 
the <collection>, since the mapper would handle the element names as 
appropriate to the actual object types.

Since you've got the same collection information appearing in two 
different places you may want to use an abstract <mapping> for 
java.util.Set so you only define the <collection> details in one place. 
You can then reference that abstract mapping where needed (replacing the

<collection name="features" ...> elements in the current binding with 
<struct name="features" ... map-as="setAbstractMapping">, for instance).

  - Dennis

Dennis M. Sosnoski
SOA and Web Services in Java
Training and Consulting
http://www.sosnoski.com - http://www.sosnoski.co.nz
Seattle, WA +1-425-939-0576 - Wellington, NZ +64-4-298-6117



reemo wrote:
> Anyone?  I really need to figure out what I am doing wrong with this.
>
> Thanks.
>
>
> reemo wrote:
>   
>> Hi,
>>
>> I have created my own custom IdDefRefMapperBase impl so that I can
>> have IDREF's on my collection.  All the custom IdDefRefMapperBase is
>> doing is generating the correct "id" for the references by overriding
>> the getIdValue() .  This is working fine for "marshalling" the
objects
>> out but when I try to read the same XML back in for "un-marshalling"
I
>> always get this error pasted below.  You can see the marshalled xml
>> (below) that is having the error AS WELL as the xml that is NOT.  You
>> will notice in the XML output that is NOT having the issue, that the
>> "<color/>" element is not present on the "<style/>" element.   There
>> are ONLY <option> elements.
>>
>> What it seems like is happening as that the collection's can't
support
>> IDREF's with mulitple object types in the collection?  Is this the
>> case?
>>
>> I have tried everyting and searched the mailing lists, JIRA, etc with
>> no luck on this issue.  Please help!
>>
>> Thanks in advance!
>>
>>
>> -----------------
>> Mapping file:
>> ------------------
>>     <mapping class="test.TestModelYear" name="modelYear">
>>         <collection create-type="java.util.HashSet" field="styles"
>> item-type="test.TestStyle"/>
>>
>>         <collection name="features" field="features" usage="optional"
>> create-type="java.util.HashSet"
>>                     >
>>             <structure name="option"
>> marshaller="com.edmunds.vehicle.jibx.VdmIdRefMapper"
>>                       
>> unmarshaller="com.edmunds.vehicle.jibx.VdmIdRefMapper"/>
>>         </collection>
>>     </mapping>
>>
>>     <mapping class="test.TestStyle" name="style">
>>         <collection name="features" field="features" usage="optional"
>> create-type="java.util.HashSet"
>>                     >
>>             <structure name="option"
>> marshaller="com.edmunds.vehicle.jibx.VdmIdRefMapper"
>>                       
>> unmarshaller="com.edmunds.vehicle.jibx.VdmIdRefMapper"/>
>>         </collection>
>>     </mapping>
>>
>>     <mapping class="test.TestOption" name="option" >
>>         <value style="attribute" name="path" field="path"
ident="def"/>
>>         <value style="attribute" name="optionName" field="optionName"
>> usage="optional"/>
>>
>>     </mapping>
>>
>>     <mapping class="test.TestColor" name="color">
>>         <value style="attribute" name="path" field="path"
ident="def"/>
>>         <value style="attribute" name="color" field="color"
>> usage="optional"/>
>>
>>     </mapping>
>>
>> -------------
>> Test Case:
>> --------------
>> package com.edmunds.jibx;
>>
>> import junit.framework.TestCase;
>> import org.jibx.runtime.BindingDirectory;
>> import org.jibx.runtime.IBindingFactory;
>> import org.jibx.runtime.IMarshallingContext;
>> import org.jibx.runtime.IUnmarshallingContext;
>> import test.TestColor;
>> import test.TestModelYear;
>> import test.TestOption;
>> import test.TestStyle;
>>
>> import java.io.FileInputStream;
>> import java.io.FileOutputStream;
>> import java.util.HashSet;
>> import java.util.Set;
>>
>>
>> public class TestJibxMappings extends TestCase {
>>
>>     private static final String TMP_SAMPLE_OUTPUT_XML_FILE =
>> "/tmp/sample-output.xml";
>>
>>     public TestModelYear generateObject() throws Exception {
>>
>>
>>         TestModelYear modelYear = new TestModelYear();
>>         TestStyle style = new TestStyle();
>>
>>         TestOption option = new TestOption();
>>         option.setPath("/feature/100");
>>         option.setOptionName("Option 1");
>>         TestOption option2 = new TestOption();
>>         option2.setPath("/feature/101");
>>         option2.setOptionName("Option 2");
>>         TestColor color = new TestColor();
>>         color.setPath("/feature/102");
>>         color.setColor("Blue");
>>
>>         Set features = new HashSet();
>>         features.add(option);
>>         features.add(option2);
>>         features.add(color);
>>
>>         modelYear.setFeatures(features);
>>
>>         Set styles = new HashSet();
>>         style.setFeatures(features);
>>
>>         styles.add(style);
>>         modelYear.setStyles(styles);
>>
>>         return modelYear;
>>     }
>>
>>
>>     private void marshallToFile() throws Exception {
>>         TestModelYear modelYear = generateObject();
>>         IBindingFactory bindingFactory =
>> BindingDirectory.getFactory(TestModelYear.class);
>>         IMarshallingContext mctx =
>> bindingFactory.createMarshallingContext();
>>         mctx.setIndent(2);
>>
>>         mctx.marshalDocument(modelYear, "UTF-8", null, new
>> FileOutputStream(TMP_SAMPLE_OUTPUT_XML_FILE));
>>     }
>>
>>
>>     public void testUnmarshallObjectsFromFile() {
>>         try {
>>             marshallToFile();
>>             IBindingFactory bindingFactory =
>> BindingDirectory.getFactory(TestModelYear.class);
>>             IUnmarshallingContext unmarshallCtx =
>> bindingFactory.createUnmarshallingContext();
>>             TestModelYear modelYear = (TestModelYear)
>> unmarshallCtx.unmarshalDocument(new
>> FileInputStream(TMP_SAMPLE_OUTPUT_XML_FILE), "UTF-8");
>>             assert modelYear != null;
>>         } catch (Exception e) {
>>             e.printStackTrace();
>>             assert false;
>>         }
>>
>>     }
>> }
>>
>>
>> ----------------------------
>> XML WITH-OUT ERROR:
>> ----------------------------
>> <?xml version="1.0" encoding="UTF-8"?>
>> <modelYear>
>>   <style>
>>     <features>
>>       <option path="/feature/100" optionName="Option 1"/>
>>       <option path="/feature/101" optionName="Option 2"/>
>>     </features>
>>   </style>
>>   <features>
>>     <option ref="/feature/100"/>
>>     <option ref="/feature/101"/>
>>   </features>
>> </modelYear>
>>
>>
>> ----------------------------
>> XML WITH ERROR:
>> ----------------------------
>> <?xml version="1.0" encoding="UTF-8"?>
>> <modelYear>
>>   <style>
>>     <features>
>>       <option path="/feature/100" optionName="Option 1"/>
>>       <option path="/feature/101" optionName="Option 2"/>
>>       <color path="/feature/102" color="Blue"/> <!-- this is the
color
>> element causing issue that I want -->
>>     </features>
>>   </style>
>>   <features>
>>     <option ref="/feature/100"/>
>>     <option ref="/feature/101"/>
>>     <option ref="/feature/102"/> <!-- ref to color element above
>> causing issue -->
>>   </features>
>> </modelYear>
>>
>> ---------
>> Error:
>> ---------
>> org.jibx.runtime.JiBXException: Expected "features" end tag, found
>> "color" start tag (line 5, col 48)
>>      at
>>
org.jibx.runtime.impl.UnmarshallingContext.parsePastCurrentEndTag(Unmars
hallingContext.java:792)
>>      at test.TestStyle.JiBX_test_jibx_unmarshal_1_0(TestStyle.java)
>>      at test.JiBX_test_jibxTestStyle_access2.unmarshal()
>>      at test.JiBX_MungeAdapter.JiBX_test_jibx_unmarshal_1_0()
>>      at
test.TestModelYear.JiBX_test_jibx_unmarshal_1_2(TestModelYear.java)
>>      at test.JiBX_test_jibxTestModelYear_access2.unmarshal()
>>      at
>>
org.jibx.runtime.impl.UnmarshallingContext.unmarshalElement(Unmarshallin
gContext.java:2537)
>>      at
>>
org.jibx.runtime.impl.UnmarshallingContext.unmarshalDocument(Unmarshalli
ngContext.java:2680)
>>      at
>>
com.edmunds.jibx.TestJibxMappings.testUnmarshallObjectsFromFile(TestJibx
Mappings.java:98)
>>      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>>      at
>>
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.jav
a:39)
>>      at
>>
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessor
Impl.java:25)
>>      at java.lang.reflect.Method.invoke(Method.java:324)
>>      at
org.testng.internal.MethodHelper.invokeMethod(MethodHelper.java:580)
>>      at org.testng.internal.Invoker.invokeMethod(Invoker.java:473)
>>      at
org.testng.internal.Invoker.invokeTestMethod(Invoker.java:567)
>>      at
org.testng.internal.Invoker.invokeTestMethods(Invoker.java:834)
>>      at
>>
org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.
java:125)
>>      at
org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:109)
>>      at org.testng.TestRunner.runWorkers(TestRunner.java:689)
>>      at org.testng.TestRunner.privateRun(TestRunner.java:566)
>>      at org.testng.TestRunner.run(TestRunner.java:466)
>>      at org.testng.SuiteRunner.runTest(SuiteRunner.java:301)
>>      at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:296)
>>      at org.testng.SuiteRunner.privateRun(SuiteRunner.java:276)
>>      at org.testng.SuiteRunner.run(SuiteRunner.java:191)
>>      at org.testng.TestNG.createAndRunSuiteRunners(TestNG.java:808)
>>      at org.testng.TestNG.runSuitesLocally(TestNG.java:776)
>>      at org.testng.TestNG.run(TestNG.java:701)
>>      at org.testng.remote.RemoteTestNG.run(RemoteTestNG.java:73)
>>      at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:124)
>>
>>
------------------------------------------------------------------------
-
>> This SF.net email is sponsored by: Microsoft
>> Defy all challenges. Microsoft(R) Visual Studio 2008.
>> http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
>> _______________________________________________
>> jibx-users mailing list
>> jibx-users@lists.sourceforge.net
>> https://lists.sourceforge.net/lists/listinfo/jibx-users
>>
>>
>>     
>
>   

------------------------------------------------------------------------
-
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
jibx-users mailing list
jibx-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/jibx-users


-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
jibx-users mailing list
jibx-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/jibx-users

Reply via email to