You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@avalon.apache.org by ha...@apache.org on 2002/08/11 00:07:23 UTC

cvs commit: jakarta-avalon-site/docs/excalibur/fortress/skin print.css site.css tigris.css

hammant     2002/08/10 15:07:23

  Modified:    docs/excalibur/fortress features.html index.html
                        lifecycle-extensions.html
               docs/excalibur/fortress/skin print.css site.css tigris.css
  Log:
  api updates
  
  Revision  Changes    Path
  1.5       +111 -55   jakarta-avalon-site/docs/excalibur/fortress/features.html
  
  Index: features.html
  ===================================================================
  RCS file: /home/cvs/jakarta-avalon-site/docs/excalibur/fortress/features.html,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- features.html	22 Jul 2002 20:09:30 -0000	1.4
  +++ features.html	10 Aug 2002 22:07:23 -0000	1.5
  @@ -1,56 +1,112 @@
  -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  -<html><head><META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><link rel="stylesheet" href="skin/tigris.css" type="text/css"><link rel="stylesheet" href="skin/site.css" type="text/css"><link media="print" rel="stylesheet" href="skin/print.css" type="text/css"><meta value="Avalon Documentation Team" name="author"><meta value="avalon-dev@jakarta.apache.org" name="email"><title>Excalibur Fortress - Features</title></head><body class="composite" marginheight="0" marginwidth="0"><div id="banner"><table width="100%" cellpadding="8" cellspacing="0" border="0"><tbody><tr><td align="left"><a href="http://jakarta.apache.org/"><img border="0" src="images/jakarta-logo.gif"></a></td><td align="right"><a href="http://jakarta.apache.org/avalon/"><img border="0" src="images/header.gif"></a></td></tr></tbody></table></div><div id="breadcrumbs"><script src="skin/breadcrumbs.js" language="JavaScript" type="text/javascript"></script></div><table id="main" width="100%" cellpadding="8" cellspacing="0" border="0"><tbody><tr valign="top"><td id="leftcol"><div id="navcolumn"><div><strong>Related</strong><div><a href="http://jakarta.apache.org/avalon/">Avalon Home</a></div><div><a href="http://jakarta.apache.org/avalon/excalibur/">Excalibur Home</a></div><div><a href="http://jakarta.apache.org/avalon/phoenix">Avalon Phoenix</a></div><div><a href="http://jakarta.apache.org/avalon/excalibur/component">ECM</a></div><div><a href="http://jakarta.apache.org/avalon/excalibur/tweety">Tweety</a></div></div><div><strong>Essentials</strong><div><a href="index.html">Overview</a></div><div><a href="features.html">Features</a></div><div><a href="lifecycle-extensions.html">Lifecycle Extensions</a></div><div><a href="http://jakarta.apache.org/builds/jakarta-avalon-excalibur/release">Download</a></div><div><a href="api/">API Docs</a></div></div></div></td><td><div id="bodycol"><div class="app"><div align="center"><h1>Excalibur Fortress - Features</h1><h2></h2></div><div class="h3">
  -  
  -  
  -    <div class="h3"><h3>Features</h3></div>
  -      <p>
  -	Fortress provides a framework for you to easily create your
  -	own application specific containers.  We strive to make it
  -	easy for you to do without sacrificing any power.  Fortress
  -	allows you to focus on the core issues in your system, without
  -	worrying about the component management getting in your way.
  -      </p>
  -      <div class="h4"><h4>Asynchronous Component Management</h4></div>
  -	<p>
  -          Most component management functions don't take that long to
  -	  perform, but the time they do take can directly affect how
  -	  many requests your system can process at the same time.  For
  -	  that reason, we use the CommandManager from the Event package
  -	  to manage our components.  By moving all the management
  -	  functions to a limited number of background threads, we are
  -	  able to save you time in the critical processing path.
  -        </p>
  -	<p>
  -          The CommandManager can be extended to your components as well.
  -	  That way, your components can perform management tasks in the
  -	  background as well.  Fortress will likely be your choice of
  -	  containers if you have strict performance constraints.
  -        </p>
  -      
  -      <div class="h4"><h4>Extensible Lifecycle</h4></div>
  -	<p>
  -          Fortress has support for an experimental feature that allows
  -	  you to extend your component lifecycle in an application
  -	  specific manner.  If it proves to be a truly useful feature,
  -	  other Avalon containers will adopt it.
  -        </p>
  -      
  -      <div class="h4"><h4>Instrumentation</h4></div>
  -        <p>
  -          Fortress is integrated with the Instrumentation package so
  -	  you can get a graphical view of the health of your system
  -	  at runtime.  We integrate sampling points for each of the
  -	  component handlers so that you can see how many component
  -	  instances each handler is responsible for.  Using that
  -	  information, you can tune your container more intelligently.
  -        </p>
  -      
  -    
  -  
  -  
  -<div id="authors" align="right">by&nbsp;Berin Loritsch</div></div></div></div></td></tr></tbody></table><div id="footer"><table width="100%" cellpadding="4" cellspacing="0" border="0"><tbody><tr><td align="left">Copyright &copy; 1999-2002 Apache Software Foundation. All Rights Reserved.</td><td></td><td align="right"><script language="JavaScript">
  -                          <!--
  -                                  document.write("last modified: " + document.lastModified);
  -                          //  -->
  -
  +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  +<html><head><META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><link rel="stylesheet" href="skin/tigris.css" type="text/css"><link rel="stylesheet" href="skin/site.css" type="text/css"><link media="print" rel="stylesheet" href="skin/print.css" type="text/css"><meta value="Avalon Documentation Team" name="author"><meta value="avalon-dev@jakarta.apache.org" name="email"><title>Excalibur Fortress - Features</title></head><body bgcolor="white" class="composite" marginheight="0" marginwidth="0"><div id="banner"><table width="100%" cellpadding="8" cellspacing="0" border="0"><tbody><tr><td align="left"><a href="http://jakarta.apache.org/"><img border="0" src="images/jakarta-logo.gif"></a></td><td align="right"><a href="http://jakarta.apache.org/avalon/"><img border="0" src="images/header.gif"></a></td></tr></tbody></table></div><table width="100%" cellpadding="0" cellspacing="0" border="0" id="breadcrumbs"><td><a href="http://jakarta.apache.org/">Jakarta Main</a> |
  +            <a href="http://jakarta.apache.org/avalon">Avalon Main</a> |
  +            <a href="../">Up</a></td><td style="text-align: right" align="right"><a href="http://jakarta.apache.org/avalon/framework/">Framework</a> |
  +            <a href="http://jakarta.apache.org/avalon/excalibur/">Excalibur</a> |
  +            <a href="http://jakarta.apache.org/avalon/cornerstone/">Cornerstone</a> |
  +            <a href="http://jakarta.apache.org/avalon/phoenix/">Phoenix</a> |
  +            <a href="http://jakarta.apache.org/avalon/apps/">Apps</a> |
  +            <a href="http://jakarta.apache.org/avalon/logkit/">Logkit</a></td></table><table id="main" width="100%" cellpadding="8" cellspacing="0" border="0"><tbody><tr valign="top"><td id="leftcol"><div id="navcolumn"><div><strong>Related</strong><div><a href="http://jakarta.apache.org/avalon/">Avalon Home</a></div><div><a href="http://jakarta.apache.org/avalon/excalibur/">Excalibur Home</a></div><div><a href="http://jakarta.apache.org/avalon/phoenix">Avalon Phoenix</a></div><div><a href="http://jakarta.apache.org/avalon/excalibur/component">ECM</a></div><div><a href="http://jakarta.apache.org/avalon/excalibur/tweety">Tweety</a></div></div><div><strong>Essentials</strong><div><a href="index.html">Overview</a></div><div><a href="features.html">Features</a></div><div><a href="lifecycle-extensions.html">Lifecycle Extensions</a></div><div><a href="http://jakarta.apache.org/builds/jakarta-avalon-excalibur/release">Download</a></div><div><a href="api/">API Docs</a></div></div></div></td><td><div id="bodycol"><div class="app"><div align="center"><h1>Excalibur Fortress - Features</h1><h2></h2></div><div class="h3">
  +
  +  
  +
  +  
  +
  +    <div class="h3"><h3>Features</h3></div>
  +
  +      <p>
  +
  +	Fortress provides a framework for you to easily create your
  +
  +	own application specific containers.  We strive to make it
  +
  +	easy for you to do without sacrificing any power.  Fortress
  +
  +	allows you to focus on the core issues in your system, without
  +
  +	worrying about the component management getting in your way.
  +
  +      </p>
  +
  +      <div class="h4"><h4>Asynchronous Component Management</h4></div>
  +
  +	<p>
  +
  +          Most component management functions don't take that long to
  +
  +	  perform, but the time they do take can directly affect how
  +
  +	  many requests your system can process at the same time.  For
  +
  +	  that reason, we use the CommandManager from the Event package
  +
  +	  to manage our components.  By moving all the management
  +
  +	  functions to a limited number of background threads, we are
  +
  +	  able to save you time in the critical processing path.
  +
  +        </p>
  +
  +	<p>
  +
  +          The CommandManager can be extended to your components as well.
  +
  +	  That way, your components can perform management tasks in the
  +
  +	  background as well.  Fortress will likely be your choice of
  +
  +	  containers if you have strict performance constraints.
  +
  +        </p>
  +
  +      
  +
  +      <div class="h4"><h4>Extensible Lifecycle</h4></div>
  +
  +	<p>
  +
  +          Fortress has support for an experimental feature that allows
  +
  +	  you to extend your component lifecycle in an application
  +
  +	  specific manner.  If it proves to be a truly useful feature,
  +
  +	  other Avalon containers will adopt it.
  +
  +        </p>
  +
  +      
  +
  +      <div class="h4"><h4>Instrumentation</h4></div>
  +
  +        <p>
  +
  +          Fortress is integrated with the Instrumentation package so
  +
  +	  you can get a graphical view of the health of your system
  +
  +	  at runtime.  We integrate sampling points for each of the
  +
  +	  component handlers so that you can see how many component
  +
  +	  instances each handler is responsible for.  Using that
  +
  +	  information, you can tune your container more intelligently.
  +
  +        </p>
  +
  +      
  +
  +    
  +
  +  
  +
  +  
  +
  +<div id="authors" align="right">by&nbsp;Berin Loritsch</div></div></div></div></td></tr></tbody></table><div id="footer"><table width="100%" cellpadding="4" cellspacing="0" border="0"><tbody><tr><td align="left">Copyright &copy; 2000-2002 Apache Software Foundation. All Rights Reserved.</td><td></td><td align="right"><script language="JavaScript">
  +                          <!--
  +                                  document.write("last modified: " + document.lastModified);
  +                          //  -->
  +
                              </script></td></tr></tbody></table></div></body></html>
  
  
  
  1.8       +33 -26    jakarta-avalon-site/docs/excalibur/fortress/index.html
  
  Index: index.html
  ===================================================================
  RCS file: /home/cvs/jakarta-avalon-site/docs/excalibur/fortress/index.html,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- index.html	22 Jul 2002 20:09:30 -0000	1.7
  +++ index.html	10 Aug 2002 22:07:23 -0000	1.8
  @@ -1,27 +1,34 @@
  -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  -<html><head><META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><link rel="stylesheet" href="skin/tigris.css" type="text/css"><link rel="stylesheet" href="skin/site.css" type="text/css"><link media="print" rel="stylesheet" href="skin/print.css" type="text/css"><meta value="Avalon Documentation Team" name="author"><meta value="avalon-dev@jakarta.apache.org" name="email"><title>Excalibur Fortress - Overview</title></head><body class="composite" marginheight="0" marginwidth="0"><div id="banner"><table width="100%" cellpadding="8" cellspacing="0" border="0"><tbody><tr><td align="left"><a href="http://jakarta.apache.org/"><img border="0" src="images/jakarta-logo.gif"></a></td><td align="right"><a href="http://jakarta.apache.org/avalon/"><img border="0" src="images/header.gif"></a></td></tr></tbody></table></div><div id="breadcrumbs"><script src="skin/breadcrumbs.js" language="JavaScript" type="text/javascript"></script></div><table id="main" width="100%" cellpadding="8" cellspacing="0" border="0"><tbody><tr valign="top"><td id="leftcol"><div id="navcolumn"><div><strong>Related</strong><div><a href="http://jakarta.apache.org/avalon/">Avalon Home</a></div><div><a href="http://jakarta.apache.org/avalon/excalibur/">Excalibur Home</a></div><div><a href="http://jakarta.apache.org/avalon/phoenix">Avalon Phoenix</a></div><div><a href="http://jakarta.apache.org/avalon/excalibur/component">ECM</a></div><div><a href="http://jakarta.apache.org/avalon/excalibur/tweety">Tweety</a></div></div><div><strong>Essentials</strong><div><a href="index.html">Overview</a></div><div><a href="features.html">Features</a></div><div><a href="lifecycle-extensions.html">Lifecycle Extensions</a></div><div><a href="http://jakarta.apache.org/builds/jakarta-avalon-excalibur/release">Download</a></div><div><a href="api/">API Docs</a></div></div></div></td><td><div id="bodycol"><div class="app"><div align="center"><h1>Excalibur Fortress - Overview</h1><h2></h2></div><div class="h3">
  -  
  -  
  -    <div class="h3"><h3>Introduction</h3></div>
  -      
  -        This package is under development, and the API is not
  -        guaranteed to be the same when it is ready for release.
  -        You can find this in the excalibur-fortress-1.0.jar file if you want
  -        to play with it. Do not blame us if the next release of
  -        Excalibur breaks your code if you use this package.
  -      
  -      <p>
  -        Fortress contains a framework to help you create your own
  -	containers.  It boasts asynchronous management of your
  -	component instances, high scalability, and easier
  -	maintenance of your code.
  -      </p>
  -    
  -  
  -  
  -<div id="authors" align="right">by&nbsp;Berin Loritsch</div></div></div></div></td></tr></tbody></table><div id="footer"><table width="100%" cellpadding="4" cellspacing="0" border="0"><tbody><tr><td align="left">Copyright &copy; 1999-2002 Apache Software Foundation. All Rights Reserved.</td><td></td><td align="right"><script language="JavaScript">
  -                          <!--
  -                                  document.write("last modified: " + document.lastModified);
  -                          //  -->
  -
  +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  +<html><head><META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><link rel="stylesheet" href="skin/tigris.css" type="text/css"><link rel="stylesheet" href="skin/site.css" type="text/css"><link media="print" rel="stylesheet" href="skin/print.css" type="text/css"><meta value="Avalon Documentation Team" name="author"><meta value="avalon-dev@jakarta.apache.org" name="email"><title>Excalibur Fortress - Overview</title></head><body bgcolor="white" class="composite" marginheight="0" marginwidth="0"><div id="banner"><table width="100%" cellpadding="8" cellspacing="0" border="0"><tbody><tr><td align="left"><a href="http://jakarta.apache.org/"><img border="0" src="images/jakarta-logo.gif"></a></td><td align="right"><a href="http://jakarta.apache.org/avalon/"><img border="0" src="images/header.gif"></a></td></tr></tbody></table></div><table width="100%" cellpadding="0" cellspacing="0" border="0" id="breadcrumbs"><td><a href="http://jakarta.apache.org/">Jakarta Main</a> |
  +            <a href="http://jakarta.apache.org/avalon">Avalon Main</a> |
  +            <a href="../">Up</a></td><td style="text-align: right" align="right"><a href="http://jakarta.apache.org/avalon/framework/">Framework</a> |
  +            <a href="http://jakarta.apache.org/avalon/excalibur/">Excalibur</a> |
  +            <a href="http://jakarta.apache.org/avalon/cornerstone/">Cornerstone</a> |
  +            <a href="http://jakarta.apache.org/avalon/phoenix/">Phoenix</a> |
  +            <a href="http://jakarta.apache.org/avalon/apps/">Apps</a> |
  +            <a href="http://jakarta.apache.org/avalon/logkit/">Logkit</a></td></table><table id="main" width="100%" cellpadding="8" cellspacing="0" border="0"><tbody><tr valign="top"><td id="leftcol"><div id="navcolumn"><div><strong>Related</strong><div><a href="http://jakarta.apache.org/avalon/">Avalon Home</a></div><div><a href="http://jakarta.apache.org/avalon/excalibur/">Excalibur Home</a></div><div><a href="http://jakarta.apache.org/avalon/phoenix">Avalon Phoenix</a></div><div><a href="http://jakarta.apache.org/avalon/excalibur/component">ECM</a></div><div><a href="http://jakarta.apache.org/avalon/excalibur/tweety">Tweety</a></div></div><div><strong>Essentials</strong><div><a href="index.html">Overview</a></div><div><a href="features.html">Features</a></div><div><a href="lifecycle-extensions.html">Lifecycle Extensions</a></div><div><a href="http://jakarta.apache.org/builds/jakarta-avalon-excalibur/release">Download</a></div><div><a href="api/">API Docs</a></div></div></div></td><td><div id="bodycol"><div class="app"><div align="center"><h1>Excalibur Fortress - Overview</h1><h2></h2></div><div class="h3">
  +  
  +  
  +    <div class="h3"><h3>Introduction</h3></div>
  +      
  +        This package is under development, and the API is not
  +        guaranteed to be the same when it is ready for release.
  +        You can find this in the excalibur-fortress-1.0.jar file if you want
  +        to play with it. Do not blame us if the next release of
  +        Excalibur breaks your code if you use this package.
  +      
  +      <p>
  +        Fortress contains a framework to help you create your own
  +	containers.  It boasts asynchronous management of your
  +	component instances, high scalability, and easier
  +	maintenance of your code.
  +      </p>
  +    
  +  
  +  
  +<div id="authors" align="right">by&nbsp;Berin Loritsch</div></div></div></div></td></tr></tbody></table><div id="footer"><table width="100%" cellpadding="4" cellspacing="0" border="0"><tbody><tr><td align="left">Copyright &copy; 2000-2002 Apache Software Foundation. All Rights Reserved.</td><td></td><td align="right"><script language="JavaScript">
  +                          <!--
  +                                  document.write("last modified: " + document.lastModified);
  +                          //  -->
  +
                              </script></td></tr></tbody></table></div></body></html>
  
  
  
  1.3       +571 -564  jakarta-avalon-site/docs/excalibur/fortress/lifecycle-extensions.html
  
  Index: lifecycle-extensions.html
  ===================================================================
  RCS file: /home/cvs/jakarta-avalon-site/docs/excalibur/fortress/lifecycle-extensions.html,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- lifecycle-extensions.html	22 Jul 2002 20:09:30 -0000	1.2
  +++ lifecycle-extensions.html	10 Aug 2002 22:07:23 -0000	1.3
  @@ -1,565 +1,572 @@
  -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  -<html><head><META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><link rel="stylesheet" href="skin/tigris.css" type="text/css"><link rel="stylesheet" href="skin/site.css" type="text/css"><link media="print" rel="stylesheet" href="skin/print.css" type="text/css"><meta value="Avalon Documentation Team" name="author"><meta value="avalon-dev@jakarta.apache.org" name="email"><title>Writing Lifecycle Extensions</title></head><body class="composite" marginheight="0" marginwidth="0"><div id="banner"><table width="100%" cellpadding="8" cellspacing="0" border="0"><tbody><tr><td align="left"><a href="http://jakarta.apache.org/"><img border="0" src="images/jakarta-logo.gif"></a></td><td align="right"><a href="http://jakarta.apache.org/avalon/"><img border="0" src="images/header.gif"></a></td></tr></tbody></table></div><div id="breadcrumbs"><script src="skin/breadcrumbs.js" language="JavaScript" type="text/javascript"></script></div><table id="main" width="100%" cellpadding="8" cellspacing="0" border="0"><tbody><tr valign="top"><td id="leftcol"><div id="navcolumn"><div><strong>Related</strong><div><a href="http://jakarta.apache.org/avalon/">Avalon Home</a></div><div><a href="http://jakarta.apache.org/avalon/excalibur/">Excalibur Home</a></div><div><a href="http://jakarta.apache.org/avalon/phoenix">Avalon Phoenix</a></div><div><a href="http://jakarta.apache.org/avalon/excalibur/component">ECM</a></div><div><a href="http://jakarta.apache.org/avalon/excalibur/tweety">Tweety</a></div></div><div><strong>Essentials</strong><div><a href="index.html">Overview</a></div><div><a href="features.html">Features</a></div><div><a href="lifecycle-extensions.html">Lifecycle Extensions</a></div><div><a href="http://jakarta.apache.org/builds/jakarta-avalon-excalibur/release">Download</a></div><div><a href="api/">API Docs</a></div></div></div></td><td><div id="bodycol"><div class="app"><div align="center"><h1>Writing Lifecycle Extensions</h1><h2></h2></div><div class="h3">
  -  
  -  
  -
  -  <div class="h3"><h3>What are lifecycle extensions ?</h3></div>
  -   <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 Lifecycle
  -    metainfo which tells the ComponentManager how a particular Component should be treated
  -    during it's life.
  -   </p>
  -  
  -   <p>
  -    This metainfo allows the developer to separate the various concerns involved when
  -    writing a Component, often termed SoC and IoC (Separation of Concerns and Inversion of
  -    Control) and is one of primary advantages of using Avalon.
  -   </p>
  -  
  -   <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.
  -   </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 using <b>Fortress</b>.
  -    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
  -    by the reader.
  -   </p>
  -  
  -   <p>
  -    <p><i>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)</i></p>
  -   </p>
  -  
  -   <p>
  -    Support for lifecycle extensions in the other Avalon containers is technically possible but
  -    has not yet been discussed. Please check with the Avalon developer mailing list if you use
  -    one of these containers and would like to use lifecycle extensions.
  -   </p>
  -  
  -  
  -  
  -  <div class="h3"><h3>How do I extend a Component's lifecycle ?</h3></div>
  -   <p>
  -    Extending a Component's lifecycle is straightforward. An overview of the process
  -    follows:
  -   </p>
  -  
  -    <blockquote><ol>
  -     <li>Define the new component interface</li>
  -  
  -     <p>
  -      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,
  -     during one or more of the pre-defined phases of component's lifecycle</li>
  -  
  -     <p>
  -      Create a class that implements <code>LifecycleExtension</code>, that tests any given
  -      component for the above defined interface (and others if applicable), invoking methods
  -      defined in that interface.
  -     </p>
  -  
  -     <li>Register the extension object with Fortress' <code>LifecycleExtensionManager</code></li>
  -  
  -     <p>
  -      Create an instance of the class defined in the previous step, and register it with a
  -      <code>LifecycleExtensionManager</code>, using either the default manager available inside
  -      of your container, or an externally created manager that is later given to the container
  -      to use.
  -     </p>
  -  
  -     <li>Implement the new component interface on your component</li>
  -  
  -     <p>
  -      Add the new <code>implements</code> clause to your Component, or Component implementation,
  -      and write any methods defined in the implemented interface.
  -     </p>
  -  
  -     <li><code>lookup()/select()/release()</code> components as normal</li>
  -  
  -     <p>
  -      Proceed as normal. Checking for extensions is done implicitly within Fortress. Once
  -      lifecycle extensions are registered they will be invoked on any implementing components
  -      during the 4 phases defined later in this document.
  -     </p>
  -    </ol></blockquote>
  -  
  -  
  -  <div class="h3"><h3>When can a Component's lifecycle be extended ?</h3></div>
  -   <p>
  -    The life of any component can be broken down to the following phases:
  -   </p>
  -  
  -    <blockquote><ol>
  -     <li>Creation</li>
  -  
  -     <p>
  -      When the Component is actually instantiated.
  -     </p>
  -  
  -     <li>Access</li>
  -  
  -     <p>
  -      When the Component is accessed via a ComponentManager/Selector
  -      (<code>lookup()/select()</code>).
  -     </p>
  -  
  -     <li>Release</li>
  -  
  -     <p>
  -      When the Component is released via a ComponentManager/Selector (<code>release()</code>).
  -     </p>
  -  
  -     <li>Destruction</li>
  -  
  -     <p>
  -      When the Component is decommissioned, ready for garbage collection.
  -     </p>
  -  
  -    </ol></blockquote>
  -  
  -   <p>
  -    <p><i>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.</i></p>
  -   </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>
  -
  -  
  -  
  -  <div class="h3"><h3>Which interfaces and classes do I need to use ?</h3></div>
  -  
  -   <p>
  -    Support for lifecycle extensions in Fortress is done using the following classes/interfaces.
  -   </p>
  -  
  -  <div class="h4"><h4>The Component Extension Interface</h4></div>
  -   <p>
  -    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>
  -  
  -  
  -  <div class="h4"><h4>The LifecycleExtension Interface</h4></div>
  -  
  -   <p>
  -    Component extensions are invoked via a Lifecycle extension object. Lifecycle extension
  -    objects are managed via a <code>LifecycleExtensionManager</code> class and essentially
  -    test for a particular Component extension interface, and appropriately call methods defined
  -    in that interface.
  -   </p>
  -  
  -   <p>
  -    All Lifecycle extension objects must implement the <code>LifecycleExtension</code> interface.
  -    The <code>LifecycleExtension</code> interface defines 4 methods that are called upon to allow
  -    an implementor to extend a component's lifecycle.
  -   </p>
  -  
  -   <p>
  -    The 4 methods (<code>create</code>, <code>destroy</code>, <code>access</code> and 
  -    <code>release</code>) are invoked by a manager class from inside Fortress. Each method
  -    accepts 2 parameters, the particular Component instance being extended, and the container
  -    <code>Context</code>.
  -   </p>
  -  
  -   <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 Context will need to be initialized with references and passed to the
  -    <code>ContextBuilder</code> during Fortress' startup sequence).
  -   </p>
  -  
  -   <p>
  -    Each method may throw an exception to indicate an error, which will be logged, but will
  -    not terminate other extensions from being executed on that Component.
  -   </p>
  -  
  -   <pre>
  -     /**
  -      * LifecycleExtension interface. This interface defines the methods that
  -      * a LifecycleExtensionManager can call on a particular concrete
  -      * LifecycleExtensionMarker class.
  -      */
  -     public interface LifecycleExtension
  -     {
  -         /**
  -          * Create, called when the given component is being 
  -          * instantiated.
  -          *
  -          * @param component a Component instance
  -          * @param context a Context instance
  -          * @exception Exception if an error occurs
  -          */
  -         void create( Object component, Context context )
  -             throws Exception;
  -     
  -         /**
  -          * Destroy, called when the given component is being
  -          * decommissioned.
  -          *
  -          * @param component a Component instance
  -          * @param context a Context instance
  -          * @exception Exception if an error occurs
  -          */
  -         void destroy( Object component, Context context )
  -             throws Exception;
  -     
  -         /**
  -          * Access, called when the given component is being
  -          * accessed (ie. via lookup() or select()).
  -          *
  -          * @param component a Component instance
  -          * @param context a Context instance
  -          * @exception Exception if an error occurs
  -          */
  -         void access( Object component, Context context )
  -             throws Exception;
  -     
  -         /**
  -          * Release, called when the given component is being
  -          * released (ie. by a CM or CS).
  -          *
  -          * @param component a Component instance
  -          * @param context a Context instance
  -          * @exception Exception if an error occurs
  -          */
  -         void release( Object component, Context context )
  -             throws Exception;
  -     }
  -   </pre>
  -  
  -   <p>
  -    Many extensions will not require implementation of every method defined in the 
  -    above interface, for that reason, there's a <code>AbstractLifecycleExtension</code>
  -    convenience class available which provides default (empty) implementations of each
  -    method which you can extend from. This allows you to implement only the methods
  -    necessary for your particular extension.
  -   </p>
  -  
  -  
  -  
  -  <div class="h4"><h4>The LifecycleExtensionManager class</h4></div>
  -  
  -   <p>
  -    The <code>LifecycleExtensionManager</code> class provides default management of
  -    extension implementations and an API which ComponentManager/Selector's can call
  -    upon to execute them.
  -   </p>
  -  
  -   <p>
  -    The LifecycleExtensionManager class API is too big to list here, instead please look at
  -    the following <a href="http://jakarta.apache.org/avalon/excalibur/fortress/api/org/apache/excalibur/fortress/lifecycle/LifecycleExtensionManager.html">link</a>. 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.
  -   </p>
  -  
  -   <p>
  -    The <code>LifecycleExtensionManager</code> class will operate safely in multithreaded
  -    environments, and allows you to add/remove extensions to a running system.
  -   </p>
  -  
  -   <p>
  -    By default, all Fortress based containers will be initialized with a default
  -    <code>LifecycleExtensionManager</code> that contains no extensions. You can alternatively
  -    provide a pre-configured LifecycleExtensionManager to your Container via the
  -    ContextBuilder class (<code>ContainerConstants.EXTENSION_MANAGER</code> key) if you like.
  -   </p>
  -  
  -   <p>
  -    To add a new lifecycle extension object to the manager simply call the method
  -    <code>LifecycleExtensionManager.addExtension()</code>. Methods also exist for removing
  -    and iterating through the currently available extensions.
  -   </p>
  -  
  -  
  -  <div class="h4"><h4>FortressComponentManager/FortressComponentSelector</h4></div>
  -  
  -   <p>
  -    Fortress' inbuilt Component Manager/Selector/Factory code will automatically call
  -    upon the LifecycleExtensionManager class at each phase in a Component's life at the 
  -    following predefined times:
  -   </p>
  -  
  -    <blockquote><ol>
  -     <li>Access</li>
  -  
  -     <p>
  -      Called inside the ComponentManager, after the component has been retrieved
  -      from it's handler, but before it's returned to the invoker of
  -      <code>lookup()/select()</code>.
  -     </p>
  -  
  -     <li>Release</li>
  -  
  -     <p>
  -      Called inside the ComponentManager, before the component is passed back to
  -      it's handler to be disposed/pooled/etc.
  -     </p>
  -  
  -     <li>Creation</li>
  -  
  -     <p>
  -      Called inside the ComponentFactory, before <code>initialize()</code>.
  -     </p>
  -  
  -     <li>Destruction</li>
  -  
  -     <p>
  -      Called inside the ComponentFactory, after <code>dispose()</code>.
  -     </p>
  -    </ol></blockquote>
  -  
  -   <p>
  -    <p><i>, 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).</i></p>
  -   </p>
  -  
  -  
  -  
  -  
  -  
  -  <div class="h3"><h3>An Example</h3></div>
  -  
  -   <p>
  -    Let's look at a simple example. The following is also available as a working sample
  -    in Fortress' examples directory.
  -   </p>
  -  
  -   <p>
  -    Our example implements a Lifecycle extension for passing a <code>SecurityManager</code> to
  -    Components. We'll call it the <code>SecurityManageable</code> interface.
  -   </p>
  -  
  -  <div class="h4"><h4>Define the component extension interface</h4></div>
  -  
  -   <p>
  -    First we define the new Component extension interface.
  -   </p>
  -  
  -   <pre>
  -   /**
  -    * Simple custom lifecycle extension interface for supplying a component
  -    * with a security manager.
  -    */
  -   public interface SecurityManageable
  -   {
  -       /**
  -        * Pass a SecurityManager object to the component
  -        *
  -        * @param manager a SecurityManager value
  -        */
  -       void secure( SecurityManager manager )
  -           throws SecurityException;
  -   }
  -   </pre>
  -  
  -  
  -  
  -  <div class="h4"><h4>Create the lifecycle extensions class</h4></div>
  -  
  -   <p>
  -    Next we define the actual extension implementation which invokes the <code>secure()</code>
  -    method. We extend from <code>AbstractLifecycleExtension</code> since we only want
  -    <code>secure()</code> to be invoked upon each access (ie. lookup()) to the component, and
  -    don't need to implement the other 3 LifecycleExtension methods (create, release, and 
  -    destroy).
  -   </p>
  -  
  -   <pre>
  -   /**
  -    * Some custom extensions for this container's components.
  -    */
  -   public class Extensions
  -       extends AbstractLifecycleExtension
  -   {
  -       /**
  -        * Access, called when the given component is being
  -        * accessed (ie. via lookup() or select()).
  -        *
  -        * @param component a Component instance
  -        * @param context a Context instance
  -        * @exception Exception if an error occurs
  -        */
  -       public void access( Object component, Context context )
  -           throws Exception
  -       {
  -           if ( component instanceof SecurityManageable )
  -           {
  -               // pass in a simple security manager, a real system might want to pass
  -               // in specialized/custom security managers
  -               ( ( SecurityManageable ) component ).secure( new SecurityManager() );
  -           }
  -       }
  -   }
  -   </pre>
  -   
  -   <p>
  -    <p><i>An extension class may run components through any given number of
  -    extensions, and are not limited to just one.</i></p>
  -   </p>
  -  
  -  
  -  
  -  <div class="h4"><h4>Register the lifecycle extensions class</h4></div>
  -  
  -   <p>
  -    We then inform our container about the extension. This could be done in several different
  -    ways, for simplicity we'll extend <code>initialize()</code> and add it to the
  -    <code>LifecycleExtensionManager</code> there.
  -   </p>
  -  
  -   <p>
  -    (an alternative might be to initialize a LifecycleExtensionManager before creating the
  -    container and pass it in via the <code>ContextBuilder.setExtensionManager()</code> method,
  -    or to create a LifecycleExtensionManager subclass that includes the extension preset)
  -   </p>
  -  
  -   <pre>
  -   /**
  -    * Simple container that includes custom lifecycle extensions.
  -    */
  -   public final class ExtendedContainer
  -       extends AbstractContainer
  -   {
  -       public void initialize()
  -           throws Exception
  -       {
  -           super.initialize();
  -   	    
  -           m_extManager.addExtension( new Extensions() );
  -       }
  -   }
  -   </pre>
  -   
  -  
  -  
  -  <div class="h4"><h4>Use the new component interface</h4></div>
  -  
  -   <p>
  -    To use the new SecurityManageable lifecycle extension, we simply implement
  -    SecurityManageable just as we do with any other Avalon lifecycle interfaces
  -    (assuming a predefined Component interface <code>ExtendedComponent</code>).
  -   </p>
  -  
  -   <pre>
  -   /**
  -    * ExtendedComponentImpl, demonstrating the use of a custom
  -    * lifecycle stage SecurityManageable. This code does
  -    * a simple access check for several files on the file system and logs
  -    * the results accordingly.
  -    */
  -   public class ExtendedComponentImpl
  -       extends AbstractLogEnabled
  -       implements ExtendedComponent, SecurityManageable
  -   {
  -       /**
  -        * Pass a SecurityManager object to the component
  -        *
  -        * @param manager a SecurityManager value
  -        */
  -       public void secure( final SecurityManager manager )
  -           throws SecurityException
  -       {
  -           getLogger().info( "Received SecurityManager instance: " + manager );
  -   
  -           final String[] files = { "/tmp", "/vmlinuz", "/usr/lib/libc.a" };
  -   
  -           for ( int i = 0; i &lt; files.length; ++i )
  -           {
  -               try
  -               {
  -                   manager.checkRead( files[ i ] );
  -                   getLogger().info( "Thread can read " + files[ i ] );
  -               }
  -               catch ( SecurityException e )
  -               {
  -                   getLogger().info( "Thread can not read " + files[ i ] );
  -               }
  -           }
  -       }
  -   }
  -   </pre> 
  -  
  -  
  -   <p>
  -    As you can see, it's a straightforward process to implement a new extension.
  -   </p>
  -
  -  
  -
  -  <div class="h3"><h3>Need more information ?</h3></div>  
  -   <p>
  -    If you have any particular questions, comments, etc, please send an email to the Avalon
  -    developer mailing <a href="mailto:avalon-dev@jakarta.apache.org">list</a>.
  -   </p>
  -  
  -  
  -  
  -  
  -<div id="authors" align="right">by&nbsp;Marcus Crafter</div></div></div></div></td></tr></tbody></table><div id="footer"><table width="100%" cellpadding="4" cellspacing="0" border="0"><tbody><tr><td align="left">Copyright &copy; 1999-2002 Apache Software Foundation. All Rights Reserved.</td><td></td><td align="right"><script language="JavaScript">
  -                          <!--
  -                                  document.write("last modified: " + document.lastModified);
  -                          //  -->
  -
  +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  +<html><head><META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><link rel="stylesheet" href="skin/tigris.css" type="text/css"><link rel="stylesheet" href="skin/site.css" type="text/css"><link media="print" rel="stylesheet" href="skin/print.css" type="text/css"><meta value="Avalon Documentation Team" name="author"><meta value="avalon-dev@jakarta.apache.org" name="email"><title>Writing Lifecycle Extensions</title></head><body bgcolor="white" class="composite" marginheight="0" marginwidth="0"><div id="banner"><table width="100%" cellpadding="8" cellspacing="0" border="0"><tbody><tr><td align="left"><a href="http://jakarta.apache.org/"><img border="0" src="images/jakarta-logo.gif"></a></td><td align="right"><a href="http://jakarta.apache.org/avalon/"><img border="0" src="images/header.gif"></a></td></tr></tbody></table></div><table width="100%" cellpadding="0" cellspacing="0" border="0" id="breadcrumbs"><td><a href="http://jakarta.apache.org/">Jakarta Main</a> |
  +            <a href="http://jakarta.apache.org/avalon">Avalon Main</a> |
  +            <a href="../">Up</a></td><td style="text-align: right" align="right"><a href="http://jakarta.apache.org/avalon/framework/">Framework</a> |
  +            <a href="http://jakarta.apache.org/avalon/excalibur/">Excalibur</a> |
  +            <a href="http://jakarta.apache.org/avalon/cornerstone/">Cornerstone</a> |
  +            <a href="http://jakarta.apache.org/avalon/phoenix/">Phoenix</a> |
  +            <a href="http://jakarta.apache.org/avalon/apps/">Apps</a> |
  +            <a href="http://jakarta.apache.org/avalon/logkit/">Logkit</a></td></table><table id="main" width="100%" cellpadding="8" cellspacing="0" border="0"><tbody><tr valign="top"><td id="leftcol"><div id="navcolumn"><div><strong>Related</strong><div><a href="http://jakarta.apache.org/avalon/">Avalon Home</a></div><div><a href="http://jakarta.apache.org/avalon/excalibur/">Excalibur Home</a></div><div><a href="http://jakarta.apache.org/avalon/phoenix">Avalon Phoenix</a></div><div><a href="http://jakarta.apache.org/avalon/excalibur/component">ECM</a></div><div><a href="http://jakarta.apache.org/avalon/excalibur/tweety">Tweety</a></div></div><div><strong>Essentials</strong><div><a href="index.html">Overview</a></div><div><a href="features.html">Features</a></div><div><a href="lifecycle-extensions.html">Lifecycle Extensions</a></div><div><a href="http://jakarta.apache.org/builds/jakarta-avalon-excalibur/release">Download</a></div><div><a href="api/">API Docs</a></div></div></div></td><td><div id="bodycol"><div class="app"><div align="center"><h1>Writing Lifecycle Extensions</h1><h2></h2></div><div class="h3">
  +  
  +  
  +
  +  <div class="h3"><h3>What are lifecycle extensions ?</h3></div>
  +   <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 Lifecycle
  +    metainfo which tells the ComponentManager how a particular Component should be treated
  +    during it's life.
  +   </p>
  +  
  +   <p>
  +    This metainfo allows the developer to separate the various concerns involved when
  +    writing a Component, often termed SoC and IoC (Separation of Concerns and Inversion of
  +    Control) and is one of primary advantages of using Avalon.
  +   </p>
  +  
  +   <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.
  +   </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 using <b>Fortress</b>.
  +    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
  +    by the reader.
  +   </p>
  +  
  +   <p>
  +    <p><i>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)</i></p>
  +   </p>
  +  
  +   <p>
  +    Support for lifecycle extensions in the other Avalon containers is technically possible but
  +    has not yet been discussed. Please check with the Avalon developer mailing list if you use
  +    one of these containers and would like to use lifecycle extensions.
  +   </p>
  +  
  +  
  +  
  +  <div class="h3"><h3>How do I extend a Component's lifecycle ?</h3></div>
  +   <p>
  +    Extending a Component's lifecycle is straightforward. An overview of the process
  +    follows:
  +   </p>
  +  
  +    <blockquote><ol>
  +     <li>Define the new component interface</li>
  +  
  +     <p>
  +      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,
  +     during one or more of the pre-defined phases of component's lifecycle</li>
  +  
  +     <p>
  +      Create a class that implements <code>LifecycleExtension</code>, that tests any given
  +      component for the above defined interface (and others if applicable), invoking methods
  +      defined in that interface.
  +     </p>
  +  
  +     <li>Register the extension object with Fortress' <code>LifecycleExtensionManager</code></li>
  +  
  +     <p>
  +      Create an instance of the class defined in the previous step, and register it with a
  +      <code>LifecycleExtensionManager</code>, using either the default manager available inside
  +      of your container, or an externally created manager that is later given to the container
  +      to use.
  +     </p>
  +  
  +     <li>Implement the new component interface on your component</li>
  +  
  +     <p>
  +      Add the new <code>implements</code> clause to your Component, or Component implementation,
  +      and write any methods defined in the implemented interface.
  +     </p>
  +  
  +     <li><code>lookup()/select()/release()</code> components as normal</li>
  +  
  +     <p>
  +      Proceed as normal. Checking for extensions is done implicitly within Fortress. Once
  +      lifecycle extensions are registered they will be invoked on any implementing components
  +      during the 4 phases defined later in this document.
  +     </p>
  +    </ol></blockquote>
  +  
  +  
  +  <div class="h3"><h3>When can a Component's lifecycle be extended ?</h3></div>
  +   <p>
  +    The life of any component can be broken down to the following phases:
  +   </p>
  +  
  +    <blockquote><ol>
  +     <li>Creation</li>
  +  
  +     <p>
  +      When the Component is actually instantiated.
  +     </p>
  +  
  +     <li>Access</li>
  +  
  +     <p>
  +      When the Component is accessed via a ComponentManager/Selector
  +      (<code>lookup()/select()</code>).
  +     </p>
  +  
  +     <li>Release</li>
  +  
  +     <p>
  +      When the Component is released via a ComponentManager/Selector (<code>release()</code>).
  +     </p>
  +  
  +     <li>Destruction</li>
  +  
  +     <p>
  +      When the Component is decommissioned, ready for garbage collection.
  +     </p>
  +  
  +    </ol></blockquote>
  +  
  +   <p>
  +    <p><i>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.</i></p>
  +   </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>
  +
  +  
  +  
  +  <div class="h3"><h3>Which interfaces and classes do I need to use ?</h3></div>
  +  
  +   <p>
  +    Support for lifecycle extensions in Fortress is done using the following classes/interfaces.
  +   </p>
  +  
  +  <div class="h4"><h4>The Component Extension Interface</h4></div>
  +   <p>
  +    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>
  +  
  +  
  +  <div class="h4"><h4>The LifecycleExtension Interface</h4></div>
  +  
  +   <p>
  +    Component extensions are invoked via a Lifecycle extension object. Lifecycle extension
  +    objects are managed via a <code>LifecycleExtensionManager</code> class and essentially
  +    test for a particular Component extension interface, and appropriately call methods defined
  +    in that interface.
  +   </p>
  +  
  +   <p>
  +    All Lifecycle extension objects must implement the <code>LifecycleExtension</code> interface.
  +    The <code>LifecycleExtension</code> interface defines 4 methods that are called upon to allow
  +    an implementor to extend a component's lifecycle.
  +   </p>
  +  
  +   <p>
  +    The 4 methods (<code>create</code>, <code>destroy</code>, <code>access</code> and 
  +    <code>release</code>) are invoked by a manager class from inside Fortress. Each method
  +    accepts 2 parameters, the particular Component instance being extended, and the container
  +    <code>Context</code>.
  +   </p>
  +  
  +   <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 Context will need to be initialized with references and passed to the
  +    <code>ContextBuilder</code> during Fortress' startup sequence).
  +   </p>
  +  
  +   <p>
  +    Each method may throw an exception to indicate an error, which will be logged, but will
  +    not terminate other extensions from being executed on that Component.
  +   </p>
  +  
  +   <pre>
  +     /**
  +      * LifecycleExtension interface. This interface defines the methods that
  +      * a LifecycleExtensionManager can call on a particular concrete
  +      * LifecycleExtensionMarker class.
  +      */
  +     public interface LifecycleExtension
  +     {
  +         /**
  +          * Create, called when the given component is being 
  +          * instantiated.
  +          *
  +          * @param component a Component instance
  +          * @param context a Context instance
  +          * @exception Exception if an error occurs
  +          */
  +         void create( Object component, Context context )
  +             throws Exception;
  +     
  +         /**
  +          * Destroy, called when the given component is being
  +          * decommissioned.
  +          *
  +          * @param component a Component instance
  +          * @param context a Context instance
  +          * @exception Exception if an error occurs
  +          */
  +         void destroy( Object component, Context context )
  +             throws Exception;
  +     
  +         /**
  +          * Access, called when the given component is being
  +          * accessed (ie. via lookup() or select()).
  +          *
  +          * @param component a Component instance
  +          * @param context a Context instance
  +          * @exception Exception if an error occurs
  +          */
  +         void access( Object component, Context context )
  +             throws Exception;
  +     
  +         /**
  +          * Release, called when the given component is being
  +          * released (ie. by a CM or CS).
  +          *
  +          * @param component a Component instance
  +          * @param context a Context instance
  +          * @exception Exception if an error occurs
  +          */
  +         void release( Object component, Context context )
  +             throws Exception;
  +     }
  +   </pre>
  +  
  +   <p>
  +    Many extensions will not require implementation of every method defined in the 
  +    above interface, for that reason, there's a <code>AbstractLifecycleExtension</code>
  +    convenience class available which provides default (empty) implementations of each
  +    method which you can extend from. This allows you to implement only the methods
  +    necessary for your particular extension.
  +   </p>
  +  
  +  
  +  
  +  <div class="h4"><h4>The LifecycleExtensionManager class</h4></div>
  +  
  +   <p>
  +    The <code>LifecycleExtensionManager</code> class provides default management of
  +    extension implementations and an API which ComponentManager/Selector's can call
  +    upon to execute them.
  +   </p>
  +  
  +   <p>
  +    The LifecycleExtensionManager class API is too big to list here, instead please look at
  +    the following <a href="http://jakarta.apache.org/avalon/excalibur/fortress/api/org/apache/excalibur/fortress/lifecycle/LifecycleExtensionManager.html">link</a>. 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.
  +   </p>
  +  
  +   <p>
  +    The <code>LifecycleExtensionManager</code> class will operate safely in multithreaded
  +    environments, and allows you to add/remove extensions to a running system.
  +   </p>
  +  
  +   <p>
  +    By default, all Fortress based containers will be initialized with a default
  +    <code>LifecycleExtensionManager</code> that contains no extensions. You can alternatively
  +    provide a pre-configured LifecycleExtensionManager to your Container via the
  +    ContextBuilder class (<code>ContainerConstants.EXTENSION_MANAGER</code> key) if you like.
  +   </p>
  +  
  +   <p>
  +    To add a new lifecycle extension object to the manager simply call the method
  +    <code>LifecycleExtensionManager.addExtension()</code>. Methods also exist for removing
  +    and iterating through the currently available extensions.
  +   </p>
  +  
  +  
  +  <div class="h4"><h4>FortressComponentManager/FortressComponentSelector</h4></div>
  +  
  +   <p>
  +    Fortress' inbuilt Component Manager/Selector/Factory code will automatically call
  +    upon the LifecycleExtensionManager class at each phase in a Component's life at the 
  +    following predefined times:
  +   </p>
  +  
  +    <blockquote><ol>
  +     <li>Access</li>
  +  
  +     <p>
  +      Called inside the ComponentManager, after the component has been retrieved
  +      from it's handler, but before it's returned to the invoker of
  +      <code>lookup()/select()</code>.
  +     </p>
  +  
  +     <li>Release</li>
  +  
  +     <p>
  +      Called inside the ComponentManager, before the component is passed back to
  +      it's handler to be disposed/pooled/etc.
  +     </p>
  +  
  +     <li>Creation</li>
  +  
  +     <p>
  +      Called inside the ComponentFactory, before <code>initialize()</code>.
  +     </p>
  +  
  +     <li>Destruction</li>
  +  
  +     <p>
  +      Called inside the ComponentFactory, after <code>dispose()</code>.
  +     </p>
  +    </ol></blockquote>
  +  
  +   <p>
  +    <p><i>, 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).</i></p>
  +   </p>
  +  
  +  
  +  
  +  
  +  
  +  <div class="h3"><h3>An Example</h3></div>
  +  
  +   <p>
  +    Let's look at a simple example. The following is also available as a working sample
  +    in Fortress' examples directory.
  +   </p>
  +  
  +   <p>
  +    Our example implements a Lifecycle extension for passing a <code>SecurityManager</code> to
  +    Components. We'll call it the <code>SecurityManageable</code> interface.
  +   </p>
  +  
  +  <div class="h4"><h4>Define the component extension interface</h4></div>
  +  
  +   <p>
  +    First we define the new Component extension interface.
  +   </p>
  +  
  +   <pre>
  +   /**
  +    * Simple custom lifecycle extension interface for supplying a component
  +    * with a security manager.
  +    */
  +   public interface SecurityManageable
  +   {
  +       /**
  +        * Pass a SecurityManager object to the component
  +        *
  +        * @param manager a SecurityManager value
  +        */
  +       void secure( SecurityManager manager )
  +           throws SecurityException;
  +   }
  +   </pre>
  +  
  +  
  +  
  +  <div class="h4"><h4>Create the lifecycle extensions class</h4></div>
  +  
  +   <p>
  +    Next we define the actual extension implementation which invokes the <code>secure()</code>
  +    method. We extend from <code>AbstractLifecycleExtension</code> since we only want
  +    <code>secure()</code> to be invoked upon each access (ie. lookup()) to the component, and
  +    don't need to implement the other 3 LifecycleExtension methods (create, release, and 
  +    destroy).
  +   </p>
  +  
  +   <pre>
  +   /**
  +    * Some custom extensions for this container's components.
  +    */
  +   public class Extensions
  +       extends AbstractLifecycleExtension
  +   {
  +       /**
  +        * Access, called when the given component is being
  +        * accessed (ie. via lookup() or select()).
  +        *
  +        * @param component a Component instance
  +        * @param context a Context instance
  +        * @exception Exception if an error occurs
  +        */
  +       public void access( Object component, Context context )
  +           throws Exception
  +       {
  +           if ( component instanceof SecurityManageable )
  +           {
  +               // pass in a simple security manager, a real system might want to pass
  +               // in specialized/custom security managers
  +               ( ( SecurityManageable ) component ).secure( new SecurityManager() );
  +           }
  +       }
  +   }
  +   </pre>
  +   
  +   <p>
  +    <p><i>An extension class may run components through any given number of
  +    extensions, and are not limited to just one.</i></p>
  +   </p>
  +  
  +  
  +  
  +  <div class="h4"><h4>Register the lifecycle extensions class</h4></div>
  +  
  +   <p>
  +    We then inform our container about the extension. This could be done in several different
  +    ways, for simplicity we'll extend <code>initialize()</code> and add it to the
  +    <code>LifecycleExtensionManager</code> there.
  +   </p>
  +  
  +   <p>
  +    (an alternative might be to initialize a LifecycleExtensionManager before creating the
  +    container and pass it in via the <code>ContextBuilder.setExtensionManager()</code> method,
  +    or to create a LifecycleExtensionManager subclass that includes the extension preset)
  +   </p>
  +  
  +   <pre>
  +   /**
  +    * Simple container that includes custom lifecycle extensions.
  +    */
  +   public final class ExtendedContainer
  +       extends AbstractContainer
  +   {
  +       public void initialize()
  +           throws Exception
  +       {
  +           super.initialize();
  +   	    
  +           m_extManager.addExtension( new Extensions() );
  +       }
  +   }
  +   </pre>
  +   
  +  
  +  
  +  <div class="h4"><h4>Use the new component interface</h4></div>
  +  
  +   <p>
  +    To use the new SecurityManageable lifecycle extension, we simply implement
  +    SecurityManageable just as we do with any other Avalon lifecycle interfaces
  +    (assuming a predefined Component interface <code>ExtendedComponent</code>).
  +   </p>
  +  
  +   <pre>
  +   /**
  +    * ExtendedComponentImpl, demonstrating the use of a custom
  +    * lifecycle stage SecurityManageable. This code does
  +    * a simple access check for several files on the file system and logs
  +    * the results accordingly.
  +    */
  +   public class ExtendedComponentImpl
  +       extends AbstractLogEnabled
  +       implements ExtendedComponent, SecurityManageable
  +   {
  +       /**
  +        * Pass a SecurityManager object to the component
  +        *
  +        * @param manager a SecurityManager value
  +        */
  +       public void secure( final SecurityManager manager )
  +           throws SecurityException
  +       {
  +           getLogger().info( "Received SecurityManager instance: " + manager );
  +   
  +           final String[] files = { "/tmp", "/vmlinuz", "/usr/lib/libc.a" };
  +   
  +           for ( int i = 0; i &lt; files.length; ++i )
  +           {
  +               try
  +               {
  +                   manager.checkRead( files[ i ] );
  +                   getLogger().info( "Thread can read " + files[ i ] );
  +               }
  +               catch ( SecurityException e )
  +               {
  +                   getLogger().info( "Thread can not read " + files[ i ] );
  +               }
  +           }
  +       }
  +   }
  +   </pre> 
  +  
  +  
  +   <p>
  +    As you can see, it's a straightforward process to implement a new extension.
  +   </p>
  +
  +  
  +
  +  <div class="h3"><h3>Need more information ?</h3></div>  
  +   <p>
  +    If you have any particular questions, comments, etc, please send an email to the Avalon
  +    developer mailing <a href="mailto:avalon-dev@jakarta.apache.org">list</a>.
  +   </p>
  +  
  +  
  +  
  +  
  +<div id="authors" align="right">by&nbsp;Marcus Crafter</div></div></div></div></td></tr></tbody></table><div id="footer"><table width="100%" cellpadding="4" cellspacing="0" border="0"><tbody><tr><td align="left">Copyright &copy; 2000-2002 Apache Software Foundation. All Rights Reserved.</td><td></td><td align="right"><script language="JavaScript">
  +                          <!--
  +                                  document.write("last modified: " + document.lastModified);
  +                          //  -->
  +
                              </script></td></tr></tbody></table></div></body></html>
  
  
  
  1.2       +16 -16    jakarta-avalon-site/docs/excalibur/fortress/skin/print.css
  
  Index: print.css
  ===================================================================
  RCS file: /home/cvs/jakarta-avalon-site/docs/excalibur/fortress/skin/print.css,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- print.css	17 Jul 2002 14:13:08 -0000	1.1
  +++ print.css	10 Aug 2002 22:07:23 -0000	1.2
  @@ -1,16 +1,16 @@
  -#banner, #footer, #leftcol, #breadcrumbs, .docs #toc, .docs .courtesylinks	{
  -	display: none;
  -	}
  -body.docs div.docs	{
  -	margin: 0 !important;
  -	border: none !important
  -	}
  -
  -/* just to be sure */
  -#navcolumn {
  - width: 0px;
  -}
  -
  -#leftcol {
  - width: 0px;
  -}
  +#banner, #footer, #leftcol, #breadcrumbs, .docs #toc, .docs .courtesylinks	{
  +	display: none;
  +	}
  +body.docs div.docs	{
  +	margin: 0 !important;
  +	border: none !important
  +	}
  +
  +/* just to be sure */
  +#navcolumn {
  + width: 0px;
  +}
  +
  +#leftcol {
  + width: 0px;
  +}
  
  
  
  1.2       +52 -56    jakarta-avalon-site/docs/excalibur/fortress/skin/site.css
  
  Index: site.css
  ===================================================================
  RCS file: /home/cvs/jakarta-avalon-site/docs/excalibur/fortress/skin/site.css,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- site.css	17 Jul 2002 14:13:08 -0000	1.1
  +++ site.css	10 Aug 2002 22:07:23 -0000	1.2
  @@ -1,56 +1,52 @@
  -div#banner {
  - border-top: 1px solid #fff;
  - border-bottom: 1px solid #aaa;
  -}
  -
  -#banner, #banner td {
  - background: #fff;
  - color: #036;
  -}
  -
  -#source {
  - background-color: #fff;
  - color: #000;
  - border-right: 1px solid #888;
  - border-left: 1px solid #888;
  - border-top: 1px solid #888;
  - border-bottom: 1px solid #888;
  - margin-right: 7px;
  - margin-left: 7px;
  - margin-top: 1em;
  -}
  -
  -#source pre {
  - margin-right: 7px;
  - margin-left: 7px;
  -}
  -
  -/* make the whole column grey */
  -#navcolumn {
  - width: 150px;
  - background: none;
  - border-top: none;
  - border-right: none;
  - border-bottom: none;
  - }
  -
  -#leftcol {
  - width: 150px;
  - background: #eee;
  - border-top: 1px solid #fff;
  - border-right: 1px solid #aaa;
  - border-bottom: 1px solid #aaa;
  -}
  -
  -/* breadcrumbs */
  -.breadcrumbTrail
  -{
  -	padding-left: 5px;
  -}
  -.breadcrumb
  -{
  -	font-weight: bold;
  -}
  -.crumbSeparator
  -{
  -}
  +div#banner {
  + border-top: 1px solid #fff;
  + border-bottom: 1px solid #aaa;
  +}
  +
  +#banner, #banner td {
  + background: #fff;
  + color: #036;
  +}
  +
  +#source {
  + background-color: #fff;
  + color: #000;
  + border-right: 1px solid #888;
  + border-left: 1px solid #888;
  + border-top: 1px solid #888;
  + border-bottom: 1px solid #888;
  + margin-right: 7px;
  + margin-left: 7px;
  + margin-top: 1em;
  +}
  +
  +#source pre {
  + margin-right: 7px;
  + margin-left: 7px;
  +}
  +
  +/* make the whole column grey */
  +#navcolumn {
  + width: 150px;
  + }
  +
  +#leftcol {
  + width: 150px;
  +}
  +
  +/* breadcrumbs */
  +#breadcrumbs
  +{
  +	font-weight: bold;
  +}
  +.breadcrumbTrail
  +{
  +	padding-left: 5px;
  +}
  +.breadcrumb
  +{
  +	font-weight: bold;
  +}
  +.crumbSeparator
  +{
  +}
  
  
  
  1.2       +427 -427  jakarta-avalon-site/docs/excalibur/fortress/skin/tigris.css
  
  Index: tigris.css
  ===================================================================
  RCS file: /home/cvs/jakarta-avalon-site/docs/excalibur/fortress/skin/tigris.css,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- tigris.css	17 Jul 2002 14:13:08 -0000	1.1
  +++ tigris.css	10 Aug 2002 22:07:23 -0000	1.2
  @@ -1,427 +1,427 @@
  -/* contains rules unsuitable for Netscape 4.x; simpler rules are in ns4_only.css. see <http://style.tigris.org/> */
  -
  -/* colors, backgrounds, borders, link indication */ 
  -
  -body {
  - background: #fff;
  - color: #000;
  - }
  -.app h3, .app h4, .tabs td, .tabs th, .functnbar {
  - background-image: url(../images/nw_min.gif);
  - background-repeat: no-repeat;
  - }
  -#navcolumn div div, body.docs #toc li li  {
  - background-image: url(../images/strich.gif);
  - background-repeat: no-repeat;
  - background-position: .5em .5em;
  - }
  -#navcolumn div div.heading  {
  - background-image: none;
  - }
  -.app h3, .app h4 {
  - color: #fff;
  - }
  -.app h3 {
  - background-color: #036;
  - }
  -.app h4 {
  - background-color: #888;
  - }
  -.a td {
  - background: #ddd;
  - }
  -.b td {
  - background: #efefef;
  - }
  -table, th, td {
  - border: none
  - }
  -.mtb {
  - border-top: solid 1px #ddd;
  - }
  -div.colbar {
  - background: #bbb;
  - }
  -#banner {
  - border-top: 1px solid #369;
  - border-bottom: 1px solid #003;
  - }
  -div#helptext th {
  - border-bottom: 1px solid #996;
  - border-right: 1px solid #996;
  - }
  -div#helptext td {
  - border-bottom: 1px solid #cc9;
  - border-right: 1px solid #cc9;
  - }
  -.tabs th {
  - border-right: 1px solid #333;
  - background-color: #ddd;
  - color: #fff;
  - }
  -.tabs td {
  - background-color: #999;
  - border-bottom: 1px solid #fff;
  - border-right: 1px solid #fff;
  - }
  -.tabs {
  - border-bottom: 6px #ddd solid;
  - }
  -.tabs th, .tabs th a:link, .tabs th a:visited {
  - color: #555;
  - }
  -.tabs td, .tabs td a:link, .tabs td a:visited  {
  - color: #fff;
  - }
  -.tabs a  {
  - text-decoration: none;
  - }
  -#navcolumn {
  - background: #eee;
  - border-right: 1px solid #aaa;
  - border-bottom: 1px solid #aaa;
  - }
  -#breadcrumbs {
  - border-bottom: 1px solid #aaa;
  - background-color: #ddd
  - }
  -#navcolumn, #breadcrumbs {
  - border-top: 1px solid #fff;
  - }
  -#rightcol div.www, #rightcol div.help {
  - border: 1px solid #ddd;
  - }
  -div#navcolumn div.focus {
  - border-top: 1px solid #aaa;
  - border-left: 1px solid #aaa;
  - background-color: #fff;
  - } 
  -body.docs div.docs { 
  - background: #fff;
  - border-left: 1px solid #ddd;
  - border-top: 1px solid #ddd;
  - }
  -body.docs { 
  - background: #eee url(../images/help_logo.gif) top right no-repeat !important;
  - }
  -.docs h3, .docs h4 {
  - border-top: solid 1px #000;
  - }
  -#alerterrormessage { 
  - background: url(../images/icon_alert.gif) top left no-repeat !important;
  - }
  -.functnbar {
  - background-color: #aaa;
  - }
  -.functnbar2, .functnbar3  {
  - background: #aaa url(../images/sw_min.gif) no-repeat bottom left;
  - }
  -.functnbar3 {
  - background-color: #ddd;
  - }
  -.functnbar, .functnbar2, .functnbar3 {
  - color: #000;
  - }
  -.functnbar a, .functnbar2 a, .functnbar3 a {
  - color: #000;
  - text-decoration: underline;
  - }
  -#topmodule {
  - background: #ddd;
  - border-top: 1px solid #fff;
  - border-bottom: 1px solid #aaa; 
  - border-right: 1px solid #aaa; 
  - }
  -#topmodule #issueid {
  - border-right: 1px solid #aaa;
  - }
  -a:link, #navcolumn a:visited, .app a:visited, .tasknav a:visited {
  - color: blue;
  - }
  -a:link.selfref, a:visited.selfref {
  - color: #555 !important;
  - text-decoration: none;
  - }
  -a:active, a:hover, #leftcol a:active, #leftcol a:hover {
  - color: #f30 !important;
  - }
  -#login a:link, #login a:visited {
  - color: white; 
  - text-decoration: underline;
  - }
  -#banner a:active, #banner a:hover {
  - color: #f90 !important;
  - }
  -#leftcol a, #breadcrumbs a  {
  - text-decoration: none;
  - }
  -#apphead h2 em {
  - color: #777;
  - }
  -a:link.selfref, a:visited.selfref {
  - color: #555 !important;
  - text-decoration: none;
  - }
  -.app th {
  - background-color: #bbb;
  - }
  -.axial th {
  - background-color: #ddd;
  - color: black
  - }
  -.alert { 
  - color: #c00;
  - }
  -.confirm {
  - color: green;
  - }
  -.info {
  - color: blue;
  - }
  -.selection {
  - background: #ffc;
  - }
  -#login {
  - color: #fff;
  - }
  -#helptext th {
  - background: #cc9;
  - }
  -#helptext td {
  - background: #ffc;
  - }
  -#navcolumn div strong {
  - color: #000;
  - }
  -#banner, #banner td { 
  - background: #036;
  - color: #fff;
  - }
  -body #banner #login a { 
  - color: #fff;
  - }
  -h4 a:link, h4 a:visited  {
  - text-decoration: underline;
  - color: #fff;
  - }
  -
  -/* font and text properties, exclusive of link indication, alignment, text-indent */
  -
  -body, th, td, input, select, textarea, h2 small {
  - font-family: Verdana, Helvetica, Arial, sans-serif;
  - }
  -code, pre {
  - font-family: 'Andale Mono', Courier, monospace;
  - }
  -html body, body th, body td, textarea, h2 small, .app h3, .app h4, #rightcol h3, #bodycol pre, #bodycol code {
  - font-size: x-small;
  - voice-family: "\"}\"";
  - voice-family: inherit;
  - font-size: small
  - }
  -html>body, html>body th, html>body td, html>body input, html>body select, html>body textarea, html>body h2 small, html>body .app h3, html>body .app h4, html>body #rightcol h3, html>body #bodycol pre, html>body #bodycol code {
  - font-size: small
  - }
  -small, div#footer td, div#login, div.tabs th, div.tabs td, input, select, .paginate, .functnbar, .functnbar2, .functnbar3, #breadcrumbs td, .courtesylinks, #rightcol div.help, .colbar, .tasknav, body.docs div#toc, #leftcol {
  - font-size: x-small;
  - voice-family: "\"}\"";
  - voice-family: inherit;
  - font-size: x-small
  - }
  -html>body small, html>body div#footer td, html>body div#login, html>body div.tabs th, html>body div.tabs td, html>body input, html>body select, html>body .paginate, html>body .functnbar, html>body .functnbar2, html>body .functnbar3, html>body #breadcrumbs td, html>body .courtesylinks, html>body #rightcol div.help, html>body .colbar, html>body .tasknav, html>body.docs #toc, html>body #leftcol {
  - font-size: x-small
  - }
  -#bodycol h2 {
  - font-family: Tahoma, Verdana, Helvetica, Arial, sans-serif;
  - font-size: 1.5em;
  - font-weight: normal;
  - }
  -.tabs td, .tabs th, dt, .tasknav .selfref, #login .username, .selection {
  - font-weight: bold
  - }
  -h4 {
  - font-size: 1em;
  - }
  -#apphead h2 em {
  -	font-style: normal;
  - } 
  -
  -/* box properties (exclusive of borders), positioning, alignments, list types, text-indent */
  -
  -#bodycol h2 {
  - margin-top: .3em;
  - margin-bottom: .5em;
  - }
  -p, ul, ol, dl {
  - margin-top: .67em;
  - margin-bottom: .67em;
  - }
  -h3, h4 {
  - margin-bottom: 0;
  - }
  -form {
  - margin-top: 0;
  - margin-bottom: 0;
  - }
  -#bodycol {
  - padding-left: 12px;
  - padding-right: 12px;
  - width: 100%;
  - voice-family: "\"}\"";
  - voice-family: inherit;
  - width: auto;
  - }
  -html>body #bodycol {
  - width: auto;
  - }
  -.docs {
  - line-height: 1.4;
  - }
  -.app h3, .app h4 {
  - padding: 5px;
  - margin-right: 2px;
  - margin-left: 2px;
  - }
  -.h3 p, .h4 p, .h3 dt, .h4 dt {
  - margin-right: 7px;
  - margin-left: 7px;
  - }
  -.tasknav {
  - margin-bottom: 1.33em
  - }
  -div.colbar {
  - padding: 3px;
  - margin: 2px 2px 0;
  - }
  -.tabs { 
  - margin-top: .67em;
  - margin-right: 2px;
  - margin-left: 2px;
  - }
  -#leftcol {
  - padding-bottom: .5em;
  - }
  -#breadcrumbs td {
  - vertical-align: middle;
  - padding: 2px 8px;
  - } 
  -.tabs td, .tabs th {
  - padding: 3px 9px;
  - }
  -#rightcol div.www, #rightcol div.help {
  - padding: 0 .5em
  - }
  -#navcolumn {
  - margin: -8px -8px 0 -8px;
  - padding: 4px;
  - }
  -#navcolumn div {
  - padding-left: 5px
  - }
  -div#navcolumn div div {
  - margin-top: .3em;
  - margin-bottom: .3em;
  - }
  -div#navcolumn div.focus { 
  - margin-top: -.1em;
  - padding: .2em 4px; 
  - } 
  -body.docs #toc { 
  - position: absolute;
  - top: 15px;
  - left: 0px;
  - width: 120px;
  - padding: 0 20px 0 0
  - }
  -body.docs #toc ul, #toc ol {
  - margin-left: 0;
  - padding-left: 0;
  - }
  -body.docs #toc li {
  - margin-top: 7px;
  - padding-left: 10px;
  - list-style-type: none;
  - }
  -body.docs div.docs { 
  - margin: 61px 0 0 150px;
  - padding: 1em 2em 1em 1em !important;
  - }
  -.docs p+p {
  - text-indent: 5%;
  - margin-top: -.67em
  - }
  -.docs h3, .docs h4 {
  - margin-bottom: .1em;
  - padding-top: .3em;
  - }
  -#alerterrormessage { 
  - padding-left: 100px;
  - }
  -.functnbar, .functnbar2, .functnbar3 {
  - padding: 5px;
  - margin: .67em 2px;
  - }
  -#topmodule td {
  - vertical-align: middle;
  - padding: 2px 8px
  - } 
  -body {
  - padding: 1em;
  - }
  -body.composite, body.docs {
  - margin: 0;
  - padding: 0;
  - }
  -th, td {
  - text-align: left;
  - vertical-align: top 
  - }
  -.right {
  - text-align: right !important;
  - }
  -.center {
  - text-align: center !important;
  - }
  -.axial th {
  - text-align: right;
  - }
  -.app .axial td th {
  - text-align: left;
  - }
  -body td .stb {
  - margin-top: 1em;
  - text-indent: 0;
  - }
  -body td .mtb {
  - margin-top: 2em;
  - text-indent: 0;
  - }
  -dd {
  - margin-bottom: .67em;
  - }
  -#footer {
  - margin: 4px
  - }
  -#helptext {
  - margin-top: 1em
  - }
  -#helptext td div {
  - margin: .5em
  - }
  -.courtesylinks {
  - margin-top: 1em;
  - padding-top: 1em
  - }
  -#navcolumn div {
  - margin-bottom: .5em;
  - }
  -#navcolumn div div {
  - margin-top: .3em
  - }
  -#navcolumn div div {
  - padding-left: 1em;
  - }
  -#banner, #banner td { 
  - vertical-align: middle;
  - }
  -
  +/* contains rules unsuitable for Netscape 4.x; simpler rules are in ns4_only.css. see <http://style.tigris.org/> */
  +
  +/* colors, backgrounds, borders, link indication */ 
  +
  +body {
  + background: #fff;
  + color: #000;
  + }
  +.app h3, .app h4, .tabs td, .tabs th, .functnbar {
  + background-image: url(../images/nw_min.gif);
  + background-repeat: no-repeat;
  + }
  +#navcolumn div div, body.docs #toc li li  {
  + background-image: url(../images/strich.gif);
  + background-repeat: no-repeat;
  + background-position: .5em .5em;
  + }
  +#navcolumn div div.heading  {
  + background-image: none;
  + }
  +.app h3, .app h4 {
  + color: #fff;
  + }
  +.app h3 {
  + background-color: #036;
  + }
  +.app h4 {
  + background-color: #888;
  + }
  +.a td {
  + background: #ddd;
  + }
  +.b td {
  + background: #efefef;
  + }
  +table, th, td {
  + border: none
  + }
  +.mtb {
  + border-top: solid 1px #ddd;
  + }
  +div.colbar {
  + background: #bbb;
  + }
  +#banner {
  + border-top: 1px solid #369;
  + border-bottom: 1px solid #003;
  + }
  +div#helptext th {
  + border-bottom: 1px solid #996;
  + border-right: 1px solid #996;
  + }
  +div#helptext td {
  + border-bottom: 1px solid #cc9;
  + border-right: 1px solid #cc9;
  + }
  +.tabs th {
  + border-right: 1px solid #333;
  + background-color: #ddd;
  + color: #fff;
  + }
  +.tabs td {
  + background-color: #999;
  + border-bottom: 1px solid #fff;
  + border-right: 1px solid #fff;
  + }
  +.tabs {
  + border-bottom: 6px #ddd solid;
  + }
  +.tabs th, .tabs th a:link, .tabs th a:visited {
  + color: #555;
  + }
  +.tabs td, .tabs td a:link, .tabs td a:visited  {
  + color: #fff;
  + }
  +.tabs a  {
  + text-decoration: none;
  + }
  +#navcolumn {
  + background: #eee;
  + border-right: 1px solid #aaa;
  + border-bottom: 1px solid #aaa;
  + }
  +#breadcrumbs {
  + border-bottom: 1px solid #aaa;
  + background-color: #ddd
  + }
  +#navcolumn, #breadcrumbs {
  + border-top: 1px solid #fff;
  + }
  +#rightcol div.www, #rightcol div.help {
  + border: 1px solid #ddd;
  + }
  +div#navcolumn div.focus {
  + border-top: 1px solid #aaa;
  + border-left: 1px solid #aaa;
  + background-color: #fff;
  + } 
  +body.docs div.docs { 
  + background: #fff;
  + border-left: 1px solid #ddd;
  + border-top: 1px solid #ddd;
  + }
  +body.docs { 
  + background: #eee url(../images/help_logo.gif) top right no-repeat !important;
  + }
  +.docs h3, .docs h4 {
  + border-top: solid 1px #000;
  + }
  +#alerterrormessage { 
  + background: url(../images/icon_alert.gif) top left no-repeat !important;
  + }
  +.functnbar {
  + background-color: #aaa;
  + }
  +.functnbar2, .functnbar3  {
  + background: #aaa url(../images/sw_min.gif) no-repeat bottom left;
  + }
  +.functnbar3 {
  + background-color: #ddd;
  + }
  +.functnbar, .functnbar2, .functnbar3 {
  + color: #000;
  + }
  +.functnbar a, .functnbar2 a, .functnbar3 a {
  + color: #000;
  + text-decoration: underline;
  + }
  +#topmodule {
  + background: #ddd;
  + border-top: 1px solid #fff;
  + border-bottom: 1px solid #aaa; 
  + border-right: 1px solid #aaa; 
  + }
  +#topmodule #issueid {
  + border-right: 1px solid #aaa;
  + }
  +a:link, #navcolumn a:visited, .app a:visited, .tasknav a:visited {
  + color: blue;
  + }
  +a:link.selfref, a:visited.selfref {
  + color: #555 !important;
  + text-decoration: none;
  + }
  +a:active, a:hover, #leftcol a:active, #leftcol a:hover {
  + color: #f30 !important;
  + }
  +#login a:link, #login a:visited {
  + color: white; 
  + text-decoration: underline;
  + }
  +#banner a:active, #banner a:hover {
  + color: #f90 !important;
  + }
  +#leftcol a, #breadcrumbs a  {
  + text-decoration: none;
  + }
  +#apphead h2 em {
  + color: #777;
  + }
  +a:link.selfref, a:visited.selfref {
  + color: #555 !important;
  + text-decoration: none;
  + }
  +.app th {
  + background-color: #bbb;
  + }
  +.axial th {
  + background-color: #ddd;
  + color: black
  + }
  +.alert { 
  + color: #c00;
  + }
  +.confirm {
  + color: green;
  + }
  +.info {
  + color: blue;
  + }
  +.selection {
  + background: #ffc;
  + }
  +#login {
  + color: #fff;
  + }
  +#helptext th {
  + background: #cc9;
  + }
  +#helptext td {
  + background: #ffc;
  + }
  +#navcolumn div strong {
  + color: #000;
  + }
  +#banner, #banner td { 
  + background: #036;
  + color: #fff;
  + }
  +body #banner #login a { 
  + color: #fff;
  + }
  +h4 a:link, h4 a:visited  {
  + text-decoration: underline;
  + color: #fff;
  + }
  +
  +/* font and text properties, exclusive of link indication, alignment, text-indent */
  +
  +body, th, td, input, select, textarea, h2 small {
  + font-family: Verdana, Helvetica, Arial, sans-serif;
  + }
  +code, pre {
  + font-family: 'Andale Mono', Courier, monospace;
  + }
  +html body, body th, body td, textarea, h2 small, .app h3, .app h4, #rightcol h3, #bodycol pre, #bodycol code {
  + font-size: x-small;
  + voice-family: "\"}\"";
  + voice-family: inherit;
  + font-size: small
  + }
  +html>body, html>body th, html>body td, html>body input, html>body select, html>body textarea, html>body h2 small, html>body .app h3, html>body .app h4, html>body #rightcol h3, html>body #bodycol pre, html>body #bodycol code {
  + font-size: small
  + }
  +small, div#footer td, div#login, div.tabs th, div.tabs td, input, select, .paginate, .functnbar, .functnbar2, .functnbar3, #breadcrumbs td, .courtesylinks, #rightcol div.help, .colbar, .tasknav, body.docs div#toc, #leftcol {
  + font-size: x-small;
  + voice-family: "\"}\"";
  + voice-family: inherit;
  + font-size: x-small
  + }
  +html>body small, html>body div#footer td, html>body div#login, html>body div.tabs th, html>body div.tabs td, html>body input, html>body select, html>body .paginate, html>body .functnbar, html>body .functnbar2, html>body .functnbar3, html>body #breadcrumbs td, html>body .courtesylinks, html>body #rightcol div.help, html>body .colbar, html>body .tasknav, html>body.docs #toc, html>body #leftcol {
  + font-size: x-small
  + }
  +#bodycol h2 {
  + font-family: Tahoma, Verdana, Helvetica, Arial, sans-serif;
  + font-size: 1.5em;
  + font-weight: normal;
  + }
  +.tabs td, .tabs th, dt, .tasknav .selfref, #login .username, .selection {
  + font-weight: bold
  + }
  +h4 {
  + font-size: 1em;
  + }
  +#apphead h2 em {
  +	font-style: normal;
  + } 
  +
  +/* box properties (exclusive of borders), positioning, alignments, list types, text-indent */
  +
  +#bodycol h2 {
  + margin-top: .3em;
  + margin-bottom: .5em;
  + }
  +p, ul, ol, dl {
  + margin-top: .67em;
  + margin-bottom: .67em;
  + }
  +h3, h4 {
  + margin-bottom: 0;
  + }
  +form {
  + margin-top: 0;
  + margin-bottom: 0;
  + }
  +#bodycol {
  + padding-left: 12px;
  + padding-right: 12px;
  + width: 100%;
  + voice-family: "\"}\"";
  + voice-family: inherit;
  + width: auto;
  + }
  +html>body #bodycol {
  + width: auto;
  + }
  +.docs {
  + line-height: 1.4;
  + }
  +.app h3, .app h4 {
  + padding: 5px;
  + margin-right: 2px;
  + margin-left: 2px;
  + }
  +.h3 p, .h4 p, .h3 dt, .h4 dt {
  + margin-right: 7px;
  + margin-left: 7px;
  + }
  +.tasknav {
  + margin-bottom: 1.33em
  + }
  +div.colbar {
  + padding: 3px;
  + margin: 2px 2px 0;
  + }
  +.tabs { 
  + margin-top: .67em;
  + margin-right: 2px;
  + margin-left: 2px;
  + }
  +#leftcol {
  + padding-bottom: .5em;
  + }
  +#breadcrumbs td {
  + vertical-align: middle;
  + padding: 2px 8px;
  + } 
  +.tabs td, .tabs th {
  + padding: 3px 9px;
  + }
  +#rightcol div.www, #rightcol div.help {
  + padding: 0 .5em
  + }
  +#navcolumn {
  + margin: -8px -8px 0 -8px;
  + padding: 4px;
  + }
  +#navcolumn div {
  + padding-left: 5px
  + }
  +div#navcolumn div div {
  + margin-top: .3em;
  + margin-bottom: .3em;
  + }
  +div#navcolumn div.focus { 
  + margin-top: -.1em;
  + padding: .2em 4px; 
  + } 
  +body.docs #toc { 
  + position: absolute;
  + top: 15px;
  + left: 0px;
  + width: 120px;
  + padding: 0 20px 0 0
  + }
  +body.docs #toc ul, #toc ol {
  + margin-left: 0;
  + padding-left: 0;
  + }
  +body.docs #toc li {
  + margin-top: 7px;
  + padding-left: 10px;
  + list-style-type: none;
  + }
  +body.docs div.docs { 
  + margin: 61px 0 0 150px;
  + padding: 1em 2em 1em 1em !important;
  + }
  +.docs p+p {
  + text-indent: 5%;
  + margin-top: -.67em
  + }
  +.docs h3, .docs h4 {
  + margin-bottom: .1em;
  + padding-top: .3em;
  + }
  +#alerterrormessage { 
  + padding-left: 100px;
  + }
  +.functnbar, .functnbar2, .functnbar3 {
  + padding: 5px;
  + margin: .67em 2px;
  + }
  +#topmodule td {
  + vertical-align: middle;
  + padding: 2px 8px
  + } 
  +body {
  + padding: 1em;
  + }
  +body.composite, body.docs {
  + margin: 0;
  + padding: 0;
  + }
  +th, td {
  + text-align: left;
  + vertical-align: top 
  + }
  +.right {
  + text-align: right !important;
  + }
  +.center {
  + text-align: center !important;
  + }
  +.axial th {
  + text-align: right;
  + }
  +.app .axial td th {
  + text-align: left;
  + }
  +body td .stb {
  + margin-top: 1em;
  + text-indent: 0;
  + }
  +body td .mtb {
  + margin-top: 2em;
  + text-indent: 0;
  + }
  +dd {
  + margin-bottom: .67em;
  + }
  +#footer {
  + margin: 4px
  + }
  +#helptext {
  + margin-top: 1em
  + }
  +#helptext td div {
  + margin: .5em
  + }
  +.courtesylinks {
  + margin-top: 1em;
  + padding-top: 1em
  + }
  +#navcolumn div {
  + margin-bottom: .5em;
  + }
  +#navcolumn div div {
  + margin-top: .3em
  + }
  +#navcolumn div div {
  + padding-left: 1em;
  + }
  +#banner, #banner td { 
  + vertical-align: middle;
  + }
  +
  
  
  

--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>