I've been thinking about this kind of thing myself lately.  One thing I
realized early on is that you need at least two different interfaces,
because sometimes you'll need to transform to a new instance of an
immutable object, and other times you'll need to transform to an
existing object.  In other words, some Morphers need to have this:

     void morph(Object input, Object output) throws MorphException.
IOException;

for reasons that you state, but others need to have this:

     Object morph(Object input) throws MorphException. IOException;

for example, a Morpher that translates some object to a String.

Most of the time, you probably won't be able to do both types, so you
need two different interfaces. :-\

-- 
Tim Moore / Blackboard Inc. / Software Engineer
1899 L Street, NW / 5th Floor / Washington, DC 20036
Phone 202-463-4860 ext. 258 / Fax 202-463-4863


> -----Original Message-----
> From: Nicola Ken Barozzi [mailto:[EMAIL PROTECTED]] 
> Sent: Tuesday, June 04, 2002 4:19 PM
> To: Jakarta Commons Developers List
> Cc: [EMAIL PROTECTED]; 
> [EMAIL PROTECTED]; 
> [EMAIL PROTECTED]; [EMAIL PROTECTED]; Avalon 
> Developers List
> Subject: [Morphos] Java data morphing package
> 
> 
> *CROSSPOST * PROPOSAL OF PARTICIPATION *
> 
> Welcome to the first public discussion about project Morphos.
> 
> This message is being posted to many lists because it has the 
> aim of solving a common need.
> 
> The discussion will continue, for those interested, on the 
> jakarta commons mailing list. To subscribe, send an empty 
> mail to [EMAIL PROTECTED]
> 
> 
> What is Morphos?
> -----------------------------
> Morphos will be a Java Api and implementation for 
> transforming data, in any form it may be: xml, streams, objects.
> 
> It focuses on the API and framework, and demands 
> implementation to other projects-modules wherever possible.
> 
> 
> Why Morphos?
> -----------------------------
> Morphos starts from a need around a community of developers, 
> with an initial charter committed in Jakarta Commons Sandbox. 
> Before anything got committed, it has slightly evolved from 
> being tied initially to XML. Here is the old charter 
> (http://cvs.apache.org/viewcvs/jakarta-commons-sandbox/morphos
> /PROPOSAL.txt?
> rev=HEAD&content-type=text/vnd.viewcvs-markup).
> 
> This mail illustrates the latest status of the private 
> discussions, and a is the start of the public one.
> 
> Currently there are many projects that need or would benefit 
> from a generic transformation API:
> 
>   - Jakarta POI -
> 
>       OLE<->XML transformations
> 
>   - Cocoon -
> 
>         using a single api and a contrib section for the
>         loads of components it now hosts in the core
> 
>   - FOP -
> 
>         redesigning the main interface for FO<->PDF,MIF,...etc
> 
>    - Krysalis Wings -
> 
>          transforming chart XML format to SVG or image formats
> 
> Other projects that can be wrapped round this api are numerous:
>   - Batik (image transcoders)
>   - Xerces-Xalan
>   - Avalon Excalibur Converter
>   - Commons Digester
>   - Jakarta-commons-sandbox Jelly
>   -  etc...
> 
> A componentization of the transformation process can help 
> reuse and minimize code duplication.
> 
> 
> What does it do?
> -----------------------------
>  Morphos should simply do:
> 
>  data  --> morphos ---> data
> 
>  Data can be:
>    - stream
>    - events
>    - objects
> 
> I don't see other basic generic "data" types, since files and 
> such can become streams and viceversa without any format or 
> form conversion. I want a *very* simple api, with no 
> duplicated methods. IE having get(Stream) and get(File) is 
> not necessary IMO, since they do the same thing. The main API 
> must be very simple. We can always add helper classes.
> 
>  I took look at these APIs:
>  - Jaxp
>  - Batik Transcoder
> 
> Jaxp:
> Baised towards xml (more in package names than in fact). 
> Already has a bad track on version using (the infamious 
> "endorsed" dir and param). Uses static method for getting the 
> transformer.
> 
> Batik Transcoder:
> Good API but it's source can contain a Reader, InputStream, 
> Contenthandler, etc, so it's tied to these. No support for 
> pipelining of transcodes.
> 
> Ok, but in Concrete?
> ------------------------------
> 
> Here is the proposed API, all in package org.apache.commons.morphos:
> 
> /**
>  * The interface that is implemented by classes that morph.
>  * It uses two params and not a return value to make it usable with
>  * event based Objects (contenthandlers).
>  * Parameters are key pairs, used to configure the Morpher.
>  * Events in the Morpher are notified by registering a 
> listener.  */ public interface Morpher {
> 
>     void morph(Object input, Object output) throws 
> MorphException. IOException;
> 
>     void addParameter(String paramName, String paramValue);
>     String getParameter(String paramName);
>     void remove Parameter(String paramName);
>     String[] getParameterNames();
>     String[] getParameterValues();
> 
>     void addNotificationListener(NotificationListener nl);
>     void removeNotificationListener(NotificationListener nl);
>     void clearNotificationListeners();
> 
> }
> 
> /**
>  * A Morpher made out of a sequence of morphers.
>  */
> 
> public interface MorpherPipeline extends Morpher {
> 
>     void addStage(Morpher nextMorpher);
> 
> }
> 
> 
> 
> /**
>  * The Factory for Morphers.
>  * There is a getDefaultFactory method for easy use.
>  * Used in frameworks it's better not to use it and rely on
>  * services that give the proper MorpherFactory.
>  */
> public abstract MorpherFactory  {
> 
>     Morpher getMorpher(DataType inputType, DataType outputType);
>     Morpher getMorpher(name);
> 
>     Morpher getPreparedMorpher(DataType inputType, DataType 
> outputType);
>     Morpher getPreparedMorpher(name);
> 
>     static MorpherFactory getDefaultFactory();
> }
> 
> 
> /**
>  * Describes what the format of the data is.
>  * It consists of a mimetype (format) and a dataForm (representation).
>  * For example a gif image file and a jped image file have a 
> different mimetype but same dataform (file).
>  * An SVG file and an SVG DOM in memory have same mimetype 
> but different dataform.  */ public interface DataType {
> 
>     void setMimeType(String mimetype);
>     void setDataForm(String format);
> 
>     String getMimeType();
>     String getDataForm();
> 
> }
> 
> 
> --
> Nicola Ken Barozzi                   [EMAIL PROTECTED]
>             - verba volant, scripta manent -
>    (discussions get forgotten, just code remains)
> ---------------------------------------------------------------------
> 
> 
> 
> --
> To unsubscribe, e-mail:   
> <mailto:commons-dev-> [EMAIL PROTECTED]>
> For 
> additional commands, 
> e-mail: <mailto:[EMAIL PROTECTED]>
> 
> 

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

Reply via email to