Stefano Mazzocchi wrote:
> Daniel Fagerstrom wrote:
<snip/>
> > To conclude: I belive that xml based selection together with
transformers
> > with side effects can considerably reduce the need for actions and that
it
> > would make it much easier to write Cocoon aplications that takes xml
input.
>
> I think you expressed a very valid point of the need for pipe-based
> selection.
:)

> I have two concerns:
>
>  1) a pipe-selector is really a selector or is it something else?
>
> [translated operationally: should we come up with another interface?]
I am not an expert in the inner workings of the sitemap, so what follows
might not work at all:

The pipe-selector (ideas about a better name?) would look something like
this:
<pipe-selector type="xpath">
  <when test="expr1">
    <!-- pipeline fragment -->
  </when>
  <when test="expr2">
    <!-- pipeline fragment -->
  </when>
    ...
  <otherwise>
    <!-- pipeline fragment -->
  </otherwise>
</pipe-selector>

The general idea is that the pipe-selector buffers it input in e.g. a
DOM-tree, then the tests can be applied to the buffered input. The pipeline
fragment in the first when clause where the test succeed is then feeded with
the buffered input, and its output is send to the pipeline component after
the pipe selector.

How can this be implemented?

The pipe-selector is a transformer (i.e. implements the transformer
interface) extended with a method that lets the sitemap constructor send an
object to the pipe-selector that takes care of the tests and the pipeline
fragment construction for the selected when clause in the pipe-selector.

The actual tests can implement the selector interface if it is ok to put the
DOM-tree with buffered input in the objectModel. A possible issue with this
is that the tests in the selector are performed after that the whole
pipeline is constructed. This might give the unintuitive effect that
components later in the pipeline that effects the objectModel and is
executed during sitemap construction time are executed before the test in
the pipe-selector.

The sitemap stylesheet constructs a class for each pipe-selector instance in
the sitemap. This class contains a method that returns a EventPipeline. The
method executes the tests and constructs and returns an EventPipeline for
the first when clause that succeed. The EventPipline starts with a generator
puts the DOM-tree in the objectModell in a DOMStreamer.

class PipeSelectorInternalPipeN01234 {
  public EventPipeLine constructPipe(SitemapRedirector redirector,
                                     Environment environment,
                                     List listOfMaps) { ... }
}

The code in sitemap_xmap for constructing the pipeline that contains a
pipe-selector is like that for any pipeline that contains a transformer,
with the difference that the "pipe-selector transformer" is given an
instance of its PipeSelectorInternalPipe class.

The algoritm for the PipeSelector is:
* Its input is connected to a DOMBuilder.
* The  DOM-tree is put in the objectModel.
* The constructPipe(...) method of the PipeSelectors
PipeSelectorInternalPipe  class is executed.
* The returned EventPipeline is connected to the output of the PipeSelector
and the EventPipelines process method is called.

I hope that the description above is comprehensible.

>  2) how does this impact performance? how does this impact caching?
>
> [the first impacts the system usage, the second the interface of
> Selectors or PipeSelectors]

The simplest way to implement cashability is to base the cash key generation
on _all_ of the pipeline fragments in the when clauses. This is fairly
unsatisfying as it implies the construction of all of the pipeline fragments
instead of only the one that is selected. It will also decrease the
possibility to cash the PipeSelector and lead to unnecesary recalculation
based on changes in "when clauses" that was not selected. The problem is
that when the generateKey() method is called it is not known what "when
clause" that will be choosen. If we however had a method like
generateKey(key), where "key" is the hash key for the pipeline fragment
before the PipeSelector, "key" uniquely determines the input to the
PipeSelector and thus what "when clause" that will be selected, this
information: the map from key to "when clause", could be stored and the used
to compute the cach key for the PipeSelector only based on the pipeline
fragment in the _selected_ when clause.

Performance: it would of course better to not be forced to store the
SAX-events in DOM-tree, but I do not see much choice. The main use for the
PipeSelector will probably be to make selection based on XML input to Cocoon
and on the output from transformers with side effects, I would guess that
for these cases it will most of the time be quite small documents. Besides
the need for buffering I do not think there should be any sources to
performance botlenecks in a PipeSelector, but I do not know enogh about the
internals of Cocoon to know for sure.

What do you think?, would something along this lines work?

/Daniel Fagerstrom


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

Reply via email to