You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicemix.apache.org by cc...@apache.org on 2009/08/25 06:16:01 UTC

svn commit: r807471 [2/2] - in /servicemix/smx4/nmr/trunk: ./ jbi/deployer/ jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/ jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/artifacts/ jbi/deployer/src/main/java/org/apache/se...

Added: servicemix/smx4/nmr/trunk/nmr/management/src/main/java/org/apache/servicemix/nmr/management/ExchangeFailedEvent.java
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/nmr/management/src/main/java/org/apache/servicemix/nmr/management/ExchangeFailedEvent.java?rev=807471&view=auto
==============================================================================
--- servicemix/smx4/nmr/trunk/nmr/management/src/main/java/org/apache/servicemix/nmr/management/ExchangeFailedEvent.java (added)
+++ servicemix/smx4/nmr/trunk/nmr/management/src/main/java/org/apache/servicemix/nmr/management/ExchangeFailedEvent.java Tue Aug 25 04:15:57 2009
@@ -0,0 +1,43 @@
+/*
+ * 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.servicemix.nmr.management;
+
+import java.util.EventObject;
+
+import org.apache.servicemix.nmr.api.Exchange;
+
+/**
+ * Event representing an Exchange failure.
+ */
+public class ExchangeFailedEvent extends EventObject {
+
+    private Exchange exchange;
+
+    public ExchangeFailedEvent(Exchange source) {
+        super(source);
+        this.exchange = source;
+    }
+
+    public Exchange getExchange() {
+        return exchange;
+    }
+
+    public String toString() {
+        return "Exchange failed: " + exchange.getId();
+    }
+}
+

Modified: servicemix/smx4/nmr/trunk/nmr/management/src/main/java/org/apache/servicemix/nmr/management/ManagedEndpoint.java
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/nmr/management/src/main/java/org/apache/servicemix/nmr/management/ManagedEndpoint.java?rev=807471&r1=807470&r2=807471&view=diff
==============================================================================
--- servicemix/smx4/nmr/trunk/nmr/management/src/main/java/org/apache/servicemix/nmr/management/ManagedEndpoint.java (original)
+++ servicemix/smx4/nmr/trunk/nmr/management/src/main/java/org/apache/servicemix/nmr/management/ManagedEndpoint.java Tue Aug 25 04:15:57 2009
@@ -21,8 +21,9 @@
 
 import org.apache.servicemix.nmr.api.Endpoint;
 import org.apache.servicemix.nmr.api.internal.InternalEndpoint;
-import org.apache.servicemix.nmr.management.stats.CountStatistic;
-import org.apache.servicemix.nmr.management.stats.TimeStatistic;
+import org.fusesource.commons.management.ManagementStrategy;
+import org.fusesource.commons.management.Statistic;
+import org.fusesource.commons.management.Statistic.UpdateMode;
 import org.springframework.jmx.export.annotation.ManagedAttribute;
 import org.springframework.jmx.export.annotation.ManagedOperation;
 import org.springframework.jmx.export.annotation.ManagedResource;
@@ -34,18 +35,30 @@
 
     protected final InternalEndpoint endpoint;
     protected final Map<String,?> properties;
-    protected final CountStatistic inboundExchanges;
-    protected final CountStatistic outboundExchanges;
-    protected final TimeStatistic inboundExchangeRate;
-    protected final TimeStatistic outboundExchangeRate;
-
-    public ManagedEndpoint(InternalEndpoint endpoint, Map<String,?> properties) {
+    protected final Statistic inboundExchanges;
+    protected final Statistic outboundExchanges;
+    protected final Statistic inboundExchangeRate;
+    protected final Statistic outboundExchangeRate;
+    protected final ManagementStrategy managementStrategy;
+
+    public ManagedEndpoint(InternalEndpoint endpoint, 
+                           Map<String,?> properties, 
+                           ManagementStrategy managementStrategy) {
         this.endpoint = endpoint;
         this.properties = new HashMap<String,Object>(properties);
-        this.inboundExchanges = new CountStatistic("inboundExchanges", "Number of exchanges received");
-        this.inboundExchangeRate = new TimeStatistic("inboundExchangeRate", "Number of exchanges received per second");
-        this.outboundExchanges = new CountStatistic("outboundExchanges", "Number of exchanges sent");
-        this.outboundExchangeRate = new TimeStatistic("outboundExchangeRate", "Number of exchanges sent per second");
+        this.managementStrategy = managementStrategy;
+        this.inboundExchanges = managementStrategy.createStatistic("inboundExchanges", 
+                                                                   this, 
+                                                                   UpdateMode.VALUE); 
+        this.inboundExchangeRate = managementStrategy.createStatistic("inboundExchangeRate", 
+                                                                      this, 
+                                                                      UpdateMode.COUNTER);
+        this.outboundExchanges = managementStrategy.createStatistic("outboundExchanges", 
+                                                                    this, 
+                                                                    UpdateMode.VALUE);        
+        this.outboundExchangeRate = managementStrategy.createStatistic("outboundExchangeRate", 
+                                                                       this, 
+                                                                       UpdateMode.COUNTER);
     }
 
     public InternalEndpoint getEndpoint() {
@@ -54,12 +67,12 @@
 
     void incrementInbound() {
         inboundExchanges.increment();
-        inboundExchangeRate.addTime();
+        inboundExchangeRate.increment();
     }
 
     void incrementOutbound() {
         outboundExchanges.increment();
-        outboundExchangeRate.addTime();
+        outboundExchangeRate.increment();
     }
 
     /**
@@ -89,7 +102,7 @@
      */
     @ManagedAttribute(description = "Number of exchanges received")
     public long getInboundExchangeCount() {
-        return inboundExchanges.getCount();
+        return inboundExchanges.getUpdateCount();
     }
 
     /**
@@ -99,7 +112,7 @@
      */
     @ManagedAttribute(description = "Exchanges received per second")
     public double getInboundExchangeRate() {
-        return inboundExchangeRate.getAveragePerSecond();
+        return getRate(inboundExchangeRate);
     }
 
     /**
@@ -109,7 +122,7 @@
      */
     @ManagedAttribute(description = "Number of exchanges sent")
     public long getOutboundExchangeCount() {
-        return outboundExchanges.getCount();
+        return outboundExchanges.getUpdateCount();
     }
 
     /**
@@ -119,7 +132,7 @@
      */
     @ManagedAttribute(description = "Exchanges sent per second")
     public double getOutboundExchangeRate() {
-        return outboundExchangeRate.getAveragePerSecond();
+        return getRate(outboundExchangeRate);
     }
 
     /**
@@ -132,5 +145,18 @@
         inboundExchangeRate.reset();
         outboundExchangeRate.reset();
     }
+    
+    /**
+     * Get the update rate for the given statistic
+     * @param stat the statistic
+     * @return
+     */
+    private synchronized double getRate(Statistic stat) {
+        if (stat.getUpdateCount() == 0) {
+            return 0;
+        }
+        double d = stat.getValue();
+        return d / stat.getUpdateCount();
+    }
 
 }

Modified: servicemix/smx4/nmr/trunk/nmr/management/src/main/java/org/apache/servicemix/nmr/management/ManagementAgent.java
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/nmr/management/src/main/java/org/apache/servicemix/nmr/management/ManagementAgent.java?rev=807471&r1=807470&r2=807471&view=diff
==============================================================================
--- servicemix/smx4/nmr/trunk/nmr/management/src/main/java/org/apache/servicemix/nmr/management/ManagementAgent.java (original)
+++ servicemix/smx4/nmr/trunk/nmr/management/src/main/java/org/apache/servicemix/nmr/management/ManagementAgent.java Tue Aug 25 04:15:57 2009
@@ -16,15 +16,19 @@
  */
 package org.apache.servicemix.nmr.management;
 
+import java.util.EventObject;
 import java.util.Set;
 import java.util.HashSet;
 
+import javax.jbi.component.ComponentContext;
 import javax.management.MBeanServer;
+import javax.management.MalformedObjectNameException;
 import javax.management.ObjectName;
 import javax.management.JMException;
 import javax.management.NotCompliantMBeanException;
 import javax.management.ObjectInstance;
 import javax.management.InstanceAlreadyExistsException;
+import javax.management.StandardMBean;
 import javax.management.modelmbean.ModelMBeanInfo;
 import javax.management.modelmbean.RequiredModelMBean;
 import javax.management.modelmbean.InvalidTargetObjectTypeException;
@@ -34,22 +38,118 @@
 import org.springframework.beans.factory.DisposableBean;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.apache.servicemix.nmr.management.stats.CountStatistic;
+import org.apache.servicemix.nmr.management.stats.TimeStatistic;
+import org.fusesource.commons.management.ManagementStrategy;
+import org.fusesource.commons.management.Statistic;
+import org.fusesource.commons.management.Statistic.UpdateMode;
 
 /**
  */
-public class ManagementAgent implements DisposableBean {
+public class ManagementAgent implements ManagementStrategy, DisposableBean {
 
     private static final transient Log LOG = LogFactory.getLog(ManagementAgent.class);
 
     private MBeanServer mbeanServer;
     private MetadataMBeanInfoAssembler assembler;
     private Set<ObjectName> mbeans = new HashSet<ObjectName>();
+    private NamingStrategy namingStrategy;
 
     public ManagementAgent() {
         assembler = new MetadataMBeanInfoAssembler();
         assembler.setAttributeSource(new AnnotationJmxAttributeSource());
     }
 
+    /**
+     * @see org.fusesource.commons.management.ManagementStrategy#manageObject(java.lang.Object)
+     */
+    public void manageObject(Object managedObject) throws Exception {
+        ObjectName objectName = getManagedObjectName(managedObject, null, ObjectName.class);
+        manageNamedObject(managedObject, objectName);
+    }
+    
+    /**
+     * @see org.fusesource.commons.management.ManagementStrategy#getObjectName(java.lang.Object)
+     */
+    public <T> T getManagedObjectName(Object managableObject, 
+                                      String customName, 
+                                      Class<T> nameType) throws Exception {
+        return String.class.equals(nameType) && managableObject == null && customName == null
+               ? nameType.cast(namingStrategy.getJmxDomainName())
+               : ObjectName.class.equals(nameType) 
+                 ? nameType.cast(getTypeSpecificObjectName(managableObject, customName))
+                 : null;
+    }
+
+    /**
+     * @see org.fusesource.commons.management.ManagementStrategy#manageNamedObject(java.lang.Object)
+     */
+    public void manageNamedObject(Object managedObject, Object preferredName) throws Exception {
+        managedObject = getTypeSpecificManagedObject(managedObject);
+        if (preferredName instanceof ObjectName && managedObject != null) {
+            try {
+                register(managedObject, (ObjectName)preferredName);
+            } catch (Exception ex) {
+                ex.printStackTrace();
+                throw new JMException(ex.getMessage());
+            }
+        }
+    }
+    
+    /**
+     * @see org.fusesource.commons.management.ManagementStrategy#unmanageObject(java.lang.Object)
+     */
+    public void unmanageObject(Object managedObject) throws Exception {
+        ObjectName objectName = getManagedObjectName(managedObject, null, ObjectName.class);
+        unmanageNamedObject(objectName);
+    }
+
+    /**
+     * @see org.fusesource.commons.management.ManagementStrategy#unmanageNamedObject(java.lang.Object)
+     */
+    public void unmanageNamedObject(Object name) throws Exception {
+        if (name instanceof ObjectName) {
+            unregister((ObjectName)name);
+        }
+    }
+    
+    /**
+     * @see org.fusesource.commons.management.ManagementStrategy#isManaged(java.lang.Object)
+     */
+    public boolean isManaged(Object managableObject, Object name) {
+        try {
+            return managableObject != null 
+                   ? getMbeanServer().isRegistered(
+                         getManagedObjectName(managableObject, null, ObjectName.class))
+                   : name != null && name instanceof ObjectName
+                     ? getMbeanServer().isRegistered((ObjectName)name)
+                     : false;
+        } catch (Exception e) {
+            return false;
+        }    
+    }
+
+    /**
+     * @see org.fusesource.commons.management.ManagementStrategy#createStatistic(java.lang.Object)
+     */
+    public Statistic createStatistic(String name, Object owner, UpdateMode updateMode) {
+        return updateMode == UpdateMode.COUNTER
+               ? new TimeStatistic(name, null)
+               : updateMode == UpdateMode.VALUE
+                 ? new CountStatistic(name, null)
+                 : null;
+    }
+
+    /**
+     * A place-holder implementation of notify that logs events to the commons
+     * logging Log.
+     */
+    public void notify(EventObject event) throws Exception {
+        if (LOG.isTraceEnabled()) {
+            LOG.trace(event.toString());
+        }
+    }
+ 
     public MBeanServer getMbeanServer() {
         return mbeanServer;
     }
@@ -57,6 +157,14 @@
     public void setMbeanServer(MBeanServer mbeanServer) {
         this.mbeanServer = mbeanServer;
     }
+    
+    public NamingStrategy getNamingStrategy() {
+        return namingStrategy;
+    }
+
+    public void setNamingStrategy(NamingStrategy namingStrategy) {
+        this.namingStrategy = namingStrategy;
+    }
 
     public void destroy() throws Exception {
         // Using the array to hold the busMBeans to avoid the
@@ -80,7 +188,7 @@
     }
 
     public void register(Object obj, ObjectName name) throws JMException {
-        register(obj, name, false);
+        register(obj, name, !(obj instanceof ManagedEndpoint));
     }
 
     public void register(Object obj, ObjectName name, boolean forceRegistration) throws JMException {
@@ -122,5 +230,26 @@
             mbeans.add(name);
         }
     }
-
+    
+    private ObjectName getTypeSpecificObjectName(Object mo, String customName) throws MalformedObjectNameException {
+        return mo instanceof ManagedEndpoint
+               ? namingStrategy.getObjectName((ManagedEndpoint)mo)
+               : mo instanceof Nameable
+                 ? (customName != null
+                    ? namingStrategy.getCustomObjectName(customName, ((Nameable)mo).getName())
+                    : namingStrategy.getObjectName((Nameable)mo))
+                 : mo instanceof ComponentContext
+                   ? namingStrategy.getCustomObjectName(customName, 
+                                                        ((ComponentContext)mo).getComponentName())
+                   : null;
+    }
+
+    
+    private Object getTypeSpecificManagedObject(Object object) throws NotCompliantMBeanException {
+        return object instanceof ManagedEndpoint
+               ? object
+               : object instanceof Nameable
+                 ? new StandardMBean(object, ((Nameable)object).getPrimaryInterface())
+                 : null;
+    }
 }

Modified: servicemix/smx4/nmr/trunk/nmr/management/src/main/java/org/apache/servicemix/nmr/management/ManagementEndpointRegistry.java
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/nmr/management/src/main/java/org/apache/servicemix/nmr/management/ManagementEndpointRegistry.java?rev=807471&r1=807470&r2=807471&view=diff
==============================================================================
--- servicemix/smx4/nmr/trunk/nmr/management/src/main/java/org/apache/servicemix/nmr/management/ManagementEndpointRegistry.java (original)
+++ servicemix/smx4/nmr/trunk/nmr/management/src/main/java/org/apache/servicemix/nmr/management/ManagementEndpointRegistry.java Tue Aug 25 04:15:57 2009
@@ -27,6 +27,7 @@
 import org.apache.servicemix.nmr.api.event.ExchangeListener;
 import org.apache.servicemix.nmr.api.internal.InternalEndpoint;
 import org.apache.servicemix.nmr.api.internal.InternalExchange;
+import org.fusesource.commons.management.ManagementStrategy;
 import org.springframework.beans.factory.InitializingBean;
 
 /**
@@ -35,36 +36,27 @@
 
     private static final transient Log LOG = LogFactory.getLog(ManagementEndpointRegistry.class);
 
-    private NamingStrategy namingStrategy;
-    private ManagementAgent managementAgent;
+    private ManagementStrategy managementStrategy;
     private Map<String, ManagedEndpoint> endpoints;
 
     public ManagementEndpointRegistry() {
         endpoints = new ConcurrentHashMap<String, ManagedEndpoint>();
     }
 
-    public NamingStrategy getNamingStrategy() {
-        return namingStrategy;
+    public ManagementStrategy getManagementAgent() {
+        return managementStrategy;
     }
 
-    public void setNamingStrategy(NamingStrategy namingStrategy) {
-        this.namingStrategy = namingStrategy;
-    }
-
-    public ManagementAgent getManagementAgent() {
-        return managementAgent;
-    }
-
-    public void setManagementAgent(ManagementAgent managementAgent) {
-        this.managementAgent = managementAgent;
+    public void setManagementStrategy(ManagementStrategy managementStrategy) {
+        this.managementStrategy = managementStrategy;
     }
 
     public void register(InternalEndpoint endpoint, Map<String, ?> properties) {
         try {
             LOG.info("Registering endpoint: " + endpoint + " with properties " + properties);
-            ManagedEndpoint ep = new ManagedEndpoint(endpoint, properties);
+            ManagedEndpoint ep = new ManagedEndpoint(endpoint, properties, managementStrategy);
             endpoints.put(endpoint.getId(), ep);
-            managementAgent.register(ep, namingStrategy.getObjectName(ep));
+            managementStrategy.manageObject(ep);
         } catch (Exception e) {
             LOG.warn("Unable to register managed endpoint: " + e, e);
         }
@@ -74,7 +66,7 @@
         try {
             LOG.info("Unregistering endpoint: " + endpoint + " with properties " + properties);
             ManagedEndpoint ep = endpoints.remove(endpoint.getId());
-            managementAgent.unregister(namingStrategy.getObjectName(ep));
+            managementStrategy.unmanageObject(ep);
         } catch (Exception e) {
             LOG.warn("Unable to unregister managed endpoint: " + e, e);
         }
@@ -133,14 +125,17 @@
     }
 
     public void exchangeFailed(Exchange exchange) {
+        ExchangeFailedEvent event = new ExchangeFailedEvent(exchange);
+        try {
+            managementStrategy.notify(event);
+        } catch (Exception ex) {
+            LOG.warn("ExchangeFailedEvent notification failed", ex);
+        }
     }
 
     public void afterPropertiesSet() throws Exception {
-        if (managementAgent == null) {
-            throw new IllegalArgumentException("managementAgent must not be null");
-        }
-        if (namingStrategy == null) {
-            throw new IllegalArgumentException("namingStrategy must not be null");
+        if (managementStrategy == null) {
+            throw new IllegalArgumentException("managementStrategy must not be null");
         }
     }
 }

Added: servicemix/smx4/nmr/trunk/nmr/management/src/main/java/org/apache/servicemix/nmr/management/Nameable.java
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/nmr/management/src/main/java/org/apache/servicemix/nmr/management/Nameable.java?rev=807471&view=auto
==============================================================================
--- servicemix/smx4/nmr/trunk/nmr/management/src/main/java/org/apache/servicemix/nmr/management/Nameable.java (added)
+++ servicemix/smx4/nmr/trunk/nmr/management/src/main/java/org/apache/servicemix/nmr/management/Nameable.java Tue Aug 25 04:15:57 2009
@@ -0,0 +1,57 @@
+/*
+ * 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.servicemix.nmr.management;
+
+
+/**
+ * This interface avoids type leakage from the JBI-specific layer into 
+ * the generic NMR layer when the names for managable objects are being 
+ * constructed by the latter. 
+ */
+public interface Nameable {
+
+    /**
+     * @return the name of the parent
+     */
+    String getParent();
+    
+    /**
+     * @return the name of the entity
+     */
+    String getName();
+    
+    /**
+     * @return the (non-Java) type of the entity 
+     */
+    String getType();
+    
+    /**
+     * @return the sub-type of the entity
+     */
+    String getSubType();
+    
+    /**
+     * @return the version of the entity
+     */
+    String getVersion();
+    
+    /**
+     * @return the primary interface of the entity from a management 
+     * point of view
+     */
+    Class getPrimaryInterface();
+}

Modified: servicemix/smx4/nmr/trunk/nmr/management/src/main/java/org/apache/servicemix/nmr/management/NamingStrategy.java
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/nmr/management/src/main/java/org/apache/servicemix/nmr/management/NamingStrategy.java?rev=807471&r1=807470&r2=807471&view=diff
==============================================================================
--- servicemix/smx4/nmr/trunk/nmr/management/src/main/java/org/apache/servicemix/nmr/management/NamingStrategy.java (original)
+++ servicemix/smx4/nmr/trunk/nmr/management/src/main/java/org/apache/servicemix/nmr/management/NamingStrategy.java Tue Aug 25 04:15:57 2009
@@ -19,10 +19,16 @@
 import javax.management.ObjectName;
 import javax.management.MalformedObjectNameException;
 
+
 /**
  */
 public interface NamingStrategy {
 
     ObjectName getObjectName(ManagedEndpoint endpoint) throws MalformedObjectNameException;
-
+    
+    ObjectName getObjectName(Nameable nameable) throws MalformedObjectNameException;
+    
+    ObjectName getCustomObjectName(String type, String name);
+    
+    String getJmxDomainName();
 }

Modified: servicemix/smx4/nmr/trunk/nmr/management/src/main/java/org/apache/servicemix/nmr/management/stats/CountStatistic.java
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/nmr/management/src/main/java/org/apache/servicemix/nmr/management/stats/CountStatistic.java?rev=807471&r1=807470&r2=807471&view=diff
==============================================================================
--- servicemix/smx4/nmr/trunk/nmr/management/src/main/java/org/apache/servicemix/nmr/management/stats/CountStatistic.java (original)
+++ servicemix/smx4/nmr/trunk/nmr/management/src/main/java/org/apache/servicemix/nmr/management/stats/CountStatistic.java Tue Aug 25 04:15:57 2009
@@ -46,17 +46,19 @@
         counter.set(0);
     }
 
-    public long getCount() {
+    public long getValue() {
         return counter.get();
     }
 
-    public void setCount(long count) {
+    public void updateValue(long count) {
         counter.set(count);
+        updateUpdateCount();
     }
 
     public void add(long amount) {
         counter.addAndGet(amount);
         updateSampleTime();
+        updateUpdateCount();
         if (parent != null) {
             parent.add(amount);
         }
@@ -65,6 +67,7 @@
     public void increment() {
         counter.incrementAndGet();
         updateSampleTime();
+        updateUpdateCount();
         if (parent != null) {
             parent.increment();
         }
@@ -73,6 +76,7 @@
     public void subtract(long amount) {
         counter.addAndGet(-amount);
         updateSampleTime();
+        updateUpdateCount();
         if (parent != null) {
             parent.subtract(amount);
         }
@@ -81,6 +85,7 @@
     public void decrement() {
         counter.decrementAndGet();
         updateSampleTime();
+        updateUpdateCount();
         if (parent != null) {
             parent.decrement();
         }

Modified: servicemix/smx4/nmr/trunk/nmr/management/src/main/java/org/apache/servicemix/nmr/management/stats/Statistic.java
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/nmr/management/src/main/java/org/apache/servicemix/nmr/management/stats/Statistic.java?rev=807471&r1=807470&r2=807471&view=diff
==============================================================================
--- servicemix/smx4/nmr/trunk/nmr/management/src/main/java/org/apache/servicemix/nmr/management/stats/Statistic.java (original)
+++ servicemix/smx4/nmr/trunk/nmr/management/src/main/java/org/apache/servicemix/nmr/management/stats/Statistic.java Tue Aug 25 04:15:57 2009
@@ -16,17 +16,20 @@
  */
 package org.apache.servicemix.nmr.management.stats;
 
+import java.util.concurrent.atomic.AtomicLong;
+
 /**
  * Base class for a Statistic implementation
  *
  * @version $Revision: 482795 $
  */
-public class Statistic {
+public abstract class Statistic implements org.fusesource.commons.management.Statistic {
     private String name;
     private String unit;
     private String description;
     private long startTime;
     private long lastSampleTime;
+    protected final AtomicLong updateCount = new AtomicLong(0);
 
     public Statistic(String name, String unit, String description) {
         this.name = name;
@@ -35,8 +38,18 @@
         startTime = System.currentTimeMillis();
         lastSampleTime = startTime;
     }
-
+    
+    /**
+     * Gets the number of times the statistic has been updated since the last reset.
+     * 
+     * @return the update count
+     */
+    public long getUpdateCount() {
+        return updateCount.get();
+    }
+    
     public synchronized void reset() {
+        updateCount.set(0);
         startTime = System.currentTimeMillis();
         lastSampleTime = startTime;
     }
@@ -44,6 +57,10 @@
     protected synchronized void updateSampleTime() {
         lastSampleTime = System.currentTimeMillis();
     }
+    
+    protected void updateUpdateCount() {
+        updateCount.incrementAndGet();
+    }
 
     public synchronized String toString() {
         StringBuffer buffer = new StringBuffer();

Modified: servicemix/smx4/nmr/trunk/nmr/management/src/main/java/org/apache/servicemix/nmr/management/stats/TimeStatistic.java
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/nmr/management/src/main/java/org/apache/servicemix/nmr/management/stats/TimeStatistic.java?rev=807471&r1=807470&r2=807471&view=diff
==============================================================================
--- servicemix/smx4/nmr/trunk/nmr/management/src/main/java/org/apache/servicemix/nmr/management/stats/TimeStatistic.java (original)
+++ servicemix/smx4/nmr/trunk/nmr/management/src/main/java/org/apache/servicemix/nmr/management/stats/TimeStatistic.java Tue Aug 25 04:15:57 2009
@@ -22,7 +22,6 @@
  * @version $Revision: 482795 $
  */
 public class TimeStatistic extends Statistic {
-    private long count;
     private long maxTime;
     private long minTime;
     private long totalTime;
@@ -43,19 +42,14 @@
 
     public synchronized void reset() {
         super.reset();
-        count = 0;
         maxTime = 0;
         minTime = 0;
         totalTime = 0;
     }
 
-    public synchronized long getCount() {
-        return count;
-    }
-
-    public synchronized void addTime(long time) {
+    public synchronized void updateValue(long time) {
         updateSampleTime();
-        count++;
+        updateUpdateCount();
         totalTime += time;
         if (time > maxTime) {
             maxTime = time;
@@ -64,15 +58,15 @@
             minTime = time;
         }
         if (parent != null) {
-            parent.addTime(time);
+            parent.updateValue(time);
         }
     }
 
-    public synchronized void addTime() {
+    public synchronized void increment() {
         long time = getLastSampleTime();
         updateSampleTime();
+        updateUpdateCount();
         time = getLastSampleTime() - time;
-        count++;
         totalTime += time;
         if (time > maxTime) {
             maxTime = time;
@@ -81,7 +75,7 @@
             minTime = time;
         }
         if (parent != null) {
-            parent.addTime(time);
+            parent.updateValue(time);
         }
     }
 
@@ -102,7 +96,7 @@
     /**
      * @return the total time of all the steps added together
      */
-    public synchronized long getTotalTime() {
+    public synchronized long getValue() {
         return totalTime;
     }
 
@@ -111,11 +105,11 @@
      *         total time by the number of counts
      */
     public synchronized double getAverageTime() {
-        if (count == 0) {
+        if (updateCount.get() == 0) {
             return 0;
         }
         double d = totalTime;
-        return d / count;
+        return d / updateCount.get();
     }
 
 
@@ -125,11 +119,11 @@
      *         minimum and maximum times.
      */
     public synchronized double getAverageTimeExcludingMinMax() {
-        if (count <= 2) {
+        if (updateCount.get() <= 2) {
             return 0;
         }
         double d = totalTime - minTime - maxTime;
-        return d / (count - 2);
+        return d / (updateCount.incrementAndGet() - 2);
     }
 
 
@@ -166,8 +160,8 @@
     }
 
     protected synchronized void appendFieldDescription(StringBuffer buffer) {
-        buffer.append(" count: ");
-        buffer.append(Long.toString(count));
+        buffer.append(" update count: ");
+        buffer.append(Long.toString(updateCount.get()));
         buffer.append(" maxTime: ");
         buffer.append(Long.toString(maxTime));
         buffer.append(" minTime: ");

Modified: servicemix/smx4/nmr/trunk/nmr/management/src/main/resources/META-INF/spring/servicemix-nmr-management.xml
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/nmr/management/src/main/resources/META-INF/spring/servicemix-nmr-management.xml?rev=807471&r1=807470&r2=807471&view=diff
==============================================================================
--- servicemix/smx4/nmr/trunk/nmr/management/src/main/resources/META-INF/spring/servicemix-nmr-management.xml (original)
+++ servicemix/smx4/nmr/trunk/nmr/management/src/main/resources/META-INF/spring/servicemix-nmr-management.xml Tue Aug 25 04:15:57 2009
@@ -36,16 +36,7 @@
 
     <!-- Endpoint registry -->
     <bean id="endpointRegistry" class="org.apache.servicemix.nmr.management.ManagementEndpointRegistry">
-        <property name="namingStrategy" ref="namingStrategy" />
-        <property name="managementAgent" ref="managementAgent" />
-    </bean>
-
-    <bean id="namingStrategy" class="org.apache.servicemix.nmr.management.DefaultNamingStrategy">
-        <property name="jmxDomainName" value="org.apache.servicemix" />
-    </bean>
-
-    <bean id="managementAgent" class="org.apache.servicemix.nmr.management.ManagementAgent">
-        <property name="mbeanServer" ref="mbeanServer" />
+        <property name="managementStrategy" ref="managementStrategy" />
     </bean>
 
     <!-- List of endpoints -->
@@ -63,4 +54,23 @@
         </osgi:interfaces>
     </osgi:service>
 
+    <!-- ManagementStrategy -->
+    <!-- Replace the following beans and <osgi:service> element with 
+         an <osgi:reference> element if plugging in an alternative 
+         ManagementStrategy implementation from another bunble -->
+    <bean id="namingStrategy" class="org.apache.servicemix.nmr.management.DefaultNamingStrategy">
+        <property name="jmxDomainName" value="org.apache.servicemix" />
+    </bean>
+
+    <bean id="managementStrategy" class="org.apache.servicemix.nmr.management.ManagementAgent">
+        <property name="namingStrategy" ref="namingStrategy" />
+        <property name="mbeanServer" ref="mbeanServer" />
+    </bean>
+
+    <osgi:service ref="managementStrategy">
+        <osgi:interfaces>
+            <value>org.fusesource.commons.management.ManagementStrategy</value>
+        </osgi:interfaces>
+    </osgi:service>
+
 </beans>

Added: servicemix/smx4/nmr/trunk/nmr/management/src/test/java/org/apache/servicemix/nmr/management/ManagementStrategyTest.java
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/nmr/management/src/test/java/org/apache/servicemix/nmr/management/ManagementStrategyTest.java?rev=807471&view=auto
==============================================================================
--- servicemix/smx4/nmr/trunk/nmr/management/src/test/java/org/apache/servicemix/nmr/management/ManagementStrategyTest.java (added)
+++ servicemix/smx4/nmr/trunk/nmr/management/src/test/java/org/apache/servicemix/nmr/management/ManagementStrategyTest.java Tue Aug 25 04:15:57 2009
@@ -0,0 +1,405 @@
+/**
+ * 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.servicemix.nmr.management;
+
+import java.util.EventObject;
+import java.util.HashMap;
+
+import javax.management.MBeanServer;
+import javax.management.NotCompliantMBeanException;
+import javax.management.ObjectInstance;
+import javax.management.ObjectName;
+import javax.management.StandardMBean;
+import javax.management.modelmbean.RequiredModelMBean;
+
+import org.apache.servicemix.nmr.api.internal.InternalEndpoint;
+
+import org.fusesource.commons.management.Statistic;
+import org.fusesource.commons.management.Statistic.UpdateMode;
+
+import static org.easymock.classextension.EasyMock.*;
+import org.easymock.classextension.IMocksControl;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+public class ManagementStrategyTest extends Assert { //TestCase {
+
+    private IMocksControl control; 
+    private ManagementAgent strategy = null;
+    private MBeanServer mbeanServer = null;
+
+    private static final String JMX_DOMAIN = "smx_domain";
+    private static final String EXTENSION_NAME = 
+        JMX_DOMAIN + ":Type=Component,Name=extension,SubType=bootstrap";
+    private static final String ENDPOINT_NAME = 
+        JMX_DOMAIN + ":Type=Endpoint,Id=endpoint_foo";
+
+    @Before
+    public void setUp() {
+        control = createNiceControl();
+        mbeanServer = control.createMock(MBeanServer.class);
+        strategy = setUpStrategy();
+    } 
+
+    @After
+    public void tearDown() {
+        strategy = null;
+        mbeanServer = null;
+    }
+
+    @Test
+    public void testGetJmxDomainName() throws Exception {
+        Object name = strategy.getManagedObjectName(null, 
+                                                    null, 
+                                                    String.class);
+        assertNotNull(name);
+        assertTrue(name instanceof String);
+        assertEquals("unexpected domain name", name, JMX_DOMAIN);
+    }
+
+    @Test
+    public void testAdminCommandsServiceObjectName() throws Exception {
+        Nameable nameable = getNameable("AdminCommandsService", 
+                                        "ServiceMix",
+                                        "SystemService", 
+                                        null, 
+                                        null, 
+                                        null);
+        Object name = strategy.getManagedObjectName(nameable, 
+                                                    null, 
+                                                    ObjectName.class);
+        verifyObjectName(name, 
+                         ":ContainerName=ServiceMix,Type=SystemService,"
+                         + "Name=AdminCommandsService"); 
+    }
+
+    @Test
+    public void testSharedLibraryObjectName() throws Exception {
+        Nameable nameable = getNameable("servicemix-shared", 
+                                        null,
+                                        "SharedLibrary", 
+                                        null, 
+                                        "2008.01", 
+                                        null);
+        Object name = strategy.getManagedObjectName(nameable, 
+                                                    null, 
+                                                    ObjectName.class);
+        verifyObjectName(name,
+                         ":Type=SharedLibrary,Name=servicemix-shared,"
+                         + "Version=2008.01");
+    }
+
+    @Test
+    public void testServiceEngineObjectName() throws Exception {
+        Nameable nameable = getNameable("servicemix-eip", 
+                                        null,
+                                        "service-engine", 
+                                        "LifeCycle", 
+                                        null,
+                                        null);
+        Object name = strategy.getManagedObjectName(nameable, 
+                                                    null, 
+                                                    ObjectName.class);
+        verifyObjectName(name, 
+                         ":Type=service-engine,Name=servicemix-eip,"
+                         + "SubType=LifeCycle");
+    };
+
+    @Test
+    public void testBindingComponentObjectName() throws Exception {
+        Nameable nameable = getNameable("servicemix-http", 
+                                        null,
+                                        "binding-component", 
+                                        "LifeCycle", 
+                                        null,
+                                        null);
+        Object name = strategy.getManagedObjectName(nameable, 
+                                                    null, 
+                                                    ObjectName.class);
+        verifyObjectName(name, 
+                         ":Type=binding-component,Name=servicemix-http,"
+                         + "SubType=LifeCycle");
+    }
+
+    @Test
+    public void testServiceAssemblyObjectName() throws Exception {
+        Nameable nameable = getNameable("wsdl-first-sa", 
+                                        null,
+                                        "ServiceAssembly", 
+                                        null, 
+                                        null,
+                                        null);
+        Object name = strategy.getManagedObjectName(nameable, 
+                                                    null, 
+                                                    ObjectName.class);
+        verifyObjectName(name, 
+                         ":Type=ServiceAssembly,Name=wsdl-first-sa");
+    }
+
+    @Test
+    public void testCustomComponentObjectName() throws Exception {
+        Nameable nameable = getNameable("extension", 
+                                        null,
+                                        null, 
+                                        null, 
+                                        null,
+                                        FooMBean.class);
+        Object name = strategy.getManagedObjectName(nameable, 
+                                                    "bootstrap", 
+                                                    ObjectName.class);
+        verifyObjectName(name, 
+                         ":Type=Component,Name=extension,SubType=bootstrap");
+    }
+
+    @Test
+    public void testIsManagedNameManaged() throws Exception {
+        doTestIsManagedName(true);
+    }
+
+    @Test
+    public void testIsManagedNameUnmanaged() throws Exception {
+        doTestIsManagedName(false);
+    }
+
+    private void doTestIsManagedName(boolean managed) throws Exception {
+        ObjectName name = new ObjectName(EXTENSION_NAME);
+        expect(mbeanServer.isRegistered(name)).andReturn(managed);
+        control.replay();
+        if (managed) {
+            assertTrue(strategy.isManaged(null, name));
+        } else {
+            assertFalse(strategy.isManaged(null, name));
+        }
+        control.verify();
+    }
+
+    @Test
+    public void testIsManagedObjectManaged() throws Exception {
+        doTestIsManagedObject(true);
+    }
+
+    @Test
+    public void testIsManagedObjectUnmanaged() throws Exception {
+        doTestIsManagedObject(false);
+    }
+
+    private void doTestIsManagedObject(boolean managed) throws Exception {
+        ObjectName name = new ObjectName(EXTENSION_NAME);
+        expect(mbeanServer.isRegistered(name)).andReturn(managed);
+        control.replay();
+        Nameable nameable = getNameable("extension", 
+                                        null, 
+                                        "Component", 
+                                        "bootstrap", 
+                                        null, 
+                                        FooMBean.class);
+        if (managed) {
+            assertTrue(strategy.isManaged(nameable, name));
+        } else {
+            assertFalse(strategy.isManaged(nameable, name));
+        }
+        control.verify();
+    }
+
+    @Test
+    public void testManageObjectSingleStep() throws Exception {
+        ObjectName name = new ObjectName(EXTENSION_NAME);
+        Nameable nameable = new Foo("extension", 
+                                    null, 
+                                    "Component", 
+                                    "bootstrap", 
+                                    null, 
+                                    "bar");
+        ObjectInstance instance = new ObjectInstance(name, Nameable.class.getName());
+        expect(mbeanServer.registerMBean(isA(StandardMBean.class), eq(name))).andReturn(instance);
+        control.replay();
+        strategy.manageObject(nameable);
+        control.verify();
+    }
+
+    @Test
+    public void testManageObjectDualStep() throws Exception {
+        Nameable nameable = new Foo("extension", 
+                                    null, 
+                                    "Component", 
+                                    "bootstrap", 
+                                    null, 
+                                    "bar");
+        ObjectName name = strategy.getManagedObjectName(nameable, 
+                                                        "bootstrap", 
+                                                        ObjectName.class);
+        ObjectInstance instance = new ObjectInstance(name, Nameable.class.getName());
+        expect(mbeanServer.registerMBean(isA(StandardMBean.class), eq(name))).andReturn(instance);
+        control.replay();
+        strategy.manageNamedObject(nameable, name);
+        control.verify();
+    }
+
+    @Test
+    public void testRepeatManageObject() throws Exception {
+        ObjectName name = new ObjectName(EXTENSION_NAME);
+        Nameable nameable = new Foo("extension", 
+                                    null, 
+                                    "Component", 
+                                    "bootstrap", 
+                                    null, 
+                                    "bar");
+        ObjectInstance instance = new ObjectInstance(name, Nameable.class.getName());
+        expect(mbeanServer.registerMBean(isA(StandardMBean.class), eq(name))).andReturn(instance).times(2);
+        control.replay();
+        strategy.manageObject(nameable);
+        strategy.manageObject(nameable);
+        control.verify();
+    }
+
+    @Test
+    public void testRepeatManageManagedEndpoint() throws Exception {
+        ObjectName name = new ObjectName(ENDPOINT_NAME);
+        ObjectInstance instance = new ObjectInstance(name, Nameable.class.getName());
+        InternalEndpoint internal = control.createMock(InternalEndpoint.class);
+        HashMap<String, Object> props = new HashMap<String, Object>();
+        ManagedEndpoint endpoint = 
+            new ManagedEndpoint(internal, props, strategy);
+        expect(internal.getId()).andReturn("endpoint_foo");
+        Exception ex = new NotCompliantMBeanException();
+        expect(mbeanServer.registerMBean(isA(ManagedEndpoint.class), eq(name))).andThrow(ex);
+        RequiredModelMBean mbean = control.createMock(RequiredModelMBean.class);
+        expect(mbeanServer.instantiate(RequiredModelMBean.class.getName())).andReturn(mbean);
+        expect(mbeanServer.registerMBean(isA(RequiredModelMBean.class), eq(name))).andReturn(instance);
+        control.replay();
+        strategy.manageObject(endpoint);
+        strategy.manageObject(endpoint);
+        control.verify();
+    }
+
+    @Test
+    public void testCreateStatistics() throws Exception {
+        Statistic counter = strategy.createStatistic("counter", null, UpdateMode.COUNTER);
+        counter.updateValue(150L);
+        counter.updateValue(50L);        
+        assertEquals(200L, counter.getValue());
+
+        Statistic value = strategy.createStatistic("value", null, UpdateMode.VALUE);
+        value.updateValue(150L);
+        value.updateValue(50L);        
+        assertEquals(50L, value.getValue());
+    }
+
+    @Test
+    public void testEventNotify() throws Exception {
+        // non-replacable static log factory awkward to mock 
+        strategy.notify(new EventObject(this));
+    }
+
+    protected ManagementAgent setUpStrategy() {
+        ManagementAgent ms = new ManagementAgent();
+        DefaultNamingStrategy ns = new DefaultNamingStrategy();
+        ns.setJmxDomainName(JMX_DOMAIN);
+        ms.setNamingStrategy(ns);
+        ms.setMbeanServer(mbeanServer);
+        return ms;
+    }
+
+    protected Nameable getNameable(final String name,
+                                   final String parent,
+                                   final String type,
+                                   final String subtype,
+                                   final String version,
+                                   final Class primary) {
+        return new Nameable() {
+            public String getName() {
+                return name;
+            }                    
+            public String getParent() {
+                return parent;
+            }
+            public String getType() {
+                return type;
+            }
+            public String getSubType() {
+                return subtype;
+            }
+            public String getVersion() {
+                return version;
+            }
+            public Class getPrimaryInterface() {
+                return primary;
+            }
+        };
+    }
+
+    protected void verifyObjectName(Object name, String expected) {
+        assertNotNull(name); 
+        assertTrue(name instanceof ObjectName);
+        ObjectName on = (ObjectName)name;
+        assertEquals("unexpected object name", 
+                     on.toString(), 
+                     (JMX_DOMAIN + expected));
+    }
+
+    public interface FooMBean {
+        String getBar();
+    }
+
+    private static class Foo implements Nameable, FooMBean {
+        private String name;
+        private String parent;
+        private String type;
+        private String subType;
+        private String version;
+        private String bar;
+        
+        Foo(String name,
+            String parent,
+            String type,
+            String subType,
+            String version,
+            String bar) {
+            this.name = name;
+            this.parent = parent;
+            this.type = type;
+            this.subType = subType;
+            this.version = version;
+            this.bar = bar;
+        }
+
+        public String getName() {
+            return name;
+        }                
+        public String getParent() {
+            return parent;
+        }
+        public String getType() {
+            return type;
+        }
+        public String getSubType() {
+            return subType;
+        }
+        public String getVersion() {
+            return version;
+        }
+        public Class getPrimaryInterface() {
+            return FooMBean.class;
+        }
+        public String getBar() {
+            return bar;
+        }
+    }
+}

Modified: servicemix/smx4/nmr/trunk/nmr/management/src/test/java/org/apache/servicemix/nmr/management/stats/CountStatisticTest.java
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/nmr/management/src/test/java/org/apache/servicemix/nmr/management/stats/CountStatisticTest.java?rev=807471&r1=807470&r2=807471&view=diff
==============================================================================
--- servicemix/smx4/nmr/trunk/nmr/management/src/test/java/org/apache/servicemix/nmr/management/stats/CountStatisticTest.java (original)
+++ servicemix/smx4/nmr/trunk/nmr/management/src/test/java/org/apache/servicemix/nmr/management/stats/CountStatisticTest.java Tue Aug 25 04:15:57 2009
@@ -32,20 +32,24 @@
         CountStatistic stat = new CountStatistic("myCounter", "seconds", "myDescription");
         assertStatistic(stat, "myCounter", "seconds", "myDescription");
 
-        assertEquals(0, stat.getCount());
+        assertEquals(0, stat.getValue());
 
         stat.increment();
-        assertEquals(1, stat.getCount());
+        assertEquals(1, stat.getValue());
+        assertEquals(1, stat.getUpdateCount());
 
         stat.increment();
-        assertEquals(2, stat.getCount());
+        assertEquals(2, stat.getValue());
+        assertEquals(2, stat.getUpdateCount());
 
         stat.decrement();
-        assertEquals(1, stat.getCount());
+        assertEquals(1, stat.getValue());
+        assertEquals(3, stat.getUpdateCount());
 
         Thread.sleep(500);
 
         stat.increment();
+        assertEquals(4, stat.getUpdateCount());
 
         assertLastTimeNotStartTime(stat);
 
@@ -53,6 +57,7 @@
 
         stat.reset();
 
-        assertEquals(0, stat.getCount());
+        assertEquals(0, stat.getValue());
+        assertEquals(0, stat.getUpdateCount());
     }
 }

Modified: servicemix/smx4/nmr/trunk/nmr/management/src/test/java/org/apache/servicemix/nmr/management/stats/TimeStatisticTest.java
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/nmr/management/src/test/java/org/apache/servicemix/nmr/management/stats/TimeStatisticTest.java?rev=807471&r1=807470&r2=807471&view=diff
==============================================================================
--- servicemix/smx4/nmr/trunk/nmr/management/src/test/java/org/apache/servicemix/nmr/management/stats/TimeStatisticTest.java (original)
+++ servicemix/smx4/nmr/trunk/nmr/management/src/test/java/org/apache/servicemix/nmr/management/stats/TimeStatisticTest.java Tue Aug 25 04:15:57 2009
@@ -29,29 +29,29 @@
         TimeStatistic stat = new TimeStatistic("myTimer", "millis", "myDescription");
         assertStatistic(stat, "myTimer", "millis", "myDescription");
 
-        assertEquals(0, stat.getCount());
+        assertEquals(0, stat.getUpdateCount());
 
-        stat.addTime(100);
-        assertEquals(1, stat.getCount());
+        stat.updateValue(100);
+        assertEquals(1, stat.getUpdateCount());
         assertEquals(100, stat.getMinTime());
         assertEquals(100, stat.getMaxTime());
 
-        stat.addTime(403);
-        assertEquals(2, stat.getCount());
+        stat.updateValue(403);
+        assertEquals(2, stat.getUpdateCount());
         assertEquals(100, stat.getMinTime());
         assertEquals(403, stat.getMaxTime());
 
-        stat.addTime(50);
-        assertEquals(3, stat.getCount());
+        stat.updateValue(50);
+        assertEquals(3, stat.getUpdateCount());
         assertEquals(50, stat.getMinTime());
         assertEquals(403, stat.getMaxTime());
 
 
-        assertEquals(553, stat.getTotalTime());
+        assertEquals(553, stat.getValue());
 
         Thread.sleep(500);
 
-        stat.addTime(10);
+        stat.updateValue(10);
 
         assertLastTimeNotStartTime(stat);
 
@@ -59,16 +59,16 @@
 
         stat.reset();
 
-        assertEquals(0, stat.getCount());
+        assertEquals(0, stat.getUpdateCount());
         assertEquals(0, stat.getMinTime());
         assertEquals(0, stat.getMaxTime());
-        assertEquals(0, stat.getTotalTime());
+        assertEquals(0, stat.getValue());
 
-        stat.addTime(100);
-        assertEquals(1, stat.getCount());
+        stat.updateValue(100);
+        assertEquals(1, stat.getUpdateCount());
         assertEquals(100, stat.getMinTime());
         assertEquals(100, stat.getMaxTime());
-        assertEquals(100, stat.getTotalTime());
+        assertEquals(100, stat.getValue());
 
     }
 }

Modified: servicemix/smx4/nmr/trunk/nmr/osgi/pom.xml
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/nmr/osgi/pom.xml?rev=807471&r1=807470&r2=807471&view=diff
==============================================================================
--- servicemix/smx4/nmr/trunk/nmr/osgi/pom.xml (original)
+++ servicemix/smx4/nmr/trunk/nmr/osgi/pom.xml Tue Aug 25 04:15:57 2009
@@ -68,6 +68,11 @@
             <artifactId>commons-logging</artifactId>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.fusesource.commonman</groupId>
+            <artifactId>commons-management</artifactId>
+	    <version>${commons.management.version}</version>
+        </dependency>
     </dependencies>
 
     <build>
@@ -89,6 +94,7 @@
                             org.apache.servicemix.nmr.core,
                             org.apache.servicemix.nmr.core.security,
                             org.apache.servicemix.nmr.osgi,
+                            org.fusesource.commons.management,
                             *
                         </Import-Package>
 
@@ -98,4 +104,4 @@
         </plugins>
     </build>
 
-</project>
\ No newline at end of file
+</project>

Modified: servicemix/smx4/nmr/trunk/nmr/osgi/src/main/resources/META-INF/spring/servicemix-nmr.xml
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/nmr/osgi/src/main/resources/META-INF/spring/servicemix-nmr.xml?rev=807471&r1=807470&r2=807471&view=diff
==============================================================================
--- servicemix/smx4/nmr/trunk/nmr/osgi/src/main/resources/META-INF/spring/servicemix-nmr.xml (original)
+++ servicemix/smx4/nmr/trunk/nmr/osgi/src/main/resources/META-INF/spring/servicemix-nmr.xml Tue Aug 25 04:15:57 2009
@@ -36,12 +36,16 @@
   http://www.springframework.org/schema/osgi-compendium/spring-osgi-compendium.xsd">
 
     <!-- ServiceMix NMR -->
-    <bean id="servicemix" class="org.apache.servicemix.nmr.core.ServiceMix">
+    <bean id="servicemix" class="org.apache.servicemix.nmr.core.ServiceMix"
+          init-method="init"
+          destroy-method="shutdown">
         <property name="endpointRegistry" ref="endpointRegistry" />
         <property name="listenerRegistry" ref="listenerRegistry" />
         <property name="flowRegistry" ref="flowRegistry" />
         <property name="wireRegistry" ref="wireRegistry" />
         <property name="executorFactory" ref="executorFactory" />
+        <property name="managementStrategy" ref="managementStrategy" />
+        <property name="id" value="${nmrId}" />
     </bean>
     <osgi:service ref="servicemix">
         <osgi:interfaces>
@@ -128,7 +132,14 @@
         </property>
     </bean>
 
+    <!-- Retrieve ManagementStrategy from OSGi service registry -->
+    <osgi:reference id="managementStrategy"
+                    interface="org.fusesource.commons.management.ManagementStrategy"
+                    cardinality="1..1" />
+
+
     <osgix:cm-properties id="cmProps" persistent-id="org.apache.servicemix.nmr">
+        <prop key="nmrId">org.apache.servicemix.NMR</prop>
         <prop key="allowCoreThreadsTimeout">true</prop>
         <prop key="threadPoolCorePoolSize">1</prop>
         <prop key="threadPoolMaximumPoolSize">16</prop>

Modified: servicemix/smx4/nmr/trunk/pom.xml
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/pom.xml?rev=807471&r1=807470&r2=807471&view=diff
==============================================================================
--- servicemix/smx4/nmr/trunk/pom.xml (original)
+++ servicemix/smx4/nmr/trunk/pom.xml Tue Aug 25 04:15:57 2009
@@ -107,6 +107,7 @@
       <wsdl4j.version>1.6.1_1</wsdl4j.version>
       <xbean.version>3.5</xbean.version>
       <geronimo.stax.version>1.0.1</geronimo.stax.version>
+      <commons.management.version>1.0</commons.management.version>
       <sonar.skippedModules>examples</sonar.skippedModules>
   </properties>