Marcus Crafter wrote:

>>I have taken a look at Merlin (these classes:
>>http://cvs.apache.org/viewcvs.cgi/jakarta-avalon-excalibur/assembly/src/
>>java/org/apache/excalibur/container/lifecycle/ )
>>and as far as I can see, the pluggable pipeline stages (or phases, or 
>>whatever), are limited to act on (1) the component/object and (2) the 
>>Context.
>>    
>>
>
>               Yes, the initial idea was that the pluggable lifecycle stages
>               would operate on the component, using whatever objects they required
>               from the Context object if any.
>
>  
>
>>So... not only will the component have a type specifier that explains 
>>what context entries it requires and what special lifecycle handlers 
>>it requires - those handlers will also have a context requirements.
>>    
>>
>
>        Yes, this is true as well. The Fortress implementation doesn't
>               check any context entries, however IIUC the Merlin implementation
>               treats the handlers as regular Components with validation, dependancy
>               resolution, etc.
>
>  
>
>>So if you have a SpiffyLifeCycleStage that makes components all spiffy 
>>as they come through it, how is that SpiffyLifeCycleStage going to do 
>>it without support from the container to put a Spifficator (the means 
>>to make a component spiffy) in the context?
>>    
>>
>
>        My original idea was that the context be filled with these objects
>               (the Spifficator for example) before the application starts
>               operating - as is done in Cocoon - I know it's not the most optimal
>               solution but something I could work with at the time.
>
>               I brought this up on the list several weeks back and Berin came up
>               with the Session idea which is an alternative solution for storing
>               such transient objects (more info under
>               http://marc.theaimsgroup.com/?l=avalon-dev&m=102742811501755&w=2).
>
>  
>
>>If you have a PersistentLifeCycleStage, how are you going to obtain 
>>the persistence mechanism if the container doesn't give it to you via
>>the context?
>>    
>>
>
>        If not via the Context, via the CM in Merlin (and I presume in fortress
>               too in time) or the Session object described above, or some non-OO
>        way (ie. static method, singleton getInstance(), etc)
>
>  
>
>>The problem with populating the context with any non-constant entries 
>>(such as a Spifficator) has already been discussed and found to have 
>>no solution short of mind-reading the programmer and sprouting new code 
>>on startup/linking.
>>    
>>
>
>           I think this must have been before my time here, is there a reference
>               you can send me so I can read up on what was discussed ?
>

I was, but not so long ago.
A couple of prominent peope here said is was impossible - however, even 
before those statements solutions already existed (and remain) in a 
class under the excalibur/configuration package - ContextFactory.  Form 
there, the Merlin implemetation leveraged the meta-info costraints 
together with a new meta-data context declaration model to deliver 
something even simpler for the end user. Contary to popular belief, 
context is managable.  Unfortunately Merlin is the only Avalon container 
to address this.

>
>  
>
>>At the moment, the lifecycle extensions appear to be shiny new features
>>that while nice in theory are useless in practice. I'm afraid that any
>>container trying to implement them in a useful way will (1) never be
>>completed and (2) implode under its own weight. It's just too much "do 
>>everything", too much genericism, in it.
>>
>>Miscellaneous issues:
>>
>>  + Will the lifecycle handler need a component/service manager?
>>    How will a DB-persistence handler work? Will it use the Excalibur 
>>    Datasource component? How will it access it?
>>    
>>
>
>           Initially lifecycle handlers were just classes, after looking at
>               Stephen's component-oriented approach in Merlin I think there's
>               advantages having the handlers be components. A handler that is
>               a component would be able to access your DB-persistence component
>               described above.
>

And as a side-effect - masively simplifying the container implementation.

>>  + If the handler requires another component, has a context and surely
>>    will need a configuration, what is the difference between it and
>>    a component?
>>    
>>
>
>           If the handler requires all that's listed above, then nothing - but
>               remember lifecycle extensions are trying to let you reuse code across
>               *multiple* perhaps unrelated components, like the standard ones do.
>
>               If you only needed the handler 'component' once, you wouldn't worry
>               about defining a new lifecycle stage for it. But imagine the case
>               when you have many components that you want to add such
>               'component decorating' functionality to.
>
>               It's possible to add the functionality by looking up a depdendent
>               component, or call a static method or access the context, etc, in all
>               of the component implementations - and this works if the components are
>               related via base classes, etc, but if the classes aren't related
>               then you end up duplicating code.
>
>               eg. imagine if LogEnabled didn't exist and each component had to 
>               access some 'Manager' class to get a Logger object. It's manageable if 
>they all
>               extend some base class that does the work, but if not, the code 
>accessing
>               the 'Manager' class needs to be copied all over the place. It's much 
>nicer
>               if the CM passes the Logger to the Component, plus follows SoC and is 
>one
>               of the excellent advantages when one uses Avalon.
>
>               This was what I wanted to solve for domain specific components that
>               had requirements like the need for LogEnabled across many unrelated
>               components, following the SoC/IoC model we already advocate.
>
>               Each domain has its own requirements, and can implement their own
>               interfaces applicable to their needs.
>
>               In our project for example, we have many classes that perform database
>               access. The decision as to which database you use depends on who you
>               are, where you are geographically located, and some other factors that
>               make accessing your database a little complicated.
>
>               I wrote the code to select the applicable database for the current
>               thread, but had no easy way to share this code amongst other unrelated
>               classes.
>
>               Now I've defined a Queryable interface with an extension class that 
>calls
>               upon the interface at access time to set the correct database for the
>               current thread, and the code which does the database selection is now
>               completely localised to one method on the extension class. For this,
>               extensions were very useful in helping me reuse that code.
>
>               I'm sure TIMTOWTDI, but I wanted to follow what we already advocate 
>(ie.
>               the SoC approach). That way, developers in our project already familiar
>               with the Avalon concepts can easily grasp how to use the new extensions
>               when writing our components.
>
>               In particular its useful when using tools like Cocoon where you don't
>               have as much control over what base classes are being extended.
>  
>

An excellent summary.

Cheers, Steve.

>  
>
>>  + Go back to the final proposal for A5. Doesn't it solve everything
>>    by allowing/requiring you to specify handlers/factories for
>>components?
>>    
>>
>
>        Almost, I looked at handler/factory specification as a possible solution,
>               but it required IMO too much subclassing to handle extending the 4 
>phases of
>               a components life (ie. access release create destroy).
>
>               Most handlers use the same factory - allowing you to create a custom
>               factory that handles create & destroy extensions, but the operations of
>               accessing & releasing a component are done by the component handler
>               (PoolableComponentHandler, PerThreadComponentHandler, etc) which means
>               a new subclass for each set of extensions for each handler.
>
>               Hope that helps mate ? :)
>
>               Cheers,
>
>               Marcus
>
>--
>To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
>For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>
>
>  
>

-- 

Stephen J. McConnell

OSM SARL
digital products for a global economy
mailto:[EMAIL PROTECTED]
http://www.osm.net




--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to