leosutic 2002/06/24 13:53:47 Added: microcontainer .cvsignore ant.properties.sample build.xml default.properties readme.txt microcontainer/examples README.txt microcontainer/src/java/org/apache/excalibur/microcontainer Handler.java MicroContainer.java MicroContainerComponentManager.java MicroContainerException.java MicroContainerProxy.java microcontainer/src/test/org/apache/excalibur/microcontainer/test Composer.java ComposerImpl.java ComposerTestCase.java Supplier.java SupplierImpl.java microcontainer/src/xdocs book.xml index.xml microcontainer.uris microcontainer/src/xdocs/dtd changes-v10.dtd characters.ent document-v10.dtd faq-v10.dtd specification-v10.dtd todo-v10.dtd microcontainer/src/xdocs/images build.gif code.gif design.gif update.gif Log: First checkin Revision Changes Path 1.1 jakarta-avalon-excalibur/microcontainer/.cvsignore Index: .cvsignore =================================================================== ant.properties build checkstyle.cache distributions dist excalibur-* *.el *.ipr 1.1 jakarta-avalon-excalibur/microcontainer/ant.properties.sample Index: ant.properties.sample =================================================================== # ----------------------------------------------------------------------------- # Component ant.properties.sample # # This is an example "ant.properties" file, used to customize the building of # the component for your local environment. It defines the location of all # external modules that this component depend on. Copy this file to # "ant.properties" in the source directory, and customize it as needed. # # The ant.properties values in this directory apply only to this component. # It is overridden by ../ant.properties and ~/build.properties # It overrides all default.properties files and ~/.ant.properties # # $Id: ant.properties.sample,v 1.1 2002/06/24 20:53:46 leosutic Exp $ # ----------------------------------------------------------------------------- # ----- Compile Control Flags ----- build.debug=on build.optimize=off build.deprecation=off #build.compiler=jikes # ----- Base Directory in which all the packages are stored ----- base.path=${basedir}/../.. # -------------------------------------------------- # REQUIRED LIBRARIES # -------------------------------------------------- # -------------------------------------------------- # OPTIONAL LIBRARIES # -------------------------------------------------- # ----- JUnit Unit Test Suite, version 3.7 or later. ----- # Not needed if junit.jar is in $ANT_HOME/lib junit.home=${base.path}/junit3.7 junit.lib=${junit.home} junit.jar=${junit.lib}/junit.jar # ----- Checkstyle, version 2.1 or later ----- # Uncomment the 'do.checkstyle' flag property to enable checkstyle # do.checkstyle= checkstyle.home=${base.path}/checkstyle-2.1 checkstyle.lib=${checkstyle.home} checkstyle.jar=${checkstyle.lib}/checkstyle-all-2.1.jar 1.1 jakarta-avalon-excalibur/microcontainer/build.xml Index: build.xml =================================================================== <?xml version="1.0"?> <project name="Excalibur template" default="main" basedir="."> <property file="${user.home}/build.properties"/> <property file="${basedir}/../ant.properties"/> <property file="${basedir}/ant.properties"/> <property file="${user.home}/.ant.properties"/> <property file="${basedir}/../default.properties"/> <property file="${basedir}/default.properties"/> <!-- Classpath for product --> <path id="project.class.path"> <pathelement location="${build.classes}"/> <pathelement location="${checkstyle.jar}"/> <pathelement location="${avalon-framework.jar}"/> <pathelement path="${java.class.path}"/> </path> <path id="tools.class.path"> <pathelement location="${junit.jar}"/> <pathelement location="${tools.jar}"/> <fileset dir="${tools.dir}/lib"/> <fileset dir="${tools.dir}/ext"/> </path> <path id="test.class.path"> <pathelement location="${build.testclasses}"/> <pathelement location="${junit.jar}"/> <path refid="project.class.path"/> </path> <property name="cp" refid="test.class.path"/> <target name="main" depends="jar" description="Build the project"/> <target name="rebuild" depends="clean,main" description="Rebuild the project"/> <target name="dependencies" description="Check dependencies" unless="skip.dependencies"> <ant antfile="${depchecker.prefix}/depchecker.xml" target="checkCommon"/> <ant antfile="${depchecker.prefix}/depchecker.xml" target="checkFramework"/> </target> <target name="dependencies-test" depends="dist-jar, dependencies" description="Check unit test dependencies" unless="skip.dependencies"> <!-- Need the jar to prevent recursive deps. --> <ant antfile="${depchecker.prefix}/depchecker.xml" target="checkJUnit"/> </target> <!-- Compiles the source code --> <target name="compile" depends="dependencies" description="Compiles the source code"> <mkdir dir="${build.classes}"/> <!-- Compile all classes excluding the tests. --> <javac srcdir="${java.dir}" destdir="${build.classes}" debug="${build.debug}" optimize="${build.optimize}" deprecation="${build.deprecation}" target="1.2"> <classpath refid="project.class.path" /> <include name="**/*.java"/> </javac> <!-- copy resources to same location as .class files --> <copy todir="${build.classes}"> <fileset dir="${java.dir}"> <exclude name="**/*.java"/> <exclude name="**/package.html"/> </fileset> </copy> </target> <!-- Compiles the unit test source code --> <target name="compile-test" depends="compile, dependencies-test" description="Compiles the source code"> <mkdir dir="${build.testsrc}"/> <!-- Copy over all of the tests applying test filters --> <copy todir="${build.testsrc}"> <fileset dir="${test.dir}"/> </copy> <mkdir dir="${build.testclasses}"/> <!-- Compile all test classes. --> <javac srcdir="${build.testsrc}" destdir="${build.testclasses}" debug="${build.debug}" optimize="${build.optimize}" deprecation="${build.deprecation}" target="1.2"> <classpath refid="test.class.path" /> <include name="**/*.java"/> </javac> <copy todir="${build.testclasses}"> <fileset dir="${test.dir}"> <exclude name="**/*.java"/> <exclude name="**/package.html"/> </fileset> </copy> </target> <!-- Copies and filters the license. Used by jar and dist --> <target name="prepare-conf"> <mkdir dir="${build.conf}"/> <copy todir="${build.conf}" flatten="true"> <fileset dir="../" includes="LICENSE.txt"/> <filterset> <filter token="year" value="${year}"/> </filterset> </copy> </target> <!-- Creates all the .jar file --> <target name="jar" depends="compile, prepare-conf" description="Generates the jar files"> <mkdir dir="${build.lib}"/> <jar jarfile="${build.lib}/${jar.name}" basedir="${build.classes}" compress="${build.compress}"> <manifest> <attribute name="Extension-Name" value="${name}"/> <attribute name="Specification-Vendor" value="Apache Software Foundation"/> <attribute name="Specification-Version" value="1.0"/> <attribute name="Implementation-Vendor" value="Apache Software Foundation"/> <attribute name="Implementation-Version" value="${package-version}"/> </manifest> <exclude name="**/test/**"/> <zipfileset dir="${build.conf}" prefix="META-INF/"> <include name="LICENSE.txt"/> </zipfileset> </jar> </target> <!-- Creates all the Javadocs --> <target name="javadocs" depends="compile" description="Generates the javadocs" unless="skip.javadocs"> <mkdir dir="${dist.javadocs}"/> <javadoc packagenames="org.apache.*" sourcepath="${java.dir}" destdir="${dist.javadocs}"> <classpath refid="project.class.path" /> <doclet name="com.sun.tools.doclets.standard.Standard"> <param name="-author"/> <param name="-version"/> <param name="-doctitle" value="${Name}"/> <param name="-windowtitle" value="${Name} API"/> <param name="-link" value="http://java.sun.com/j2se/1.4/docs/api/"/> <param name="-link" value="http://java.sun.com/j2ee/sdk_1.3/techdocs/api/"/> <param name="-link" value="http://jakarta.apache.org/avalon/api/"/> <param name="-bottom" value=""Copyright © ${year} Apache Jakarta Project. All Rights Reserved.""/> </doclet> </javadoc> </target> <target name="test" depends="compile-test" description="Perform the unit tests" unless="skip.tests"> <echo message="Performing Unit Tests" /> <mkdir dir="${build.tests}"/> <junit fork="true" haltonfailure="${junit.failonerror}" printsummary="yes" dir="${build.tests}"> <classpath refid="test.class.path"/> <formatter type="xml"/> <!-- xml reports for junitreport --> <formatter type="plain" usefile="false"/> <!-- text reports for humans --> <batchtest todir="${build.tests}"> <fileset dir="${build.testclasses}"> <include name="**/test/*TestCase.class"/> <exclude name="**/Abstract*"/> </fileset> </batchtest> </junit> </target> <target name="test-reports" depends="test" description="Generate Reports for the unit tests"> <ant antfile="${depchecker.prefix}/depchecker.xml" target="checkBSF"/> <mkdir dir="${build.reports}/junit"/> <junitreport todir="${build.reports}/junit"> <fileset dir="${build.tests}"> <include name="TEST-*.xml"/> </fileset> <report format="frames" todir="${build.reports}/junit"/> </junitreport> <!-- Clean up the xml reports used by the junitreport task --> <!-- <delete> <fileset dir="${build.tests}" includes="TEST-*.xml"/> <fileset dir="${build.tests}" includes="TESTS-*.xml"/> </delete> --> </target> <target name="checkstyle" if="do.checkstyle" description="Checkstyle"> <!-- this invocation of checkstyle requires that checkstyle be downloaded and setup --> <!-- thats why you are required to define do.checkstyle property to generate the report --> <taskdef name="checkstyle" classname="com.puppycrawl.tools.checkstyle.CheckStyleTask"> <classpath refid="project.class.path"/> </taskdef> <checkstyle lcurlyType="nl" lcurlyMethod="nl" lcurlyOther="nl" rcurly="ignore" allowProtected="false" allowPackage="false" allowNoAuthor="false" maxLineLen="100" maxMethodLen="100" maxConstructorLen="100" memberPattern="^m_[a-z][a-zA-Z0-9]*$" staticPattern="^c_[a-z][a-zA-Z0-9]*$" constPattern="(^c_[a-z][a-zA-Z0-9]*$)|([A-Z_]*$)" ignoreImportLen="true" allowTabs="false" javadocScope="protected" ignoreWhitespace="true" cacheFile="checkstyle.cache" failOnViolation="false" ignoreCastWhitespace="true"> <fileset dir="${java.dir}"> <include name="**/*.java"/> </fileset> <formatter type="plain"/> <formatter type="xml" toFile="${build.dir}/checkstyle-results.xml"/> </checkstyle> </target> <target name="checkstyle-report" depends="checkstyle" if="do.checkstyle" description="Generate Checkstyle Report"> <mkdir dir="${build.reports}/checkstyle"/> <property name="checkstyle.pathhack" location="."/> <style style="${tools.dir}/etc/checkstyle-frames.xsl" in="${build.dir}/checkstyle-results.xml" out="${build.reports}/checkstyle/delete-me.html"> <param name="pathhack" expression="${checkstyle.pathhack}"/> </style> </target> <!-- Creates the distribution --> <target name="dist" depends="dist-jar, test-reports, checkstyle-report, javadocs" description="Generates a distribution (jar + javadocs + unit tests + checkstyle reports)"> <copy file="${build.conf}/LICENSE.txt" todir="${dist.dir}"/> <copy file="../KEYS" todir="${dist.dir}"/> <mkdir dir="${dist.base}"/> <zip zipfile="${dist.base}/${dist.name}-bin.zip" compress="true"> <zipfileset dir="${dist.dir}" prefix="${dist.name}"/> </zip> <!-- Not supported by released ant but when it is we should enable this across all of the products <tar longfile="gnu" tarfile="${dist.base}/${dist.name}-bin.tar"> <tarfileset dir="${dist.dir}" prefix="${dist.name}" username="avalon" group="avalon"/> </tar> <gzip zipfile="${dist.base}/${dist.name}-bin.tar.gz" src="${dist.name}-bin.tar"/> <bzip2 zipfile="${dist.base}/${dist.name}-bin.tar.gz" src="${dist.name}-bin.tar"/> <delete file="${dist.base}/${dist.name}-bin.tar"/> <checksum fileext=".md5"> <fileset dir="${dist.base}" /> </checksum> --> <delete dir="${dist.dir}" /> </target> <!-- Creates a mini jar-only distribution --> <target name="dist-jar" depends="jar"> <mkdir dir="${dist.dir}"/> <copy todir="${dist.dir}"> <fileset dir="${build.lib}"> <include name="*.jar"/> </fileset> </copy> </target> <!-- Creates a minimal distribution --> <target name="dist.lite" depends="dist-jar, test, javadocs" description="Generates a minimal distribution (jar + javadocs)"> <copy file="../LICENSE.txt" todir="${dist.dir}"/> <copy file="../KEYS" todir="${dist.dir}"/> </target> <!-- Setup the filters --> <target name="setup-filters"> <filter token="Name" value="Avalon ${Name}"/> <filter token="name" value="${dir-name}"/> <filter token="version" value="${version}"/> <filter token="year" value="${year}"/> <filter token="status" value="${status}"/> <filter token="release" value="${release}"/> <filter token="short-version" value="${short.version}"/> <property name="avalon.base" value="http://jakarta.apache.org/avalon"/> <property name="framework.base" value="http://jakarta.apache.org/avalon/framework"/> <property name="phoenix.base" value="http://jakarta.apache.org/avalon/phoenix"/> <property name="cornerstone.base" value="http://jakarta.apache.org/avalon/cornerstone"/> <property name="logkit.base" value="http://jakarta.apache.org/avalon/logkit"/> <property name="testlet.base" value="http://jakarta.apache.org/avalon/testlet"/> <filter token="year" value="${year}"/> <filter token="AVALON_BASE" value="${avalon.base}"/> <filter token="FRAMEWORK_BASE" value="${framework.base}"/> <filter token="PHOENIX_BASE" value="${phoenix.base}"/> <filter token="CORNERSTONE_BASE" value="${cornerstone.base}"/> <filter token="LOGKIT_BASE" value="${logkit.base}"/> <filter token="TESTLET_BASE" value="${testlet.base}"/> </target> <!-- Prepares the documentation directory --> <target name="docs" depends="setup-filters"> <!-- depends="javadocs" description="Generates the Docs" --> <mkdir dir="${docs.dir}"/> <mkdir dir="${build.context}"/> <mkdir dir="${build.xdocs}"/> <mkdir dir="${build.docs}"/> <mkdir dir="${build.dir}/work"/> <!-- Base pointers for non-xdocs documentation. Override these in .ant.properties to link to local docs --> <copy todir="${build.context}" filtering="on" overwrite="yes"> <fileset dir="${context.dir}"> <exclude name="diagrams/**"/> <exclude name="resources/**"/> <exclude name="xdocs"/> </fileset> </copy> <copy todir="${build.context}/xdocs" filtering="on" overwrite="yes"> <fileset dir="${xdocs.dir}"/> </copy> <copy todir="${build.context}/resources" filtering="off" overwrite="yes"> <fileset dir="${context.dir}/resources"/> <fileset dir="${xdocs.dir}"> <include name="**/images/**"/> </fileset> </copy> <java classname="org.apache.cocoon.Main" fork="true"> <arg value="-c${build.context}/"/> <arg value="-d${build.docs}"/> <arg value="-w${build.dir}/work"/> <arg value="-l${build.dir}/work/cocoon.log"/> <arg value="-uINFO"/> <arg value="-f${xdocs.dir}/${dir-name}.uris"/> <classpath> <path refid="tools.class.path"/> <fileset dir="${tools.dir}/ext"/> </classpath> </java> <copy todir="${docs.dir}"> <fileset dir="${build.docs}"> <include name="**"/> </fileset> </copy> <!-- hack for stupid transport on api link --> <replace file="${docs.dir}/index.html" token="index.html.xml" value="index.html"/> </target> <target name="site" depends="javadocs, docs" description=" Places Docs ready for hosting on website"> <mkdir dir="../site/dist/docs/${dir-name}"/> <copy todir="../site/dist/docs/${dir-name}"> <fileset dir="${docs.dir}"> <include name="**"/> </fileset> </copy> </target> <!-- Cleans up build and distribution directories --> <target name="clean" description="Cleans up the project"> <delete file="checkstyle.cache"/> <delete dir="${build.dir}" /> <delete dir="${dist.dir}" /> <delete dir="test" /> <!-- unit testing output directory --> <delete> <fileset dir="." includes="**/*~" defaultexcludes="no"/> </delete> </target> <target name="real-clean" depends="clean" description="Cleans up the project, including distributions"> <delete dir="${dist.base}" /> </target> </project> 1.1 jakarta-avalon-excalibur/microcontainer/default.properties Index: default.properties =================================================================== # ------------------------------------------------------------------- # B U I L D P R O P E R T I E S # ------------------------------------------------------------------- # Specifies default property values # Overridden by ../default.properties and all ant.properties # Not user-editable; use ant.properties files instead name=excalibur-microcontainer Name=Excalibur MicroContainer dir-name=microcontainer version=1.0 package-version=0.99 year=2000-2002 # -------------------------------------------------- # REQUIRED LIBRARIES # -------------------------------------------------- # -------------------------------------------------- # Settings used to configure compile environment build.debug = on build.optimize = off build.deprecation = off build.compress = false junit.failonerror = false # location of intermediate products build.dir = build build.testsrc = ${build.dir}/testsrc build.testclasses = ${build.dir}/testclasses build.lib = ${build.dir}/lib build.conf = ${build.dir}/conf build.classes = ${build.dir}/classes build.tests = ${build.dir}/tests build.reports = ${build.dir}/reports # Set the properties for source directories src.dir = src java.dir = ${src.dir}/java conf.dir = ${src.dir}/conf test.dir = ${src.dir}/test # Set the properties for distribution directories dist.dir = dist dist.javadocs = ${dist.dir}/docs/api # name of .zip/.tar.gz/.bz2 files and their top-level directory dist.name = ${name}-${version} # name of jar file jar.name = ${name}-${version}.jar # property indicating directory where all distribution archives are placed dist.base = distributions depchecker.prefix=. # ----- Avalon Framework, version 4.1 or later ----- avalon-framework.home=${basedir}/../../jakarta-avalon avalon-framework.lib=${avalon-framework.home}/build/lib avalon-framework.jar=${avalon-framework.lib}/avalon-framework.jar # ----- Excalibur Testcase, version 1.0 or later ----- excalibur-testcase.home=${basedir}/../testcase/dist excalibur-testcase.lib=${excalibur-testcase.home} excalibur-testcase.jar=${excalibur-testcase.lib}/excalibur-testcase-1.0.jar # ----- Cocoon stuff build.context = ${build.dir}/documentation build.docs = ${build.dir}/docs build.xdocs = ${build.dir}/xdocs context.dir = ../../jakarta-avalon/src/documentation tools.dir = ../../jakarta-avalon/tools tools.jar = ${java.home}/../lib/tools.jar docs.dir = docs xdocs.dir = ${src.dir}/xdocs 1.1 jakarta-avalon-excalibur/microcontainer/readme.txt Index: readme.txt =================================================================== Leo Sutic <[EMAIL PROTECTED]>: AVALON MICROCONTAINER - --------------------- - PURPOSE One of the barriers of entry to Avalon is the fact that you are buying into an entire architecture. Instead of just getting a set of classes that you can use as you were used to, you get a set of Avalon Components that must be put in a container and managed. Often this involves XML config files and other niceties that, while providing amazing flexibility, makes it difficult to lure unsuspecting developers into Avalon. We lose the "first component is for free" / "I can see that you're special, so I got something special for you" opportunity. Stefano mentioned that several potential new users of Avalon had tried to start a component by doing: ComponentInterface comp = new ComponentImpl (); and then nothing more, because that was what they were familiar with. The purpose of Avalon Microcontainer is to make something that is as close as possible to the above possible. Specifically: + Components should be able to be used with the Microcontainer without any XML and any config files. + All configuration is handled programmatically. + As far as possible, usage of components should follow standard Java idioms. BASIC IDEA Define a container that holds *one* component. Yep, that's right, one single component for each container. Solve composition by linking these together. Solve usage of components by letting the container expose the component's interface. This may seem difficult to understand, but see the case study below to see how I reached the currect way of doing it. CASE STUDY The case I'm looking at has two components, the Supplier and the Composer. Their interfaces are defined in Supplier.java and Composer.java, respectively, and their implementations are in SupplierImpl.java and ComposerImpl.java. Let me list some issues: + ComposerImpl accesses the Supplier via a ComponentManager interface. It uses lookup("supplier") to get the Supplier. + ComposerImpl may require more than one Supplier during each transaction. + SupplierImpl may or may not be threadsafe. + The user may want to access Supplier directly. + The user definitely wants to access Supplier directly. So we have a component, ComposerImpl, that needs a Supplier. Had this been straight Java, we would expect to do something like this: ... SupplierImpl supplier = new SupplierImpl(); ComposerImpl composer = new ComposerImpl(supplier); supplier.someMethod(); composer.someMethod(); ... So let's introduce an ObjectFactory class for construction: ... Supplier supplier = (Supplier) ObjectFactory.newInstance( SupplierImpl.class ); // Pass the supplier in with role "supplier" Composer composer = (Composer) ObjectFactory.newInstance( ComposerImpl.class, new Role[]{ new Role("supplier", supplier) } ); supplier.someMethod(); composer.someMethod(); ... But now we have a problem. Even though we do give ComposerImpl a Supplier with the correct role name, we have forgotten that ComposerImpl may do *several* lookups on "supplier", and that SupplierImpl may not be reusable. As it looks now, ComposerImpl will get the same instance of SupplierImpl all the time, and that may not work. So let's introduce a ObjectFactoryFactory. Give it a component implementation class and it will produce a factory that you can use to create new components. Then we pass *that* one to ComposerImpl (hidden behind a ComponentManager interface) and we're done, right? ... ObjectFactory supplierFactory = ObjectFactoryFactory.newInstance( SupplierImpl.class ); // Pass the supplier in with role "supplier" Composer composer = ObjectFactoryFactory.newInstance( ComposerImpl.class, new Role[]{ new Role("supplier", supplierFactory) } ); supplier.someMethod(); // !!!!!!!!!!! This won't work anymore! composer.someMethod(); // !!!!!!!!!!! This won't work anymore! ... Guess not. The problem is that sometimes, we want to use the returned object as a factory (when it is used with Composable components) and sometimes we just want the "raw" component. The ideal would be something that exposes the interface of the component, but also exposed a factory interface. We would use the factory interface of a component when giving it to another component that is a composer, but use the ordinary interface otherwise. Solution: Dynamic proxies. When you do: Supplier supplier = (Supplier) ObjectFactory.newInstance( SupplierImpl.class ); we should give you back an object that implements all of SupplierImpl's interfaces, but also an ObjectFactory interface that we can use to create new instances of SupplierImpl. This ObjectFactory interface will be used when combining the supplier with the composer, and the user who wants to use the returned SupplierImpl via the Supplier interface can do so as well. The end result of this is in the code, and below I will do a short walkthrough. WALKTHROUGH Component Usage Below is the current demonstration class. It sets up a Supplier and a Composer using that Supplier, and then invokes methods on the Composer. public class MC { public static void main (String[] args) throws Exception { Supplier supplier = SupplierImpl.getInstance (); Composer comp = ComposerImpl.getInstance (supplier); comp.method(); MicroContainer.release (comp); MicroContainer.release (supplier); } } From top to bottom: + You notice that the Supplier is retrieved via a static method in the implementation class, and that the same goes for the Composer. These are just convenience methods, and I'll show them in just a moment. + The returned Composer instance is used just as you would expect to use it. + Note that you are required to release components. This can be done either by casting, or you can use a static method in MicroContainer that will do the job for you. Now, let's look at the SupplierImpl.getInstance() method: public static Supplier getInstance() { return (Supplier) new MicroContainer( SupplierImpl.class ) .sharedInstance( true ) .create(); } This command creates a new MicroContainer for SupplierImpl. It also specifies that SupplierImpl can be shared among several clients - this is, for example, when Composer does multiple lookups on it. In terms of the usage described in the case study above, the "factory" aspect of the returned object will return the same singleton instance all the time. Here is the corresponding instance for ComposerImpl: public static Composer getInstance( Supplier supplier ) { return (Composer) new MicroContainer( ComposerImpl.class ) .addComponent( Supplier.ROLE, supplier ) .sharedInstance( true ) .create(); } Similar, but note the addComponent() call - this sets up supplier as the component for the Supplier role. Also note that the getInstance method is type-safe: You must pass it a supplier. If MicroContainer had used generic ObjectFactories this would not have been possible. Impact on Component Developers Developers can, if they feel like it, add a getInstance method for use with MicroContainer. However, it is not needed. Impact on Component Users MicroContainer has no pooling of components, and provides no pluggability in itself. That is, when creating a container, you must specify the implementation class. These two tradeoffs were made since MicroContainer would otherwise grow and become something like Fortress or ECM - a bit more than originally envisioned. 1.1 jakarta-avalon-excalibur/microcontainer/examples/README.txt Index: README.txt =================================================================== This directory contains a number of examples for the component. They are; 1.1 jakarta-avalon-excalibur/microcontainer/src/java/org/apache/excalibur/microcontainer/Handler.java Index: Handler.java =================================================================== package org.apache.excalibur.microcontainer; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.util.Map; import org.apache.avalon.framework.activity.Disposable; import org.apache.avalon.framework.component.ComponentManager; import org.apache.avalon.framework.component.Composable; import org.apache.avalon.framework.configuration.Configuration; import org.apache.avalon.framework.configuration.Configurable; import org.apache.avalon.framework.context.Context; import org.apache.avalon.framework.context.Contextualizable; import org.apache.avalon.framework.logger.Logger; import org.apache.avalon.framework.logger.LogEnabled; /** * InvocationHandler for MicroContainerProxies. */ class Handler implements InvocationHandler, MicroContainerProxy { /** * The instance of the component that the client accesses vis this proxy's * component interface. */ private Object instance; /** * The manager for the component. */ private final ComponentManager manager; /** * The context of the component. */ private final Context context; /** * The component's configuration. */ private final Configuration configuration; /** * The class of the component. */ private final Class componentClass; private final Logger logger; /** * Flag indicating whether the component instance can be shared when the * proxy works as a factory for components. */ private final boolean shared; public Handler (Class componentClass, Logger logger, Map components, Configuration configuration, Context context, boolean shared) { this.componentClass = componentClass; this.manager = new MicroContainerComponentManager( components ); this.shared = shared; this.context = context; this.configuration = configuration; this.logger = logger; this.instance = newInstance (); } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if (method.getDeclaringClass() == MicroContainerProxy.class) { return method.invoke( this, args ); } return method.invoke( instance, args ); } public Object newInstance () { try { Object inst = componentClass.newInstance(); if (inst instanceof LogEnabled) { ((LogEnabled) inst).enableLogging( logger ); } if (inst instanceof Contextualizable) { ((Contextualizable) inst).contextualize( context ); } if (inst instanceof Configurable) { ((Configurable) inst).configure( configuration ); } if (inst instanceof Composable) { ((Composable) inst).compose( manager ); } return inst; } catch( Exception e ) { throw new MicroContainerException( e ); } } public synchronized Object MicroContainerProxy__newInstance () { if ( shared ) { return instance; } else { return newInstance(); } } public synchronized void MicroContainerProxy__releaseInstance(Object o) { if ( !shared ) { if (o instanceof Disposable) { ((Disposable) o).dispose (); } } } public void MicroContainerProxy__release() { if (instance instanceof Disposable) { ((Disposable) instance).dispose (); } } } 1.1 jakarta-avalon-excalibur/microcontainer/src/java/org/apache/excalibur/microcontainer/MicroContainer.java Index: MicroContainer.java =================================================================== package org.apache.excalibur.microcontainer; import org.apache.avalon.framework.configuration.DefaultConfiguration; import org.apache.avalon.framework.configuration.Configuration; import org.apache.avalon.framework.context.DefaultContext; import org.apache.avalon.framework.context.Context; import org.apache.avalon.framework.logger.NullLogger; import org.apache.avalon.framework.logger.Logger; import java.lang.reflect.Proxy; import java.util.HashMap; import java.util.Iterator; import java.util.Map; /** * Factory class for MicroContainers. Usage follows the named parameter idiom: * <pre><code> * Component myComponent = (Component) new MicroContainer( ComponentImpl.class )<br/> * .sharedInstance( true )<br/> * .components( componentMap )<br/> * .create(); * </code></pre> */ public class MicroContainer { private static Logger defaultLogger = new NullLogger (); private boolean sharedInstance = true; private Map components = new HashMap (); private final Class implementation; private Configuration config = null; private Map configMap = new HashMap (); private Context context = null; private Map contextMap = new HashMap (); private Logger logger = defaultLogger; /** * Begin creation of a new MicroContainerProxy for the given component class. * Note that you are not interested in this class, but the object you get when * calling <code>create()</code>. */ public MicroContainer( Class implementation ) { this.implementation = implementation; } /** * Specifies whether the container should serve up the same instance to * all composers requesting an instance. If the component is thread safe, * you can set this to true. The default is <code>true</code>. */ public MicroContainer sharedInstance( boolean shared ) { this.sharedInstance = shared; return this; } /** * Populates the ComponentManager for the component class. * Each entry in the <code>components</code> map is assumed to be a * mapping from String to MicroContainerProxies, obtained via this class. */ public MicroContainer components( Map components ) { this.components = components; return this; } public MicroContainer addComponent( String role, Object component ) { components.put( role, component ); return this; } public MicroContainer addContextEntry( String key, Object entry ) { if( context != null ) { throw new IllegalStateException( "You can not add context entries " + "if you have set a context using the context(Context) method."); } contextMap.put( key, entry ); return this; } public MicroContainer context( Context context ) { if( contextMap.size() > 0 ) { throw new IllegalStateException( "You can not set the context " + "if you have added context entries using the addContextEntry(String,Object) method."); } this.context = context; return this; } public MicroContainer addConfigurationAttribute( String key, String value ) { if( config != null ) { throw new IllegalStateException( "You can not add configuration " + "attributes if you have set a configuration using the " + "configuration(Configuration) method."); } configMap.put( key, value ); return this; } public MicroContainer confinguration( Configuration config ) { if( configMap.size() > 0 ) { throw new IllegalStateException( "You can not set the configuration " + "if you have added configuration attributes using the " + "addConfigurationAttribute(String,String) method."); } this.config = config; return this; } public MicroContainer logger( Logger logger ) { this.logger = logger; return this; } /** * Creates a new MicroContainer proxy. The returned object implements all interfaces * of the implementation class. */ public MicroContainerProxy create() throws MicroContainerException { try { Class[] implementationInterfaces = implementation.getInterfaces (); Class[] proxyInterfaces = new Class[implementationInterfaces.length + 1]; for (int i = 0; i < implementationInterfaces.length; i++) { proxyInterfaces[i + 1] = implementationInterfaces[i]; } if( context == null ) { context = new DefaultContext( contextMap ); } if( config == null ) { DefaultConfiguration defaultConfig = new DefaultConfiguration( "", "" ); Iterator iter = configMap.keySet().iterator(); while( iter.hasNext() ) { String key = (String) iter.next(); String value = (String) configMap.get( key ); defaultConfig.setAttribute( key, value ); } config = defaultConfig; } proxyInterfaces[0] = MicroContainerProxy.class; return (MicroContainerProxy) Proxy.newProxyInstance( Thread.currentThread().getContextClassLoader(), proxyInterfaces, new Handler (implementation, logger, components, config, context, sharedInstance) ); } catch (Exception e) { throw new MicroContainerException( e ); } } public static void setDefaultLogger( Logger logger ) { defaultLogger = logger; } /** * Disposes of a MicroContainer proxy. */ public static void release(Object o) { if (o instanceof MicroContainerProxy) { ((MicroContainerProxy) o).MicroContainerProxy__release(); } } } 1.1 jakarta-avalon-excalibur/microcontainer/src/java/org/apache/excalibur/microcontainer/MicroContainerComponentManager.java Index: MicroContainerComponentManager.java =================================================================== package org.apache.excalibur.microcontainer; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import org.apache.avalon.framework.component.Component; import org.apache.avalon.framework.component.ComponentManager; /** * An implementation of the ComponentManager interface for * MicroContainers. */ class MicroContainerComponentManager implements ComponentManager { private final HashMap handlers = new HashMap (); private final HashMap used = new HashMap (); public MicroContainerComponentManager( Map components ) { Iterator iter = components.keySet().iterator(); while (iter.hasNext ()) { String role = (String) iter.next (); Object component = components.get (role); // Verify that component is a MicroContainerProxy... handlers.put (role, component); } } public boolean hasComponent( String role ) { return handlers.containsKey( role ); } public synchronized Component lookup( String role ) { MicroContainerProxy handler = (MicroContainerProxy) handlers.get( role ); Component component = (Component) handler.MicroContainerProxy__newInstance(); used.put( component, handler ); return component; } public synchronized void release( Component instance ) { MicroContainerProxy handler = (MicroContainerProxy) used.remove( instance ); handler.MicroContainerProxy__releaseInstance( instance ); } } 1.1 jakarta-avalon-excalibur/microcontainer/src/java/org/apache/excalibur/microcontainer/MicroContainerException.java Index: MicroContainerException.java =================================================================== package org.apache.excalibur.microcontainer; import java.io.PrintStream; import java.io.PrintWriter; import org.apache.avalon.framework.CascadingRuntimeException; /** * Exception indicating a failure between the MicroContainer and its component. */ public class MicroContainerException extends CascadingRuntimeException { /** * Construct a new <code>MicroContainerException</code> instance. * * @param message The detail message for this exception. * @param throwable the root cause of the exception */ public MicroContainerException( final String message, final Throwable throwable ) { super( message, throwable ); } /** * Construct a new <code>MicroContainerException</code> instance. * * @param message The detail message for this exception. */ public MicroContainerException( final String message ) { super( message, null ); } /** * Construct a new <code>MicroContainerException</code> instance. * * @param throwable the root cause of the exception */ public MicroContainerException( final Throwable throwable ) { super( throwable.toString(), throwable ); } public void printStackTrace() { printStackTrace( System.err ); } public void printStackTrace(PrintStream s) { super.printStackTrace(s); if( getCause() != null ) { getCause().printStackTrace(s); } } public void printStackTrace(PrintWriter s) { super.printStackTrace(s); if( getCause() != null ) { getCause().printStackTrace(s); } } public String toString() { if( getCause() != null ) { return super.toString() + "(" + getCause().toString() + ")"; } else { return super.toString(); } } } 1.1 jakarta-avalon-excalibur/microcontainer/src/java/org/apache/excalibur/microcontainer/MicroContainerProxy.java Index: MicroContainerProxy.java =================================================================== package org.apache.excalibur.microcontainer; /** * The "factory" interface for proxies. The method names have been * chose so as to not conflict with any known interface. */ public interface MicroContainerProxy { /** * Create a new instance of the managed component. */ public Object MicroContainerProxy__newInstance(); /** * Release the active instance of the component. */ public void MicroContainerProxy__release(); /** * Release an instance created via MicroContainerProxy__newInstance(). */ public void MicroContainerProxy__releaseInstance(Object instance); } 1.1 jakarta-avalon-excalibur/microcontainer/src/test/org/apache/excalibur/microcontainer/test/Composer.java Index: Composer.java =================================================================== package org.apache.excalibur.microcontainer.test; import org.apache.avalon.framework.component.Component; public interface Composer extends Component { public static final String ROLE = Composer.class.getName(); public void method(); public boolean success(); } 1.1 jakarta-avalon-excalibur/microcontainer/src/test/org/apache/excalibur/microcontainer/test/ComposerImpl.java Index: ComposerImpl.java =================================================================== package org.apache.excalibur.microcontainer.test; import java.util.HashMap; import java.util.Map; import org.apache.avalon.framework.activity.Disposable; import org.apache.avalon.framework.component.ComponentException; import org.apache.avalon.framework.component.ComponentManager; import org.apache.avalon.framework.component.Composable; import org.apache.excalibur.microcontainer.MicroContainer; public class ComposerImpl implements Composer, Composable, Disposable { private ComponentManager manager; private boolean success = false; public void compose( ComponentManager manager ) { this.manager = manager; } public void dispose() { } public void method() { Supplier supplier = null; try { supplier = (Supplier) manager.lookup( Supplier.ROLE ); supplier.supplierMethod (); success = true; } catch (Exception ce) { // Ignore for clarity's sake. ce.printStackTrace(); } finally { manager.release(supplier); } } /** * Helper method to compose MicroContainers. */ public static Composer getInstance( Supplier supplier ) { return (Composer) new MicroContainer( ComposerImpl.class ) .addComponent( Supplier.ROLE, supplier ) .sharedInstance( true ) .create(); } public boolean success() { return success; } } 1.1 jakarta-avalon-excalibur/microcontainer/src/test/org/apache/excalibur/microcontainer/test/ComposerTestCase.java Index: ComposerTestCase.java =================================================================== package org.apache.excalibur.microcontainer.test; import junit.framework.TestCase; import org.apache.excalibur.microcontainer.MicroContainer; public class ComposerTestCase extends TestCase { public ComposerTestCase(String name) { super(name); } public void testComposerImpl() throws Exception { Supplier supplier = SupplierImpl.getInstance (); Composer comp = ComposerImpl.getInstance (supplier); comp.method(); assertTrue( comp.success() ); MicroContainer.release (comp); MicroContainer.release (supplier); } } 1.1 jakarta-avalon-excalibur/microcontainer/src/test/org/apache/excalibur/microcontainer/test/Supplier.java Index: Supplier.java =================================================================== package org.apache.excalibur.microcontainer.test; import org.apache.avalon.framework.component.Component; public interface Supplier extends Component { public static final String ROLE = Supplier.class.getName(); public void supplierMethod (); } 1.1 jakarta-avalon-excalibur/microcontainer/src/test/org/apache/excalibur/microcontainer/test/SupplierImpl.java Index: SupplierImpl.java =================================================================== package org.apache.excalibur.microcontainer.test; import java.util.HashMap; import java.util.Map; import org.apache.avalon.framework.activity.Disposable; import org.apache.excalibur.microcontainer.MicroContainer; public class SupplierImpl implements Supplier, Disposable { public void supplierMethod() { System.out.println( "In " + SupplierImpl.class.getName() + ".supplierMethod()" ); } public void dispose() { System.out.println( "In " + SupplierImpl.class.getName() + ".dispose()" ); } public static Supplier getInstance() { return (Supplier) new MicroContainer( SupplierImpl.class ).sharedInstance( true ).create(); } } 1.1 jakarta-avalon-excalibur/microcontainer/src/xdocs/book.xml Index: book.xml =================================================================== <?xml version="1.0"?> <book software="Excalibur ???" title="Avalon Excalibur Documentation - ???" copyright="@year@ The Apache Software Foundation"> <project label="Back to Avalon" href="@AVALON_BASE@" /> <project label="Back to Excalibur" href="../index.html" /> <menu label="About"> <menu-item label="Overview" href="index.html"/> <menu-item type="external" id="ExcaliburHome" label="Excalibur Home" href="http://jakarta.apache.org/avalon/excalibur/index.html"/> <menu-item type="external" id="downloads" label="Download" href="http://jakarta.apache.org/builds/jakarta-avalon-excalibur/release"/> <menu-item type="external" id="api-docs" label="API Docs" href="api/index.html"/> </menu> </book> 1.1 jakarta-avalon-excalibur/microcontainer/src/xdocs/index.xml Index: index.xml =================================================================== <?xml version="1.0"?> <document> <header> <title>Excalibur ??? - Overview</title> <authors> <person name="????" email="???"/> </authors> </header> <body> <s1 title="Introduction"> <p> Blah Blah </p> </s1> </body> <footer> <legal> Copyright (c) @year@ The Jakarta Apache Project All rights reserved. $Revision: 1.1 $ $Date: 2002/06/24 20:53:46 $ </legal> </footer> </document> 1.1 jakarta-avalon-excalibur/microcontainer/src/xdocs/microcontainer.uris Index: microcontainer.uris =================================================================== index.html images/add.jpg images/fix.jpg images/remove.jpg images/update.jpg images/header.gif images/jakarta-logo.gif 1.1 jakarta-avalon-excalibur/microcontainer/src/xdocs/dtd/changes-v10.dtd Index: changes-v10.dtd =================================================================== <!-- =================================================================== Apache Changes DTD (Version 1.0) PURPOSE: This DTD was developed to create a simple yet powerful document type for software development changes for use with the Apache projects. It is an XML-compliant DTD and it's maintained by the Apache XML project. TYPICAL INVOCATION: <!DOCTYPE document PUBLIC "-//APACHE//DTD Changes Vx.yz//EN" "http://xml.apache.org/DTD/changes-vxyz.dtd"> where x := major version y := minor version z := status identifier (optional) NOTES: It is important, expecially in open developped software projects, to keep track of software changes both to give users indications of bugs that might have been resolved, as well, and not less important, to provide credits for the support given to the project. It is considered vital to provide adequate payback using recognition and credits to let users and developers feel part of the community, thus increasing development power. AUTHORS: Stefano Mazzocchi <[EMAIL PROTECTED]> FIXME: CHANGE HISTORY: 19991129 Initial version. (SM) 20000316 Added bugfixing attribute. (SM) COPYRIGHT: Copyright (c) @year@ The Apache Software Foundation. Permission to copy in any form is granted provided this notice is included in all copies. Permission to redistribute is granted provided this file is distributed untouched in all its parts and included files. ==================================================================== --> <!-- =============================================================== --> <!-- Extend the Documentation DTD --> <!-- =============================================================== --> <!-- FIXME (SM): this is hardcoding. Find a better way of doing this possibly using public identifiers --> <!ENTITY % document-dtd SYSTEM "document-v10.dtd"> %document-dtd; <!-- =============================================================== --> <!-- Common entities --> <!-- =============================================================== --> <!ENTITY % types "add|remove|update|fix"> <!-- =============================================================== --> <!-- Document Type Definition --> <!-- =============================================================== --> <!ELEMENT changes (devs, release*)> <!ATTLIST changes %common.att; %title.att;> <!ELEMENT devs (person+)> <!ATTLIST devs %common.att;> <!ELEMENT release (action+)> <!ATTLIST release %common.att; version CDATA #REQUIRED date CDATA #REQUIRED> <!ELEMENT action (%content.mix;)*> <!ATTLIST action %common.att; dev IDREF #REQUIRED type (%types;) #IMPLIED due-to CDATA #IMPLIED due-to-email CDATA #IMPLIED fixes-bug CDATA #IMPLIED> <!-- =============================================================== --> <!-- End of DTD --> <!-- =============================================================== --> 1.1 jakarta-avalon-excalibur/microcontainer/src/xdocs/dtd/characters.ent Index: characters.ent =================================================================== <!-- Portions (C) International Organization for Standardization 1986 Permission to copy in any form is granted for use with conforming SGML systems and applications as defined in ISO 8879, provided this notice is included in all copies. --> <!-- Character entity set. --> <!-- Latin A --> <!ENTITY nbsp " "> <!-- U+00A0 ISOnum - no-break space = non-breaking space --> <!ENTITY iexcl "¡"> <!-- U+00A1 ISOnum - inverted exclamation mark --> <!ENTITY cent "¢"> <!-- U+00A2 ISOnum - cent sign --> <!ENTITY pound "£"> <!-- U+00A3 ISOnum - pound sign --> <!ENTITY curren "¤"> <!-- U+00A4 ISOnum - currency sign --> <!ENTITY yen "¥"> <!-- U+00A5 ISOnum - yen sign = yuan sign --> <!ENTITY brvbar "¦"> <!-- U+00A6 ISOnum - broken bar = broken vertical bar --> <!ENTITY sect "§"> <!-- U+00A7 ISOnum - section sign --> <!ENTITY uml "¨"> <!-- U+00A8 ISOdia - diaeresis = spacing diaeresis --> <!ENTITY copy "©"> <!-- U+00A9 ISOnum - copyright sign --> <!ENTITY ordf "ª"> <!-- U+00AA ISOnum - feminine ordinal indicator --> <!ENTITY laquo "«"> <!-- U+00AB ISOnum - left-pointing double angle quotation mark = left pointing guillemet --> <!ENTITY not "¬"> <!-- U+00AC ISOnum - not sign --> <!ENTITY shy "­"> <!-- U+00AD ISOnum - soft hyphen = discretionary hyphen --> <!ENTITY reg "®"> <!-- U+00AE ISOnum - registered sign = registered trade mark sign --> <!ENTITY macr "¯"> <!-- U+00AF ISOdia - macron = spacing macron = overline = APL overbar --> <!ENTITY deg "°"> <!-- U+00B0 ISOnum - degree sign --> <!ENTITY plusmn "±"> <!-- U+00B1 ISOnum - plus-minus sign = plus-or-minus sign --> <!ENTITY sup2 "²"> <!-- U+00B2 ISOnum - superscript two = superscript digit two = squared --> <!ENTITY sup3 "³"> <!-- U+00B3 ISOnum - superscript three = superscript digit three = cubed --> <!ENTITY acute "´"> <!-- U+00B4 ISOdia - acute accent = spacing acute --> <!ENTITY micro "µ"> <!-- U+00B5 ISOnum - micro sign --> <!ENTITY para "¶"> <!-- U+00B6 ISOnum - pilcrow sign = paragraph sign --> <!ENTITY middot "·"> <!-- U+00B7 ISOnum - middle dot = Georgian comma = Greek middle dot --> <!ENTITY cedil "¸"> <!-- U+00B8 ISOdia - cedilla = spacing cedilla --> <!ENTITY sup1 "¹"> <!-- U+00B9 ISOnum - superscript one = superscript digit one --> <!ENTITY ordm "º"> <!-- U+00BA ISOnum - masculine ordinal indicator --> <!ENTITY raquo "»"> <!-- U+00BB ISOnum - right-pointing double angle quotation mark = right pointing guillemet --> <!ENTITY frac14 "¼"> <!-- U+00BC ISOnum - vulgar fraction one quarter = fraction one quarter --> <!ENTITY frac12 "½"> <!-- U+00BD ISOnum - vulgar fraction one half = fraction one half --> <!ENTITY frac34 "¾"> <!-- U+00BE ISOnum - vulgar fraction three quarters = fraction three quarters --> <!ENTITY iquest "¿"> <!-- U+00BF ISOnum - inverted question mark = turned question mark --> <!ENTITY Agrave "À"> <!-- U+00C0 ISOlat1 - latin capital letter A with grave = latin capital letter A grave --> <!ENTITY Aacute "Á"> <!-- U+00C1 ISOlat1 - latin capital letter A with acute --> <!ENTITY Acirc "Â"> <!-- U+00C2 ISOlat1 - latin capital letter A with circumflex --> <!ENTITY Atilde "Ã"> <!-- U+00C3 ISOlat1 - latin capital letter A with tilde --> <!ENTITY Auml "Ä"> <!-- U+00C4 ISOlat1 - latin capital letter A with diaeresis --> <!ENTITY Aring "Å"> <!-- U+00C5 ISOlat1 - latin capital letter A with ring above = latin capital letter A ring --> <!ENTITY AElig "Æ"> <!-- U+00C6 ISOlat1 - latin capital letter AE = latin capital ligature AE --> <!ENTITY Ccedil "Ç"> <!-- U+00C7 ISOlat1 - latin capital letter C with cedilla --> <!ENTITY Egrave "È"> <!-- U+00C8 ISOlat1 - latin capital letter E with grave --> <!ENTITY Eacute "É"> <!-- U+00C9 ISOlat1 - latin capital letter E with acute --> <!ENTITY Ecirc "Ê"> <!-- U+00CA ISOlat1 - latin capital letter E with circumflex --> <!ENTITY Euml "Ë"> <!-- U+00CB ISOlat1 - latin capital letter E with diaeresis --> <!ENTITY Igrave "Ì"> <!-- U+00CC ISOlat1 - latin capital letter I with grave --> <!ENTITY Iacute "Í"> <!-- U+00CD ISOlat1 - latin capital letter I with acute --> <!ENTITY Icirc "Î"> <!-- U+00CE ISOlat1 - latin capital letter I with circumflex --> <!ENTITY Iuml "Ï"> <!-- U+00CF ISOlat1 - latin capital letter I with diaeresis --> <!ENTITY ETH "Ð"> <!-- U+00D0 ISOlat1 - latin capital letter ETH --> <!ENTITY Ntilde "Ñ"> <!-- U+00D1 ISOlat1 - latin capital letter N with tilde --> <!ENTITY Ograve "Ò"> <!-- U+00D2 ISOlat1 - latin capital letter O with grave --> <!ENTITY Oacute "Ó"> <!-- U+00D3 ISOlat1 - latin capital letter O with acute --> <!ENTITY Ocirc "Ô"> <!-- U+00D4 ISOlat1 - latin capital letter O with circumflex --> <!ENTITY Otilde "Õ"> <!-- U+00D5 ISOlat1 - latin capital letter O with tilde --> <!ENTITY Ouml "Ö"> <!-- U+00D6 ISOlat1 - latin capital letter O with diaeresis --> <!ENTITY times "×"> <!-- U+00D7 ISOnum - multiplication sign --> <!ENTITY Oslash "Ø"> <!-- U+00D8 ISOlat1 - latin capital letter O with stroke = latin capital letter O slash --> <!ENTITY Ugrave "Ù"> <!-- U+00D9 ISOlat1 - latin capital letter U with grave --> <!ENTITY Uacute "Ú"> <!-- U+00DA ISOlat1 - latin capital letter U with acute --> <!ENTITY Ucirc "Û"> <!-- U+00DB ISOlat1 - latin capital letter U with circumflex --> <!ENTITY Uuml "Ü"> <!-- U+00DC ISOlat1 - latin capital letter U with diaeresis --> <!ENTITY Yacute "Ý"> <!-- U+00DD ISOlat1 - latin capital letter Y with acute --> <!ENTITY THORN "Þ"> <!-- U+00DE ISOlat1 - latin capital letter THORN --> <!ENTITY szlig "ß"> <!-- U+00DF ISOlat1 - latin small letter sharp s = ess-zed --> <!ENTITY agrave "à"> <!-- U+00E0 ISOlat1 - latin small letter a with grave = latin small letter a grave --> <!ENTITY aacute "á"> <!-- U+00E1 ISOlat1 - latin small letter a with acute --> <!ENTITY acirc "â"> <!-- U+00E2 ISOlat1 - latin small letter a with circumflex --> <!ENTITY atilde "ã"> <!-- U+00E3 ISOlat1 - latin small letter a with tilde --> <!ENTITY auml "ä"> <!-- U+00E4 ISOlat1 - latin small letter a with diaeresis --> <!ENTITY aring "å"> <!-- U+00E5 ISOlat1 - latin small letter a with ring above = latin small letter a ring --> <!ENTITY aelig "æ"> <!-- U+00E6 ISOlat1 - latin small letter ae = latin small ligature ae --> <!ENTITY ccedil "ç"> <!-- U+00E7 ISOlat1 - latin small letter c with cedilla --> <!ENTITY egrave "è"> <!-- U+00E8 ISOlat1 - latin small letter e with grave --> <!ENTITY eacute "é"> <!-- U+00E9 ISOlat1 - latin small letter e with acute --> <!ENTITY ecirc "ê"> <!-- U+00EA ISOlat1 - latin small letter e with circumflex --> <!ENTITY euml "ë"> <!-- U+00EB ISOlat1 - latin small letter e with diaeresis --> <!ENTITY igrave "ì"> <!-- U+00EC ISOlat1 - latin small letter i with grave --> <!ENTITY iacute "í"> <!-- U+00ED ISOlat1 - latin small letter i with acute --> <!ENTITY icirc "î"> <!-- U+00EE ISOlat1 - latin small letter i with circumflex --> <!ENTITY iuml "ï"> <!-- U+00EF ISOlat1 - latin small letter i with diaeresis --> <!ENTITY eth "ð"> <!-- U+00F0 ISOlat1 - latin small letter eth --> <!ENTITY ntilde "ñ"> <!-- U+00F1 ISOlat1 - latin small letter n with tilde --> <!ENTITY ograve "ò"> <!-- U+00F2 ISOlat1 - latin small letter o with grave --> <!ENTITY oacute "ó"> <!-- U+00F3 ISOlat1 - latin small letter o with acute --> <!ENTITY ocirc "ô"> <!-- U+00F4 ISOlat1 - latin small letter o with circumflex --> <!ENTITY otilde "õ"> <!-- U+00F5 ISOlat1 - latin small letter o with tilde --> <!ENTITY ouml "ö"> <!-- U+00F6 ISOlat1 - latin small letter o with diaeresis --> <!ENTITY divide "÷"> <!-- U+00F7 ISOnum - division sign --> <!ENTITY oslash "ø"> <!-- U+00F8 ISOlat1 - latin small letter o with stroke = latin small letter o slash --> <!ENTITY ugrave "ù"> <!-- U+00F9 ISOlat1 - latin small letter u with grave --> <!ENTITY uacute "ú"> <!-- U+00FA ISOlat1 - latin small letter u with acute --> <!ENTITY ucirc "û"> <!-- U+00FB ISOlat1 - latin small letter u with circumflex --> <!ENTITY uuml "ü"> <!-- U+00FC ISOlat1 - latin small letter u with diaeresis --> <!ENTITY yacute "ý"> <!-- U+00FD ISOlat1 - latin small letter y with acute --> <!ENTITY thorn "þ"> <!-- U+00FE ISOlat1 - latin small letter thorn --> <!ENTITY yuml "ÿ"> <!-- U+00FF ISOlat1 - latin small letter y with diaeresis --> <!-- Latin Extended-A --> <!ENTITY OElig "Œ"> <!-- U+0152 ISOlat2 - latin capital ligature OE --> <!ENTITY oelig "œ"> <!-- U+0153 ISOlat2 - latin small ligature oe --> <!-- ligature is a misnomer, this is a separate character in some languages --> <!ENTITY Scaron "Š"> <!-- U+0160 ISOlat2 - latin capital letter S with caron --> <!ENTITY scaron "š"> <!-- U+0161 ISOlat2 - latin small letter s with caron --> <!ENTITY Yuml "Ÿ"> <!-- U+0178 ISOlat2 - latin capital letter Y with diaeresis --> <!-- Spacing Modifier Letters --> <!ENTITY circ "ˆ"> <!-- U+02C6 ISOpub - modifier letter circumflex accent --> <!ENTITY tilde "˜"> <!-- U+02DC ISOdia - small tilde --> <!-- General Punctuation --> <!ENTITY ensp " "> <!-- U+2002 ISOpub - en space --> <!ENTITY emsp " "> <!-- U+2003 ISOpub - em space --> <!ENTITY thinsp " "> <!-- U+2009 ISOpub - thin space --> <!ENTITY zwnj "‌"> <!-- U+200C RFC 2070 - zero width non-joiner --> <!ENTITY zwj "‍"> <!-- U+200D RFC 2070 - zero width joiner --> <!ENTITY lrm "‎"> <!-- U+200E RFC 2070 - left-to-right mark --> <!ENTITY rlm "‏"> <!-- U+200F RFC 2070 - right-to-left mark --> <!ENTITY ndash "–"> <!-- U+2013 ISOpub - en dash --> <!ENTITY mdash "—"> <!-- U+2014 ISOpub - em dash --> <!ENTITY lsquo "‘"> <!-- U+2018 ISOnum - left single quotation mark --> <!ENTITY rsquo "’"> <!-- U+2019 ISOnum - right single quotation mark --> <!ENTITY sbquo "‚"> <!-- U+201A NEW - single low-9 quotation mark --> <!ENTITY ldquo "“"> <!-- U+201C ISOnum - left double quotation mark --> <!ENTITY rdquo "”"> <!-- U+201D ISOnum - right double quotation mark, --> <!ENTITY bdquo "„"> <!-- U+201E NEW - double low-9 quotation mark --> <!ENTITY dagger "†"> <!-- U+2020 ISOpub - dagger --> <!ENTITY Dagger "‡"> <!-- U+2021 ISOpub - double dagger --> <!ENTITY permil "‰"> <!-- U+2030 ISOtech - per mille sign --> <!ENTITY lsaquo "‹"> <!-- U+2039 ISO prop. - single left-pointing angle quotation mark --> <!-- lsaquo is proposed but not yet ISO standardized --> <!ENTITY rsaquo "›"> <!-- U+203A ISO prop. - single right-pointing angle quotation mark --> <!-- rsaquo is proposed but not yet ISO standardized --> <!ENTITY euro "€"> <!-- U+20AC NEW - euro sign --> <!-- Latin Extended-B --> <!ENTITY fnof "ƒ"> <!-- U+0192 ISOtech - latin small f with hook = function = florin --> <!-- Greek --> <!ENTITY Alpha "Α"> <!-- U+0391 - greek capital letter alpha --> <!ENTITY Beta "Β"> <!-- U+0392 - greek capital letter beta --> <!ENTITY Gamma "Γ"> <!-- U+0393 ISOgrk3 - greek capital letter gamma --> <!ENTITY Delta "Δ"> <!-- U+0394 ISOgrk3 - greek capital letter delta --> <!ENTITY Epsilon "Ε"> <!-- U+0395 - greek capital letter epsilon --> <!ENTITY Zeta "Ζ"> <!-- U+0396 - greek capital letter zeta --> <!ENTITY Eta "Η"> <!-- U+0397 - greek capital letter eta --> <!ENTITY Theta "Θ"> <!-- U+0398 ISOgrk3 - greek capital letter theta --> <!ENTITY Iota "Ι"> <!-- U+0399 - greek capital letter iota --> <!ENTITY Kappa "Κ"> <!-- U+039A - greek capital letter kappa --> <!ENTITY Lambda "Λ"> <!-- U+039B ISOgrk3 - greek capital letter lambda --> <!ENTITY Mu "Μ"> <!-- U+039C - greek capital letter mu --> <!ENTITY Nu "Ν"> <!-- U+039D - greek capital letter nu --> <!ENTITY Xi "Ξ"> <!-- U+039E ISOgrk3 - greek capital letter xi --> <!ENTITY Omicron "Ο"> <!-- U+039F - greek capital letter omicron --> <!ENTITY Pi "Π"> <!-- U+03A0 ISOgrk3 - greek capital letter pi --> <!ENTITY Rho "Ρ"> <!-- U+03A1 - greek capital letter rho --> <!ENTITY Sigma "Σ"> <!-- U+03A3 ISOgrk3 - greek capital letter sigma --> <!ENTITY Tau "Τ"> <!-- U+03A4 - greek capital letter tau --> <!ENTITY Upsilon "Υ"> <!-- U+03A5 ISOgrk3 - greek capital letter upsilon --> <!ENTITY Phi "Φ"> <!-- U+03A6 ISOgrk3 - greek capital letter phi --> <!ENTITY Chi "Χ"> <!-- U+03A7 - greek capital letter chi --> <!ENTITY Psi "Ψ"> <!-- U+03A8 ISOgrk3 - greek capital letter psi --> <!ENTITY Omega "Ω"> <!-- U+03A9 ISOgrk3 - greek capital letter omega --> <!ENTITY alpha "α"> <!-- U+03B1 ISOgrk3 - greek small letter alpha --> <!ENTITY beta "β"> <!-- U+03B2 ISOgrk3 - greek small letter beta --> <!ENTITY gamma "γ"> <!-- U+03B3 ISOgrk3 - greek small letter gamma --> <!ENTITY delta "δ"> <!-- U+03B4 ISOgrk3 - greek small letter delta --> <!ENTITY epsilon "ε"> <!-- U+03B5 ISOgrk3 - greek small letter epsilon --> <!ENTITY zeta "ζ"> <!-- U+03B6 ISOgrk3 - greek small letter zeta --> <!ENTITY eta "η"> <!-- U+03B7 ISOgrk3 - greek small letter eta --> <!ENTITY theta "θ"> <!-- U+03B8 ISOgrk3 - greek small letter theta --> <!ENTITY iota "ι"> <!-- U+03B9 ISOgrk3 - greek small letter iota --> <!ENTITY kappa "κ"> <!-- U+03BA ISOgrk3 - greek small letter kappa --> <!ENTITY lambda "λ"> <!-- U+03BB ISOgrk3 - greek small letter lambda --> <!ENTITY mu "μ"> <!-- U+03BC ISOgrk3 - greek small letter mu --> <!ENTITY nu "ν"> <!-- U+03BD ISOgrk3 - greek small letter nu --> <!ENTITY xi "ξ"> <!-- U+03BE ISOgrk3 - greek small letter xi --> <!ENTITY omicron "ο"> <!-- U+03BF NEW - greek small letter omicron --> <!ENTITY pi "π"> <!-- U+03C0 ISOgrk3 - greek small letter pi --> <!ENTITY rho "ρ"> <!-- U+03C1 ISOgrk3 - greek small letter rho --> <!ENTITY sigmaf "ς"> <!-- U+03C2 ISOgrk3 - greek small letter final sigma --> <!ENTITY sigma "σ"> <!-- U+03C3 ISOgrk3 - greek small letter sigma --> <!ENTITY tau "τ"> <!-- U+03C4 ISOgrk3 - greek small letter tau --> <!ENTITY upsilon "υ"> <!-- U+03C5 ISOgrk3 - greek small letter upsilon --> <!ENTITY phi "φ"> <!-- U+03C6 ISOgrk3 - greek small letter phi --> <!ENTITY chi "χ"> <!-- U+03C7 ISOgrk3 - greek small letter chi --> <!ENTITY psi "ψ"> <!-- U+03C8 ISOgrk3 - greek small letter psi --> <!ENTITY omega "ω"> <!-- U+03C9 ISOgrk3 - greek small letter omega --> <!ENTITY thetasym "ϑ"> <!-- U+03D1 NEW - greek small letter theta symbol --> <!ENTITY upsih "ϒ"> <!-- U+03D2 NEW - greek upsilon with hook symbol --> <!ENTITY piv "ϖ"> <!-- U+03D6 ISOgrk3 - greek pi symbol --> <!-- General Punctuation --> <!ENTITY bull "•"> <!-- U+2022 ISOpub - bullet = black small circle --> <!ENTITY hellip "…"> <!-- U+2026 ISOpub - horizontal ellipsis = three dot leader --> <!ENTITY prime "′"> <!-- U+2032 ISOtech - prime = minutes = feet --> <!ENTITY Prime "″"> <!-- U+2033 ISOtech - double prime = seconds = inches --> <!ENTITY oline "‾"> <!-- U+203E NEW - overline = spacing overscore --> <!ENTITY frasl "⁄"> <!-- U+2044 NEW - fraction slash --> <!-- Letterlike Symbols --> <!ENTITY weierp "℘"> <!-- U+2118 ISOamso - script capital P = power set = Weierstrass p --> <!ENTITY image "ℑ"> <!-- U+2111 ISOamso - blackletter capital I = imaginary part --> <!ENTITY real "ℜ"> <!-- U+211C ISOamso - blackletter capital R = real part symbol --> <!ENTITY trade "™"> <!-- U+2122 ISOnum - trade mark sign --> <!ENTITY alefsym "ℵ"> <!-- U+2135 NEW - alef symbol = first transfinite cardinal --> <!-- Arrows --> <!ENTITY larr "←"> <!-- U+2190 ISOnum - leftwards arrow --> <!ENTITY uarr "↑"> <!-- U+2191 ISOnum - upwards arrow --> <!ENTITY rarr "→"> <!-- U+2192 ISOnum - rightwards arrow --> <!ENTITY darr "↓"> <!-- U+2193 ISOnum - downwards arrow --> <!ENTITY harr "↔"> <!-- U+2194 ISOamsa - left right arrow --> <!ENTITY crarr "↵"> <!-- U+21B5 NEW - downwards arrow with corner leftwards = carriage return --> <!ENTITY lArr "⇐"> <!-- U+21D0 ISOtech - leftwards double arrow --> <!ENTITY uArr "⇑"> <!-- U+21D1 ISOamsa - upwards double arrow --> <!ENTITY rArr "⇒"> <!-- U+21D2 ISOtech - rightwards double arrow --> <!ENTITY dArr "⇓"> <!-- U+21D3 ISOamsa - downwards double arrow --> <!ENTITY hArr "⇔"> <!-- U+21D4 ISOamsa - left right double arrow --> <!-- Mathematical Operators --> <!ENTITY forall "∀"> <!-- U+2200 ISOtech - for all --> <!ENTITY part "∂"> <!-- U+2202 ISOtech - partial differential --> <!ENTITY exist "∃"> <!-- U+2203 ISOtech - there exists --> <!ENTITY empty "∅"> <!-- U+2205 ISOamso - empty set = null set = diameter --> <!ENTITY nabla "∇"> <!-- U+2207 ISOtech - nabla = backward difference --> <!ENTITY isin "∈"> <!-- U+2208 ISOtech - element of --> <!ENTITY notin "∉"> <!-- U+2209 ISOtech - not an element of --> <!ENTITY ni "∋"> <!-- U+220B ISOtech - contains as member --> <!ENTITY prod "∏"> <!-- U+220F ISOamsb - n-ary product = product sign --> <!ENTITY sum "∑"> <!-- U+2211 ISOamsb - n-ary sumation --> <!ENTITY minus "−"> <!-- U+2212 ISOtech - minus sign --> <!ENTITY lowast "∗"> <!-- U+2217 ISOtech - asterisk operator --> <!ENTITY radic "√"> <!-- U+221A ISOtech - square root = radical sign --> <!ENTITY prop "∝"> <!-- U+221D ISOtech - proportional to --> <!ENTITY infin "∞"> <!-- U+221E ISOtech - infinity --> <!ENTITY ang "∠"> <!-- U+2220 ISOamso - angle --> <!ENTITY and "∧"> <!-- U+2227 ISOtech - logical and = wedge --> <!ENTITY or "∨"> <!-- U+2228 ISOtech - logical or = vee --> <!ENTITY cap "∩"> <!-- U+2229 ISOtech - intersection = cap --> <!ENTITY cup "∪"> <!-- U+222A ISOtech - union = cup --> <!ENTITY int "∫"> <!-- U+222B ISOtech - integral --> <!ENTITY there4 "∴"> <!-- U+2234 ISOtech - therefore --> <!ENTITY sim "∼"> <!-- U+223C ISOtech - tilde operator = varies with = similar to --> <!ENTITY cong "≅"> <!-- U+2245 ISOtech - approximately equal to --> <!ENTITY asymp "≈"> <!-- U+2248 ISOamsr - almost equal to = asymptotic to --> <!ENTITY ne "≠"> <!-- U+2260 ISOtech - not equal to --> <!ENTITY equiv "≡"> <!-- U+2261 ISOtech - identical to --> <!ENTITY le "≤"> <!-- U+2264 ISOtech - less-than or equal to --> <!ENTITY ge "≥"> <!-- U+2265 ISOtech - greater-than or equal to --> <!ENTITY sub "⊂"> <!-- U+2282 ISOtech - subset of --> <!ENTITY sup "⊃"> <!-- U+2283 ISOtech - superset of --> <!ENTITY nsub "⊄"> <!-- U+2284 ISOamsn - not a subset of --> <!ENTITY sube "⊆"> <!-- U+2286 ISOtech - subset of or equal to --> <!ENTITY supe "⊇"> <!-- U+2287 ISOtech - superset of or equal to --> <!ENTITY oplus "⊕"> <!-- U+2295 ISOamsb - circled plus = direct sum --> <!ENTITY otimes "⊗"> <!-- U+2297 ISOamsb - circled times = vector product --> <!ENTITY perp "⊥"> <!-- U+22A5 ISOtech - up tack = orthogonal to = perpendicular --> <!ENTITY sdot "⋅"> <!-- U+22C5 ISOamsb - dot operator --> <!-- Miscellaneous Technical --> <!ENTITY lceil "⌈"> <!-- U+2308 ISOamsc - left ceiling = apl upstile --> <!ENTITY rceil "⌉"> <!-- U+2309 ISOamsc - right ceiling --> <!ENTITY lfloor "⌊"> <!-- U+230A ISOamsc - left floor = apl downstile --> <!ENTITY rfloor "⌋"> <!-- U+230B ISOamsc - right floor --> <!ENTITY lang "〈"> <!-- U+2329 ISOtech - left-pointing angle bracket = bra --> <!ENTITY rang "〉"> <!-- U+232A ISOtech - right-pointing angle bracket = ket --> <!-- Geometric Shapes --> <!ENTITY loz "◊"> <!-- U+25CA ISOpub - lozenge --> <!-- Miscellaneous Symbols --> <!ENTITY spades "♠"> <!-- U+2660 ISOpub - black spade suit --> <!ENTITY clubs "♣"> <!-- U+2663 ISOpub - black club suit = shamrock --> <!ENTITY hearts "♥"> <!-- U+2665 ISOpub - black heart suit = valentine --> <!ENTITY diams "♦"> <!-- U+2666 ISOpub - black diamond suit --> 1.1 jakarta-avalon-excalibur/microcontainer/src/xdocs/dtd/document-v10.dtd Index: document-v10.dtd =================================================================== <!-- =================================================================== Apache Documentation DTD (Version 1.0) PURPOSE: This DTD was developed to create a simple yet powerful document type for software documentation for use with the Apache projects. It is an XML-compliant DTD and it's maintained by the Apache XML project. TYPICAL INVOCATION: <!DOCTYPE document PUBLIC "-//APACHE//DTD Documentation Vx.yz//EN" "http://xml.apache.org/DTD/document-vxyz.dtd"> where x := major version y := minor version z := status identifier (optional) NOTES: Many of the design patterns used in this DTD were take from the W3C XML Specification DTD edited by Eve Maler <[EMAIL PROTECTED]>. Where possible, great care has been used to reutilize HTML tag names to reduce learning efforts and to allow HTML editors to be used for complex authorings like tables and lists. AUTHORS: Stefano Mazzocchi <[EMAIL PROTECTED]> Berin Loritsch <[EMAIL PROTECTED]> FIXME: - how can we include char entities without hardwiring them? - should "form" tags be included? - should all style-free HTML 4.0 markup tags be included? - how do we handle the idea of "soft" xlinks? - should we add "soft" links to images? CHANGE HISTORY: 19991121 Initial version. (SM) 19991123 Replaced "res" with more standard "strong" for emphasis. (SM) 19991124 Added "fork" element for window forking behavior. (SM) 19991124 Added "img-inline" element to separate from "img". (SM) 19991129 Removed "affiliation" from "author". (SM) 19991129 Made "author" empty and moved "name|email" as attributes (SM) 19991215 Simplified table section (SM) 19991215 Changed "img-block" in more friendly "figure" (SM) 20000125 Added the "icon" image (SM) 20000126 Allowed "anchor" in all levels (SM) 20000404 Removed the "role" attribute from common-xxx.att (SM) 20000606 Allowed nested markup tags (SM) 20000911 Allowed link tags inside markup (BL) COPYRIGHT: Copyright (c) 1999-2000 The Apache Software Foundation. Permission to copy in any form is granted provided this notice is included in all copies. Permission to redistribute is granted provided this file is distributed untouched in all its parts and included files. ==================================================================== --> <!-- =============================================================== --> <!-- Common character entities (included from external file) --> <!-- =============================================================== --> <!-- FIXME (SM): this is hardcoding. Find a better way of doing this possibly using public identifiers of ISO latin char sets --> <!ENTITY % charEntity SYSTEM "characters.ent"> %charEntity; <!-- =============================================================== --> <!-- Userful entitieis for increased DTD readability --> <!-- =============================================================== --> <!ENTITY % text "#PCDATA"> <!-- =============================================================== --> <!-- Entities for general XML compliance --> <!-- =============================================================== --> <!-- Common attributes Every element has an ID attribute (sometimes required, but usually optional) for links. %common.att; is for common attributes where the ID is optional, and %common-idreq.att; is for common attributes where the ID is required. --> <!ENTITY % common.att 'id ID #IMPLIED xml:lang NMTOKEN #IMPLIED'> <!ENTITY % common-idreq.att 'id ID #REQUIRED xml:lang NMTOKEN #IMPLIED'> <!-- xml:space attribute =============================================== Indicates that the element contains white space that the formatter or other application should retain, as appropriate to its function. ==================================================================== --> <!ENTITY % xmlspace.att 'xml:space (default|preserve) #FIXED "preserve"'> <!-- def attribute ===================================================== Points to the element where the relevant definition can be found, using the IDREF mechanism. %def.att; is for optional def attributes, and %def-req.att; is for required def attributes. ==================================================================== --> <!ENTITY % def.att 'def IDREF #IMPLIED'> <!ENTITY % def-req.att 'def IDREF #REQUIRED'> <!-- ref attribute ===================================================== Points to the element where more information can be found, using the IDREF mechanism. %ref.att; is for optional ref attributes, and %ref-req.att; is for required ref attributes. ================================================================== --> <!ENTITY % ref.att 'ref IDREF #IMPLIED'> <!ENTITY % ref-req.att 'ref IDREF #REQUIRED'> <!-- =============================================================== --> <!-- Entities for XLink compliance --> <!-- =============================================================== --> <!ENTITY % xlink-simple.att 'type (simple|extended|locator|arc) #FIXED "simple" href CDATA #IMPLIED role CDATA #IMPLIED title CDATA #IMPLIED '> <!-- 'xmlns CDATA #FIXED "http://www.w3.org/XML/XLink/0.9" --> <!-- FIXME: brain-dead IE5 has broken support for namespace validation and since I use it for editing I remove this for now --> <!ENTITY % xlink-user-replace.att 'show (new|parsed|replace) #FIXED "replace" actuate (user|auto) #FIXED "user" '> <!ENTITY % xlink-user-new.att 'show (new|parsed|replace) #FIXED "new" actuate (user|auto) #FIXED "user" '> <!ENTITY % xlink-auto-parsed.att 'show (new|parsed|replace) #FIXED "parsed" actuate (user|auto) #FIXED "auto" '> <!-- FIXME (SM): XLink doesn't yet cover the idea of soft links so introducing it here using the same namespace is _somewhat_ illegal. Should we create it own namespace? --> <!ENTITY % xlink-soft.att 'mode (hard|soft) #FIXED "soft" '> <!-- =============================================================== --> <!-- Entities for general usage --> <!-- =============================================================== --> <!-- Key attribute ===================================================== Optionally provides a sorting or indexing key, for cases when the element content is inappropriate for this purpose. ==================================================================== --> <!ENTITY % key.att 'key CDATA #IMPLIED'> <!-- Title attributes ================================================== Indicates that the element requires to have a title. ==================================================================== --> <!ENTITY % title.att 'title CDATA #REQUIRED'> <!-- Name attributes ================================================== Indicates that the element requires to have a name. ==================================================================== --> <!ENTITY % name.att 'name CDATA #REQUIRED'> <!-- Email attributes ================================================== Indicates that the element requires to have an email. ==================================================================== --> <!ENTITY % email.att 'email CDATA #REQUIRED'> <!-- =============================================================== --> <!-- General definitions --> <!-- =============================================================== --> <!-- A person is a general human entity --> <!ELEMENT person EMPTY> <!ATTLIST person %common.att; %name.att; %email.att;> <!-- =============================================================== --> <!-- Content definitions --> <!-- =============================================================== --> <!ENTITY % local.content.mix ""> <!ENTITY % markup "strong|em|code|sub|sup"> <!ENTITY % links "link|connect|jump|fork|anchor"> <!ENTITY % special "br|img|icon"> <!ENTITY % link-content.mix "%text;|%markup;|%special;%local.content.mix;"> <!ENTITY % content.mix "%link-content.mix;|%links;"> <!-- ==================================================== --> <!-- Phrase Markup --> <!-- ==================================================== --> <!-- Strong (typically bold) --> <!ELEMENT strong (%text;|%markup;|%links;)*> <!ATTLIST strong %common.att;> <!-- Emphasis (typically italic) --> <!ELEMENT em (%text;|%markup;|%links;)*> <!ATTLIST em %common.att;> <!-- Code (typically monospaced) --> <!ELEMENT code (%text;|%markup;|%links;)*> <!ATTLIST code %common.att;> <!-- Superscript (typically smaller and higher) --> <!ELEMENT sup (%text;|%markup;|%links;)*> <!ATTLIST sup %common.att;> <!-- Subscript (typically smaller and lower) --> <!ELEMENT sub (%text;|%markup;|%links;)*> <!ATTLIST sub %common.att;> <!-- FIXME (SM): should we add these HTML 4.0 markups which are style-free? -dfn -samp -kbd -var -cite -abbr -acronym --> <!-- ==================================================== --> <!-- Hypertextual Links --> <!-- ==================================================== --> <!-- hard replacing link (equivalent of <a ...>) --> <!ELEMENT link (%link-content.mix;)*> <!ATTLIST link %common.att; %xlink-simple.att; %xlink-user-replace.att;> <!-- Hard window replacing link (equivalent of <a ... target="_top">) --> <!ELEMENT jump (%link-content.mix;)*> <!ATTLIST jump anchor CDATA #IMPLIED %common.att; %xlink-simple.att; %xlink-user-new.att;> <!-- Hard window forking link (equivalent of <a ... target="_new">) --> <!ELEMENT fork (%link-content.mix;)*> <!ATTLIST fork %common.att; %xlink-simple.att; %xlink-user-new.att;> <!-- Anchor point (equivalent of <a name="...">) --> <!ELEMENT anchor EMPTY> <!ATTLIST anchor %common-idreq.att;> <!-- Soft link between processed pages (no equivalent in HTML) --> <!ELEMENT connect (%link-content.mix;)*> <!ATTLIST connect %common.att; %xlink-simple.att; %xlink-user-replace.att; %xlink-soft.att;> <!-- ==================================================== --> <!-- Specials --> <!-- ==================================================== --> <!-- Breakline Object (typically forces line break) --> <!ELEMENT br EMPTY> <!ATTLIST br %common.att;> <!-- Image Object (typically an inlined image) --> <!-- FIXME (SM): should we have the notion of soft links even here for inlined objects? --> <!ELEMENT img EMPTY> <!ATTLIST img src CDATA #REQUIRED alt CDATA #REQUIRED height CDATA #IMPLIED width CDATA #IMPLIED usemap CDATA #IMPLIED ismap (ismap) #IMPLIED %common.att;> <!-- Image Icon (typically an inlined image placed as graphical item) --> <!-- FIXME (SM): should we have the notion of soft links even here for inlined objects? --> <!ELEMENT icon EMPTY> <!ATTLIST icon src CDATA #REQUIRED alt CDATA #REQUIRED height CDATA #IMPLIED width CDATA #IMPLIED %common.att;> <!-- =============================================================== --> <!-- Blocks definitions --> <!-- =============================================================== --> <!ENTITY % local.blocks ""> <!ENTITY % paragraphs "p|source|note|fixme|figure"> <!ENTITY % local.lists "%paragraphs;"> <!ENTITY % tables "table"> <!ENTITY % lists "ol|ul|sl|dl|%local.lists;"> <!ENTITY % blocks "anchor|%paragraphs;|%tables;|%lists; %local.blocks;"> <!-- ==================================================== --> <!-- Paragraphs --> <!-- ==================================================== --> <!-- Text Paragraph (normally vertically space delimited) --> <!ELEMENT p (%content.mix;)*> <!ATTLIST p %common.att;> <!-- Source Paragraph (normally space is preserved) --> <!ELEMENT source (%content.mix;)*> <!ATTLIST source %common.att; %xmlspace.att;> <!-- Note Paragraph (normally shown encapsulated) --> <!ELEMENT note (%content.mix;)*> <!ATTLIST note %common.att;> <!-- Fixme Paragraph (normally not shown) --> <!ELEMENT fixme (%content.mix;)*> <!-- the "author" attribute should match the "key" attribute of the <author> element --> <!ATTLIST fixme author CDATA #REQUIRED %common.att;> <!-- ==================================================== --> <!-- Tables --> <!-- ==================================================== --> <!-- Attributes that indicate the spanning of the table cell --> <!ENTITY % cell.span 'colspan CDATA "1" rowspan CDATA "1"'> <!-- Table element --> <!ELEMENT table (caption?, tr+)> <!ATTLIST table %common.att;> <!-- The table title --> <!ELEMENT caption (%content.mix;)*> <!ATTLIST caption %common.att;> <!-- The table row element --> <!ELEMENT tr (th|td)+> <!ATTLIST tr %common.att;> <!-- The table row header element --> <!ELEMENT th (%content.mix;)*> <!ATTLIST th %common.att; %cell.span;> <!-- The table row description element --> <!ELEMENT td (%content.mix;)*> <!ATTLIST td %common.att; %cell.span;> <!-- ==================================================== --> <!-- Lists --> <!-- ==================================================== --> <!-- Unordered list (typically bulleted) --> <!ELEMENT ul (li|%lists;)+> <!-- spacing attribute: Use "normal" to get normal vertical spacing for items; use "compact" to get less spacing. The default is dependent on the stylesheet. --> <!ATTLIST ul %common.att; spacing (normal|compact) #IMPLIED> <!-- Ordered list (typically numbered) --> <!ELEMENT ol (li|%lists;)+> <!-- spacing attribute: Use "normal" to get normal vertical spacing for items; use "compact" to get less spacing. The default is dependent on the stylesheet. --> <!ATTLIST ol %common.att; spacing (normal|compact) #IMPLIED> <!-- Simple list (typically with no mark) --> <!ELEMENT sl (li|%lists;)+> <!ATTLIST sl %common.att;> <!-- List item --> <!ELEMENT li (%content.mix;|%lists;)*> <!ATTLIST li %common.att;> <!-- Definition list (typically two-column) --> <!ELEMENT dl (dt,dd)+> <!ATTLIST dl %common.att;> <!-- Definition term --> <!ELEMENT dt (%content.mix;)*> <!ATTLIST dt %common.att;> <!-- Definition description --> <!ELEMENT dd (%content.mix;)*> <!ATTLIST dd %common.att;> <!-- ==================================================== --> <!-- Special Blocks --> <!-- ==================================================== --> <!-- Image Block (typically a separated and centered image) --> <!-- FIXME (SM): should we have the notion of soft links even here for inlined objects? --> <!ELEMENT figure EMPTY> <!ATTLIST figure src CDATA #REQUIRED alt CDATA #REQUIRED height CDATA #IMPLIED width CDATA #IMPLIED usemap CDATA #IMPLIED ismap (ismap) #IMPLIED %common.att;> <!-- =============================================================== --> <!-- Document --> <!-- =============================================================== --> <!ELEMENT document (header?, body, footer?)> <!ATTLIST document %common.att;> <!-- ==================================================== --> <!-- Header --> <!-- ==================================================== --> <!ENTITY % local.headers ""> <!ELEMENT header (title, subtitle?, version?, type?, authors, notice*, abstract? %local.headers;)> <!ATTLIST header %common.att;> <!ELEMENT title (%text;)> <!ATTLIST title %common.att;> <!ELEMENT subtitle (%text;)> <!ATTLIST subtitle %common.att;> <!ELEMENT version (%text;)> <!ATTLIST version %common.att;> <!ELEMENT type (%text;)> <!ATTLIST type %common.att;> <!ELEMENT authors (person+)> <!ATTLIST authors %common.att;> <!ELEMENT notice (%content.mix;)*> <!ATTLIST notice %common.att;> <!ELEMENT abstract (%content.mix;)*> <!ATTLIST abstract %common.att;> <!-- ==================================================== --> <!-- Body --> <!-- ==================================================== --> <!ENTITY % local.sections ""> <!ENTITY % sections "s1|anchor %local.sections;"> <!ELEMENT body (%sections;)+> <!ATTLIST body %common.att;> <!ELEMENT s1 (s2|%blocks;)*> <!ATTLIST s1 %title.att; %common.att;> <!ELEMENT s2 (s3|%blocks;)*> <!ATTLIST s2 %title.att; %common.att;> <!ELEMENT s3 (s4|%blocks;)*> <!ATTLIST s3 %title.att; %common.att;> <!ELEMENT s4 (%blocks;)*> <!ATTLIST s4 %title.att; %common.att;> <!-- ==================================================== --> <!-- Footer --> <!-- ==================================================== --> <!ENTITY % local.footers ""> <!ELEMENT footer (legal %local.footers;)> <!ELEMENT legal (%content.mix;)*> <!ATTLIST legal %common.att;> <!-- =============================================================== --> <!-- End of DTD --> <!-- =============================================================== --> 1.1 jakarta-avalon-excalibur/microcontainer/src/xdocs/dtd/faq-v10.dtd Index: faq-v10.dtd =================================================================== <!-- =================================================================== Apache FAQ DTD (Version 1.0) PURPOSE: This DTD was developed to create a simple yet powerful document type for software FAQ's for use with the Apache projects. It is an XML-compliant DTD and it's maintained by the Apache XML project. TYPICAL INVOCATION: <!DOCTYPE document PUBLIC "-//APACHE//DTD FAQ Vx.yz//EN" "http://xml.apache.org/DTD/faq-vxyz.dtd"> where x := major version y := minor version z := status identifier (optional) NOTES: FAQs represent a powerful knowledge base and a very good way of solving common user problems reducing messages on mail lists and reducing the effort required for software installation and usage. Thid DTD want to be a common format for FAQ interchange to allow FAQ-O-Matic-type workgroup services to be published in other formats as well as enhancing data interchange. AUTHORS: Stefano Mazzocchi <[EMAIL PROTECTED]> FIXME: CHANGE HISTORY: 19991129 Initial version. (SM) COPYRIGHT: Copyright (c) @year@ The Apache Software Foundation. Permission to copy in any form is granted provided this notice is included in all copies. Permission to redistribute is granted provided this file is distributed untouched in all its parts and included files. ==================================================================== --> <!-- =============================================================== --> <!-- Extend the Documentation DTD --> <!-- =============================================================== --> <!-- FIXME (SM): this is hardcoding. Find a better way of doing this possibly using public identifiers --> <!ENTITY % document-dtd SYSTEM "document-v10.dtd"> %document-dtd; <!-- =============================================================== --> <!-- Document Type Definition --> <!-- =============================================================== --> <!ELEMENT faqs (authors?, faq)+> <!ATTLIST faqs %common.att; %title.att;> <!ELEMENT faq (question, answer)> <!ATTLIST faq %common.att;> <!ELEMENT question (%content.mix;)*> <!ATTLIST question %common.att;> <!ELEMENT answer (%blocks;)*> <!ATTLIST answer author IDREF #IMPLIED> <!-- =============================================================== --> <!-- End of DTD --> <!-- =============================================================== --> 1.1 jakarta-avalon-excalibur/microcontainer/src/xdocs/dtd/specification-v10.dtd Index: specification-v10.dtd =================================================================== <!-- =================================================================== Apache Specification DTD (Version 1.0) PURPOSE: This DTD was developed to create a simple yet powerful document type for software specifications for use with the Apache projects. It is an XML-compliant DTD and it's maintained by the Apache XML project. TYPICAL INVOCATION: <!DOCTYPE document PUBLIC "-//APACHE//DTD Specification Vx.yz//EN" "http://xml.apache.org/DTD/specification-vxyz.dtd"> where x := major version y := minor version z := status identifier (optional) NOTES: AUTHORS: Stefano Mazzocchi <[EMAIL PROTECTED]> FIXME: CHANGE HISTORY: 19991129 Initial version. (SM) COPYRIGHT: Copyright (c) @year@ The Apache Software Foundation. Permission to copy in any form is granted provided this notice is included in all copies. Permission to redistribute is granted provided this file is distributed untouched in all its parts and included files. ==================================================================== --> <!-- =============================================================== --> <!-- Extend the Documentation DTD --> <!-- =============================================================== --> <!-- extend the local.xxx entities --> <!ENTITY % local.lists "|bl"> <!-- FIXME (SM): this is hardcoding. Find a better way of doing this possibly using public identifiers --> <!ENTITY % document-dtd SYSTEM "document-v10.dtd"> %document-dtd; <!-- =============================================================== --> <!-- Document Type Definition --> <!-- =============================================================== --> <!ELEMENT specification (header?, body, appendices?, footer?)> <!ATTLIST specification %common.att;> <!ELEMENT appendices (%sections;)+> <!ATTLIST appendices %common.att;> <!-- =============================================================== --> <!-- Bibliography List --> <!-- =============================================================== --> <!-- Bibliography list --> <!ELEMENT bl (bi)+> <!ATTLIST bl %common.att;> <!-- Book item --> <!ELEMENT bi EMPTY> <!ATTLIST bi %common.att; %name.att; %title.att; %xlink-simple.att; %xlink-user-new.att; authors CDATA #REQUIRED date CDATA #IMPLIED> <!-- =============================================================== --> <!-- End of DTD --> <!-- =============================================================== --> 1.1 jakarta-avalon-excalibur/microcontainer/src/xdocs/dtd/todo-v10.dtd Index: todo-v10.dtd =================================================================== <!-- =================================================================== Apache Todos DTD (Version 1.0) PURPOSE: This DTD was developed to create a simple yet powerful document type for software development todo lists for use with the Apache projects. It is an XML-compliant DTD and it's maintained by the Apache XML project. TYPICAL INVOCATION: <!DOCTYPE document PUBLIC "-//APACHE//DTD Todo Vx.yz//EN" "http://xml.apache.org/DTD/todo-vxyz.dtd"> where x := major version y := minor version z := status identifier (optional) NOTES: It is important, expecially in open developped software projects, to keep track of software changes that need to be done, planned features, development assignment, etc. in order to allow better work parallelization and create an entry point for people that want to help. This DTD wants to provide a solid foundation to provide such information and to allow it to be published as well as distributed in a common format. AUTHORS: Stefano Mazzocchi <[EMAIL PROTECTED]> FIXME: - do we need anymore working contexts? (SM) CHANGE HISTORY: 19991129 Initial version. (SM) 19991225 Added actions element for better structure (SM) COPYRIGHT: Copyright (c) @year@ The Apache Software Foundation. Permission to copy in any form is granted provided this notice is included in all copies. Permission to redistribute is granted provided this file is distributed untouched in all its parts and included files. ==================================================================== --> <!-- =============================================================== --> <!-- Extend the Documentation DTD --> <!-- =============================================================== --> <!-- FIXME (SM): this is hardcoding. Find a better way of doing this possibly using public identifiers --> <!ENTITY % document-dtd SYSTEM "document-v10.dtd"> %document-dtd; <!-- =============================================================== --> <!-- Common entities --> <!-- =============================================================== --> <!ENTITY % priorities "showstopper|high|medium|low|wish|dream"> <!ENTITY % contexts "build|docs|code|admin|design"> <!-- =============================================================== --> <!-- Document Type Definition --> <!-- =============================================================== --> <!ELEMENT todo (devs, actions*)> <!ATTLIST todo %common.att; %title.att;> <!ELEMENT devs (person+)> <!ATTLIST devs %common.att;> <!ELEMENT actions (action+)> <!ATTLIST actions %common.att; priority (%priorities;) #IMPLIED> <!ELEMENT action (%content.mix;)*> <!ATTLIST action %common.att; assigned-to IDREF #IMPLIED context (%contexts;) #REQUIRED> <!-- =============================================================== --> <!-- End of DTD --> <!-- =============================================================== --> 1.1 jakarta-avalon-excalibur/microcontainer/src/xdocs/images/build.gif <<Binary file>> 1.1 jakarta-avalon-excalibur/microcontainer/src/xdocs/images/code.gif <<Binary file>> 1.1 jakarta-avalon-excalibur/microcontainer/src/xdocs/images/design.gif <<Binary file>> 1.1 jakarta-avalon-excalibur/microcontainer/src/xdocs/images/update.gif <<Binary file>>
-- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>