Modified: qpid/trunk/qpid/java/perftests/etc/testdefs/standard/QueueTypes.json
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/perftests/etc/testdefs/standard/QueueTypes.json?rev=1356250&r1=1356249&r2=1356250&view=diff
==============================================================================
--- qpid/trunk/qpid/java/perftests/etc/testdefs/standard/QueueTypes.json 
(original)
+++ qpid/trunk/qpid/java/perftests/etc/testdefs/standard/QueueTypes.json Mon 
Jul  2 14:26:36 2012
@@ -16132,7 +16132,7 @@
           ]
         }
       ]
-    }
+    },
     {
       "_name": "queue-type:priority-queue";
       "_queues":[

Modified: 
qpid/trunk/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/client/ConsumerParticipant.java
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/client/ConsumerParticipant.java?rev=1356250&r1=1356249&r2=1356250&view=diff
==============================================================================
--- 
qpid/trunk/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/client/ConsumerParticipant.java
 (original)
+++ 
qpid/trunk/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/client/ConsumerParticipant.java
 Mon Jul  2 14:26:36 2012
@@ -20,13 +20,16 @@
 package org.apache.qpid.disttest.client;
 
 
+import java.util.ArrayList;
 import java.util.Date;
+import java.util.List;
 import java.util.NavigableSet;
 import java.util.concurrent.ConcurrentSkipListSet;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicLong;
 
+import javax.jms.JMSException;
 import javax.jms.Message;
 import javax.jms.MessageListener;
 
@@ -53,12 +56,17 @@ public class ConsumerParticipant impleme
     private long _startTime;
 
     private volatile Exception _asyncMessageListenerException;
+    private List<Long> _messageLatencies;
 
     public ConsumerParticipant(final ClientJmsDelegate delegate, final 
CreateConsumerCommand command)
     {
         _jmsDelegate = delegate;
         _command = command;
         _resultFactory = new ParticipantResultFactory();
+        if (command.isEvaluateLatency())
+        {
+            _messageLatencies = new ArrayList<Long>();
+        }
     }
 
     @Override
@@ -105,7 +113,7 @@ public class ConsumerParticipant impleme
                 numberOfMessagesSent,
                 payloadSize,
                 totalPayloadSize,
-                start, end);
+                start, end, _messageLatencies);
 
         return result;
     }
@@ -130,25 +138,42 @@ public class ConsumerParticipant impleme
      */
     private boolean processMessage(Message message)
     {
-        int messageCount = _totalNumberOfMessagesReceived.incrementAndGet();
-        if (LOGGER.isTraceEnabled())
-        {
-            LOGGER.trace("message " + messageCount + " received by " + this);
-        }
-        int messagePayloadSize = 
_jmsDelegate.calculatePayloadSizeFrom(message);
-        _allConsumedPayloadSizes.add(messagePayloadSize);
-        _totalPayloadSizeOfAllMessagesReceived.addAndGet(messagePayloadSize);
-
+        int messageCount = message == null? 
_totalNumberOfMessagesReceived.get() : 
_totalNumberOfMessagesReceived.incrementAndGet() ;
         boolean batchEnabled = _command.getBatchSize() > 0;
         boolean batchComplete = batchEnabled && messageCount % 
_command.getBatchSize() == 0;
-
-        if (!batchEnabled || batchComplete)
+        if (message != null)
         {
-            if (LOGGER.isTraceEnabled() && batchEnabled)
+            if (LOGGER.isTraceEnabled())
+            {
+                LOGGER.trace("message " + messageCount + " received by " + 
this);
+            }
+            int messagePayloadSize = 
_jmsDelegate.calculatePayloadSizeFrom(message);
+            _allConsumedPayloadSizes.add(messagePayloadSize);
+            
_totalPayloadSizeOfAllMessagesReceived.addAndGet(messagePayloadSize);
+
+            if (_command.isEvaluateLatency())
+            {
+                long mesageTimestamp;
+                try
+                {
+                    mesageTimestamp = message.getJMSTimestamp();
+                }
+                catch (JMSException e)
+                {
+                    throw new DistributedTestException("Cannot get message 
timestamp!", e);
+                }
+                long latency = System.currentTimeMillis() - mesageTimestamp;
+                _messageLatencies.add(latency);
+            }
+
+            if (!batchEnabled || batchComplete)
             {
-                LOGGER.trace("Committing: batch size " + 
_command.getBatchSize() );
+                if (LOGGER.isTraceEnabled() && batchEnabled)
+                {
+                    LOGGER.trace("Committing: batch size " + 
_command.getBatchSize() );
+                }
+                _jmsDelegate.commitOrAcknowledgeMessage(message, 
_command.getSessionName());
             }
-            _jmsDelegate.commitOrAcknowledgeMessage(message, 
_command.getSessionName());
         }
 
         boolean reachedExpectedNumberOfMessages = 
_command.getNumberOfMessages() > 0 && messageCount >= 
_command.getNumberOfMessages();

Modified: 
qpid/trunk/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/client/ParticipantResultFactory.java
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/client/ParticipantResultFactory.java?rev=1356250&r1=1356249&r2=1356250&view=diff
==============================================================================
--- 
qpid/trunk/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/client/ParticipantResultFactory.java
 (original)
+++ 
qpid/trunk/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/client/ParticipantResultFactory.java
 Mon Jul  2 14:26:36 2012
@@ -18,6 +18,7 @@
  */
 package org.apache.qpid.disttest.client;
 
+import java.util.Collection;
 import java.util.Date;
 
 import org.apache.qpid.disttest.message.ConsumerParticipantResult;
@@ -26,12 +27,24 @@ import org.apache.qpid.disttest.message.
 import org.apache.qpid.disttest.message.CreateProducerCommand;
 import org.apache.qpid.disttest.message.ParticipantResult;
 import org.apache.qpid.disttest.message.ProducerParticipantResult;
+import org.apache.qpid.disttest.results.aggregation.SeriesStatistics;
 
 public class ParticipantResultFactory
 {
-    public ConsumerParticipantResult createForConsumer(String participantName, 
String clientRegisteredName, CreateConsumerCommand command, int 
acknowledgeMode, int numberOfMessagesReceived, int payloadSize, long 
totalPayloadReceived, Date start, Date end)
+    public ConsumerParticipantResult createForConsumer(String participantName, 
String clientRegisteredName,
+            CreateConsumerCommand command, int acknowledgeMode, int 
numberOfMessagesReceived, int payloadSize,
+            long totalPayloadReceived, Date start, Date end)
+    {
+        return createForConsumer(participantName, clientRegisteredName, 
command, acknowledgeMode, numberOfMessagesReceived,
+                payloadSize, totalPayloadReceived, start, end, null);
+    }
+
+    public ConsumerParticipantResult createForConsumer(String participantName, 
String clientRegisteredName,
+            CreateConsumerCommand command, int acknowledgeMode, int 
numberOfMessagesReceived, int payloadSize,
+            long totalPayloadReceived, Date start, Date end, Collection<Long> 
messageLatencies)
     {
         ConsumerParticipantResult consumerParticipantResult = new 
ConsumerParticipantResult();
+        consumerParticipantResult.setMessageLatencies(messageLatencies);
 
         setTestProperties(consumerParticipantResult, command, participantName, 
clientRegisteredName, acknowledgeMode);
         setTestResultProperties(consumerParticipantResult, 
numberOfMessagesReceived, payloadSize, totalPayloadReceived, start, end);
@@ -45,6 +58,11 @@ public class ParticipantResultFactory
         consumerParticipantResult.setTotalNumberOfConsumers(1);
         consumerParticipantResult.setTotalNumberOfProducers(0);
 
+        SeriesStatistics statistics = new SeriesStatistics(messageLatencies);
+        consumerParticipantResult.setAverageLatency(statistics.getAverage());
+        consumerParticipantResult.setMinLatency(statistics.getMinimum());
+        consumerParticipantResult.setMaxLatency(statistics.getMaximum());
+        
consumerParticipantResult.setLatencyStandardDeviation(statistics.getStandardDeviation());
         return consumerParticipantResult;
     }
 

Modified: 
qpid/trunk/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/ConsumerConfig.java
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/ConsumerConfig.java?rev=1356250&r1=1356249&r2=1356250&view=diff
==============================================================================
--- 
qpid/trunk/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/ConsumerConfig.java
 (original)
+++ 
qpid/trunk/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/ConsumerConfig.java
 Mon Jul  2 14:26:36 2012
@@ -10,6 +10,7 @@ public class ConsumerConfig extends Part
     private String _selector;
     private boolean _noLocal;
     private boolean _synchronous;
+    private boolean _evaluateLatency;
 
     // For Gson
     public ConsumerConfig()
@@ -58,6 +59,7 @@ public class ConsumerConfig extends Part
         createConsumerCommand.setSelector(_selector);
         createConsumerCommand.setNoLocal(_noLocal);
         createConsumerCommand.setSynchronous(_synchronous);
+        createConsumerCommand.setEvaluateLatency(_evaluateLatency);
 
         return createConsumerCommand;
     }

Modified: 
qpid/trunk/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/ConsumerParticipantResult.java
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/ConsumerParticipantResult.java?rev=1356250&r1=1356249&r2=1356250&view=diff
==============================================================================
--- 
qpid/trunk/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/ConsumerParticipantResult.java
 (original)
+++ 
qpid/trunk/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/ConsumerParticipantResult.java
 Mon Jul  2 14:26:36 2012
@@ -25,6 +25,8 @@ import static org.apache.qpid.disttest.m
 import static 
org.apache.qpid.disttest.message.ParticipantAttribute.IS_SYNCHRONOUS_CONSUMER;
 import static org.apache.qpid.disttest.message.ParticipantAttribute.IS_TOPIC;
 
+import java.util.Collection;
+
 public class ConsumerParticipantResult extends ParticipantResult
 {
     private boolean _topic;
@@ -34,6 +36,12 @@ public class ConsumerParticipantResult e
     private boolean _noLocal;
     private boolean _synchronousConsumer;
 
+    private Collection<Long> _messageLatencies;
+    private long _minLatency;
+    private long _maxLatency;
+    private double _averageLatency;
+    private double _latencyStandardDeviation;
+
     public ConsumerParticipantResult()
     {
         super(CommandType.CONSUMER_PARTICIPANT_RESULT);
@@ -115,4 +123,59 @@ public class ConsumerParticipantResult e
     {
         return _topic;
     }
+
+    public Collection<Long> getMessageLatencies()
+    {
+        return _messageLatencies;
+    }
+
+    public void setMessageLatencies(Collection<Long> messageLatencies)
+    {
+        _messageLatencies = messageLatencies;
+    }
+
+    @OutputAttribute(attribute=ParticipantAttribute.MIN_LATENCY)
+    public long getMinLatency()
+    {
+        return _minLatency;
+    }
+
+    public void setMinLatency(long minLatency)
+    {
+        _minLatency = minLatency;
+    }
+
+    @OutputAttribute(attribute=ParticipantAttribute.MAX_LATENCY)
+    public long getMaxLatency()
+    {
+        return _maxLatency;
+    }
+
+    public void setMaxLatency(long maxLatency)
+    {
+        _maxLatency = maxLatency;
+    }
+
+    @OutputAttribute(attribute=ParticipantAttribute.AVERAGE_LATENCY)
+    public double getAverageLatency()
+    {
+        return _averageLatency;
+    }
+
+    public void setAverageLatency(double averageLatency)
+    {
+        _averageLatency = averageLatency;
+    }
+
+    @OutputAttribute(attribute=ParticipantAttribute.LATENCY_STANDARD_DEVIATION)
+    public double getLatencyStandardDeviation()
+    {
+        return _latencyStandardDeviation;
+    }
+
+    public void setLatencyStandardDeviation(double latencyStandardDeviation)
+    {
+        _latencyStandardDeviation = latencyStandardDeviation;
+    }
+
 }

Modified: 
qpid/trunk/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/CreateConsumerCommand.java
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/CreateConsumerCommand.java?rev=1356250&r1=1356249&r2=1356250&view=diff
==============================================================================
--- 
qpid/trunk/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/CreateConsumerCommand.java
 (original)
+++ 
qpid/trunk/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/CreateConsumerCommand.java
 Mon Jul  2 14:26:36 2012
@@ -28,7 +28,7 @@ public class CreateConsumerCommand exten
     private boolean _noLocal;
     private boolean _synchronous;
     private long _receiveTimeout = 5000;
-
+    private boolean _evaluateLatency;
 
     public CreateConsumerCommand()
     {
@@ -105,4 +105,14 @@ public class CreateConsumerCommand exten
     {
         return _receiveTimeout;
     }
+
+    public boolean isEvaluateLatency()
+    {
+        return _evaluateLatency;
+    }
+
+    public void setEvaluateLatency(boolean evaluateLatency)
+    {
+        _evaluateLatency = evaluateLatency;
+    }
 }

Modified: 
qpid/trunk/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/ParticipantAttribute.java
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/ParticipantAttribute.java?rev=1356250&r1=1356249&r2=1356250&view=diff
==============================================================================
--- 
qpid/trunk/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/ParticipantAttribute.java
 (original)
+++ 
qpid/trunk/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/ParticipantAttribute.java
 Mon Jul  2 14:26:36 2012
@@ -54,7 +54,12 @@ public enum ParticipantAttribute
     TOTAL_PAYLOAD_PROCESSED("totalPayloadProcessedB"),
     THROUGHPUT("throughputKbPerS"),
     TIME_TAKEN("timeTakenMs"),
-    ERROR_MESSAGE("errorMessage");
+    ERROR_MESSAGE("errorMessage"),
+    MIN_LATENCY("minLatency"),
+    MAX_LATENCY("maxLatency"),
+    AVERAGE_LATENCY("averageLatency"),
+    LATENCY_STANDARD_DEVIATION("latencyStandardDeviation")
+    ;
 
     private String _displayName;
 

Modified: 
qpid/trunk/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/results/aggregation/ParticipantResultAggregator.java
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/results/aggregation/ParticipantResultAggregator.java?rev=1356250&r1=1356249&r2=1356250&view=diff
==============================================================================
--- 
qpid/trunk/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/results/aggregation/ParticipantResultAggregator.java
 (original)
+++ 
qpid/trunk/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/results/aggregation/ParticipantResultAggregator.java
 Mon Jul  2 14:26:36 2012
@@ -23,6 +23,7 @@ import java.util.Date;
 import java.util.NavigableSet;
 import java.util.TreeSet;
 
+import org.apache.qpid.disttest.message.ConsumerParticipantResult;
 import org.apache.qpid.disttest.message.ParticipantResult;
 
 public class ParticipantResultAggregator
@@ -44,6 +45,8 @@ public class ParticipantResultAggregator
     private NavigableSet<Integer> _encounteredAcknowledgeMode = new 
TreeSet<Integer>();
     private NavigableSet<String> _encountedTestNames = new TreeSet<String>();
 
+    private SeriesStatistics _latencyStatistics = new SeriesStatistics();
+
     public ParticipantResultAggregator(Class<? extends ParticipantResult> 
targetClass, String aggregateResultName)
     {
         _aggregatedResultName = aggregateResultName;
@@ -56,12 +59,31 @@ public class ParticipantResultAggregator
         {
             rollupConstantAttributes(result);
             computeVariableAttributes(result);
+            if (result instanceof ConsumerParticipantResult)
+            {
+                ConsumerParticipantResult consumerParticipantResult = 
(ConsumerParticipantResult)result;
+                
_latencyStatistics.addMessageLatencies(consumerParticipantResult.getMessageLatencies());
+                _latencyStatistics.aggregate();
+            }
         }
     }
 
     public ParticipantResult getAggregatedResult()
     {
-        ParticipantResult aggregatedResult = new 
ParticipantResult(_aggregatedResultName);
+        ParticipantResult aggregatedResult;
+        if (_targetClass == ConsumerParticipantResult.class)
+        {
+            ConsumerParticipantResult consumerParticipantResult = new 
ConsumerParticipantResult(_aggregatedResultName);
+            
consumerParticipantResult.setAverageLatency(_latencyStatistics.getAverage());
+            
consumerParticipantResult.setMinLatency(_latencyStatistics.getMinimum());
+            
consumerParticipantResult.setMaxLatency(_latencyStatistics.getMaximum());
+            
consumerParticipantResult.setLatencyStandardDeviation(_latencyStatistics.getStandardDeviation());
+            aggregatedResult = consumerParticipantResult;
+        }
+        else
+        {
+            aggregatedResult = new ParticipantResult(_aggregatedResultName);
+        }
 
         setRolledUpConstantAttributes(aggregatedResult);
         setComputedVariableAttributes(aggregatedResult);

Added: 
qpid/trunk/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/results/aggregation/SeriesStatistics.java
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/results/aggregation/SeriesStatistics.java?rev=1356250&view=auto
==============================================================================
--- 
qpid/trunk/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/results/aggregation/SeriesStatistics.java
 (added)
+++ 
qpid/trunk/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/results/aggregation/SeriesStatistics.java
 Mon Jul  2 14:26:36 2012
@@ -0,0 +1,111 @@
+/*
+ *
+ * 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.qpid.disttest.results.aggregation;
+
+import java.util.Collection;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+public class SeriesStatistics
+{
+    private long _minValue;
+    private long _maxValue;
+    private double _mean;
+    private double _standardDeviation;
+    private Collection<Long> _series = new CopyOnWriteArrayList<Long>();
+
+    public SeriesStatistics()
+    {
+        super();
+    }
+
+    public SeriesStatistics(Collection<Long> messageLatencies)
+    {
+        setMessageLatencies(messageLatencies);
+    }
+
+    public void addMessageLatencies(Collection<Long> messageLatencies)
+    {
+        if (messageLatencies != null)
+        {
+            _series.addAll(messageLatencies);
+        }
+    }
+
+    public void setMessageLatencies(Collection<Long> messageLatencies)
+    {
+        _series = messageLatencies;
+        aggregate();
+    }
+
+    public void aggregate()
+    {
+        if (_series != null && _series.size() > 0)
+        {
+            long minLatency = Long.MAX_VALUE;
+            long maxLatency = Long.MIN_VALUE;
+            long totalLatency = 0;
+            for (Long latency : _series)
+            {
+                totalLatency += latency;
+                minLatency = Math.min(minLatency, latency);
+                maxLatency = Math.max(maxLatency, latency);
+            }
+            _mean = ((double) totalLatency) / (double) _series.size();
+            _minValue = minLatency;
+            _maxValue = maxLatency;
+            double sum = 0;
+            for (Long latency : _series)
+            {
+                double diff = latency - _mean;
+                sum += diff * diff;
+            }
+            long size = _series.size() == 1 ? 1: _series.size() - 1;
+            _standardDeviation = Math.sqrt(sum / (double) size);
+        }
+        else
+        {
+            _mean = 0;
+            _minValue = 0;
+            _maxValue = 0;
+            _standardDeviation = 0;
+        }
+    }
+
+    public long getMinimum()
+    {
+        return _minValue;
+    }
+
+    public long getMaximum()
+    {
+        return _maxValue;
+    }
+
+    public double getAverage()
+    {
+        return _mean;
+    }
+
+    public double getStandardDeviation()
+    {
+        return _standardDeviation;
+    }
+}

Modified: 
qpid/trunk/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/client/ConsumerParticipantTest.java
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/client/ConsumerParticipantTest.java?rev=1356250&r1=1356249&r2=1356250&view=diff
==============================================================================
--- 
qpid/trunk/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/client/ConsumerParticipantTest.java
 (original)
+++ 
qpid/trunk/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/client/ConsumerParticipantTest.java
 Mon Jul  2 14:26:36 2012
@@ -29,6 +29,8 @@ import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
+import java.util.Collection;
+
 import javax.jms.Message;
 import javax.jms.Session;
 
@@ -36,6 +38,7 @@ import junit.framework.TestCase;
 
 import org.apache.qpid.disttest.DistributedTestException;
 import org.apache.qpid.disttest.jms.ClientJmsDelegate;
+import org.apache.qpid.disttest.message.ConsumerParticipantResult;
 import org.apache.qpid.disttest.message.CreateConsumerCommand;
 import org.apache.qpid.disttest.message.ParticipantResult;
 import org.mockito.InOrder;
@@ -177,4 +180,24 @@ public class ConsumerParticipantTest ext
         verify(_delegate).closeTestConsumer(PARTICIPANT_NAME1);
     }
 
+    public void testLatency() throws Exception
+    {
+        int numberOfMessages = 1;
+        long totalPayloadSize = PAYLOAD_SIZE_PER_MESSAGE * numberOfMessages;
+        _command.setNumberOfMessages(numberOfMessages);
+        _command.setEvaluateLatency(true);
+        _consumerParticipant = new ConsumerParticipant(_delegate, _command);
+        ParticipantResult result = _consumerParticipant.doIt(CLIENT_NAME);
+
+        assertExpectedConsumerResults(result, PARTICIPANT_NAME1, CLIENT_NAME, 
_testStartTime,
+                                      Session.CLIENT_ACKNOWLEDGE, null, 
numberOfMessages, PAYLOAD_SIZE_PER_MESSAGE, totalPayloadSize, null);
+
+        _inOrder.verify(_delegate).consumeMessage(PARTICIPANT_NAME1, 
RECEIVE_TIMEOUT);
+        _inOrder.verify(_delegate).calculatePayloadSizeFrom(_mockMessage);
+        _inOrder.verify(_delegate).commitOrAcknowledgeMessage(_mockMessage, 
SESSION_NAME1);
+        assertTrue("Unexpected consuemr results", result instanceof 
ConsumerParticipantResult);
+        Collection<Long> latencies = 
((ConsumerParticipantResult)result).getMessageLatencies();
+        assertNotNull("Message latency is not cllected", latencies);
+        assertEquals("Unexpected message latency results", 1,  
latencies.size());
+    }
 }

Copied: 
qpid/trunk/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/results/aggregation/SeriesStatisticsTest.java
 (from r1356248, 
qpid/trunk/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/seriesbuilder/SeriesBuilderCallback.java)
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/results/aggregation/SeriesStatisticsTest.java?p2=qpid/trunk/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/results/aggregation/SeriesStatisticsTest.java&p1=qpid/trunk/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/seriesbuilder/SeriesBuilderCallback.java&r1=1356248&r2=1356250&rev=1356250&view=diff
==============================================================================
--- 
qpid/trunk/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/seriesbuilder/SeriesBuilderCallback.java
 (original)
+++ 
qpid/trunk/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/results/aggregation/SeriesStatisticsTest.java
 Mon Jul  2 14:26:36 2012
@@ -1,4 +1,5 @@
 /*
+ *
  * 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
@@ -17,14 +18,26 @@
  * under the License.
  *
  */
-package org.apache.qpid.disttest.charting.seriesbuilder;
+package org.apache.qpid.disttest.results.aggregation;
+
+import java.util.Arrays;
+import java.util.Collection;
 
-import org.apache.qpid.disttest.charting.definition.SeriesDefinition;
+import junit.framework.TestCase;
 
-public interface SeriesBuilderCallback
+public class SeriesStatisticsTest extends TestCase
 {
-    public void beginSeries(SeriesDefinition seriesDefinition);
-    public void addDataPointToSeries(SeriesDefinition seriesDefinition, Object 
xValue, Object yValue);
-    public void endSeries(SeriesDefinition seriesDefinition);
+    public static Collection<Long> SERIES = Arrays.asList(new Long[] { 2l, 4l, 
4l, 4l, 5l, 5l, 7l, 9l, 5l });
+
+    public void testAggregate()
+    {
+        SeriesStatistics results = new SeriesStatistics();
+        results.addMessageLatencies(SERIES);
+        results.aggregate();
+        assertEquals("Unexpected average", 5.0, results.getAverage(), 0.01);
+        assertEquals("Unexpected min", 2, results.getMinimum());
+        assertEquals("Unexpected max", 9, results.getMaximum());
+        assertEquals("Unexpected standard deviation", 2.0, 
results.getStandardDeviation(), 0.01);
+    }
 
 }

Modified: 
qpid/trunk/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/results/aggregation/TestResultAggregatorTest.java
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/results/aggregation/TestResultAggregatorTest.java?rev=1356250&r1=1356249&r2=1356250&view=diff
==============================================================================
--- 
qpid/trunk/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/results/aggregation/TestResultAggregatorTest.java
 (original)
+++ 
qpid/trunk/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/results/aggregation/TestResultAggregatorTest.java
 Mon Jul  2 14:26:36 2012
@@ -19,6 +19,7 @@
 package org.apache.qpid.disttest.results.aggregation;
 
 import java.util.Date;
+import java.util.List;
 
 import junit.framework.TestCase;
 
@@ -26,8 +27,6 @@ import org.apache.qpid.disttest.controll
 import org.apache.qpid.disttest.message.ConsumerParticipantResult;
 import org.apache.qpid.disttest.message.ParticipantResult;
 import org.apache.qpid.disttest.message.ProducerParticipantResult;
-import org.apache.qpid.disttest.results.aggregation.AggregatedTestResult;
-import org.apache.qpid.disttest.results.aggregation.TestResultAggregator;
 
 public class TestResultAggregatorTest extends TestCase
 {
@@ -105,6 +104,55 @@ public class TestResultAggregatorTest ex
         assertEquals(TestResultAggregator.AGGREGATED_ERROR_MESSAGE, 
aggregatedTestResult.getAllParticipantResult().getErrorMessage());
     }
 
+    public void testAggregateResultsForConsumerWithLatencyResults() throws 
Exception
+    {
+        TestResult originalTestResult = createResultsFromTest();
+        List<ParticipantResult> results = 
originalTestResult.getParticipantResults();
+        for (ParticipantResult participantResult : results)
+        {
+            if (participantResult instanceof ConsumerParticipantResult)
+            {
+                
((ConsumerParticipantResult)participantResult).setMessageLatencies(SeriesStatisticsTest.SERIES);
+                break;
+            }
+        }
+
+        int numberOfOriginalParticipantResults = 
originalTestResult.getParticipantResults().size();
+        int expectedNumberOfResults = numberOfOriginalParticipantResults + 
EXPECTED_NUMBER_OF_AGGREGATED_RESULTS;
+
+        AggregatedTestResult aggregatedTestResult = 
_aggregator.aggregateTestResult(originalTestResult);
+
+        
aggregatedTestResult.getAllConsumerParticipantResult().getTotalPayloadProcessed();
+        assertEquals(expectedNumberOfResults, 
aggregatedTestResult.getParticipantResults().size());
+
+        assertMinimalAggregatedResults(
+                aggregatedTestResult.getAllConsumerParticipantResult(),
+                TEST1_NAME, TEST1_ITERATION_NUMBER,
+                BATCH_SIZE, NUMBER_OF_MESSAGES_CONSUMED_IN_TOTAL, 2, 0);
+
+        
assertLatencyAggregatedResults(aggregatedTestResult.getAllConsumerParticipantResult());
+
+        assertMinimalAggregatedResults(
+                aggregatedTestResult.getAllProducerParticipantResult(),
+                TEST1_NAME, TEST1_ITERATION_NUMBER,
+                BATCH_SIZE, NUMBER_OF_MESSAGES_PRODUCED, 0, 1);
+
+        assertMinimalAggregatedResults(
+                aggregatedTestResult.getAllParticipantResult(),
+                TEST1_NAME, TEST1_ITERATION_NUMBER,
+                BATCH_SIZE, NUMBER_OF_MESSAGES_CONSUMED_IN_TOTAL, 2, 1);
+    }
+
+    private void assertLatencyAggregatedResults(ParticipantResult 
allConsumerParticipantResult)
+    {
+        assertTrue("Unexpected result", allConsumerParticipantResult 
instanceof ConsumerParticipantResult);
+        ConsumerParticipantResult results = 
(ConsumerParticipantResult)allConsumerParticipantResult;
+        assertEquals("Unexpected average", 5.0, results.getAverageLatency(), 
0.01);
+        assertEquals("Unexpected min", 2, results.getMinLatency());
+        assertEquals("Unexpected max", 9, results.getMaxLatency());
+        assertEquals("Unexpected standard deviation", 2.0, 
results.getLatencyStandardDeviation(), 0.01);
+    }
+
     private void assertMinimalAggregatedResults(ParticipantResult result, 
String expectedTestName, int expectedIterationNumber, int expectedBatchSize, 
long expectedNumberOfMessagesProcessed, int expectedTotalNumberOfConsumers, int 
expectedTotalNumberOfProducers)
     {
         assertEquals("Unexpected test name in " + result.getParticipantName(), 
expectedTestName, result.getTestName());

Modified: 
qpid/trunk/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/results/formatting/CSVFormaterTest.java
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/results/formatting/CSVFormaterTest.java?rev=1356250&r1=1356249&r2=1356250&view=diff
==============================================================================
--- 
qpid/trunk/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/results/formatting/CSVFormaterTest.java
 (original)
+++ 
qpid/trunk/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/results/formatting/CSVFormaterTest.java
 Mon Jul  2 14:26:36 2012
@@ -118,7 +118,10 @@ public class CSVFormaterTest extends Tes
         participantAttributes.put(THROUGHPUT, 2048);
         participantAttributes.put(TIME_TAKEN, 1000);
         participantAttributes.put(ERROR_MESSAGE, "error");
-
+        participantAttributes.put(MIN_LATENCY, 2l);
+        participantAttributes.put(MAX_LATENCY, 9l);
+        participantAttributes.put(AVERAGE_LATENCY, 5.0f);
+        participantAttributes.put(LATENCY_STANDARD_DEVIATION, 2.0f);
         return participantAttributes;
     }
 

Modified: 
qpid/trunk/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/results/formatting/expectedOutput.csv
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/results/formatting/expectedOutput.csv?rev=1356250&r1=1356249&r2=1356250&view=diff
==============================================================================
--- 
qpid/trunk/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/results/formatting/expectedOutput.csv
 (original)
+++ 
qpid/trunk/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/results/formatting/expectedOutput.csv
 Mon Jul  2 14:26:36 2012
@@ -1,2 +1,2 @@
-testName,iterationNumber,clientName,participantName,numberOfMessages,payloadSizeB,priority,timeToLiveMs,acknowledgeMode,deliveryMode,batchSize,maximumDurationMs,producerStartDelayMs,producerIntervalMs,isTopic,isDurableSubscription,isBrowsingSubscription,isSelector,isNoLocal,isSynchronousConsumer,totalNumberOfConsumers,totalNumberOfProducers,totalPayloadProcessedB,throughputKbPerS,timeTakenMs,errorMessage
-TEST1,0,CONFIGURED_CLIENT1,PARTICIPANT,0,1,2,3,4,5,6,7,8,9,true,false,true,false,true,false,1,2,1024,2048,1000,error
\ No newline at end of file
+testName,iterationNumber,clientName,participantName,numberOfMessages,payloadSizeB,priority,timeToLiveMs,acknowledgeMode,deliveryMode,batchSize,maximumDurationMs,producerStartDelayMs,producerIntervalMs,isTopic,isDurableSubscription,isBrowsingSubscription,isSelector,isNoLocal,isSynchronousConsumer,totalNumberOfConsumers,totalNumberOfProducers,totalPayloadProcessedB,throughputKbPerS,timeTakenMs,errorMessage,minLatency,maxLatency,averageLatency,latencyStandardDeviation
+TEST1,0,CONFIGURED_CLIENT1,PARTICIPANT,0,1,2,3,4,5,6,7,8,9,true,false,true,false,true,false,1,2,1024,2048,1000,error,2,9,5.0,2.0

Modified: 
qpid/trunk/qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/controllerandclient/ControllerAndClientTest.java
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/controllerandclient/ControllerAndClientTest.java?rev=1356250&r1=1356249&r2=1356250&view=diff
==============================================================================
--- 
qpid/trunk/qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/controllerandclient/ControllerAndClientTest.java
 (original)
+++ 
qpid/trunk/qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/controllerandclient/ControllerAndClientTest.java
 Mon Jul  2 14:26:36 2012
@@ -23,6 +23,7 @@ import static org.apache.qpid.systest.di
 import static 
org.apache.qpid.systest.disttest.SystemTestConstants.REGISTRATION_TIMEOUT;
 import static 
org.apache.qpid.systest.disttest.SystemTestConstants.TEST_RESULT_TIMEOUT;
 
+import java.util.Collection;
 import java.util.List;
 
 import javax.jms.Message;
@@ -73,6 +74,19 @@ public class ControllerAndClientTest ext
         List<ParticipantResult> test1ParticipantResults = 
testResult1.getParticipantResults();
         assertEquals("Unexpected number of participant results for test 1", 2, 
test1ParticipantResults.size());
         assertParticipantNames(test1ParticipantResults, 
"participantConsumer1", "participantProducer1");
+        ConsumerParticipantResult result = null;
+        for (ParticipantResult participantResult : test1ParticipantResults)
+        {
+            if (participantResult instanceof ConsumerParticipantResult)
+            {
+                result = (ConsumerParticipantResult)participantResult;
+                break;
+            }
+        }
+        assertNotNull("Consumer results not recived", result);
+        Collection<Long> latencies = result.getMessageLatencies();
+        assertNotNull("Latency results are not collected", latencies);
+        assertEquals("Unexpected latency results", 1, latencies.size());
     }
 
     public void testProducerClient() throws Exception

Modified: 
qpid/trunk/qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/controllerandclient/producerAndConsumerInSeparateClients.json
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/controllerandclient/producerAndConsumerInSeparateClients.json?rev=1356250&r1=1356249&r2=1356250&view=diff
==============================================================================
--- 
qpid/trunk/qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/controllerandclient/producerAndConsumerInSeparateClients.json
 (original)
+++ 
qpid/trunk/qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/controllerandclient/producerAndConsumerInSeparateClients.json
 Mon Jul  2 14:26:36 2012
@@ -42,7 +42,8 @@
                     {
                       "_name": "participantConsumer1",
                       "_destinationName": "direct://amq.direct//testQueue",
-                      "_numberOfMessages": 1
+                      "_numberOfMessages": 1,
+                      "_evaluateLatency": true
                     }
                   ]
                 }

Modified: 
qpid/trunk/qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/endtoend/EndToEndTest.java
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/endtoend/EndToEndTest.java?rev=1356250&r1=1356249&r2=1356250&view=diff
==============================================================================
--- 
qpid/trunk/qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/endtoend/EndToEndTest.java
 (original)
+++ 
qpid/trunk/qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/endtoend/EndToEndTest.java
 Mon Jul  2 14:26:36 2012
@@ -62,10 +62,10 @@ public class EndToEndTest extends QpidBr
         assertEquals("Unexpected number of lines in CSV", 
numberOfExpectedRows, csvLines.length);
 
         assertDataRowsHaveCorrectTestAndClientName("End To End 1", 
"producingClient", "participantProducer1", csvLines[1], 1);
-        assertDataRowsHaveCorrectTestAndClientName("End To End 1", 
"consumingClient", "participantConsumer1", csvLines[2], 1);
+        assertDataRowsHaveCorrectTestAndClientName("End To End 1", 
"consumingClient", "participantConsumer1", csvLines[3], 1);
 
-        assertDataRowsHaveCorrectTestAndClientName("End To End 1", "", 
TestResultAggregator.ALL_PARTICIPANTS_NAME, csvLines[3], 1);
-        assertDataRowsHaveCorrectTestAndClientName("End To End 1", "", 
TestResultAggregator.ALL_CONSUMER_PARTICIPANTS_NAME, csvLines[4], 1);
+        assertDataRowsHaveCorrectTestAndClientName("End To End 1", "", 
TestResultAggregator.ALL_PARTICIPANTS_NAME, csvLines[4], 1);
+        assertDataRowsHaveCorrectTestAndClientName("End To End 1", "", 
TestResultAggregator.ALL_CONSUMER_PARTICIPANTS_NAME, csvLines[2], 1);
         assertDataRowsHaveCorrectTestAndClientName("End To End 1", "", 
TestResultAggregator.ALL_PRODUCER_PARTICIPANTS_NAME, csvLines[5], 1);
 
     }

Modified: 
qpid/trunk/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/ChartType.java
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/ChartType.java?rev=1356250&r1=1356249&r2=1356250&view=diff
==============================================================================
--- 
qpid/trunk/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/ChartType.java
 (original)
+++ 
qpid/trunk/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/ChartType.java
 Mon Jul  2 14:26:36 2012
@@ -21,5 +21,5 @@ package org.apache.qpid.disttest.chartin
 
 public enum ChartType
 {
-    LINE, LINE3D, BAR, BAR3D, XYLINE
+    LINE, LINE3D, BAR, BAR3D, XYLINE, STATISTICAL_BAR
 }

Modified: 
qpid/trunk/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/chartbuilder/CategoryDataSetBasedChartBuilder.java
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/chartbuilder/CategoryDataSetBasedChartBuilder.java?rev=1356250&r1=1356249&r2=1356250&view=diff
==============================================================================
--- 
qpid/trunk/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/chartbuilder/CategoryDataSetBasedChartBuilder.java
 (original)
+++ 
qpid/trunk/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/chartbuilder/CategoryDataSetBasedChartBuilder.java
 Mon Jul  2 14:26:36 2012
@@ -19,6 +19,7 @@
  */
 package org.apache.qpid.disttest.charting.chartbuilder;
 
+
 import org.apache.qpid.disttest.charting.definition.ChartingDefinition;
 import org.apache.qpid.disttest.charting.definition.SeriesDefinition;
 import org.apache.qpid.disttest.charting.seriesbuilder.SeriesBuilderCallback;
@@ -47,11 +48,10 @@ public abstract class CategoryDataSetBas
         _seriesBuilder.setSeriesBuilderCallback(new SeriesBuilderCallback()
         {
             @Override
-            public void addDataPointToSeries(SeriesDefinition seriesDefinition,
-                    Object xValue, Object yValue)
+            public void addDataPointToSeries(SeriesDefinition 
seriesDefinition, Object[] row)
             {
-                String x = String.valueOf(xValue);
-                double y = Double.parseDouble(yValue.toString());
+                String x = String.valueOf(row[0]);
+                double y = Double.parseDouble(row[1].toString());
                 dataset.addValue( y, seriesDefinition.getSeriesLegend(), x);
             }
 
@@ -66,6 +66,7 @@ public abstract class CategoryDataSetBas
             {
                 // unused
             }
+
         });
 
         _seriesBuilder.build(chartingDefinition.getSeries());

Modified: 
qpid/trunk/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/chartbuilder/ChartBuilderFactory.java
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/chartbuilder/ChartBuilderFactory.java?rev=1356250&r1=1356249&r2=1356250&view=diff
==============================================================================
--- 
qpid/trunk/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/chartbuilder/ChartBuilderFactory.java
 (original)
+++ 
qpid/trunk/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/chartbuilder/ChartBuilderFactory.java
 Mon Jul  2 14:26:36 2012
@@ -39,6 +39,8 @@ public class ChartBuilderFactory
             return new BarChart3DBuilder(seriesBuilder);
         case XYLINE:
             return new XYLineChartBuilder(seriesBuilder);
+        case STATISTICAL_BAR:
+            return new StatisticalBarCharBuilder(seriesBuilder);
         default:
             throw new IllegalArgumentException("Unknown chart type " + 
chartType);
         }

Copied: 
qpid/trunk/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/chartbuilder/StatisticalBarCharBuilder.java
 (from r1356248, 
qpid/trunk/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/chartbuilder/CategoryDataSetBasedChartBuilder.java)
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/chartbuilder/StatisticalBarCharBuilder.java?p2=qpid/trunk/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/chartbuilder/StatisticalBarCharBuilder.java&p1=qpid/trunk/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/chartbuilder/CategoryDataSetBasedChartBuilder.java&r1=1356248&r2=1356250&rev=1356250&view=diff
==============================================================================
--- 
qpid/trunk/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/chartbuilder/CategoryDataSetBasedChartBuilder.java
 (original)
+++ 
qpid/trunk/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/chartbuilder/StatisticalBarCharBuilder.java
 Mon Jul  2 14:26:36 2012
@@ -1,4 +1,5 @@
 /*
+ *
  * 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
@@ -19,18 +20,29 @@
  */
 package org.apache.qpid.disttest.charting.chartbuilder;
 
+import java.awt.Font;
+
 import org.apache.qpid.disttest.charting.definition.ChartingDefinition;
 import org.apache.qpid.disttest.charting.definition.SeriesDefinition;
-import org.apache.qpid.disttest.charting.seriesbuilder.SeriesBuilderCallback;
 import org.apache.qpid.disttest.charting.seriesbuilder.SeriesBuilder;
+import org.apache.qpid.disttest.charting.seriesbuilder.SeriesBuilderCallback;
 import org.jfree.chart.JFreeChart;
-import org.jfree.data.category.DefaultCategoryDataset;
+import org.jfree.chart.axis.CategoryAxis;
+import org.jfree.chart.axis.NumberAxis;
+import org.jfree.chart.axis.ValueAxis;
+import org.jfree.chart.plot.CategoryPlot;
+import org.jfree.chart.plot.PlotOrientation;
+import org.jfree.chart.renderer.category.CategoryItemRenderer;
+import org.jfree.chart.renderer.category.StatisticalBarRenderer;
+import org.jfree.data.general.Dataset;
+import org.jfree.data.statistics.DefaultStatisticalCategoryDataset;
+import org.jfree.data.statistics.StatisticalCategoryDataset;
 
-public abstract class CategoryDataSetBasedChartBuilder extends BaseChartBuilder
+public class StatisticalBarCharBuilder extends BaseChartBuilder
 {
     private final SeriesBuilder _seriesBuilder;
 
-    public CategoryDataSetBasedChartBuilder(SeriesBuilder seriesBuilder)
+    public StatisticalBarCharBuilder(SeriesBuilder seriesBuilder)
     {
         _seriesBuilder = seriesBuilder;
     }
@@ -42,17 +54,17 @@ public abstract class CategoryDataSetBas
         String xAxisTitle = chartingDefinition.getXAxisTitle();
         String yAxisTitle = chartingDefinition.getYAxisTitle();
 
-        final DefaultCategoryDataset dataset = new DefaultCategoryDataset();
+        final DefaultStatisticalCategoryDataset dataset = new 
DefaultStatisticalCategoryDataset();
 
         _seriesBuilder.setSeriesBuilderCallback(new SeriesBuilderCallback()
         {
             @Override
-            public void addDataPointToSeries(SeriesDefinition seriesDefinition,
-                    Object xValue, Object yValue)
+            public void addDataPointToSeries(SeriesDefinition 
seriesDefinition, Object[] row)
             {
-                String x = String.valueOf(xValue);
-                double y = Double.parseDouble(yValue.toString());
-                dataset.addValue( y, seriesDefinition.getSeriesLegend(), x);
+                String x = String.valueOf(row[0]);
+                double mean = Double.parseDouble(row[1].toString());
+                double stdDev = Double.parseDouble(row[2].toString());
+                dataset.add(mean, stdDev, seriesDefinition.getSeriesLegend(), 
x);
             }
 
             @Override
@@ -66,15 +78,31 @@ public abstract class CategoryDataSetBas
             {
                 // unused
             }
+
         });
 
         _seriesBuilder.build(chartingDefinition.getSeries());
 
-        JFreeChart chart = createChartImpl(title, xAxisTitle, yAxisTitle,
-                dataset, PLOT_ORIENTATION, SHOW_LEGEND, SHOW_TOOL_TIPS, 
SHOW_URLS);
+        JFreeChart chart = createChartImpl(title, xAxisTitle, yAxisTitle, 
dataset, PLOT_ORIENTATION, SHOW_LEGEND,
+                SHOW_TOOL_TIPS, SHOW_URLS);
 
         addCommonChartAttributes(chart, chartingDefinition);
 
         return chart;
     }
+
+    @Override
+    public JFreeChart createChartImpl(String title, String xAxisTitle, String 
yAxisTitle, final Dataset dataset,
+            PlotOrientation plotOrientation, boolean showLegend, boolean 
showToolTips, boolean showUrls)
+    {
+        CategoryAxis xAxis = new CategoryAxis(xAxisTitle);
+        ValueAxis yAxis = new NumberAxis(yAxisTitle);
+        CategoryItemRenderer renderer = new StatisticalBarRenderer();
+
+        CategoryPlot plot = new CategoryPlot((StatisticalCategoryDataset) 
dataset, xAxis, yAxis, renderer);
+
+        JFreeChart chart = new JFreeChart(title, new Font("Arial", Font.PLAIN, 
10), plot, true);
+        return chart;
+    }
+
 }

Modified: 
qpid/trunk/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/chartbuilder/XYDataSetBasedChartBuilder.java
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/chartbuilder/XYDataSetBasedChartBuilder.java?rev=1356250&r1=1356249&r2=1356250&view=diff
==============================================================================
--- 
qpid/trunk/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/chartbuilder/XYDataSetBasedChartBuilder.java
 (original)
+++ 
qpid/trunk/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/chartbuilder/XYDataSetBasedChartBuilder.java
 Mon Jul  2 14:26:36 2012
@@ -60,10 +60,10 @@ public abstract class XYDataSetBasedChar
 
             @Override
             public void addDataPointToSeries(SeriesDefinition seriesDefinition,
-                    Object xValue, Object yValue)
+                    Object[] row)
             {
-                double x = Double.parseDouble(xValue.toString());
-                double y = Double.parseDouble(yValue.toString());
+                double x = Double.parseDouble(row[0].toString());
+                double y = Double.parseDouble(row[1].toString());
                 _xyPairs.add(new Double[] {x, y});
             }
 

Modified: 
qpid/trunk/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/seriesbuilder/JdbcCsvSeriesBuilder.java
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/seriesbuilder/JdbcCsvSeriesBuilder.java?rev=1356250&r1=1356249&r2=1356250&view=diff
==============================================================================
--- 
qpid/trunk/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/seriesbuilder/JdbcCsvSeriesBuilder.java
 (original)
+++ 
qpid/trunk/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/seriesbuilder/JdbcCsvSeriesBuilder.java
 Mon Jul  2 14:26:36 2012
@@ -71,14 +71,17 @@ public class JdbcCsvSeriesBuilder implem
 
             stmt = conn.createStatement();
             ResultSet results = stmt.executeQuery(seriesStatement);
-
+            int columnCount = results.getMetaData().getColumnCount();
             _callback.beginSeries(seriesDefinition);
             while (results.next())
             {
-                Object xValue = results.getObject(1);
-                Object yValue = results.getObject(2);
+                Object[] row = new Object[columnCount];
+                for (int i = 0; i < row.length; i++)
+                {
+                    row[i] = results.getObject(i+1);
+                }
 
-                _callback.addDataPointToSeries(seriesDefinition, xValue, 
yValue);
+                _callback.addDataPointToSeries(seriesDefinition, row);
             }
             _callback.endSeries(seriesDefinition);
         }

Modified: 
qpid/trunk/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/seriesbuilder/SeriesBuilderCallback.java
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/seriesbuilder/SeriesBuilderCallback.java?rev=1356250&r1=1356249&r2=1356250&view=diff
==============================================================================
--- 
qpid/trunk/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/seriesbuilder/SeriesBuilderCallback.java
 (original)
+++ 
qpid/trunk/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/seriesbuilder/SeriesBuilderCallback.java
 Mon Jul  2 14:26:36 2012
@@ -24,7 +24,7 @@ import org.apache.qpid.disttest.charting
 public interface SeriesBuilderCallback
 {
     public void beginSeries(SeriesDefinition seriesDefinition);
-    public void addDataPointToSeries(SeriesDefinition seriesDefinition, Object 
xValue, Object yValue);
+    public void addDataPointToSeries(SeriesDefinition seriesDefinition, 
Object[] row);
     public void endSeries(SeriesDefinition seriesDefinition);
 
 }

Modified: 
qpid/trunk/qpid/java/perftests/visualisation-jfc/src/test/java/org/apache/qpid/disttest/charting/chartbuilder/ChartProductionTest.java
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/perftests/visualisation-jfc/src/test/java/org/apache/qpid/disttest/charting/chartbuilder/ChartProductionTest.java?rev=1356250&r1=1356249&r2=1356250&view=diff
==============================================================================
--- 
qpid/trunk/qpid/java/perftests/visualisation-jfc/src/test/java/org/apache/qpid/disttest/charting/chartbuilder/ChartProductionTest.java
 (original)
+++ 
qpid/trunk/qpid/java/perftests/visualisation-jfc/src/test/java/org/apache/qpid/disttest/charting/chartbuilder/ChartProductionTest.java
 Mon Jul  2 14:26:36 2012
@@ -146,11 +146,11 @@ public class ChartProductionTest extends
             {
                 SeriesDefinition seriesDefinition = iterator.next();
                 _dataPointCallback.beginSeries(seriesDefinition);
-                _dataPointCallback.addDataPointToSeries(seriesDefinition, 
Double.valueOf(1), Double.valueOf(1));
-                _dataPointCallback.addDataPointToSeries(seriesDefinition, 
Double.valueOf(2), Double.valueOf(2));
-                _dataPointCallback.addDataPointToSeries(seriesDefinition, 
Double.valueOf(4), Double.valueOf(4));
-                _dataPointCallback.addDataPointToSeries(seriesDefinition, 
Double.valueOf(5), Double.valueOf(5));
-                _dataPointCallback.addDataPointToSeries(seriesDefinition, 
Double.valueOf(6), Double.valueOf(3));
+                _dataPointCallback.addDataPointToSeries(seriesDefinition, new 
Object[]{1d, 1d});
+                _dataPointCallback.addDataPointToSeries(seriesDefinition, new 
Object[]{2d, 2d});
+                _dataPointCallback.addDataPointToSeries(seriesDefinition, new 
Object[]{4d, 4d});
+                _dataPointCallback.addDataPointToSeries(seriesDefinition, new 
Object[]{5d, 5d});
+                _dataPointCallback.addDataPointToSeries(seriesDefinition, new 
Object[]{6d, 3d});
                 _dataPointCallback.endSeries(seriesDefinition);
             }
         }

Modified: 
qpid/trunk/qpid/java/perftests/visualisation-jfc/src/test/java/org/apache/qpid/disttest/charting/seriesbuilder/JdbcCsvSeriesBuilderTest.java
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/perftests/visualisation-jfc/src/test/java/org/apache/qpid/disttest/charting/seriesbuilder/JdbcCsvSeriesBuilderTest.java?rev=1356250&r1=1356249&r2=1356250&view=diff
==============================================================================
--- 
qpid/trunk/qpid/java/perftests/visualisation-jfc/src/test/java/org/apache/qpid/disttest/charting/seriesbuilder/JdbcCsvSeriesBuilderTest.java
 (original)
+++ 
qpid/trunk/qpid/java/perftests/visualisation-jfc/src/test/java/org/apache/qpid/disttest/charting/seriesbuilder/JdbcCsvSeriesBuilderTest.java
 Mon Jul  2 14:26:36 2012
@@ -59,9 +59,9 @@ public class JdbcCsvSeriesBuilderTest ex
         _seriesBuilder.build(Collections.singletonList(seriesDefinition));
 
         verify(_seriesWalkerCallback).beginSeries(seriesDefinition);
-        verify(_seriesWalkerCallback).addDataPointToSeries(seriesDefinition, 
(Object)"elephant", (Object)"2");
-        verify(_seriesWalkerCallback).addDataPointToSeries(seriesDefinition, 
(Object)"lion", (Object)"3");
-        verify(_seriesWalkerCallback).addDataPointToSeries(seriesDefinition, 
(Object)"tiger", (Object)"4");
+        verify(_seriesWalkerCallback).addDataPointToSeries(seriesDefinition, 
new Object[]{"elephant", "2"});
+        verify(_seriesWalkerCallback).addDataPointToSeries(seriesDefinition, 
new Object[]{"lion", "3"});
+        verify(_seriesWalkerCallback).addDataPointToSeries(seriesDefinition, 
new Object[]{"tiger", "4"});
         verify(_seriesWalkerCallback).endSeries(seriesDefinition);
     }
 



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to