Hi people,

there are a few design challenges that are on the table and I think it's
time for us to attack them in full detail. They are:

 1) flow-based programming 

 2) user-level modularization

 3) pipeline symmetry

                                   - o -

I have the feeling that these concepts are so important that cannot be
handled separately but should be described into a coherent architecture.

'flow-based programming' starts from the evidence that stateful web
applications are poorly described declaratively.

My personal view is that Cocoon describes a very nice and elegant
component model, but introduces a declarative approach for component
control. This is not enough.

I think that Ovidiu's work on Schecon can bring balance to this picture
by making it possible to *choose* between a declarative approach for
pipeline control (using sitemaps) or a procedural approach for pipeline
control (using flowmaps).

The ability to nest one into the other allows something that is not
possible today: since there are frameworks that are web-app focused and
frameworks that are publishing-focues. Cocoon will do both *together*
with seamless integration and elegant coherence.

                                   - o -

User-level modularization will be handled by Cocoon Blocks and with
blocks collections that can be aggregated to create fully functional
modules (just like SAR and BAR for Phoenix)

                                   - o -

The third big question is about pipeline symmetry.

There are several issues that keep on coming up about the pipeline
architecture and its component model:

 1) serializers don't have full access to the component environment and
some want this to be changed

 2) selectors don't have access to the pipeline content and some want
this to be changed

 3) serializers are always associated with the client output stream, so
they can't be used with other streams

 4) if #3 is implemented there is the need for a multiplexor that
divides the pipeline and acts parallely from the aggregator.

                                   - o -

All these requests have valid and useful functional needs. The question,
at this point, is not about the functional needs they express, but about
which is the "best" design decision that can be made to make the
required functionality possible.

"best" is admittedly a personal feeling, but we should try to:

 1) reduce the impact on back incompatibility to a minimum
 2) reduce the creation of 'multipaths' to a minimum (a 'multipath' is
created when there is "more than one way to do it". It's up to *us* to
identify the best way to do something, it's not the user's concern!)
 3) reduce the creation of new components to a minimum (the more stuff
the user has to know, the harder it is to start, the harder it is to
reduce 'multipaths')

With this in mind, I believe that:

 1) serializers shouldn't be considered as normal components, but just a
adaptors for the outside world. They must not need access to information
outside the pipeline. Everything that needs to *augment* the pipeline
should be a Transformer.

 2) pipe-aware selectors and mutliplexed pipelines have separate
concerns, so a decision on one doesn't impact the decision on the other

Now, let's try to give a final result at least on the pipe-aware
selection:

 a) I still believe that selectors shouldn't be pipeline aware.

Let me draw a parallel here: let us consider pipelines that transport
liquids (water, oil, etc...) and let us suppose that we have to 'route'
the flow of those liquids.

So we have things like

           /
          /
  ------[*]---
          \
           \

where the central valve [*] acts as a selector. Let us suppose that we
also have a liquid source (a generator, so to speak), and we might also
have 'T' pipes that 'augment' or 'transform' the liquid flow.

                       /
                      /
 [o]>-----[+]-------[*]----
           |          \
           |           \

Now, let us suppose that the valve needs to know something "about" the
liquid to deviate it's flow (for example, if the liquid pressure is too
high, the valve has to switch exiting pipe)

There are several ways to do this:

 1) the valve has built-in a sensor about liquid pressure

 2) the valve gets coupled with an external sensor

Both solutions work, but the second is more modular and less expensive:
you don't need to have a number of valves each aware of something
different.

Unfortunately, Solution 2) requires communication between the sensor
(transformer) and the valve (selector).

This can be performed:

 1) inside the pipe
 2) outside the pipe

Pipe-aware selection works with #1 and in our example, it would be like
adding a special property to the liquid flowing into the pipeline (say,
coloring the liquid, or altering its pH) and having one standardized
meter built into the valve.

Or, outside the pipe, means transmitting the information in some other
way (in real life, there is an electrical signal between the sensor and
the actuator).

My impression is that pipe-aware selection is 'forcing' metadata to pass
'thru' the pipeline while it doesn't really make sense to do so.

So, IMO, there must be some transformers that obtain the required
selection information from the pipeline, place it somewhere else
(probably someplace in the object model) and have the selectors look at
those 'parallel signals' without having to mess with the pipeline.

So, I restate my -1 on pipe-aware selection and I propose the creation
of a 'parallel transport layer' between components that is based on
objects and not SAX events.

NOTE: this has nothing to do with implementation issues even if, at the
end, will probably result in better performance because 'early
optimization is the root of evil' but 'using antipatterns is even
worse!' :)

Fire at will.

-- 
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