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 );