crafterm 2002/07/18 03:13:40 Modified: fortress/src/xdocs lifecycle-extensions.xml Log: Added some changes based on feedback from Berin, thanks mate. Revision Changes Path 1.2 +84 -42 jakarta-avalon-excalibur/fortress/src/xdocs/lifecycle-extensions.xml Index: lifecycle-extensions.xml =================================================================== RCS file: /home/cvs/jakarta-avalon-excalibur/fortress/src/xdocs/lifecycle-extensions.xml,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- lifecycle-extensions.xml 17 Jul 2002 16:30:11 -0000 1.1 +++ lifecycle-extensions.xml 18 Jul 2002 10:13:40 -0000 1.2 @@ -1,5 +1,7 @@ <?xml version="1.0"?> +<!DOCTYPE document SYSTEM "dtd/document-v10.dtd"> + <document> <header> <title>Writing Lifecycle Extensions</title> @@ -9,9 +11,15 @@ </header> <body> - <s1 title="Introduction"> + <s1 title="What are lifecycle extensions ?"> + <p> + Lifecycle extensions are additional stages a component can traverse through during + it's lifetime. Lifecycle extensions allow a Container to provide extra functionality + to Components in addition to the standard stages defined by Avalon Framework. + </p> + <p> - Avalon Framework defines a set of standard interfaces often termed as <b>Lifecycle</b> + Avalon Framework defines a set of standard interfaces often termed as Lifecycle metainfo which tells the ComponentManager how a particular Component should be treated during it's life. </p> @@ -25,13 +33,30 @@ <p> Sometimes it's useful to extend this development paradigm from the framework level into the application domain, to create customized lifecycle extensions that are called - upon in addition to the standard set defined by the Avalon Framework. Such custom lifecycle - stages can further enable domain specific logic, and allows the developer to reuse the same - development and thinking paradigm as the standard lifecycle stages. + upon in addition to the standard set defined by the Avalon Framework. + </p> + + <p> + Such custom lifecycle stages can further enable domain specific logic across many, + perhaps even unrelated components, can reduce code duplication, and allows the developer + to reuse the same development and thinking paradigm as the standard lifecycle stages. + </p> + + <p> + For example, you might want to pass a specialized SecurityManager to some of your + components before they are initialized, or have their internal state persistently cached + during system shutdown and restored at during startup. You might want to pass user + dependent decryption keys to your component, or give components the opportunity to + recycle themselves before being disposed or returned to a pooled component handler. + </p> + + <p> + The possibilities and number of extensions are only limited by the requirements of your + particular application domain. </p> <p> - This document describes how to add new lifecycle extensions to <strong>Fortress</strong>. + This document describes how to add new lifecycle extensions using <strong>Fortress</strong>. This document assumes a knowledge of what an Avalon lifecycle is, and a basic understanding of the standard lifecycle interfaces Avalon Framework defines. References in this document to Component and ComponentManager can also be freely interpreted as Service and ServiceManager @@ -39,10 +64,10 @@ </p> <p> - <strong>Note</strong>, as at the time of writing, Fortress is the only Avalon container that + <note>As at the time of writing, Fortress is the only Avalon container that supports lifecycle extensions, which means Components that use this feature will most likely only work as expected with Fortress, and not with the other Avalon containers - (ExcaliburComponentManager, Phoenix, Merlin, Tweety, etc). + (ExcaliburComponentManager, Phoenix, Merlin, Tweety, etc)</note> </p> <p> @@ -53,18 +78,20 @@ </s1> - <s1 title="Overview"> + <s1 title="How do I extend a Component's lifecycle ?"> <p> - Adding new lifecycle extensions to Fortress is straightforward. An overview of the process + Extending a Component's lifecycle is straightforward. An overview of the process follows: </p> <ol> - <li>Define a new component interface</li> + <li>Define the new component interface</li> <p> - Create a new interface defining the operations that should be called upon components - that implement this interface. + Create the new interface defining the operations that should be called upon components + that implement this interface. Using the previously mentioned examples, this would be + your <code>SecurityManageable</code>, <code>Cacheable</code>, <code>Decryptable</code>, + <code>Recycleable</code> interfaces. </p> <li>Define an extension object that calls upon the methods defined in the new interface, @@ -100,15 +127,11 @@ during the 4 phases defined later in this document. </p> </ol> - - <p> - The rest of this document describes this process in greater detail. - </p> </s1> - <s1 title="Lifecycle phases"> + <s1 title="When can a Component's lifecycle be extended ?"> <p> - A Component's lifecycle can be broken down to the following phases: + The life of any component can be broken down to the following phases: </p> <ol> @@ -122,37 +145,50 @@ <p> When the Component is accessed via a ComponentManager/Selector - (<code>lookup()/select()</code>) + (<code>lookup()/select()</code>). </p> <li>Release</li> <p> - When the Component is released via a ComponentManager/Selector (<code>release()</code>) + When the Component is released via a ComponentManager/Selector (<code>release()</code>). </p> <li>Destruction</li> <p> - When the Component is decomissioned, ready for garbage collection. + When the Component is decommissioned, ready for garbage collection. </p> </ol> <p> - A Component will go through it's Creation and Destruction phase only once. Since + <note>A Component will go through it's Creation and Destruction phase only once. Since <code>ComponentHandler</code> classes can implement different handling strategies (Poolable, ThreadSafe, etc), the access and release phases of a component can be - done multiple times. + done multiple times.</note> </p> <p> Lifecycle extensions can be added to any of the above defined phases. This allows you to choose when your particular extension will be executed. </p> + + <p> + For example, thread or user dependent extensions would be added at the access and release + levels (ie. when the component is retrieved and returned to the ComponentManager) as they + depend on runtime data not available until they are actually used. + </p> + + <p> + More static, or global extensions would be added at the creation or destruction level, since + they do not depend on any external data that change during runtime, nor are they particular + to any one context of use. + </p> + </s1> - <s1 title="Interfaces and Classes"> + <s1 title="Which interfaces and classes do I need to use ?"> <p> Support for lifecycle extensions in Fortress is done using the following classes/interfaces. @@ -160,10 +196,14 @@ <s2 title="The Component Extension Interface"> <p> - The component extension interface is what the developer writes. It defines the new - interface that components will implement to receive additional functionality. There is no - particular base interface the developer needs to extend, and the interface can be kept - separate from the Container itself. + This interface specifies the business particular extension components will be tested for. + It defines the new interface that components will implement to receive additional + functionality. + </p> + + <p> + There is no particular base interface the developer needs to extend, and the interface + can be kept separate from the Container itself. </p> </s2> @@ -192,7 +232,7 @@ <p> The container <code>Context</code> is passed as a parameter to provide access to any miscellaneous objects that might be needed during extension code (to make use of this feature - the container's Context will need to be prefilled with references and passed to the + the container Context will need to be initialized with references and passed to the <code>ContextBuilder</code> during Fortress' startup sequence). </p> @@ -222,7 +262,7 @@ /** * Destroy, called when the given component is being - * decomissioned. + * decommissioned. * * @param component a Component instance * @param context a Context instance @@ -274,7 +314,7 @@ </p> <p> - The LifecycleExtensionManager class API is too big to list here, instead have a look at + The LifecycleExtensionManager class API is too big to list here, instead please look at the following <link href="http://jakarta.apache.org/avalon/excalibur/fortress/api/org/apache/excalibur/fortress/lifecycle/LifecycleExtensionManager.html">link</link>. It essentially defines 4 methods for executing extension objects at the various phases of a component's lifecycle, and several methods for registering extension objects with the manager. @@ -337,10 +377,10 @@ </ol> <p> - <strong>Note</strong>, components created via Fortress' ComponentHandler classes directly + <note>, components created via Fortress' ComponentHandler classes directly will bypass the logic for <code>access</code> and <code>release</code> extensions. This is because the code performing this logic is located in the ComponentManager/Selector classes - (independent from all handlers). + (independent from all handlers).</note> </p> </s2> @@ -423,8 +463,8 @@ </source> <p> - <strong>Note</strong>, an extension class may run components through any given number of - extensions, and are not limited to just one. + <note>An extension class may run components through any given number of + extensions, and are not limited to just one.</note> </p> </s2> @@ -489,7 +529,7 @@ public void secure( final SecurityManager manager ) throws SecurityException { - getLogger().debug( "Received SecurityManager instance: " + manager ); + getLogger().info( "Received SecurityManager instance: " + manager ); final String[] files = { "/tmp", "/vmlinuz", "/usr/lib/libc.a" }; @@ -513,11 +553,13 @@ <p> As you can see, it's a straightforward process to implement a new extension. </p> - + + </s1> + + <s1 title="Need more information ?"> <p> - That's it for the documentation so far, if you have any particular questions, comments, - please send an email to the avalon developer's mailing - <link href="mailto:[EMAIL PROTECTED]">list</link>. + If you have any particular questions, comments, etc, please send an email to the Avalon + developer mailing <link href="mailto:[EMAIL PROTECTED]">list</link>. </p> </s1>
-- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>