Transformation Selection
tfennelly Mar 25, 2011 5:58 AMAt the moment, BaseTransformerRegistry.getTransformer(QName from, QName to) stores Transformer instances in a Map, keyed off a composite of the to and from QNames. The lookup is a straightforward Map.get(key) operation. If there's a Transformer there that exactly matches the key then we get it, otherwise we get nothing. That's fine.
A bit of a problem arrises out of the fact that there's an obvious type hierarchy in Java, so the above mechansim (strightforward keyed Map lookup) doesn't allow us to easily define a transformer for a family of Java types e.g. java.io.Reader or a generalised Exception type transformer. I came across this before with Exceptions, but punted it. Running into it again now with SWITCHYARD-185. Of course we could work around it by defining <transformer> configs for all possible types in a given type hierarchy, but that's obviously a totally horrible solution.
So to clarify with an example... I want the following transformer to work for any Reader type....
<trfm:transform.java from="java:java.io.Reader" to="java:org.w3c.dom.Document" class="org.switchyard.transform.ootb.xml.BasicDOMTransformer"/>
So no mater if the Message payload contained an InputStreamReader, or a FileReader, or a StringReader etc, the above transfomer would be returned if there was not an exact match. Taking a concrete example of where a Message contains a FileReader instance and a Message.getContent(Document.class) call was made. BaseTransformerRegistry.getTransformer(QName from, QName to) would be called with from and to QNames of "java:java.io.FileReader" and "java:org.w3c.dom.Document" respectively. A lookup on the Transformer Map would be constructed from both of these and nothing would be found. In this situation (for "java:*" types) we understand that a type hierarchy is in place, so the getTransfomer method should be able to fall back to and return the above transformer (where the from QName is "java:java.io.Reader").
I'm knocking out a first pass on this as part of SWITCHYARD-185, but just wanted to throw it out there so others could think about it too.