Author: nicolas
Date: Mon Feb  4 02:03:23 2008
New Revision: 618221

URL: http://svn.apache.org/viewvc?rev=618221&view=rev
Log:
secondary monitors : attach to live monitors, watch monitored activity and 
detach
(base for history graphs and other time-based features)

Added:
    
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
   (with props)
    
commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/ListenableMonitor.java
      - copied, changed from r616771, 
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/listeners/Detachable.java
   (with props)
    
commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/SecondaryMonitor.java
   (with props)
    
commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/SecondaryRepository.java
   (with props)
    commons/sandbox/monitoring/trunk/src/site/resources/
    commons/sandbox/monitoring/trunk/src/site/resources/images/
    
commons/sandbox/monitoring/trunk/src/site/resources/images/monitoring-logo-white.png
   (with props)
    
commons/sandbox/monitoring/trunk/src/site/resources/images/monitoring-logo-white.xcf
   (with props)
    
commons/sandbox/monitoring/trunk/src/test/java/org/apache/commons/monitoring/listener/SecondaryReposioryTest.java
   (with props)
Modified:
    
commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/Composite.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/StopWatch.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/ThreadSafeCounter.java
    
commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/ThreadSafeGauge.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/ThreadSafeCounterTest.java
    
commons/sandbox/monitoring/trunk/src/test/java/org/apache/commons/monitoring/impl/ThreadSafeGaugeTest.java

Modified: 
commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/Composite.java
URL: 
http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/Composite.java?rev=618221&r1=618220&r2=618221&view=diff
==============================================================================
--- 
commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/Composite.java
 (original)
+++ 
commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/Composite.java
 Mon Feb  4 02:03:23 2008
@@ -33,13 +33,15 @@
     Collection<T> getSecondary();
 
     /**
-     * Register a secondary instance
+     * Create a secondary instance
+     *
      * @param secondary
      */
-    public void addSecondary( T secondary );
+    public T createSecondary();
 
     /**
      * Deregister a secondary instance
+     *
      * @param secondary
      */
     public void removeSecondary( T secondary );

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=618221&r1=618220&r2=618221&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
 Mon Feb  4 02:03:23 2008
@@ -17,6 +17,9 @@
 
 package org.apache.commons.monitoring;
 
+import java.util.Collection;
+
+
 /**
  * A <code>Monitor</code> is an abstraction of some application resource that
  * is instrumented with a set of indicators (Gauges or Counters).
@@ -85,6 +88,18 @@
     StatValue getValue( String role );
 
     /**
+     *
+     * @return an unmodifiable collection of registered statValues roles
+     */
+    Collection<String> getRoles();
+
+    /**
+     *
+     * @return an unmodifiable collection of registered statValues
+     */
+    Collection<StatValue> getValues();
+
+    /**
      * Reset all StatValues (don't remove them)
      */
     void reset();
@@ -205,5 +220,14 @@
             return subsystem;
         }
 
+    }
+
+    void addListener( Listener listener );
+
+    void removeListener( Listener listener );
+
+    public static interface Listener
+    {
+        void onStatValueRegistered( StatValue value );
     }
 }

Modified: 
commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/StopWatch.java
URL: 
http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/StopWatch.java?rev=618221&r1=618220&r2=618221&view=diff
==============================================================================
--- 
commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/StopWatch.java
 (original)
+++ 
commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/StopWatch.java
 Mon Feb  4 02:03:23 2008
@@ -57,7 +57,7 @@
     {
         super();
         this.monitor = monitor;
-        startedAt = nanotime();
+        startedAt = time();
         if ( monitor != null )
         {
             monitor.getGauge( Monitor.CONCURRENCY ).increment();
@@ -81,7 +81,7 @@
         else
         {
             // Still running !
-            delay = nanotime() - startedAt - pauseDelay;
+            delay = time() - startedAt - pauseDelay;
         }
         return delay;
     }
@@ -94,7 +94,7 @@
     {
         if ( !paused && !stoped )
         {
-            stopedAt = nanotime();
+            stopedAt = time();
             paused = true;
         }
     }
@@ -106,7 +106,7 @@
     {
         if ( paused && !stoped )
         {
-            pauseDelay = nanotime() - stopedAt;
+            pauseDelay = time() - stopedAt;
             paused = false;
             stopedAt = 0;
         }
@@ -120,7 +120,7 @@
     {
         if ( !stoped )
         {
-            long t = nanotime();
+            long t = time();
             if ( paused )
             {
                 pauseDelay = t - stopedAt;
@@ -210,17 +210,16 @@
     }
 
     /**
-     * Returns the current value of the most precise available system timer, in
-     * nanoseconds. The real precision depends on the JVM and the underlying
-     * system. On JRE before java5, <tt>backport-util-concurrent</tt> provides
-     * some limited support for equivalent timer.
+     * Simple benchmark demonstrates that java5 System.currentTimeMillis is FAR
+     * quicker than System.nanoTime. The lack of precision for using ms as time
+     * unit is not blocking for a monitoring toolkit (it may be for a profiler)
      *
-     * @see System#nanoTime()
-     * @return time in nanosecond
+     * @return time with ms precision
+     * @see org.apache.commons.monitoring.bench.CurrentTimeMillisVsNanoTime
      */
-    protected long nanotime()
+    protected long time()
     {
-        return System.nanoTime();
+        return System.currentTimeMillis();
     }
 
     /**

Added: 
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/AbstractMonitor.java?rev=618221&view=auto
==============================================================================
--- 
commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/AbstractMonitor.java
 (added)
+++ 
commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/AbstractMonitor.java
 Mon Feb  4 02:03:23 2008
@@ -0,0 +1,108 @@
+/*
+ * 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;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+
+import org.apache.commons.monitoring.Counter;
+import org.apache.commons.monitoring.Gauge;
+import org.apache.commons.monitoring.Monitor;
+import org.apache.commons.monitoring.StatValue;
+
+/**
+ * Abstract [EMAIL PROTECTED] Monitor} implementation with implementation for 
base methods
+ *
+ * @author <a href="mailto:[EMAIL PROTECTED]">Nicolas De Loof</a>
+ */
+public abstract class AbstractMonitor implements Monitor
+{
+
+    private final ConcurrentMap<String, StatValue> values;
+    private final Key key;
+
+    public AbstractMonitor( Key key )
+    {
+        super();
+        this.key = key;
+        this.values = new ConcurrentHashMap<String, StatValue>();
+    }
+
+    /**
+     * [EMAIL PROTECTED]
+     */
+    public final Key getKey()
+    {
+        return key;
+    }
+
+    /**
+     * [EMAIL PROTECTED]
+     */
+    public final StatValue getValue( String role )
+    {
+        return values.get( role );
+    }
+
+    public final Collection<String> getRoles()
+    {
+        return Collections.unmodifiableCollection( values.keySet() );
+    }
+
+    public final Collection<StatValue> getValues()
+    {
+        return Collections.unmodifiableCollection( values.values() );
+    }
+
+    /**
+     * Register a new StatValue in the monitor
+     *
+     * @param value StatValue instance to get registered
+     * @return a previously registered StatValue if existed, or 
<code>null</code>
+     * if value has been successfully registered
+     */
+    protected <T extends StatValue> T register( T value )
+    {
+        value.setMonitor( this );
+        return (T) values.putIfAbsent( value.getRole(), value );
+    }
+
+    /**
+     * [EMAIL PROTECTED]
+     */
+    public void reset()
+    {
+        for ( StatValue value : values.values() )
+        {
+            value.reset();
+        }
+    }
+
+    public Counter getCounter( String role )
+    {
+        return (Counter) getValue( role );
+    }
+
+    public Gauge getGauge( String role )
+    {
+        return (Gauge) getValue( role );
+    }
+
+}
\ No newline at end of file

Added: 
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/AbstractRepository.java?rev=618221&view=auto
==============================================================================
--- 
commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/AbstractRepository.java
 (added)
+++ 
commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/AbstractRepository.java
 Mon Feb  4 02:03:23 2008
@@ -0,0 +1,139 @@
+/*
+ * 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;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+
+import org.apache.commons.monitoring.Monitor;
+import org.apache.commons.monitoring.Repository;
+import org.apache.commons.monitoring.Monitor.Key;
+
+/**
+ * Abstract implementation of [EMAIL PROTECTED] Repository} with support for 
base methods
+ *
+ * @author <a href="mailto:[EMAIL PROTECTED]">Nicolas De Loof</a>
+ */
+public abstract class AbstractRepository
+    implements Repository
+{
+    private final ConcurrentMap<Monitor.Key, Monitor> monitors;
+
+    public AbstractRepository()
+    {
+        super();
+        this.monitors = new ConcurrentHashMap<Monitor.Key, Monitor>( 50 );
+    }
+
+    public Monitor getMonitor( String name )
+    {
+        return getMonitor( name, null, null );
+    }
+
+    public Monitor getMonitor( String name, String category )
+    {
+        return getMonitor( name, category, null );
+    }
+
+    public Monitor getMonitor( String name, String category, String subsystem )
+    {
+        return getMonitor( new Monitor.Key( name, category, subsystem ) );
+    }
+
+    protected Monitor getMonitor( Key key )
+    {
+        return monitors.get( key );
+    }
+
+    /**
+     * Register a new monitor in the repository
+     *
+     * @param monitor Monitor instance to get registered
+     * @return a previously registered monitor if existed, or <code>null</code>
+     * if monitor has been successfully registered
+     */
+    protected Monitor register( Monitor monitor )
+    {
+        return monitors.putIfAbsent( monitor.getKey(), monitor );
+    }
+
+    public Set<String> getCategories()
+    {
+        Set<String> categories = new HashSet<String>();
+        for ( Key key : monitors.keySet() )
+        {
+            categories.add( key.getCategory() );
+        }
+        return categories;
+    }
+
+    public Set<String> getSubSystems()
+    {
+        Set<String> subsystems = new HashSet<String>();
+        for ( Key key : monitors.keySet() )
+        {
+            subsystems.add( key.getSubsystem() );
+        }
+        return subsystems;
+    }
+
+    public Collection<Monitor> getMonitors()
+    {
+        return Collections.unmodifiableCollection( monitors.values() );
+    }
+
+    public Collection<Monitor> getMonitorsFromCategory( String category )
+    {
+        Collection<Monitor> filtered = new LinkedList<Monitor>();
+        for ( Monitor monitor : monitors.values() )
+        {
+            if ( category.equals( monitor.getKey().getCategory() ) )
+            {
+                filtered.add( monitor );
+            }
+        }
+        return filtered;
+    }
+
+    public Collection<Monitor> getMonitorsFromSubSystem( String subsystem )
+    {
+        Collection<Monitor> filtered = new LinkedList<Monitor>();
+        for ( Monitor monitor : monitors.values() )
+        {
+            if ( subsystem.equals( monitor.getKey().getSubsystem() ) )
+            {
+                filtered.add( monitor );
+            }
+        }
+        return filtered;
+    }
+
+    public void reset()
+    {
+        for ( Monitor monitor : monitors.values() )
+        {
+            monitor.reset();
+        }
+    }
+
+}
\ No newline at end of file

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

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

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

Modified: 
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/AbstractStatValue.java?rev=618221&r1=618220&r2=618221&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/AbstractStatValue.java
 Mon Feb  4 02:03:23 2008
@@ -46,6 +46,12 @@
 
     private List<Listener> listeners = new CopyOnWriteArrayList<Listener>();
 
+    public AbstractStatValue( String role )
+    {
+        super();
+        this.role = role;
+    }
+
     public void addListener( Listener listener )
     {
         listeners.add( listener );

Modified: 
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/CompositeCounter.java?rev=618221&r1=618220&r2=618221&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/CompositeCounter.java
 Mon Feb  4 02:03:23 2008
@@ -43,15 +43,17 @@
         return Collections.unmodifiableCollection( secondary );
     }
 
-    public CompositeCounter()
+    public CompositeCounter( String role )
     {
-        super();
+        super( role );
         this.secondary = new CopyOnWriteArrayList<Counter>();
     }
 
-    public void addSecondary( Counter counter )
+    public Counter createSecondary()
     {
+        Counter counter = new ThreadSafeCounter( getRole() );
         secondary.add( counter );
+        return counter;
     }
 
     public void removeSecondary( Counter counter )

Modified: 
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/CompositeGauge.java?rev=618221&r1=618220&r2=618221&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/CompositeGauge.java
 Mon Feb  4 02:03:23 2008
@@ -43,16 +43,19 @@
         return Collections.unmodifiableCollection( secondary );
     }
 
-    public CompositeGauge()
+    public CompositeGauge( String role )
     {
-        super();
+        super( role );
         this.secondary = new LinkedList<Gauge>();
     }
 
-    public synchronized void addSecondary( Gauge gauge )
+    public synchronized Gauge createSecondary()
     {
+        // Must be synchronized to ensure the new gauge shares the primary 
initial value
+        Gauge gauge = new ThreadSafeGauge( getRole() );
         gauge.set( get() );
         secondary.add( gauge );
+        return gauge;
     }
 
     public synchronized void removeSecondary( Gauge gauge )

Modified: 
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/CompositeValuesMonitor.java?rev=618221&r1=618220&r2=618221&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/CompositeValuesMonitor.java
 Mon Feb  4 02:03:23 2008
@@ -34,15 +34,15 @@
     }
 
     @Override
-    protected Counter newCounterInstance()
+    protected Counter newCounterInstance( String role )
     {
-        return new CompositeCounter();
+        return new CompositeCounter( role );
     }
 
     @Override
-    protected Gauge newGaugeInstance()
+    protected Gauge newGaugeInstance( String role )
     {
-        return new CompositeGauge();
+        return new CompositeGauge( role );
     }
 
 }

Modified: 
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/CreateValuesOnDemandMonitor.java?rev=618221&r1=618220&r2=618221&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/CreateValuesOnDemandMonitor.java
 Mon Feb  4 02:03:23 2008
@@ -28,7 +28,7 @@
  * @author <a href="mailto:[EMAIL PROTECTED]">Nicolas De Loof</a>
  */
 public class CreateValuesOnDemandMonitor
-    extends AbstractMonitor
+    extends ListenableMonitor
 {
 
     public CreateValuesOnDemandMonitor( Key key )
@@ -39,6 +39,7 @@
     /**
      * Retrieve a Counter or create a new one for the role
      */
+    @Override
     public Counter getCounter( String role )
     {
         Counter counter = (Counter) getValue( role );
@@ -46,20 +47,24 @@
         {
             return counter;
         }
-        return register( newCounterInstance(), role );
+        counter = newCounterInstance( role );
+        Counter previous = register( counter );
+        return previous != null ? previous : counter;
     }
 
     /**
      * Create a new Counter instance
      */
-    protected Counter newCounterInstance()
+    protected Counter newCounterInstance( String role )
     {
-        return new ThreadSafeCounter();
+        return new ThreadSafeCounter( role );
+
     }
 
     /**
      * Retrieve a Gauge or create a new one for the role
      */
+    @Override
     public Gauge getGauge( String role )
     {
         Gauge gauge = (Gauge) getValue( role );
@@ -67,15 +72,17 @@
         {
             return gauge;
         }
-        return register( newGaugeInstance(), role );
+        gauge = newGaugeInstance( role );
+        Gauge previous = register( gauge );
+        return previous != null ? previous : gauge;
     }
 
     /**
      * Create a new Gauge instance
      */
-    protected Gauge newGaugeInstance()
+    protected Gauge newGaugeInstance( String role )
     {
-        return new ThreadSafeGauge();
+        return  new ThreadSafeGauge( role );
     }
 
 }

Modified: 
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/DefaultRepository.java?rev=618221&r1=618220&r2=618221&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/DefaultRepository.java
 Mon Feb  4 02:03:23 2008
@@ -17,32 +17,19 @@
 
 package org.apache.commons.monitoring.impl;
 
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.LinkedList;
 import java.util.List;
-import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.CopyOnWriteArrayList;
 
 import org.apache.commons.monitoring.Monitor;
-import org.apache.commons.monitoring.Repository;
-import org.apache.commons.monitoring.Monitor.Key;
 
-public class DefaultRepository
-    implements Repository
+public class DefaultRepository extends AbstractRepository
 {
 
-    public final ConcurrentMap<Monitor.Key, Monitor> monitors;
-
     private List<Listener> listeners = new CopyOnWriteArrayList<Listener>();
 
     public DefaultRepository()
     {
         super();
-        this.monitors = new ConcurrentHashMap<Monitor.Key, Monitor>( 50 );
     }
 
     public void addListener( Listener listener )
@@ -55,97 +42,27 @@
         listeners.remove( listener );
     }
 
-    public Monitor getMonitor( String name )
-    {
-        return getMonitor( name, null, null );
-    }
-
-    public Monitor getMonitor( String name, String category )
-    {
-        return getMonitor( name, category, null );
-    }
-
-    public Set<String> getCategories()
-    {
-        Set<String> categories = new HashSet<String>();
-        for ( Key key : monitors.keySet() )
-        {
-            categories.add( key.getCategory() );
-        }
-        return categories;
-    }
-
-    public Set<String> getSubSystems()
-    {
-        Set<String> subsystems = new HashSet<String>();
-        for ( Key key : monitors.keySet() )
-        {
-            subsystems.add( key.getSubsystem() );
-        }
-        return subsystems;
-    }
-
-    public Monitor getMonitor( String name, String category, String subsystem )
+    public Monitor getMonitor( Monitor.Key key )
     {
-        Monitor.Key key = new Monitor.Key( name, null, null );
-        Monitor monitor = monitors.get( key );
+        Monitor monitor = super.getMonitor( key );
         if ( monitor == null )
         {
             monitor = newMonitorInstance( key );
-
-            Monitor previous = monitors.putIfAbsent( key, monitor );
+            Monitor previous = register( monitor );
             if ( previous != null )
             {
-                monitor = previous;
-            }
-        }
-        return monitor;
-    }
-
-    protected Monitor newMonitorInstance( Monitor.Key key )
-    {
-        Monitor monitor;
-        monitor = new CompositeValuesMonitor( key );
-        return monitor;
-    }
-
-    public Collection<Monitor> getMonitors()
-    {
-        return Collections.unmodifiableCollection( monitors.values() );
-    }
-
-    public Collection<Monitor> getMonitorsFromCategory( String category )
-    {
-        Collection<Monitor> filtered = new LinkedList<Monitor>();
-        for ( Monitor monitor : monitors.values() )
-        {
-            if ( category.equals( monitor.getKey().getCategory() ) )
-            {
-                filtered.add( monitor );
+                return  previous;
             }
-        }
-        return filtered;
-    }
-
-    public Collection<Monitor> getMonitorsFromSubSystem( String subsystem )
-    {
-        Collection<Monitor> filtered = new LinkedList<Monitor>();
-        for ( Monitor monitor : monitors.values() )
-        {
-            if ( subsystem.equals( monitor.getKey().getSubsystem() ) )
+            for ( Listener listener : listeners )
             {
-                filtered.add( monitor );
+                listener.newMonitorInstance( monitor );
             }
         }
-        return filtered;
+        return monitor;
     }
 
-
-    public void reset()
+    protected Monitor newMonitorInstance( Monitor.Key key )
     {
-        for ( Monitor monitor : monitors.values() )
-        {
-            monitor.reset();
-        }
+        return new CompositeValuesMonitor( key );
     }
 }

Copied: 
commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/ListenableMonitor.java
 (from r616771, 
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/ListenableMonitor.java?p2=commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/ListenableMonitor.java&p1=commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/AbstractMonitor.java&r1=616771&r2=618221&rev=618221&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/ListenableMonitor.java
 Mon Feb  4 02:03:23 2008
@@ -17,74 +17,62 @@
 
 package org.apache.commons.monitoring.impl;
 
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
+import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
 
 import org.apache.commons.monitoring.Monitor;
 import org.apache.commons.monitoring.StatValue;
 
 /**
- * Abstract [EMAIL PROTECTED] Monitor} implementation with implementation fo 
base methods
+ * <code>Monitor</code> implementation with support for listeners
  *
  * @author <a href="mailto:[EMAIL PROTECTED]">Nicolas De Loof</a>
  */
-public abstract class AbstractMonitor implements Monitor
+public abstract class ListenableMonitor extends AbstractMonitor implements 
Monitor
 {
 
-    protected final ConcurrentMap<String, StatValue> values;
-    protected final Key key;
+    private List<Listener> listeners;
 
     /**
      * Constructor
      * @param key the monitor identifier
      */
-    public AbstractMonitor( Key key )
+    public ListenableMonitor( Key key )
     {
-        super();
-        this.key = key;
-        this.values = new ConcurrentHashMap<String, StatValue>();
+        super( key );
+        this.listeners = new CopyOnWriteArrayList<Listener>();
     }
 
 
     /**
-     * [EMAIL PROTECTED]
-     */
-    public Key getKey()
-    {
-        return key;
-    }
-
-    /**
-     * [EMAIL PROTECTED]
-     */
-    public StatValue getValue( String role )
-    {
-        return values.get( role );
-    }
-
-    /**
      * Register the StatValue for the role, if none was registered before
      * @param value
      * @param role
      * @return the value registered, or a previously existing one
      */
-    public <T extends StatValue> T register( T value, String role )
+    @Override
+    protected <T extends StatValue> T register( T value )
     {
-        value.setMonitor( this );
-        value.setRole( role );
-        T previous = (T) values.putIfAbsent( role, value );
-        return previous != null ? previous : value;
+        T previous = (T) super.register( value );
+        if (previous != null)
+        {
+            return previous;
+        }
+        for ( Listener listener : listeners )
+        {
+            listener.onStatValueRegistered( value );
+        }
+        return null;
     }
 
-    /**
-     * [EMAIL PROTECTED]
-     */
-    public void reset()
+
+    public void addListener( Listener listener )
     {
-        for ( StatValue value : values.values() )
-        {
-            value.reset();
-        }
+        listeners.add( listener );
     }
 
+    public void removeListener( Listener listener )
+    {
+        listeners.remove( listener );
+    }
 }

Modified: 
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/ThreadSafeCounter.java?rev=618221&r1=618220&r2=618221&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/ThreadSafeCounter.java
 Mon Feb  4 02:03:23 2008
@@ -29,11 +29,17 @@
     extends AbstractStatValue
     implements Counter
 {
+
     private long value;
 
     private long sum;
 
     private long sumOfSquares;
+
+    public ThreadSafeCounter( String role )
+    {
+        super( role );
+    }
 
     /**
      * [EMAIL PROTECTED]

Modified: 
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/ThreadSafeGauge.java?rev=618221&r1=618220&r2=618221&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/ThreadSafeGauge.java
 Mon Feb  4 02:03:23 2008
@@ -43,6 +43,11 @@
     // Use a double so that unset can be detected as "Not a Number"
     private double firstUse = Double.NaN;
 
+    public ThreadSafeGauge( String role )
+    {
+        super( role );
+    }
+
     public synchronized void reset()
     {
         // Don't reset value !
@@ -100,7 +105,7 @@
 
     protected void computeSums()
     {
-        long now = nanoTime();
+        long now = time();
         if ( Double.isNaN( firstUse ) )
         {
             firstUse = now;
@@ -115,15 +120,15 @@
         lastUse = now;
     }
 
-    protected long nanoTime()
+    protected long time()
     {
-        return System.nanoTime();
+        return System.currentTimeMillis();
     }
 
     @Override
     public synchronized double getMean()
     {
-        return ( (double) sum ) / ( nanoTime() - firstUse );
+        return ( (double) sum ) / ( time() - firstUse );
     }
 
     @Override

Added: 
commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/Detachable.java
URL: 
http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/Detachable.java?rev=618221&view=auto
==============================================================================
--- 
commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/Detachable.java
 (added)
+++ 
commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/Detachable.java
 Mon Feb  4 02:03:23 2008
@@ -0,0 +1,30 @@
+/*
+ * 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.listeners;
+
+/**
+ * @author <a href="mailto:[EMAIL PROTECTED]">Nicolas De Loof</a>
+ */
+public interface Detachable
+{
+    /**
+     * Detach the instance from live monitoring beackbone. Any new monitoring
+     * event will not affect datas in this component.
+     */
+    void detach();
+}

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

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

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

Added: 
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=618221&view=auto
==============================================================================
--- 
commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/SecondaryMonitor.java
 (added)
+++ 
commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/SecondaryMonitor.java
 Mon Feb  4 02:03:23 2008
@@ -0,0 +1,87 @@
+/*
+ * 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.listeners;
+
+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;
+
+/**
+ * A Monitor implementation that maintains a set of secondary StatValues in 
sync
+ * with the primary monitor. Register itself as a monitor listener to get 
notified
+ * on new StatValues and automatically create the required secondary.
+ * <p>
+ * When detached, deregister itself as Monitor.Listener and detaches all 
secondary
+ * from the primary StatValues.
+ *
+ * @author <a href="mailto:[EMAIL PROTECTED]">Nicolas De Loof</a>
+ */
+public class SecondaryMonitor
+    extends AbstractMonitor
+    implements Monitor.Listener, Detachable
+{
+
+    /** The primary monitor */
+    private Monitor monitor;
+
+    private boolean detached;
+
+    public SecondaryMonitor( Monitor monitor )
+    {
+        super( monitor.getKey() );
+        this.monitor = monitor;
+        this.detached = false;
+        for ( StatValue value : monitor.getValues() )
+        {
+            onStatValueRegistered(  value );
+        }
+        monitor.addListener( this );
+    }
+
+    public void detach()
+    {
+        this.detached = true;
+        for ( StatValue value : monitor.getValues() )
+        {
+            if ( value instanceof Composite )
+            {
+                ( (Composite<StatValue>) value ).removeSecondary( getValue( 
value.getRole() ) );
+            }
+        }
+    }
+
+    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" );
+    }
+
+}

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

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

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

Added: 
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=618221&view=auto
==============================================================================
--- 
commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/SecondaryRepository.java
 (added)
+++ 
commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/SecondaryRepository.java
 Mon Feb  4 02:03:23 2008
@@ -0,0 +1,86 @@
+/*
+ * 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.listeners;
+
+import java.util.Collection;
+
+import org.apache.commons.monitoring.Monitor;
+import org.apache.commons.monitoring.Repository;
+import org.apache.commons.monitoring.impl.AbstractRepository;
+
+/**
+ *
+ * @author <a href="mailto:[EMAIL PROTECTED]">Nicolas De Loof</a>
+ */
+public class SecondaryRepository
+    extends AbstractRepository implements Repository.Listener, Detachable
+{
+    private Repository repository;
+
+    private boolean detached;
+
+    public SecondaryRepository( Repository repository )
+    {
+        super();
+        this.repository = repository;
+        this.detached = false;
+        for ( Monitor monitor : repository.getMonitors() )
+        {
+            register( new SecondaryMonitor( monitor ) );
+        }
+        repository.addListener( this );
+    }
+
+    public void detach()
+    {
+        detached = true;
+        repository.removeListener( this );
+        for ( Monitor monitor : getMonitors() )
+        {
+            ((Detachable) monitor).detach();
+        }
+    }
+
+    /**
+     * @see 
org.apache.commons.monitoring.Repository.Listener#newMonitorInstance(org.apache.commons.monitoring.Monitor)
+     */
+    public void newMonitorInstance( Monitor monitor )
+    {
+        if ( ! detached )
+        {
+            register( new SecondaryMonitor( monitor ) );
+        }
+    }
+
+    /**
+     * @see 
org.apache.commons.monitoring.Repository#addListener(org.apache.commons.monitoring.Repository.Listener)
+     */
+    public void addListener( Listener listener )
+    {
+        throw new UnsupportedOperationException( "Only primary Repository 
accepts listeners" );
+    }
+
+    /**
+     * @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" );
+    }
+
+}

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

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

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

Added: 
commons/sandbox/monitoring/trunk/src/site/resources/images/monitoring-logo-white.png
URL: 
http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/site/resources/images/monitoring-logo-white.png?rev=618221&view=auto
==============================================================================
Binary file - no diff available.

Propchange: 
commons/sandbox/monitoring/trunk/src/site/resources/images/monitoring-logo-white.png
------------------------------------------------------------------------------
    svn:mime-type = image/png

Added: 
commons/sandbox/monitoring/trunk/src/site/resources/images/monitoring-logo-white.xcf
URL: 
http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/site/resources/images/monitoring-logo-white.xcf?rev=618221&view=auto
==============================================================================
Binary file - no diff available.

Propchange: 
commons/sandbox/monitoring/trunk/src/site/resources/images/monitoring-logo-white.xcf
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Modified: 
commons/sandbox/monitoring/trunk/src/test/java/org/apache/commons/monitoring/StopWatchTest.java
URL: 
http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/test/java/org/apache/commons/monitoring/StopWatchTest.java?rev=618221&r1=618220&r2=618221&view=diff
==============================================================================
--- 
commons/sandbox/monitoring/trunk/src/test/java/org/apache/commons/monitoring/StopWatchTest.java
 (original)
+++ 
commons/sandbox/monitoring/trunk/src/test/java/org/apache/commons/monitoring/StopWatchTest.java
 Mon Feb  4 02:03:23 2008
@@ -104,7 +104,7 @@
             super( monitor );
         }
 
-        protected long nanotime()
+        protected long time()
         {
             return time;
         }

Modified: 
commons/sandbox/monitoring/trunk/src/test/java/org/apache/commons/monitoring/impl/CompositeValuesMonitorTest.java
URL: 
http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/test/java/org/apache/commons/monitoring/impl/CompositeValuesMonitorTest.java?rev=618221&r1=618220&r2=618221&view=diff
==============================================================================
--- 
commons/sandbox/monitoring/trunk/src/test/java/org/apache/commons/monitoring/impl/CompositeValuesMonitorTest.java
 (original)
+++ 
commons/sandbox/monitoring/trunk/src/test/java/org/apache/commons/monitoring/impl/CompositeValuesMonitorTest.java
 Mon Feb  4 02:03:23 2008
@@ -51,14 +51,14 @@
     {
         Monitor monitor = new CompositeValuesMonitor( new Monitor.Key( 
"MonitorTest.testComposite", "test", "utils" ) );
         Counter counter = monitor.getCounter( "COUNTER" );
-        Counter secondary = new ThreadSafeCounter();
         Composite<Counter> composite = (Composite<Counter>) counter;
 
         counter.add( 1 );
         assertEquals( 1, counter.get() );
+
+        Counter secondary = composite.createSecondary();
         assertEquals( 0, secondary.get() );
 
-        composite.addSecondary( secondary );
         counter.add( 1 );
         assertEquals( 2, counter.get() );
         assertEquals( 1, secondary.get() );
@@ -78,14 +78,13 @@
     {
         Monitor monitor = new CompositeValuesMonitor( new Monitor.Key( 
"MonitorTest.testComposite", "test", "utils" ) );
         Gauge gauge = monitor.getGauge( "GAUGE" );
-        Gauge secondary = new ThreadSafeGauge();
         Composite<Gauge> composite = (Composite<Gauge>) gauge;
 
         gauge.increment();
         assertEquals( 1, gauge.get() );
+        Gauge secondary = composite.createSecondary();
         assertEquals( 0, secondary.get() );
 
-        composite.addSecondary( secondary );
         gauge.increment();
         assertEquals( 2, gauge.get() );
         assertEquals( 2, secondary.get() );

Modified: 
commons/sandbox/monitoring/trunk/src/test/java/org/apache/commons/monitoring/impl/ThreadSafeCounterTest.java
URL: 
http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/test/java/org/apache/commons/monitoring/impl/ThreadSafeCounterTest.java?rev=618221&r1=618220&r2=618221&view=diff
==============================================================================
--- 
commons/sandbox/monitoring/trunk/src/test/java/org/apache/commons/monitoring/impl/ThreadSafeCounterTest.java
 (original)
+++ 
commons/sandbox/monitoring/trunk/src/test/java/org/apache/commons/monitoring/impl/ThreadSafeCounterTest.java
 Mon Feb  4 02:03:23 2008
@@ -28,7 +28,7 @@
     public void testValue()
         throws Exception
     {
-        Counter counter = new ThreadSafeCounter();
+        Counter counter = new ThreadSafeCounter( "test" );
 
         counter.set( 1 );
         assertEquals( 1, counter.getMin() );

Modified: 
commons/sandbox/monitoring/trunk/src/test/java/org/apache/commons/monitoring/impl/ThreadSafeGaugeTest.java
URL: 
http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/test/java/org/apache/commons/monitoring/impl/ThreadSafeGaugeTest.java?rev=618221&r1=618220&r2=618221&view=diff
==============================================================================
--- 
commons/sandbox/monitoring/trunk/src/test/java/org/apache/commons/monitoring/impl/ThreadSafeGaugeTest.java
 (original)
+++ 
commons/sandbox/monitoring/trunk/src/test/java/org/apache/commons/monitoring/impl/ThreadSafeGaugeTest.java
 Mon Feb  4 02:03:23 2008
@@ -29,7 +29,7 @@
     public void testValue()
         throws Exception
     {
-        Gauge gauge = new ThreadSafeGauge();
+        Gauge gauge = new ThreadSafeGauge( "test" );
 
         gauge.set( 1 );
         assertEquals( 1, gauge.getMin() );
@@ -68,7 +68,7 @@
     public void testCompteMean()
         throws Exception
     {
-        Gauge gauge = new MockTimeGauge();
+        Gauge gauge = new MockTimeGauge( "test" );
 
         time = 0;
         gauge.increment();
@@ -84,11 +84,23 @@
         assertEquals( 1.5D, gauge.getMean(), 0D );
     }
 
+    /**
+     * A custom ThreadSafeGauge that use a mock nanoTime implementation to make
+     * timing predictable during unit test execution.
+     *
+     * @author <a href="mailto:[EMAIL PROTECTED]">Nicolas De Loof</a>
+     */
     private class MockTimeGauge
         extends ThreadSafeGauge
     {
+
+        public MockTimeGauge( String role )
+        {
+            super( role );
+        }
+
         @Override
-        protected long nanoTime()
+        protected long time()
         {
             return time;
         }

Added: 
commons/sandbox/monitoring/trunk/src/test/java/org/apache/commons/monitoring/listener/SecondaryReposioryTest.java
URL: 
http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/test/java/org/apache/commons/monitoring/listener/SecondaryReposioryTest.java?rev=618221&view=auto
==============================================================================
--- 
commons/sandbox/monitoring/trunk/src/test/java/org/apache/commons/monitoring/listener/SecondaryReposioryTest.java
 (added)
+++ 
commons/sandbox/monitoring/trunk/src/test/java/org/apache/commons/monitoring/listener/SecondaryReposioryTest.java
 Mon Feb  4 02:03:23 2008
@@ -0,0 +1,66 @@
+/*
+ * 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.listener;
+
+import org.apache.commons.monitoring.Repository;
+import org.apache.commons.monitoring.impl.DefaultRepository;
+import org.apache.commons.monitoring.listeners.SecondaryRepository;
+
+import junit.framework.TestCase;
+
+/**
+ *
+ * @author <a href="mailto:[EMAIL PROTECTED]">Nicolas De Loof</a>
+ */
+public class SecondaryReposioryTest
+    extends TestCase
+{
+    public void testSecondaryRepository()
+        throws Exception
+    {
+        Repository primary = new DefaultRepository();
+        primary.getMonitor( "test" ).getCounter( "COUNTER" ).add( 10 );
+        primary.getMonitor( "test" ).getGauge( "GAUGE" ).set( 5 );
+
+        SecondaryRepository secondary = new SecondaryRepository( primary );
+        assertNotNull( secondary.getMonitor( "test" ) );
+        assertNotNull( secondary.getMonitor( "test" ).getCounter( "COUNTER" ) 
);
+        assertNotNull( secondary.getMonitor( "test" ).getGauge( "GAUGE" ) );
+        assertEquals( 0, secondary.getMonitor( "test" ).getCounter( "COUNTER" 
).get() );
+        assertEquals( 5, secondary.getMonitor( "test" ).getGauge( "GAUGE" 
).get() );
+
+        primary.getMonitor( "test" ).getCounter( "COUNTER" ).add( 10 );
+        primary.getMonitor( "test" ).getGauge( "GAUGE" ).increment();
+        assertEquals( 10, secondary.getMonitor( "test" ).getCounter( "COUNTER" 
).get() );
+        assertEquals( 6, secondary.getMonitor( "test" ).getGauge( "GAUGE" 
).get() );
+
+        primary.getMonitor( "new" ).getCounter( "COUNTER" ).add( 10 );
+        assertEquals( 10, secondary.getMonitor( "new" ).getCounter( "COUNTER" 
).get() );
+
+        secondary.detach();
+
+        primary.getMonitor( "anotherone" ).getCounter( "COUNTER" ).add( 10 );
+        primary.getMonitor( "test" ).getCounter( "COUNTER" ).add( 10 );
+        primary.getMonitor( "test" ).getGauge( "GAUGE" ).increment();
+        assertNull( secondary.getMonitor( "anotherone" ) );
+        assertEquals( 30, primary.getMonitor( "test" ).getCounter( "COUNTER" 
).get() );
+        assertEquals( 10, secondary.getMonitor( "test" ).getCounter( "COUNTER" 
).get() );
+        assertEquals( 7, primary.getMonitor( "test" ).getGauge( "GAUGE" 
).get() );
+        assertEquals( 6, secondary.getMonitor( "test" ).getGauge( "GAUGE" 
).get() );
+    }
+}

Propchange: 
commons/sandbox/monitoring/trunk/src/test/java/org/apache/commons/monitoring/listener/SecondaryReposioryTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
commons/sandbox/monitoring/trunk/src/test/java/org/apache/commons/monitoring/listener/SecondaryReposioryTest.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: 
commons/sandbox/monitoring/trunk/src/test/java/org/apache/commons/monitoring/listener/SecondaryReposioryTest.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain


Reply via email to