On Tuesday, July 2, 2002, at 01:54 PM, Stefano Mazzocchi wrote:
> In light of the discussion on blocks, Sylvain pointed out that cocoon
> services should be mapped to pipelines and not to resources directly.
>
I totally agree with that suggestion.
<snip/>
>
> We call 'Cocoon pipeline' the collection of all filters (transformers)
> and adapters (generator and serializer) because there cannot be a
> pipeline without adapters.
>
> I think it's time to challenge this concept.
>
Great!
> - o -
>
> What are sitemap resources?
> ---------------------------
>
> Let me tell you: they are a mistake, a mistake I did trying to reduce
> the sitemap verbosity and fixing a problem that didn't yet emerged at
> that time. Early optimization is the root of all evil and I see that
> now: resources overlap with pipelines.
>
+ 1x10^6
I never liked map:resource, always having to be at the end,
makes them far less useful for pipeline reuse!
It's like going to a plumber's merchant to buy some joints and
they say 'yes we have elbows and tee joints, but they are all
pre-assembled into special shapes, you cannot buy them
individually'. :P
>
<snip/>
> Composing pipelines
> -------------------
>
> Let me assume the above syntax gets introduced. At this point, we have
> four different ways to call a pipeline:
>
> - as a pipeline
> - as a generator
> - as a transformer
> - as a serializer
>
> let me write the code so you understand what I mean:
>
> [using a pipeline as a pipeline] (as today)
>
> <pipeline>
> <match pattern="*">
> <call pipeline="blah"/>
> </match>
> </pipeline>
>
> nothing fancy here. Used mainly for verbosity reduction when the same
> pipeline is used in different places.
>
> [using a pipeline as a generator]
>
> <pipeline>
> <match pattern="*">
> <call pipeline="blah"/>
> <transform .../>
> <serialize ../>
> </match>
> </pipeline>
>
these are both the same as:
<pipeline>
<match pattern="*">
<generate src="cocoon:/blah"/>
</match>
</pipeline>
> in this case, the 'serializer' of the called pipeline is not used and
> the output of the last tranformer of the named pipeline is connected
> with the input of the transformer right after the call.
>
> This is equivalent of *overloading* the serializer of the called
> pipeline with the rest of the pipeline in place.
>
> [using a pipeline as a transformer]
>
> <pipeline>
> <match pattern="*">
> <generate ../>
> <call pipeline="blah"/>
> <serialize ../>
> </match>
> </pipeline>
>
This we cannot currently do, and it would be an excellent addition!
We have two different transformation types here (as others have
pointed out)
1. a sub-pipeline that generates an XSLT Stylesheet
2. a sub-pipeline that does some transformations for you
Case 1 you do like this:
<map:transform src="cocoon:/make-xslt"/>
Case 2 we cannot do right now and would be a great addition!
> where both the generator and the serializer of the named pipeline are
> not used.
>
so why have them in there?
> This is equivalent of *overloading* both the generator and the
> serializer of the called pipeline with the rest of the pipeline in
> place.
>
> [using a pipeline as a serializer]
>
> <pipeline>
> <match pattern="*">
> <generate ../>
> <tranform ../>
> <call pipeline="blah"/>
> </match>
> </pipeline>
>
> where the generator of the named pipeline is not used.
>
> This is equivalent of *overloading* the generator of the called
> pipeline
> with the rest of the pipeline in place.
>
> - o -
>
> So, here is what I propose:
>
> - add the 'pipeline' attribute to 'map:call'
> - add the 'name' attribute to 'map:pipeline'
I think it is interesting that you want to do this to the
pipeline rather than individual matchers.
Hmm.
Considering you can do this in XSLT:
<xsl:template match="blah/*" name="call-blah"/>
to make a template that can be 'called' in two different ways ....
Would it make more sense to do this instead?:
<map:match pattern="blah/*" name="call-blah"/>
> - deprecate the 'map:resources' element
you can replicate this with map:redirect-to (internal redirect?)
> - deprecate 'internal-only' attribute of 'map:pipeline'
> [because named pipelines become implicitly internal-only]
See above ....
> - allow 'map:call' to be executed in any place, performing the
> pipeline
> overloading behavior I explained above.
>
I think overloading is a grand idea in principal, though I fear
it will be confusing and difficult to understand in this context
(unless you are a Java architect ;)
I think 'underloading' ;) would make it easier to read the sitemap.
ie. I call an internal pipeline, if that pipeline serialises, I do not.
So following on from that (maybe this is where it breaks down),
if you call an internal pipeline which generates, it's output
replaces yours (!).
> What do you think?
>
I think the idea of having a pipeline snippet, that is able to
be 'called' from the middle of another pipeline is a great idea,
it allows much more effective componentisation and the ability
to hide complexity (in blocks or other pipelines/sitemaps).
What I am not so happy about is being forced to put a component
(generator|serializer) into a pipeline, when it is obviously not
going to be used!
IMHO calling a pipeline snippet (for whatever purpose) should be
equivalent to XIncluding that pipeline snippet into the calling
pipeline at Sitemap runtime.
So:
<map:call pipeline="blah"/> includes pipeline components
While:
<map:generate src="cocoon:/blah"/>,
<map:transform src="cocoon:/blah"/> and
<map:part src="cocoon:/blah"/> import pipeline output
Anyway, I think this (general idea) will lead to great improvements!
regards Jeremy
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, email: [EMAIL PROTECTED]