You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@synapse.apache.org by in...@apache.org on 2007/04/18 12:07:07 UTC

svn commit: r529944 - in /webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse: ./ config/xml/endpoints/ core/axis2/ endpoints/ mediators/base/ statistics/ statistics/impl/

Author: indika
Date: Wed Apr 18 03:07:01 2007
New Revision: 529944

URL: http://svn.apache.org/viewvc?view=rev&rev=529944
Log:
Improve statistics collecting for anonymous Sequence,Endpoints
Improve statistics capability for multiple endpoints   

Modified:
    webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/Constants.java
    webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/endpoints/AddressEndpointFactory.java
    webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/endpoints/WSDLEndpointFactory.java
    webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/core/axis2/SynapseCallbackReceiver.java
    webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/core/axis2/SynapseMessageReceiver.java
    webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/core/axis2/SynapseModule.java
    webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/endpoints/AddressEndpoint.java
    webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/endpoints/WSDLEndpoint.java
    webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/mediators/base/SequenceMediator.java
    webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/mediators/base/SynapseMediator.java
    webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/statistics/StatisticsCollector.java
    webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/statistics/StatisticsHolder.java
    webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/statistics/StatisticsStack.java
    webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/statistics/StatisticsUtils.java
    webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/statistics/impl/EndPointStatisticsStack.java
    webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/statistics/impl/ProxyServiceStatisticsStack.java
    webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/statistics/impl/SequenceStatisticsStack.java

Modified: webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/Constants.java
URL: http://svn.apache.org/viewvc/webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/Constants.java?view=diff&rev=529944&r1=529943&r2=529944
==============================================================================
--- webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/Constants.java (original)
+++ webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/Constants.java Wed Apr 18 03:07:01 2007
@@ -203,4 +203,10 @@
 
     /** Property name to store the last endpoint through which the message has flowed */
     String PROCESSED_ENDPOINT = "processed_endpoint";
+    /**  Anonymous Endpoint key   */
+    String ANONYMOUS_ENDPOINTS = "AnonymousEndpoints";
+    /** Anonymous Sequence  key   */
+    String ANONYMOUS_SEQUENCES = "AnonymousSequences";
+    /** Anonymous ProxyServices key   */
+    String ANONYMOUS_PROXYSERVICES = "AnonymousProxyServices";
 }

Modified: webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/endpoints/AddressEndpointFactory.java
URL: http://svn.apache.org/viewvc/webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/endpoints/AddressEndpointFactory.java?view=diff&rev=529944&r1=529943&r2=529944
==============================================================================
--- webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/endpoints/AddressEndpointFactory.java (original)
+++ webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/endpoints/AddressEndpointFactory.java Wed Apr 18 03:07:01 2007
@@ -129,14 +129,27 @@
                 org.apache.synapse.config.xml.Constants.NULL_NAMESPACE, "optimize"));
 
         EndpointDefinition endpoint = new EndpointDefinition();
-
+        OMAttribute statistics = elem.getAttribute(
+                new QName(org.apache.synapse.config.xml.Constants.NULL_NAMESPACE,
+                        org.apache.synapse.config.xml.Constants.STATISTICS_ATTRIB_NAME));
+        if (statistics != null) {
+            String statisticsValue = statistics.getAttributeValue();
+            if (statisticsValue != null) {
+                if (org.apache.synapse.config.xml.Constants.STATISTICS_ENABLE.equals(
+                        statisticsValue)) {
+                    endpoint.setStatisticsEnable(org.apache.synapse.Constants.STATISTICS_ON);
+                } else if (org.apache.synapse.config.xml.Constants.STATISTICS_DISABLE.equals(
+                        statisticsValue)) {
+                    endpoint.setStatisticsEnable(org.apache.synapse.Constants.STATISTICS_OFF);
+                }
+            }
+        }
         if (address != null) {
             endpoint.setAddress(address.getAttributeValue());
         } else {
             handleException("One of the 'address' or 'ref' attributes are required in an "
                     + "anonymous endpoint");
         }
-
         if (format != null)
         {
             String forceValue = format.getAttributeValue().trim().toLowerCase();
@@ -171,7 +184,6 @@
                 }
             }
         }
-
         OMElement wsSec = elem.getFirstChildWithName(new QName(
                 org.apache.synapse.config.xml.Constants.SYNAPSE_NAMESPACE, "enableSec"));
         if (wsSec != null) {
@@ -192,7 +204,6 @@
                 endpoint.setWsRMPolicyKey(policy.getAttributeValue());
             }
         }
-
         // set the timeout configuration
         OMElement timeout = elem.getFirstChildWithName(new QName(
                 org.apache.synapse.config.xml.Constants.SYNAPSE_NAMESPACE, "timeout"));

Modified: webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/endpoints/WSDLEndpointFactory.java
URL: http://svn.apache.org/viewvc/webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/endpoints/WSDLEndpointFactory.java?view=diff&rev=529944&r1=529943&r2=529944
==============================================================================
--- webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/endpoints/WSDLEndpointFactory.java (original)
+++ webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/endpoints/WSDLEndpointFactory.java Wed Apr 18 03:07:01 2007
@@ -163,14 +163,26 @@
                     (new QName(org.apache.axis2.namespace.Constants.NS_URI_WSDL11, "description"));
             if (endpoint == null && descriptionElement != null) {
                 wsdlEndpoint.setWsdlDoc(descriptionElement);
-
                 handleException("WSDL 2.0 Endpoints are currently not supported.");
             }
-
             if (endpoint != null) {
                 // for now, QOS information has to be provided explicitly.
                 extractQOSInformation(endpoint, wsdlElement);
-
+                OMAttribute statistics = epConfig.getAttribute(
+                        new QName(org.apache.synapse.config.xml.Constants.NULL_NAMESPACE,
+                                org.apache.synapse.config.xml.Constants.STATISTICS_ATTRIB_NAME));
+                if (statistics != null) {
+                    String statisticsValue = statistics.getAttributeValue();
+                    if (statisticsValue != null) {
+                        if (org.apache.synapse.config.xml.Constants.STATISTICS_ENABLE.equals(
+                                statisticsValue)) {
+                            endpoint.setStatisticsEnable(org.apache.synapse.Constants.STATISTICS_ON);
+                        } else if (org.apache.synapse.config.xml.Constants.STATISTICS_DISABLE.equals(
+                                statisticsValue)) {
+                            endpoint.setStatisticsEnable(org.apache.synapse.Constants.STATISTICS_OFF);
+                        }
+                    }
+                }
                 wsdlEndpoint.setEndpointDefinition(endpoint);
             } else {
                 handleException("WSDL is not specified for WSDL endpoint.");

Modified: webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/core/axis2/SynapseCallbackReceiver.java
URL: http://svn.apache.org/viewvc/webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/core/axis2/SynapseCallbackReceiver.java?view=diff&rev=529944&r1=529943&r2=529944
==============================================================================
--- webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/core/axis2/SynapseCallbackReceiver.java (original)
+++ webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/core/axis2/SynapseCallbackReceiver.java Wed Apr 18 03:07:01 2007
@@ -91,8 +91,8 @@
      *
      * @param response         the Axis2 MessageContext that has been received and has to be handled
      * @param synapseOutMsgCtx the corresponding (outgoing) Synapse MessageContext for the above
-     *                         Axis2 MC, that holds Synapse specific information such as the error handler stack and
-     *                         local properties etc.
+     *                         Axis2 MC, that holds Synapse specific information such as the error
+     *                         handler stack and local properties etc.
      */
     private void handleMessage(MessageContext response,
                                org.apache.synapse.MessageContext synapseOutMsgCtx) {
@@ -104,13 +104,11 @@
 
             Stack faultStack = synapseOutMsgCtx.getFaultStack();
             if (faultStack != null && !faultStack.isEmpty()) {
-
                 SOAPFault fault = response.getEnvelope().getBody().getFault();
                 Exception e = fault.getException();
                 if (e == null) {
                     e = new Exception(fault.toString());
                 }
-
                 // set an error code to the message context, so that error sequences can filter
                 // using that property to determine the cause of error
                 synapseOutMsgCtx.setProperty("error-code", Constants.SENDING_FAULT);
@@ -126,7 +124,6 @@
             if (!faultStack.isEmpty() && faultStack.peek() instanceof Endpoint) {
                 faultStack.pop();
             }
-
             if (log.isDebugEnabled()) {
                 log.debug("Synapse received an asynchronous response message");
                 log.debug("Received To: " +
@@ -135,7 +132,6 @@
                         (response.getSoapAction() != null ? response.getSoapAction() : "null"));
                 log.debug("Body : \n" + response.getEnvelope());
             }
-
             MessageContext axisOutMsgCtx =
                     ((Axis2MessageContext) synapseOutMsgCtx).getAxis2MessageContext();
 
@@ -203,7 +199,6 @@
         for (int i = 0; i < relates.length; i++) {
             RelatesTo current = relates[i];
             boolean found = false;
-
             for (int j = 0; j < newRelates.length && j < insertPos; j++) {
                 if (newRelates[j].equals(current) ||
                         newRelates[j].getValue().equals(current.getValue())) {
@@ -211,7 +206,6 @@
                     break;
                 }
             }
-
             if (!found) {
                 newRelates[insertPos++] = current;
             }

Modified: webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/core/axis2/SynapseMessageReceiver.java
URL: http://svn.apache.org/viewvc/webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/core/axis2/SynapseMessageReceiver.java?view=diff&rev=529944&r1=529943&r2=529944
==============================================================================
--- webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/core/axis2/SynapseMessageReceiver.java (original)
+++ webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/core/axis2/SynapseMessageReceiver.java Wed Apr 18 03:07:01 2007
@@ -48,16 +48,19 @@
         }
 
         MessageContext synCtx = MessageContextCreatorForAxis2.getSynapseMessageContext(mc);
-
         try {
-            StatisticsStack synapseServiceStack = (StatisticsStack) synCtx.getProperty(org.apache.synapse.Constants.SYNAPSESERVICE_STATISTICS_STACK);
+            StatisticsStack synapseServiceStack =
+                    (StatisticsStack) synCtx.getProperty(
+                            org.apache.synapse.Constants.SYNAPSESERVICE_STATISTICS_STACK);
             if (synapseServiceStack == null) {
                 synapseServiceStack = new ProxyServiceStatisticsStack();
-                synCtx.setProperty(org.apache.synapse.Constants.SYNAPSESERVICE_STATISTICS_STACK, synapseServiceStack);
+                synCtx.setProperty(org.apache.synapse.Constants.SYNAPSESERVICE_STATISTICS_STACK,
+                        synapseServiceStack);
             }
             String name = "SynapseService";
             boolean isFault = synCtx.getEnvelope().getBody().hasFault();
-            synapseServiceStack.put(name, System.currentTimeMillis(), !synCtx.isResponse(), true, isFault);
+            synapseServiceStack.put(name, System.currentTimeMillis(), !synCtx.isResponse(),
+                    true, isFault);
 
             // invoke synapse message mediation
             synCtx.getEnvironment().injectMessage(synCtx);

Modified: webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/core/axis2/SynapseModule.java
URL: http://svn.apache.org/viewvc/webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/core/axis2/SynapseModule.java?view=diff&rev=529944&r1=529943&r2=529944
==============================================================================
--- webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/core/axis2/SynapseModule.java (original)
+++ webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/core/axis2/SynapseModule.java Wed Apr 18 03:07:01 2007
@@ -76,8 +76,7 @@
             }
         } catch (UnknownHostException e) {
             log.warn("Unable to report hostname or IP address for tracing", e);
-        }
-
+        }   
         // Initializing the SynapseEnvironment and SynapseConfiguration
         log.info("Initializing the Synapse configuration ...");
         SynapseConfiguration synCfg = initializeSynapse(configurationContext);

Modified: webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/endpoints/AddressEndpoint.java
URL: http://svn.apache.org/viewvc/webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/endpoints/AddressEndpoint.java?view=diff&rev=529944&r1=529943&r2=529944
==============================================================================
--- webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/endpoints/AddressEndpoint.java (original)
+++ webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/endpoints/AddressEndpoint.java Wed Apr 18 03:07:01 2007
@@ -144,14 +144,28 @@
     public void send(MessageContext synCtx) {
 
         String endPointName = this.getName();
-
+        if(endPointName ==null) {
+            endPointName = Constants.ANONYMOUS_ENDPOINTS;
+        }
         // Setting Required property to collect the End Point statistics
-        boolean statisticsEnable = (org.apache.synapse.Constants.STATISTICS_ON == endpoint.getStatisticsEnable());
-        if (endPointName != null && statisticsEnable) {
-            EndPointStatisticsStack endPointStatisticsStack = new EndPointStatisticsStack();
-            boolean isFault =synCtx.getEnvelope().getBody().hasFault();
-            endPointStatisticsStack.put(endPointName, System.currentTimeMillis(), !synCtx.isResponse(), statisticsEnable,isFault);
-            synCtx.setProperty(org.apache.synapse.Constants.ENDPOINT_STATISTICS_STACK, endPointStatisticsStack);
+        boolean statisticsEnable =
+                (org.apache.synapse.Constants.STATISTICS_ON == endpoint.getStatisticsEnable());
+        if (statisticsEnable) {
+            EndPointStatisticsStack endPointStatisticsStack = null;
+            Object statisticsStackObj =
+                    synCtx.getProperty(org.apache.synapse.Constants.ENDPOINT_STATISTICS_STACK);
+            if (statisticsStackObj == null) {
+                endPointStatisticsStack = new EndPointStatisticsStack();
+                synCtx.setProperty(org.apache.synapse.Constants.ENDPOINT_STATISTICS_STACK,
+                        endPointStatisticsStack);
+            } else if (statisticsStackObj instanceof EndPointStatisticsStack) {
+                endPointStatisticsStack = (EndPointStatisticsStack) statisticsStackObj;
+            }
+            if (endPointStatisticsStack != null) {
+                boolean isFault = synCtx.getEnvelope().getBody().hasFault();
+                endPointStatisticsStack.put(endPointName, System.currentTimeMillis(),
+                        !synCtx.isResponse(), statisticsEnable, isFault);
+            }
         }
 
         if (endpoint.getAddress() != null) {

Modified: webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/endpoints/WSDLEndpoint.java
URL: http://svn.apache.org/viewvc/webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/endpoints/WSDLEndpoint.java?view=diff&rev=529944&r1=529943&r2=529944
==============================================================================
--- webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/endpoints/WSDLEndpoint.java (original)
+++ webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/endpoints/WSDLEndpoint.java Wed Apr 18 03:07:01 2007
@@ -81,18 +81,31 @@
         String eprAddress = null;
         if (endpointDefinition.getAddress() != null) {
             eprAddress = endpointDefinition.getAddress().toString();
-
             String endPointName = this.getName();
-
+            if (endPointName == null) {
+                endPointName = Constants.ANONYMOUS_ENDPOINTS;
+            }
             // Setting Required property to collect the End Point statistics
-            boolean statisticsEnable = (org.apache.synapse.Constants.STATISTICS_ON == endpointDefinition.getStatisticsEnable());
-            if (endPointName != null && statisticsEnable) {
-                EndPointStatisticsStack endPointStatisticsStack = new EndPointStatisticsStack();
-                boolean isFault =synCtx.getEnvelope().getBody().hasFault();
-                endPointStatisticsStack.put(endPointName, System.currentTimeMillis(), !synCtx.isResponse(), statisticsEnable,isFault);
-                synCtx.setProperty(org.apache.synapse.Constants.ENDPOINT_STATISTICS_STACK, endPointStatisticsStack);
+            boolean statisticsEnable =
+                    (org.apache.synapse.Constants.STATISTICS_ON
+                            == endpointDefinition.getStatisticsEnable());
+            if (statisticsEnable) {
+                EndPointStatisticsStack endPointStatisticsStack = null;
+                Object statisticsStackObj =
+                        synCtx.getProperty(org.apache.synapse.Constants.ENDPOINT_STATISTICS_STACK);
+                if (statisticsStackObj == null) {
+                    endPointStatisticsStack = new EndPointStatisticsStack();
+                    synCtx.setProperty(org.apache.synapse.Constants.ENDPOINT_STATISTICS_STACK,
+                            endPointStatisticsStack);
+                } else if (statisticsStackObj instanceof EndPointStatisticsStack) {
+                    endPointStatisticsStack = (EndPointStatisticsStack) statisticsStackObj;
+                }
+                if (endPointStatisticsStack != null) {
+                    boolean isFault = synCtx.getEnvelope().getBody().hasFault();
+                    endPointStatisticsStack.put(endPointName, System.currentTimeMillis(),
+                            !synCtx.isResponse(), statisticsEnable, isFault);
+                }
             }
-
             if (log.isDebugEnabled()) {
                 log.debug("Sending message to endpoint :: name = " +
                         endPointName + " resolved address = " + eprAddress);

Modified: webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/mediators/base/SequenceMediator.java
URL: http://svn.apache.org/viewvc/webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/mediators/base/SequenceMediator.java?view=diff&rev=529944&r1=529943&r2=529944
==============================================================================
--- webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/mediators/base/SequenceMediator.java (original)
+++ webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/mediators/base/SequenceMediator.java Wed Apr 18 03:07:01 2007
@@ -84,7 +84,7 @@
                     sequenceStack = new SequenceStatisticsStack();
                     synCtx.setProperty(Constants.SEQUENCE_STATISTICS_STACK, sequenceStack);
                 }
-                String seqName = (name == null ? "anonymous" : name);
+                String seqName = (name == null ? Constants.ANONYMOUS_SEQUENCES : name);
                 boolean isFault =synCtx.getEnvelope().getBody().hasFault();
                 sequenceStack.put(seqName,System.currentTimeMillis(),
                         !synCtx.isResponse(), isStatisticsEnable,isFault);

Modified: webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/mediators/base/SynapseMediator.java
URL: http://svn.apache.org/viewvc/webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/mediators/base/SynapseMediator.java?view=diff&rev=529944&r1=529943&r2=529944
==============================================================================
--- webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/mediators/base/SynapseMediator.java (original)
+++ webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/mediators/base/SynapseMediator.java Wed Apr 18 03:07:01 2007
@@ -53,7 +53,8 @@
         if(synCtx.isResponse()) {
             StatisticsUtils.processAllSequenceStatistics(synCtx);
         }
-        StatisticsStack sequenceStack = (StatisticsStack) synCtx.getProperty(Constants.SEQUENCE_STATISTICS_STACK);
+        StatisticsStack sequenceStack = (StatisticsStack) synCtx.getProperty(
+                Constants.SEQUENCE_STATISTICS_STACK);
         if (sequenceStack == null) {
             sequenceStack = new SequenceStatisticsStack();
             synCtx.setProperty(Constants.SEQUENCE_STATISTICS_STACK, sequenceStack);

Modified: webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/statistics/StatisticsCollector.java
URL: http://svn.apache.org/viewvc/webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/statistics/StatisticsCollector.java?view=diff&rev=529944&r1=529943&r2=529944
==============================================================================
--- webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/statistics/StatisticsCollector.java (original)
+++ webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/statistics/StatisticsCollector.java Wed Apr 18 03:07:01 2007
@@ -46,8 +46,10 @@
      * @param outTime        - The processing end time
      * @param isFault        - A boolean value that indicate whether falut has occured or not
      */
-    public void reportForEndPoint(String keyOfStatistic, boolean isResponse, long inTime, long outTime, boolean isFault) {
-        StatisticsHolder statisticsHolder = (StatisticsHolder) endpointStatistics.get(keyOfStatistic);
+    public void reportForEndPoint(String keyOfStatistic, boolean isResponse, long inTime,
+                                  long outTime, boolean isFault) {
+        StatisticsHolder statisticsHolder =
+                (StatisticsHolder) endpointStatistics.get(keyOfStatistic);
         if (statisticsHolder == null) {
             statisticsHolder = new StatisticsHolder();
             statisticsHolder.setKey(keyOfStatistic);
@@ -67,8 +69,10 @@
      * @param outTime        - The processing end time
      * @param isFault        - A boolean value that indicate whether falut has occured or not
      */
-    public void reportForProxyService(String keyOfStatistic, boolean isResponse, long inTime, long outTime, boolean isFault) {
-        StatisticsHolder statisticsHolder = (StatisticsHolder) proxyServicesStatistics.get(keyOfStatistic);
+    public void reportForProxyService(String keyOfStatistic, boolean isResponse, long inTime,
+                                      long outTime, boolean isFault) {
+        StatisticsHolder statisticsHolder =
+                (StatisticsHolder) proxyServicesStatistics.get(keyOfStatistic);
         if (statisticsHolder == null) {
             statisticsHolder = new StatisticsHolder();
             statisticsHolder.setKey(keyOfStatistic);
@@ -87,8 +91,10 @@
      * @param outTime        - The processing end time
      * @param isFault        - A boolean value that indicate whether falut has occured or not
      */
-    public void reportForSequence(String keyOfStatistic, boolean isResponse, long inTime, long outTime, boolean isFault) {
-        StatisticsHolder statisticsHolder = (StatisticsHolder) sequenceStatistics.get(keyOfStatistic);
+    public void reportForSequence(String keyOfStatistic, boolean isResponse, long inTime,
+                                  long outTime, boolean isFault) {
+        StatisticsHolder statisticsHolder =
+                (StatisticsHolder) sequenceStatistics.get(keyOfStatistic);
         if (statisticsHolder == null) {
             statisticsHolder = new StatisticsHolder();
             statisticsHolder.setKey(keyOfStatistic);

Modified: webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/statistics/StatisticsHolder.java
URL: http://svn.apache.org/viewvc/webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/statistics/StatisticsHolder.java?view=diff&rev=529944&r1=529943&r2=529944
==============================================================================
--- webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/statistics/StatisticsHolder.java (original)
+++ webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/statistics/StatisticsHolder.java Wed Apr 18 03:07:01 2007
@@ -44,7 +44,8 @@
      * @param outTime    - The processing end time
      * @param isFault    - A boolean value that indicate whether falut has occured or not
      */
-    public synchronized void update(boolean isResponse, long inTime, long outTime, boolean isFault) {
+    public synchronized void update(boolean isResponse, long inTime, long outTime,
+                                    boolean isFault) {
         if (isResponse) {
             if (outFlowStatistics == null) {
                 outFlowStatistics = new Statistics();

Modified: webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/statistics/StatisticsStack.java
URL: http://svn.apache.org/viewvc/webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/statistics/StatisticsStack.java?view=diff&rev=529944&r1=529943&r2=529944
==============================================================================
--- webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/statistics/StatisticsStack.java (original)
+++ webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/statistics/StatisticsStack.java Wed Apr 18 03:07:01 2007
@@ -34,20 +34,33 @@
      * @param isStatisticsEnable
      * @param isFault
      */
-    public void put(String key,long initTime, boolean isInFlow, boolean isStatisticsEnable,boolean isFault);
+    public void put(String key,long initTime, boolean isInFlow, boolean isStatisticsEnable,
+                    boolean isFault);
 
     /**
      * This method used to report the latest  statistics to the StatisticsCollector
      * @param statisticsCollector
      * @param isFault
      */
-    public void reportToStatisticsCollector(StatisticsCollector statisticsCollector,boolean isFault);
+    public void reportToStatisticsCollector(StatisticsCollector statisticsCollector,
+                                            boolean isFault);
+
+    /**
+     * Report the particular statistics to the StatisticsCollector
+     *
+     * @param statisticsCollector
+     * @param isFault
+     * @param name
+     */
+    public void reportToStatisticsCollector(StatisticsCollector statisticsCollector,
+                                            boolean isFault, String name);
 
     /**
      * This method  used to unreported all statistics to the StatisticsCollector
      * @param statisticsCollector
      * @param isFault
      */
-    public void reportAllToStatisticsCollector(StatisticsCollector statisticsCollector,boolean isFault);
+    public void reportAllToStatisticsCollector(StatisticsCollector statisticsCollector,
+                                               boolean isFault);
 
 }

Modified: webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/statistics/StatisticsUtils.java
URL: http://svn.apache.org/viewvc/webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/statistics/StatisticsUtils.java?view=diff&rev=529944&r1=529943&r2=529944
==============================================================================
--- webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/statistics/StatisticsUtils.java (original)
+++ webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/statistics/StatisticsUtils.java Wed Apr 18 03:07:01 2007
@@ -20,6 +20,7 @@
 
 import org.apache.synapse.Constants;
 import org.apache.synapse.MessageContext;
+import org.apache.synapse.endpoints.Endpoint;
 import org.apache.synapse.core.SynapseEnvironment;
 import org.apache.synapse.statistics.impl.SequenceStatisticsStack;
 import org.apache.synapse.statistics.impl.EndPointStatisticsStack;
@@ -41,11 +42,13 @@
 
         StatisticsCollector statisticsCollector = getStatisticsCollector(synCtx);
         boolean isFault = synCtx.getEnvelope().getBody().hasFault();
-        ProxyServiceStatisticsStack proxyServiceStatisticsStack = (ProxyServiceStatisticsStack) synCtx.getProperty(Constants.PROXYSERVICE_STATISTICS_STACK);
+        ProxyServiceStatisticsStack proxyServiceStatisticsStack = (ProxyServiceStatisticsStack)
+                synCtx.getProperty(Constants.PROXYSERVICE_STATISTICS_STACK);
         if (proxyServiceStatisticsStack != null) {
             proxyServiceStatisticsStack.reportToStatisticsCollector(statisticsCollector,isFault);
         }
-        ProxyServiceStatisticsStack synapseServiceStatisticsStack = (ProxyServiceStatisticsStack) synCtx.getProperty(Constants.SYNAPSESERVICE_STATISTICS_STACK);
+        ProxyServiceStatisticsStack synapseServiceStatisticsStack = (ProxyServiceStatisticsStack)
+                synCtx.getProperty(Constants.SYNAPSESERVICE_STATISTICS_STACK);
         if (synapseServiceStatisticsStack != null) {
             synapseServiceStatisticsStack.reportToStatisticsCollector(statisticsCollector,isFault);
         }
@@ -59,9 +62,22 @@
     public static void processEndPointStatistics(MessageContext synCtx) {
         StatisticsCollector statisticsCollector = getStatisticsCollector(synCtx);
         boolean isFault = synCtx.getEnvelope().getBody().hasFault();
-        EndPointStatisticsStack endPointStatisticsStack = (EndPointStatisticsStack) synCtx.getProperty(Constants.ENDPOINT_STATISTICS_STACK);
+        EndPointStatisticsStack endPointStatisticsStack = (EndPointStatisticsStack)
+                synCtx.getProperty(Constants.ENDPOINT_STATISTICS_STACK);
         if (endPointStatisticsStack != null) {
-            endPointStatisticsStack.reportToStatisticsCollector(statisticsCollector,isFault);
+            Object endpointObj = synCtx.getProperty(Constants.PROCESSED_ENDPOINT);
+            if (endpointObj instanceof Endpoint) {
+                Endpoint endpoint = (Endpoint) endpointObj;
+                String name = endpoint.getName();
+                if (name == null) {
+                    endPointStatisticsStack.reportToStatisticsCollector(
+                            statisticsCollector, isFault);
+                } else {
+                    endPointStatisticsStack.reportToStatisticsCollector(
+                            statisticsCollector, isFault, name);
+                }
+                endPointStatisticsStack.reportAllToStatisticsCollector(statisticsCollector, true);
+            }
         }
     }
 
@@ -73,7 +89,8 @@
     public static void processSequenceStatistics(MessageContext synCtx) {
         StatisticsCollector statisticsCollector = getStatisticsCollector(synCtx);
         boolean isFault = synCtx.getEnvelope().getBody().hasFault();
-        SequenceStatisticsStack sequenceStatisticsStack = (SequenceStatisticsStack) synCtx.getProperty(Constants.SEQUENCE_STATISTICS_STACK);
+        SequenceStatisticsStack sequenceStatisticsStack = (SequenceStatisticsStack)
+                synCtx.getProperty(Constants.SEQUENCE_STATISTICS_STACK);
         if (sequenceStatisticsStack != null) {
             sequenceStatisticsStack.reportToStatisticsCollector(statisticsCollector,isFault);
         }
@@ -87,7 +104,8 @@
     public static void processAllSequenceStatistics(MessageContext synCtx) {
         StatisticsCollector statisticsCollector = getStatisticsCollector(synCtx);
         boolean isFault = synCtx.getEnvelope().getBody().hasFault();
-        SequenceStatisticsStack sequenceStatisticsStack = (SequenceStatisticsStack) synCtx.getProperty(Constants.SEQUENCE_STATISTICS_STACK);
+        SequenceStatisticsStack sequenceStatisticsStack = (SequenceStatisticsStack)
+                synCtx.getProperty(Constants.SEQUENCE_STATISTICS_STACK);
         if (sequenceStatisticsStack != null) {
             sequenceStatisticsStack.reportAllToStatisticsCollector(statisticsCollector,isFault);
         }

Modified: webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/statistics/impl/EndPointStatisticsStack.java
URL: http://svn.apache.org/viewvc/webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/statistics/impl/EndPointStatisticsStack.java?view=diff&rev=529944&r1=529943&r2=529944
==============================================================================
--- webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/statistics/impl/EndPointStatisticsStack.java (original)
+++ webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/statistics/impl/EndPointStatisticsStack.java Wed Apr 18 03:07:01 2007
@@ -20,24 +20,21 @@
 
 import org.apache.synapse.statistics.StatisticsStack;
 import org.apache.synapse.statistics.StatisticsCollector;
+import java.util.Iterator;
+import java.util.ArrayList;
 
 /**
- * The data structure to hold statistics related to the end points
+ * The data structure to hold statistics related to the endpoints
  *
  */
 
 public class EndPointStatisticsStack implements StatisticsStack {
 
-    /** The name of the endpoint */
-    private String endPointName;
-    /** The time which starts to collect statistics */
-    private long initTime;
-    /** To check whether IN message flow or not */
-    private boolean isInFlow;
-    /** To check whether statistics is enabled or not */
-    private boolean isStatisticsEnable;
-    /** To indicate whether this is fault or not*/
-    private boolean isFault;
+    /** list of endpoint statistics */
+    private ArrayList endpointStatistics;
+    /** To decide whether the reporting of the in flow statistics have been completed*/
+    private boolean isCompleteInFlowStatisicsReport = false;
+
     /**
      * To put statistics
      * @param key                   - The name of the End Point
@@ -46,12 +43,13 @@
      * @param isStatisticsEnable
      * @param isFault
      */
-    public void put(String key, long initTime, boolean isInFlow, boolean isStatisticsEnable,boolean isFault) {
-        this.endPointName = key;
-        this.initTime = initTime;
-        this.isInFlow = isInFlow;
-        this.isStatisticsEnable = isStatisticsEnable;
-        this.isFault = isFault;
+    public void put(String key, long initTime, boolean isInFlow, boolean isStatisticsEnable,
+                    boolean isFault) {
+        if (endpointStatistics == null) {
+            endpointStatistics = new ArrayList();
+        }
+        endpointStatistics.add(
+                new EndPointStatistics(key, initTime, isInFlow, isStatisticsEnable, isFault));
     }
 
     /**
@@ -59,10 +57,66 @@
      * @param statisticsCollector
      * @param isFault
      */
-    public void reportToStatisticsCollector(StatisticsCollector statisticsCollector,boolean isFault) {
-        if (isStatisticsEnable && endPointName!=null) {
-            statisticsCollector.reportForEndPoint(endPointName, !isInFlow, initTime, System.currentTimeMillis(), isFault);
-            endPointName =null;
+
+    public void reportToStatisticsCollector(StatisticsCollector statisticsCollector,
+                                            boolean isFault) {
+        if (endpointStatistics != null && !endpointStatistics.isEmpty()) {
+            EndPointStatistics statistics =
+                    (EndPointStatistics) endpointStatistics.get(
+                            endpointStatistics.size() - 1);
+            if (statistics != null && statistics.isStatisticsEnable &&
+                    statistics.endPointName != null) {
+                if (statistics.inTimeForInFlow != -1) {
+                    long initTimeForOutFlow = System.currentTimeMillis();
+                    statisticsCollector.reportForEndPoint(statistics.endPointName,
+                            false, statistics.inTimeForInFlow,
+                            initTimeForOutFlow, isFault);
+                    statistics.inTimeForInFlow = -1;
+                    statistics.inTimeForOutFlow = initTimeForOutFlow;
+                } else if (statistics.inTimeForOutFlow != -1 &&
+                        isCompleteInFlowStatisicsReport) {
+                    statisticsCollector.reportForEndPoint(statistics.endPointName,
+                            true, statistics.inTimeForOutFlow,
+                            System.currentTimeMillis(), isFault);
+                    endpointStatistics.remove(statistics);
+                }
+            }
+        }
+    }
+
+    /**
+     * Report a particular statistics to the StatisticsCollector
+     * @param statisticsCollector
+     * @param isFault
+     * @param name
+     */
+    public void reportToStatisticsCollector(StatisticsCollector statisticsCollector,
+                                            boolean isFault, String name) {
+        if (endpointStatistics != null && !endpointStatistics.isEmpty()) {
+            for (Iterator epIterator = endpointStatistics.iterator();
+                 epIterator.hasNext();) {
+                Object statisticsObj = epIterator.next();
+                if (statisticsObj instanceof EndPointStatistics) {
+                    EndPointStatistics statistics = (EndPointStatistics) statisticsObj;
+                    if (statistics.isStatisticsEnable && statistics.endPointName != null &&
+                            statistics.endPointName.equals(name)) {
+                        if (statistics.inTimeForInFlow != -1) {
+                            long initTimeForOutFlow = System.currentTimeMillis();
+                            statisticsCollector.reportForEndPoint(statistics.endPointName,
+                                    false, statistics.inTimeForInFlow,
+                                    initTimeForOutFlow, isFault);
+                            statistics.inTimeForInFlow = -1;
+                            statistics.inTimeForOutFlow = initTimeForOutFlow;
+                        } else if (statistics.inTimeForOutFlow != -1 &&
+                                isCompleteInFlowStatisicsReport) {
+                            statisticsCollector.reportForEndPoint(statistics.endPointName,
+                                    true, statistics.inTimeForOutFlow,
+                                    System.currentTimeMillis(), isFault);
+                            endpointStatistics.remove(statistics);
+                        }
+                    }
+                }
+            }
         }
     }
 
@@ -70,7 +124,57 @@
      * This method  used to unreported all statistics to the StatisticsCollector
      * @param statisticsCollector
      */
-    public void reportAllToStatisticsCollector(StatisticsCollector statisticsCollector,boolean isFault) {
-        reportToStatisticsCollector(statisticsCollector,isFault);
+    public void reportAllToStatisticsCollector(StatisticsCollector statisticsCollector,
+                                               boolean isFault) {
+        if (endpointStatistics != null && !endpointStatistics.isEmpty()) {
+            for (Iterator epIterator = endpointStatistics.iterator();
+                 epIterator.hasNext();) {
+                Object statisticsObj = epIterator.next();
+                if (statisticsObj instanceof EndPointStatistics) {
+                    EndPointStatistics statistics = (EndPointStatistics) statisticsObj;
+                    if (statistics.isStatisticsEnable && statistics.endPointName != null) {
+                        if (statistics.inTimeForInFlow != -1) {
+                            long initTimeForOutFlow = System.currentTimeMillis();
+                            statisticsCollector.reportForEndPoint(statistics.endPointName,
+                                    false, statistics.inTimeForInFlow,
+                                    initTimeForOutFlow, isFault);
+                            statistics.inTimeForInFlow = -1;
+                            statistics.inTimeForOutFlow = initTimeForOutFlow;
+                        } else if (statistics.inTimeForOutFlow != -1 &&
+                                isCompleteInFlowStatisicsReport) {
+                            statisticsCollector.reportForEndPoint(statistics.endPointName,
+                                    true, statistics.inTimeForOutFlow,
+                                    System.currentTimeMillis(), isFault);
+                            endpointStatistics.remove(statistics);
+                        }
+                    }
+                }
+            }
+        }
+        isCompleteInFlowStatisicsReport = true;
+    }
+
+    class EndPointStatistics {
+
+        /** The name of the endpoint    */
+        private String endPointName;
+         /** To check whether IN message flow or not   */
+        private boolean isStatisticsEnable;
+        /** To indicate whether this is fault or not  */
+        private boolean isFault;
+        /** The time which starts to collect statistics for IN flow */
+        private long inTimeForInFlow = -1;
+        /** The time which starts to collect statistics for OUT flow */
+        private long inTimeForOutFlow = -1;
+
+        public EndPointStatistics(String endPointName, long initTime, boolean inFlow,
+                                  boolean statisticsEnable, boolean fault) {
+            if (inFlow) {
+                this.endPointName = endPointName;
+                this.inTimeForInFlow = initTime;
+                isStatisticsEnable = statisticsEnable;
+                isFault = fault;
+            }
+        }
     }
 }

Modified: webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/statistics/impl/ProxyServiceStatisticsStack.java
URL: http://svn.apache.org/viewvc/webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/statistics/impl/ProxyServiceStatisticsStack.java?view=diff&rev=529944&r1=529943&r2=529944
==============================================================================
--- webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/statistics/impl/ProxyServiceStatisticsStack.java (original)
+++ webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/statistics/impl/ProxyServiceStatisticsStack.java Wed Apr 18 03:07:01 2007
@@ -20,6 +20,9 @@
 
 import org.apache.synapse.statistics.StatisticsStack;
 import org.apache.synapse.statistics.StatisticsCollector;
+import org.apache.synapse.SynapseException;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 
 /**
  * The data structure to hold statistics related to the Proxy Services
@@ -28,6 +31,7 @@
 
 public class ProxyServiceStatisticsStack implements StatisticsStack {
 
+    private static final Log log = LogFactory.getLog(ProxyServiceStatisticsStack.class);
     /** The name of the proxy service*/
     private String proxyServiceName;
     /** To check whether statistics is enabled or not */
@@ -40,6 +44,7 @@
     private boolean isINFault;
     /** To indicate whether OUT Flow is fault or not*/
     private boolean isOUTFault;
+
     /**
      * To put a statistics
      * @param key                   - The Name of the proxy service
@@ -47,8 +52,8 @@
      * @param isInFlow
      * @param isStatisticsEnable
      */
-    public void put(String key, long initTime, boolean isInFlow, boolean isStatisticsEnable,boolean isFault) {
-
+    public void put(String key, long initTime, boolean isInFlow, boolean isStatisticsEnable,
+                    boolean isFault) {
         if (isInFlow) {
             this.proxyServiceName = key;
             this.isStatisticsEnable = isStatisticsEnable;
@@ -61,25 +66,49 @@
      * This method used to report the latest  statistics to the StatisticsCollector
      * @param statisticsCollector
      */
-    public void reportToStatisticsCollector(StatisticsCollector statisticsCollector,boolean isFault) {
-
+    public void reportToStatisticsCollector(StatisticsCollector statisticsCollector,
+                                            boolean isFault) {
         if (proxyServiceName != null && isStatisticsEnable && inTimeForInFlow != -1) {
             inTimeForOutFlow = System.currentTimeMillis();
             isOUTFault = isFault;
-            statisticsCollector.reportForProxyService(proxyServiceName, false, inTimeForInFlow, inTimeForOutFlow, isINFault);
+            statisticsCollector.reportForProxyService(proxyServiceName, false,
+                    inTimeForInFlow, inTimeForOutFlow, isINFault);
             inTimeForInFlow = -1;
-        } else if (inTimeForOutFlow != -1) {            
-            statisticsCollector.reportForProxyService(proxyServiceName, true, inTimeForOutFlow, System.currentTimeMillis(), isFault);
+        } else if (inTimeForOutFlow != -1) {
+            statisticsCollector.reportForProxyService(proxyServiceName, true,
+                    inTimeForOutFlow, System.currentTimeMillis(), isFault);
             inTimeForOutFlow = -1;
         }
     }
 
     /**
+     * Report a particular statistics to the StatisticsReporter
+     *
+     * @param statisticsCollector
+     * @param isFault
+     * @param name
+     */
+    public void reportToStatisticsCollector(StatisticsCollector statisticsCollector,
+                                            boolean isFault, String name) {
+        if (name != null && proxyServiceName != null && proxyServiceName.equals(name)) {
+            reportToStatisticsCollector(statisticsCollector, isFault);
+        } else {
+            handleException("Invalid ProxyService Name " + name + " expected " + proxyServiceName);
+        }
+    }
+
+    /**
      * This method  used to unreported all statistics to the StatisticsCollector
      * @param statisticsCollector
      * @param isFault
      */
-    public void reportAllToStatisticsCollector(StatisticsCollector statisticsCollector,boolean isFault) {
-        reportToStatisticsCollector(statisticsCollector,isFault);
+    public void reportAllToStatisticsCollector(StatisticsCollector statisticsCollector,
+                                               boolean isFault) {
+        reportToStatisticsCollector(statisticsCollector, isFault);
+    }
+
+    private void handleException(String msg) {
+        log.error(msg);
+        throw new SynapseException(msg);
     }
 }

Modified: webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/statistics/impl/SequenceStatisticsStack.java
URL: http://svn.apache.org/viewvc/webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/statistics/impl/SequenceStatisticsStack.java?view=diff&rev=529944&r1=529943&r2=529944
==============================================================================
--- webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/statistics/impl/SequenceStatisticsStack.java (original)
+++ webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/statistics/impl/SequenceStatisticsStack.java Wed Apr 18 03:07:01 2007
@@ -22,6 +22,7 @@
 import org.apache.synapse.statistics.StatisticsCollector;
 
 import java.util.ArrayList;
+import java.util.Iterator;
 
 /**
  * The data structure to hold statistics related to Sequences
@@ -35,34 +36,65 @@
 
     /**
      * To put a statistics
-     * @param sequenceName          - The name of the sequence
+     *
+     * @param sequenceName       - The name of the sequence
      * @param initTime
      * @param isInFlow
      * @param isStatisticsEnable
      * @param isFault
      */
-    public void put(String sequenceName, long initTime, boolean isInFlow, boolean isStatisticsEnable,boolean isFault) {
-        sequenceStatisticsList.add(new SequenceStatistics(sequenceName, initTime, isInFlow, isStatisticsEnable,isFault));
+    public void put(String sequenceName, long initTime, boolean isInFlow,
+                    boolean isStatisticsEnable, boolean isFault) {
+        sequenceStatisticsList.add(new SequenceStatistics(sequenceName, initTime,
+                isInFlow, isStatisticsEnable, isFault));
     }
-   /**
+
+    /**
      * This method used to report the latest  statistics to the StatisticsCollector
+     *
      * @param statisticsCollector
      * @param isFault
      */
-    public void reportToStatisticsCollector(StatisticsCollector statisticsCollector,boolean isFault) {
-       int top = sequenceStatisticsList.size();
-       if (top > 0) {
-           popSequenceStatistics(sequenceStatisticsList.size() - 1, statisticsCollector);
-       }
+    public void reportToStatisticsCollector(StatisticsCollector statisticsCollector,
+                                            boolean isFault) {
+        int top = sequenceStatisticsList.size();
+        if (top > 0) {
+            popSequenceStatistics(sequenceStatisticsList.size() - 1, statisticsCollector);
+        }
     }
+
+    public void reportToStatisticsCollector(StatisticsCollector statisticsCollector,
+                                            boolean isFault, String name) {
+        if (!sequenceStatisticsList.isEmpty()) {
+            for (Iterator seqIterator = sequenceStatisticsList.iterator();
+                 seqIterator.hasNext();) {
+                SequenceStatistics sequenceStatistics =
+                        (SequenceStatistics) seqIterator.next();
+                if (sequenceStatistics != null) {
+                    if (sequenceStatistics.isStatisticsEnable &&
+                            sequenceStatistics.sequenceName != null &&
+                            sequenceStatistics.sequenceName.equals(name)
+                            ) {
+                        statisticsCollector.reportForSequence(sequenceStatistics.sequenceName,
+                                !sequenceStatistics.isInFlow, sequenceStatistics.initTime,
+                                System.currentTimeMillis(), sequenceStatistics.isFault);
+                    }
+                    sequenceStatisticsList.remove(sequenceStatistics);
+                }
+            }
+        }
+    }
+
     /**
      * This method  used to unreported all statistics to the StatisticsCollector
+     *
      * @param statisticsCollector
      * @param isFault
      */
-    public void reportAllToStatisticsCollector(StatisticsCollector statisticsCollector,boolean isFault) {
-        int i = sequenceStatisticsList.size()-1;
-        for (; i >=0; i--) {
+    public void reportAllToStatisticsCollector(StatisticsCollector statisticsCollector,
+                                               boolean isFault) {
+        int i = sequenceStatisticsList.size() - 1;
+        for (; i >= 0; i--) {
             popSequenceStatistics(i, statisticsCollector);
         }
     }
@@ -74,11 +106,14 @@
      */
     private void popSequenceStatistics(int index, StatisticsCollector statisticsCollector) {
         if (index >= 0) {
-            SequenceStatistics sequenceStatistics = (SequenceStatistics) sequenceStatisticsList.get(index);
+            SequenceStatistics sequenceStatistics =
+                    (SequenceStatistics) sequenceStatisticsList.get(index);
             if (sequenceStatistics != null) {
-                if (sequenceStatistics.isStatisticsEnable && sequenceStatistics.sequenceName != null)
-                {
-                    statisticsCollector.reportForSequence(sequenceStatistics.sequenceName, !sequenceStatistics.isInFlow, sequenceStatistics.initTime, System.currentTimeMillis(), sequenceStatistics.isFault);
+                if (sequenceStatistics.isStatisticsEnable &&
+                        sequenceStatistics.sequenceName != null) {
+                    statisticsCollector.reportForSequence(sequenceStatistics.sequenceName,
+                            !sequenceStatistics.isInFlow, sequenceStatistics.initTime,
+                            System.currentTimeMillis(), sequenceStatistics.isFault);
                 }
                 sequenceStatisticsList.remove(index);
             }
@@ -101,7 +136,8 @@
         /** To indicate whether this is fault or not*/
         private boolean isFault;
 
-        public SequenceStatistics(String sequenceName, long initTime, boolean inFlow, boolean statisticsEnable,boolean isFault) {
+        public SequenceStatistics(String sequenceName, long initTime, boolean inFlow,
+                                  boolean statisticsEnable, boolean isFault) {
             this.sequenceName = sequenceName;
             this.initTime = initTime;
             isInFlow = inFlow;



---------------------------------------------------------------------
To unsubscribe, e-mail: synapse-dev-unsubscribe@ws.apache.org
For additional commands, e-mail: synapse-dev-help@ws.apache.org