Peter didn't see my cross post with the Follow-Up, so I'm forwarding his
answer from dev list:
----- Forwarded message from "Hunsberger, Peter" <[EMAIL PROTECTED]> -----
> From: "Hunsberger, Peter" <[EMAIL PROTECTED]>
> Subject: RE: concatenate two pipelines (was on dev list: Re: Running Schematron
> validation from flow)
> Date: Tue, 30 Dec 2003 09:54:31 -0600
> To: [EMAIL PROTECTED]
>
> Sebastian Klamar <[EMAIL PROTECTED]> asks:
>
> >
> > * Hunsberger, Peter [2003-12-29 21:45 +0100] wrote:
> > > Ok, figured this out: don't use copy, use
> > processPipelineTo and use
> > > the xmodule as the target... So far so good, except I'm not seeing
> > > the result in the request attribute after I've written it.
> > >
> > > I might note that if this works we've sort of got the
> > capabliity for
> > > dynamically composing pipelines in flowscript: run
> > whatever pipeline
> > > you want to write whatever data into memory, later run a regular
> > > pileline to aggregate this in memory data with it's normal
> > output....
> >
> > Peter, could you be more verbose how to concatenate several
> > pipelines together with the help of the new xmodule?
> >
>
> <snip/>
>
> I can try. In the flow you can do something like:
>
> var sourceURI = "cocoon:"+target_pipeline;
> var destinationURI = "xmodule:request-attr:tempstorage";
> var resolver = null;
> var destination = null;
> try
> {
> resolver = cocoon.getComponent(
> Packages.org.apache.cocoon.environment.SourceResolver.ROLE );
> destination = resolver.resolveURI( destinationURI );
> output = destination.getOutputStream();
> cocoon.processPipelineTo( sourceURI, {}, output );
> output.close();
> } finally {
> if (destination != null)
> resolver.release( destination );
> cocoon.releaseComponent( resolver );
> }
>
> This will cause Cocoon to run the "target_pipeline" and stash the
> contents in the request attribute "tempstorage" (in this case). Later,
> when you want to get at the data you can run a generator that pulls the
> data back out of the request attribute. In particular, the request
> generator will do the trick with the "generate-attributes" parameter if
> you don't mind getting all of the rest of the request data and having to
> parse some pretty long xpath to find the data:
>
> <map:generate type="request">
> <map:parameter name="generate-attributes"
> value="true"/>
> </map:generate>
>
> You can of course run as many of these arbitrary pipelines as you want,
> stashing the contents into as many variables as you want, and then use
> map:aggregate to aggregate all the data from all the attributes one by
> one or have a generator that just knows what attributes to look at all
> at once (or just grab all attributes as per the request generator).
>
> Note, that you can also grab the data back out of the output stream at
> the time it is generated and stash it in a flow variable. This can then
> be passed back into a pipeline as variable (though parsing it will
> require treating it as a nodeset if using it as XML -- no big deal).
>
> I'm not quite sure what to think of this approach overall, it seems to
> push the boundaries of clean Cocoon design. However, for us it makes
> running Schematron as a validator very straight forward, I can basically
> write a sendPageAndValidate function that returns a Boolean if the page
> is valid, so flow looks like:
>
> var valid = false;
> while ( !valid )
> {
> valid = _sendPageAndValidate( "run/_page/" + screen );
> }
> cocoon.sendPage( "run/_page/" + nextscreen );
>
> Each sendPage picks up any errors created by the previous validation
> pass and most importantly to us we have full access to the Cocoon
> pipeline within Schematron so we can cross validate data from one screen
> with data (already in our database) produced by another screen. The
> trick here is to have the validating pipeline run a simple transformer
> that looks for Schematron assert statements in the output stream and
> sets another request variable indicating what it found. You can then
> pick this back up in the flow function I gave at the top of this reply:
>
> if ( cocoon.request.getAttribute( "validationErrorLevel" ) == 0
> )
> return true;
> else
> return false;
>
>
----- End forwarded message -----
Sebastian
--
Dinge, die man nicht h�ren will, wenn man operiert wird:
�Ich w�nschte, ich h�tte meine Brille nicht vergessen.�
************************************************************************
PGP Key: 0x1E727CE6 / 9085 48BD 8332 4BFC D80C A6CF D162 20BB 1E72 7CE6
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]