Digging into the archives I found Stefanos "RTs from linkmaps to
flowmaps"
from 2001-03-05.[1] He wrote "Take a piece of paper, avoid thinking you
are writing an application for the web, so avoid taking into
consideration
technical constraints (like the request/response paradigm, intrinsic
statelessness, low bandwidth, proxying, etc..) and draw a diagram of the
latest application you wrote. What you should outline, at this stage,
is the 'skeleton' of the flow: this should be drawn to give the other
people
in the team the overlall picture of what the application is doing."
Finally after more than 2 years of a lot of work (here again many thanks
to
Ovidiu and Christopher and all the others for their real great efforts)
Stefano's vision became reality and we are ready to vote on the
"Cocoon Advanced Control Flow" and its first implementation based on a
"continuations aware JavaScript" interpreter:
+------------------------------------------------------------------+
| Cocoon Advanced Control Flow (in general) |
+------------------------------------------------------------------+
[A] The "Cocoon Advanced Control Flow" provides a controller that is
linked into the sitemap (as child element of <map:sitemap .../>:
<map:flow language="[yourLanguage]">
<map:script src="script_1"/>
<map:script src="script_2"/>
<map:script src="script_..."/>
<map:script src="script_n"/>
</map:flow>
This reflects that the flow is not a *usual* sitemap resource but
something else.
In order to read the scripts the SourceResolver is used.
[B] Functions provided by scripts can be called within the sitemap
using:
<map:call function="[yourFunction]">
<map:parameter name="x" value="y"/>[2]
</map:call>
There are no special restrictions where you can put
it within <map:pipeline .../> (e.g. put it within action elements)
[C] If a script provides continuations to continue
they are called within the sitemap using:
<map:call continuation="[continuation-id]"/>
Again, there are no restrictions where you can
put it within the sitemap (<map:pipeline .../>)
[D] All flow interpreters[3] are Avalon components and declared
in the cocoon.xonf:
<flow-interpreters default="[yourLanguage]" logger="[yourLogger]">
...
</flow-interpreters>
[E] All interpreters have to implement the Flow Object Model [FOM][4]
as far as possible but *must not* extend it without prior vote.
They also have to support all "FOM-aware" components (e.g.
JXTemplateGenerator/Transformer)
[F] FOM contains following objects:
* cocoon
* request
* response
* session
* cookie
* log
* context
* continuation
Find details on the properties and methods here[4].
[G] The FOM does not grant access to actions and input modules
but the flow interpreter *can* provide support for it but must not
give them the appearence of "first-class-Cocoon-citizens".
+------------------------------------------------------------------+
| JavaScript Interpreter |
+------------------------------------------------------------------+
[H] Our first and currently only[5] interpreter implementation is
a Javascript implementation based on Mozilla Rhino which
has been extended to support continuations.[6]
This JavaScript interpreter completly supports FOM
and provides legacy support for actions and input modules by
loading a "leagacy.js" script. (to be implemented)
[I] This JavaScript implementation is declared in the cocoon.xconf:
<flow-interpreters default="JavaScript" logger="flow">
<component-instance name="JavaScript"
class="org.apache.cocoon.components.flow.javascript.
fom.FOM_JavaScriptInterpreter">
<load-on-startup>resource://org/apache/cocoon/components/
flow/javascript/fom/fom_system.js</load-on-startup>
<reload-scripts>true</reload-scripts>
<check-time>4000</check-time>
<!--<debugger>enabled</debugger> -->
</component-instance>
</flow-interpreters>
[J] Flows and sessions:
(i) A flow script does not create a session automatically.
Accessing the session object (is a property of the cocoon
object) leads to the creation of a session if no session
is available.
(ii) The global scope of a flow only lives as long as the session
which the flow is tied to is active.
So if the session expires or you use another client to
continue a 'waiting' function you only have access to the
local scope within the flow function.
(iii) All scripts within a <map:script>...></> part share the
same global context. If you want to share more objects
you need another scope (request, session, context).
[K] Behaviour of variables within the flow:
All variables within the flow scripts are shared by reference
over continuations.
[L] A continuations manager based on the excalibur-event packages
is responsible for the expiration of continuations. It is
declared in the cocoon.xconf:
<continuations-manager logger="flow" time-to-live="3600000">
<expirations-check type="periodic">
<offset>[timeInMs]</offset>
<period>[timeInMs]</period>
</expirations-check>
</continuations-manager>
[M] Getting and releasing of components has to be done explicitly
by the flow script programmer using:[7]
cocoon.getComponent( id );
cocoon.releaseComponent( component );
I know it's a lot ;-) but I don't want a general vote on such an
important part as the "Cocoon Advanced Control Flow" (many of us
consider it as an equal part to sitemaps).
Thank you for voting/reading so far (13 items ;-)!
Cheers,
Reinhard
o-----------------------------------------------------------------------
--o
[1] "RTs from linkmaps to flowmaps" by Stefano Mazzocchi
http://marc.theaimsgroup.com/?l=xml-cocoon-dev&m=98379467820862&w=2
[2] Jeremy's issue of sorting of the parameters is added to the
todo list. {http://wiki.cocoondev.org/Wiki.jsp?page=FinishingFlow]
[3] I'm aware of Sylvain's and Marc's proposal on changing
the scope of available controllers. I contacted Sylvain off-list
and the said that they want to come up with a concrete
implementation
of their proposal in the future and this should *not* influence
the release of Cocoon 2.1 as the proposed changes would only have
a small impact on the *public* interfaces.
[4] FOM at Cocoon Wiki! [http://wiki.cocoondev.org/Wiki.jsp?page=FOM]
[5] Our more exactly "only interpreter which is included into Cocoon".
Another implementation (using the commercial ATCT) is described
here: [http://www.freeroller.net/page/alexkrut/20030514] by
Alex Krut
[6] [http://cvs.cocoondev.org/cgi-bin/viewcvs.cgi/
rhino1_5R4pre/?cvsroot=rhino]
[7] It is planned to raise a JavaScript exception if a component is not
released before sendPageAndWait is called but not implemented yet!