You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by ni...@apache.org on 2008/03/05 11:48:54 UTC

svn commit: r633810 [1/3] - in /commons/sandbox/monitoring/trunk: ./ src/main/java/org/apache/commons/monitoring/ src/main/java/org/apache/commons/monitoring/impl/ src/main/java/org/apache/commons/monitoring/impl/monitors/ src/main/java/org/apache/comm...

Author: nicolas
Date: Wed Mar  5 02:48:38 2008
New Revision: 633810

URL: http://svn.apache.org/viewvc?rev=633810&view=rev
Log:
- implementations refactored as a class hierarchy, beeing easier to extend and cleaner to discover repository features
- dedicated packages for component implementations
- reporting for HTML output
- web UI servlet extending HTML reporting with JavaScript enhancements (JQuery)

Added:
    commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/monitors/
    commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/monitors/AbstractMonitor.java   (contents, props changed)
      - copied, changed from r632970, commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/AbstractMonitor.java
    commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/monitors/CompositeValuesMonitor.java   (contents, props changed)
      - copied, changed from r632970, commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/CompositeValuesMonitor.java
    commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/monitors/CreateValuesOnDemandMonitor.java   (contents, props changed)
      - copied, changed from r632970, commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/CreateValuesOnDemandMonitor.java
    commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/monitors/ObservableMonitor.java   (contents, props changed)
      - copied, changed from r632970, commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/ListenableMonitor.java
    commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/repositories/
    commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/repositories/AbstractRepository.java   (contents, props changed)
      - copied, changed from r632970, commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/AbstractRepository.java
    commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/repositories/ConfigurableImplementationsRepository.java   (with props)
    commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/repositories/CreateMonitorsOnDemandRepository.java   (with props)
    commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/repositories/DefaultRepository.java   (contents, props changed)
      - copied, changed from r632970, commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/DefaultRepository.java
    commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/repositories/ObservableRepository.java   (with props)
    commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/stopwatches/
    commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/stopwatches/DefaultStopWatch.java
      - copied, changed from r632970, commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/DefaultStopWatch.java
    commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/stopwatches/ExecutionStopWatch.java   (with props)
    commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/values/
    commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/values/AbstractStatValue.java   (contents, props changed)
      - copied, changed from r632970, commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/AbstractStatValue.java
    commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/values/CompositeCounter.java   (contents, props changed)
      - copied, changed from r632970, commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/CompositeCounter.java
    commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/values/CompositeGauge.java   (contents, props changed)
      - copied, changed from r632970, commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/CompositeGauge.java
    commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/values/ThreadSafeCounter.java   (contents, props changed)
      - copied, changed from r632970, commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/ThreadSafeCounter.java
    commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/values/ThreadSafeGauge.java   (contents, props changed)
      - copied, changed from r632970, commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/ThreadSafeGauge.java
    commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/HtmlRenderer.java   (with props)
    commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/Selector.java   (with props)
    commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/SelectorPeriodicLogger.java   (contents, props changed)
      - copied, changed from r632970, commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/AppendToFilePeriodicLogger.java
    commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/web/
    commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/web/MonitoringServlet.java   (with props)
    commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/web/NiceHtmlRenderer.java   (with props)
    commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/web/WebUIServlet.java   (with props)
    commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/support/java13/README.txt   (props changed)
      - copied unchanged from r632970, commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/support/java13/README
    commons/sandbox/monitoring/trunk/src/main/resources/JQUERY-LICENSE.txt   (with props)
    commons/sandbox/monitoring/trunk/src/main/resources/asc.gif   (with props)
    commons/sandbox/monitoring/trunk/src/main/resources/commons-monitoring.css   (with props)
    commons/sandbox/monitoring/trunk/src/main/resources/commons-monitoring.js   (with props)
    commons/sandbox/monitoring/trunk/src/main/resources/desc.gif   (with props)
    commons/sandbox/monitoring/trunk/src/main/resources/jquery-1.2.3.pack.js   (with props)
    commons/sandbox/monitoring/trunk/src/main/resources/jquery.tablesorter.pack.js   (with props)
    commons/sandbox/monitoring/trunk/src/main/webapp/
    commons/sandbox/monitoring/trunk/src/main/webapp/WEB-INF/
    commons/sandbox/monitoring/trunk/src/main/webapp/WEB-INF/web.xml   (with props)
    commons/sandbox/monitoring/trunk/src/main/webapp/test.html   (with props)
    commons/sandbox/monitoring/trunk/src/test/java/org/apache/commons/monitoring/reporting/SelectorTest.java   (with props)
    commons/sandbox/monitoring/trunk/src/test/resources/org/apache/commons/monitoring/reporting/RendererTest.html   (with props)
Removed:
    commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/AbstractMonitor.java
    commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/AbstractRepository.java
    commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/AbstractStatValue.java
    commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/CompositeCounter.java
    commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/CompositeGauge.java
    commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/CompositeValuesMonitor.java
    commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/CreateValuesOnDemandMonitor.java
    commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/DefaultRepository.java
    commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/DefaultStopWatch.java
    commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/ListenableMonitor.java
    commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/ThreadSafeCounter.java
    commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/ThreadSafeGauge.java
    commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/AppendToFilePeriodicLogger.java
    commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/support/java13/README
Modified:
    commons/sandbox/monitoring/trunk/pom.xml
    commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/ExecutionStack.java
    commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/Monitor.java
    commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/Monitoring.java
    commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/Repository.java
    commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/StatValue.java
    commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/SecondaryMonitor.java
    commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/SecondaryRepository.java
    commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/AbstractPeriodicLogger.java
    commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/AbstractRenderer.java
    commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/JsonRenderer.java
    commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/Renderer.java
    commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/TxtRenderer.java
    commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/XmlRenderer.java
    commons/sandbox/monitoring/trunk/src/site/xdoc/instrumentation.xml
    commons/sandbox/monitoring/trunk/src/site/xdoc/listeners.xml
    commons/sandbox/monitoring/trunk/src/test/java/org/apache/commons/monitoring/ExecutionStackTest.java
    commons/sandbox/monitoring/trunk/src/test/java/org/apache/commons/monitoring/MonitoringTest.java
    commons/sandbox/monitoring/trunk/src/test/java/org/apache/commons/monitoring/StopWatchTest.java
    commons/sandbox/monitoring/trunk/src/test/java/org/apache/commons/monitoring/impl/CompositeValuesMonitorTest.java
    commons/sandbox/monitoring/trunk/src/test/java/org/apache/commons/monitoring/impl/DefaultRepositoryTest.java
    commons/sandbox/monitoring/trunk/src/test/java/org/apache/commons/monitoring/impl/ThreadSafeCounterTest.java
    commons/sandbox/monitoring/trunk/src/test/java/org/apache/commons/monitoring/impl/ThreadSafeGaugeTest.java
    commons/sandbox/monitoring/trunk/src/test/java/org/apache/commons/monitoring/listener/SecondaryReposioryTest.java
    commons/sandbox/monitoring/trunk/src/test/java/org/apache/commons/monitoring/listener/ThresholdListenerTest.java
    commons/sandbox/monitoring/trunk/src/test/java/org/apache/commons/monitoring/reporting/RendererTest.java
    commons/sandbox/monitoring/trunk/src/test/resources/org/apache/commons/monitoring/reporting/RendererTest.js

Modified: commons/sandbox/monitoring/trunk/pom.xml
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/pom.xml?rev=633810&r1=633809&r2=633810&view=diff
==============================================================================
--- commons/sandbox/monitoring/trunk/pom.xml (original)
+++ commons/sandbox/monitoring/trunk/pom.xml Wed Mar  5 02:48:38 2008
@@ -36,6 +36,14 @@
 
   <dependencies>
     <dependency>
+      <groupId>javax.servlet</groupId>
+      <artifactId>servlet-api</artifactId>
+      <version>2.3</version>
+      <scope>provided</scope>
+      <optional>true</optional>
+    </dependency>
+
+    <dependency>
       <groupId>junit</groupId>
       <artifactId>junit</artifactId>
       <version>3.8.1</version>
@@ -167,6 +175,20 @@
           </execution>
         </executions>
       </plugin>
+
+      <plugin>
+        <!-- to manually test the Web UI -->
+        <groupId>org.mortbay.jetty</groupId>
+        <artifactId>maven-jetty-plugin</artifactId>
+        <version>6.1.7</version>
+        <configuration>
+          <scanIntervalSeconds>10</scanIntervalSeconds>
+          <webAppConfig>
+            <contextPath>/monitoring</contextPath>
+            <tempDirectory>${project.build.directory}/work</tempDirectory>
+          </webAppConfig>
+        </configuration>
+      </plugin>
     </plugins>
   </build>
   <distributionManagement>
@@ -195,4 +217,5 @@
       </plugin>
     </plugins>
   </reporting>
+
 </project>

Modified: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/ExecutionStack.java
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/ExecutionStack.java?rev=633810&r1=633809&r2=633810&view=diff
==============================================================================
--- commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/ExecutionStack.java (original)
+++ commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/ExecutionStack.java Wed Mar  5 02:48:38 2008
@@ -20,7 +20,7 @@
 import java.util.LinkedList;
 import java.util.List;
 
-import org.apache.commons.monitoring.impl.DefaultStopWatch;
+import org.apache.commons.monitoring.StopWatch;
 
 /**
  * Sometime we need to compare elapsed time from a high level process with fine-grained
@@ -43,36 +43,14 @@
         super();
     }
 
-    private static ThreadLocal<List<DefaultStopWatch>> local = new ThreadLocal<List<DefaultStopWatch>>();
+    private static ThreadLocal<List<StopWatch>> local = new ThreadLocal<List<StopWatch>>();
 
-    public static void push( DefaultStopWatch stopWatch )
+    public static void push( StopWatch stopWatch )
     {
         getExecution().add( stopWatch );
     }
 
     /**
-     * Pause all running stopWatches
-     */
-    public static void pause()
-    {
-        for ( StopWatch stopWatch : getExecution() )
-        {
-            stopWatch.pause();
-        }
-    }
-
-    /**
-     * Resume all stopWatches
-     */
-    public static void resume()
-    {
-        for ( StopWatch stopWatch : getExecution() )
-        {
-            stopWatch.resume();
-        }
-    }
-
-    /**
      *
      * @return <code>true</code> if all stopWatches are stopped (execution is finished)
      */
@@ -89,14 +67,25 @@
     }
 
     /**
+     * Indicates if the StopWatch is the top-level element in the execution
+     * @param stopWatch a stopwatch to test
+     * @return <code>true</code> is the stopWatch is the first one registered during execution
+     */
+    public static boolean isTopLevel( StopWatch stopWatch )
+    {
+        List<StopWatch> exec = local.get();
+        return ( exec != null ) && ( ! exec.isEmpty() ) && stopWatch.equals( exec.get( 0 ) );
+    }
+
+    /**
      * @return the ordered list of StopWatches used during execution
      */
-    public static List<DefaultStopWatch> getExecution()
+    public static List<StopWatch> getExecution()
     {
-        List<DefaultStopWatch> exec = local.get();
+        List<StopWatch> exec = local.get();
         if (exec == null)
         {
-            exec = new LinkedList<DefaultStopWatch>();
+            exec = new LinkedList<StopWatch>();
             local.set( exec );
         }
         return local.get();

Modified: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/Monitor.java
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/Monitor.java?rev=633810&r1=633809&r2=633810&view=diff
==============================================================================
--- commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/Monitor.java (original)
+++ commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/Monitor.java Wed Mar  5 02:48:38 2008
@@ -222,12 +222,28 @@
 
     }
 
-    void addListener( Listener listener );
-
-    void removeListener( Listener listener );
 
+    /**
+     * Listener interface to get notified on montor events
+     */
     public static interface Listener
     {
         void onStatValueRegistered( StatValue value );
+    }
+
+    /**
+     * Monitor that accepts Listeners and notify them on monitor events
+     */
+    public static interface Observable extends Monitor
+    {
+        /**
+         * @param listener listener to get registered
+         */
+        void addListener( Listener listener );
+
+        /**
+         * @param listener listener to get removed
+         */
+        void removeListener( Listener listener );
     }
 }

Modified: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/Monitoring.java
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/Monitoring.java?rev=633810&r1=633809&r2=633810&view=diff
==============================================================================
--- commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/Monitoring.java (original)
+++ commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/Monitoring.java Wed Mar  5 02:48:38 2008
@@ -17,8 +17,8 @@
 
 package org.apache.commons.monitoring;
 
-import org.apache.commons.monitoring.impl.DefaultRepository;
-import org.apache.commons.monitoring.impl.DefaultStopWatch;
+import org.apache.commons.monitoring.impl.repositories.DefaultRepository;
+import org.apache.commons.monitoring.StopWatch;
 
 /**
  * Utility class for simpified application instrumentation

Modified: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/Repository.java
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/Repository.java?rev=633810&r1=633809&r2=633810&view=diff
==============================================================================
--- commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/Repository.java (original)
+++ commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/Repository.java Wed Mar  5 02:48:38 2008
@@ -65,16 +65,6 @@
      */
     void reset();
 
-    /**
-     * @param listener listener to get registered
-     */
-    void addListener( Listener listener );
-
-    /**
-     *
-     * @param listener listener to get deregistered
-     */
-    void removeListener( Listener listener );
 
     /**
      * Start a StopWatch to monitor execution
@@ -85,10 +75,8 @@
 
     /**
      * Listener interface to get notified on repository events
-     *
-     * @author <a href="mailto:nicolas@apache.org">Nicolas De Loof</a>
      */
-    static interface Listener
+    public static interface Listener
     {
         /**
          * A monitor has just been created. Can be used to add custom StatValues or
@@ -98,6 +86,23 @@
          * @param monitor
          */
         void newMonitorInstance( Monitor monitor );
+    }
+
+    /**
+     * Repository that accepts Listeners and notify them on repository events
+     */
+    public static interface Observable extends Repository
+    {
+
+        /**
+         * @param listener listener to get registered
+         */
+        void addListener( Listener listener );
+
+        /**
+         * @param listener listener to get removed
+         */
+        void removeListener( Listener listener );
     }
 
 }

Modified: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/StatValue.java
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/StatValue.java?rev=633810&r1=633809&r2=633810&view=diff
==============================================================================
--- commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/StatValue.java (original)
+++ commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/StatValue.java Wed Mar  5 02:48:38 2008
@@ -26,7 +26,6 @@
  */
 public interface StatValue
 {
-    String getUnit();
 
     /**
      * @return the value
@@ -78,10 +77,10 @@
 
     void removeListener( Listener listener );
 
+    String getUnit();
+
     /**
      * Listener for StatValue events
-     *
-     * @author <a href="mailto:nicolas@apache.org">Nicolas De Loof</a>
      */
     public static interface Listener
     {

Copied: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/monitors/AbstractMonitor.java (from r632970, commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/AbstractMonitor.java)
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/monitors/AbstractMonitor.java?p2=commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/monitors/AbstractMonitor.java&p1=commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/AbstractMonitor.java&r1=632970&r2=633810&rev=633810&view=diff
==============================================================================
--- commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/AbstractMonitor.java (original)
+++ commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/monitors/AbstractMonitor.java Wed Mar  5 02:48:38 2008
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.commons.monitoring.impl;
+package org.apache.commons.monitoring.impl.monitors;
 
 import java.util.Collection;
 import java.util.Collections;
@@ -78,6 +78,7 @@
      * @return a previously registered StatValue if existed, or <code>null</code>
      * if value has been successfully registered
      */
+    @SuppressWarnings("unchecked")
     protected <T extends StatValue> T register( T value )
     {
         value.setMonitor( this );

Propchange: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/monitors/AbstractMonitor.java
------------------------------------------------------------------------------
    svn:mergeinfo = 

Copied: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/monitors/CompositeValuesMonitor.java (from r632970, commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/CompositeValuesMonitor.java)
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/monitors/CompositeValuesMonitor.java?p2=commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/monitors/CompositeValuesMonitor.java&p1=commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/CompositeValuesMonitor.java&r1=632970&r2=633810&rev=633810&view=diff
==============================================================================
--- commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/CompositeValuesMonitor.java (original)
+++ commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/monitors/CompositeValuesMonitor.java Wed Mar  5 02:48:38 2008
@@ -15,10 +15,12 @@
  * limitations under the License.
  */
 
-package org.apache.commons.monitoring.impl;
+package org.apache.commons.monitoring.impl.monitors;
 
 import org.apache.commons.monitoring.Counter;
 import org.apache.commons.monitoring.Gauge;
+import org.apache.commons.monitoring.impl.values.CompositeCounter;
+import org.apache.commons.monitoring.impl.values.CompositeGauge;
 
 /**
  * A Monitor implementation that creates {@link Composite} Gauges and Counters.

Propchange: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/monitors/CompositeValuesMonitor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/monitors/CompositeValuesMonitor.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/monitors/CompositeValuesMonitor.java
------------------------------------------------------------------------------
    svn:mergeinfo = 

Propchange: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/monitors/CompositeValuesMonitor.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Copied: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/monitors/CreateValuesOnDemandMonitor.java (from r632970, commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/CreateValuesOnDemandMonitor.java)
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/monitors/CreateValuesOnDemandMonitor.java?p2=commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/monitors/CreateValuesOnDemandMonitor.java&p1=commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/CreateValuesOnDemandMonitor.java&r1=632970&r2=633810&rev=633810&view=diff
==============================================================================
--- commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/CreateValuesOnDemandMonitor.java (original)
+++ commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/monitors/CreateValuesOnDemandMonitor.java Wed Mar  5 02:48:38 2008
@@ -15,10 +15,12 @@
  * limitations under the License.
  */
 
-package org.apache.commons.monitoring.impl;
+package org.apache.commons.monitoring.impl.monitors;
 
 import org.apache.commons.monitoring.Counter;
 import org.apache.commons.monitoring.Gauge;
+import org.apache.commons.monitoring.impl.values.ThreadSafeCounter;
+import org.apache.commons.monitoring.impl.values.ThreadSafeGauge;
 
 /**
  * implementation of the <code>Monitor</code> interface that creates StatValues on
@@ -28,7 +30,7 @@
  * @author <a href="mailto:nicolas@apache.org">Nicolas De Loof</a>
  */
 public class CreateValuesOnDemandMonitor
-    extends ListenableMonitor
+    extends ObservableMonitor
 {
 
     public CreateValuesOnDemandMonitor( Key key )
@@ -58,7 +60,6 @@
     protected Counter newCounterInstance( String role )
     {
         return new ThreadSafeCounter( role );
-
     }
 
     /**

Propchange: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/monitors/CreateValuesOnDemandMonitor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/monitors/CreateValuesOnDemandMonitor.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/monitors/CreateValuesOnDemandMonitor.java
------------------------------------------------------------------------------
    svn:mergeinfo = 

Copied: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/monitors/ObservableMonitor.java (from r632970, commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/ListenableMonitor.java)
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/monitors/ObservableMonitor.java?p2=commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/monitors/ObservableMonitor.java&p1=commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/ListenableMonitor.java&r1=632970&r2=633810&rev=633810&view=diff
==============================================================================
--- commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/ListenableMonitor.java (original)
+++ commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/monitors/ObservableMonitor.java Wed Mar  5 02:48:38 2008
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.commons.monitoring.impl;
+package org.apache.commons.monitoring.impl.monitors;
 
 import java.util.List;
 import java.util.concurrent.CopyOnWriteArrayList;
@@ -28,24 +28,27 @@
  *
  * @author <a href="mailto:nicolas@apache.org">Nicolas De Loof</a>
  */
-public abstract class ListenableMonitor extends AbstractMonitor implements Monitor
+public abstract class ObservableMonitor
+    extends AbstractMonitor
+    implements Monitor.Observable
 {
 
     private List<Listener> listeners;
 
     /**
      * Constructor
+     *
      * @param key the monitor identifier
      */
-    public ListenableMonitor( Key key )
+    public ObservableMonitor( Key key )
     {
         super( key );
         this.listeners = new CopyOnWriteArrayList<Listener>();
     }
 
-
     /**
      * Register the StatValue for the role, if none was registered before
+     *
      * @param value
      * @param role
      * @return the value registered, or a previously existing one
@@ -54,7 +57,7 @@
     protected <T extends StatValue> T register( T value )
     {
         T previous = (T) super.register( value );
-        if (previous != null)
+        if ( previous != null )
         {
             return previous;
         }
@@ -64,7 +67,6 @@
         }
         return null;
     }
-
 
     public void addListener( Listener listener )
     {

Propchange: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/monitors/ObservableMonitor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/monitors/ObservableMonitor.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/monitors/ObservableMonitor.java
------------------------------------------------------------------------------
    svn:mergeinfo = 

Propchange: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/monitors/ObservableMonitor.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Copied: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/repositories/AbstractRepository.java (from r632970, commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/AbstractRepository.java)
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/repositories/AbstractRepository.java?p2=commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/repositories/AbstractRepository.java&p1=commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/AbstractRepository.java&r1=632970&r2=633810&rev=633810&view=diff
==============================================================================
--- commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/AbstractRepository.java (original)
+++ commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/repositories/AbstractRepository.java Wed Mar  5 02:48:38 2008
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.commons.monitoring.impl;
+package org.apache.commons.monitoring.impl.repositories;
 
 import java.util.Collection;
 import java.util.Collections;
@@ -27,11 +27,11 @@
 
 import org.apache.commons.monitoring.Monitor;
 import org.apache.commons.monitoring.Repository;
-import org.apache.commons.monitoring.StopWatch;
 import org.apache.commons.monitoring.Monitor.Key;
 
 /**
- * Abstract implementation of {@link Repository} with support for base methods
+ * Abstract implementation of {@link Repository} with support for base methods.
+ * <p>
  *
  * @author <a href="mailto:nicolas@apache.org">Nicolas De Loof</a>
  */
@@ -43,6 +43,7 @@
     public AbstractRepository()
     {
         super();
+        // register default implementation.
         this.monitors = new ConcurrentHashMap<Monitor.Key, Monitor>( 50 );
     }
 
@@ -135,16 +136,6 @@
         {
             monitor.reset();
         }
-    }
-
-
-    /**
-     * {@inheritDoc}
-     * @see org.apache.commons.monitoring.Repository#start(org.apache.commons.monitoring.Monitor)
-     */
-    public StopWatch start( Monitor monitor )
-    {
-        return new DefaultStopWatch( monitor );
     }
 
 }

Propchange: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/repositories/AbstractRepository.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/repositories/AbstractRepository.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/repositories/AbstractRepository.java
------------------------------------------------------------------------------
    svn:mergeinfo = 

Propchange: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/repositories/AbstractRepository.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/repositories/ConfigurableImplementationsRepository.java
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/repositories/ConfigurableImplementationsRepository.java?rev=633810&view=auto
==============================================================================
--- commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/repositories/ConfigurableImplementationsRepository.java (added)
+++ commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/repositories/ConfigurableImplementationsRepository.java Wed Mar  5 02:48:38 2008
@@ -0,0 +1,110 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.commons.monitoring.impl.repositories;
+
+import java.lang.reflect.Constructor;
+
+import org.apache.commons.monitoring.Monitor;
+import org.apache.commons.monitoring.StopWatch;
+import org.apache.commons.monitoring.Monitor.Key;
+
+/**
+ * @author <a href="mailto:nicolas@apache.org">Nicolas De Loof</a>
+ */
+public class ConfigurableImplementationsRepository
+    extends CreateMonitorsOnDemandRepository
+{
+    private Constructor<? extends StopWatch> stopWatchConstructor;
+
+    private Constructor<? extends Monitor> monitorConstructor;
+
+    /**
+     * Constructor
+     * @param stopWatchImplementation the StopWatch implementation to use
+     * @param monitorImplementation the Monitor implementation to use
+     */
+    public ConfigurableImplementationsRepository( Class<? extends StopWatch> stopWatchImplementation,
+                                                  Class<? extends Monitor> monitorImplementation )
+    {
+        super();
+        setStopWatchImplementation( stopWatchImplementation );
+        setMonitorImplementation( monitorImplementation );
+    }
+
+    protected void setStopWatchImplementation( Class<? extends StopWatch> implementation )
+    {
+        try
+        {
+            stopWatchConstructor = implementation.getConstructor( Monitor.class );
+        }
+        catch ( Exception e )
+        {
+            throw new IllegalStateException( "Invalid StopWatch implemenation. Constructor <init>(Monitor) required", e );
+        }
+    }
+
+    protected void setMonitorImplementation( Class<? extends Monitor> implementation )
+    {
+        try
+        {
+            monitorConstructor = implementation.getConstructor( Monitor.Key.class );
+        }
+        catch ( Exception e )
+        {
+            throw new IllegalStateException(
+                "Invalid StopWatch implemenation. Constructor <init>(Monitor.Key) required", e );
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     *
+     * @see org.apache.commons.monitoring.impl.repositories.AbstractRepository#newMonitorInstance(org.apache.commons.monitoring.Monitor.Key)
+     */
+    @Override
+    protected Monitor newMonitorInstance( Key key )
+    {
+        try
+        {
+            return monitorConstructor.newInstance( key );
+        }
+        catch ( Exception e )
+        {
+            throw new IllegalStateException( "Invalid stopWatchConstructor configured in repository "
+                + stopWatchConstructor );
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     *
+     * @see org.apache.commons.monitoring.Repository#start(org.apache.commons.monitoring.Monitor)
+     */
+    public StopWatch start( Monitor monitor )
+    {
+        try
+        {
+            return stopWatchConstructor.newInstance( monitor );
+        }
+        catch ( Exception e )
+        {
+            throw new IllegalStateException( "Invalid stopWatchConstructor configured in repository "
+                + stopWatchConstructor );
+        }
+    }
+}

Propchange: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/repositories/ConfigurableImplementationsRepository.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/repositories/ConfigurableImplementationsRepository.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/repositories/ConfigurableImplementationsRepository.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/repositories/CreateMonitorsOnDemandRepository.java
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/repositories/CreateMonitorsOnDemandRepository.java?rev=633810&view=auto
==============================================================================
--- commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/repositories/CreateMonitorsOnDemandRepository.java (added)
+++ commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/repositories/CreateMonitorsOnDemandRepository.java Wed Mar  5 02:48:38 2008
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.commons.monitoring.impl.repositories;
+
+import org.apache.commons.monitoring.Monitor;
+import org.apache.commons.monitoring.Monitor.Key;
+
+/**
+ * Abstract implementation of a Repository that creates and register new Monitor instances
+ * as the monitored application request them.
+ *
+ * @author <a href="mailto:nicolas@apache.org">Nicolas De Loof</a>
+ */
+public abstract class CreateMonitorsOnDemandRepository
+    extends ObservableRepository
+{
+
+    /**
+     * Retrieve a monitor an creates / register a new instance if required
+     * <p>
+     * {@inheritDoc}
+     * @see org.apache.commons.monitoring.impl.repositories.AbstractRepository#getMonitor(org.apache.commons.monitoring.Monitor.Key)
+     */
+    @Override
+    protected Monitor getMonitor( Key key )
+    {
+        Monitor monitor = super.getMonitor( key );
+        if ( monitor == null )
+        {
+            monitor = newMonitorInstance( key );
+            Monitor previous = register( monitor );
+            if ( previous != null )
+            {
+                monitor = previous;
+            }
+        }
+        return monitor;
+    }
+
+    protected abstract Monitor newMonitorInstance( Key key );
+
+}

Propchange: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/repositories/CreateMonitorsOnDemandRepository.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/repositories/CreateMonitorsOnDemandRepository.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/repositories/CreateMonitorsOnDemandRepository.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Copied: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/repositories/DefaultRepository.java (from r632970, commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/DefaultRepository.java)
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/repositories/DefaultRepository.java?p2=commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/repositories/DefaultRepository.java&p1=commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/DefaultRepository.java&r1=632970&r2=633810&rev=633810&view=diff
==============================================================================
--- commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/DefaultRepository.java (original)
+++ commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/repositories/DefaultRepository.java Wed Mar  5 02:48:38 2008
@@ -15,55 +15,20 @@
  * limitations under the License.
  */
 
-package org.apache.commons.monitoring.impl;
+package org.apache.commons.monitoring.impl.repositories;
 
-import java.util.List;
-import java.util.concurrent.CopyOnWriteArrayList;
+import org.apache.commons.monitoring.impl.monitors.CompositeValuesMonitor;
+import org.apache.commons.monitoring.impl.stopwatches.DefaultStopWatch;
 
-import org.apache.commons.monitoring.Monitor;
-
-public class DefaultRepository extends AbstractRepository
+/**
+ * Default Repository implementation
+ *
+ * @author <a href="mailto:nicolas@apache.org">Nicolas De Loof</a>
+ */
+public class DefaultRepository extends ConfigurableImplementationsRepository
 {
-
-    private List<Listener> listeners = new CopyOnWriteArrayList<Listener>();
-
     public DefaultRepository()
     {
-        super();
-    }
-
-    public void addListener( Listener listener )
-    {
-        listeners.add( listener );
-    }
-
-    public void removeListener( Listener listener )
-    {
-        listeners.remove( listener );
-    }
-
-    public Monitor getMonitor( Monitor.Key key )
-    {
-        Monitor monitor = super.getMonitor( key );
-        if ( monitor == null )
-        {
-            monitor = newMonitorInstance( key );
-            Monitor previous = register( monitor );
-            if ( previous != null )
-            {
-                return  previous;
-            }
-            for ( Listener listener : listeners )
-            {
-                listener.newMonitorInstance( monitor );
-            }
-        }
-        return monitor;
+        super( DefaultStopWatch.class, CompositeValuesMonitor.class );
     }
-
-    protected Monitor newMonitorInstance( Monitor.Key key )
-    {
-        return new CompositeValuesMonitor( key );
-    }
-
 }

Propchange: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/repositories/DefaultRepository.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/repositories/DefaultRepository.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/repositories/DefaultRepository.java
------------------------------------------------------------------------------
    svn:mergeinfo = 

Added: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/repositories/ObservableRepository.java
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/repositories/ObservableRepository.java?rev=633810&view=auto
==============================================================================
--- commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/repositories/ObservableRepository.java (added)
+++ commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/repositories/ObservableRepository.java Wed Mar  5 02:48:38 2008
@@ -0,0 +1,68 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.commons.monitoring.impl.repositories;
+
+import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+import org.apache.commons.monitoring.Monitor;
+import org.apache.commons.monitoring.Repository;
+
+/**
+ * Implement observale pattern on the repository
+ *
+ * @author <a href="mailto:nicolas@apache.org">Nicolas De Loof</a>
+ */
+public abstract class ObservableRepository
+    extends AbstractRepository
+    implements Repository.Observable
+{
+
+    protected List<Listener> listeners = new CopyOnWriteArrayList<Listener>();
+
+    public void addListener( Listener listener )
+    {
+        listeners.add( listener );
+    }
+
+    public void removeListener( Listener listener )
+    {
+        listeners.remove( listener );
+    }
+
+    /**
+     * {@inheritDoc}
+     *
+     * @see org.apache.commons.monitoring.impl.repositories.AbstractRepository#register(org.apache.commons.monitoring.Monitor)
+     */
+    @Override
+    protected Monitor register( Monitor monitor )
+    {
+        Monitor previous = super.register( monitor );
+        if ( previous != null )
+        {
+            return previous;
+        }
+        for ( Listener listener : listeners )
+        {
+            listener.newMonitorInstance( monitor );
+        }
+        return null;
+    }
+
+}

Propchange: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/repositories/ObservableRepository.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/repositories/ObservableRepository.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/repositories/ObservableRepository.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Copied: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/stopwatches/DefaultStopWatch.java (from r632970, commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/DefaultStopWatch.java)
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/stopwatches/DefaultStopWatch.java?p2=commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/stopwatches/DefaultStopWatch.java&p1=commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/DefaultStopWatch.java&r1=632970&r2=633810&rev=633810&view=diff
==============================================================================
--- commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/DefaultStopWatch.java (original)
+++ commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/stopwatches/DefaultStopWatch.java Wed Mar  5 02:48:38 2008
@@ -15,22 +15,14 @@
  * limitations under the License.
  */
 
-package org.apache.commons.monitoring.impl;
+package org.apache.commons.monitoring.impl.stopwatches;
 
-import java.util.Stack;
-
-import org.apache.commons.monitoring.ExecutionStack;
 import org.apache.commons.monitoring.Monitor;
 import org.apache.commons.monitoring.StopWatch;
 
 /**
  * Estimates the time required for process execution (monitored method, service
  * invocation, database request...).
- * <p>
- * The StopWatch maintains a threadLocal stack of active StopWatches. When a new
- * StopWatch is created by a sub-process, it automatically pause the "parent"
- * running StopWatch, so that the top-level elapsed time = Sum( all StopWatches
- * running times ).
  *
  * @author <a href="mailto:nicolas@apache.org">Nicolas De Loof</a>
  */
@@ -54,10 +46,6 @@
     /** Monitor that is notified of process execution state */
     private final Monitor monitor;
 
-    private static boolean traceExecution;
-
-    private static final ThreadLocal<Stack<DefaultStopWatch>> STACK = new ThreadLocal<Stack<DefaultStopWatch>>();
-
     /**
      * Constructor.
      * <p>
@@ -75,42 +63,6 @@
         {
             monitor.getGauge( Monitor.CONCURRENCY ).increment();
         }
-        push();
-        if ( traceExecution )
-        {
-            ExecutionStack.push( this );
-        }
-    }
-
-    private void push()
-    {
-        Stack<DefaultStopWatch> stack = getStack();
-        if ( !stack.empty() )
-        {
-            stack.peek().pause();
-        }
-        stack.push( this );
-    }
-
-    private void pop()
-    {
-        Stack<DefaultStopWatch> stack = getStack();
-        stack.pop();
-        if ( !stack.empty() )
-        {
-            stack.peek().resume();
-        }
-    }
-
-    private Stack<DefaultStopWatch> getStack()
-    {
-        Stack<DefaultStopWatch> stack = STACK.get();
-        if ( stack == null )
-        {
-            stack = new Stack<DefaultStopWatch>();
-            STACK.set( stack );
-        }
-        return stack;
     }
 
     /**
@@ -177,11 +129,6 @@
                 monitor.getGauge( Monitor.CONCURRENCY ).decrement();
                 monitor.getCounter( Monitor.PERFORMANCES ).add( getElapsedTime() );
             }
-            pop();
-        }
-        if ( traceExecution && ExecutionStack.isFinished() )
-        {
-            ExecutionStack.clear();
         }
     }
 
@@ -214,11 +161,6 @@
             {
                 monitor.getGauge( Monitor.CONCURRENCY ).decrement();
             }
-            pop();
-        }
-        if ( traceExecution && ExecutionStack.isFinished() )
-        {
-            ExecutionStack.clear();
         }
     }
 
@@ -228,7 +170,7 @@
      * Monitored application should use a <code>try/finally</code> block to
      * ensure on of {@link #stop()} or {@link #cancel()} method is invoked, even
      * when an exception occurs. To avoid StopWatches to keep running if the
-     * application didn't follow this recommandation, the finalizer is used to
+     * application didn't follow this recommendation, the finalizer is used to
      * cancel the StopWatch and will log a educational warning.
      *
      * @see java.lang.Object#finalize()
@@ -307,16 +249,5 @@
     public Monitor getMonitor()
     {
         return monitor;
-    }
-
-    /**
-     * Enable automatic registration to the ExecutionStack and cleanup after the
-     * last stopWatch has been stopped.
-     *
-     * @param traceExecution
-     */
-    public static void setTraceExecution( boolean traceExecution )
-    {
-        DefaultStopWatch.traceExecution = traceExecution;
     }
 }

Added: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/stopwatches/ExecutionStopWatch.java
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/stopwatches/ExecutionStopWatch.java?rev=633810&view=auto
==============================================================================
--- commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/stopwatches/ExecutionStopWatch.java (added)
+++ commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/stopwatches/ExecutionStopWatch.java Wed Mar  5 02:48:38 2008
@@ -0,0 +1,71 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.commons.monitoring.impl.stopwatches;
+
+import org.apache.commons.monitoring.ExecutionStack;
+import org.apache.commons.monitoring.Monitor;
+
+/**
+ * Derives from StopWathc default implementation to maintain a list of all
+ * topWatches involved in the running process.
+ *
+ * @author <a href="mailto:nicolas@apache.org">Nicolas De Loof</a>
+ */
+public class ExecutionStopWatch
+    extends DefaultStopWatch
+{
+    /**
+     * @param monitor
+     */
+    public ExecutionStopWatch( Monitor monitor )
+    {
+        super( monitor );
+        ExecutionStack.push( this );
+    }
+
+    /**
+     * {@inheritDoc}
+     *
+     * @see org.apache.commons.monitoring.impl.stopwatches.DefaultStopWatch#stop()
+     */
+    @Override
+    public void stop()
+    {
+        super.stop();
+        if ( ExecutionStack.isTopLevel( this ) )
+        {
+            ExecutionStack.clear();
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     *
+     * @see org.apache.commons.monitoring.impl.stopwatches.DefaultStopWatch#cancel()
+     */
+    @Override
+    public void cancel()
+    {
+        super.cancel();
+        if ( ExecutionStack.isTopLevel( this ) )
+        {
+            ExecutionStack.clear();
+        }
+    }
+
+}

Propchange: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/stopwatches/ExecutionStopWatch.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/stopwatches/ExecutionStopWatch.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/stopwatches/ExecutionStopWatch.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Copied: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/values/AbstractStatValue.java (from r632970, commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/AbstractStatValue.java)
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/values/AbstractStatValue.java?p2=commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/values/AbstractStatValue.java&p1=commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/AbstractStatValue.java&r1=632970&r2=633810&rev=633810&view=diff
==============================================================================
--- commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/AbstractStatValue.java (original)
+++ commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/values/AbstractStatValue.java Wed Mar  5 02:48:38 2008
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.commons.monitoring.impl;
+package org.apache.commons.monitoring.impl.values;
 
 import java.util.List;
 import java.util.concurrent.CopyOnWriteArrayList;

Propchange: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/values/AbstractStatValue.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/values/AbstractStatValue.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/values/AbstractStatValue.java
------------------------------------------------------------------------------
    svn:mergeinfo = 

Copied: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/values/CompositeCounter.java (from r632970, commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/CompositeCounter.java)
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/values/CompositeCounter.java?p2=commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/values/CompositeCounter.java&p1=commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/CompositeCounter.java&r1=632970&r2=633810&rev=633810&view=diff
==============================================================================
--- commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/CompositeCounter.java (original)
+++ commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/values/CompositeCounter.java Wed Mar  5 02:48:38 2008
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.commons.monitoring.impl;
+package org.apache.commons.monitoring.impl.values;
 
 import java.util.Collection;
 import java.util.Collections;

Propchange: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/values/CompositeCounter.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/values/CompositeCounter.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/values/CompositeCounter.java
------------------------------------------------------------------------------
    svn:mergeinfo = 

Propchange: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/values/CompositeCounter.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Copied: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/values/CompositeGauge.java (from r632970, commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/CompositeGauge.java)
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/values/CompositeGauge.java?p2=commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/values/CompositeGauge.java&p1=commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/CompositeGauge.java&r1=632970&r2=633810&rev=633810&view=diff
==============================================================================
--- commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/CompositeGauge.java (original)
+++ commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/values/CompositeGauge.java Wed Mar  5 02:48:38 2008
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.commons.monitoring.impl;
+package org.apache.commons.monitoring.impl.values;
 
 import java.util.Collection;
 import java.util.Collections;

Propchange: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/values/CompositeGauge.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/values/CompositeGauge.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/values/CompositeGauge.java
------------------------------------------------------------------------------
    svn:mergeinfo = 

Propchange: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/values/CompositeGauge.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Copied: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/values/ThreadSafeCounter.java (from r632970, commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/ThreadSafeCounter.java)
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/values/ThreadSafeCounter.java?p2=commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/values/ThreadSafeCounter.java&p1=commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/ThreadSafeCounter.java&r1=632970&r2=633810&rev=633810&view=diff
==============================================================================
--- commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/ThreadSafeCounter.java (original)
+++ commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/values/ThreadSafeCounter.java Wed Mar  5 02:48:38 2008
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.commons.monitoring.impl;
+package org.apache.commons.monitoring.impl.values;
 
 import org.apache.commons.monitoring.Counter;
 

Propchange: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/values/ThreadSafeCounter.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/values/ThreadSafeCounter.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/values/ThreadSafeCounter.java
------------------------------------------------------------------------------
    svn:mergeinfo = 

Propchange: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/values/ThreadSafeCounter.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Copied: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/values/ThreadSafeGauge.java (from r632970, commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/ThreadSafeGauge.java)
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/values/ThreadSafeGauge.java?p2=commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/values/ThreadSafeGauge.java&p1=commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/ThreadSafeGauge.java&r1=632970&r2=633810&rev=633810&view=diff
==============================================================================
--- commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/ThreadSafeGauge.java (original)
+++ commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/values/ThreadSafeGauge.java Wed Mar  5 02:48:38 2008
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.commons.monitoring.impl;
+package org.apache.commons.monitoring.impl.values;
 
 import org.apache.commons.monitoring.Gauge;
 

Propchange: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/values/ThreadSafeGauge.java
------------------------------------------------------------------------------
    svn:mergeinfo = 

Modified: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/SecondaryMonitor.java
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/SecondaryMonitor.java?rev=633810&r1=633809&r2=633810&view=diff
==============================================================================
--- commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/SecondaryMonitor.java (original)
+++ commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/SecondaryMonitor.java Wed Mar  5 02:48:38 2008
@@ -20,7 +20,7 @@
 import org.apache.commons.monitoring.Composite;
 import org.apache.commons.monitoring.Monitor;
 import org.apache.commons.monitoring.StatValue;
-import org.apache.commons.monitoring.impl.AbstractMonitor;
+import org.apache.commons.monitoring.impl.monitors.AbstractMonitor;
 
 /**
  * A Monitor implementation that maintains a set of secondary StatValues in sync
@@ -38,11 +38,11 @@
 {
 
     /** The primary monitor */
-    private Monitor monitor;
+    private Monitor.Observable monitor;
 
     private boolean detached;
 
-    public SecondaryMonitor( Monitor monitor )
+    public SecondaryMonitor( Monitor.Observable monitor )
     {
         super( monitor.getKey() );
         this.monitor = monitor;
@@ -54,6 +54,7 @@
         monitor.addListener( this );
     }
 
+    @SuppressWarnings("unchecked")
     public void detach()
     {
         this.detached = true;
@@ -66,22 +67,13 @@
         }
     }
 
+    @SuppressWarnings("unchecked")
     public void onStatValueRegistered( StatValue value )
     {
         if ( !detached && value instanceof Composite )
         {
             register( ( (Composite<StatValue>) value ).createSecondary() );
         }
-    }
-
-    public void addListener( Listener listener )
-    {
-        throw new UnsupportedOperationException( "Only primary Monitor accepts listeners" );
-    }
-
-    public void removeListener( Listener listener )
-    {
-        throw new UnsupportedOperationException( "Only primary Monitor accepts listeners" );
     }
 
 }

Modified: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/SecondaryRepository.java
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/SecondaryRepository.java?rev=633810&r1=633809&r2=633810&view=diff
==============================================================================
--- commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/SecondaryRepository.java (original)
+++ commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/SecondaryRepository.java Wed Mar  5 02:48:38 2008
@@ -17,31 +17,41 @@
 
 package org.apache.commons.monitoring.listeners;
 
-import java.util.Collection;
-
 import org.apache.commons.monitoring.Monitor;
 import org.apache.commons.monitoring.Repository;
-import org.apache.commons.monitoring.impl.AbstractRepository;
+import org.apache.commons.monitoring.StopWatch;
+import org.apache.commons.monitoring.impl.repositories.AbstractRepository;
 
 /**
+ * A repository implementation that registers as a <tt>Listener</tt> to an
+ * <tt>Observable</tt> repository and maintains a set of Monitors in sync with
+ * the observed repository.
+ * <p>
+ * As a <tt>Detachable</tt> implementation, the SecondaryRepository can be
+ * detached from the observed repository and used to build a report for the
+ * observed period.
  *
  * @author <a href="mailto:nicolas@apache.org">Nicolas De Loof</a>
  */
 public class SecondaryRepository
-    extends AbstractRepository implements Repository.Listener, Detachable
+    extends AbstractRepository
+    implements Repository.Listener, Detachable
 {
-    private Repository repository;
+    private Repository.Observable repository;
 
     private boolean detached;
 
-    public SecondaryRepository( Repository repository )
+    public SecondaryRepository( Repository.Observable repository )
     {
         super();
         this.repository = repository;
         this.detached = false;
         for ( Monitor monitor : repository.getMonitors() )
         {
-            register( new SecondaryMonitor( monitor ) );
+            if ( monitor instanceof Monitor.Observable )
+            {
+                register( new SecondaryMonitor( (Monitor.Observable) monitor ) );
+            }
         }
         repository.addListener( this );
     }
@@ -52,7 +62,7 @@
         repository.removeListener( this );
         for ( Monitor monitor : getMonitors() )
         {
-            ((Detachable) monitor).detach();
+            ( (Detachable) monitor ).detach();
         }
     }
 
@@ -61,26 +71,18 @@
      */
     public void newMonitorInstance( Monitor monitor )
     {
-        if ( ! detached )
+        if ( !detached && monitor instanceof Monitor.Observable )
         {
-            register( new SecondaryMonitor( monitor ) );
+            register( new SecondaryMonitor( (Monitor.Observable) monitor ) );
         }
     }
 
     /**
-     * @see org.apache.commons.monitoring.Repository#addListener(org.apache.commons.monitoring.Repository.Listener)
+     * {@inheritDoc}
+     * @see org.apache.commons.monitoring.Repository#start(org.apache.commons.monitoring.Monitor)
      */
-    public void addListener( Listener listener )
+    public StopWatch start( Monitor monitor )
     {
-        throw new UnsupportedOperationException( "Only primary Repository accepts listeners" );
+        throw new UnsupportedOperationException( "Not available on a secondary repository" );
     }
-
-    /**
-     * @see org.apache.commons.monitoring.Repository#removeListener(org.apache.commons.monitoring.Repository.Listener)
-     */
-    public void removeListener( Listener listener )
-    {
-        throw new UnsupportedOperationException( "Only primary Repository accepts listeners" );
-    }
-
 }

Modified: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/AbstractPeriodicLogger.java
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/AbstractPeriodicLogger.java?rev=633810&r1=633809&r2=633810&view=diff
==============================================================================
--- commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/AbstractPeriodicLogger.java (original)
+++ commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/AbstractPeriodicLogger.java Wed Mar  5 02:48:38 2008
@@ -40,7 +40,7 @@
     private Timer timer;
 
     /** The observed repository */
-    private Repository repository;
+    private Repository.Observable repository;
 
     /** The observed repository */
     private SecondaryRepository secondary;
@@ -50,7 +50,7 @@
      * @param period the period (in ms) to log the monitoring state
      * @param repository the target monitoring repository
      */
-    public AbstractPeriodicLogger( long period, Repository repository )
+    public AbstractPeriodicLogger( long period, Repository.Observable repository )
     {
         super();
         this.secondary = new SecondaryRepository( repository );

Modified: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/AbstractRenderer.java
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/AbstractRenderer.java?rev=633810&r1=633809&r2=633810&view=diff
==============================================================================
--- commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/AbstractRenderer.java (original)
+++ commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/AbstractRenderer.java Wed Mar  5 02:48:38 2008
@@ -19,6 +19,11 @@
 
 import java.io.PrintWriter;
 import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
 
 import org.apache.commons.monitoring.Monitor;
 import org.apache.commons.monitoring.StatValue;
@@ -26,46 +31,93 @@
 
 /**
  * Render a collection of monitor for reporting
- * 
+ *
  * @author <a href="mailto:nicolas@apache.org">Nicolas De Loof</a>
  */
 public abstract class AbstractRenderer
     implements Renderer
 {
-    private final Collection<String> roles;
+    public static final Renderer.Filter ALL = new Renderer.Filter()
+    {
+        public boolean render( Object object )
+        {
+            return true;
+        }
+    };
 
-    private final PrintWriter writer;
+    public final void render( PrintWriter writer, Collection<Monitor> monitors )
+    {
+        render( writer, monitors, ALL );
+    }
+
+    public void render( PrintWriter writer, Collection<Monitor> monitors, Filter filter )
+    {
+        int count = 0;
+        for ( Monitor monitor : monitors )
+        {
+            if ( filter.render( monitor ) )
+            {
+                if (count > 0)
+                {
+                    hasNext( writer, Monitor.class );
+                }
+                render( writer, monitor, filter );
+                count ++;
+            }
+        }
+    }
 
-    public AbstractRenderer( PrintWriter writer, Collection<String> roles )
+    @SuppressWarnings("unchecked")
+    protected void hasNext( PrintWriter writer, Class type )
     {
-        super();
-        this.roles = roles;
-        this.writer = writer;
+        // Nop
     }
 
-    protected void write( String string )
+    protected void render( PrintWriter writer, Monitor monitor, Filter filter )
     {
-        writer.append( string );
+        render( writer, monitor.getKey() );
+        renderStatValues( writer, monitor, filter );
     }
 
-    public void render( Collection<Monitor> monitors )
+    protected int renderStatValues( PrintWriter writer, Monitor monitor, Filter filter )
     {
-        for ( Monitor monitor : monitors )
+
+        // Sort values by role to ensure predictable result
+        List<StatValue> values = getOrderedStatValues( monitor, filter );
+        for ( Iterator<StatValue> iterator = values.iterator(); iterator.hasNext(); )
         {
-            render( monitor );
+            StatValue value = (StatValue) iterator.next();
+            render( writer, value );
+            if (iterator.hasNext())
+            {
+                hasNext( writer, StatValue.class );
+            }
         }
+        return values.size();
     }
 
-    public void render( Monitor monitor )
+    protected List<StatValue> getOrderedStatValues( Monitor monitor, Filter filter )
     {
-        render( monitor.getKey() );
-        for ( String role : roles )
+        List<StatValue> values = new LinkedList<StatValue>( monitor.getValues() );
+        for ( Iterator<StatValue> iterator = values.iterator(); iterator.hasNext(); )
         {
-            render( monitor.getValue( role ), role );
+            StatValue value = (StatValue) iterator.next();
+            if ( ! filter.render( value ))
+            {
+                iterator.remove();
+            }
         }
+        Collections.sort( values, new Comparator<StatValue>()
+        {
+            public int compare( StatValue value1, StatValue value2 )
+            {
+                return value1.getRole().compareTo( value2.getRole() );
+            }
+        });
+        return values;
     }
 
-    public abstract void render( StatValue value, String role );
+    protected abstract void render( PrintWriter writer, StatValue value );
 
-    public abstract void render( Key key );
+    protected abstract void render( PrintWriter writer, Key key );
 }

Added: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/HtmlRenderer.java
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/HtmlRenderer.java?rev=633810&view=auto
==============================================================================
--- commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/HtmlRenderer.java (added)
+++ commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/HtmlRenderer.java Wed Mar  5 02:48:38 2008
@@ -0,0 +1,196 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.commons.monitoring.reporting;
+
+import java.io.PrintWriter;
+import java.util.Collection;
+import java.util.List;
+
+import org.apache.commons.monitoring.Counter;
+import org.apache.commons.monitoring.Monitor;
+import org.apache.commons.monitoring.StatValue;
+import org.apache.commons.monitoring.Monitor.Key;
+
+/**
+ * @author <a href="mailto:nicolas@apache.org">Nicolas De Loof</a>
+ */
+public class HtmlRenderer
+    extends AbstractRenderer
+{
+
+    /**
+     * {@inheritDoc}
+     *
+     * @see org.apache.commons.monitoring.reporting.AbstractRenderer#render(java.io.PrintWriter,
+     * java.util.Collection,
+     * org.apache.commons.monitoring.reporting.Renderer.Filter)
+     */
+    @Override
+    public void render( PrintWriter writer, Collection<Monitor> monitors, Filter filter )
+    {
+        documentHead( writer );
+        tableStartTag( writer );
+        tableHead( writer, monitors, filter );
+        super.render( writer, monitors, filter );
+        writer.append( "</tr></tbody>" );
+        tableEndTag( writer );
+        documentFoot( writer );
+    }
+
+    /**
+     * @param writer
+     */
+    protected void tableStartTag( PrintWriter writer )
+    {
+        writer.append( "<table>" );
+    }
+
+    /**
+     * @param writer
+     */
+    protected void tableEndTag( PrintWriter writer )
+    {
+        writer.append( "</table>" );
+    }
+
+    /**
+     * @param writer
+     */
+    protected void documentHead( PrintWriter writer )
+    {
+        writer.append( "<html><body>" );
+    }
+
+    protected void tableHead( PrintWriter writer, Collection<Monitor> monitors, Filter filter )
+    {
+        writer.append( "<thead><tr><th rowspan='2'>name</th><th rowspan='2'>category</th><th rowspan='2'>subsystem</th>" );
+        Monitor monitor = monitors.iterator().next();
+        List<StatValue> values = getOrderedStatValues( monitor, filter );
+        for ( StatValue value : values )
+        {
+            if ( value instanceof Counter )
+            {
+                writer.append( "<th colspan='7'>" );
+            }
+            else
+            {
+                writer.append( "<th colspan='5'>" );
+            }
+            writer.append( value.getRole() );
+            if ( value.getUnit() != null )
+            {
+                writer.append( " (" );
+                writer.append( value.getUnit() );
+                writer.append( ")" );
+            }
+            writer.append( "</th>" );
+        }
+        writer.append( "</tr>" );
+        writer.append( "<tr>" );
+        for ( StatValue value : values )
+        {
+            writer.append( "<th>value</th><th>min</th><th>max</th><th>mean</th><th>dev.</th>" );
+            if ( value instanceof Counter )
+            {
+                writer.append( "<th>sum</th><th>hits</th>" );
+            }
+        }
+        writer.append( "</tr></thead><tbody><tr>" );
+    }
+
+    /**
+     * {@inheritDoc}
+     *
+     * @see org.apache.commons.monitoring.reporting.AbstractRenderer#render(java.io.PrintWriter,
+     * org.apache.commons.monitoring.StatValue)
+     */
+    @Override
+    protected void render( PrintWriter writer, StatValue value )
+    {
+        writer.append( "<td title='" );
+        writer.append( value.getRole() );
+        writer.append( "'>" );
+        writer.append( String.valueOf( value.get() ) );
+        writer.append( "</td><td>" );
+        writer.append( String.valueOf( value.getMin() ) );
+        writer.append( "</td><td>" );
+        writer.append( String.valueOf( value.getMax() ) );
+        writer.append( "</td><td>" );
+        writer.append( String.valueOf( value.getMean() ) );
+        writer.append( "</td><td>" );
+        writer.append( String.valueOf( value.getStandardDeviation() ) );
+        if ( value instanceof Counter )
+        {
+            Counter counter = (Counter) value;
+            writer.append( "</td><td>" );
+            writer.append( String.valueOf( counter.getSum() ) );
+            writer.append( "</td><td>" );
+            writer.append( String.valueOf( counter.getHits() ) );
+        }
+        writer.append( "</td>" );
+
+    }
+
+    /**
+     * {@inheritDoc}
+     *
+     * @see org.apache.commons.monitoring.reporting.AbstractRenderer#render(java.io.PrintWriter,
+     * org.apache.commons.monitoring.Monitor.Key)
+     */
+    @Override
+    protected void render( PrintWriter writer, Key key )
+    {
+        writer.append( "<td>" );
+        writer.append( key.getName() );
+        writer.append( "</td><td>" );
+        if ( key.getCategory() != null )
+        {
+            writer.append( key.getCategory() );
+        }
+        writer.append( "</td><td>" );
+        if ( key.getSubsystem() != null )
+        {
+            writer.append( key.getSubsystem() );
+        }
+        writer.append( "</td>" );
+    }
+
+    /**
+     * {@inheritDoc}
+     *
+     * @see org.apache.commons.monitoring.reporting.AbstractRenderer#hasNext(java.io.PrintWriter,
+     * java.lang.Class)
+     */
+    @Override
+    protected void hasNext( PrintWriter writer, Class type )
+    {
+        if ( type == Monitor.class )
+        {
+            writer.append( "</tr><tr>" );
+        }
+    }
+
+    /**
+     * @param writer
+     */
+    protected void documentFoot( PrintWriter writer )
+    {
+        writer.append( "</body></html>" );
+    }
+
+}

Propchange: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/HtmlRenderer.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/HtmlRenderer.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/HtmlRenderer.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain