You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@avalon.apache.org by le...@apache.org on 2002/08/06 18:28:38 UTC

cvs commit: jakarta-avalon-excalibur/component/src/java/org/apache/avalon/excalibur/component AbstractDualLogEnabledInstrumentable.java ComponentHandler.java DefaultComponentFactory.java ExcaliburComponentManager.java ExcaliburComponentSelector.java PoolableComponentHandler.java ThreadSafeComponentHandler.java

leif        2002/08/06 09:28:38

  Modified:    component/src/java/org/apache/avalon/excalibur/component
                        ComponentHandler.java DefaultComponentFactory.java
                        ExcaliburComponentManager.java
                        ExcaliburComponentSelector.java
                        PoolableComponentHandler.java
                        ThreadSafeComponentHandler.java
  Added:       component/examples/instrument-manager .cvsignore
                        ant.properties.sample build.xml default.properties
               component/examples/instrument-manager/bin cpappend.bat
                        run.bat run.sh
               component/examples/instrument-manager/conf components.xml
                        instrument.xml logkit.xml roles.xml
               component/examples/instrument-manager/src/java/org/apache/avalon/excalibur/component/example_im
                        DefaultExampleInstrumentable.java
                        ExampleInstrumentable.java Main.java
               component/src/java/org/apache/avalon/excalibur/component
                        AbstractDualLogEnabledInstrumentable.java
  Log:
  Merge the ICM into the ECM.
  
  Revision  Changes    Path
  1.1                  jakarta-avalon-excalibur/component/examples/instrument-manager/.cvsignore
  
  Index: .cvsignore
  ===================================================================
  build
  data
  lib
  ant.properties
  
  
  
  1.1                  jakarta-avalon-excalibur/component/examples/instrument-manager/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, and
  # override the defaults in ../ant.properties.
  #
  # $Id: ant.properties.sample,v 1.1 2002/08/06 16:28:37 leif Exp $
  # -----------------------------------------------------------------------------
  
  # --------------------------------------------------
  #      COMPONENT-SPECIFIC REQUIRED LIBRARIES
  # --------------------------------------------------
  
  
  # ----- Compile Control Flags -----
  build.debug=on
  build.optimize=off
  build.deprecation=off
  
  # ----- Base Directory in which all the packages are stored -----
  base.path=/opt
  
  # --------------------------------------------------
  #                REQUIRED LIBRARIES
  # --------------------------------------------------
  
  # ----- Xerces -----
  xerces.home=../../../../jakarta-avalon/tools/lib/
  xerces.jar=${xerces.home}/xerces-2.0.1.jar
  
  # ----- XML-APIs -----
  xml-apis.home=../../../../jakarta-avalon/tools/lib/
  xml-apis.jar=${xml-apis.home}/xml-apis.jar
  
  # ----- Xalan -----
  xalan.home=../../../../jakarta-avalon/tools/lib/
  xalan.jar=${xalan.home}/xalan-2.3.1.jar
  
  # ----- Logkit -----
  logkit.home=../../../../jakarta-avalon-logkit/build/lib
  logkit.jar=${logkit.home}/logkit.jar
  
  # ----- Avalon Framework -----
  avalon-framework.home=../../../../jakarta-avalon/build/lib
  avalon-framework.jar=${avalon-framework.home}/avalon-framework.jar
  
  # ----- Excalibur Concurrent -----
  excalibur-concurrent.home=../../../concurrent/build/lib
  excalibur-concurrent.jar=${excalibur-concurrent.home}/excalibur-concurrent-1.0.jar
  
  # ----- Excalibur Collections -----
  excalibur-collections.home=../../../collections/build/lib
  excalibur-collections.jar=${excalibur-collections.home}/excalibur-collections-1.0.jar
  
  # ----- Excalibur Component -----
  excalibur-component.home=../../../component/build/lib
  excalibur-component.jar=${excalibur-component.home}/excalibur-component-1.0.jar
  
  # ----- Excalibur Logger -----
  excalibur-logger.home=../../../logger/build/lib
  excalibur-logger.jar=${excalibur-logger.home}/excalibur-logger-1.0.jar
  
  # ----- Excalibur Pool -----
  excalibur-pool.home=../../../pool/build/lib
  excalibur-pool.jar=${excalibur-pool.home}/excalibur-pool-1.0.jar
  
  # ----- Excalibur Instrument -----
  excalibur-instrument.home=../../../instrument/build/lib
  excalibur-instrument.jar=${excalibur-instrument.home}/excalibur-instrument-0.3.jar
  excalibur-instrument-manager.jar=${excalibur-instrument.home}/excalibur-instrument-manager-0.3.jar
  excalibur-instrument-manager-interfaces.jar=${excalibur-instrument.home}/excalibur-instrument-manager-interfaces-0.3.jar
  
  # ----- Altrmi -----
  excalibur-altrmi.home=../../../altrmi/build/lib
  excalibur-altrmi-common.jar=${excalibur-altrmi.home}/excalibur-altrmi-common.jar
  excalibur-altrmi-server-impl.jar=${excalibur-altrmi.home}/excalibur-altrmi-server-impl.jar
  excalibur-altrmi-server-interfaces.jar=${excalibur-altrmi.home}/excalibur-altrmi-server-interfaces.jar
  
  # ----- JUnit Unit Test Suite, version 3.7 or later -----
  junit.home=${base.path}/junit3.7
  junit.lib=${junit.home}
  junit.jar=${junit.lib}/junit.jar
  
  
  
  # --------------------------------------------------
  #                OPTIONAL LIBRARIES
  # --------------------------------------------------
  
  # ----- 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/component/examples/instrument-manager/build.xml
  
  Index: build.xml
  ===================================================================
  <?xml version="1.0" encoding="ISO-8859-1"?>
  
  <!-- ======================================================================= -->
  <!-- Container Example build file!                                           -->
  <!-- ======================================================================= -->
  
  <project name="example-instrument-manager" default="main" basedir=".">
  
      <!--property name="avalon-framework.home" value="${basedir}/../../../../jakarta-avalon"/-->
      <!--
        Give user a chance to override without editing this file
        (and without typing -D each time he compiles it)
      -->
      <property file="ant.properties"/>
      <property file="${user.home}/.ant.properties"/>
      <property file="default.properties"/>
  
      <!-- Directories build by ant -->
      <property name="build.dir"             value="${basedir}/build"/>
      <property name="build.classes.dir"     value="${build.dir}/classes"/>
      <property name="build.javadocs.dir"    value="${build.dir}/javadocs"/>
      <property name="lib.dir"               value="${basedir}/lib"/>
      <property name="data.dir"              value="${basedir}/data"/>
  
      <!-- Existing directories -->
      <property name="src.dir"               value="${basedir}/src"/>
      <property name="src.java.dir"          value="${src.dir}/java"/>
  
      <!-- Define paths used by this project -->
      <path id="project.class.path">
          <fileset dir="${lib.dir}">
              <include name="**/*.jar"/>
              <exclude name="example-instrument-manager.jar"/>
          </fileset>
          <pathelement path="${build.classes.dir}" />
      </path>
  
      <!-- =================================================================== -->
      <!-- Help on usage                                                       -->
      <!-- =================================================================== -->
      <target name="usage">
          <echo message="Use the -projecthelp option instead"/>
      </target>
      <target name="help" depends="usage"/>
  
      <!-- =================================================================== -->
      <!-- Dependency Checker                                                  -->
      <!-- =================================================================== -->
      <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"/>
          <ant antfile="${depchecker.prefix}/depchecker.xml" target="checkComponent"/>
          <ant antfile="${depchecker.prefix}/depchecker.xml" target="checkAltrmiServer"/>
          <ant antfile="${depchecker.prefix}/depchecker.xml" target="checkAltrmiCommon"/>
      </target>
      
      <!-- =================================================================== -->
      <!-- Help on usage                                                       -->
      <!-- =================================================================== -->
      <target name="collect-jars">
          <!-- Xerces -->
          <copy file="${xerces.jar}" todir="${lib.dir}" preservelastmodified="yes"/>
  
          <!-- XML-APIs -->
          <copy file="${xml-apis.jar}" todir="${lib.dir}" preservelastmodified="yes"/>
  
          <!-- Xalan -->
          <copy file="${xalan.jar}" todir="${lib.dir}" preservelastmodified="yes"/>
  
          <!-- Logkit -->
          <copy file="${logkit.jar}" todir="${lib.dir}" preservelastmodified="yes"/>
  
          <!-- Avalon Framework -->
          <copy file="${avalon-framework.jar}" todir="${lib.dir}" preservelastmodified="yes"/>
  
          <!-- Avalon Excalibur Concurrent -->
          <copy file="${excalibur-concurrent.jar}"
              todir="${lib.dir}" preservelastmodified="yes"/>
  
          <!-- Avalon Excalibur Collections -->
          <copy file="${excalibur-collections.jar}"
              todir="${lib.dir}" preservelastmodified="yes"/>
  
          <!-- Avalon Excalibur Component -->
          <copy file="${excalibur-component.jar}"
              todir="${lib.dir}" preservelastmodified="yes"/>
  
          <!-- Avalon Excalibur Logger -->
          <copy file="${excalibur-logger.jar}"
              todir="${lib.dir}" preservelastmodified="yes"/>
  
          <!-- Avalon Excalibur Pool -->
          <copy file="${excalibur-pool.jar}"
              todir="${lib.dir}" preservelastmodified="yes"/>
  
          <!-- Avalon Excalibur Instrument -->
          <copy file="${excalibur-instrument.jar}"
              todir="${lib.dir}" preservelastmodified="yes"/>
          <copy file="${excalibur-instrument-manager.jar}"
              todir="${lib.dir}" preservelastmodified="yes"/>
          <copy file="${excalibur-instrument-manager-interfaces.jar}"
              todir="${lib.dir}" preservelastmodified="yes"/>
  
          <!-- Altrmi Jars -->
          <copy file="${excalibur-altrmi-common.jar}"
              todir="${lib.dir}" preservelastmodified="yes"/>
          <copy file="${excalibur-altrmi-server-impl.jar}"
              todir="${lib.dir}" preservelastmodified="yes"/>
          <copy file="${excalibur-altrmi-server-interfaces.jar}"
              todir="${lib.dir}" preservelastmodified="yes"/>
      </target>
  
      <!-- =================================================================== -->
      <!-- Initialize custom tasks                                             -->
      <!-- =================================================================== -->
      <target name="init" depends="collect-jars">
          <mkdir dir="${data.dir}"/>
      </target>
  
      <!-- =================================================================== -->
      <!-- Compiles the source code                                            -->
      <!-- =================================================================== -->
      <target name="compile" depends="init">
          <mkdir dir="${build.dir}"/>
          <mkdir dir="${build.classes.dir}"/>
  
          <!-- compile everything under src/java -->
          <javac srcdir="${src.java.dir}" destdir="${build.classes.dir}"
              deprecation="on"
              debug="on"
              optimize="off">
              <classpath refid="project.class.path" />
          </javac>
  
          <!-- copy image files to build directory -->
          <copy todir="${build.classes.dir}" >
              <fileset dir="${src.java.dir}" >
                  <include name="**/*.jpg" />
                  <include name="**/*.gif" />
              </fileset>
          </copy>
      </target>
  
      <!-- =================================================================== -->
      <!-- Creates the jar archive                                             -->
      <!-- =================================================================== -->
      <target name="jar" depends="compile" description="Builds the jar archive.">
          <mkdir dir="${lib.dir}"/>
  
          <jar jarfile="${lib.dir}/example-instrument-manager.jar"
              basedir="${build.classes.dir}"
              includes="**/*.class,**/*.properties,**/*.xml,**/*.jpg,**/*.gif,**/*.roles"
              />
      </target>
  
      <!-- =================================================================== -->
      <!-- Main target                                                         -->
      <!-- =================================================================== -->
      <target name="main" depends="jar" description="build the runnable application">
      </target>
  
      <!-- =================================================================== -->
      <!-- Creates the javadocs archive.                                       -->
      <!-- =================================================================== -->
      <target name="javadocs" description="Generates javadoc documentation">
          <mkdir dir="${build.javadocs.dir}"/>
  
          <javadoc packagenames="org.apache.*"
              sourcepath="${src.java.dir}"
              destdir="${build.javadocs.dir}">
              <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="-bottom"
                      value="&quot;Copyright &#169; 2001 Apache Jakarta Project. All Rights Reserved.&quot;"/>
              </doclet>
          </javadoc>
      </target>
  
      <!-- =================================================================== -->
      <!-- Builds everything.                                                  -->
      <!-- =================================================================== -->
      <target name="all" depends="main, javadocs" description="Build everything"/>
  
      <!-- =================================================================== -->
      <!-- Cleans up compiled classes and generated XMLC source.               -->
      <!-- =================================================================== -->
      <target name="clean" description="cleans up the directory">
          <delete dir="${build.dir}"/>
          <delete dir="${lib.dir}"/>
      </target>
  </project>
  
  
  
  
  1.1                  jakarta-avalon-excalibur/component/examples/instrument-manager/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
  
  # --------------------------------------------------
  #                REQUIRED LIBRARIES
  # --------------------------------------------------
  
  excalibur.dir=${basedir}/../../..
  avalon-framework.home=${excalibur.dir}/../jakarta-avalon
  
  # ----- Xerces -----
  xerces.jar=${tools.dir}/lib/xerces-2.0.1.jar
  
  # ----- XML Apis -----
  xml-apis.jar=${tools.dir}/lib/xml-apis.jar
  
  # ----- Xalan -----
  xalan.jar=${tools.dir}/lib/xalan-2.3.1.jar
  
  # ----- Logkit -----
  logkit.home=${excalibur.dir}/../jakarta-avalon-logkit
  logkit.lib=${logkit.home}/build/lib
  logkit.jar=${logkit.lib}/logkit.jar
  
  # ----- Avalon Framework -----
  avalon-framework.lib=${avalon-framework.home}/build/lib
  avalon-framework.jar=${avalon-framework.lib}/avalon-framework.jar
  
  # ----- Excalibur Concurrent -----
  excalibur-concurrent.home=${excalibur.dir}/concurrent/dist
  excalibur-concurrent.jar=${excalibur-concurrent.home}/excalibur-concurrent-1.0.jar
  
  # ----- Excalibur Collections -----
  excalibur-collections.home=${excalibur.dir}/collections/dist
  excalibur-collections.jar=${excalibur-collections.home}/excalibur-collections-1.0.jar
  
  # ----- Excalibur Component -----
  excalibur-component.home=${excalibur.dir}/component/dist
  excalibur-component.jar=${excalibur-component.home}/excalibur-component-1.0.jar
  
  # ----- Excalibur Logger -----
  excalibur-logger.home=${excalibur.dir}/logger/dist
  excalibur-logger.jar=${excalibur-logger.home}/excalibur-logger-1.0.jar
  
  # ----- Excalibur Pool -----
  excalibur-pool.home=${excalibur.dir}/pool/dist
  excalibur-pool.jar=${excalibur-pool.home}/excalibur-pool-1.0.jar
  
  # ----- Excalibur Instrument -----
  excalibur-instrument.home=${excalibur.dir}/instrument/dist
  excalibur-instrument.jar=${excalibur-instrument.home}/excalibur-instrument-0.3.jar
  excalibur-instrument-manager.jar=${excalibur-instrument.home}/excalibur-instrument-manager-0.3.jar
  excalibur-instrument-manager-interfaces.jar=${excalibur-instrument.home}/excalibur-instrument-manager-interfaces-0.3.jar
  
  # ----- Altrmi -----
  excalibur-altrmi.home=${excalibur.dir}/altrmi/dist
  excalibur-altrmi-common.jar=${excalibur-altrmi.home}/excalibur-altrmi-common.jar
  excalibur-altrmi-server-impl.jar=${excalibur-altrmi.home}/excalibur-altrmi-server-impl.jar
  excalibur-altrmi-server-interfaces.jar=${excalibur-altrmi.home}/excalibur-altrmi-server-interfaces.jar
  
  
  # --------------------------------------------------
  #                OPTIONAL 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 = ${basedir}/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
  build.genjava="${build.dir}/genjava
  
  #  Set the properties for source directories
  src.dir = ${basedir}/src
  java.dir = ${src.dir}/java
  conf.dir = ${src.dir}/conf
  test.dir = ${src.dir}/test
  manager.dir = ${src.dir}/manager
  client.dir = ${src.dir}/client
  
  #  needed by Cocoon
  build.context = ${build.dir}/documentation
  build.docs = ${build.dir}/docs
  build.xdocs = ${build.dir}/xdocs
  context.dir = ${avalon-framework.home}/src/documentation
  tools.dir = ${avalon-framework.home}/tools
  tools.jar = ${java.home}/../lib/tools.jar
  docs.dir = docs
  xdocs.dir = ${src.dir}/xdocs
  
  #  Set the properties for distribution directories
  dist.dir = ${basedir}/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
  client.jar.name = ${client.name}-${version}.jar
  manager.jar.name = ${manager.name}-${version}.jar
  
  #  property indicating directory where all distribution archives are placed
  dist.base = distributions
  
  depchecker.prefix=../../../
  
  
  
  
  1.1                  jakarta-avalon-excalibur/component/examples/instrument-manager/bin/cpappend.bat
  
  Index: cpappend.bat
  ===================================================================
  set _LIBJARS=%_LIBJARS%;%1
  
  
  
  1.1                  jakarta-avalon-excalibur/component/examples/instrument-manager/bin/run.bat
  
  Index: run.bat
  ===================================================================
  @echo off
  rem
  rem Example start script.
  rem
  rem Author: Leif Mortenson [leif@tanukisoftware.com]
  
  rem
  rem Determine if JAVA_HOME is set and if so then use it
  rem
  if not "%JAVA_HOME%"=="" goto found_java
  
  set EXAMPLE_JAVACMD=java
  goto file_locate
  
  :found_java
  set EXAMPLE_JAVACMD=%JAVA_HOME%\bin\java
  
  :file_locate
  
  rem
  rem Locate where the example is in filesystem
  rem
  if not "%OS%"=="Windows_NT" goto start
  
  rem %~dp0 is name of current script under NT
  set EXAMPLE_HOME=%~dp0
  
  rem : operator works similar to make : operator
  set EXAMPLE_HOME=%EXAMPLE_HOME:\bin\=%
  
  :start
  
  if not "%EXAMPLE_HOME%" == "" goto example_home
  
  echo.
  echo Warning: EXAMPLE_HOME environment variable is not set.
  echo   This needs to be set for Win9x as it's command prompt 
  echo   scripting bites
  echo.
  goto end
  
  :example_home
  rem
  rem build the runtime classpath
  rem
  set CP=
  
  
  set _LIBJARS=
  for %%i in (%EXAMPLE_HOME%\lib\*.jar) do call %EXAMPLE_HOME%\bin\cpappend.bat %%i
  if not "%_LIBJARS%" == "" goto run
  
  echo Unable to set CLASSPATH dynamically.
  goto end
  
  :run
  set CP=%CP%%_LIBJARS%
  
  rem Run the example application
  %EXAMPLE_JAVACMD% -Djava.compiler="NONE" -classpath "%CP%" org.apache.avalon.excalibur.component.example_im.Main %1 %2 %3 %4 %5 %6 %7 %8 %9
  
  :end
  
  
  
  1.1                  jakarta-avalon-excalibur/component/examples/instrument-manager/bin/run.sh
  
  Index: run.sh
  ===================================================================
  #!/bin/bash 
  #
  # Startup script.
  #
  
  #
  # Determine if JAVA_HOME is set and if so then use it
  #
  if [ -z "$JAVA_HOME" ] ;  then
    JAVA=`which java`
    if [ -z "$JAVA" ] ; then
      echo "Cannot find JAVA. Please set your PATH."
      exit 1
    fi
    JAVA_BINDIR=`dirname $JAVA`
    JAVA_HOME=$JAVA_BINDIR/..
  fi
  
  if [ "$JAVACMD" = "" ] ; then
     # it may be defined in env - including flags!!
     JAVACMD=$JAVA_HOME/bin/java
  fi
  
  # Main.java has hard coded config values so this script must be run from 
  # altprofile/bin (any better ideas ?)
  EXAMPLE_HOME=..
  
  #
  # Build the runtime classpath
  #
  for i in ${EXAMPLE_HOME}/lib/*.jar ; do
      CP=${CP}:$i
  done
  
  #echo $CP
  
  # Run the example application
  $JAVACMD -classpath $CP org.apache.avalon.excalibur.component.example_im.Main $@
  
  
  
  
  1.1                  jakarta-avalon-excalibur/component/examples/instrument-manager/conf/components.xml
  
  Index: components.xml
  ===================================================================
  <components logger="cm">
      <!-- =============================================================== -->
      <!-- Application components.                                         -->
      <!-- =============================================================== -->
      <example-instrumentable logger="app"/>
  </components>
  
  
  1.1                  jakarta-avalon-excalibur/component/examples/instrument-manager/conf/instrument.xml
  
  Index: instrument.xml
  ===================================================================
  <instrument logger="im">
      <name>example-instrument-manager</name>
      <description>ECM Example Instrument Application</description>
      
      <connectors>
          <connector class="altrmi" port="15555"/>
      </connectors>
      
      <state-file interval="60000">../data/instrument.sampledata</state-file>
      
      <!-- The instrumentables section allows you to preconfigure instruments and samples. -->
      <instrumentables>
          <!-- Instrument configuration for the Component Manager. -->
          <instrumentable name="component-manager">
              <instrumentable name="example-instrumentable">
                  <instrument name="puts">
                      <sample type="ctr" interval="1000" size="600"/>
                  </instrument>
                  <instrument name="gets">
                      <sample type="ctr" interval="1000" size="600"/>
                  </instrument>
                  <instrument name="references">
                      <sample type="max" interval="1000" size="600"/>
                  </instrument>
              </instrumentable>
          </instrumentable>
          
          <!-- Instrument configuration for the Instrument Manager. -->
          <instrumentable name="instrument-manager" description="Instrument Manager">
              <instrument name="active-thread-count" description="Active Thread Count">
                  <sample type="max" interval="1000" size="600" description="Maximum each second."/>
              </instrument>
              
              <instrument name="total-memory" description="Total Memory">
                  <sample type="max" interval="1000" size="600" description="Maximum each second."/>
              </instrument>
              
              <instrument name="free-memory" description="Free Memory">
                  <sample type="min" interval="1000" size="600" description="Minimum each second."/>
              </instrument>
              
              <instrument name="memory" description="In-Use Memory">
                  <sample type="max" interval="1000" size="600" description="Maximum each second."/>
              </instrument>
          </instrumentable>
          
          <!-- Instrument configuration for the Example Instrumentable. -->
          <instrumentable name="example-instrumentable" description="Example Instrumentable">
              <!-- Note that any number of samples are possible for each profile point. -->
              <instrument name="random-quick" description="Random Values at a quick rate.">
                  <sample type="maximum" interval="1000" size="600" description="Maximum each second."/>
                  <sample type="minimum" interval="1000" size="600" description="Minimum each second."/>
                  <sample type="mean" interval="1000" size="600" description="Average each second."/>
              </instrument>
              
              <instrument name="random-slow" description="Random Values at a slow rate.">
                  <sample type="maximum" interval="1000" size="600" description="Maximum each second."/>
                  <sample type="minimum" interval="1000" size="600" description="Minimum each second."/>
                  <sample type="mean" interval="1000" size="600" description="Average each second."/>
              </instrument>
              
              <instrument name="random-random" description="Random Values at a random rate.">
                  <sample type="maximum" interval="1000" size="600" description="Maximum each second."/>
                  <sample type="minimum" interval="1000" size="600" description="Minimum each second."/>
                  <sample type="mean" interval="1000" size="600" description="Average each second."/>
              </instrument>
              
              <instrument name="counter-quick" description="Count of actions at a quick rate.">
                  <sample type="counter" interval="100" size="600" description="Count per 100ms."/>
                  <sample type="counter" interval="1000" size="600" description="Count per second."/>
                  <sample type="counter" interval="60000" size="60" description="Count per minute."/>
              </instrument>
              
              <instrument name="counter-slow" description="Count of actions at a slow rate.">
                  <sample type="counter" interval="1000" size="600" description="Count per second."/>
                  <sample type="counter" interval="60000" size="60" description="Count per minute."/>
              </instrument>
              
              <instrument name="counter-random" description="Count of actions at a random rate.">
                  <sample type="counter" interval="1000" size="600" description="Count per second."/>
                  <sample type="counter" interval="60000" size="60" description="Count per minute."/>
              </instrument>
              
              <instrument name="doaction-counter" description="Number of times doAction is called.">
                  <sample type="counter" interval="1000" size="600" description="Count per second."/>
                  <sample type="counter" interval="60000" size="60" description="Count per minute."/>
              </instrument>
          </instrumentable>
      </instrumentables>
  </instrument>
  
  
  1.1                  jakarta-avalon-excalibur/component/examples/instrument-manager/conf/logkit.xml
  
  Index: logkit.xml
  ===================================================================
  <logkit logger="lm" log-level="INFO">
      <factories>
          <factory type="stream" 
                   class="org.apache.avalon.excalibur.logger.factory.StreamTargetFactory"/>
          <factory type="file" 
                   class="org.apache.avalon.excalibur.logger.factory.FileTargetFactory"/>
          <factory type="priority-filter" 
                   class="org.apache.avalon.excalibur.logger.factory.PriorityFilterTargetFactory"/>
      </factories>
      <targets>
          <stream id="console">
              <stream>System.out</stream>
              <format type="avalon">
  %19.19{time:yyyy-MM-dd'T'HH:mm:ss.SSS} %5.5{priority} [%15.15{category}]: %{message}\n%{throwable}
              </format>
          </stream>
      </targets>
      <categories>
          <!-- Profiler Manager Logger -->
          <category name="im" log-level="INFO">
              <log-target id-ref="console"/>
              
              <!-- The values child logger can dump out a lot of data. -->
              <category name="values" 
                        log-level="INFO">
                  <log-target id-ref="console"/>
              </category>
          </category>
          
          <!-- Role Manager Logger -->
          <category name="rm" log-level="INFO">
              <log-target id-ref="console"/>
          </category>
          
          <!-- Component Manager Logger -->
          <category name="cm" log-level="INFO">
              <log-target id-ref="console"/>
          </category>
          
          <!-- Application Loggers -->
          <category name="app" log-level="INFO">
              <log-target id-ref="console"/>
          </category>
      </categories>
  </logkit>
  
  
  
  1.1                  jakarta-avalon-excalibur/component/examples/instrument-manager/conf/roles.xml
  
  Index: roles.xml
  ===================================================================
  <role-list logger="rm">
      <!-- =================================================================== -->
      <!-- Application roles.                                                  -->
      <!-- =================================================================== -->
      <role name="org.apache.avalon.excalibur.component.example_im.ExampleInstrumentable"
            shorthand="example-instrumentable"
            default-class="org.apache.avalon.excalibur.component.example_im.DefaultExampleInstrumentable"/>
  </role-list>
  
  
  
  1.1                  jakarta-avalon-excalibur/component/examples/instrument-manager/src/java/org/apache/avalon/excalibur/component/example_im/DefaultExampleInstrumentable.java
  
  Index: DefaultExampleInstrumentable.java
  ===================================================================
  /*
   * Copyright (C) The Apache Software Foundation. All rights reserved.
   *
   * This software is published under the terms of the Apache Software License
   * version 1.1, a copy of which has been included with this distribution in
   * the LICENSE.txt file.
   */
  package org.apache.avalon.excalibur.component.example_im;
  
  import org.apache.excalibur.instrument.CounterInstrument;
  import org.apache.excalibur.instrument.Instrumentable;
  import org.apache.excalibur.instrument.Instrument;
  import org.apache.excalibur.instrument.ValueInstrument;
  
  import org.apache.avalon.framework.activity.Startable;
  import org.apache.avalon.framework.logger.AbstractLogEnabled;
  
  /**
   * This example application creates a component which registers several
   *  Instruments for the example.
   *
   * Note, this code ignores exceptions to keep the code simple.
   *
   * @author <a href="mailto:leif@apache.org">Leif Mortenson</a>
   * @version CVS $Revision: 1.1 $ $Date: 2002/08/06 16:28:37 $
   * @since 4.1
   */
  public class DefaultExampleInstrumentable
      extends AbstractLogEnabled
      implements ExampleInstrumentable, Startable, Runnable, Instrumentable
  {
      public static final String INSTRUMENT_RANDOM_QUICK_NAME   = "random-quick";
      public static final String INSTRUMENT_RANDOM_SLOW_NAME    = "random-slow";
      public static final String INSTRUMENT_RANDOM_RANDOM_NAME  = "random-random";
      public static final String INSTRUMENT_COUNTER_QUICK_NAME  = "counter-quick";
      public static final String INSTRUMENT_COUNTER_SLOW_NAME   = "counter-slow";
      public static final String INSTRUMENT_COUNTER_RANDOM_NAME = "counter-random";
      public static final String INSTRUMENT_DOACTION_NAME       = "doaction-counter";
  
      /** Instrumentable Name assigned to this Instrumentable */
      private String m_instrumentableName;
  
      /** Instrument used to profile random values with lots of updates. */
      private ValueInstrument m_randomQuickInstrument;
  
      /** Instrument used to profile random values with few of updates. */
      private ValueInstrument m_randomSlowInstrument;
  
      /** Instrument used to profile random values with updates at a random rate. */
      private ValueInstrument m_randomRandomInstrument;
  
      /** Instrument used to profile random actions with lots of updates. */
      private CounterInstrument m_counterQuickInstrument;
  
      /** Instrument used to profile random actions with few of updates. */
      private CounterInstrument m_counterSlowInstrument;
  
      /** Instrument used to profile random actions with updates at a random rate. */
      private CounterInstrument m_counterRandomInstrument;
  
      /** Instrument used to count the number of times that doAction is called. */
      private CounterInstrument m_doActionInstrument;
  
      /** Thread which is used to send profile data to the random instruments. */
      private Thread m_runner;
  
      /*---------------------------------------------------------------
       * Constructors
       *-------------------------------------------------------------*/
      public DefaultExampleInstrumentable()
      {
          // Initialize the Instrumentable elements.
          m_randomQuickInstrument   = new ValueInstrument( INSTRUMENT_RANDOM_QUICK_NAME );
          m_randomSlowInstrument    = new ValueInstrument( INSTRUMENT_RANDOM_SLOW_NAME );
          m_randomRandomInstrument  = new ValueInstrument( INSTRUMENT_RANDOM_RANDOM_NAME );
          m_counterQuickInstrument  = new CounterInstrument( INSTRUMENT_COUNTER_QUICK_NAME );
          m_counterSlowInstrument   = new CounterInstrument( INSTRUMENT_COUNTER_SLOW_NAME );
          m_counterRandomInstrument = new CounterInstrument( INSTRUMENT_COUNTER_RANDOM_NAME );
          m_doActionInstrument      = new CounterInstrument( INSTRUMENT_DOACTION_NAME );
      }
  
      /*---------------------------------------------------------------
       * ExampleInstrumentable Methods
       *-------------------------------------------------------------*/
      /**
       * Example action method.
       */
      public void doAction()
      {
          getLogger().info( "ExampleInstrumentable.doAction() called." );
  
          // Notify the profiler.
          m_doActionInstrument.increment();
      }
  
      /*---------------------------------------------------------------
       * Startable Methods
       *-------------------------------------------------------------*/
      /**
       * Start the component.
       */
      public void start()
      {
          if ( m_runner == null )
          {
              m_runner = new Thread( this, "ExampleInstrumentableRunner" );
              m_runner.start();
          }
      }
  
      /**
       * Stop the component.
       */
      public void stop()
      {
          if ( m_runner != null )
          {
              m_runner.interrupt();
              m_runner = null;
          }
      }
  
      /*---------------------------------------------------------------
       * Runnable Methods
       *-------------------------------------------------------------*/
      /**
       * Runner thread which is responsible for sending data to the Profiler via
       *  the various random Profile Points.
       */
      public void run()
      {
          int counter = 0;
          while ( m_runner != null )
          {
              // Add some delay to the loop.
              try
              {
                  Thread.sleep( 100 );
              }
              catch ( InterruptedException e )
              {
                  if ( m_runner == null )
                  {
                      return;
                  }
              }
  
              // Handle the quick Profile Points
              m_randomQuickInstrument.setValue( (int)(Math.random() * 100) );
              m_counterQuickInstrument.increment();
  
              // Handle the slow Profile Points
              counter++;
              if ( counter >= 20 )
              {
                  m_randomSlowInstrument.setValue( (int)(Math.random() * 100) );
                  m_counterSlowInstrument.increment();
                  counter = 0;
              }
  
              // Handle the random Profile Points.  Fire 10% of the time.
              if ( 100 * Math.random() < 10 )
              {
                  m_randomRandomInstrument.setValue( (int)(Math.random() * 100) );
                  m_counterRandomInstrument.increment();
              }
          }
      }
  
      /*---------------------------------------------------------------
       * Instrumentable Methods
       *-------------------------------------------------------------*/
      /**
       * Sets the name for the Instrumentable.  The Instrumentable Name is used
       *  to uniquely identify the Instrumentable during the configuration of
       *  the InstrumentManager and to gain access to an InstrumentableDescriptor
       *  through the InstrumentManager.  The value should be a string which does
       *  not contain spaces or periods.
       * <p>
       * This value may be set by a parent Instrumentable, or by the
       *  InstrumentManager using the value of the 'instrumentable' attribute in
       *  the configuration of the component.
       *
       * @param name The name used to identify a Instrumentable.
       */
      public void setInstrumentableName( String name )
      {
          m_instrumentableName = name;
      }
  
      /**
       * Gets the name of the Instrumentable.
       *
       * @return The name used to identify a Instrumentable.
       */
      public String getInstrumentableName()
      {
          return m_instrumentableName;
      }
  
      /**
       * Obtain a reference to all the Instruments that the Instrumentable object
       *  wishes to expose.  All sampling is done directly through the
       *  Instruments as opposed to the Instrumentable interface.
       *
       * @return An array of the Instruments available for profiling.  Should
       *         never be null.  If there are no Instruments, then
       *         EMPTY_INSTRUMENT_ARRAY can be returned.  This should never be
       *         the case though unless there are child Instrumentables with
       *         Instruments.
       */
      public Instrument[] getInstruments()
      {
          return new Instrument[]
          {
              m_randomQuickInstrument,
              m_randomSlowInstrument,
              m_randomRandomInstrument,
              m_counterQuickInstrument,
              m_counterSlowInstrument,
              m_counterRandomInstrument,
              m_doActionInstrument
          };
      }
  
      /**
       * Any Object which implements Instrumentable can also make use of other
       *  Instrumentable child objects.  This method is used to tell the
       *  InstrumentManager about them.
       *
       * @return An array of child Instrumentables.  This method should never
       *         return null.  If there are no child Instrumentables, then
       *         EMPTY_INSTRUMENTABLE_ARRAY can be returned.
       */
      public Instrumentable[] getChildInstrumentables()
      {
          // This instrumentable does not have any children.
          return Instrumentable.EMPTY_INSTRUMENTABLE_ARRAY;
      }
  }
  
  
  
  
  1.1                  jakarta-avalon-excalibur/component/examples/instrument-manager/src/java/org/apache/avalon/excalibur/component/example_im/ExampleInstrumentable.java
  
  Index: ExampleInstrumentable.java
  ===================================================================
  /*
   * Copyright (C) The Apache Software Foundation. All rights reserved.
   *
   * This software is published under the terms of the Apache Software License
   * version 1.1, a copy of which has been included with this distribution in
   * the LICENSE.txt file.
   */
  package org.apache.avalon.excalibur.component.example_im;
  
  import org.apache.avalon.framework.component.Component;
  
  /**
   * This example application creates a component which registers several
   *  Instruments for the example.
   *
   * Note, this code ignores exceptions to keep the code simple.
   *
   * @author <a href="mailto:leif@apache.org">Leif Mortenson</a>
   * @version CVS $Revision: 1.1 $ $Date: 2002/08/06 16:28:37 $
   * @since 4.1
   */
  public interface ExampleInstrumentable
      extends Component
  {
      String ROLE = ExampleInstrumentable.class.getName();
  
      /**
       * Example action method.
       */
      void doAction();
  }
  
  
  
  
  1.1                  jakarta-avalon-excalibur/component/examples/instrument-manager/src/java/org/apache/avalon/excalibur/component/example_im/Main.java
  
  Index: Main.java
  ===================================================================
  /*
   * Copyright (C) The Apache Software Foundation. All rights reserved.
   *
   * This software is published under the terms of the Apache Software License
   * version 1.1, a copy of which has been included with this distribution in
   * the LICENSE.txt file.
   */
  package org.apache.avalon.excalibur.component.example_im;
  
  import java.io.BufferedReader;
  import java.io.File;
  import java.io.InputStreamReader;
  
  import org.apache.avalon.excalibur.component.DefaultRoleManager;
  import org.apache.avalon.excalibur.component.ExcaliburComponentManager;
  import org.apache.avalon.excalibur.logger.LogKitLoggerManager;
  import org.apache.avalon.excalibur.concurrent.ThreadBarrier;
  
  import org.apache.avalon.framework.configuration.Configuration;
  import org.apache.avalon.framework.configuration.ConfigurationException;
  import org.apache.avalon.framework.configuration.DefaultConfigurationBuilder;
  import org.apache.avalon.framework.context.DefaultContext;
  import org.apache.avalon.framework.logger.LogKitLogger;
  
  import org.apache.excalibur.instrument.manager.DefaultInstrumentManager;
  
  import org.apache.log.Hierarchy;
  import org.apache.log.Logger;
  import org.apache.log.Priority;
  
  /**
   * This example application loads a component which publishes a series
   *  of Instruments.  An InstrumentManager is created to collect and
   *  manage the Instrument data.  And an Altrmi based InstrumentManagerInterface
   *  is registered.  A client may connect to InstrumentManager later.
   * <p>
   * Note, this code ignores exceptions to keep the code simple.
   *
   * @author <a href="mailto:leif@apache.org">Leif Mortenson</a>
   * @version CVS $Revision: 1.1 $ $Date: 2002/08/06 16:28:37 $
   * @since 4.1
   */
  public class Main
  {
      private static ExcaliburComponentManager            m_componentManager;
      private static DefaultInstrumentManager             m_instrumentManager;
  
      /*---------------------------------------------------------------
       * Constructors
       *-------------------------------------------------------------*/
      private Main() {}
  
      /*---------------------------------------------------------------
       * Methods
       *-------------------------------------------------------------*/
      /**
       * Creates and initializes the component manager using config files.
       */
      private static void createComponentManager()
          throws Exception
      {
          // Create a context to use.
          DefaultContext context = new DefaultContext();
          // Add any context variables here.
          context.makeReadOnly();
  
          // Create a ConfigurationBuilder to parse the config files.
          DefaultConfigurationBuilder builder = new DefaultConfigurationBuilder();
  
          // Load in the configuration files
          Configuration logKitConfig     = builder.build( "../conf/logkit.xml" );
          Configuration instrumentConfig = builder.build( "../conf/instrument.xml" );
          Configuration rolesConfig      = builder.build( "../conf/roles.xml" );
          Configuration componentsConfig = builder.build( "../conf/components.xml" );
  
          // Create the default logger for the Logger Manager.
          Logger lmLogger = Hierarchy.getDefaultHierarchy().
              getLoggerFor( logKitConfig.getAttribute( "logger", "lm" ) );
          lmLogger.setPriority(
              Priority.getPriorityForName( logKitConfig.getAttribute( "log-level", "INFO" ) ) );
          
          // Setup the LogKitLoggerManager
          LogKitLoggerManager logManager = new LogKitLoggerManager(
              null, Hierarchy.getDefaultHierarchy(), new LogKitLogger( lmLogger ) );
          logManager.contextualize( context );
          logManager.configure( logKitConfig );
  
          // Set up the Instrument Manager
          DefaultInstrumentManager instrumentManager = new DefaultInstrumentManager();
          instrumentManager.enableLogging(
              logManager.getLoggerForCategory( instrumentConfig.getAttribute( "logger", "im" ) ) );
          instrumentManager.configure( instrumentConfig );
          instrumentManager.initialize();
          m_instrumentManager = instrumentManager;
  
          // Setup the RoleManager
          DefaultRoleManager roleManager = new DefaultRoleManager();
          roleManager.enableLogging(
              logManager.getLoggerForCategory( rolesConfig.getAttribute( "logger", "rm" ) ) );
          roleManager.configure( rolesConfig );
  
          // Set up the ComponentManager
          ExcaliburComponentManager componentManager = new ExcaliburComponentManager();
          componentManager.enableLogging(
              logManager.getLoggerForCategory( componentsConfig.getAttribute( "logger", "cm" ) ) );
          componentManager.setLoggerManager( logManager );
          componentManager.contextualize( context );
          componentManager.setInstrumentManager( m_instrumentManager );
          componentManager.setRoleManager( roleManager );
          componentManager.configure( componentsConfig );
          componentManager.initialize();
          m_componentManager = componentManager;
      }
  
      /*---------------------------------------------------------------
       * Main method
       *-------------------------------------------------------------*/
      /**
       * All of the guts of this example exist in the main method.
       */
      public static void main( String[] args )
          throws Exception
      {
          System.out.println( "Running the InstrumentManager Example Application" );
  
          // Create the ComponentManager
          createComponentManager();
  
          // Get a reference to the example component.
          ExampleInstrumentable instrumentable =
              (ExampleInstrumentable)m_componentManager.lookup( ExampleInstrumentable.ROLE );
          try
          {
              boolean quit = false;
              while ( !quit )
              {
                  System.out.println( "Enter the number of times that exampleAction should be "
                      + "called, or 'q' to quit." );
                  BufferedReader in = new BufferedReader( new InputStreamReader( System.in ) );
                  System.out.print( " : " );
                  String cntStr = in.readLine();
  
                  // Can get a null if CTRL-C is hit.
                  if ( ( cntStr == null ) || ( cntStr.equalsIgnoreCase( "q" ) ) )
                  {
                      quit = true;
                  }
                  else if ( ( cntStr.equalsIgnoreCase( "gc" ) ) )
                  {
                      System.gc();
                  }
                  else
                  {
                      try
                      {
                          int concurrent = 100;
                          ThreadBarrier barrier = new ThreadBarrier( concurrent );
                          int cnt = Integer.parseInt( cntStr );
                          int average = Math.max(cnt / concurrent, 1);
  
                          while (cnt > 0)
                          {
                              Thread t = new Thread( new ActionRunner( instrumentable,
                                                            Math.min(average, cnt),
                                                            barrier) );
                              t.start();
  
                              if (cnt > 0)
                              {
                                  cnt -= average;
                              }
  
                              if (cnt < 0)
                              {
                                  cnt = 0;
                              }
                          }
                      }
                      catch ( NumberFormatException e ) {}
                  }
              }
          }
          finally
          {
              // Release the component
              m_componentManager.release( instrumentable );
              instrumentable = null;
  
              // Dispose the ComponentManager
              m_componentManager.dispose();
              m_componentManager = null;
  
              // Dispose the InstrumentManager
              m_instrumentManager.dispose();
              m_instrumentManager = null;
          }
  
          System.out.println();
          System.out.println( "Exiting..." );
          System.exit(0);
      }
  
      private static final class ActionRunner implements Runnable
      {
          private final int m_numIterations;
          private final ExampleInstrumentable m_instrumentable;
          private final ThreadBarrier m_barrier;
  
          protected ActionRunner( ExampleInstrumentable instrumentable, int numIterations, ThreadBarrier barrier )
          {
              m_numIterations = numIterations;
              m_instrumentable = instrumentable;
              m_barrier = barrier;
          }
  
          public void run()
          {
              for ( int i = 0; i < m_numIterations; i++ )
              {
                  m_instrumentable.doAction();
              }
  
              try
              {
                  m_barrier.barrierSynchronize();
              }
              catch (Exception e) {}
          }
      }
  }
  
  
  
  
  1.4       +127 -38   jakarta-avalon-excalibur/component/src/java/org/apache/avalon/excalibur/component/ComponentHandler.java
  
  Index: ComponentHandler.java
  ===================================================================
  RCS file: /home/cvs/jakarta-avalon-excalibur/component/src/java/org/apache/avalon/excalibur/component/ComponentHandler.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- ComponentHandler.java	2 Jun 2002 06:03:01 -0000	1.3
  +++ ComponentHandler.java	6 Aug 2002 16:28:37 -0000	1.4
  @@ -8,6 +8,7 @@
   package org.apache.avalon.excalibur.component;
   
   import org.apache.avalon.excalibur.pool.Poolable;
  +
   import org.apache.avalon.framework.activity.Disposable;
   import org.apache.avalon.framework.activity.Initializable;
   import org.apache.avalon.framework.component.Component;
  @@ -17,30 +18,101 @@
   import org.apache.avalon.framework.thread.SingleThreaded;
   import org.apache.avalon.framework.thread.ThreadSafe;
   
  +import org.apache.excalibur.instrument.CounterInstrument;
  +import org.apache.excalibur.instrument.Instrumentable;
  +import org.apache.excalibur.instrument.InstrumentManager;
  +import org.apache.excalibur.instrument.ValueInstrument;
  +
   /**
    * This class acts like a Factory to instantiate the correct version
    * of the ComponentHandler that you need.
    *
    * @author <a href="mailto:bloritsch@apache.org">Berin Loritsch</a>
    * @author <a href="mailto:ryan@silveregg.co.jp">Ryan Shaw</a>
  - * @author <a href="mailto:leif@tanukisoftware.com">Leif Mortenson</a>
  + * @author <a href="mailto:leif@apache.org">Leif Mortenson</a>
    * @version CVS $Revision$ $Date$
    * @since 4.0
    */
   public abstract class ComponentHandler
  -    extends AbstractDualLogEnabled
  +    extends AbstractDualLogEnabledInstrumentable
       implements Initializable, Disposable
   {
       private Object m_referenceSemaphore = new Object();
       private int m_references = 0;
   
  -    public static ComponentHandler getComponentHandler(
  -        final Class componentClass,
  -        final Configuration config,
  -        final ComponentManager manager,
  -        final Context context,
  -        final RoleManager roles,
  -        final LogkitLoggerManager logkit )
  +    /** Instrument used to profile the number of outstanding references. */
  +    private ValueInstrument m_referencesInstrument;
  +
  +    /** Instrument used to profile the number of gets. */
  +    private CounterInstrument m_getsInstrument;
  +
  +    /** Instrument used to profile the number of puts. */
  +    private CounterInstrument m_putsInstrument;
  +    
  +    /*---------------------------------------------------------------
  +     * Static Methods
  +     *-------------------------------------------------------------*/
  +    /**
  +     * Looks up and returns a component handler for a given component class.
  +     *
  +     * @param componentClass Class of the component for which the handle is
  +     *                       being requested.
  +     * @param configuration The configuration for this component.
  +     * @param componentManager The ComponentLocator which will be managing
  +     *                         the Component.
  +     * @param context The current context object.
  +     * @param roleManager The current RoleManager.
  +     * @param loggerManager The current LogKitLoggerManager.
  +     * @param instrumentManager The current InstrumentManager.
  +     * @param instrumentableName The name of the handler.
  +     *
  +     * @throws Exception If there were any problems obtaining a ComponentHandler
  +     *
  +     * @deprecated This method has been deprecated in favor of the version below which
  +     *             handles instrumentation.
  +     */
  +    public static ComponentHandler getComponentHandler( final Class componentClass,
  +                                                        final Configuration configuration,
  +                                                        final ComponentManager componentManager,
  +                                                        final Context context,
  +                                                        final RoleManager roleManager,
  +                                                        final LogkitLoggerManager loggerManager )
  +        throws Exception
  +    {
  +        return ComponentHandler.getComponentHandler( componentClass,
  +                                                     configuration,
  +                                                     componentManager,
  +                                                     context,
  +                                                     roleManager,
  +                                                     loggerManager,
  +                                                     null,
  +                                                     "N/A" );
  +    }
  +    
  +    /**
  +     * Looks up and returns a component handler for a given component class.
  +     *
  +     * @param componentClass Class of the component for which the handle is
  +     *                       being requested.
  +     * @param configuration The configuration for this component.
  +     * @param componentManager The ComponentLocator which will be managing
  +     *                         the Component.
  +     * @param context The current context object.
  +     * @param roleManager The current RoleManager.
  +     * @param loggerManager The current LogKitLoggerManager.
  +     * @param instrumentManager The current InstrumentManager (May be null).
  +     * @param instrumentableName The name of the handler.
  +     *
  +     * @throws Exception If there were any problems obtaining a ComponentHandler
  +     */
  +    public static ComponentHandler getComponentHandler( final Class componentClass,
  +                                                        final Configuration configuration,
  +                                                        final ComponentManager componentManager,
  +                                                        final Context context,
  +                                                        final RoleManager roleManager,
  +                                                        final LogkitLoggerManager loggerManager,
  +                                                        final InstrumentManager instrumentManager,
  +                                                        final String instrumentableName )
           throws Exception
       {
           int numInterfaces = 0;
  @@ -65,33 +137,35 @@
               throw new Exception( "[CONFLICT] lifestyle interfaces: " + componentClass.getName() );
           }
   
  +        // Create the factory to use to create the instances of the Component.
  +        DefaultComponentFactory factory =
  +            new DefaultComponentFactory( componentClass,
  +                                         configuration,
  +                                         componentManager,
  +                                         context,
  +                                         roleManager,
  +                                         loggerManager,
  +                                         instrumentManager,
  +                                         instrumentableName );
  +
  +        ComponentHandler handler;
           if( Poolable.class.isAssignableFrom( componentClass ) )
           {
  -            return new PoolableComponentHandler( componentClass,
  -                                                 config,
  -                                                 manager,
  -                                                 context,
  -                                                 roles,
  -                                                 logkit );
  +            handler = new PoolableComponentHandler( factory, configuration );
           }
           else if( ThreadSafe.class.isAssignableFrom( componentClass ) )
           {
  -            return new ThreadSafeComponentHandler( componentClass,
  -                                                   config,
  -                                                   manager,
  -                                                   context,
  -                                                   roles,
  -                                                   logkit );
  +            handler = new ThreadSafeComponentHandler( factory, configuration );
           }
           else // This is a SingleThreaded component
           {
  -            return new DefaultComponentHandler( componentClass,
  -                                                config,
  -                                                manager,
  -                                                context,
  -                                                roles,
  -                                                logkit );
  +            handler = new DefaultComponentHandler( factory, configuration );
           }
  +
  +        // Set the instrumentable name of the handler.
  +        ((Instrumentable)handler).setInstrumentableName( instrumentableName );
  +
  +        return handler;
       }
   
       public static ComponentHandler getComponentHandler(
  @@ -122,7 +196,24 @@
   
           return new ThreadSafeComponentHandler( componentInstance );
       }
  +    
  +    /*---------------------------------------------------------------
  +     * Constructors
  +     *-------------------------------------------------------------*/
  +    /**
  +     * Creates a new ComponentHandler.
  +     */
  +    public ComponentHandler()
  +    {
  +        // Initialize the Instrumentable elements.
  +        addInstrument( m_referencesInstrument = new ValueInstrument( "references" ) );
  +        addInstrument( m_getsInstrument = new CounterInstrument( "gets" ) );
  +        addInstrument( m_putsInstrument = new CounterInstrument( "puts" ) );
  +    }
   
  +    /*---------------------------------------------------------------
  +     * Methods
  +     *-------------------------------------------------------------*/
       /**
        * Get an instance of the type of component handled by this handler.
        * <p>
  @@ -142,6 +233,10 @@
           {
               m_references++;
           }
  +        
  +        // Notify the instrument manager
  +        m_getsInstrument.increment();
  +        m_referencesInstrument.setValue( m_references );
   
           return component;
       }
  @@ -170,6 +265,10 @@
           {
               m_references--;
           }
  +        
  +        // Notify the instrument manager
  +        m_putsInstrument.increment();
  +        m_referencesInstrument.setValue( m_references );
   
           try
           {
  @@ -203,16 +302,6 @@
       {
           // This method is not abstract to make the class backwards compatible.
           throw new IllegalStateException( "This method must be overridden." );
  -    }
  -
  -    /**
  -     * Returns the current number of references.
  -     *
  -     * @return The current number of references.
  -     */
  -    protected int getReferences()
  -    {
  -        return m_references;
       }
   
       /**
  
  
  
  1.7       +117 -63   jakarta-avalon-excalibur/component/src/java/org/apache/avalon/excalibur/component/DefaultComponentFactory.java
  
  Index: DefaultComponentFactory.java
  ===================================================================
  RCS file: /home/cvs/jakarta-avalon-excalibur/component/src/java/org/apache/avalon/excalibur/component/DefaultComponentFactory.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- DefaultComponentFactory.java	16 Jul 2002 12:35:45 -0000	1.6
  +++ DefaultComponentFactory.java	6 Aug 2002 16:28:37 -0000	1.7
  @@ -9,9 +9,11 @@
   
   import java.util.ArrayList;
   import java.util.Collection;
  +
   import org.apache.avalon.excalibur.collections.BucketMap;
   import org.apache.avalon.excalibur.logger.LogKitManageable;
   import org.apache.avalon.excalibur.pool.ObjectFactory;
  +
   import org.apache.avalon.framework.activity.Disposable;
   import org.apache.avalon.framework.activity.Initializable;
   import org.apache.avalon.framework.activity.Startable;
  @@ -32,12 +34,17 @@
   import org.apache.avalon.framework.service.ServiceException;
   import org.apache.avalon.framework.service.Serviceable;
   
  +import org.apache.excalibur.instrument.Instrumentable;
  +import org.apache.excalibur.instrument.InstrumentManageable;
  +import org.apache.excalibur.instrument.InstrumentManager;
  +
   /**
    * Factory for Avalon components.
    *
    * @author <a href="mailto:bloritsch@apache.org">Berin Loritsch</a>
    * @author <a href="mailto:paul@luminas.co.uk">Paul Russell</a>
    * @author <a href="mailto:ryan@silveregg.co.jp">Ryan Shaw</a>
  + * @author <a href="mailto:leif@apache.org">Leif Mortenson</a>
    * @version CVS $Revision$ $Date$
    * @since 4.0
    */
  @@ -68,13 +75,22 @@
   
       /** The LogkitLoggerManager for child ComponentSelectors
        */
  -    private LogkitLoggerManager m_logkit;
  +    private LogkitLoggerManager m_loggerManager;
   
       /** Components created by this factory, and their associated ComponentLocator
        *  proxies, if they are Composables.
        */
       private final BucketMap m_components = new BucketMap();
   
  +    /** Instrument Manager to register objects created by this factory with (May be null). */
  +    private InstrumentManager m_instrumentManager;
  +
  +    /** Instrumentable Name assigned to objects created by this factory. */
  +    private String m_instrumentableName;
  +
  +    /*---------------------------------------------------------------
  +     * Constructors
  +     *-------------------------------------------------------------*/
       /**
        * Construct a new component factory for the specified component.
        *
  @@ -83,22 +99,64 @@
        * @param componentManager the component manager to pass to <code>Composable</code>s.
        * @param context the <code>Context</code> to pass to <code>Contexutalizable</code>s.
        * @param roles the <code>RoleManager</code> to pass to <code>DefaultComponentSelector</code>s.
  +     *
  +     * @deprecated This constructor has been deprecated in favor of the version below which
  +     *             handles instrumentation.
  +     */
  +    public DefaultComponentFactory( final Class componentClass,
  +                                    final Configuration configuration,
  +                                    final ComponentManager componentManager,
  +                                    final Context context,
  +                                    final RoleManager roles,
  +                                    final LogkitLoggerManager loggerManager )
  +    {
  +        this( componentClass,
  +              configuration,
  +              componentManager,
  +              context,
  +              roles,
  +              loggerManager,
  +              null,
  +              "N/A" );
  +    }
  +    
  +    /**
  +     * Construct a new component factory for the specified component.
  +     *
  +     * @param componentClass the class to instantiate (must have a default constructor).
  +     * @param configuration the <code>Configuration</code> object to pass to new instances.
  +     * @param componentManager the component manager to pass to <code>Composable</code>s.
  +     * @param context the <code>Context</code> to pass to <code>Contexutalizable</code>s.
  +     * @param roles the <code>RoleManager</code> to pass to
  +     *              <code>DefaultComponentSelector</code>s.
  +     * @param instrumentManager the <code>InstrumentManager</code> to register the component
  +     *                          with if it is a Instrumentable (May be null).
  +     * @param instrumentableName The instrument name to assign the component if
  +     *                           it is Initializable.
        */
       public DefaultComponentFactory( final Class componentClass,
                                       final Configuration configuration,
                                       final ComponentManager componentManager,
                                       final Context context,
                                       final RoleManager roles,
  -                                    final LogkitLoggerManager logkit )
  +                                    final LogkitLoggerManager loggerManager,
  +                                    final InstrumentManager instrumentManager,
  +                                    final String instrumentableName )
  +
       {
           m_componentClass = componentClass;
           m_configuration = configuration;
           m_componentManager = componentManager;
           m_context = context;
           m_roles = roles;
  -        m_logkit = logkit;
  +        m_loggerManager = loggerManager;
  +        m_instrumentManager = instrumentManager;
  +        m_instrumentableName = instrumentableName;
       }
  -
  +    
  +    /*---------------------------------------------------------------
  +     * ObjectFactory Methods
  +     *-------------------------------------------------------------*/
       public Object newInstance()
           throws Exception
       {
  @@ -112,7 +170,7 @@
   
           if( component instanceof LogEnabled )
           {
  -            if( null == m_logkit || null == m_configuration )
  +            if( null == m_loggerManager || null == m_configuration )
               {
                   ( (LogEnabled)component ).enableLogging( getLogger() );
               }
  @@ -127,14 +185,14 @@
                   else
                   {
                       getLogger().debug( "logger attribute is " + logger );
  -                    ( (LogEnabled)component ).enableLogging( m_logkit.getLoggerForCategory( logger ) );
  +                    ( (LogEnabled)component ).enableLogging( m_loggerManager.getLoggerForCategory( logger ) );
                   }
               }
           }
   
           if( component instanceof Loggable )
           {
  -            if( null == m_logkit || null == m_configuration )
  +            if( null == m_loggerManager || null == m_configuration )
               {
                   ( (Loggable)component ).setLogger( getLogkitLogger() );
               }
  @@ -149,15 +207,15 @@
                   else
                   {
                       getLogger().debug( "logger attribute is " + logger );
  -                    ( (Loggable)component ).setLogger( m_logkit.getLogKitLoggerForCategory( logger ) );
  +                    ( (Loggable)component ).setLogger( m_loggerManager.getLogKitLoggerForCategory( logger ) );
                   }
               }
           }
   
  -        // This was added to make it possible to implement a ProfilerComponentFactory without
  -        //  code duplication.  Once the issues there are worked out, this will most likely be
  -        //  removed as it is rather hackish.
  -        postLogger( component, m_configuration );
  +        if( ( component instanceof InstrumentManageable ) && ( m_instrumentManager != null ) )
  +        {
  +            ( (InstrumentManageable)component ).setInstrumentManager( m_instrumentManager );
  +        }
   
           if( component instanceof Contextualizable )
           {
  @@ -191,7 +249,7 @@
   
           if( component instanceof LogKitManageable )
           {
  -            ( (LogKitManageable)component ).setLogKitManager( m_logkit.getLogKitManager() );
  +            ( (LogKitManageable)component ).setLogKitManager( m_loggerManager.getLogKitManager() );
           }
   
           if( component instanceof Configurable )
  @@ -210,10 +268,17 @@
               ( (Initializable)component ).initialize();
           }
   
  -        // This was added to make it possible to implement a ProfilerComponentFactory without
  -        //  code duplication.  Once the issues there are worked out, this will most likely be
  -        //  removed as it is rather hackish.
  -        postInitialize( component, m_configuration );
  +        if( component instanceof Instrumentable )
  +        {
  +            Instrumentable instrumentable = (Instrumentable)component;
  +
  +            instrumentable.setInstrumentableName( m_instrumentableName );
  +            if ( m_instrumentManager != null )
  +            {
  +                m_instrumentManager.registerInstrumentable(
  +                    (Instrumentable)component, m_instrumentableName );
  +            }
  +        }
   
           if( component instanceof Startable )
           {
  @@ -225,56 +290,11 @@
           return component;
       }
   
  -    /**
  -     * Called after a new component is initialized, but before it is started.  This was added
  -     *  to make it possible to implement the ProfilerComponentFactory without too much duplicate
  -     *  code.  WARNING:  Do not take advantage of this method as it will most likely be removed.
  -     */
  -    protected void postLogger( Object component, Configuration configuration )
  -        throws Exception
  -    {
  -        // Do nothing in this version.
  -    }
  -
  -    /**
  -     * Called after a new component is initialized, but before it is started.  This was added
  -     *  to make it possible to implement the ProfilerComponentFactory without too much duplicate
  -     *  code.  WARNING:  Do not take advantage of this method as it will most likely be removed.
  -     */
  -    protected void postInitialize( Object component, Configuration configuration )
  -        throws Exception
  -    {
  -        // Do nothing in this version.
  -    }
  -
       public final Class getCreatedClass()
       {
           return m_componentClass;
       }
   
  -    public final void dispose()
  -    {
  -        Component[] components = new Component[ m_components.keySet().size() ];
  -
  -        m_components.keySet().toArray( components );
  -
  -        for( int i = 0; i < components.length; i++ )
  -        {
  -            try
  -            {
  -                decommission( components[ i ] );
  -            }
  -            catch( final Exception e )
  -            {
  -                if( getLogger().isWarnEnabled() )
  -                {
  -                    getLogger().warn( "Error decommissioning component: " +
  -                                      getCreatedClass().getName(), e );
  -                }
  -            }
  -        }
  -    }
  -
       public final void decommission( final Object component )
           throws Exception
       {
  @@ -309,6 +329,40 @@
           m_components.remove( component );
       }
   
  +    /*---------------------------------------------------------------
  +     * Disposable Methods
  +     *-------------------------------------------------------------*/
  +    public final void dispose()
  +    {
  +        Component[] components = new Component[ m_components.keySet().size() ];
  +
  +        m_components.keySet().toArray( components );
  +
  +        for( int i = 0; i < components.length; i++ )
  +        {
  +            try
  +            {
  +                decommission( components[ i ] );
  +            }
  +            catch( final Exception e )
  +            {
  +                if( getLogger().isWarnEnabled() )
  +                {
  +                    getLogger().warn( "Error decommissioning component: " +
  +                                      getCreatedClass().getName(), e );
  +                }
  +            }
  +        }
  +    }
  +    
  +    /*---------------------------------------------------------------
  +     * ThreadSafe Methods
  +     *-------------------------------------------------------------*/
  +    // No methods
  +    
  +    /*---------------------------------------------------------------
  +     * Methods
  +     *-------------------------------------------------------------*/
       /**
        * Proxy <code>ComponentLocator</code> class to maintain references to
        * components looked up within a <code>Composable</code> instance created
  
  
  
  1.11      +109 -13   jakarta-avalon-excalibur/component/src/java/org/apache/avalon/excalibur/component/ExcaliburComponentManager.java
  
  Index: ExcaliburComponentManager.java
  ===================================================================
  RCS file: /home/cvs/jakarta-avalon-excalibur/component/src/java/org/apache/avalon/excalibur/component/ExcaliburComponentManager.java,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- ExcaliburComponentManager.java	6 Aug 2002 14:02:12 -0000	1.10
  +++ ExcaliburComponentManager.java	6 Aug 2002 16:28:37 -0000	1.11
  @@ -8,12 +8,15 @@
   package org.apache.avalon.excalibur.component;
   
   import java.util.ArrayList;
  +import java.util.Collection;
   import java.util.Iterator;
   import java.util.List;
  +
   import org.apache.avalon.excalibur.collections.BucketMap;
   import org.apache.avalon.excalibur.logger.LogKitManageable;
   import org.apache.avalon.excalibur.logger.LogKitManager;
   import org.apache.avalon.excalibur.logger.LoggerManager;
  +
   import org.apache.avalon.framework.activity.Disposable;
   import org.apache.avalon.framework.activity.Initializable;
   import org.apache.avalon.framework.component.Component;
  @@ -26,6 +29,11 @@
   import org.apache.avalon.framework.context.Context;
   import org.apache.avalon.framework.context.Contextualizable;
   
  +import org.apache.excalibur.instrument.Instrument;
  +import org.apache.excalibur.instrument.Instrumentable;
  +import org.apache.excalibur.instrument.InstrumentManageable;
  +import org.apache.excalibur.instrument.InstrumentManager;
  +
   /**
    * Default component manager for Avalon's components.
    *
  @@ -44,7 +52,9 @@
       Initializable,
       Disposable,
       RoleManageable,
  -    LogKitManageable
  +    LogKitManageable,
  +    InstrumentManageable,
  +    Instrumentable
   {
       /** The parent ComponentLocator */
       private final ComponentManager m_parentManager;
  @@ -78,6 +88,12 @@
       /** Is the Manager initialized? */
       private boolean m_initialized;
   
  +    /** Instrument Manager being used by the Component Manager. */
  +    private InstrumentManager m_instrumentManager;
  +
  +    /** Instrumentable Name assigned to this Instrumentable */
  +    private String m_instrumentableName = "component-manager";
  +
       /*---------------------------------------------------------------
        * Constructors
        *-------------------------------------------------------------*/
  @@ -468,6 +484,11 @@
       public void initialize()
           throws Exception
       {
  +        if ( m_instrumentManager != null )
  +        {
  +            m_instrumentManager.registerInstrumentable( this, m_instrumentableName );
  +        }
  +        
           synchronized( this )
           {
               m_initialized = true;
  @@ -598,6 +619,86 @@
       }
       
       /*---------------------------------------------------------------
  +     * InstrumentManageable Methods
  +     *-------------------------------------------------------------*/
  +    /**
  +     * Sets the InstrumentManager for child components.  Can be for special
  +     * purpose components, however it is used mostly internally.
  +     *
  +     * @param instrumentManager The InstrumentManager for the component to use.
  +     */
  +    public void setInstrumentManager( InstrumentManager instrumentManager )
  +    {
  +        m_instrumentManager = instrumentManager;
  +    }
  +
  +    /*---------------------------------------------------------------
  +     * Instrumentable Methods
  +     *-------------------------------------------------------------*/
  +    /**
  +     * Sets the name for the Instrumentable.  The Instrumentable Name is used
  +     *  to uniquely identify the Instrumentable during the configuration of
  +     *  the InstrumentManager and to gain access to an InstrumentableDescriptor
  +     *  through the InstrumentManager.  The value should be a string which does
  +     *  not contain spaces or periods.
  +     * <p>
  +     * This value may be set by a parent Instrumentable, or by the
  +     *  InstrumentManager using the value of the 'instrumentable' attribute in
  +     *  the configuration of the component.
  +     *
  +     * @param name The name used to identify a Instrumentable.
  +     */
  +    public void setInstrumentableName( String name )
  +    {
  +        m_instrumentableName = name;
  +    }
  +
  +    /**
  +     * Gets the name of the Instrumentable.
  +     *
  +     * @return The name used to identify a Instrumentable.
  +     */
  +    public String getInstrumentableName()
  +    {
  +        return m_instrumentableName;
  +    }
  +
  +    /**
  +     * Obtain a reference to all the Instruments that the Instrumentable object
  +     *  wishes to expose.  All sampling is done directly through the
  +     *  Instruments as opposed to the Instrumentable interface.
  +     *
  +     * @return An array of the Instruments available for profiling.  Should
  +     *         never be null.  If there are no Instruments, then
  +     *         EMPTY_INSTRUMENT_ARRAY can be returned.  This should never be
  +     *         the case though unless there are child Instrumentables with
  +     *         Instruments.
  +     */
  +    public Instrument[] getInstruments()
  +    {
  +        return Instrumentable.EMPTY_INSTRUMENT_ARRAY;
  +    }
  +
  +    /**
  +     * Any Object which implements Instrumentable can also make use of other
  +     *  Instrumentable child objects.  This method is used to tell the
  +     *  InstrumentManager about them.
  +     *
  +     * @return An array of child Instrumentables.  This method should never
  +     *         return null.  If there are no child Instrumentables, then
  +     *         EMPTY_INSTRUMENTABLE_ARRAY can be returned.
  +     */
  +    public Instrumentable[] getChildInstrumentables()
  +    {
  +        // Get the values. This set is created for this call and thus thread safe.
  +        Collection values = m_componentHandlers.values();
  +        Instrumentable[] children = new Instrumentable[ values.size() ];
  +        values.toArray( children );
  +
  +        return children;
  +    }
  +    
  +    /*---------------------------------------------------------------
        * Methods
        *-------------------------------------------------------------*/
       private void removeDisposedHandlers( List disposed )
  @@ -643,22 +744,17 @@
                                                       final LogkitLoggerManager logkitManager )
           throws Exception
       {
  +        String instrumentableName =
  +            configuration.getAttribute( "instrumentable", configuration.getName() );
  +        
           return ComponentHandler.getComponentHandler( componentClass,
                                                        configuration,
                                                        this,
                                                        context,
                                                        roleManager,
  -                                                     logkitManager );
  -    }
  -
  -    /**
  -     * Makes the ComponentHandlers available to subclasses.
  -     *
  -     * @return A collection of the reference to the componentHandler Map.
  -     */
  -    protected BucketMap getComponentHandlers()
  -    {
  -        return m_componentHandlers;
  +                                                     logkitManager,
  +                                                     m_instrumentManager,
  +                                                     instrumentableName );
       }
   
       /**
  
  
  
  1.11      +284 -148  jakarta-avalon-excalibur/component/src/java/org/apache/avalon/excalibur/component/ExcaliburComponentSelector.java
  
  Index: ExcaliburComponentSelector.java
  ===================================================================
  RCS file: /home/cvs/jakarta-avalon-excalibur/component/src/java/org/apache/avalon/excalibur/component/ExcaliburComponentSelector.java,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- ExcaliburComponentSelector.java	28 Jun 2002 03:34:25 -0000	1.10
  +++ ExcaliburComponentSelector.java	6 Aug 2002 16:28:38 -0000	1.11
  @@ -8,12 +8,15 @@
   package org.apache.avalon.excalibur.component;
   
   import java.util.ArrayList;
  +import java.util.Collection;
   import java.util.Iterator;
   import java.util.List;
  +
   import org.apache.avalon.excalibur.collections.BucketMap;
   import org.apache.avalon.excalibur.logger.LogKitManageable;
   import org.apache.avalon.excalibur.logger.LogKitManager;
   import org.apache.avalon.excalibur.logger.LoggerManager;
  +
   import org.apache.avalon.framework.activity.Disposable;
   import org.apache.avalon.framework.activity.Initializable;
   import org.apache.avalon.framework.component.Component;
  @@ -28,11 +31,17 @@
   import org.apache.avalon.framework.context.Contextualizable;
   import org.apache.avalon.framework.thread.ThreadSafe;
   
  +import org.apache.excalibur.instrument.Instrument;
  +import org.apache.excalibur.instrument.Instrumentable;
  +import org.apache.excalibur.instrument.InstrumentManageable;
  +import org.apache.excalibur.instrument.InstrumentManager;
  +
   /**
    * Default component selector for Avalon's components.
    *
    * @author <a href="mailto:bloritsch@apache.org">Berin Loritsch</a>
    * @author <a href="mailto:paul@luminas.co.uk">Paul Russell</a>
  + * @author <a href="mailto:leif@apache.org">Leif Mortenson</a>
    * @version CVS $Revision$ $Date$
    * @since 4.0
    */
  @@ -46,7 +55,9 @@
       ThreadSafe,
       Disposable,
       RoleManageable,
  -    LogKitManageable
  +    LogKitManageable,
  +    InstrumentManageable,
  +    Instrumentable
   {
       /** The classloader used for this system. */
       private final ClassLoader m_loader;
  @@ -95,6 +106,15 @@
        */
       private LogkitLoggerManager m_logkit;
   
  +    /** Instrument Manager to register objects created by this selector with (May be null). */
  +    private InstrumentManager m_instrumentManager;
  +
  +    /** Instrumentable Name assigned to this Instrumentable */
  +    private String m_instrumentableName;
  +
  +    /*---------------------------------------------------------------
  +     * Constructors
  +     *-------------------------------------------------------------*/
       /** Create the ComponentSelector */
       public ExcaliburComponentSelector()
       {
  @@ -114,6 +134,9 @@
           }
       }
   
  +    /*---------------------------------------------------------------
  +     * Contextualizable Methods
  +     *-------------------------------------------------------------*/
       /** Provide the application Context.
        */
       public void contextualize( final Context context )
  @@ -124,108 +147,9 @@
           }
       }
   
  -    /** Compose the ComponentSelector so that we know what the parent ComponentLocator is.
  -     */
  -    public void compose( final ComponentManager componentManager )
  -        throws ComponentException
  -    {
  -        //HACK: Is this necessary???
  -        if( null == m_componentManager )
  -        {
  -            m_componentManager = componentManager;
  -        }
  -    }
  -
  -    /** Properly initialize of the Child handlers.
  -     */
  -    public void initialize()
  -    {
  -        synchronized( this )
  -        {
  -            m_initialized = true;
  -
  -            List keys = new ArrayList( m_componentHandlers.keySet() );
  -
  -            for( int i = 0; i < keys.size(); i++ )
  -            {
  -                final Object key = keys.get( i );
  -                final ComponentHandler handler =
  -                    (ComponentHandler)m_componentHandlers.get( key );
  -
  -                try
  -                {
  -                    handler.initialize();
  -                }
  -                catch( Exception e )
  -                {
  -                    if( getLogger().isDebugEnabled() )
  -                    {
  -                        getLogger().debug( "Caught an exception trying to initialize " +
  -                                           "of the component handler.", e );
  -                    }
  -                }
  -
  -            }
  -        }
  -    }
  -
  -    /**
  -     * Tests for existence of a component.
  -     */
  -    public boolean hasComponent( final Object hint )
  -    {
  -        if( !m_initialized ) return false;
  -        if( m_disposed ) return false;
  -
  -        boolean exists = false;
  -
  -        try
  -        {
  -            ComponentHandler handler = (ComponentHandler)m_componentHandlers.get( hint );
  -            exists = (handler != null);
  -        }
  -        catch( Throwable t )
  -        {
  -            // We can safely ignore all exceptions
  -        }
  -
  -        return exists;
  -    }
  -
  -    /**
  -     * Properly dispose of all the ComponentHandlers.
  -     */
  -    public void dispose()
  -    {
  -        synchronized( this )
  -        {
  -            Iterator keys = m_componentHandlers.keySet().iterator();
  -            List keyList = new ArrayList();
  -
  -            while( keys.hasNext() )
  -            {
  -                Object key = keys.next();
  -                ComponentHandler handler =
  -                    (ComponentHandler)m_componentHandlers.get( key );
  -
  -                handler.dispose();
  -
  -                keyList.add( key );
  -            }
  -
  -            keys = keyList.iterator();
  -
  -            while( keys.hasNext() )
  -            {
  -                m_componentHandlers.remove( keys.next() );
  -            }
  -
  -            keyList.clear();
  -
  -            m_disposed = true;
  -        }
  -    }
  -
  +    /*---------------------------------------------------------------
  +     * ComponentSelector Methods
  +     *-------------------------------------------------------------*/
       /**
        * Return an instance of a component based on a hint.  The Composable has already selected the
        * role, so the only part left it to make sure the Component is handled.
  @@ -307,6 +231,94 @@
       }
   
       /**
  +     * Tests for existence of a component.
  +     */
  +    public boolean hasComponent( final Object hint )
  +    {
  +        if( !m_initialized ) return false;
  +        if( m_disposed ) return false;
  +
  +        boolean exists = false;
  +
  +        try
  +        {
  +            ComponentHandler handler = (ComponentHandler)m_componentHandlers.get( hint );
  +            exists = (handler != null);
  +        }
  +        catch( Throwable t )
  +        {
  +            // We can safely ignore all exceptions
  +        }
  +
  +        return exists;
  +    }
  +
  +    /**
  +     * Release the Component to the propper ComponentHandler.
  +     */
  +    public void release( final Component component )
  +    {
  +        if( null == component )
  +        {
  +            getLogger().warn( "Attempted to release a null component." );
  +            return;
  +        }
  +
  +        final ComponentHandler handler =
  +            (ComponentHandler)m_componentMapping.get( component );
  +
  +        if( null == handler )
  +        {
  +            getLogger().warn( "Attempted to release a " + component.getClass().getName() +
  +                              " but its handler could not be located." );
  +            return;
  +        }
  +
  +        // ThreadSafe components will always be using a ThreadSafeComponentHandler,
  +        //  they will only have a single entry in the m_componentMapping map which
  +        //  should not be removed until the ComponentLocator is disposed.  All
  +        //  other components have an entry for each instance which should be
  +        //  removed.
  +        if( !( handler instanceof ThreadSafeComponentHandler ) )
  +        {
  +            // Remove the component before calling put.  This is critical to avoid the
  +            //  problem where another thread calls put on the same component before
  +            //  remove can be called.
  +            m_componentMapping.remove( component );
  +        }
  +
  +        try
  +        {
  +            handler.put( component );
  +        }
  +        catch( Exception e )
  +        {
  +            if( getLogger().isDebugEnabled() )
  +            {
  +                getLogger().debug( "Error trying to release component", e );
  +            }
  +        }
  +    }
  +
  +    /*---------------------------------------------------------------
  +     * Composable Methods
  +     *-------------------------------------------------------------*/
  +    /** Compose the ComponentSelector so that we know what the parent ComponentLocator is.
  +     */
  +    public void compose( final ComponentManager componentManager )
  +        throws ComponentException
  +    {
  +        //HACK: Is this necessary???
  +        if( null == m_componentManager )
  +        {
  +            m_componentManager = componentManager;
  +        }
  +    }
  +
  +    /*---------------------------------------------------------------
  +     * Configurable Methods
  +     *-------------------------------------------------------------*/
  +    /**
        * Default Configuration handler for ComponentSelector.
        */
       public void configure( final Configuration configuration )
  @@ -385,6 +397,87 @@
           }
       }
   
  +    /*---------------------------------------------------------------
  +     * Initializable Methods
  +     *-------------------------------------------------------------*/
  +    /** Properly initialize of the Child handlers.
  +     */
  +    public void initialize()
  +    {
  +        synchronized( this )
  +        {
  +            m_initialized = true;
  +
  +            List keys = new ArrayList( m_componentHandlers.keySet() );
  +
  +            for( int i = 0; i < keys.size(); i++ )
  +            {
  +                final Object key = keys.get( i );
  +                final ComponentHandler handler =
  +                    (ComponentHandler)m_componentHandlers.get( key );
  +
  +                try
  +                {
  +                    handler.initialize();
  +                }
  +                catch( Exception e )
  +                {
  +                    if( getLogger().isDebugEnabled() )
  +                    {
  +                        getLogger().debug( "Caught an exception trying to initialize " +
  +                                           "of the component handler.", e );
  +                    }
  +                }
  +
  +            }
  +        }
  +    }
  +
  +    /*---------------------------------------------------------------
  +     * ThreadSafe Methods
  +     *-------------------------------------------------------------*/
  +    // No methods
  +
  +    /*---------------------------------------------------------------
  +     * Disposable Methods
  +     *-------------------------------------------------------------*/
  +    /**
  +     * Properly dispose of all the ComponentHandlers.
  +     */
  +    public void dispose()
  +    {
  +        synchronized( this )
  +        {
  +            Iterator keys = m_componentHandlers.keySet().iterator();
  +            List keyList = new ArrayList();
  +
  +            while( keys.hasNext() )
  +            {
  +                Object key = keys.next();
  +                ComponentHandler handler =
  +                    (ComponentHandler)m_componentHandlers.get( key );
  +
  +                handler.dispose();
  +
  +                keyList.add( key );
  +            }
  +
  +            keys = keyList.iterator();
  +
  +            while( keys.hasNext() )
  +            {
  +                m_componentHandlers.remove( keys.next() );
  +            }
  +
  +            keyList.clear();
  +
  +            m_disposed = true;
  +        }
  +    }
  +
  +    /*---------------------------------------------------------------
  +     * RoleManageable Methods
  +     *-------------------------------------------------------------*/
       /**
        * Configure the RoleManager
        */
  @@ -396,7 +489,9 @@
           }
       }
   
  -
  +    /*---------------------------------------------------------------
  +     * LogKitManageable Methods
  +     *-------------------------------------------------------------*/
       /**
        * Configure the LogKitManager
        */
  @@ -408,61 +503,97 @@
           }
       }
   
  +    /*---------------------------------------------------------------
  +     * InstrumentManageable Methods
  +     *-------------------------------------------------------------*/
       /**
  -     * Configure the LoggerManager.
  +     * Sets the InstrumentManager for child components.  Can be for special
  +     * purpose components, however it is used mostly internally.
  +     *
  +     * @param instrumentManager The InstrumentManager for the component to use.
        */
  -    public void setLoggerManager( final LoggerManager logkit )
  +    public void setInstrumentManager( final InstrumentManager instrumentManager )
       {
  -        if( null == m_logkit )
  -        {
  -            m_logkit = new LogkitLoggerManager( logkit, null );
  -        }
  +        m_instrumentManager = instrumentManager;
       }
   
  +    /*---------------------------------------------------------------
  +     * Instrumentable Methods
  +     *-------------------------------------------------------------*/
       /**
  -     * Release the Component to the propper ComponentHandler.
  +     * Sets the name for the Instrumentable.  The Instrumentable Name is used
  +     *  to uniquely identify the Instrumentable during the configuration of
  +     *  the InstrumentManager and to gain access to an InstrumentableDescriptor
  +     *  through the InstrumentManager.  The value should be a string which does
  +     *  not contain spaces or periods.
  +     * <p>
  +     * This value may be set by a parent Instrumentable, or by the
  +     *  InstrumentManager using the value of the 'instrumentable' attribute in
  +     *  the configuration of the component.
  +     *
  +     * @param name The name used to identify a Instrumentable.
        */
  -    public void release( final Component component )
  +    public void setInstrumentableName( String name )
       {
  -        if( null == component )
  -        {
  -            getLogger().warn( "Attempted to release a null component." );
  -            return;
  -        }
  +        m_instrumentableName = name;
  +    }
   
  -        final ComponentHandler handler =
  -            (ComponentHandler)m_componentMapping.get( component );
  +    /**
  +     * Gets the name of the Instrumentable.
  +     *
  +     * @return The name used to identify a Instrumentable.
  +     */
  +    public String getInstrumentableName()
  +    {
  +        return m_instrumentableName;
  +    }
   
  -        if( null == handler )
  -        {
  -            getLogger().warn( "Attempted to release a " + component.getClass().getName() +
  -                              " but its handler could not be located." );
  -            return;
  -        }
  +    /**
  +     * Obtain a reference to all the Instruments that the Instrumentable object
  +     *  wishes to expose.  All sampling is done directly through the
  +     *  Instruments as opposed to the Instrumentable interface.
  +     *
  +     * @return An array of the Instruments available for profiling.  Should
  +     *         never be null.  If there are no Instruments, then
  +     *         EMPTY_INSTRUMENT_ARRAY can be returned.  This should never be
  +     *         the case though unless there are child Instrumentables with
  +     *         Instruments.
  +     */
  +    public Instrument[] getInstruments()
  +    {
  +        return Instrumentable.EMPTY_INSTRUMENT_ARRAY;
  +    }
   
  -        // ThreadSafe components will always be using a ThreadSafeComponentHandler,
  -        //  they will only have a single entry in the m_componentMapping map which
  -        //  should not be removed until the ComponentLocator is disposed.  All
  -        //  other components have an entry for each instance which should be
  -        //  removed.
  -        if( !( handler instanceof ThreadSafeComponentHandler ) )
  -        {
  -            // Remove the component before calling put.  This is critical to avoid the
  -            //  problem where another thread calls put on the same component before
  -            //  remove can be called.
  -            m_componentMapping.remove( component );
  -        }
  +    /**
  +     * Any Object which implements Instrumentable can also make use of other
  +     *  Instrumentable child objects.  This method is used to tell the
  +     *  InstrumentManager about them.
  +     *
  +     * @return An array of child Instrumentables.  This method should never
  +     *         return null.  If there are no child Instrumentables, then
  +     *         EMPTY_INSTRUMENTABLE_ARRAY can be returned.
  +     */
  +    public Instrumentable[] getChildInstrumentables()
  +    {
  +        // Get the values. This set is created for this call and thus thread safe.
  +        Collection values = getComponentHandlers().values();
  +        Instrumentable[] children = new Instrumentable[ values.size() ];
  +        values.toArray( children );
   
  -        try
  -        {
  -            handler.put( component );
  -        }
  -        catch( Exception e )
  +        return children;
  +    }
  +
  +    /*---------------------------------------------------------------
  +     * Methods
  +     *-------------------------------------------------------------*/
  +    /**
  +     * Configure the LoggerManager.
  +     */
  +    public void setLoggerManager( final LoggerManager logkit )
  +    {
  +        if( null == m_logkit )
           {
  -            if( getLogger().isDebugEnabled() )
  -            {
  -                getLogger().debug( "Error trying to release component", e );
  -            }
  +            m_logkit = new LogkitLoggerManager( logkit, null );
           }
       }
   
  @@ -490,12 +621,17 @@
                                                       final LogkitLoggerManager logkitManager )
           throws Exception
       {
  +        String instrumentableName =
  +            configuration.getAttribute( "instrumentable", configuration.getAttribute( "name" ) );
  +
           return ComponentHandler.getComponentHandler( componentClass,
                                                        configuration,
                                                        componentManager,
                                                        context,
                                                        roleManager,
  -                                                     logkitManager );
  +                                                     logkitManager,
  +                                                     m_instrumentManager,
  +                                                     instrumentableName );
       }
   
       /**
  
  
  
  1.5       +4 -12     jakarta-avalon-excalibur/component/src/java/org/apache/avalon/excalibur/component/PoolableComponentHandler.java
  
  Index: PoolableComponentHandler.java
  ===================================================================
  RCS file: /home/cvs/jakarta-avalon-excalibur/component/src/java/org/apache/avalon/excalibur/component/PoolableComponentHandler.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- PoolableComponentHandler.java	2 Jun 2002 06:03:01 -0000	1.4
  +++ PoolableComponentHandler.java	6 Aug 2002 16:28:38 -0000	1.5
  @@ -77,7 +77,7 @@
    * </ul>
    *
    * @author <a href="mailto:bloritsch@apache.org">Berin Loritsch</a>
  - * @author <a href="mailto:leif@tanukisoftware.com">Leif Mortenson</a>
  + * @author <a href="mailto:leif@apache.org">Leif Mortenson</a>
    * @author <a href="mailto:ryan@silveregg.co.jp">Ryan Shaw</a>
    * @version CVS $Revision$ $Date$
    * @since 4.0
  @@ -140,6 +140,8 @@
   
           m_pool = new ResourceLimitingPool( m_factory, poolMax, poolMaxStrict, poolBlocking,
                                              poolTimeout, poolTrimInterval );
  +        // Initialize the Instrumentable elements.
  +        addChildInstrumentable( m_pool );
       }
   
       /**
  @@ -213,15 +215,5 @@
           }
   
           m_disposed = true;
  -    }
  -
  -    /**
  -     * Gives subclasses access to the pool.
  -     *
  -     * @return The internal pool
  -     */
  -    protected ResourceLimitingPool getPool()
  -    {
  -        return m_pool;
       }
   }
  
  
  
  1.4       +2 -2      jakarta-avalon-excalibur/component/src/java/org/apache/avalon/excalibur/component/ThreadSafeComponentHandler.java
  
  Index: ThreadSafeComponentHandler.java
  ===================================================================
  RCS file: /home/cvs/jakarta-avalon-excalibur/component/src/java/org/apache/avalon/excalibur/component/ThreadSafeComponentHandler.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- ThreadSafeComponentHandler.java	2 Jun 2002 06:03:01 -0000	1.3
  +++ ThreadSafeComponentHandler.java	6 Aug 2002 16:28:38 -0000	1.4
  @@ -20,7 +20,7 @@
    *
    * @author <a href="mailto:bloritsch@apache.org">Berin Loritsch</a>
    * @author <a href="mailto:ryan@silveregg.co.jp">Ryan Shaw</a>
  - * @author <a href="mailto:leif@tanukisoftware.com">Leif Mortenson</a>
  + * @author <a href="mailto:leif@apache.org">Leif Mortenson</a>
    * @version CVS $Revision$ $Date$
    * @since 4.0
    */
  
  
  
  1.1                  jakarta-avalon-excalibur/component/src/java/org/apache/avalon/excalibur/component/AbstractDualLogEnabledInstrumentable.java
  
  Index: AbstractDualLogEnabledInstrumentable.java
  ===================================================================
  /*
   * Copyright (C) The Apache Software Foundation. All rights reserved.
   *
   * This software is published under the terms of the Apache Software License
   * version 1.1, a copy of which has been included with this distribution in
   * the LICENSE.txt file.
   */
  package org.apache.avalon.excalibur.component;
  
  import java.util.ArrayList;
  
  import org.apache.excalibur.instrument.Instrument;
  import org.apache.excalibur.instrument.Instrumentable;
  
  /**
   * Utility class to ease the construction of components that can be instrumented
   *  but must also extend AbstractDualLogEnabled.
   * <p>
   * Subclasses should call <code>addInstrument</code> or
   *  <code>addChildInstrumentable</code> as part of the component's
   *  initialization.
   *
   * @author <a href="mailto:leif@apache.org">Leif Mortenson</a>
   */
  public abstract class AbstractDualLogEnabledInstrumentable
      extends AbstractDualLogEnabled
      implements Instrumentable
  {
      /** Name of the instrumentable. */
      private String m_instrumentableName;
  
      /** Stores the instruments during initialization. */
      private ArrayList m_instrumentList;
  
      /** Stores the child instrumentables during initialization. */
      private ArrayList m_childList;
  
      /** Flag which is to used to keep track of when the Instrumentable has been registered. */
      private boolean m_registered;
  
      /*---------------------------------------------------------------
       * Constructors
       *-------------------------------------------------------------*/
      /**
       * Creates a new AbstractLogEnabledInstrumentable.
       */
      protected AbstractDualLogEnabledInstrumentable()
      {
          m_registered = false;
          m_instrumentList = new ArrayList();
          m_childList = new ArrayList();
      }
  
      /*---------------------------------------------------------------
       * Methods
       *-------------------------------------------------------------*/
      /**
       * Adds an Instrument to the list of Instruments published by the component.
       *  This method may not be called after the Instrumentable has been
       *  registered with the InstrumentManager.
       *
       * @param instrument Instrument to publish.
       */
      protected void addInstrument( Instrument instrument )
      {
          if( m_registered )
          {
              throw new IllegalStateException( "Instruments can not be added after the "
                  + "Instrumentable is registered with the InstrumentManager." );
          }
          m_instrumentList.add( instrument );
      }
  
      /**
       * Adds a child Instrumentable to the list of child Instrumentables
       *  published by the component.  This method may not be called after the
       *  Instrumentable has been registered with the InstrumentManager.
       * <p>
       * Note that Child Instrumentables must be named by the caller using the
       *  setInstrumentableName method.
       *
       * @param child Child Instrumentable to publish.
       */
      protected void addChildInstrumentable( Instrumentable child )
      {
          if( m_registered )
          {
              throw new IllegalStateException( "Child Instrumentables can not be added after the "
                  + "Instrumentable is registered with the InstrumentManager." );
          }
          m_childList.add( child );
      }
  
      /*---------------------------------------------------------------
       * Instrumentable Methods
       *-------------------------------------------------------------*/
      /**
       * Gets the name of the Instrumentable.
       *
       * @return The name used to identify a Instrumentable.
       */
      public final String getInstrumentableName()
      {
          return m_instrumentableName;
      }
  
      /**
       * Sets the name for the Instrumentable.  The Instrumentable Name is used
       *  to uniquely identify the Instrumentable during the configuration of
       *  the InstrumentManager and to gain access to an InstrumentableDescriptor
       *  through the InstrumentManager.  The value should be a string which does
       *  not contain spaces or periods.
       * <p>
       * This value may be set by a parent Instrumentable, or by the
       *  InstrumentManager using the value of the 'instrumentable' attribute in
       *  the configuration of the component.
       *
       * @param name The name used to identify a Instrumentable.
       */
      public final void setInstrumentableName( String name )
      {
          m_instrumentableName = name;
      }
  
      /**
       * Any Object which implements Instrumentable can also make use of other
       *  Instrumentable child objects.  This method is used to tell the
       *  InstrumentManager about them.
       *
       * @return An array of child Instrumentables.  This method should never
       *         return null.  If there are no child Instrumentables, then
       *         EMPTY_INSTRUMENTABLE_ARRAY can be returned.
       */
      public final Instrumentable[] getChildInstrumentables()
      {
          m_registered = true;
          if( m_childList.size() == 0 )
          {
              return Instrumentable.EMPTY_INSTRUMENTABLE_ARRAY;
          }
          else
          {
              Instrumentable[] children = new Instrumentable[ m_childList.size() ];
              m_childList.toArray( children );
              return children;
          }
      }
  
      /**
       * Obtain a reference to all the Instruments that the Instrumentable object
       *  wishes to expose.  All sampling is done directly through the
       *  Instruments as opposed to the Instrumentable interface.
       *
       * @return An array of the Instruments available for profiling.  Should
       *         never be null.  If there are no Instruments, then
       *         EMPTY_INSTRUMENT_ARRAY can be returned.  This should never be
       *         the case though unless there are child Instrumentables with
       *         Instruments.
       */
      public final Instrument[] getInstruments()
      {
          m_registered = true;
          if( m_instrumentList.size() == 0 )
          {
              return Instrumentable.EMPTY_INSTRUMENT_ARRAY;
          }
          else
          {
              Instrument[] instruments = new Instrument[ m_instrumentList.size() ];
              m_instrumentList.toArray( instruments );
              return instruments;
          }
      }
  }
  
  
  

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