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 ... > > 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! > > 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? -- Reinhard