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 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 © 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 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 © 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 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 © 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 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 © 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 < 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 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 © 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 < 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 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 © 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>