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/07 09:22:33 UTC

svn commit: r634580 - in /commons/sandbox/monitoring/trunk/src: main/java/org/apache/commons/monitoring/ main/java/org/apache/commons/monitoring/impl/repositories/ main/java/org/apache/commons/monitoring/reporting/ test/java/org/apache/commons/monitori...

Author: nicolas
Date: Fri Mar  7 00:22:14 2008
New Revision: 634580

URL: http://svn.apache.org/viewvc?rev=634580&view=rev
Log:
fix Selector not being determinist when multiple get methods with various args
fix monitor.Key constructor to avoid nulls
add convenience Monitoring.start( Monitor )

Modified:
    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/impl/repositories/AbstractRepository.java
    commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/Selector.java
    commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/SelectorPeriodicLogger.java
    commons/sandbox/monitoring/trunk/src/test/java/org/apache/commons/monitoring/reporting/SelectorTest.java

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=634580&r1=634579&r2=634580&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 Fri Mar  7 00:22:14 2008
@@ -110,6 +110,8 @@
      */
     public static class Key
     {
+        public final static String DEFAULT = "";
+
         private final String name;
 
         private final String category;
@@ -119,9 +121,13 @@
         public Key( String name, String category, String subsystem )
         {
             super();
+            if (name == null)
+            {
+                throw new IllegalArgumentException( "A name must be provided" );
+            }
             this.name = name;
-            this.category = category;
-            this.subsystem = subsystem;
+            this.category = category != null ? category : DEFAULT;
+            this.subsystem = subsystem != null ? subsystem : DEFAULT;;
         }
 
         @Override

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=634580&r1=634579&r2=634580&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 Fri Mar  7 00:22:14 2008
@@ -17,6 +17,7 @@
 
 package org.apache.commons.monitoring;
 
+import org.apache.commons.monitoring.Monitor.Key;
 import org.apache.commons.monitoring.impl.repositories.DefaultRepository;
 
 /**
@@ -45,22 +46,27 @@
 
     public static Monitor getMonitor( String name )
     {
-        return getMonitor( name, null, null );
+        return getMonitor( name, Key.DEFAULT, Key.DEFAULT );
     }
 
     public static StopWatch start( String name )
     {
-        return start( name, null, null );
+        return start( name, Key.DEFAULT, Key.DEFAULT );
     }
 
     public static StopWatch start( String name, String category )
     {
-        return start( name, category, null );
+        return start( name, category, Key.DEFAULT );
     }
 
     public static StopWatch start( String name, String category, String subsystem )
     {
-        return repository.start( getMonitor( name, category, subsystem ) );
+        return start( getMonitor( name, category, subsystem ) );
+    }
+
+    public static StopWatch start( Monitor monitor )
+    {
+        return repository.start( monitor );
     }
 
     public static void setRepository( Repository repository )

Modified: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/repositories/AbstractRepository.java
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/repositories/AbstractRepository.java?rev=634580&r1=634579&r2=634580&view=diff
==============================================================================
--- commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/repositories/AbstractRepository.java (original)
+++ commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/repositories/AbstractRepository.java Fri Mar  7 00:22:14 2008
@@ -49,12 +49,12 @@
 
     public Monitor getMonitor( String name )
     {
-        return getMonitor( name, null, null );
+        return getMonitor( name, Key.DEFAULT, Key.DEFAULT );
     }
 
     public Monitor getMonitor( String name, String category )
     {
-        return getMonitor( name, category, null );
+        return getMonitor( name, category, Key.DEFAULT );
     }
 
     public Monitor getMonitor( String name, String category, String subsystem )

Modified: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/Selector.java
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/Selector.java?rev=634580&r1=634579&r2=634580&view=diff
==============================================================================
--- commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/Selector.java (original)
+++ commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/Selector.java Fri Mar  7 00:22:14 2008
@@ -35,10 +35,15 @@
 public class Selector
 {
 
+    /**
+     * 
+     */
+    private static final String SEP = "/";
     private String path;
 
     /**
      * Constructor
+     *
      * @param path
      */
     public Selector( String path )
@@ -53,12 +58,25 @@
     public Object select( Object resource )
     {
         Stack<String> stack = new Stack<String>();
-        StringTokenizer tokenizer = new StringTokenizer( path, "/" );
-        while ( tokenizer.hasMoreTokens() )
+        StringTokenizer tokenizer = new StringTokenizer( path, SEP, true );
+        String previous = null;
+        while( tokenizer.hasMoreTokens() )
         {
-            stack.push( tokenizer.nextToken() );
+            String next = tokenizer.nextToken();
+            if ( SEP.equals( next ) )
+            {
+                if ( SEP.equals( previous ) )
+                {
+                    stack.push( "" );
+                }
+            }
+            else
+            {
+                stack.push( next );
+            }
+            previous = next;
         }
-        if ( path.endsWith( "/" ) )
+        if ( path.endsWith( SEP ) )
         {
             stack.push( "" );
         }
@@ -67,7 +85,7 @@
         return select( resource, stack );
     }
 
-    @SuppressWarnings("unchecked")
+    @SuppressWarnings( "unchecked" )
     protected Object select( Object resource, Stack<String> path )
         throws IllegalArgumentException
     {
@@ -92,7 +110,7 @@
             throw new IllegalArgumentException( "Failed to invoke " + accessor );
         }
 
-        if ( resource instanceof Collection && ! path.isEmpty() )
+        if ( resource instanceof Collection && !path.isEmpty() )
         {
             Collection input = (Collection) resource;
             Collection result = new ArrayList( input.size() );
@@ -115,13 +133,15 @@
     }
 
     /**
-     * Retrieve a getter method that only requires String parameters
+     * Retrieve a getter method that only requires String parameters. When multiple methods
+     * match, the on with the most parameters is returned, for example
+     * getMonitor( String, String, String ) in preference to getMonitor( String )
      *
      * @param resource
      * @param name
      * @return
      */
-    @SuppressWarnings("unchecked")
+    @SuppressWarnings( "unchecked" )
     protected Method getAccessor( Object resource, String name )
     {
         String accessor = "get";
@@ -130,6 +150,7 @@
             accessor += Character.toUpperCase( name.charAt( 0 ) ) + name.substring( 1 );
         }
         Method[] methods = resource.getClass().getMethods();
+        Method bestMatch = null;
         for ( int i = 0; i < methods.length; i++ )
         {
             Method method = methods[i];
@@ -147,10 +168,17 @@
                 }
                 if ( stringsOnly )
                 {
-                    return method;
+                    if ( bestMatch == null || bestMatch.getParameterTypes().length < method.getParameterTypes().length )
+                    {
+                        bestMatch = method;
+                    }
                 }
             }
         }
-        throw new IllegalArgumentException( "No accessor for " + name + " on resource " + resource );
+        if ( bestMatch == null )
+        {
+            throw new IllegalArgumentException( "No accessor for " + name + " on resource " + resource );
+        }
+        return bestMatch;
     }
 }

Modified: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/SelectorPeriodicLogger.java
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/SelectorPeriodicLogger.java?rev=634580&r1=634579&r2=634580&view=diff
==============================================================================
--- commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/SelectorPeriodicLogger.java (original)
+++ commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/SelectorPeriodicLogger.java Fri Mar  7 00:22:14 2008
@@ -18,6 +18,8 @@
 package org.apache.commons.monitoring.reporting;
 
 import java.io.IOException;
+import java.util.Arrays;
+import java.util.List;
 
 import org.apache.commons.monitoring.Repository;
 
@@ -40,17 +42,28 @@
      * @param repository the target monitoring repository
      * @param output the output file
      */
-    public SelectorPeriodicLogger( long period, Repository.Observable repository, String[] selectors )
+    public SelectorPeriodicLogger( long period, Repository.Observable repository, List<String> selectors )
     {
         super( period, repository );
-        this.selectors = new Selector[selectors.length];
-        for ( int i = 0; i < selectors.length; i++ )
+        this.selectors = new Selector[selectors.size()];
+        int i = 0;
+        for ( String path : selectors )
         {
-            this.selectors[i] = new Selector( selectors[i] );
+            this.selectors[i++] = new Selector( path );
         }
     }
 
     /**
+     * @param period the period (in ms) to log the monitoring state
+     * @param repository the target monitoring repository
+     * @param output the output file
+     */
+    public SelectorPeriodicLogger( long period, Repository.Observable repository, String[] selectors )
+    {
+        this( period, repository, Arrays.asList( selectors ) );
+    }
+
+    /**
      * Log the data from the (secondary) repository generated during the period
      *
      * @param period secondary repository that observed the monitored state
@@ -60,7 +73,7 @@
     protected final void log( Repository period )
         throws IOException
     {
-        Object[] values = new Object[ selectors.length ];
+        Object[] values = new Object[selectors.length];
         for ( int i = 0; i < selectors.length; i++ )
         {
             values[i] = selectors[i].select( period );

Modified: commons/sandbox/monitoring/trunk/src/test/java/org/apache/commons/monitoring/reporting/SelectorTest.java
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/test/java/org/apache/commons/monitoring/reporting/SelectorTest.java?rev=634580&r1=634579&r2=634580&view=diff
==============================================================================
--- commons/sandbox/monitoring/trunk/src/test/java/org/apache/commons/monitoring/reporting/SelectorTest.java (original)
+++ commons/sandbox/monitoring/trunk/src/test/java/org/apache/commons/monitoring/reporting/SelectorTest.java Fri Mar  7 00:22:14 2008
@@ -37,7 +37,7 @@
         throws Exception
     {
         Repository repository = new DefaultRepository();
-        Selector selector = new Selector( "monitor/test/counter/performances" );
+        Selector selector = new Selector( "monitor/test///counter/performances" );
 
         repository.getMonitor( "test" ).getCounter( Monitor.PERFORMANCES ).add( 1234, Unit.NANOS );
 
@@ -66,7 +66,7 @@
         throws Exception
     {
         Repository repository = new DefaultRepository();
-        Selector selector = new Selector( "monitor/test/counter/performances/" );
+        Selector selector = new Selector( "monitor/test///counter/performances/" );
 
         repository.getMonitor( "test" ).getCounter( Monitor.PERFORMANCES ).add( 1234, Unit.NANOS );