Just a quickie (more later)

I still really like the phrase "separation of concerns" (not out of date
yet I hope).

I think it should be used more in conjunction with the phrase
"reintegration of concerns"

I'd love to see Cocoon become the perfect instrument for separating and
then reintegrating concerns, and I think this RT is a good step towards
this.

What I'd really like to see would be _comprehensible_ reintegration of
concerns (check the aspectJ/HyperJ syntax for this - v bad; eg looking
at a piece of code, you're not told whether some aspect/concern area
applies to it).

Only one logical conclusion AFAIcan see...C3 is going to be a literate
programming system.  Written in C2!

Allan

-----Original Message-----
From: Stefano Mazzocchi [mailto:[EMAIL PROTECTED]] 
Sent: 03 February 2002 15:35
To: Apache Cocoon
Subject: [RT] Componentizing Cocoon Applications

Cocoon is currently a publishing framework, meaning that is somewhat
more powerful for stateless resources than for stateful ones.

I strongly believe that Ovidiu's work on Schecoon will (sooner or later)
bring balance to this picture, allowing Cocoon to be as powerful with
stateful resources than it is today with stateless ones.

This considered, the concept of 'cocoon application' is to be extended
to include all possible sums of stateful and stateless resource serving.

These RT are based on the assumption that the above is true and try to
address the future needs for cocoon application design, programming,
debugging, refactoring, maintenance, installation and deployment.

                              - o -

Cocoon has been described as a 'framework', a 'pipeline engine' and even
as a 'web operating system'. While one can disagree with these
metaphors, one thing is common between these descriptions: cocoon runs
your applications.

Well, to be honest, today Cocoon runs 'one' application, or, in some
circumstances, a disorganic collection of independent applications
sharing the same URI space.

This reminds me of the trend that appeared on software system: the first
systems were monolithic monotasking environments, then started to appear
multitasking environments, preemptive multitasking (IoC anyone?) and
more recently, component based environments and distributed component
based environments.

In order to grow architecturally, I strongly believe that cocoon must
allow (not force, allow!) the componentization of the applications it is
capable of running.

Why this? in order to allow easier reuse of modules, both in different
applications running at the same time, both in different applications
developped in different times.

I also believe that Cocoon should wait to enter the 'distributed' realm
until this componentization effort is finished. Doing it *before* might
be extremely dangerous (this is the same pattern we followed for Avalon:
get strong locally first, then think of growning distributed)

                              - o - 

Cocoon is an avalon application and avalon applications are
componentized and avalon forced you to design your applications thinking
about the components that make it up.

I would like to do the same with Cocoon applications, just at another
level: Avalon concentrate on modularizing the programming logic, Cocoon
must induce cocoon application designers (I can't talk of programmers
since it should not be a programmer to design a cocoon application but
an entire team sharing different concerns) to modularize their stuff.

But how is a component model for cocoon applications useful?

1) components can be defined behaviorally: in Avalon, if you need a
Store, a Logger, a ThreadManager, a Clock, etc... you just ask for a
component that performs that 'role'. Avalon takes care of everything
else, just hands you the component that you need to do your job. In
short, it reduce concern overlapping between the composer (who uses the
component) and the component. 

I would like the same to happen in Cocoon: a webmail written as a cocoon
application will require user authentication and authorization, mail
transport facilities (both to IMAP and to SMTP), skins, a persistent
repository for user preferences, a persistent repository for addresses
or a connection to the addressbook storage (LDAP, for example), a
connection facility with the server side filter engine (Sieve, for
example), etc...

Being a programmer (like it or not), the 'axis' I use to componentize a
web application is normally the functionality (the logic concern realm).
My personal experience tells me that this is almost never the case for
other types of individuals: graphic designers will divide components
depending on graphical attributes, wording editors will divide
components depending on verbosity and other word attributes
(informative, activity, indications), usability engineers will divide
components depending of the complexity of their flow.

The question is: since these diffenent componentizations *always*
cross-cut, can Cocoon make it possible to have all these coexhist?

I believe so.

The only price to pay is an increased number of contracts between the
different realms and a consequent higher frequency of redesign and
refactor (which might also turn out to be healthy)

Let's make an example: suppose you have three concern realms A,B,C each
with a different 'component' view of the problem and some overlap.

 A           [                    |    |           |    ]
 B           [  |               |            |          ]
 C           [        |           |       |  |          ]

the idea is to have a higher granularity of componentization

             [  |     |         | |    |  |  |     |    ]

and then somewhat glue togheter the components in the same realm

 A           [  *     *         * |    |  *  *     |    ]
 B           [  |     *         | *    *  *  |     *    ]
 C           [  *     |         * |    *  |  |     *    ]

An example of such a 'glue' is content aggregation: things that were
componentized at the 'logic' level are glued back together at 'content'
level.

The drawback is that we have a higher number of 'marks' in the picture
(both '*' and '|') and each one of them is a contract, so eventually
requiring changes and possibly impacting more than one concern island.

                                  - o - 

Now that we have identified the theory, let's try to dive into the
practice.

Suppose we have a simple web site and we want to make it skinnable.

We decide to have a higher order modularization separating 'content'
from 'style' and using the markup schema and the location of the
sytlesheets as a contract between the two components.

The flow of composition is that 'content' requires a 'skin' in order to
be functional.

So, we have component 'MysiteContent' that implements 'Content' and
requires an instance of the component 'Skin'.

We deploy 'MysiteContent' on top of Cocoon, indicating where we want to
mount it (let's say '/' which is the root of the addressing space
handled by Cocoon). 

The deployment descriptor of 'MysiteContent' will indicate that it
requires an instance of 'Skin' in order to operate. Cocoon will prompt
for a list of components that implement the 'skin' role and allow you to
choose between them.

if none is present, you will be asked to provide one.

Of course, this is just an example of functionality: it could be
entirely possible to deploy an entire application with all the required
components inside, but this is just implementation details.

But what does it mean, in practice, that the 'CoolSkin' component
implements the 'Skin' role?

Let me make a sitemap example to see what I envision:

 <match pattern="*.html>
  <generate src="docs/{1}.docbook"/>
  <transform src="[skin]://docbook/docbook2html.xslt"/>
  <serialize/>
 </match>

where the absence of 'protocol' information indicates that the component
should look into its internal addressing space, while the [***]: virtual
protocol indicates that you should connect to the implementation of the
'skin' role that you have choose at deployment time.

So, what is the contract here? the location of the stylesheet in the
internal addressing space of the 'skin'-implementing component.

The above gives us:

 1) complete separation: components are totally independent as long as
their contracts are not touched
 2) polymorphism: I can have multiple implementations of the same role
and decide (even at runtime!) what to choose.
 3) total reuse across different apps: I could use the same module for
different installations and webapps (think of
authentication/authorization module

Last but not least, these components must have the ability to install
new java components into cocoon without having to modify the cocoon
installation.

if a webapp requires a special hand-written transformer, this should be
installed along with the deployment descriptor and might even be little
as having one cocoon app component as one cocoon component.

Ok, enough for now.

Awaiting for your comments!

Ciao

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


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

Reply via email to