You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by ni...@apache.org on 2010/01/22 12:17:38 UTC

svn commit: r902060 - in /commons/sandbox/monitoring/trunk/reporting: ./ src/main/java/org/apache/commons/monitoring/reporting/ src/test/java/org/apache/commons/monitoring/reporting/ src/test/resources/org/apache/commons/monitoring/reporting/

Author: nicolas
Date: Fri Jan 22 11:17:37 2010
New Revision: 902060

URL: http://svn.apache.org/viewvc?rev=902060&view=rev
Log:
cleaner rendering architecture :
o AbstractVisitor supports filtering and defines start/end "event" method
o FormatVisitor applies formatting on "events"
o Format implementations to support specific data layout and separators (XML + JSON)

Added:
    commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/AbstractVisitor.java
    commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/Format.java
    commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/FormattingVisitor.java
    commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/JSONFormat.java
    commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/RepositoryFilter.java
      - copied, changed from r901735, commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/VisitorConfiguration.java
    commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/XMLFormat.java
    commons/sandbox/monitoring/trunk/reporting/src/test/java/org/apache/commons/monitoring/reporting/FormattingVisitorTest.java
      - copied, changed from r901735, commons/sandbox/monitoring/trunk/reporting/src/test/java/org/apache/commons/monitoring/reporting/RendererTest.java
Removed:
    commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/AbstractFilteredVisitor.java
    commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/JsonRenderer.java
    commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/VisitorConfiguration.java
    commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/VisitorConfigurationSupport.java
    commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/XmlRenderer.java
    commons/sandbox/monitoring/trunk/reporting/src/test/java/org/apache/commons/monitoring/reporting/RendererTest.java
Modified:
    commons/sandbox/monitoring/trunk/reporting/pom.xml
    commons/sandbox/monitoring/trunk/reporting/src/test/resources/org/apache/commons/monitoring/reporting/RendererTest.xml

Modified: commons/sandbox/monitoring/trunk/reporting/pom.xml
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/reporting/pom.xml?rev=902060&r1=902059&r2=902060&view=diff
==============================================================================
--- commons/sandbox/monitoring/trunk/reporting/pom.xml (original)
+++ commons/sandbox/monitoring/trunk/reporting/pom.xml Fri Jan 22 11:17:37 2010
@@ -13,6 +13,11 @@
       <artifactId>commons-monitoring-core</artifactId>
       <version>${project.version}</version>
     </dependency>
+    <dependency>
+      <groupId>commons-lang</groupId>
+      <artifactId>commons-lang</artifactId>
+      <version>2.4</version>
+    </dependency>
     <dependency>
       <groupId>junit</groupId>
       <artifactId>junit</artifactId>
@@ -22,6 +27,12 @@
     <dependency>
       <groupId>xmlunit</groupId>
       <artifactId>xmlunit</artifactId>
+      <version>1.3</version>
+	  <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.codehaus.jettison</groupId>
+      <artifactId>jettison</artifactId>
       <version>1.2</version>
 	  <scope>test</scope>
     </dependency>

Added: commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/AbstractVisitor.java
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/AbstractVisitor.java?rev=902060&view=auto
==============================================================================
--- commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/AbstractVisitor.java (added)
+++ commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/AbstractVisitor.java Fri Jan 22 11:17:37 2010
@@ -0,0 +1,141 @@
+/*
+ * 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.reporting;
+
+import java.util.Collection;
+
+import org.apache.commons.monitoring.Counter;
+import org.apache.commons.monitoring.Gauge;
+import org.apache.commons.monitoring.Metric;
+import org.apache.commons.monitoring.Monitor;
+import org.apache.commons.monitoring.Repository;
+import org.apache.commons.monitoring.Visitor;
+
+public abstract class AbstractVisitor
+    implements Visitor
+{
+    private RepositoryFilter filter = FULL;
+
+    public void setFilter( RepositoryFilter filter )
+    {
+        this.filter = filter;
+    }
+
+    protected abstract void monitorEnd( String name );
+
+    protected abstract void monitorStart( Monitor monitor );
+
+    protected abstract void gaugeStart( String name );
+
+    protected abstract void gaugeEnd( String name );
+
+    protected abstract void counterStart( String name );
+
+    protected abstract void counterEnd( String name );
+
+    protected abstract void repositoryEnd();
+
+    protected abstract void repositoryStart();
+
+    protected abstract void attribute( String name, double value );
+
+    protected abstract void attribute( String name, String value );
+
+    public final void visit( Repository repository )
+    {
+        repositoryStart();
+        doVisit( repository );
+        repositoryEnd();
+    }
+
+    protected abstract void doVisit( Repository repository );
+
+    protected Collection<Monitor> getMonitors( Repository repository )
+    {
+        return repository.getMonitors();
+    }
+
+    public final void visit( Monitor monitor )
+    {
+        Monitor.Key key = monitor.getKey();
+        String name = key.getName();
+        monitorStart( monitor );
+        doVisit( monitor );
+        monitorEnd( name );
+    }
+
+    protected abstract void doVisit( Monitor monitor );
+
+    protected Collection<Metric> getMetrics( Monitor monitor )
+    {
+        return monitor.getMetrics();
+    }
+
+    public final void visit( Gauge gauge )
+    {
+        String name = gauge.getRole().getName();
+        gaugeStart( name );
+        attribute( "unit", gauge.getUnit().getName() );
+        attribute( "value", gauge.getValue() );
+        attribute( "max", gauge.getMax() );
+        attribute( "min", gauge.getMin() );
+        attribute( "hits", gauge.getHits() );
+        attribute( "standardDeviation", gauge.getStandardDeviation() );
+        attribute( "variance", gauge.getVariance() );
+        attribute( "mean", gauge.getMean() );
+        attribute( "geometricMean", gauge.getGeometricMean() );
+        attribute( "sumOfLogs", gauge.getSumOfLogs() );
+        attribute( "sumOfSquares", gauge.getSumOfSquares() );
+        gaugeEnd( name );
+    }
+
+    public final void visit( Counter counter )
+    {
+        String name = counter.getRole().getName();
+        counterStart( name );
+        attribute( "unit", counter.getUnit().getName() );
+        attribute( "sum", counter.getSum() );
+        attribute( "max", counter.getMax() );
+        attribute( "min", counter.getMin() );
+        attribute( "hits", counter.getHits() );
+        attribute( "standardDeviation", counter.getStandardDeviation() );
+        attribute( "variance", counter.getVariance() );
+        attribute( "mean", counter.getMean() );
+        attribute( "geometricMean", counter.getGeometricMean() );
+        attribute( "sumOfLogs", counter.getSumOfLogs() );
+        attribute( "sumOfSquares", counter.getSumOfSquares() );
+        counterEnd( name );
+    }
+
+    private static final RepositoryFilter FULL = new RepositoryFilter()
+    {
+
+        @Override
+        public boolean filter( Monitor monitor )
+        {
+            return true;
+        }
+
+        @Override
+        public boolean filter( Metric metric )
+        {
+            return true;
+        }
+
+    };
+}
\ No newline at end of file

Added: commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/Format.java
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/Format.java?rev=902060&view=auto
==============================================================================
--- commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/Format.java (added)
+++ commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/Format.java Fri Jan 22 11:17:37 2010
@@ -0,0 +1,56 @@
+/*
+ * 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.reporting;
+
+import java.io.PrintWriter;
+
+import org.apache.commons.monitoring.Monitor;
+
+public interface Format
+{
+
+    void repositoryStart( PrintWriter writer );
+
+    void repositoryEnd( PrintWriter writer );
+
+    void monitorStart( PrintWriter writer, Monitor monitor );
+
+    void monitorEnd( PrintWriter writer, String name );
+
+    void gaugeStart( PrintWriter writer, String name );
+
+    void gaugeEnd( PrintWriter writer, String name );
+
+    void counterStart( PrintWriter writer, String name );
+
+    void counterEnd( PrintWriter writer, String name );
+
+    void attribute( PrintWriter writer, String name, String value );
+
+    void separator( PrintWriter writer );
+
+    void escape( PrintWriter writer, String string );
+
+    public static final Format JSON = new JSONFormat( false );
+
+    public static final Format JSON_PRETTY = new JSONFormat( true );
+
+    public static final Format XML = new XMLFormat( false );
+
+    public static final Format XML_PRETTY = new XMLFormat( true );;
+}

Added: commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/FormattingVisitor.java
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/FormattingVisitor.java?rev=902060&view=auto
==============================================================================
--- commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/FormattingVisitor.java (added)
+++ commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/FormattingVisitor.java Fri Jan 22 11:17:37 2010
@@ -0,0 +1,164 @@
+/*
+ * 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.reporting;
+
+import java.io.PrintWriter;
+import java.text.DecimalFormat;
+import java.text.NumberFormat;
+import java.util.Locale;
+
+import org.apache.commons.monitoring.Metric;
+import org.apache.commons.monitoring.Monitor;
+import org.apache.commons.monitoring.Repository;
+
+public class FormattingVisitor
+    extends AbstractVisitor
+{
+    protected PrintWriter writer;
+
+    private NumberFormat numberFormat;
+
+    private Format format;
+
+    public FormattingVisitor( Format format, PrintWriter writer )
+    {
+        this( format, writer, Locale.getDefault() );
+    }
+
+    public FormattingVisitor( Format format, PrintWriter writer, Locale locale )
+    {
+        this( format, writer, DecimalFormat.getNumberInstance( locale ) );
+    }
+
+    public FormattingVisitor( Format format, PrintWriter writer, NumberFormat numberFormat )
+    {
+        super();
+        this.format = format;
+        this.writer = writer;
+        this.numberFormat = numberFormat;
+    }
+
+    protected void doVisit( Repository repository )
+    {
+        boolean first = true;
+        for ( Monitor monitor : getMonitors( repository ) )
+        {
+            if ( !first )
+            {
+                separator();
+            }
+            first = false;
+            monitor.accept( this );
+        }
+    }
+
+    protected void doVisit( Monitor monitor )
+    {
+        boolean first = true;
+        for ( Metric metric : getMetrics( monitor ) )
+        {
+            if ( !first )
+            {
+                separator();
+            }
+            first = false;
+            metric.accept( this );
+        }
+    }
+
+    protected void attribute( String name, double value )
+    {
+        attribute( name, format( value ) );
+    }
+
+    protected String format( double value )
+    {
+        String s = numberFormat.format( value );
+        if ( "\uFFFD".equals( s ) )
+        {
+            // Locale may have no DecimalFormatSymbols.NaN (set to "\uFFFD" (REPLACE_CHAR))
+            s = "NaN";
+        }
+        return s;
+    }
+
+    @Override
+    protected void repositoryStart()
+    {
+        format.repositoryStart( writer );
+    }
+
+    @Override
+    protected void repositoryEnd()
+    {
+        format.repositoryEnd( writer );
+    }
+    
+    protected void attribute( String name, String value )
+    {
+        format.attribute( writer, name, value );
+    }
+
+    @Override
+    protected void counterEnd( String name )
+    {
+        format.counterEnd( writer, name );
+    }
+
+    @Override
+    protected void counterStart( String name )
+    {
+        format.counterStart( writer, name );
+    }
+
+    protected void escape( String string )
+    {
+        format.escape( writer, string );
+    }
+
+    @Override
+    protected void gaugeEnd( String name )
+    {
+        format.gaugeEnd( writer, name );
+    }
+
+    @Override
+    protected void gaugeStart( String name )
+    {
+        format.gaugeStart( writer, name );
+    }
+
+    @Override
+    protected void monitorStart( Monitor monitor )
+    {
+        format.monitorStart( writer, monitor );
+    }
+
+    @Override
+    protected void monitorEnd( String name )
+    {
+        format.monitorEnd( writer, name );
+    }
+
+    protected void separator()
+    {
+        format.separator( writer );
+    }
+
+
+}
\ No newline at end of file

Added: commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/JSONFormat.java
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/JSONFormat.java?rev=902060&view=auto
==============================================================================
--- commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/JSONFormat.java (added)
+++ commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/JSONFormat.java Fri Jan 22 11:17:37 2010
@@ -0,0 +1,130 @@
+/*
+ * 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.reporting;
+
+import java.io.PrintWriter;
+
+import org.apache.commons.lang.StringEscapeUtils;
+import org.apache.commons.monitoring.Monitor;
+
+
+/**
+ * Format to JSON (JavaScript), with optional indentation
+ * 
+ * @author <a href="mailto:nicolas@apache.org">Nicolas De Loof</a>
+ */
+public class JSONFormat
+    implements Format
+{
+    private boolean indent;
+
+    public JSONFormat( boolean indent )
+    {
+        this.indent = indent;
+    }
+
+    public void repositoryStart( PrintWriter writer )
+    {
+        writer.append( "{" );
+    }
+
+    public void repositoryEnd( PrintWriter writer )
+    {
+        if ( indent )
+        {
+            writer.append( "\n" );
+        }
+        writer.append( "}" );
+    }
+
+    public void monitorStart( PrintWriter writer, Monitor monitor )
+    {
+        if ( indent )
+        {
+            writer.append( "\n  " );
+        }
+        Monitor.Key key = monitor.getKey();
+        escape( writer, key.getName() );
+        writer.append( ":{" );
+    }
+
+    public void monitorEnd( PrintWriter writer, String name )
+    {
+        if ( indent )
+        {
+            writer.append( "\n  " );
+        }
+
+        writer.append( "}" );
+    }
+
+    public void gaugeStart( PrintWriter writer, String name )
+    {
+        if ( indent )
+        {
+            writer.append( "\n    " );
+        }
+        escape( writer, name );
+        writer.append( ":{" );
+        writeAttribute( writer, "type", "gauge" );
+    }
+
+    public void gaugeEnd( PrintWriter writer, String name )
+    {
+        writer.append( "}" );
+    }
+
+    public void counterStart( PrintWriter writer, String name )
+    {
+        if ( indent )
+        {
+            writer.append( "\n    " );
+        }
+        escape( writer, name );
+        writer.append( ":{" );
+        writeAttribute( writer, "type", "counter" );
+    }
+
+    public void counterEnd( PrintWriter writer, String name )
+    {
+        writer.append( "}" );
+    }
+
+    public void attribute( PrintWriter writer, String name, String value )
+    {
+        separator( writer );
+        writeAttribute( writer, name, value );
+    }
+
+    protected void writeAttribute( PrintWriter writer, String name, String value )
+    {
+        writer.append( name )
+              .append( ":" );
+        escape( writer, value );
+    }
+
+    public void escape( PrintWriter writer, String string )
+    {
+        writer.append( '\"' ).append( StringEscapeUtils.escapeJavaScript( string ) ).append( '\"' );
+    }
+
+    public void separator( PrintWriter writer )
+    {
+        writer.append( "," );
+    }
+}
\ No newline at end of file

Copied: commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/RepositoryFilter.java (from r901735, commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/VisitorConfiguration.java)
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/RepositoryFilter.java?p2=commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/RepositoryFilter.java&p1=commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/VisitorConfiguration.java&r1=901735&r2=902060&rev=902060&view=diff
==============================================================================
--- commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/VisitorConfiguration.java (original)
+++ commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/RepositoryFilter.java Fri Jan 22 11:17:37 2010
@@ -17,17 +17,18 @@
 
 package org.apache.commons.monitoring.reporting;
 
-import org.apache.commons.monitoring.Role;
-import org.apache.commons.monitoring.Monitor.Key;
+import org.apache.commons.monitoring.Metric;
+import org.apache.commons.monitoring.Monitor;
 
 /**
+ * Filter repository content. Used to expose a restricted view on an existing Repository.
+ * 
+ * @see FilteredRepository
  * @author <a href="mailto:nicolas@apache.org">Nicolas De Loof</a>
  */
-public interface VisitorConfiguration
+public interface RepositoryFilter
 {
-    boolean filter( Key key );
+    boolean filter( Monitor monitor );
 
-    boolean filter( Role role );
-
-    String format( double value );
+    boolean filter( Metric metric );
 }

Added: commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/XMLFormat.java
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/XMLFormat.java?rev=902060&view=auto
==============================================================================
--- commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/XMLFormat.java (added)
+++ commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/XMLFormat.java Fri Jan 22 11:17:37 2010
@@ -0,0 +1,126 @@
+/*
+ * 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.reporting;
+
+import java.io.PrintWriter;
+
+import org.apache.commons.lang.StringEscapeUtils;
+import org.apache.commons.monitoring.Monitor;
+
+/**
+ * Format to XML, with optional indentation
+ * 
+ * @author <a href="mailto:nicolas@apache.org">Nicolas De Loof</a>
+ */
+public class XMLFormat
+    implements Format
+{
+    public XMLFormat( boolean indent )
+    {
+        super();
+        this.indent = indent;
+    }
+
+    private boolean indent;
+
+    public void repositoryStart( PrintWriter writer )
+    {
+        writer.append( "<repository>" );
+    }
+
+    public void repositoryEnd( PrintWriter writer )
+    {
+        if ( indent )
+        {
+            writer.append( "\n" );
+        }
+        writer.append( "</repository>" );
+    }
+
+    public void monitorStart( PrintWriter writer, Monitor monitor )
+    {
+        if ( indent )
+        {
+            writer.append( "\n  " );
+        }
+        writer.append( "<monitor" );
+        Monitor.Key key = monitor.getKey();
+        attribute( writer, "name", key.getName() );
+        attribute( writer, "category", key.getCategory() );
+        attribute( writer, "subsystem", key.getSubsystem() );
+        writer.append( '>' );
+    }
+
+    public void monitorEnd( PrintWriter writer, String name )
+    {
+        if ( indent )
+        {
+            writer.append( "\n  " );
+        }
+        writer.append( "</monitor>" );
+    }
+
+    public void gaugeStart( PrintWriter writer, String name )
+    {
+        if ( indent )
+        {
+            writer.append( "\n    " );
+        }
+        writer.append( "<gauge" );
+        attribute( writer, "role", name );
+    }
+
+    public void gaugeEnd( PrintWriter writer, String name )
+    {
+        writer.append( "/>" );
+    }
+
+    public void counterStart( PrintWriter writer, String name )
+    {
+        if ( indent )
+        {
+            writer.append( "\n    " );
+        }
+        writer.append( "<counter" );
+        attribute( writer, "role", name );
+    }
+
+    public void counterEnd( PrintWriter writer, String name )
+    {
+        writer.append( "/>" );
+    }
+
+    public void attribute( PrintWriter writer, String name, String value )
+    {
+        writer.append( " " )
+              .append( name )
+              .append( "=\"" );
+        escape( writer, value );
+        writer.append( "\"" );
+    }
+
+    public void escape( PrintWriter writer, String string )
+    {
+        writer.append( StringEscapeUtils.escapeXml( string ) );
+    }
+
+    public void separator( PrintWriter writer )
+    {
+        // Nop
+    }
+}
\ No newline at end of file

Copied: commons/sandbox/monitoring/trunk/reporting/src/test/java/org/apache/commons/monitoring/reporting/FormattingVisitorTest.java (from r901735, commons/sandbox/monitoring/trunk/reporting/src/test/java/org/apache/commons/monitoring/reporting/RendererTest.java)
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/reporting/src/test/java/org/apache/commons/monitoring/reporting/FormattingVisitorTest.java?p2=commons/sandbox/monitoring/trunk/reporting/src/test/java/org/apache/commons/monitoring/reporting/FormattingVisitorTest.java&p1=commons/sandbox/monitoring/trunk/reporting/src/test/java/org/apache/commons/monitoring/reporting/RendererTest.java&r1=901735&r2=902060&rev=902060&view=diff
==============================================================================
--- commons/sandbox/monitoring/trunk/reporting/src/test/java/org/apache/commons/monitoring/reporting/RendererTest.java (original)
+++ commons/sandbox/monitoring/trunk/reporting/src/test/java/org/apache/commons/monitoring/reporting/FormattingVisitorTest.java Fri Jan 22 11:17:37 2010
@@ -26,10 +26,15 @@
 import java.io.Reader;
 import java.io.StringReader;
 import java.io.StringWriter;
+import java.text.NumberFormat;
+import java.util.Locale;
 
 import org.apache.commons.monitoring.Repository;
 import org.apache.commons.monitoring.Visitor;
 import org.apache.commons.monitoring.repositories.DefaultRepository;
+import org.codehaus.jettison.AbstractXMLStreamReader;
+import org.codehaus.jettison.json.JSONObject;
+import org.codehaus.jettison.mapped.MappedXMLStreamReader;
 import org.custommonkey.xmlunit.XMLAssert;
 import org.junit.Before;
 import org.junit.Test;
@@ -37,16 +42,21 @@
 /**
  * @author <a href="mailto:nicolas@apache.org">Nicolas De Loof</a>
  */
-public class RendererTest
+public class FormattingVisitorTest
 {
     private Repository repository;
 
+    private NumberFormat format;
+
     @Before
     public void setup()
     {
         repository = new DefaultRepository();
         repository.getMonitor( "RendererTest", "unit", "test" ).getCounter( FAILURES ).add( 1.0 );
         repository.getMonitor( "RendererTest", "unit", "test" ).getGauge( CONCURRENCY ).increment( UNARY );
+
+        format = NumberFormat.getNumberInstance( Locale.US );
+        format.setMinimumFractionDigits( 1 );
     }
 
     @Test
@@ -54,10 +64,11 @@
         throws Exception
     {
         StringWriter out = new StringWriter();
-        Visitor v = new XmlRenderer( new VisitorConfigurationSupport(), new PrintWriter( out ) );
+        Visitor v = new FormattingVisitor( Format.XML_PRETTY, new PrintWriter( out ), format );
         repository.accept( v );
 
-        Reader expected = new InputStreamReader( getClass().getResourceAsStream( "RendererTest.xml" ) );
+        System.out.println( out.toString() );
+		Reader expected = new InputStreamReader( getClass().getResourceAsStream( "RendererTest.xml" ) );
         XMLAssert.assertXMLEqual( expected, new StringReader( out.toString() ) );
     }
 
@@ -66,10 +77,14 @@
         throws Exception
     {
         StringWriter out = new StringWriter();
-        Visitor v = new JsonRenderer( new VisitorConfigurationSupport(), new PrintWriter( out ) );
+        Visitor v = new FormattingVisitor( Format.JSON_PRETTY, new PrintWriter( out ), format );
         repository.accept( v );
 
         System.out.println( out.toString() );
-        // JSON Testing framework
+        JSONObject json = new JSONObject( out.toString() );
+        AbstractXMLStreamReader reader = new MappedXMLStreamReader( json );
+
+        // FIXME can't use XMLStreamReader to compare actual with expected using XMLUnit :'(
+        // any JSON Testing framework ?
     }
 }

Modified: commons/sandbox/monitoring/trunk/reporting/src/test/resources/org/apache/commons/monitoring/reporting/RendererTest.xml
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/reporting/src/test/resources/org/apache/commons/monitoring/reporting/RendererTest.xml?rev=902060&r1=902059&r2=902060&view=diff
==============================================================================
--- commons/sandbox/monitoring/trunk/reporting/src/test/resources/org/apache/commons/monitoring/reporting/RendererTest.xml (original)
+++ commons/sandbox/monitoring/trunk/reporting/src/test/resources/org/apache/commons/monitoring/reporting/RendererTest.xml Fri Jan 22 11:17:37 2010
@@ -1,9 +1,9 @@
 <repository>
   <monitor name="RendererTest" category="unit" subsystem="test">
     <counter role="failures" unit="" sum="1.0" max="1.0" min="1.0" hits="1.0" standardDeviation="0.0" variance="0.0"
-      mean="1.0" geometricMean="1.0" sumOfLogs="0.0" somOfSquares="1.0" />
+      mean="1.0" geometricMean="1.0" sumOfLogs="0.0" sumOfSquares="1.0" />
     <gauge role="concurrency" unit="" value="1.0" max="1.0" min="1.0" hits="1.0" standardDeviation="NaN" variance="NaN"
-      mean="NaN" geometricMean="NaN" sumOfLogs="NaN" somOfSquares="NaN" />
+      mean="NaN" geometricMean="NaN" sumOfLogs="NaN" sumOfSquares="NaN" />
   </monitor>
 </repository>