I know that there is support for mapping via the MapItem class, although
I have yet to try and get this working (I'll explain soon).  However, in
order to use this method you have to do something like: (excerpted from
previous post)

>           <field name="children"
> type="org.exolab.castor.mapping.MapItem" collection="map"
>               get-method="getChildren"
>               set-method="setChildren">
>               <bind-xml>
>                   <class name="org.exolab.castor.mapping.MapItem">
>                      <field name="key" type="string">
>                          <bind-xml name="item.key" node="element"/>
>                      </field>
>                      <field name="value" type="string">
>                          <bind-xml name="item.value" node="element"/>
>                      </field>
>                   </class>
>               </bind-xml>
>           </field>

This is very nice as it also allows you to specify a handler for the
MapItem fields, etc.  The only thing that would be nicer would be built
in support for maps in the mapping.xml. Something similar this would be
nice: *big grin*  


>           <field name="children"
> type="org.exolab.castor.mapping.MapItem" collection="map"
>               get-method="getChildren"
>               set-method="setChildren">
>               <bind-xml>
>                      <map-key name="item.key" type="string" handler="MyHandler" 
> node="element"/>
>                      <map-value name="item.value" type="string" handler="MyHandler" 
> node="element"/>
>               </bind-xml>
>           </field>


My problem however is that I don't think XDoclet yet supports the current
bind-xml syntax and I use XDoclet to generate my mapping.xml for many
many objects across my application and to simplify the process of
developers adding new objects to the castor mapping.  

So my questions are:
1) Does XDoclet support this syntax or will it in the near future?
2) Who is the maintainer of the castor XDoclet tags?
3) If I am at a dead-end using XDoclet for this syntax, is there an
alternative way to use maps?  
4) If the alternative way of using maps is a huge pain, how hard is it to
patch castor or XDoclet to add better support for maps?


Jeremy





On Thu, 19 Feb 2004 12:23:38 -0600, "Keith Visco" <[EMAIL PROTECTED]>
said:
> 
> 
> 
> Hi Till,
> 
> My map test cases seem to be working ok, but based on the information
> you've given below there might be a problem with arrays as values in the
> map, I'll have to double check that. 
> 
> I'll run some additional tests later when I have some free time.
> 
> Here's an example that works fine for me:
> 
> //class: Root
> 
> public class Root {
> 
>   HashMap _children = new HashMap();
> 
>   public HashMap getChildren() {
>       return _children;
>   }
>   public void setChildren(HashMap m) {
>       _children = (HashMap)m;
>   }
> }
> 
> // mapping.xml
> 
>       <class name="Root">
>           <field name="children"
> type="org.exolab.castor.mapping.MapItem" collection="map"
>               get-method="getChildren"
>               set-method="setChildren">
>               <bind-xml>
>                   <class name="org.exolab.castor.mapping.MapItem">
>                      <field name="key" type="java.lang.Object">
>                          <bind-xml name="item.key" node="element"/>
>                      </field>
>                      <field name="value" type="java.lang.Object">
>                          <bind-xml name="item.value" node="element"/>
>                      </field>
>                   </class>
>               </bind-xml>
>           </field>
>       </class>
> 
> And the resulting xml which marshals and then unmarshals without any
> problem:
> 
> <?xml version="1.0" encoding="UTF-8"?>
> <root>
>     <children>
>         <item.key xsi:type="java:java.lang.String"
> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";>key1</item.key>
>         <item.value xsi:type="java:java.lang.String"
> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";>value1</item.value>
>     </children>
>     <children>
>         <item.key xsi:type="java:java.lang.String"
> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";>key2</item.key>
>         <item.value xsi:type="java:java.lang.String"
> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";>value2</item.value>
>     </children>
> </root>
> 
> Thanks,
> 
> --Keith
> 
> [EMAIL PROTECTED] wrote:
> > 
> > Hi Keith,
> > I'm very sorry, but I can't yield the results you are predicting.
> > First of all I want to say, that I am using JDK 1.2.2, but I don't
> > think this matters.
> > I have a simple wrapper class for a hashmap (HashMapWrapper) which
> > contains a single field hashMap of type java.util.Map and appropriate
> > getter and setter. The HashMap's keys are Strings, while the values
> > contain different types (arrays of int, char; BigInteger; ...). When
> > not specifying a mapping file, I can marshall my wrapper class and get
> > keys as well as values in the XML. But when unmarshalling, castor
> > fails at array values with:
> > ValidationException: element "value" occurs more than once. (parent
> > class: org.exolab.castor.mapping.MapItem)
> > 
> > When specifying a mapping like
> > <field name="hashMap" type="org.exolab.castor.mapping.MapItem"
> > collection="map" />
> > 
> > keys aren't marshalled anymore (I guess this contradicts your
> > statement below!)! when unmarshalling the result without the keys
> > (which is not what I want obviously) I get HashMap entries like
> > <value>=<value>.
> > 
> > So the next thing I tried was to specify a mapping for ....MapItem as
> > you mentioned it:
> >         <class name="org.exolab.castor.mapping.MapItem">
> >                 <field name="key" type="java.lang.Object"/>
> >                 <field name="value" type="java.lang.Object"/>
> > 
> >         </class>
> > 
> > doing this doesn't bring me the keys back either, but I get the
> > following additional error-message when unmarshalling:
> > #startElement: hash-map
> > unable to find or create a ClassDescriptor for class: [I
> > #characters:
> > 
> > #startElement: integer
> > org.xml.sax.SAXException: unable to find FieldDescriptor for 'integer'
> > in ClassDescriptor of map-item
> > 
> > I also tried only using the mapping file during unmarshalling - this
> > also doesn't help.
> > So. what are you telling us? ;-)
> > 
> > Thanks for any help!
> > 
> > kind regards
> > Till Kothe
> > 
> >   [EMAIL PROTECTED]
> >                                     To:        [EMAIL PROTECTED]
> >   18.02.2004 22:55                  cc:
> >   Please respond to                 Subject:        Re: [castor-dev]
> >   castor-dev                java.util.Map support
> > 
> > Hi Jeremy
> > 
> > Some upgrades were included in the 0.9.5.3 RC.
> > 
> > When using default introspection, you should notice these changes
> > right
> > away, as both the key and value are now output by default.
> > 
> > When using a mapping file you need to specify this by using Castor's
> > built-in wrapper:
> > 
> > Try the following:
> > 
> > <field name="..." type="org.exolab.castor.mapping.MapItem"
> > collection="map"/>
> > 
> > You don't need to put MapItem's in your map. Castor automatically
> > creates the MapItem  internally for it's own use during
> > marshalling/unmarshalling.
> > 
> > You could also try not specifying the type. I think it defaults to
> > MapItem.
> > 
> > In addition, you can control the names of the element tags by
> > specifying
> > a mapping for the MapItem class:
> > 
> >      <class name="org.exolab.castor.mapping.MapItem">
> >         <field name="key" type="java.lang.Object">
> >              <bind-xml name="id" node="element"/>
> >         </field>
> >         <field name="value" type="java.lang.Object"/>
> >      </class>
> > 
> > The above will change the default name from "<key>" to "<id>". for the
> > key field.
> > 
> > If you have more than one map and you want to have different mappings
> > for each one, you can now also use an inline class mapping directly
> > inside the bind-xml element as such:
> > 
> > <field name="..." type="...MapItem" collection="map">
> > 
> >   <bind-xml>
> >      <class name="org.exolab.castor.mapping.MapItem">
> >         <field name="key" type="java.lang.Object">
> >              <bind-xml name="id" node="element"/>
> >         </field>
> >         <field name="value" type="java.lang.Object"/>
> >      </class>
> >  </bind-xml>
> > 
> > </field>
> > 
> > Hope that helps,
> > 
> > --Keith
> > 
> > Jeremy Haile wrote:
> > >
> > > OK, so this has been mentioned on the list and there are several
> > bugzilla
> > > reports about better support for java.util.Map.  Was this support
> > added
> > > in 0.9.5.3?  Is there any approximate schedule for when this support
> > will
> > > be added?
> > >
> > > Currently the best way to "map" a java.util.Map object is either
> > using a
> > > wrapper object in the XML and a custom FieldHandler to convert to
> > and
> > > from the Map object, or have the key and value be the same (which
> > doesn't
> > > work in most situations) - is that correct?
> > >
> > > I simply want to do a string to string mapping using a
> > java.util.Map.  If
> > > someone could provide an example of the current best practice for
> > maps, I
> > > would appreciate it.
> > > --
> > >   Jeremy Haile
> > >   [EMAIL PROTECTED]
> > >
> > > -----------------------------------------------------------
> > > If you wish to unsubscribe from this mailing, send mail to
> > > [EMAIL PROTECTED] with a subject of:
> > >         unsubscribe castor-dev
> > 
> > -----------------------------------------------------------
> > If you wish to unsubscribe from this mailing, send mail to
> > [EMAIL PROTECTED] with a subject of:
> >        unsubscribe castor-dev
> 
> ----------------------------------------------------------- 
> If you wish to unsubscribe from this mailing, send mail to
> [EMAIL PROTECTED] with a subject of:
>         unsubscribe castor-dev
> 
-- 
  Jeremy Haile
  [EMAIL PROTECTED]

----------------------------------------------------------- 
If you wish to unsubscribe from this mailing, send mail to
[EMAIL PROTECTED] with a subject of:
        unsubscribe castor-dev

Reply via email to