Greetings All

I have been corresponding with Stephen regarding some design decisions
being made in [convert].  I'd like to make a couple of pugnacious
declarations and hope that ensuing discussion generates good ideas and
consensus.


I'll first state my beliefs, then I'll try to justify them belief at 
great length :-)


1) The actual conversion logic should be implemented in small chunks, 
inside the most primitive, bare code-container, interface :

  public interface Conversion {
    public Object convert(Object value) throws Exception;
  }

One implementation should do one simple, well-specified conversion, 
e.g. String to Integer.  The implementation should be free to make 
documented assumptions about its input and free to throw any exception 
if an assumed precondition is broken.


2) There should be multiple manager classes to implementing distinct
policies for choosing a Conversion.  ConversionRegistry will be one 
such manager.  Other managers may build transitive Conversion chains, 
handle inheritance, provide accessors for primitives, etc.  Clients 
will work with managers, never Conversions themselves.  Managers will 
wrap exceptions thrown by Conversions in ConversionExceptions.  There 
is no one interface that could sum up all possible managers.


I recently implemented a framework similar to [convert], also inspired 
by the limitations of BeanUtils.  The framework evolved to support a 
large (1.5m lines) family of business applications.  The result of the 
painful evolution was what I described above.


For example, having the concepts of "from type" and "to type" near the 
core of the framework proved unhelpful.


One use case where this broke down was this :

Legacy business objects often use java.util.Date to represent any or all 
of a) bare date b) bare time c) date-time.  Therefore in flattening the 
properties of such objects to text three different rules are applied for 
the java.util.Date -> java.lang.String conversion.

By eliminating the "from type"/"to type" concept from the core, this use
case can be handled cleanly.  It requires a simple manager semantic that 
associates a Conversion with a Method or property name.


Another use case forced the simplification of the Conversion interface :

There are cases where a Conversion is highly customized or involves
non-public types.  Being able to implement it as an anonymous class
is very important.

registry.register(GUID.class, new Converter() {
  protected Object convert(Object value) {
    String string = value.toString();
    return new GUID(string.startsWith("0x") ? string.substring(2) : string);
  }
});

This code snippet deals with a quirk of a minor legacy API that may or may
not add a "0x" prefix to hexadecimal values.  If it were hard to implement
the rule in-line, clients would've opted to hack around the conversion
framework, sharply reducing its value.


I am currently negotiating with my employer to release the code to Jakarta.
Hopefully it will help generate some more ideas.

Andrei

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

Reply via email to