Hi Robert,
based on the refactoring branch I created a TypeMapper that looks like this:

public class BetwixtTypeMapper extends SimpleTypeMapper
{
  protected HashSet attributes = new HashSet();
  protected HashSet elements = new HashSet();

  public synchronized void registerAsAttribute(String propertyName) {
    if (elements.contains(propertyName)) elements.remove(propertyName);
    attributes.add(propertyName);
  }

  public synchronized void unregisterAttribute(String propertyName) {
    attributes.remove(propertyName);
  }

  public synchronized void registerAsElement(String propertyName) {
    if (attributes.contains(propertyName))
        attributes.remove(propertyName);
    elements.add(propertyName);
  }

  public synchronized void unregisterElement(String propertyName) {
    elements.remove(propertyName);
  }

  public Binding bind(
    String propertyName,
    Class propertyType,
    IntrospectionConfiguration configuration) {
    if (attributes.contains(propertyName))
       return SimpleTypeMapper.Binding.ATTRIBUTE;
    if (elements.contains(propertyName))
       return SimpleTypeMapper.Binding.ELEMENT;
    return
       configuration.isAttributesForPrimitives() ?
       SimpleTypeMapper.Binding.ATTRIBUTE :
       SimpleTypeMapper.Binding.ELEMENT;
  }
}

It can be used like this:
  BetwixtTypeMapper btm = new BetwixtTypeMapper();
  btm.registerAsAttribute("id");
  ic.setSimpleTypeMapper(btm);
  XMLIntrospector xi = beanReader.getXMLIntrospector();
  xi.getConfiguration().setSimpleTypeMapper(btm);

If you like you can add this typemapper as an example to the betwixt distribution.

Sebastian

robert burrell donkin wrote:

hey Sebastian

i have some good news and some less good news:

the good news is that i've added a pluggable strategy for binding simple types (primitives at the moment). i hope that you should be able to subclass the new SimpleTypeMapper class with something a litte like:

/** Implementation binds strings to elements but everything else to attributes */
class StringsAsElementsSimpleTypeMapper extends SimpleTypeMapper {


        /**
         * Binds strings to elements but everything else to attributes
         */
        public Binding bind(
                            String propertyName,
                            Class propertyType,
                            IntrospectionConfiguration configuration) {
            if (String.class.equals(propertyType)) {
                return SimpleTypeMapper.Binding.ELEMENT;
            }
            return SimpleTypeMapper.Binding.ATTRIBUTE;
        }

}

the less good news is that i needed to add it on the refactoring branch (since the code involved on CVS HEAD has been refactored on the branch). so you'll need to grab the REFACTORING-BRANCH_2004-01-13 version of the source from cvs and build it yourself (probably using http://maven.apache.org).

i may get round to adding some documentation on it but again this will be on the branch.

- robert


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]



Reply via email to