From: Sylvain Wallez
> Reinhard Poetz wrote:
>
> >From: Sylvain Wallez
> >
> >
> >>Hi all,
> >>
> >>Flowscript currently gives two means to use Java classes: use
> >>components (cocoon.getComponent()) or simply create a Java
> object and use it (new MyClass()). As it's not very
> convenient to create a new component and install it in
> cocoon.xconf just to call Java code from the flow, the second
> solution is often used.
> >>
> >>
> >
> >yep, unfortunatly ...
> >
> >
>
> I don't agree with this "unfortunately": writing and installing a
> component is not an easy task for a newbie, and if it's the only
> solution we provide for calling Java code from flowscript, many will
> turn around and go away.
sorry, my "unfortunatly" was a bit misleading. I agree with you
completly in this point!
>
> As said Alan Kay: "Simple things should be simple, complex
> things should
> be possible"!
:-)
>
> >>But a problem comes when these Java objects need to access e.g.
> >>request parameters, session attributes, components, etc:
> the only way
> >>is to pass them the "cocoon" object that provides this access.
> >>
> >>But "cocoon" is of class "FOM_Cocoon" which is very specific to the
> >>internals of flowscript and linking code to this specific
> class isn't IMO a good thing to do. Furthermore, accessing
> elements of the object model through getters isn't consistent
> with the way it's usually done in other Cocoon code and violates IOC.
> >>
> >>
> >
> >yep. when I startet to add interception capabilities to flowscript I
> >had to copy the existing FOM_Cocoon because it had direct
> references to the interpreter (I think this needs some
> re-thinking ...) Anyway: If we once have more than one
> ControlFlow impl (not necessarily in the cocoon-cvs but maybe
> outside) this will become a problem!
> >
> >
>
> Exactly. Furthermore, and because it's an internal class, the
> FOM_Cocoon
> class exposes lots of methods that should not normally be used by
> application code and potentially open the door to "smart" abuses.
>
> >>So I added a new method to "cocoon" that sets up an object
> just as if
> >>it were an Avalon component by honoring the various lifecycle
> >>interfaces.
> >>
> >>Some useful lifecycle interfaces to implement are of course
> LogEnabled
> >>and Serviceable, but also Contextualizable, which gives
> access to the
> >>object model through the ContextHelper class.
> >>
> >>Example:
> >> var foo = new Foo();
> >> cocoon.setupObject(foo);
> >> foo.doIt("blah");
> >>
> >>This way of setting up object respects IOC, avoids using the very
> >>specific "FOM_Cocoon" class and gently educates people to the good
> >>things provided by Avalon.
> >>
> >>WDYT?
> >>
> >>
> >
> >I like your solution - big +1 to add it to the FOM!
> >This also means that this object can used as Avalon
> components outside
> >of flowscript, doesn't it?
> >
> >
>
> Sure! That's why I wrote that it "gently educates people" to Avalon.
> Once people will have implemented lifecycle interfaces, the
> next step is
> to declare the component in cocoon.xconf and move to the regular
> component lookup mechanism.
indeed, a very good idea!
--
Reinhard