It'd be something like this:

<mapping abstract="true" type-name="mixed-set" type="java.util.Set" 
create-type="java.util.HashSet">
  <collection ordered="false">
    <structure name="option" marshaller="..." unmarshaller="..."/>
    <structure name="color" marshaller="..." unmarshaller="..."/>
  </collection>
</mapping>

Then you'd reference this in the two places where you now have a 
<collection name="features" ...> with: <structure name="features" 
field="features" usage="optional" map-as="mixed-set"/>

  - 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



Qazi, Karim wrote:
> 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
>
>   

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