I have a Java class containing a hash map field (that represents generic
data). The values in the map could be common types such as string, date,
boolean, integer etc.

I also want to define an XML schema (ie the schema and Java are pre-existing
- im trying to write a mapping file between the two).

The java class looks like this

public class ExtensionDataSet
{
        private int mId;
        private String mKey;
        private HashMap<String, Object> mDataMap;
        
        public int getId()
         {return mId;}
        public void setId(int id)
         {mId = id;}
        public String getKey()
         {return mKey;}
        public void setKey(String key)
         {mKey = key;}
        public HashMap<String, Object> getDataMap()
         {return mDataMap;}
        public void setDataMap(HashMap<String, Object> dataMap)
         {mDataMap = dataMap;}  
}

Using this mapping file 

<mapping>
        <class name="com.abc.ExtensionDataSet">
        <map-to xml="extension" ns-uri="http://www.abc.com/schemas/core"/>
                
                <field name="id" type="int">
                        <bind-xml name="id" node="attribute"/>
                </field>
                
                <field name="key" type="string">
                        <bind-xml name="key" node="attribute"/>
                </field>
                
        <field name="dataMap" collection="map">
                <bind-xml name="extension-field" node="element" />
        </field>
        </class>
        
        <class name="org.exolab.castor.mapping.MapItem">
        <map-to xml="extension-field"
ns-uri="http://www.abc.com/schemas/core"/>
        
        <field name="key" type="other">
                  <bind-xml name="key" node="attribute"/>
        </field>
                
        <field name="value" type="string">
                 <bind-xml node="element"/>
        </field>                        
    </class>
        
        
</mapping>

I can get a castor to marshal the class to of the form:

<core:extension xmlns:core="http://www.abc.com/ecm/schemas/core"; id="5"
key="testkey">
<core:extension-field key="key1">
   <core:value>value1</core:value>
</core:extension-field>
<core:extension-field key="key3">
 <core:value xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
xsi:type="date">2008-12-17T18:18:33.066Z</core:value>
</core:extension-field>
<core:extension-field key="key2">
 <core:value xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
xsi:type="java:java.lang.Integer">1</core:value>
</core:extension-field></core:extension>

However this isn't generic enough for our needs - we don't want any mention
of java in the generated XML (the point of going to XML is to be
implementation language neutral - see
http://jira.codehaus.org/browse/CASTOR-769 )

My question is how to do this without references to the java types but
maintaining the type information in the XML. I can see two ways to do this 

1) Use XML types in the xsi:types part of the generated XML above. Castor
already has standard mapping between XML and Java types so is it possible to
set a flag in castor to tell it not to refer to java in the XML and use its
standard mapping instead? ie like it seems to do for date?

2) Use a choice construct in the XSD we will write that allows values in the
XML document to be either <string-value>, <boolean-value> etc and therefore
the types would be enforced in the XML schema for these - ie we would want
to generate XML of the form:

<core:extension xmlns:core="http://www.abc.com/ecm/schemas/core"; id="5"
key="testkey">
<core:extension-field key="key1">
   <core:string-value>value1</core:string-value>
</core:extension-field>
<core:extension-field key="key3">
 <core:date-value>2008-12-17T18:18:33.066Z</core:date-value>
</core:extension-field>
<core:extension-field key="key2">
 <core:integer-value>1</core:integer-value>
</core:extension-field></core:extension>

I actually prefer the second option here and am wondering is there ANY way
to do this in Castor - ie the <bind-xml name> part of the mapping for the
values in the hash map would be different depending on the type of the value
object.

If this isn't possible right now - are there any obvious extension points i
should be looking at in castor? All the logic seems to be in the Marshaller
and Unmarshaller classes?

Thanks for any help 

Dave

-- 
View this message in context: 
http://www.nabble.com/Generic-collection-conversion-and-java-types-tp21074739p21074739.html
Sent from the Castor - User mailing list archive at Nabble.com.


---------------------------------------------------------------------
To unsubscribe from this list, please visit:

    http://xircles.codehaus.org/manage_email


Reply via email to