Hi all,

Preamble: I do remember we had talks about inward flows, etc... Then
somebody (sorry, already forgot who it was) wrote about transformer
which writes file as a side effect... Then Kinga proposes to add
handlers reacting on input stream/documents... And recently I have got
an idea that it should be quite an elegant way to handle all this if
Cocoon is designed symmetrically: whatever abstractions we have to
handle outgoing flow, let apply to the in-flow.

First of all, we already (almost) have symmetry in pipelines: generators
are symmetrical to serializers. Generators are able to produce XML
content out of almost anything we can think of: physical file, HTTP
resource, SQL database, XMLDB database, incoming request, etc.
Unfortunately, serializers are somewhat limited comparing to the
generators: the only out option we have is output stream. Let's expand
this to the other sources as well. Then we can have, say, file
serializer. Coupled with the ability of Sources to handle input streams,
one can save XML stream into file, XMLDB, and other sources were
protocol handler exists.

Second. Now Cocoon perfectly handles aggregation, both on sitemap level
and using aggregated transformers. But what we have opposite to the
aggregation? Nothing. Let's add separation notion: result will be
several SAX streams. Every stream will have a destination pipeline. This
pipeline will be retrieved by "separator", and generator of the pipeline
will be replaced by the "separator" which will feed SAX events into this
pipeline. As you see, it is same mechanism aggregator employs but
reversed. 

Third. To top all this, symmetrical component is to be developed to the
X/C Include transformers. As "separator", it will extract parts of the
stream and send them to the other pipelines.

At last, let's consider an example. Let it be some request from the user
to perform modification of the XML resource stored in the file (poor
man's CMS ;)

<!-- inflow internal -->
<map:match pattern="get-data">
  <map:generate src="data.xml"/>
  <map:serialize type="/dev/null"/>
</map:match>

<map:match pattern="get-mods">
  <map:generate type="request"/>
  <map:transform src="request2data-mods.xsl"/>
  <map:serialize type="/dev/null"/>
</map:match>

<!-- main -->
<map:match src="update">
<map:act type="validate-user-input">
  <map:aggregate>
    <map:part src="get-mods" element="mods"/>
    <map:part src="get-data" element="data"/>
  </map:aggregate>
  <map:transform src="apply-mods--return-data-and-result.xsl"/>
  <map:transform src="add-index-update.xsl"/>
  <map:transform src="add-news-page-update.xsl"/>
  <map:separate>
    <map:part src="put-data" element="data"/>
    <map:part src="update-index" element="index-update"/>
    <map:part src="update-news" element="index-update"/>
    <map:part src="update-result" element="result"/>
  </map:separate>
</map:act>
</map:match>

<!-- outflow internal -->
<map:match pattern="put-data">
  <map:generate type="/dev/null"/>
  <map:serialize type="file" src="data.xml"/>
</map:match>

<map:match pattern="update-index">
  <map:generate type="/dev/null"/>
  <map:transform type="lucene"/>
  <map:serialize type="/dev/null"/>
</map:match>

<map:match pattern="update-news">
  <!-- ... -->
</map:match>

<map:match pattern="result">
  <map:generate type="/dev/null"/>
  <map:transform type="result2html"/>
  <map:serialize type="html"/>
</map:match>

PS: /dev/null: Currently, aggregator ignores serializer. That's to show
that this is the dummy serializer.


Hope this makes some sense and can be a start for a good discussion :)

Vadim



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

Reply via email to