Author: nicolas
Date: Mon Apr  7 07:13:13 2008
New Revision: 645530

URL: http://svn.apache.org/viewvc?rev=645530&view=rev
Log:
historization of repository based on a decorator :
- complete Detachable interface
- EmptyMonitor to avoid nullPointer
- enhance Reporter to support detachable
- Refactored MonitoringListener for webapps

Added:
    
commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/EmpyMonitor.java
   (with props)
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/listeners/Detachable.java
    
commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/HistorizedRepositoryDecorator.java
    
commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/SecondaryMonitor.java
    
commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/SecondaryRepository.java
    
commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/AbstractPeriodicLogger.java
    
commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/AbstractRenderer.java
    
commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/HtmlRenderer.java
    
commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/JsonRenderer.java
    
commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/OptionsSupport.java
    
commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/Renderer.java
    
commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/Selector.java
    
commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/TxtRenderer.java
    
commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/XmlRenderer.java
    
commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/web/MonitoringServlet.java
    
commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/servlet/MonitoringListener.java
    commons/sandbox/monitoring/trunk/src/main/webapp/WEB-INF/web.xml

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=645530&r1=645529&r2=645530&view=diff
==============================================================================
--- 
commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/Monitor.java
 (original)
+++ 
commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/Monitor.java
 Mon Apr  7 07:13:13 2008
@@ -110,7 +110,7 @@
      */
     public static class Key
     {
-        public final static String DEFAULT = "";
+        public final static String DEFAULT = "default";
 
         private final String name;
 

Modified: 
commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/Detachable.java
URL: 
http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/Detachable.java?rev=645530&r1=645529&r2=645530&view=diff
==============================================================================
--- 
commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/Detachable.java
 (original)
+++ 
commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/Detachable.java
 Mon Apr  7 07:13:13 2008
@@ -27,4 +27,10 @@
      * event will not affect datas in this component.
      */
     void detach();
+
+    long getDetachedAt();
+
+    long getAttachedAt();
+
+    boolean isDetached();
 }

Added: 
commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/EmpyMonitor.java
URL: 
http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/EmpyMonitor.java?rev=645530&view=auto
==============================================================================
--- 
commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/EmpyMonitor.java
 (added)
+++ 
commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/EmpyMonitor.java
 Mon Apr  7 07:13:13 2008
@@ -0,0 +1,67 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.commons.monitoring.listeners;
+
+import org.apache.commons.monitoring.impl.monitors.AbstractMonitor;
+
+
+/**
+ * A (detached) Monitor implementation used by SecondaryRepository to avoid
+ * returning <tt>null</tt> when a non-existing monitor is requested.
+ *
+ * @author <a href="mailto:[EMAIL PROTECTED]">Nicolas De Loof</a>
+ */
+public class EmpyMonitor
+    extends AbstractMonitor implements Detachable
+{
+    private long attachedAt;
+
+    private long detachedAt;
+
+    public EmpyMonitor( Key key, long attachedAt, long detachedAt )
+    {
+        super( key );
+        this.attachedAt = attachedAt;
+        this.detachedAt = detachedAt;
+    }
+
+    /**
+     * [EMAIL PROTECTED]
+     * @see org.apache.commons.monitoring.listeners.Detachable#detach()
+     */
+    public void detach()
+    {
+        // Nothing to do
+    }
+
+    public long getAttachedAt()
+    {
+        return attachedAt;
+    }
+
+    public long getDetachedAt()
+    {
+        return detachedAt;
+    }
+
+    public boolean isDetached()
+    {
+        return true;
+    }
+
+}

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

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

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

Modified: 
commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/HistorizedRepositoryDecorator.java
URL: 
http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/HistorizedRepositoryDecorator.java?rev=645530&r1=645529&r2=645530&view=diff
==============================================================================
--- 
commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/HistorizedRepositoryDecorator.java
 (original)
+++ 
commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/HistorizedRepositoryDecorator.java
 Mon Apr  7 07:13:13 2008
@@ -26,15 +26,14 @@
 import org.apache.commons.monitoring.Monitor;
 import org.apache.commons.monitoring.Repository;
 import org.apache.commons.monitoring.StopWatch;
-import org.apache.commons.monitoring.Repository.Listener;
-import org.apache.commons.monitoring.Repository.Observable;
 import org.apache.commons.monitoring.reporting.AbstractPeriodicLogger;
 
 /**
- *
  * @author <a href="mailto:[EMAIL PROTECTED]">Nicolas De Loof</a>
  */
-public class HistorizedRepositoryDecorator extends AbstractPeriodicLogger
+public class HistorizedRepositoryDecorator
+    extends AbstractPeriodicLogger
+    implements Repository.Observable
 {
     /** The decorated repository */
     private Repository.Observable repository;
@@ -43,7 +42,7 @@
 
     private int size;
 
-    @SuppressWarnings("serial")
+    @SuppressWarnings( "serial" )
     public HistorizedRepositoryDecorator( long period, final int size, 
Observable repository )
     {
         super( period, repository );
@@ -53,9 +52,11 @@
     }
 
     /**
-     * Store the period Repository into the history Map, using 
System.currentTimeMillis().
+     * Store the period Repository into the history Map, using
+     * System.currentTimeMillis().
      * <p>
      * [EMAIL PROTECTED]
+     *
      * @see 
org.apache.commons.monitoring.reporting.AbstractPeriodicLogger#log(SecondaryRepository)
      */
     @Override
@@ -63,7 +64,7 @@
         throws IOException
     {
         history.add( period );
-        while (history.size() > size)
+        while ( history.size() > size )
         {
             history.remove( history.size() );
         }

Modified: 
commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/SecondaryMonitor.java
URL: 
http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/SecondaryMonitor.java?rev=645530&r1=645529&r2=645530&view=diff
==============================================================================
--- 
commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/SecondaryMonitor.java
 (original)
+++ 
commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/SecondaryMonitor.java
 Mon Apr  7 07:13:13 2008
@@ -36,16 +36,20 @@
     extends AbstractMonitor
     implements Monitor.Listener, Detachable
 {
-
     /** The primary monitor */
     private Monitor.Observable monitor;
 
     private boolean detached;
 
+    private long attachedAt;
+
+    private long detachedAt;
+
     public SecondaryMonitor( Monitor.Observable monitor )
     {
         super( monitor.getKey() );
         this.monitor = monitor;
+        this.attachedAt = System.currentTimeMillis();
         this.detached = false;
         for ( StatValue value : monitor.getValues() )
         {
@@ -65,6 +69,7 @@
                 ( (Composite<StatValue>) value ).removeSecondary( getValue( 
value.getRole() ) );
             }
         }
+        this.detachedAt = System.currentTimeMillis();
     }
 
     @SuppressWarnings("unchecked")
@@ -74,6 +79,21 @@
         {
             register( ( (Composite<StatValue>) value ).createSecondary() );
         }
+    }
+
+    public boolean isDetached()
+    {
+        return detached;
+    }
+
+    public long getAttachedAt()
+    {
+        return attachedAt;
+    }
+
+    public long getDetachedAt()
+    {
+        return detachedAt;
     }
 
 }

Modified: 
commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/SecondaryRepository.java
URL: 
http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/SecondaryRepository.java?rev=645530&r1=645529&r2=645530&view=diff
==============================================================================
--- 
commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/SecondaryRepository.java
 (original)
+++ 
commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/SecondaryRepository.java
 Mon Apr  7 07:13:13 2008
@@ -20,6 +20,7 @@
 import org.apache.commons.monitoring.Monitor;
 import org.apache.commons.monitoring.Repository;
 import org.apache.commons.monitoring.StopWatch;
+import org.apache.commons.monitoring.Monitor.Key;
 import org.apache.commons.monitoring.impl.repositories.AbstractRepository;
 
 /**
@@ -73,6 +74,22 @@
     }
 
     /**
+     * [EMAIL PROTECTED]
+     * @see 
org.apache.commons.monitoring.impl.repositories.AbstractRepository#getMonitor(org.apache.commons.monitoring.Monitor.Key)
+     */
+    @Override
+    protected Monitor getMonitor( Key key )
+    {
+        Monitor m = super.getMonitor( key );
+        if (detached && m == null)
+        {
+            // To avoid NullPointerExceptions
+            return new EmpyMonitor( key, attachedAt, detachedAt );
+        }
+        return m;
+    }
+
+    /**
      * @see 
org.apache.commons.monitoring.Repository.Listener#newMonitorInstance(org.apache.commons.monitoring.Monitor)
      */
     public void newMonitorInstance( Monitor monitor )
@@ -110,4 +127,14 @@
     {
         return detachedAt;
     }
+
+    /**
+     * [EMAIL PROTECTED]
+     * @see org.apache.commons.monitoring.listeners.Detachable#isDetached()
+     */
+    public boolean isDetached()
+    {
+        return detached;
+    }
+
 }

Modified: 
commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/AbstractPeriodicLogger.java
URL: 
http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/AbstractPeriodicLogger.java?rev=645530&r1=645529&r2=645530&view=diff
==============================================================================
--- 
commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/AbstractPeriodicLogger.java
 (original)
+++ 
commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/AbstractPeriodicLogger.java
 Mon Apr  7 07:13:13 2008
@@ -58,6 +58,7 @@
         timer.scheduleAtFixedRate( this, period, period );
     }
 
+
     private SecondaryRepository observeRepositoryForPeriod()
     {
         SecondaryRepository previous = this.secondary;

Modified: 
commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/AbstractRenderer.java
URL: 
http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/AbstractRenderer.java?rev=645530&r1=645529&r2=645530&view=diff
==============================================================================
--- 
commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/AbstractRenderer.java
 (original)
+++ 
commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/AbstractRenderer.java
 Mon Apr  7 07:13:13 2008
@@ -32,6 +32,8 @@
 import org.apache.commons.monitoring.StatValue;
 import org.apache.commons.monitoring.Unit;
 import org.apache.commons.monitoring.Monitor.Key;
+import org.apache.commons.monitoring.listeners.Detachable;
+import org.apache.commons.monitoring.listeners.SecondaryMonitor;
 
 /**
  * Render a collection of monitor for reporting
@@ -83,16 +85,27 @@
 
     protected void render( Context ctx, Monitor monitor, Options options )
     {
+        if ( isDetatched( monitor ) )
+        {
+            renderDetached( ctx, (Detachable) monitor, options );
+        }
         render( ctx, monitor.getKey() );
         renderStatValues( ctx, monitor, options );
     }
 
+    protected boolean isDetatched( Monitor monitor )
+    {
+        return monitor instanceof Detachable && ( (Detachable) monitor 
).isDetached();
+    }
+
+    protected abstract void renderDetached( Context ctx, Detachable detached, 
Options options );
+
     protected void renderStatValues( Context ctx, Monitor monitor, Options 
options, List<String> roles )
     {
         renderStatValues( ctx, monitor, options );
     }
 
-    @SuppressWarnings("unchecked")
+    @SuppressWarnings( "unchecked" )
     protected void renderStatValues( Context ctx, Monitor monitor, Options 
options )
     {
         List<String> roles = (List<String>) ctx.get( "roles" );
@@ -100,7 +113,7 @@
         {
             String role = iterator.next();
             StatValue value = monitor.getValue( role );
-            if (value != null)
+            if ( value != null )
             {
                 render( ctx, value, options );
             }
@@ -117,6 +130,7 @@
 
     /**
      * Render an expected value not supported by the current monitor
+     *
      * @param ctx
      * @param role
      */
@@ -196,11 +210,11 @@
      * @param value the StatValue that hold data to be rendered
      * @param attribute the StatValue attribute name to be rendered
      * @param number the the StatValue attribute value to be rendered
-     * @param ratio the ratio between attribute unit and statValue unit (in 
power of 10)
+     * @param ratio the ratio between attribute unit and statValue unit (in
+     * power of 10)
      * @param options the rendering options
      */
-    protected void render( Context ctx, StatValue value, String attribute, 
Number number, Options options,
-                           int ratio )
+    protected void render( Context ctx, StatValue value, String attribute, 
Number number, Options options, int ratio )
     {
         if ( number instanceof Double )
         {
@@ -212,8 +226,7 @@
         }
     }
 
-    private void renderInternal( Context ctx, StatValue value, String 
attribute, long l, Options options,
-                                 int ratio )
+    private void renderInternal( Context ctx, StatValue value, String 
attribute, long l, Options options, int ratio )
     {
         Unit unit = options.unitFor( value );
         if ( unit != null )
@@ -227,8 +240,7 @@
         ctx.print( options.getNumberFormat().format( l ) );
     }
 
-    private void renderInternal( Context ctx, StatValue value, String 
attribute, double d, Options options,
-                                 int ratio )
+    private void renderInternal( Context ctx, StatValue value, String 
attribute, double d, Options options, int ratio )
     {
         if ( Double.isNaN( d ) )
         {
@@ -256,11 +268,11 @@
         Set<String> roles = new HashSet<String>();
         for ( Monitor monitor : monitors )
         {
-            if (options.render( monitor ))
+            if ( options.render( monitor ) )
             {
                 for ( String role : monitor.getRoles() )
                 {
-                    if (options.renderRole( role ))
+                    if ( options.renderRole( role ) )
                     {
                         roles.add( role );
                     }

Modified: 
commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/HtmlRenderer.java
URL: 
http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/HtmlRenderer.java?rev=645530&r1=645529&r2=645530&view=diff
==============================================================================
--- 
commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/HtmlRenderer.java
 (original)
+++ 
commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/HtmlRenderer.java
 Mon Apr  7 07:13:13 2008
@@ -18,6 +18,7 @@
 package org.apache.commons.monitoring.reporting;
 
 import java.util.Collection;
+import java.util.Date;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -26,6 +27,8 @@
 import org.apache.commons.monitoring.StatValue;
 import org.apache.commons.monitoring.Unit;
 import org.apache.commons.monitoring.Monitor.Key;
+import org.apache.commons.monitoring.listeners.Detachable;
+import org.apache.commons.monitoring.listeners.SecondaryMonitor;
 
 /**
  * @author <a href="mailto:[EMAIL PROTECTED]">Nicolas De Loof</a>
@@ -90,7 +93,14 @@
         Collection<String> roles = (Collection<String>) ctx.get( "roles" );
         Map<String, Integer> columns = new HashMap<String, Integer>();
 
-        ctx.println( "<thead><tr><th rowspan='2'>name</th>" );
+        ctx.println( "<thead><tr>" );
+        boolean detached = ( monitors.size() > 0 && 
monitors.iterator().next()instanceof Detachable );
+
+        if ( detached )
+        {
+            ctx.println( "<td colspan='2'>period</td>" );
+        }
+        ctx.println( "<th rowspan='2'>name</th>" );
         ctx.println( "<th rowspan='2'>category</th>" );
         ctx.println( "<th rowspan='2'>subsystem</th>" );
         for ( String role : roles )
@@ -129,7 +139,13 @@
             }
         }
         ctx.print( "</tr>" );
+
         ctx.print( "<tr>" );
+        if ( detached )
+        {
+            ctx.println( "<th>from</th>" );
+            ctx.println( "<th>to</th>" );
+        }
 
         for ( String role : roles )
         {
@@ -164,6 +180,20 @@
             ctx.print( attribute );
             ctx.print( "</th>" );
         }
+    }
+
+    /**
+     * [EMAIL PROTECTED]
+     * @see 
org.apache.commons.monitoring.reporting.AbstractRenderer#renderDetached(org.apache.commons.monitoring.reporting.Context,
 org.apache.commons.monitoring.listeners.SecondaryMonitor, 
org.apache.commons.monitoring.reporting.Renderer.Options)
+     */
+    @Override
+    protected void renderDetached( Context ctx, Detachable detached, Options 
options )
+    {
+        ctx.print( "<td>" );
+        ctx.print( options.getDateFormat().format( new Date( 
detached.getAttachedAt()) ) );
+        ctx.print( "</td><td>" );
+        ctx.print( options.getDateFormat().format( new Date( 
detached.getDetachedAt()) ) );
+        ctx.print( "</td>" );
     }
 
     protected void renderUnit( Context ctx, Unit unit )

Modified: 
commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/JsonRenderer.java
URL: 
http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/JsonRenderer.java?rev=645530&r1=645529&r2=645530&view=diff
==============================================================================
--- 
commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/JsonRenderer.java
 (original)
+++ 
commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/JsonRenderer.java
 Mon Apr  7 07:13:13 2008
@@ -18,11 +18,14 @@
 package org.apache.commons.monitoring.reporting;
 
 import java.util.Collection;
+import java.util.Date;
 import java.util.List;
 
 import org.apache.commons.monitoring.Monitor;
 import org.apache.commons.monitoring.StatValue;
 import org.apache.commons.monitoring.Monitor.Key;
+import org.apache.commons.monitoring.listeners.Detachable;
+import org.apache.commons.monitoring.listeners.SecondaryMonitor;
 
 public class JsonRenderer
     extends AbstractRenderer
@@ -59,7 +62,27 @@
         {
             ctx.print( "," );
         }
+        if ( isDetatched( monitor ) )
+        {
+            renderDetached( ctx, (Detachable) monitor, options );
+            ctx.print( "," );
+        }
         render( ctx, monitor.getKey() );
+        ctx.print( "}" );
+    }
+
+    /**
+     * [EMAIL PROTECTED]
+     * @see 
org.apache.commons.monitoring.reporting.AbstractRenderer#renderDetached(org.apache.commons.monitoring.reporting.Context,
 org.apache.commons.monitoring.listeners.SecondaryMonitor, 
org.apache.commons.monitoring.reporting.Renderer.Options)
+     */
+    @Override
+    protected void renderDetached( Context ctx, Detachable detached, Options 
options )
+    {
+        ctx.print( "period:{from:" );
+        ctx.print( options.getDateFormat().format( new Date( 
detached.getAttachedAt()) ) );
+        ctx.print( "," );
+        ctx.print( "to:" );
+        ctx.print( options.getDateFormat().format( new Date( 
detached.getDetachedAt()) ) );
         ctx.print( "}" );
     }
 

Modified: 
commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/OptionsSupport.java
URL: 
http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/OptionsSupport.java?rev=645530&r1=645529&r2=645530&view=diff
==============================================================================
--- 
commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/OptionsSupport.java
 (original)
+++ 
commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/OptionsSupport.java
 Mon Apr  7 07:13:13 2008
@@ -17,9 +17,12 @@
 
 package org.apache.commons.monitoring.reporting;
 
+import java.text.DateFormat;
 import java.text.DecimalFormat;
 import java.text.DecimalFormatSymbols;
 import java.text.NumberFormat;
+import java.text.SimpleDateFormat;
+import java.util.Locale;
 
 import org.apache.commons.monitoring.Monitor;
 import org.apache.commons.monitoring.StatValue;
@@ -65,6 +68,11 @@
     public NumberFormat getNumberFormat()
     {
         return new DecimalFormat( "0" );
+    }
+
+    public DateFormat getDateFormat()
+    {
+        return DateFormat.getDateTimeInstance( DateFormat.SHORT, 
DateFormat.SHORT );
     }
 
 }

Modified: 
commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/Renderer.java
URL: 
http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/Renderer.java?rev=645530&r1=645529&r2=645530&view=diff
==============================================================================
--- 
commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/Renderer.java
 (original)
+++ 
commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/Renderer.java
 Mon Apr  7 07:13:13 2008
@@ -17,6 +17,7 @@
 
 package org.apache.commons.monitoring.reporting;
 
+import java.text.DateFormat;
 import java.text.NumberFormat;
 import java.util.Arrays;
 import java.util.Collection;
@@ -51,5 +52,7 @@
         NumberFormat getNumberFormat();
 
         NumberFormat getDecimalFormat();
+
+        DateFormat getDateFormat();
     }
 }

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=645530&r1=645529&r2=645530&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
 Mon Apr  7 07:13:13 2008
@@ -25,6 +25,8 @@
 import java.util.Stack;
 import java.util.StringTokenizer;
 
+import org.apache.commons.monitoring.Monitor.Key;
+
 /**
  * use a REST-style path to select a group of statValues. For example, to get
  * the mean performance for monitors in category "services"
@@ -36,7 +38,7 @@
 {
 
     /**
-     * 
+     *
      */
     private static final String SEP = "/";
     private String path;
@@ -67,7 +69,7 @@
             {
                 if ( SEP.equals( previous ) )
                 {
-                    stack.push( "" );
+                    stack.push( Key.DEFAULT );
                 }
             }
             else
@@ -78,7 +80,7 @@
         }
         if ( path.endsWith( SEP ) )
         {
-            stack.push( "" );
+            stack.push( Key.DEFAULT );
         }
         Collections.reverse( stack );
 

Modified: 
commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/TxtRenderer.java
URL: 
http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/TxtRenderer.java?rev=645530&r1=645529&r2=645530&view=diff
==============================================================================
--- 
commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/TxtRenderer.java
 (original)
+++ 
commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/TxtRenderer.java
 Mon Apr  7 07:13:13 2008
@@ -17,8 +17,11 @@
 
 package org.apache.commons.monitoring.reporting;
 
+import java.util.Date;
+
 import org.apache.commons.monitoring.StatValue;
 import org.apache.commons.monitoring.Monitor.Key;
+import org.apache.commons.monitoring.listeners.Detachable;
 
 /**
  * A simple TXT renderer, typically to dump monitoring status in a log file
@@ -29,6 +32,19 @@
     extends AbstractRenderer
 {
     private static final String HR = 
"--------------------------------------------------------------------------------";
+
+    /**
+     * [EMAIL PROTECTED]
+     * @see 
org.apache.commons.monitoring.reporting.AbstractRenderer#renderDetached(org.apache.commons.monitoring.reporting.Context,
 org.apache.commons.monitoring.listeners.SecondaryMonitor, 
org.apache.commons.monitoring.reporting.Renderer.Options)
+     */
+    @Override
+    protected void renderDetached( Context ctx, Detachable detached, Options 
options )
+    {
+        ctx.print( "from : " );
+        ctx.println ( options.getDateFormat().format( new Date( 
detached.getAttachedAt()) ) );
+        ctx.print( "to : " );
+        ctx.print( options.getDateFormat().format( new Date( 
detached.getDetachedAt()) ) );
+    }
 
     /**
      * [EMAIL PROTECTED]

Modified: 
commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/XmlRenderer.java
URL: 
http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/XmlRenderer.java?rev=645530&r1=645529&r2=645530&view=diff
==============================================================================
--- 
commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/XmlRenderer.java
 (original)
+++ 
commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/XmlRenderer.java
 Mon Apr  7 07:13:13 2008
@@ -18,11 +18,14 @@
 package org.apache.commons.monitoring.reporting;
 
 import java.util.Collection;
+import java.util.Date;
 import java.util.List;
 
 import org.apache.commons.monitoring.Monitor;
 import org.apache.commons.monitoring.StatValue;
 import org.apache.commons.monitoring.Monitor.Key;
+import org.apache.commons.monitoring.listeners.Detachable;
+import org.apache.commons.monitoring.reporting.Renderer.Options;
 
 public class XmlRenderer
     extends AbstractRenderer
@@ -71,6 +74,21 @@
         }
         ctx.print( "\">" );
     }
+
+    /**
+     * [EMAIL PROTECTED]
+     * @see 
org.apache.commons.monitoring.reporting.AbstractRenderer#renderDetached(org.apache.commons.monitoring.reporting.Context,
 org.apache.commons.monitoring.listeners.SecondaryMonitor, 
org.apache.commons.monitoring.reporting.Renderer.Options)
+     */
+    @Override
+    protected void renderDetached( Context ctx, Detachable detached, Options 
options )
+    {
+        ctx.print( "<period from=\"" );
+        ctx.println ( options.getDateFormat().format( new Date( 
detached.getAttachedAt()) ) );
+        ctx.print( "\" to=\"" );
+        ctx.print( options.getDateFormat().format( new Date( 
detached.getDetachedAt()) ) );
+        ctx.print( "/>" );
+    }
+
 
 
     @Override

Modified: 
commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/web/MonitoringServlet.java
URL: 
http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/web/MonitoringServlet.java?rev=645530&r1=645529&r2=645530&view=diff
==============================================================================
--- 
commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/web/MonitoringServlet.java
 (original)
+++ 
commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/web/MonitoringServlet.java
 Mon Apr  7 07:13:13 2008
@@ -108,7 +108,8 @@
             String path = request.getPathInfo();
             Collection<Monitor> monitors = (Collection<Monitor>) new Selector( 
path ).select( repository );
             Renderer.Options options = getOptions( request );
-            renderer.render( new Context( response.getWriter() ), monitors, 
options );
+            Context ctx = new Context( response.getWriter() );
+            renderer.render( ctx, monitors, options );
             return;
         }
     }

Modified: 
commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/servlet/MonitoringListener.java
URL: 
http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/servlet/MonitoringListener.java?rev=645530&r1=645529&r2=645530&view=diff
==============================================================================
--- 
commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/servlet/MonitoringListener.java
 (original)
+++ 
commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/servlet/MonitoringListener.java
 Mon Apr  7 07:13:13 2008
@@ -17,15 +17,35 @@
 
 package org.apache.commons.monitoring.servlet;
 
+import javax.servlet.ServletContext;
 import javax.servlet.ServletContextEvent;
 import javax.servlet.ServletContextListener;
 
+import org.apache.commons.monitoring.Monitor;
 import org.apache.commons.monitoring.Monitoring;
 import org.apache.commons.monitoring.Repository;
+import org.apache.commons.monitoring.Unit;
 import org.apache.commons.monitoring.impl.repositories.DefaultRepository;
+import org.apache.commons.monitoring.listeners.HistorizedRepositoryDecorator;
 
 /**
- * A Servlet Context Listener to configure Monitoring
+ * A Servlet Context Listener to configure Monitoring, used to setup optional
+ * monitoring features
+ * <p>
+ * To enable repository historization, set the servlet context parameter
+ * <tt>org.apache.commons.monitoring.History</tt> using the format :
+ * <tt>[historization period][unit]:[size]</tt>
+ * <p>
+ * for example, to setup a 30 items history of 10 minutes periods  :
+ * <pre>
+ *  &lt;context-param&gt;
+ *  &lt;description&gt;enable monitoring history&lt;/description&gt;
+ *  &lt;param-name&gt;org.apache.commons.monitoring.History&lt;/param-name&gt;
+ *  &lt;param-value&gt;10min:30&lt;/param-value&gt;
+ *  &lt;/context-param&gt;
+ * </pre>
+ *
+ * </p>
  *
  * @author <a href="mailto:[EMAIL PROTECTED]">Nicolas De Loof</a>
  */
@@ -33,6 +53,12 @@
     implements ServletContextListener
 {
 
+    public static final String HISTORY = 
"org.apache.commons.monitoring.History";
+
+    public static final String HISTORY_PERIOD = 
"org.apache.commons.monitoring.History.period";
+
+    public static final String HISTORY_SIZE = 
"org.apache.commons.monitoring.History.size";
+
     /**
      * [EMAIL PROTECTED]
      *
@@ -40,13 +66,36 @@
      */
     public void contextInitialized( ServletContextEvent event )
     {
+        ServletContext sc = event.getServletContext();
+        Repository repository = createRepository( sc );
+
+        String history = sc.getInitParameter( HISTORY );
+        if ( history != null )
+        {
+            repository = setupHistory( repository, history );
+        }
+
+        sc.setAttribute( ServletContextUtil.REPOSITORY_KEY, repository );
+        Monitoring.setRepository( repository );
+    }
+
+    /**
+     * Create the repository to be used in this web application.
+     * <p>
+     * User can override this method to change the repository instanciation 
strategy and/or to
+     * supply a custom implementation.
+     * @param sc
+     * @return
+     */
+    protected Repository createRepository( ServletContext sc )
+    {
         Repository repository;
-        String name = event.getServletContext().getInitParameter( 
ServletContextUtil.REPOSITORY_KEY );
+        String name = sc.getInitParameter( ServletContextUtil.REPOSITORY_KEY );
         if ( name != null )
         {
             try
             {
-                @SuppressWarnings("unchecked")
+                @SuppressWarnings( "unchecked" )
                 Class repositoryClass = Class.forName( name );
                 if ( !Repository.class.isAssignableFrom( repositoryClass ) )
                 {
@@ -72,8 +121,40 @@
         {
             repository = new DefaultRepository();
         }
-        event.getServletContext().setAttribute( 
ServletContextUtil.REPOSITORY_KEY, repository );
-        Monitoring.setRepository( repository );
+        return repository;
+    }
+
+    /**
+     * Setup the historization feature on the repository
+     *
+     * @param repository the (observable) repository to historize
+     * @param history the historization configuration, in format
+     * [period][unit]:[size]
+     * @return
+     */
+    protected Repository setupHistory( Repository repository, String history )
+    {
+        Repository.Observable observable = (Repository.Observable) repository;
+        int idx = history.indexOf( ':' );
+        char[] ch = history.toCharArray();
+        long period = 0;
+        for ( int i = 0; i < idx; i++ )
+        {
+            if ( Character.isDigit( ch[i] ) )
+                continue;
+            period = Long.parseLong( history.substring( 0, i ) );
+            String unit = history.substring( i, idx );
+            if ( unit != null )
+            {
+                Unit u = Unit.NANOS.getDerived( unit );
+                period *= u.getScale() / Unit.MILLIS.getScale();
+                break;
+            }
+        }
+
+        int size = Integer.parseInt( history.substring( idx + 1 ) );
+        repository = new HistorizedRepositoryDecorator( period, size, 
observable );
+        return repository;
     }
 
     /**

Modified: commons/sandbox/monitoring/trunk/src/main/webapp/WEB-INF/web.xml
URL: 
http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/webapp/WEB-INF/web.xml?rev=645530&r1=645529&r2=645530&view=diff
==============================================================================
--- commons/sandbox/monitoring/trunk/src/main/webapp/WEB-INF/web.xml (original)
+++ commons/sandbox/monitoring/trunk/src/main/webapp/WEB-INF/web.xml Mon Apr  7 
07:13:13 2008
@@ -20,6 +20,16 @@
 
 <web-app>
 
+    <context-param>
+        <description>enable monitoring history</description>
+        <param-name>org.apache.commons.monitoring.History</param-name>
+        <param-value>1min:10</param-value>
+    </context-param>
+
+    <listener>
+        
<listener-class>org.apache.commons.monitoring.servlet.MonitoringListener</listener-class>
+    </listener>
+
     <filter>
         <filter-name>Monitoring</filter-name>
         
<filter-class>org.apache.commons.monitoring.servlet.MonitoringFilter</filter-class>


Reply via email to