Coming to a theater near you, Cocoon 2.1: Same Plot, Different Story!

I haven't read anything that sums up the overall design of Cocoon since
the 1.x days.  I think it is high time that we do that so that we as
developers know what Cocoon should be.  It has grown, and the level of
plot twists and merging of story-lines in Cocoon makes it a daunting
task of learning it.  Perhaps this mail can make it to an xdoc, if there
are any enterprising developers who are inclined to do so.

Cocoon is an XML application, with the underlying storyline of rendering
XML documents in multiple ways.  For this reason, we have the basic
Generator, Transformer, Serializer chain.  However, in Cocoon 2.0 the
plot thickened with the introduction of the Sitemap to control that
process in a much cleaner manner.  Our analysis begins there because
it is so important.

                    -o Scene 1: The Sitemap o-

Sitemap:

I am the end all and be all.  To render or to redirect, that is
the question.  Whether tis nobler to suffer the slings and arrows of
feature creep, or by tyranical rule end them.

Commentary:

The sitemap's purpose is to decide how to assemble the pipeline.  It
takes its cues from the requested URL, and the current environment.
Because of its awesome responsibility, the Sitemap has three supporting
actors: the Matcher, the Selector, and the Action.  These are the tools
we were given to determine which component to use for each part of the
pipeline.

The pipeline is an abstract concept, and not a formal role in the play.
It should not be made a concrete player, and should be a dumb servant
of the Sitemap.  The sitemap chooses whether it will place a formal
component in the pipeline, or an element from the cache.  The decision
of how to use a cache is the decision of the Sitemap, not the pipeline.
(At least in my mind this is how it should be).

                   -o Scene 2: The Rendering o-

Servlet: Process this request, please.
Sitemap: Minions! Where should I focus my attention?
Matcher: Here, my lord, here.
Action:  In that case, I have something to do.
(scuffling in the background)
Action:  I have failed my mission, you need to look there instead.
Selector: I have the correct Generator for you.
Matcher: Here are the 3 Transformers and the Serializer.
Sitemap: Good work minions.  I already have information from them.
          Wait! Transformer #3, you changed.  Cache, retrieve information
          from GTT!
Cache:   Here you are, my lord.
Sitemap: Transformer #3, take these results and give them to Serializer
          when you are done.
Transformer #3:  Alas, my lord, this is not XML!
Sitemap: Error Handler! turn yourself into Servlet.

Commentary:

The decision process to choose the proper pipeline is not straight
forward.  There is alot of interaction between the supporting roles for
the Sitemap.  In fact, this interaction is the source of much of the
learning curve that Cocoon requires.  My suggestion is to simplify.  Let
us go back to the simple definition of the Sitemap:  The sitemap chooses
the resource to be rendered based on the environment and the request.

All the rest of the interactions are specific to a particular sitemap.
In essence, the FlowMap could be viewed as just another sitemap--it just
has different semantics.  In fact, I might argue that the semantics are
a bit easier to grasp for programmers.  The FlowMap does not have any
pretense to being declarative.  It is procedural by nature.  The Sitemap
in its current incarnation mixes declarative and procedural aspects,
which is another source of confusion.

The XML pipeline is an easy concept to grasp, and is the core reason why
developers are constantly interested in Cocoon.  The story of
controlling the flow of information is also compelling, unfortunately we
have not found a good voice for the story yet.  Either we pursue a
purely declarative pipeline (as I have suggested with a thread a while
back separating pipeline declaration and only matching based on URI).
The "componentization" of Cocoon will help us in telling the story.

                 -o Scene 3: The Supporting Cast o-

Generator: I need a Stream for "context://docs/foo/bar.xml".
Resolver:  Let me see....  Oh! Context Protocol Handler, where is
            "/docs/foo/bar.xml"?
ProtocolHandler: Here, let me give you the handle.
Resolver:  Generator, here is your handle.
Generator: I need the XML fragment from XPath "/document/s1/p[3]"
XPathProcessor: Your XML fragment, sir.
Transformer: Give me a datasource!
DataSourceComponent: Here is a connection.
Transformer: How do I translate that into Spanish?
I18N: I have the translation!
Serializer: HTML here we come.

Commentary:

We have so many supporting roles in Cocoon, it is hard to keep them
straight.  In fact, I dare say we have so many that not one of us knows
what all we have.  We need to make some decisions on how to handle the
situation.  Some components are used by only one implementation of a
component, while others are used by many implementations.

We should take stock, and all roles that only support one implementation
of a component should be included with that component as a supporting
class.  We should only have as a supporting role components that service
the Sitemap, or supports a number of implementations of Generator,
Serializer, Transformer, and Reader.

All other roles, we should either factor out into other jars that are
included as we need them, or made as helper classes to the one or two
other components it serves.  It is something that should be done on a
case by case basis.  We need to simplify Cocoon to the point where we
can understand it, and convey what it is in only one or two sentences.

I think part of the feature creep affecting Cocoon is that it is all
things to all people.  Therefore, people adapt it to things that were
beyond the original scope.  We need to define Cocoon, and its place
in this world.  Is it an application framework, or is it an XML
rendering framework--leaving the real logic to J2EE or .NET as they
both can speak XML.

By simplifying, we can also aleviate bottlenecks in the system.  Those
bottlenecks are adversely affecting Cocoon's scalability.  Part of the
problem is the large number of component types we have.  We should not
have even two interfaces that do the same thing, but have different
methods.  We need to merge concepts that can be merged, and clean up
what we have.  Otherwise, Flexibility Syndrome (FS) will kill this
project and noone will understand it.

                -o Scene 4: The Final Farewell o-

Sitemap: Beware the FS, it will kill you!  Beware the FS, Beware!

(humor injected to keep you reading)

:)


-- 

"They that give up essential liberty to obtain a little temporary safety
  deserve neither liberty nor safety."
                 - Benjamin Franklin


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

Reply via email to