> From: Stefano Mazzocchi [mailto:[EMAIL PROTECTED]]

<OT> I like the subject :) </OT>
 
> This is explicitly provocative, but this is very important so here it
> goes:
>
> suppose we have implemented what Vadim proposed in the his earlier
> thread: so 'separators' and a way to instruct the pipelines to direct
> the serializers' output to different output streams.
> 
> Suppose you give this to a Cocoon user.
> 
> Oh, he loves it. Elegant, simple, very straightforward.

Thanks, I will take this as a compliment :)


> He uses it like this
> 
>                   pipeline1 ---> disk
>                 /
>  POST request -*
>                 \
>                   pipeline2 ---> response
> 
> It looks so nice... but, wait, how do I know there was an error saving
> the file? or sending an email? or printing the PDF on the printer? or
> stream a request to nuke the alien insects orbiting around jupiter?

There are some options:
1. Throw an exception. Remember, pipelines are processed in a serialized
fashion, in one thread. You are in charge to set the order of execution.
2. Log an error into a log file
3. SNMP trap
4. email to sysadmin
5. <here can be your option>

(2, 3 are very popular in the place were I'm currently employed)

 
> Hmmmm, I have to stop the pipeline2 until the pipeline1 has finished
and
> returned me an error code.

This is not right 'cause see (1) above. Exception thrown in sub-pipeline
will have same effect as exception thrown in regular Cocoon pipeline. I
see no difference.


> Gosh, I have to implement a way to pass things... a shared memory?

You have:
1. Request attributes
2. Session attributes
at your disposal. May be even global attributes (analogue to
"application" scope in JSP - do we have it in Cocoon?) I did not put
objectModel as third option because there is no consensus on how can it
be used.


> ah, no should I implement Contextualizable?
> hmmm....
> 
> oh, but look: what if I do something like
> 
>  request -> pipeline -> response
>               | ^
>               v |
>               disk
> 
> Now I did save the file and I know the the error right there.

That's another approach and is still valid and *very* useful in some
(other) cases, and I would be first one against prohibiting this. I vote
for flexibility (you always can stop me when it grows into syndrome ;))
and extensibility, which we have in Cocoon now: every type of person can
find his "sweet spot" in Cocoon, be it XSP and logicsheets, or custom
made transformers, or anything else.


> what? you said it was more complex because the serializer was easier
to
> use?
> 
> Bah, I implemented a "serializing" component that gave me that service
> in a few calls, the cocoon serializers are simply sitemap components
> wrapping this other avalon component. A sitemap-semantic adaptor, if
you
> with. I got the same functionality in my code using Avalon and Java.
So
> I wrote a simple transformer that did all this, save where I wanted
with
> a few lines of code and that was it.
> 
> .....
> 
> I'm starting to think this 'separator' concept is going to be a
> nightmare for users, also because it seems to promising.

Might be, hence this is an [RT] and the point of the discussion is to
choose the right approach (and one of them is - leave everything as it
is). But as you sad, it is promising, that's why I think it's important
to discuss and extract usefulness leaving nightmare were it belongs.


> But can it stand the apparent elegance expectation?
> 
> remember Pascal: I'm writing you a long letter because I lacked the
time
> to make it shorter.
> 
> Which can be translated with: I'm adding more sitemap semantics,
because
> I lacked the time (will?) to make it shorter and force you in
directions
> that we know are better for you down the road.
> 
> Comments?

One more comment on this. If the lack of the response is the only thing
stopping this idea to be reality...

I have another one, it provides different functionality but it features
similar approach. As I don't have a name for this (multiplexer?), here
is the diagram:

                  - pipeline1 -
                 /              \
request -> A -> X - pipeline2 - X -> C -> response
                 \              /
                  - pipelineN -

Explanation:
1. Request goes in
2. Pipeline is being constructed from A, X, C
3. SAX events passed from the A to X, where they are dispatched (same as
separator) to several other pipelines
4. SAX events passed from these events reassembled into the one SAX
stream by the same instance of X component
5. Result passed down the original pipeline to the C
6. C spits out the response

Don't answer "hey, you can do this with content aggregator" - it is not
true, this is a different thing.

Waiting for comments...

Vadim
 
> --
> Stefano Mazzocchi      One must still have chaos in oneself to be
>                           able to give birth to a dancing star.
> <[EMAIL PROTECTED]>                             Friedrich Nietzsche
> --------------------------------------------------------------------


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

Reply via email to