You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@turbine.apache.org by pa...@apache.org on 2018/12/13 18:17:40 UTC

svn commit: r1848876 [4/5] - in /turbine/fulcrum/trunk/yaafi/src: java/org/apache/fulcrum/yaafi/framework/component/ java/org/apache/fulcrum/yaafi/framework/container/ java/org/apache/fulcrum/yaafi/framework/crypto/ java/org/apache/fulcrum/yaafi/framew...

Modified: turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/interceptor/logging/LoggingInterceptorServiceImpl.java
URL: http://svn.apache.org/viewvc/turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/interceptor/logging/LoggingInterceptorServiceImpl.java?rev=1848876&r1=1848875&r2=1848876&view=diff
==============================================================================
--- turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/interceptor/logging/LoggingInterceptorServiceImpl.java (original)
+++ turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/interceptor/logging/LoggingInterceptorServiceImpl.java Thu Dec 13 18:17:39 2018
@@ -35,358 +35,306 @@ import org.apache.fulcrum.yaafi.intercep
 import org.apache.fulcrum.yaafi.interceptor.util.StopWatch;
 
 /**
- * A service logging of service invocations. The service allows to monitor
- * a list of services defined in the configuration.
+ * A service logging of service invocations. The service allows to monitor a
+ * list of services defined in the configuration.
  *
  * @author <a href="mailto:siegfried.goeschl@it20one.at">Siegfried Goeschl</a>
  */
 
-public class LoggingInterceptorServiceImpl
-    extends BaseInterceptorServiceImpl
-    implements LoggingInterceptorService, Reconfigurable, Initializable
-{
-    /** the maximum length of a dumped argument */
-    private static final int MAX_ARG_LENGTH = 2000;
-
-    /** seperator for the arguments in the logfile */
-    private static final String SEPERATOR = ";";
-
-    /** maximum argument length for dumping arguments */
-    private int maxArgLength;
-
-    /** the class name of the string builder to use */
-    private String toStringBuilderClassName;
-
-    /** monitor all excpetions independent from the monitored services */
-    private boolean monitorAllExceptions;
-
-    /** the ReflectionToStringBuilder class */
-    private Class<?> toStringBuilderClass;
-
-    /////////////////////////////////////////////////////////////////////////
-    // Avalon Service Lifecycle Implementation
-    /////////////////////////////////////////////////////////////////////////
-
-    /**
-     * Constructor
-     */
-    public LoggingInterceptorServiceImpl()
-    {
-        super();
-        this.maxArgLength = MAX_ARG_LENGTH;
-    }
-
-    /**
-     * @see org.apache.avalon.framework.configuration.Configurable#configure(org.apache.avalon.framework.configuration.Configuration)
-     */
-    public void configure(Configuration configuration) throws ConfigurationException
-    {
-        super.configure(configuration);
-
-        this.maxArgLength = configuration.getChild("maxArgLength").getValueAsInteger(MAX_ARG_LENGTH);
-        this.toStringBuilderClassName = configuration.getChild("toStringBuilderClass").getValue(ArgumentToStringBuilderImpl.class.getName());
-        this.monitorAllExceptions = configuration.getChild("monitorAllExceptions").getValueAsBoolean(true);
-    }
-
-    /**
-     * @see org.apache.avalon.framework.activity.Initializable#initialize()
-     */
-    public void initialize() throws Exception
-    {
-        // load the string builder class
-
-        ClassLoader classLoader = this.getClass().getClassLoader();
-
-        if( Clazz.hasClazz(classLoader, this.getToStringBuilderClassName()) )
-        {
-            this.toStringBuilderClass = Clazz.getClazz(
-                classLoader,
-                this.getToStringBuilderClassName()
-                );
-        }
-
-        // create an instance of the StringBuilder to see if everything works
-
-        InterceptorToStringBuilder interceptorToStringBuilder = this.createArgumentToStringBuilder(
-            this
-            );
-
-        interceptorToStringBuilder.toString();
-    }
-
-    /**
-     * @see org.apache.avalon.framework.configuration.Reconfigurable#reconfigure(org.apache.avalon.framework.configuration.Configuration)
-     */
-    public void reconfigure(Configuration configuration) throws ConfigurationException
-    {
-        super.reconfigure(configuration);
-        this.configure(configuration);
-    }
-
-    /////////////////////////////////////////////////////////////////////////
-    // Service interface implementation
-    /////////////////////////////////////////////////////////////////////////
-
-    /**
-     * @see org.apache.fulcrum.yaafi.framework.interceptor.AvalonInterceptorService#onEntry(org.apache.fulcrum.yaafi.framework.interceptor.AvalonInterceptorContext)
-     */
-    public void onEntry(AvalonInterceptorContext interceptorContext)
-    {
-        if( this.isServiceMonitored(interceptorContext ) )
-        {
-            if( this.getLogger().isInfoEnabled() )
-            {
-                String msg = this.toString(interceptorContext,null,ON_ENTRY);
-                this.getLogger().info(msg);
-                this.createStopWatch(interceptorContext);
-            }
-        }
-    }
-
-    /**
-     * @see org.apache.fulcrum.yaafi.framework.interceptor.AvalonInterceptorService#onError(org.apache.fulcrum.yaafi.framework.interceptor.AvalonInterceptorContext, java.lang.Throwable)
-     */
-    public void onError(AvalonInterceptorContext interceptorContext,Throwable t)
-    {
-        if( this.getLogger().isErrorEnabled() )
-        {
-	        if( this.isMonitorAllExceptions() || this.isServiceMonitored(interceptorContext) )
-	        {
-	            StopWatch stopWatch = this.getStopWatch(interceptorContext);
-	            stopWatch.stop();
-	            String msg = this.toString(interceptorContext, stopWatch, t);
-	            this.getLogger().error(msg);
-	        }
-        }
-    }
-
-    /**
-     * @see org.apache.fulcrum.yaafi.framework.interceptor.AvalonInterceptorService#onExit(org.apache.fulcrum.yaafi.framework.interceptor.AvalonInterceptorContext, java.lang.Object)
-     */
-    public void onExit(AvalonInterceptorContext interceptorContext, Object result)
-    {
-        if( this.isServiceMonitored(interceptorContext) )
-        {
-            if( this.getLogger().isDebugEnabled() )
-            {
-                StopWatch stopWatch = this.getStopWatch(interceptorContext);
-                stopWatch.stop();
-                String msg = this.toString(interceptorContext, stopWatch, result);
-                this.getLogger().debug(msg);
-            }
-        }
-    }
-
-    /////////////////////////////////////////////////////////////////////////
-    // Service Implementation
-    /////////////////////////////////////////////////////////////////////////
-
-    /**
-     * Creates a stop watch
-     *
-     * @param interceptorContext the current interceptor context
-     */
-    protected void createStopWatch(
-        AvalonInterceptorContext interceptorContext )
-    {
-        StopWatch stopWatch = new StopWatch();
-        stopWatch.start();
-        interceptorContext.getRequestContext().put(this.getServiceName(),stopWatch);
-    }
-
-    /**
-     * Gets the stop watch. Even if none is defined we return one
-     * in a proper state.
-     *
-     * @param interceptorContext the current interceptor context
-     * @return the stop watch
-     */
-    protected StopWatch getStopWatch(
-        AvalonInterceptorContext interceptorContext )
-    {
-        StopWatch result = (StopWatch) interceptorContext.getRequestContext().remove(
-            this.getServiceName()
-            );
-
-        if( result == null )
-        {
-            result = new StopWatch();
-            result.start();
-        }
-
-        return result;
-    }
-
-    /**
-     * @return Returns the maxLineLength.
-     */
-    protected int getMaxArgLength()
-    {
-        return maxArgLength;
-    }
-
-    /**
-     * @return Returns the monitorAllExceptions.
-     */
-    protected boolean isMonitorAllExceptions()
-    {
-        return monitorAllExceptions;
-    }
-
-    /**
-     * @return Returns the toStringBuilderClass.
-     */
-    protected Class<?> getToStringBuilderClass()
-    {
-        return toStringBuilderClass;
-    }
-
-    /**
-     * @return Returns the toStringBuilderClassName.
-     */
-    protected String getToStringBuilderClassName()
-    {
-        return toStringBuilderClassName;
-    }
-
-    /**
-     * Create an instance of an InterceptorToStringBuilder
-     *
-     * @param target the object to stringify
-     * @return the string builder
-     */
-    protected InterceptorToStringBuilder createArgumentToStringBuilder(Object target)
-    {
-        InterceptorToStringBuilder result = null;
-
-        try
-        {
-            result = (InterceptorToStringBuilder)
-            	this.getToStringBuilderClass().newInstance();
-        }
-        catch (Exception e)
-        {
-            String msg = "Unable to create an instance for " + this.getToStringBuilderClassName();
-            this.getLogger().error(msg,e);
-            result = new DefaultToStringBuilderImpl();
-        }
-
-        result.setTarget(target);
-        result.setMaxArgLength(this.getMaxArgLength());
-        result.setMode(1);
-
-        return result;
-    }
-
-    /**
-     * Create a string representation of a service invocation returning a result.
-     *
-     * @param avalonInterceptorContext the interceptor context
-     * @param stopWatch the stopwatch for the execution time
-     * @param result the result of the service invocation
-     * @return the string representation of the result
-     */
-    protected String toString(
-        AvalonInterceptorContext avalonInterceptorContext,
-        StopWatch stopWatch,
-        Object result )
-    {
-        StringBuilder methodSignature = new StringBuilder();
-        InterceptorToStringBuilder toStringBuilder = this.createArgumentToStringBuilder(result);
-
-        methodSignature.append( this.toString(avalonInterceptorContext, stopWatch, ON_EXIT) );
-        methodSignature.append(SEPERATOR);
-        methodSignature.append( "result={" );
-        methodSignature.append( toStringBuilder.toString() );
-        methodSignature.append( "}" );
-
-        return methodSignature.toString();
-    }
-
-    /**
-     * Create a string representation of a service invocation throwing a Throwable
-     *
-     * @param avalonInterceptorContext the interceptor context
-     * @param stopWatch the stopwatch for the execution time
-     * @param throwable the result of the service invocation
-     * @return the string representation of the result
-     */
-    protected String toString(
-        AvalonInterceptorContext avalonInterceptorContext,
-        StopWatch stopWatch,
-        Throwable throwable )
-    {
-        StringBuilder methodSignature = new StringBuilder();
-        InterceptorToStringBuilder toStringBuilder = this.createArgumentToStringBuilder(throwable);
-
-        methodSignature.append( this.toString(avalonInterceptorContext, stopWatch, ON_ERROR) );
-        methodSignature.append(SEPERATOR);
-        methodSignature.append( throwable.getClass().getName() );
-        methodSignature.append(SEPERATOR);
-        methodSignature.append( toStringBuilder.toString() );
-
-        return methodSignature.toString();
-    }
-
-    /**
-     * Create a method signature.
-     *
-     * @param interceptorContext the avalonInterceptorContext
-     * @param stopWatch the stopwatch for the execution time
-     * @param mode the mode (onEntry, onExit, onError)
-     * @return the debug output
-     */
-    protected String toString(
-        AvalonInterceptorContext interceptorContext, StopWatch stopWatch, int mode )
-    {
-        StringBuilder result = new StringBuilder();
-        Method method = interceptorContext.getMethod();
-        Object[] args = interceptorContext.getArgs();
-        InterceptorToStringBuilder toStringBuilder = null;
-        MethodToStringBuilderImpl methodToStringBuilder = new MethodToStringBuilderImpl(method);
-
-        if( args == null )
-        {
-            args = new Object[0];
-        }
-
-        result.append(interceptorContext.getTransactionId());
-        result.append(SEPERATOR);
-        result.append(interceptorContext.getInvocationId());
-        result.append(SEPERATOR);
-        result.append(interceptorContext.getInvocationDepth());
-        result.append(SEPERATOR);
-        result.append(mode);
-        result.append(SEPERATOR);
-        result.append(interceptorContext.getServiceShorthand());
-        result.append(SEPERATOR);
-        result.append(method.getName());
-        result.append(SEPERATOR);
-
-        if( stopWatch != null )
-        {
-            result.append(stopWatch.getTime());
-        }
-        else
-        {
-            result.append('0');
-        }
-
-        result.append(SEPERATOR);
-        result.append(methodToStringBuilder.toString());
-
-        if( (ON_ENTRY == mode) || (ON_ERROR == mode) )
-        {
-	        for( int i=0; i<args.length; i++ )
-	        {
-	            toStringBuilder = this.createArgumentToStringBuilder(args[i]);
-	            result.append(SEPERATOR);
-	            result.append("arg[" + i + "]:={");
-	            result.append( toStringBuilder.toString());
-	            result.append("}");
-	        }
-        }
+public class LoggingInterceptorServiceImpl extends BaseInterceptorServiceImpl
+		implements LoggingInterceptorService, Reconfigurable, Initializable {
+	/** the maximum length of a dumped argument */
+	private static final int MAX_ARG_LENGTH = 2000;
+
+	/** seperator for the arguments in the logfile */
+	private static final String SEPERATOR = ";";
+
+	/** maximum argument length for dumping arguments */
+	private int maxArgLength;
+
+	/** the class name of the string builder to use */
+	private String toStringBuilderClassName;
+
+	/** monitor all excpetions independent from the monitored services */
+	private boolean monitorAllExceptions;
+
+	/** the ReflectionToStringBuilder class */
+	private Class<?> toStringBuilderClass;
+
+	/////////////////////////////////////////////////////////////////////////
+	// Avalon Service Lifecycle Implementation
+	/////////////////////////////////////////////////////////////////////////
+
+	/**
+	 * Constructor
+	 */
+	public LoggingInterceptorServiceImpl() {
+		super();
+		this.maxArgLength = MAX_ARG_LENGTH;
+	}
+
+	/**
+	 * @see org.apache.avalon.framework.configuration.Configurable#configure(org.apache.avalon.framework.configuration.Configuration)
+	 */
+	public void configure(Configuration configuration) throws ConfigurationException {
+		super.configure(configuration);
+
+		this.maxArgLength = configuration.getChild("maxArgLength").getValueAsInteger(MAX_ARG_LENGTH);
+		this.toStringBuilderClassName = configuration.getChild("toStringBuilderClass")
+				.getValue(ArgumentToStringBuilderImpl.class.getName());
+		this.monitorAllExceptions = configuration.getChild("monitorAllExceptions").getValueAsBoolean(true);
+	}
+
+	/**
+	 * @see org.apache.avalon.framework.activity.Initializable#initialize()
+	 */
+	public void initialize() throws Exception {
+		// load the string builder class
+
+		ClassLoader classLoader = this.getClass().getClassLoader();
+
+		if (Clazz.hasClazz(classLoader, this.getToStringBuilderClassName())) {
+			this.toStringBuilderClass = Clazz.getClazz(classLoader, this.getToStringBuilderClassName());
+		}
+
+		// create an instance of the StringBuilder to see if everything works
+
+		InterceptorToStringBuilder interceptorToStringBuilder = this.createArgumentToStringBuilder(this);
+
+		interceptorToStringBuilder.toString();
+	}
+
+	/**
+	 * @see org.apache.avalon.framework.configuration.Reconfigurable#reconfigure(org.apache.avalon.framework.configuration.Configuration)
+	 */
+	public void reconfigure(Configuration configuration) throws ConfigurationException {
+		super.reconfigure(configuration);
+		this.configure(configuration);
+	}
+
+	/////////////////////////////////////////////////////////////////////////
+	// Service interface implementation
+	/////////////////////////////////////////////////////////////////////////
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see
+	 * org.apache.fulcrum.yaafi.interceptor.baseservice.BaseInterceptorServiceImpl#
+	 * onEntry(org.apache.fulcrum.yaafi.framework.interceptor.
+	 * AvalonInterceptorContext)
+	 */
+	public void onEntry(AvalonInterceptorContext interceptorContext) {
+		if (this.isServiceMonitored(interceptorContext) && this.getLogger().isInfoEnabled() == true) {
+			String msg = this.toString(interceptorContext, null, ON_ENTRY);
+			this.getLogger().info(msg);
+			this.createStopWatch(interceptorContext);
+		}
+	}
+
+	/* (non-Javadoc)
+	 * @see org.apache.fulcrum.yaafi.interceptor.baseservice.BaseInterceptorServiceImpl#onError(org.apache.fulcrum.yaafi.framework.interceptor.AvalonInterceptorContext, java.lang.Throwable)
+	 */
+	public void onError(AvalonInterceptorContext interceptorContext, Throwable t) {
+		if (this.getLogger().isErrorEnabled()
+				&& (this.isMonitorAllExceptions() || this.isServiceMonitored(interceptorContext))) {
+			StopWatch stopWatch = this.getStopWatch(interceptorContext);
+			stopWatch.stop();
+			String msg = this.toString(interceptorContext, stopWatch, t);
+			this.getLogger().error(msg);
+		}
+	}
+
+	/* (non-Javadoc)
+	 * @see org.apache.fulcrum.yaafi.interceptor.baseservice.BaseInterceptorServiceImpl#onExit(org.apache.fulcrum.yaafi.framework.interceptor.AvalonInterceptorContext, java.lang.Object)
+	 */
+	public void onExit(AvalonInterceptorContext interceptorContext, Object result) {
+		if (this.isServiceMonitored(interceptorContext) && this.getLogger().isDebugEnabled() == true) {
+			StopWatch stopWatch = this.getStopWatch(interceptorContext);
+			stopWatch.stop();
+			String msg = this.toString(interceptorContext, stopWatch, result);
+			this.getLogger().debug(msg);
+		}
+	}
+
+	/////////////////////////////////////////////////////////////////////////
+	// Service Implementation
+	/////////////////////////////////////////////////////////////////////////
+
+	/**
+	 * Creates a stop watch
+	 *
+	 * @param interceptorContext the current interceptor context
+	 */
+	protected void createStopWatch(AvalonInterceptorContext interceptorContext) {
+		StopWatch stopWatch = new StopWatch();
+		stopWatch.start();
+		interceptorContext.getRequestContext().put(this.getServiceName(), stopWatch);
+	}
+
+	/**
+	 * Gets the stop watch. Even if none is defined we return one in a proper state.
+	 *
+	 * @param interceptorContext the current interceptor context
+	 * @return the stop watch
+	 */
+	protected StopWatch getStopWatch(AvalonInterceptorContext interceptorContext) {
+		StopWatch result = (StopWatch) interceptorContext.getRequestContext().remove(this.getServiceName());
+
+		if (result == null) {
+			result = new StopWatch();
+			result.start();
+		}
+
+		return result;
+	}
+
+	/**
+	 * @return Returns the maxLineLength.
+	 */
+	protected int getMaxArgLength() {
+		return maxArgLength;
+	}
+
+	/**
+	 * @return Returns the monitorAllExceptions.
+	 */
+	protected boolean isMonitorAllExceptions() {
+		return monitorAllExceptions;
+	}
+
+	/**
+	 * @return Returns the toStringBuilderClass.
+	 */
+	protected Class<?> getToStringBuilderClass() {
+		return toStringBuilderClass;
+	}
+
+	/**
+	 * @return Returns the toStringBuilderClassName.
+	 */
+	protected String getToStringBuilderClassName() {
+		return toStringBuilderClassName;
+	}
+
+	/**
+	 * Create an instance of an InterceptorToStringBuilder
+	 *
+	 * @param target the object to stringify
+	 * @return the string builder
+	 */
+	protected InterceptorToStringBuilder createArgumentToStringBuilder(Object target) {
+		InterceptorToStringBuilder result = null;
+
+		try {
+			result = (InterceptorToStringBuilder) this.getToStringBuilderClass().newInstance();
+		} catch (Exception e) {
+			String msg = "Unable to create an instance for " + this.getToStringBuilderClassName();
+			this.getLogger().error(msg, e);
+			result = new DefaultToStringBuilderImpl();
+		}
+
+		result.setTarget(target);
+		result.setMaxArgLength(this.getMaxArgLength());
+		result.setMode(1);
+
+		return result;
+	}
+
+	/**
+	 * Create a string representation of a service invocation returning a result.
+	 *
+	 * @param avalonInterceptorContext the interceptor context
+	 * @param stopWatch                the stopwatch for the execution time
+	 * @param result                   the result of the service invocation
+	 * @return the string representation of the result
+	 */
+	protected String toString(AvalonInterceptorContext avalonInterceptorContext, StopWatch stopWatch, Object result) {
+		StringBuilder methodSignature = new StringBuilder();
+		InterceptorToStringBuilder toStringBuilder = this.createArgumentToStringBuilder(result);
+
+		methodSignature.append(this.toString(avalonInterceptorContext, stopWatch, ON_EXIT));
+		methodSignature.append(SEPERATOR);
+		methodSignature.append("result={");
+		methodSignature.append(toStringBuilder.toString());
+		methodSignature.append("}");
+
+		return methodSignature.toString();
+	}
+
+	/**
+	 * Create a string representation of a service invocation throwing a Throwable
+	 *
+	 * @param avalonInterceptorContext the interceptor context
+	 * @param stopWatch                the stopwatch for the execution time
+	 * @param throwable                the result of the service invocation
+	 * @return the string representation of the result
+	 */
+	protected String toString(AvalonInterceptorContext avalonInterceptorContext, StopWatch stopWatch,
+			Throwable throwable) {
+		StringBuilder methodSignature = new StringBuilder();
+		InterceptorToStringBuilder toStringBuilder = this.createArgumentToStringBuilder(throwable);
+
+		methodSignature.append(this.toString(avalonInterceptorContext, stopWatch, ON_ERROR));
+		methodSignature.append(SEPERATOR);
+		methodSignature.append(throwable.getClass().getName());
+		methodSignature.append(SEPERATOR);
+		methodSignature.append(toStringBuilder.toString());
+
+		return methodSignature.toString();
+	}
+
+	/**
+	 * Create a method signature.
+	 *
+	 * @param interceptorContext the avalonInterceptorContext
+	 * @param stopWatch          the stopwatch for the execution time
+	 * @param mode               the mode (onEntry, onExit, onError)
+	 * @return the debug output
+	 */
+	protected String toString(AvalonInterceptorContext interceptorContext, StopWatch stopWatch, int mode) {
+		StringBuilder result = new StringBuilder();
+		Method method = interceptorContext.getMethod();
+		Object[] args = interceptorContext.getArgs();
+		InterceptorToStringBuilder toStringBuilder = null;
+		MethodToStringBuilderImpl methodToStringBuilder = new MethodToStringBuilderImpl(method);
+
+		if (args == null) {
+			args = new Object[0];
+		}
+
+		result.append(interceptorContext.getTransactionId());
+		result.append(SEPERATOR);
+		result.append(interceptorContext.getInvocationId());
+		result.append(SEPERATOR);
+		result.append(interceptorContext.getInvocationDepth());
+		result.append(SEPERATOR);
+		result.append(mode);
+		result.append(SEPERATOR);
+		result.append(interceptorContext.getServiceShorthand());
+		result.append(SEPERATOR);
+		result.append(method.getName());
+		result.append(SEPERATOR);
+
+		if (stopWatch != null) {
+			result.append(stopWatch.getTime());
+		} else {
+			result.append('0');
+		}
+
+		result.append(SEPERATOR);
+		result.append(methodToStringBuilder.toString());
+
+		if (ON_ENTRY == mode || ON_ERROR == mode) {
+			for (int i = 0; i < args.length; i++) {
+				toStringBuilder = this.createArgumentToStringBuilder(args[i]);
+				result.append(SEPERATOR);
+				result.append("arg[" + i + "]:={");
+				result.append(toStringBuilder.toString());
+				result.append("}");
+			}
+		}
 
-        return result.toString();
-    }
+		return result.toString();
+	}
 }

Modified: turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/interceptor/performance/PerformanceInterceptorServiceImpl.java
URL: http://svn.apache.org/viewvc/turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/interceptor/performance/PerformanceInterceptorServiceImpl.java?rev=1848876&r1=1848875&r2=1848876&view=diff
==============================================================================
--- turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/interceptor/performance/PerformanceInterceptorServiceImpl.java (original)
+++ turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/interceptor/performance/PerformanceInterceptorServiceImpl.java Thu Dec 13 18:17:39 2018
@@ -38,266 +38,231 @@ import org.apache.fulcrum.yaafi.intercep
  * @author <a href="mailto:siegfried.goeschl@it20one.at">Siegfried Goeschl</a>
  */
 
-public class PerformanceInterceptorServiceImpl
-    extends BaseInterceptorServiceImpl
-    implements PerformanceInterceptorService, Reconfigurable, Contextualizable, ThreadSafe
-{
-	  /** the maximum length of a dumped argument */
-	  private static final int MAX_ARG_LENGTH = 100;
-
-    /** default length of the StringBuilder */
-    private static final int BUFFER_LENGTH = 2000;
-
-    /** seperator for the arguments in the logfile */
-    private static final String SEPERATOR = ";";
-
-    /** the tresholds in milliseconds to determine the loglevel */
-    private int[] tresholdList;
-
-    /** maximum argument length for dumping arguments */
-    private int maxArgLength;
-
-    /////////////////////////////////////////////////////////////////////////
-    // Avalon Service Lifecycle Implementation
-    /////////////////////////////////////////////////////////////////////////
-
-    /**
-     * Constructor
-     */
-    public PerformanceInterceptorServiceImpl()
-    {
-        super();
-        this.tresholdList = new int[5];
-    }
-
-    /**
-     * @see org.apache.avalon.framework.configuration.Configurable#configure(org.apache.avalon.framework.configuration.Configuration)
-     */
-    public void configure(Configuration configuration) throws ConfigurationException
-    {
-        super.configure(configuration);
-
-        this.maxArgLength = configuration.getChild("maxArgLength").getValueAsInteger(MAX_ARG_LENGTH);
-        Configuration tresholdConfiguration = configuration.getChild("tresholds");
-        this.tresholdList[0] = tresholdConfiguration.getChild("fatal").getAttributeAsInteger("millis", 5000);
-        this.tresholdList[1] = tresholdConfiguration.getChild("error").getAttributeAsInteger("millis", 1000);
-        this.tresholdList[2] = tresholdConfiguration.getChild("warn").getAttributeAsInteger("millis", 500);
-        this.tresholdList[3] = tresholdConfiguration.getChild("info").getAttributeAsInteger("millis", 100);
-        this.tresholdList[4] = tresholdConfiguration.getChild("debug").getAttributeAsInteger("millis", 10);
-    }
-
-    /**
-     * @see org.apache.avalon.framework.configuration.Reconfigurable#reconfigure(org.apache.avalon.framework.configuration.Configuration)
-     */
-    public void reconfigure(Configuration configuration) throws ConfigurationException
-    {
-        super.reconfigure(configuration);
-        this.configure(configuration);
-    }
-
-    /////////////////////////////////////////////////////////////////////////
-    // Service interface implementation
-    /////////////////////////////////////////////////////////////////////////
-
-    /**
-     * @see org.apache.fulcrum.yaafi.framework.interceptor.AvalonInterceptorService#onEntry(org.apache.fulcrum.yaafi.framework.interceptor.AvalonInterceptorContext)
-     */
-    public void onEntry(AvalonInterceptorContext interceptorContext)
-    {
-        if( this.isServiceMonitored(interceptorContext ) )
-        {
-            this.createStopWatch(interceptorContext);
-        }
-    }
-
-    /**
-     * @see org.apache.fulcrum.yaafi.framework.interceptor.AvalonInterceptorService#onError(org.apache.fulcrum.yaafi.framework.interceptor.AvalonInterceptorContext, java.lang.Throwable)
-     */
-    public void onError(AvalonInterceptorContext interceptorContext,Throwable t)
-    {
-        if( this.isServiceMonitored(interceptorContext) )
-        {
-            StopWatch stopWatch = this.getStopWatch(interceptorContext);
-            stopWatch.stop();
-            this.log( ON_ERROR, interceptorContext, stopWatch );
-        }
-    }
-
-    /**
-     * @see org.apache.fulcrum.yaafi.framework.interceptor.AvalonInterceptorService#onExit(org.apache.fulcrum.yaafi.framework.interceptor.AvalonInterceptorContext, java.lang.Object)
-     */
-    public void onExit(AvalonInterceptorContext interceptorContext, Object result)
-    {
-        if( this.isServiceMonitored(interceptorContext) )
-        {
-            if( this.isServiceMonitored(interceptorContext) )
-            {
-                StopWatch stopWatch = this.getStopWatch(interceptorContext);
-                stopWatch.stop();
-                this.log( ON_EXIT, interceptorContext, stopWatch );
-            }
-        }
-    }
-
-    /////////////////////////////////////////////////////////////////////////
-    // Service Implementation
-    /////////////////////////////////////////////////////////////////////////
-
-    /**
-     * Creates a stop watch
-     *
-     * @param interceptorContext the current interceptor context
-     */
-    protected void createStopWatch(
-        AvalonInterceptorContext interceptorContext )
-    {
-        StopWatch stopWatch = new StopWatch();
-        stopWatch.start();
-        interceptorContext.getRequestContext().put(this.getServiceName(),stopWatch);
-    }
-
-    /**
-     * Gets the stop watch
-     *
-     * @param interceptorContext the current interceptor context
-     * @return the stop watch
-     */
-    protected StopWatch getStopWatch(
-        AvalonInterceptorContext interceptorContext )
-    {
-        return (StopWatch) interceptorContext.getRequestContext().remove(
-            this.getServiceName()
-            );
-    }
-
-    /**
-     * Logs the execution time.
-     *
-     * @param mode the invocation mode (onEntry, onExit, onError)
-     * @param interceptorContext the current interceptor context
-     * @param stopWatch the stop watch
-     */
-    protected void log(
-        int mode,
-        AvalonInterceptorContext interceptorContext,
-        StopWatch stopWatch
-        )
-    {
-        String msg = null;
-        long time = stopWatch.getTime();
-
-        if( time >= tresholdList[0] )
-        {
-            if( this.getLogger().isFatalErrorEnabled() )
-            {
-	            msg = this.toString(interceptorContext,stopWatch,mode);
-	            this.getLogger().fatalError(msg);
-            }
-        }
-        else if( time >= tresholdList[1] )
-        {
-            if( this.getLogger().isErrorEnabled() )
-            {
-	            msg = this.toString(interceptorContext,stopWatch,mode);
-	            this.getLogger().error(msg);
-            }
-        }
-        else if( time >= tresholdList[2] )
-        {
-            if( this.getLogger().isWarnEnabled() )
-            {
-	            msg = this.toString(interceptorContext,stopWatch,mode);
-	            this.getLogger().warn(msg);
-            }
-        }
-        else if( time >= tresholdList[3] )
-        {
-            if( this.getLogger().isInfoEnabled() )
-            {
-	            msg = this.toString(interceptorContext,stopWatch,mode);
-	            this.getLogger().info(msg);
-            }
-        }
-        else if( time >= tresholdList[4] )
-        {
-            if( this.getLogger().isDebugEnabled() )
-            {
-	            msg = this.toString(interceptorContext,stopWatch,mode);
-	            this.getLogger().debug(msg);
-            }
-        }
-    }
-
-    /**
-     * Create the log message for the performance logfile.
-     *
-     * @param interceptorContext the context
-     * @param stopWatch the stopwatch
-     * @param mode the mode (onEntry, onExit, onError)
-     * @return the log message
-     */
-    protected String toString(
-        AvalonInterceptorContext interceptorContext,
-        StopWatch stopWatch,
-        int mode
-        )
-    {
-        Method method = interceptorContext.getMethod();
-        Object[] args = interceptorContext.getArgs();
-        MethodToStringBuilderImpl methodToStringBuilder = new MethodToStringBuilderImpl(method);
-        StringBuilder result = new StringBuilder(BUFFER_LENGTH);
-
-        result.append(interceptorContext.getTransactionId());
-        result.append(SEPERATOR);
-        result.append(interceptorContext.getInvocationId());
-        result.append(SEPERATOR);
-        result.append(interceptorContext.getInvocationDepth());
-        result.append(SEPERATOR);
-        result.append(mode);
-        result.append(SEPERATOR);
-        result.append(interceptorContext.getServiceShorthand());
-        result.append(SEPERATOR);
-        result.append(method.getName());
-        result.append(SEPERATOR);
-        result.append(stopWatch.getTime());
-        result.append(SEPERATOR);
-        result.append(methodToStringBuilder.toString());
-        result.append(SEPERATOR);
-        result.append(this.toString(args));
-
-        return result.toString();
-    }
-
-    /**
-     * Prints the argument list.
-     *
-     * @param args array of arguments
-     * @return the debug output
-     */
-    protected String toString( Object[] args )
-    {
-        StringBuilder result = new StringBuilder();
-        ArgumentToStringBuilderImpl toStringBuilder = null;
-
-        if( args == null )
-        {
-            args = new Object[0];
-        }
-
-        for( int i=0; i<args.length; i++ )
-        {
-            toStringBuilder = new ArgumentToStringBuilderImpl(args[i],this.maxArgLength,1);
-            result.append("arg[" + i + "]:={");
-            result.append( toStringBuilder.toString());
-            result.append("}");
-
-            if( i<args.length-1)
-            {
-            		result.append(SEPERATOR);
-            }
-        }
+public class PerformanceInterceptorServiceImpl extends BaseInterceptorServiceImpl
+		implements PerformanceInterceptorService, Reconfigurable, Contextualizable, ThreadSafe {
+	/** the maximum length of a dumped argument */
+	private static final int MAX_ARG_LENGTH = 100;
+
+	/** default length of the StringBuilder */
+	private static final int BUFFER_LENGTH = 2000;
+
+	/** seperator for the arguments in the logfile */
+	private static final String SEPERATOR = ";";
+
+	/** the tresholds in milliseconds to determine the loglevel */
+	private int[] tresholdList;
+
+	/** maximum argument length for dumping arguments */
+	private int maxArgLength;
+
+	/////////////////////////////////////////////////////////////////////////
+	// Avalon Service Lifecycle Implementation
+	/////////////////////////////////////////////////////////////////////////
+
+	/**
+	 * Constructor
+	 */
+	public PerformanceInterceptorServiceImpl() {
+		super();
+		this.tresholdList = new int[5];
+	}
+
+	/**
+	 * @see org.apache.avalon.framework.configuration.Configurable#configure(org.apache.avalon.framework.configuration.Configuration)
+	 */
+	public void configure(Configuration configuration) throws ConfigurationException {
+		super.configure(configuration);
+
+		this.maxArgLength = configuration.getChild("maxArgLength").getValueAsInteger(MAX_ARG_LENGTH);
+		Configuration tresholdConfiguration = configuration.getChild("tresholds");
+		this.tresholdList[0] = tresholdConfiguration.getChild("fatal").getAttributeAsInteger("millis", 5000);
+		this.tresholdList[1] = tresholdConfiguration.getChild("error").getAttributeAsInteger("millis", 1000);
+		this.tresholdList[2] = tresholdConfiguration.getChild("warn").getAttributeAsInteger("millis", 500);
+		this.tresholdList[3] = tresholdConfiguration.getChild("info").getAttributeAsInteger("millis", 100);
+		this.tresholdList[4] = tresholdConfiguration.getChild("debug").getAttributeAsInteger("millis", 10);
+	}
+
+	/**
+	 * @see org.apache.avalon.framework.configuration.Reconfigurable#reconfigure(org.apache.avalon.framework.configuration.Configuration)
+	 */
+	public void reconfigure(Configuration configuration) throws ConfigurationException {
+		super.reconfigure(configuration);
+		this.configure(configuration);
+	}
+
+	/////////////////////////////////////////////////////////////////////////
+	// Service interface implementation
+	/////////////////////////////////////////////////////////////////////////
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see
+	 * org.apache.fulcrum.yaafi.interceptor.baseservice.BaseInterceptorServiceImpl#
+	 * onEntry(org.apache.fulcrum.yaafi.framework.interceptor.
+	 * AvalonInterceptorContext)
+	 */
+	public void onEntry(AvalonInterceptorContext interceptorContext) {
+		if (this.isServiceMonitored(interceptorContext)) {
+			this.createStopWatch(interceptorContext);
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see
+	 * org.apache.fulcrum.yaafi.interceptor.baseservice.BaseInterceptorServiceImpl#
+	 * onError(org.apache.fulcrum.yaafi.framework.interceptor.
+	 * AvalonInterceptorContext, java.lang.Throwable)
+	 */
+	public void onError(AvalonInterceptorContext interceptorContext, Throwable t) {
+		if (this.isServiceMonitored(interceptorContext)) {
+			StopWatch stopWatch = this.getStopWatch(interceptorContext);
+			stopWatch.stop();
+			this.log(ON_ERROR, interceptorContext, stopWatch);
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see
+	 * org.apache.fulcrum.yaafi.interceptor.baseservice.BaseInterceptorServiceImpl#
+	 * onExit(org.apache.fulcrum.yaafi.framework.interceptor.
+	 * AvalonInterceptorContext, java.lang.Object)
+	 */
+	public void onExit(AvalonInterceptorContext interceptorContext, Object result) {
+		if (this.isServiceMonitored(interceptorContext)) {
+			StopWatch stopWatch = this.getStopWatch(interceptorContext);
+			stopWatch.stop();
+			this.log(ON_EXIT, interceptorContext, stopWatch);
+		}
+	}
+
+	/////////////////////////////////////////////////////////////////////////
+	// Service Implementation
+	/////////////////////////////////////////////////////////////////////////
+
+	/**
+	 * Creates a stop watch
+	 *
+	 * @param interceptorContext the current interceptor context
+	 */
+	protected void createStopWatch(AvalonInterceptorContext interceptorContext) {
+		StopWatch stopWatch = new StopWatch();
+		stopWatch.start();
+		interceptorContext.getRequestContext().put(this.getServiceName(), stopWatch);
+	}
+
+	/**
+	 * Gets the stop watch
+	 *
+	 * @param interceptorContext the current interceptor context
+	 * @return the stop watch
+	 */
+	protected StopWatch getStopWatch(AvalonInterceptorContext interceptorContext) {
+		return (StopWatch) interceptorContext.getRequestContext().remove(this.getServiceName());
+	}
+
+	/**
+	 * Logs the execution time.
+	 *
+	 * @param mode               the invocation mode (onEntry, onExit, onError)
+	 * @param interceptorContext the current interceptor context
+	 * @param stopWatch          the stop watch
+	 */
+	protected void log(int mode, AvalonInterceptorContext interceptorContext, StopWatch stopWatch) {
+		String msg = null;
+		long time = stopWatch.getTime();
+
+		if (time >= tresholdList[0]) {
+			if (this.getLogger().isFatalErrorEnabled()) {
+				msg = this.toString(interceptorContext, stopWatch, mode);
+				this.getLogger().fatalError(msg);
+			}
+		} else if (time >= tresholdList[1]) {
+			if (this.getLogger().isErrorEnabled()) {
+				msg = this.toString(interceptorContext, stopWatch, mode);
+				this.getLogger().error(msg);
+			}
+		} else if (time >= tresholdList[2]) {
+			if (this.getLogger().isWarnEnabled()) {
+				msg = this.toString(interceptorContext, stopWatch, mode);
+				this.getLogger().warn(msg);
+			}
+		} else if (time >= tresholdList[3]) {
+			if (this.getLogger().isInfoEnabled()) {
+				msg = this.toString(interceptorContext, stopWatch, mode);
+				this.getLogger().info(msg);
+			}
+		} else if (time >= tresholdList[4] && this.getLogger().isDebugEnabled() == true) {
+			msg = this.toString(interceptorContext, stopWatch, mode);
+			this.getLogger().debug(msg);
+		}
+	}
+
+	/**
+	 * Create the log message for the performance logfile.
+	 *
+	 * @param interceptorContext the context
+	 * @param stopWatch          the stopwatch
+	 * @param mode               the mode (onEntry, onExit, onError)
+	 * @return the log message
+	 */
+	protected String toString(AvalonInterceptorContext interceptorContext, StopWatch stopWatch, int mode) {
+		Method method = interceptorContext.getMethod();
+		Object[] args = interceptorContext.getArgs();
+		MethodToStringBuilderImpl methodToStringBuilder = new MethodToStringBuilderImpl(method);
+		StringBuilder result = new StringBuilder(BUFFER_LENGTH);
+
+		result.append(interceptorContext.getTransactionId());
+		result.append(SEPERATOR);
+		result.append(interceptorContext.getInvocationId());
+		result.append(SEPERATOR);
+		result.append(interceptorContext.getInvocationDepth());
+		result.append(SEPERATOR);
+		result.append(mode);
+		result.append(SEPERATOR);
+		result.append(interceptorContext.getServiceShorthand());
+		result.append(SEPERATOR);
+		result.append(method.getName());
+		result.append(SEPERATOR);
+		result.append(stopWatch.getTime());
+		result.append(SEPERATOR);
+		result.append(methodToStringBuilder.toString());
+		result.append(SEPERATOR);
+		result.append(this.toString(args));
+
+		return result.toString();
+	}
+
+	/**
+	 * Prints the argument list.
+	 *
+	 * @param args array of arguments
+	 * @return the debug output
+	 */
+	protected String toString(Object[] args) {
+		StringBuilder result = new StringBuilder();
+		ArgumentToStringBuilderImpl toStringBuilder = null;
+
+		if (args == null) {
+			args = new Object[0];
+		}
+
+		for (int i = 0; i < args.length; i++) {
+			toStringBuilder = new ArgumentToStringBuilderImpl(args[i], this.maxArgLength, 1);
+			result.append("arg[" + i + "]:={");
+			result.append(toStringBuilder.toString());
+			result.append("}");
+
+			if (i < args.length - 1) {
+				result.append(SEPERATOR);
+			}
+		}
 
-        return result.toString();
-    }
+		return result.toString();
+	}
 
 }

Modified: turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/interceptor/util/InterceptorToStringBuilder.java
URL: http://svn.apache.org/viewvc/turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/interceptor/util/InterceptorToStringBuilder.java?rev=1848876&r1=1848875&r2=1848876&view=diff
==============================================================================
--- turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/interceptor/util/InterceptorToStringBuilder.java (original)
+++ turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/interceptor/util/InterceptorToStringBuilder.java Thu Dec 13 18:17:39 2018
@@ -41,10 +41,4 @@ public interface InterceptorToStringBuil
      */
     void setMode(int mode);
 
-    /**
-     * Invokes the string builder.
-     *
-     * @see java.lang.Object#toString()
-     */
-    public String toString();
 }

Modified: turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/interceptor/util/StopWatch.java
URL: http://svn.apache.org/viewvc/turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/interceptor/util/StopWatch.java?rev=1848876&r1=1848875&r2=1848876&view=diff
==============================================================================
--- turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/interceptor/util/StopWatch.java (original)
+++ turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/interceptor/util/StopWatch.java Thu Dec 13 18:17:39 2018
@@ -19,31 +19,42 @@
 package org.apache.fulcrum.yaafi.interceptor.util;
 
 /**
- * <p><code>StopWatch</code> provides a convenient API for timings.</p>
+ * <p>
+ * <code>StopWatch</code> provides a convenient API for timings.
+ * </p>
  *
- * <p>To start the watch, call {@link #start()}. At this point you can:</p>
+ * <p>
+ * To start the watch, call {@link #start()}. At this point you can:
+ * </p>
  * <ul>
- *  <li>{@link #split()} the watch to get the time whilst the watch continues in the
- *   background. {@link #unsplit()} will remove the effect of the split. At this point,
- *   these three options are available again.</li>
- *  <li>{@link #suspend()} the watch to pause it. {@link #resume()} allows the watch
- *   to continue. Any time between the suspend and resume will not be counted in
- *   the total. At this point, these three options are available again.</li>
- *  <li>{@link #stop()} the watch to complete the timing session.</li>
+ * <li>{@link #split()} the watch to get the time whilst the watch continues in
+ * the background. {@link #unsplit()} will remove the effect of the split. At
+ * this point, these three options are available again.</li>
+ * <li>{@link #suspend()} the watch to pause it. {@link #resume()} allows the
+ * watch to continue. Any time between the suspend and resume will not be
+ * counted in the total. At this point, these three options are available
+ * again.</li>
+ * <li>{@link #stop()} the watch to complete the timing session.</li>
  * </ul>
  *
- * <p>It is intended that the output methods {@link #toString()} and {@link #getTime()}
- * should only be called after stop, split or suspend, however a suitable result will
- * be returned at other points.</p>
+ * <p>
+ * It is intended that the output methods {@link #toString()} and
+ * {@link #getTime()} should only be called after stop, split or suspend,
+ * however a suitable result will be returned at other points.
+ * </p>
  *
- * <p>NOTE: As from v2.1, the methods protect against inappropriate calls.
- * Thus you cannot now call stop before start, resume before suspend or
- * unsplit before split.</p>
+ * <p>
+ * NOTE: As from v2.1, the methods protect against inappropriate calls. Thus you
+ * cannot now call stop before start, resume before suspend or unsplit before
+ * split.
+ * </p>
  *
- * <p>1. split(), suspend(), or stop() cannot be invoked twice <br>
+ * <p>
+ * 1. split(), suspend(), or stop() cannot be invoked twice <br>
  * 2. unsplit() may only be called if the watch has been split()<br>
  * 3. resume() may only be called if the watch has been suspend()<br>
- * 4. start() cannot be called twice without calling reset()</p>
+ * 4. start() cannot be called twice without calling reset()
+ * </p>
  *
  * @author Henri Yandell
  * @author Stephen Colebourne
@@ -52,225 +63,225 @@ package org.apache.fulcrum.yaafi.interce
  */
 public class StopWatch {
 
-    // running states
-    private static final int STATE_UNSTARTED = 0;
-    private static final int STATE_RUNNING   = 1;
-    private static final int STATE_STOPPED   = 2;
-    private static final int STATE_SUSPENDED = 3;
-
-    // split state
-    private static final int STATE_UNSPLIT = 10;
-    private static final int STATE_SPLIT   = 11;
-
-    /**
-     *  The current running state of the StopWatch.
-     */
-    private int runningState = STATE_UNSTARTED;
-
-    /**
-     * Whether the stopwatch has a split time recorded.
-     */
-    private int splitState   = STATE_UNSPLIT;
-
-    /**
-     * The start time.
-     */
-    private long startTime = -1;
-    /**
-     * The stop time.
-     */
-    private long stopTime = -1;
-
-    /**
-     * <p>Constructor.</p>
-     */
-    public StopWatch() {
-        // nothing to do
-    }
-
-    /**
-     * <p>Start the stopwatch.</p>
-     *
-     * <p>This method starts a new timing session, clearing any previous values.</p>
-     *
-     * @throws IllegalStateException if the StopWatch is already running.
-     */
-    public void start()
-    {
-        if (this.runningState == STATE_STOPPED)
-        {
-            throw new IllegalStateException(
-                            "Stopwatch must be reset before being restarted. " );
-        }
-        if (this.runningState != STATE_UNSTARTED)
-        {
-            throw new IllegalStateException( "Stopwatch already started. " );
-        }
-        stopTime = -1;
-        startTime = System.currentTimeMillis();
-        this.runningState = STATE_RUNNING;
-    }
-
-    /**
-     * <p>Stop the stopwatch.</p>
-     *
-     * <p>This method ends a new timing session, allowing the time to be retrieved.</p>
-     *
-     * @throws IllegalStateException if the StopWatch is not running.
-     */
-    public void stop()
-    {
-        if (this.runningState != STATE_RUNNING
-                        && this.runningState != STATE_SUSPENDED)
-        {
-            throw new IllegalStateException( "Stopwatch is not running. " );
-        }
-        stopTime = System.currentTimeMillis();
-        this.runningState = STATE_STOPPED;
-    }
-
-    /**
-     * <p>Resets the stopwatch. Stops it if need be. </p>
-     *
-     * <p>This method clears the internal values to allow the object to be reused.</p>
-     */
-    public void reset()
-    {
-        this.runningState = STATE_UNSTARTED;
-        this.splitState = STATE_UNSPLIT;
-        startTime = -1;
-        stopTime = -1;
-    }
-
-    /**
-     * <p>Split the time.</p>
-     *
-     * <p>This method sets the stop time of the watch to allow a time to be extracted.
-     * The start time is unaffected, enabling {@link #unsplit()} to continue the
-     * timing from the original start point.</p>
-     *
-     * @throws IllegalStateException if the StopWatch is not running.
-     */
-    public void split()
-    {
-        if (this.runningState != STATE_RUNNING)
-        {
-            throw new IllegalStateException( "Stopwatch is not running. " );
-        }
-        stopTime = System.currentTimeMillis();
-        this.splitState = STATE_SPLIT;
-    }
-
-    /**
-     * <p>Remove a split.</p>
-     *
-     * <p>This method clears the stop time. The start time is unaffected, enabling
-     * timing from the original start point to continue.</p>
-     *
-     * @throws IllegalStateException if the StopWatch has not been split.
-     */
-    public void unsplit()
-    {
-        if (this.splitState != STATE_SPLIT)
-        {
-            throw new IllegalStateException( "Stopwatch has not been split. " );
-        }
-        stopTime = -1;
-        this.splitState = STATE_UNSPLIT;
-    }
-
-    /**
-     * <p>Suspend the stopwatch for later resumption.</p>
-     *
-     * <p>This method suspends the watch until it is resumed. The watch will not include
-     * time between the suspend and resume calls in the total time.</p>
-     *
-     * @throws IllegalStateException if the StopWatch is not currently running.
-     */
-    public void suspend()
-    {
-        if (this.runningState != STATE_RUNNING)
-        {
-            throw new IllegalStateException(
-                            "Stopwatch must be running to suspend. " );
-        }
-        stopTime = System.currentTimeMillis();
-        this.runningState = STATE_SUSPENDED;
-    }
-
-    /**
-     * <p>Resume the stopwatch after a suspend.</p>
-     *
-     * <p>This method resumes the watch after it was suspended. The watch will not include
-     * time between the suspend and resume calls in the total time.</p>
-     *
-     * @throws IllegalStateException if the StopWatch has not been suspended.
-     */
-    public void resume()
-    {
-        if (this.runningState != STATE_SUSPENDED)
-        {
-            throw new IllegalStateException(
-                            "Stopwatch must be suspended to resume. " );
-        }
-        startTime += (System.currentTimeMillis() - stopTime);
-        stopTime = -1;
-        this.runningState = STATE_RUNNING;
-    }
-
-    /**
-     * <p>Get the time on the stopwatch.</p>
-     *
-     * <p>This is either the time between the start and the moment this method
-     * is called, or the amount of time between start and stop.</p>
-     *
-     * @return the time in milliseconds
-     */
-    public long getTime()
-    {
-        if (this.runningState == STATE_STOPPED
-                        || this.runningState == STATE_SUSPENDED)
-        {
-            return this.stopTime - this.startTime;
-        }
-        else if (this.runningState == STATE_UNSTARTED)
-        {
-            return 0;
-        }
-        else if (this.runningState == STATE_RUNNING)
-        {
-            return System.currentTimeMillis() - this.startTime;
-        }
-        throw new RuntimeException( "Illegal running state has occured. " );
-    }
-
-    /**
-     * <p>Get the split time on the stopwatch.</p>
-     *
-     * <p>This is the time between start and latest split. </p>
-     *
-     * @return the split time in milliseconds
-     *
-     * @throws IllegalStateException if the StopWatch has not yet been split.
-     * @since 2.1
-     */
-    public long getSplitTime()
-    {
-        if (this.splitState != STATE_SPLIT)
-        {
-            throw new IllegalStateException(
-                "Stopwatch must be split to get the split time. "
-                );
-        }
-        return this.stopTime - this.startTime;
-    }
-
-    /**
-     * <p>Gets a summary of the time that the stopwatch recorded as a string.</p>
-     *
-     * @return the time as a String
-     */
-    public String toString() {
-        return getTime()+"ms";
-    }
+	// running states
+	private static final int STATE_UNSTARTED = 0;
+	private static final int STATE_RUNNING = 1;
+	private static final int STATE_STOPPED = 2;
+	private static final int STATE_SUSPENDED = 3;
+
+	// split state
+	private static final int STATE_UNSPLIT = 10;
+	private static final int STATE_SPLIT = 11;
+
+	/**
+	 * The current running state of the StopWatch.
+	 */
+	private int runningState = STATE_UNSTARTED;
+
+	/**
+	 * Whether the stopwatch has a split time recorded.
+	 */
+	private int splitState = STATE_UNSPLIT;
+
+	/**
+	 * The start time.
+	 */
+	private long startTime = -1;
+	/**
+	 * The stop time.
+	 */
+	private long stopTime = -1;
+
+	/**
+	 * <p>
+	 * Constructor.
+	 * </p>
+	 */
+	public StopWatch() {
+		// nothing to do
+	}
+
+	/**
+	 * <p>
+	 * Start the stopwatch.
+	 * </p>
+	 *
+	 * <p>
+	 * This method starts a new timing session, clearing any previous values.
+	 * </p>
+	 *
+	 * @throws IllegalStateException if the StopWatch is already running.
+	 */
+	public void start() {
+		if (this.runningState == STATE_STOPPED) {
+			throw new IllegalStateException("Stopwatch must be reset before being restarted. ");
+		}
+		if (this.runningState != STATE_UNSTARTED) {
+			throw new IllegalStateException("Stopwatch already started. ");
+		}
+		stopTime = -1;
+		startTime = System.currentTimeMillis();
+		this.runningState = STATE_RUNNING;
+	}
+
+	/**
+	 * <p>
+	 * Stop the stopwatch.
+	 * </p>
+	 *
+	 * <p>
+	 * This method ends a new timing session, allowing the time to be retrieved.
+	 * </p>
+	 *
+	 * @throws IllegalStateException if the StopWatch is not running.
+	 */
+	public void stop() {
+		if (this.runningState != STATE_RUNNING && this.runningState != STATE_SUSPENDED) {
+			throw new IllegalStateException("Stopwatch is not running. ");
+		}
+		stopTime = System.currentTimeMillis();
+		this.runningState = STATE_STOPPED;
+	}
+
+	/**
+	 * <p>
+	 * Resets the stopwatch. Stops it if need be.
+	 * </p>
+	 *
+	 * <p>
+	 * This method clears the internal values to allow the object to be reused.
+	 * </p>
+	 */
+	public void reset() {
+		this.runningState = STATE_UNSTARTED;
+		this.splitState = STATE_UNSPLIT;
+		startTime = -1;
+		stopTime = -1;
+	}
+
+	/**
+	 * <p>
+	 * Split the time.
+	 * </p>
+	 *
+	 * <p>
+	 * This method sets the stop time of the watch to allow a time to be extracted.
+	 * The start time is unaffected, enabling {@link #unsplit()} to continue the
+	 * timing from the original start point.
+	 * </p>
+	 *
+	 * @throws IllegalStateException if the StopWatch is not running.
+	 */
+	public void split() {
+		if (this.runningState != STATE_RUNNING) {
+			throw new IllegalStateException("Stopwatch is not running. ");
+		}
+		stopTime = System.currentTimeMillis();
+		this.splitState = STATE_SPLIT;
+	}
+
+	/**
+	 * <p>
+	 * Remove a split.
+	 * </p>
+	 *
+	 * <p>
+	 * This method clears the stop time. The start time is unaffected, enabling
+	 * timing from the original start point to continue.
+	 * </p>
+	 *
+	 * @throws IllegalStateException if the StopWatch has not been split.
+	 */
+	public void unsplit() {
+		if (this.splitState != STATE_SPLIT) {
+			throw new IllegalStateException("Stopwatch has not been split. ");
+		}
+		stopTime = -1;
+		this.splitState = STATE_UNSPLIT;
+	}
+
+	/**
+	 * <p>
+	 * Suspend the stopwatch for later resumption.
+	 * </p>
+	 *
+	 * <p>
+	 * This method suspends the watch until it is resumed. The watch will not
+	 * include time between the suspend and resume calls in the total time.
+	 * </p>
+	 *
+	 * @throws IllegalStateException if the StopWatch is not currently running.
+	 */
+	public void suspend() {
+		if (this.runningState != STATE_RUNNING) {
+			throw new IllegalStateException("Stopwatch must be running to suspend. ");
+		}
+		stopTime = System.currentTimeMillis();
+		this.runningState = STATE_SUSPENDED;
+	}
+
+	/**
+	 * <p>
+	 * Resume the stopwatch after a suspend.
+	 * </p>
+	 *
+	 * <p>
+	 * This method resumes the watch after it was suspended. The watch will not
+	 * include time between the suspend and resume calls in the total time.
+	 * </p>
+	 *
+	 * @throws IllegalStateException if the StopWatch has not been suspended.
+	 */
+	public void resume() {
+		if (this.runningState != STATE_SUSPENDED) {
+			throw new IllegalStateException("Stopwatch must be suspended to resume. ");
+		}
+		startTime += System.currentTimeMillis() - stopTime;
+		stopTime = -1;
+		this.runningState = STATE_RUNNING;
+	}
+
+	/**
+	 * Get the time on the stopwatch.
+	 *
+	 * This is either the time between the start and the moment this method is
+	 * called, or the amount of time between start and stop.
+	 *
+	 * @return the time in milliseconds
+	 */
+	public long getTime() {
+		if (this.runningState == STATE_STOPPED || this.runningState == STATE_SUSPENDED) {
+			return this.stopTime - this.startTime;
+		} else if (this.runningState == STATE_UNSTARTED) {
+			return 0;
+		} else if (this.runningState == STATE_RUNNING) {
+			return System.currentTimeMillis() - this.startTime;
+		}
+		throw new RuntimeException("Illegal running state has occured. ");
+	}
+
+	/**
+	 * Get the split time on the stopwatch.
+	 *
+	 * This is the time between start and latest split.
+	 *
+	 * @return the split time in milliseconds
+	 * @throws IllegalStateException if the StopWatch has not yet been split.
+	 * @since 2.1
+	 */
+	public long getSplitTime() {
+		if (this.splitState != STATE_SPLIT) {
+			throw new IllegalStateException("Stopwatch must be split to get the split time. ");
+		}
+		return this.stopTime - this.startTime;
+	}
+
+	/**
+	 * Gets a summary of the time that the stopwatch recorded as a string.
+	 *
+	 * @return the time as a String
+	 */
+	public String toString() {
+		return getTime() + "ms";
+	}
 }

Modified: turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/service/advice/AdviceServiceImpl.java
URL: http://svn.apache.org/viewvc/turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/service/advice/AdviceServiceImpl.java?rev=1848876&r1=1848875&r2=1848876&view=diff
==============================================================================
--- turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/service/advice/AdviceServiceImpl.java (original)
+++ turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/service/advice/AdviceServiceImpl.java Thu Dec 13 18:17:39 2018
@@ -100,18 +100,23 @@ public class AdviceServiceImpl extends A
 		return this.advice(this.getDefaultInterceptorList(), object);
 	}
 
-	/**
-	 * @see org.apache.fulcrum.yaafi.service.advice.AdviceService#advice(java.lang.String,
-	 *      java.lang.Object)
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.apache.fulcrum.yaafi.service.advice.AdviceService#advice(java.lang.
+	 * String, java.lang.Object)
 	 */
 	public Object advice(String name, Object object) {
 		Validate.notNull(object, "object");
 		return this.doAdvice(name, this.getDefaultInterceptorList(), object);
 	}
 
-	/**
-	 * @see org.apache.fulcrum.yaafi.service.advice.AdviceService#advice(java.lang.String[],
-	 *      java.lang.Object)
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see
+	 * org.apache.fulcrum.yaafi.service.advice.AdviceService#advice(java.lang.String
+	 * [], java.lang.Object)
 	 */
 	public Object advice(String[] interceptorList, Object object) {
 		Validate.notNull(object, "object");
@@ -119,22 +124,28 @@ public class AdviceServiceImpl extends A
 		return this.doAdvice(className, interceptorList, object);
 	}
 
-	/**
-	 * @see org.apache.fulcrum.yaafi.service.advice.AdviceService#advice(java.lang.String,
-	 *      java.lang.String[], java.lang.Object)
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.apache.fulcrum.yaafi.service.advice.AdviceService#advice(java.lang.
+	 * String, java.lang.String[], java.lang.Object)
 	 */
 	public Object advice(String name, String[] interceptorList, Object object) {
 		Validate.notNull(object, "object");
 		return this.doAdvice(name, interceptorList, object);
 	}
 
-	/**
-	 * @see org.apache.fulcrum.yaafi.service.advice.AdviceService#isAdviced(java.lang.Object)
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see
+	 * org.apache.fulcrum.yaafi.service.advice.AdviceService#isAdviced(java.lang.
+	 * Object)
 	 */
 	public boolean isAdviced(Object object) {
 		InvocationHandler invocationHandler = null;
 
-		if ((object != null) && Proxy.isProxyClass(object.getClass())) {
+		if (object != null && Proxy.isProxyClass(object.getClass())) {
 			invocationHandler = Proxy.getInvocationHandler(object);
 			return invocationHandler instanceof AvalonInterceptorInvocationHandler;
 		}

Modified: turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/service/reconfiguration/ReconfigurationEntry.java
URL: http://svn.apache.org/viewvc/turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/service/reconfiguration/ReconfigurationEntry.java?rev=1848876&r1=1848875&r2=1848876&view=diff
==============================================================================
--- turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/service/reconfiguration/ReconfigurationEntry.java (original)
+++ turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/service/reconfiguration/ReconfigurationEntry.java Thu Dec 13 18:17:39 2018
@@ -1,29 +1,8 @@
 package org.apache.fulcrum.yaafi.service.reconfiguration;
 
-/*
- * 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.
- */
-
-import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
-import java.io.OutputStream;
 import java.security.MessageDigest;
 import java.util.Arrays;
 
@@ -88,7 +67,7 @@ public class ReconfigurationEntry {
 
 			if (is == null) {
 				String msg = "Unable to find the following resource : " + this.getLocation();
-				this.getLogger().warn(msg);
+				this.logger.warn(msg);
 			} else {
 				// calculate a SHA-1 digest
 				currDigest = this.getDigest(is);
@@ -97,11 +76,11 @@ public class ReconfigurationEntry {
 
 				if (this.isFirstInvocation() == true) {
 					isFirstInvocation = false;
-					this.getLogger().debug("Storing SHA-1 digest of " + this.getLocation());
+					this.logger.debug("Storing SHA-1 digest of " + this.getLocation());
 					this.setDigest(currDigest);
 				} else {
 					if (equals(this.digest, currDigest) == false) {
-						this.getLogger().debug("The following resource has changed : " + this.getLocation());
+						this.logger.debug("The following resource has changed : " + this.getLocation());
 						this.setDigest(currDigest);
 						result = true;
 					}
@@ -111,7 +90,7 @@ public class ReconfigurationEntry {
 			return result;
 		} catch (Exception e) {
 			String msg = "The ShutdownService encountered an internal error";
-			this.getLogger().error(msg, e);
+			this.logger.error(msg, e);
 			return false;
 		} finally {
 			if (is != null) {
@@ -119,7 +98,7 @@ public class ReconfigurationEntry {
 					is.close();
 				} catch (Exception e) {
 					String msg = "Can't close the InputStream during error recovery";
-					this.getLogger().error(msg, e);
+					this.logger.error(msg, e);
 				}
 			}
 		}
@@ -148,20 +127,13 @@ public class ReconfigurationEntry {
 	}
 
 	/**
-	 * @return Returns the locator.
-	 */
-	private InputStreamLocator getLocator() {
-		return locator;
-	}
-
-	/**
 	 * Creates an InputStream.
 	 * 
 	 * @return the input stream
 	 * @throws IOException the creation failed
 	 */
 	public InputStream locate() throws IOException {
-		return this.getLocator().locate(this.getLocation());
+		return this.locator.locate(this.getLocation());
 	}
 
 	/**
@@ -175,10 +147,8 @@ public class ReconfigurationEntry {
 		byte[] result = null;
 		byte[] content = null;
 
-		ByteArrayOutputStream baos = new ByteArrayOutputStream();
-		copy(is, baos);
-		content = baos.toByteArray();
-		baos.close();
+		// convert to byte array
+		content = IOUtils.toByteArray(is);
 
 		MessageDigest sha1 = MessageDigest.getInstance("SHA1");
 		sha1.update(content);
@@ -206,22 +176,4 @@ public class ReconfigurationEntry {
 		return Arrays.equals(lhs, rhs);
 	}
 
-	/**
-	 * Pumps the input stream to the output stream.
-	 *
-	 * @param is the source input stream
-	 * @param os the target output stream
-	 * @throws IOException the copying failed
-	 */
-	private static void copy(InputStream is, OutputStream os) throws IOException {
-		// Use commons managed code
-		IOUtils.copy(is, os);
-	}
-
-	/**
-	 * @return Returns the logger.
-	 */
-	private Logger getLogger() {
-		return logger;
-	}
 }

Modified: turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/service/reconfiguration/ReconfigurationServiceImpl.java
URL: http://svn.apache.org/viewvc/turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/service/reconfiguration/ReconfigurationServiceImpl.java?rev=1848876&r1=1848875&r2=1848876&view=diff
==============================================================================
--- turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/service/reconfiguration/ReconfigurationServiceImpl.java (original)
+++ turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/service/reconfiguration/ReconfigurationServiceImpl.java Thu Dec 13 18:17:39 2018
@@ -40,290 +40,251 @@ import org.apache.avalon.framework.servi
 import org.apache.avalon.framework.service.Serviceable;
 import org.apache.fulcrum.yaafi.framework.container.ServiceLifecycleManager;
 
-
 /**
- * Monitors the componentConfiguration.xml and triggers a reconfiguration
- * if the content of the component configuration file  has changed.
+ * Monitors the componentConfiguration.xml and triggers a reconfiguration if the
+ * content of the component configuration file has changed.
  *
  * @author <a href="mailto:siegfried.goeschl@it20one.at">Siegfried Goeschl</a>
  */
 
-public class ReconfigurationServiceImpl
-    extends AbstractLogEnabled
-    implements ReconfigurationService, Serviceable, Contextualizable,
-        Reconfigurable, Initializable, Runnable, Startable, Disposable
-{
-    /** the interval between two checks in ms */
-    private int interval;
-
-    /** shall the worker thread terminate immediately */
-    private boolean terminateNow;
-
-    /** the worker thread polling the componentConfiguraton */
-    private Thread workerThread;
-
-    /** the ServiceManager to use */
-    private ServiceManager serviceManager;
-
-    /** the application directory */
-    private File applicationDir;
-
-    /** our list of resources to monitor */
-    private ReconfigurationEntry[] reconfigurationEntryList;
-
-    /** the interface to reconfigure individual services */
-    private ServiceLifecycleManager serviceLifecycleManager;
-
-    /////////////////////////////////////////////////////////////////////////
-    // Avalon Service Lifecycle Implementation
-    /////////////////////////////////////////////////////////////////////////
-
-    /**
-     * Constructor
-     */
-    public ReconfigurationServiceImpl()
-    {
-        this.terminateNow = false;
-    }
-
-    /**
-     * @see org.apache.avalon.framework.service.Serviceable#service(org.apache.avalon.framework.service.ServiceManager)
-     */
-    public void service(ServiceManager manager) throws ServiceException
-    {
-        this.serviceManager = manager;
-        this.serviceLifecycleManager = (ServiceLifecycleManager) manager;
-    }
-
-    /**
-     * @see org.apache.avalon.framework.context.Contextualizable#contextualize(org.apache.avalon.framework.context.Context)
-     */
-    public void contextualize(Context context) throws ContextException
-    {
-        this.applicationDir  = (File) context.get("urn:avalon:home");
-    }
-
-    /**
-     * @see org.apache.avalon.framework.configuration.Configurable#configure(org.apache.avalon.framework.configuration.Configuration)
-     */
-    public void configure(Configuration configuration) throws ConfigurationException
-    {
-        // limit to minimum interval of 1 second
-
-        this.interval = Math.max( configuration.getAttributeAsInteger("interval",5000), 1000 );
-
-        this.getLogger().debug( "Monitoring the resources every " + this.interval + " ms" );
-
-        // parse the resources to monitor
-
-        // Configuration entry = null;
-        Configuration services = null;
-        Configuration[] serviceEntries = null;
-        Configuration[] entryList = configuration.getChildren("entry");
-
-        String location = null;
-        String serviceName = null;
-        String[] serviceNameList = null;
-        ReconfigurationEntry reconfigurationEntry = null;
-        ReconfigurationEntry[] list = new ReconfigurationEntry[entryList.length];
-        int listIndex = 0;
-        for ( Configuration entry : entryList )
-        {
-            location = entry.getChild("location").getValue();
-            services = entry.getChild("services",false);
-
-            this.getLogger().debug( "Adding the following resource to monitor : " + location );
-
-            if( services != null )
-            {
-                serviceEntries = services.getChildren("service");
-                serviceNameList = new String[serviceEntries.length];
-
-                for( int j=0; j<serviceEntries.length; j++ )
-                {
-                    serviceName = serviceEntries[j].getAttribute("name");
-                    serviceNameList[j] = serviceName;
-                }
-            }
-
-            reconfigurationEntry = new ReconfigurationEntry(
-                this.getLogger(),
-                this.applicationDir,
-                location,
-                serviceNameList
-                );
-
-            list[listIndex++] = reconfigurationEntry;
-        }
-
-        this.getLogger().debug( "Monitoring " + list.length + " resources" );
-
-        this.setReconfigurationEntryList(list);
-    }
-
-    /**
-     * @see org.apache.avalon.framework.activity.Initializable#initialize()
-     */
-    public void initialize() throws Exception
-    {
-    	// request a SHA-1 to make sure that it is supported
-        MessageDigest.getInstance( "SHA1" );
-
-        // check that the ServiceManager implements Reconfigurable
-        if( (this.serviceManager instanceof ServiceLifecycleManager) == false )
-            throw new IllegalArgumentException( "The ServiceManager instance does not implement ServiceLifecycleManager!" );
-    	
-        // create the worker thread polling the target
-        this.workerThread = new Thread( this, "ReconfigurationService" );
-    }
-
-    /**
-     * @see org.apache.avalon.framework.activity.Startable#start()
-     */
-    public void start() throws Exception
-    {
-        this.getLogger().debug( "Starting worker thread ..." );
-        this.workerThread.start();
-    }
-
-    /**
-     * @see org.apache.avalon.framework.activity.Startable#stop()
-     */
-    public void stop() throws Exception
-    {
-        this.getLogger().debug( "Stopping worker thread ..." );
-        this.terminateNow = true;
-        this.workerThread.interrupt();
-        this.workerThread.join( 10000 );
-    }
-
-    /**
-     * @see org.apache.avalon.framework.activity.Disposable#dispose()
-     */
-    public void dispose()
-    {
-        this.terminateNow = false;
-        this.applicationDir = null;
-        this.workerThread = null;
-        this.serviceManager = null;
-        this.reconfigurationEntryList = null;
-    }
-
-    /**
-     * @see org.apache.avalon.framework.configuration.Reconfigurable#reconfigure(org.apache.avalon.framework.configuration.Configuration)
-     */
-    public void reconfigure(Configuration configuration)
-        throws ConfigurationException
-    {
-        this.configure(configuration);
-    }
-
-    /////////////////////////////////////////////////////////////////////////
-    // Service interface implementation
-    /////////////////////////////////////////////////////////////////////////
-
-    /**
-     * Polls for changes in the confguration to reconfigure either the
-     * whole container or just a list of services.
-     *
-     * @see java.lang.Runnable#run()
-     */
-    public void run()
-    {
-        ReconfigurationEntry[] list = null;
-        while( this.terminateNow == false )
-        {
-            list = this.getReconfigurationEntryList();
-            try
-            {
-            	for ( ReconfigurationEntry reconfigurationEntry : list )
-                {
-                    if( reconfigurationEntry.hasChanged() )
-                        this.onReconfigure( reconfigurationEntry );
-                }
-
-                Thread.sleep( this.interval );
-            }
-            catch( InterruptedException e )
-            {
-                continue;
-            }
-            catch(Exception e)
-            {
-                String msg = "The ReconfigurationService had a problem";
-                this.getLogger().error(msg,e);
-                continue;
-            }
-        }
-    }
-
-    /////////////////////////////////////////////////////////////////////////
-    // Service implementation
-    /////////////////////////////////////////////////////////////////////////
-
-    /**
-     * Reconfigure either the whole container or a list of services. This
-     * method is called within a seperate worker thred.
-     *
-     * @param reconfigurationEntry the configuration what to reconfigure
-     * @throws Exception the reconfiguration failed
-     */
-    protected void onReconfigure( ReconfigurationEntry reconfigurationEntry )
-        throws Exception
-    {
-        if( reconfigurationEntry.getServiceList() == null )
-        {
-            // reconfigure the whole container using Avalon Lifecycle Spec
-            InputStream is = reconfigurationEntry.locate();
-            DefaultConfigurationBuilder builder = new DefaultConfigurationBuilder();
-            Configuration configuration = builder.build(is);
-            is.close();
-            is = null;
-
-            this.getLogger().warn( "Starting to reconfigure the container" );
-
-            if( this.serviceManager instanceof Suspendable)
-            {
-                this.getLogger().info( "Calling suspend() of the container" );
-                ((Suspendable) this.serviceManager).suspend();
-            }
-
-            if( this.serviceManager instanceof Reconfigurable)
-            {
-                this.getLogger().info( "Calling reconfigure() of the container" );
-                ((Reconfigurable) this.serviceManager).reconfigure(configuration);
-            }
-
-            if( this.serviceManager instanceof Suspendable)
-            {
-                this.getLogger().info( "Calling resume() of the container" );
-                ((Suspendable) this.serviceManager).resume();
-            }
-
-            this.getLogger().info( "Reconfiguring the container was successful" );
-        }
-        else
-        {
-            String[] serviceList = reconfigurationEntry.getServiceList();
-            this.getLogger().warn( "Calling reconfigure() on individual services : " + serviceList.length );
-            this.serviceLifecycleManager.reconfigure(serviceList);
-        }
-    }
-
-    /**
-     * @return Returns the reconfigurationEntryList.
-     */
-    private synchronized ReconfigurationEntry [] getReconfigurationEntryList()
-    {
-        return reconfigurationEntryList;
-    }
-
-    /**
-     * @param reconfigurationEntryList The reconfigurationEntryList to set.
-     */
-    private synchronized void setReconfigurationEntryList(
-        ReconfigurationEntry [] reconfigurationEntryList)
-    {
-        this.reconfigurationEntryList = reconfigurationEntryList;
-    }
+public class ReconfigurationServiceImpl extends AbstractLogEnabled implements ReconfigurationService, Serviceable,
+		Contextualizable, Reconfigurable, Initializable, Runnable, Startable, Disposable {
+	/** the interval between two checks in ms */
+	private int interval;
+
+	/** shall the worker thread terminate immediately */
+	private boolean terminateNow;
+
+	/** the worker thread polling the componentConfiguraton */
+	private Thread workerThread;
+
+	/** the ServiceManager to use */
+	private ServiceManager serviceManager;
+
+	/** the application directory */
+	private File applicationDir;
+
+	/** our list of resources to monitor */
+	private ReconfigurationEntry[] reconfigurationEntryList;
+
+	/** the interface to reconfigure individual services */
+	private ServiceLifecycleManager serviceLifecycleManager;
+
+	/////////////////////////////////////////////////////////////////////////
+	// Avalon Service Lifecycle Implementation
+	/////////////////////////////////////////////////////////////////////////
+
+	/**
+	 * Constructor
+	 */
+	public ReconfigurationServiceImpl() {
+		this.terminateNow = false;
+	}
+
+	/**
+	 * @see org.apache.avalon.framework.service.Serviceable#service(org.apache.avalon.framework.service.ServiceManager)
+	 */
+	public void service(ServiceManager manager) throws ServiceException {
+		this.serviceManager = manager;
+		this.serviceLifecycleManager = (ServiceLifecycleManager) manager;
+	}
+
+	/**
+	 * @see org.apache.avalon.framework.context.Contextualizable#contextualize(org.apache.avalon.framework.context.Context)
+	 */
+	public void contextualize(Context context) throws ContextException {
+		this.applicationDir = (File) context.get("urn:avalon:home");
+	}
+
+	/**
+	 * @see org.apache.avalon.framework.configuration.Configurable#configure(org.apache.avalon.framework.configuration.Configuration)
+	 */
+	public void configure(Configuration configuration) throws ConfigurationException {
+		// limit to minimum interval of 1 second
+
+		this.interval = Math.max(configuration.getAttributeAsInteger("interval", 5000), 1000);
+
+		this.getLogger().debug("Monitoring the resources every " + this.interval + " ms");
+
+		// parse the resources to monitor
+
+		// Configuration entry = null;
+		Configuration services = null;
+		Configuration[] serviceEntries = null;
+		Configuration[] entryList = configuration.getChildren("entry");
+
+		String location = null;
+		String serviceName = null;
+		String[] serviceNameList = null;
+		ReconfigurationEntry reconfigurationEntry = null;
+		ReconfigurationEntry[] list = new ReconfigurationEntry[entryList.length];
+		int listIndex = 0;
+		for (Configuration entry : entryList) {
+			location = entry.getChild("location").getValue();
+			services = entry.getChild("services", false);
+
+			this.getLogger().debug("Adding the following resource to monitor : " + location);
+
+			if (services != null) {
+				serviceEntries = services.getChildren("service");
+				serviceNameList = new String[serviceEntries.length];
+
+				for (int j = 0; j < serviceEntries.length; j++) {
+					serviceName = serviceEntries[j].getAttribute("name");
+					serviceNameList[j] = serviceName;
+				}
+			}
+
+			reconfigurationEntry = new ReconfigurationEntry(this.getLogger(), this.applicationDir, location,
+					serviceNameList);
+
+			list[listIndex++] = reconfigurationEntry;
+		}
+
+		this.getLogger().debug("Monitoring " + list.length + " resources");
+
+		this.setReconfigurationEntryList(list);
+	}
+
+	/**
+	 * @see org.apache.avalon.framework.activity.Initializable#initialize()
+	 */
+	public void initialize() throws Exception {
+		// request a SHA-1 to make sure that it is supported
+		MessageDigest.getInstance("SHA1");
+
+		// check that the ServiceManager implements Reconfigurable
+		if (this.serviceManager instanceof ServiceLifecycleManager == false)
+			throw new IllegalArgumentException(
+					"The ServiceManager instance does not implement ServiceLifecycleManager!");
+
+		// create the worker thread polling the target
+		this.workerThread = new Thread(this, "ReconfigurationService");
+	}
+
+	/**
+	 * @see org.apache.avalon.framework.activity.Startable#start()
+	 */
+	public void start() throws Exception {
+		this.getLogger().debug("Starting worker thread ...");
+		this.workerThread.start();
+	}
+
+	/**
+	 * @see org.apache.avalon.framework.activity.Startable#stop()
+	 */
+	public void stop() throws Exception {
+		this.getLogger().debug("Stopping worker thread ...");
+		this.terminateNow = true;
+		this.workerThread.interrupt();
+		this.workerThread.join(10000);
+	}
+
+	/**
+	 * @see org.apache.avalon.framework.activity.Disposable#dispose()
+	 */
+	public void dispose() {
+		this.terminateNow = false;
+		this.applicationDir = null;
+		this.workerThread = null;
+		this.serviceManager = null;
+		this.reconfigurationEntryList = null;
+	}
+
+	/**
+	 * @see org.apache.avalon.framework.configuration.Reconfigurable#reconfigure(org.apache.avalon.framework.configuration.Configuration)
+	 */
+	public void reconfigure(Configuration configuration) throws ConfigurationException {
+		this.configure(configuration);
+	}
+
+	/////////////////////////////////////////////////////////////////////////
+	// Service interface implementation
+	/////////////////////////////////////////////////////////////////////////
+
+	/**
+	 * Polls for changes in the confguration to reconfigure either the whole
+	 * container or just a list of services.
+	 *
+	 * @see java.lang.Runnable#run()
+	 */
+	public void run() {
+		ReconfigurationEntry[] list = null;
+		while (this.terminateNow == false) {
+			list = this.getReconfigurationEntryList();
+			try {
+				for (ReconfigurationEntry reconfigurationEntry : list) {
+					if (reconfigurationEntry.hasChanged())
+						this.onReconfigure(reconfigurationEntry);
+				}
+
+				Thread.sleep(this.interval);
+			} catch (InterruptedException e) {
+				continue;
+			} catch (Exception e) {
+				String msg = "The ReconfigurationService had a problem";
+				this.getLogger().error(msg, e);
+				continue;
+			}
+		}
+	}
+
+	/////////////////////////////////////////////////////////////////////////
+	// Service implementation
+	/////////////////////////////////////////////////////////////////////////
+
+	/**
+	 * Reconfigure either the whole container or a list of services. This method is
+	 * called within a seperate worker thred.
+	 *
+	 * @param reconfigurationEntry the configuration what to reconfigure
+	 * @throws Exception the reconfiguration failed
+	 */
+	protected void onReconfigure(ReconfigurationEntry reconfigurationEntry) throws Exception {
+		if (reconfigurationEntry.getServiceList() == null) {
+			// reconfigure the whole container using Avalon Lifecycle Spec
+			InputStream is = reconfigurationEntry.locate();
+			DefaultConfigurationBuilder builder = new DefaultConfigurationBuilder();
+			Configuration configuration = builder.build(is);
+			is.close();
+			is = null;
+
+			this.getLogger().warn("Starting to reconfigure the container");
+
+			if (this.serviceManager instanceof Suspendable) {
+				this.getLogger().info("Calling suspend() of the container");
+				((Suspendable) this.serviceManager).suspend();
+			}
+
+			if (this.serviceManager instanceof Reconfigurable) {
+				this.getLogger().info("Calling reconfigure() of the container");
+				((Reconfigurable) this.serviceManager).reconfigure(configuration);
+			}
+
+			if (this.serviceManager instanceof Suspendable) {
+				this.getLogger().info("Calling resume() of the container");
+				((Suspendable) this.serviceManager).resume();
+			}
+
+			this.getLogger().info("Reconfiguring the container was successful");
+		} else {
+			String[] serviceList = reconfigurationEntry.getServiceList();
+			this.getLogger().warn("Calling reconfigure() on individual services : " + serviceList.length);
+			this.serviceLifecycleManager.reconfigure(serviceList);
+		}
+	}
+
+	/**
+	 * @return Returns the reconfigurationEntryList.
+	 */
+	private synchronized ReconfigurationEntry[] getReconfigurationEntryList() {
+		return reconfigurationEntryList;
+	}
+
+	/**
+	 * @param reconfigurationEntryList The reconfigurationEntryList to set.
+	 */
+	private synchronized void setReconfigurationEntryList(ReconfigurationEntry[] reconfigurationEntryList) {
+		this.reconfigurationEntryList = reconfigurationEntryList;
+	}
 }