Slice out MetricsHelper/Util

Change-Id: Ic6848f47d38550b78ebd6cdcf414305e54408882
diff --git a/core/api/src/main/java/org/onlab/onos/core/MetricsHelper.java b/core/api/src/main/java/org/onlab/onos/core/MetricsHelper.java
new file mode 100644
index 0000000..7c9a715
--- /dev/null
+++ b/core/api/src/main/java/org/onlab/onos/core/MetricsHelper.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2014 Open Networking Laboratory
+ *
+ * Licensed 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.onlab.onos.core;
+
+import org.onlab.metrics.MetricsComponent;
+import org.onlab.metrics.MetricsFeature;
+import org.onlab.metrics.MetricsService;
+
+import com.codahale.metrics.Timer;
+
+/**
+ * Collection of utility methods used for providing Metrics.
+ */
+public interface MetricsHelper {
+
+    /**
+     * Returns MetricService instance.
+     *
+     * @return MetricService instance
+     */
+    abstract MetricsService metricsService();
+
+
+    /**
+     * Creates a Timer instance with given name.
+     *
+     * @param component component name
+     * @param feature   feature name
+     * @param name      timer name
+     * @return          Timer instance
+     */
+    default Timer createTimer(String component, String feature, String name) {
+        final MetricsService metricsService = metricsService();
+        if (metricsService != null) {
+            MetricsComponent c = metricsService.registerComponent(component);
+            MetricsFeature f = c.registerFeature(feature);
+            return metricsService.createTimer(c, f, name);
+        }
+        return null;
+    }
+
+}
diff --git a/core/net/src/main/java/org/onlab/onos/cluster/impl/MastershipManager.java b/core/net/src/main/java/org/onlab/onos/cluster/impl/MastershipManager.java
index 66509b6..4f993c4 100644
--- a/core/net/src/main/java/org/onlab/onos/cluster/impl/MastershipManager.java
+++ b/core/net/src/main/java/org/onlab/onos/cluster/impl/MastershipManager.java
@@ -17,6 +17,7 @@
 
 import static com.google.common.base.Preconditions.checkNotNull;
 import static org.slf4j.LoggerFactory.getLogger;
+import static org.onlab.metrics.MetricsUtil.*;
 
 import java.util.Set;
 import java.util.concurrent.atomic.AtomicInteger;
@@ -27,8 +28,6 @@
 import org.apache.felix.scr.annotations.Reference;
 import org.apache.felix.scr.annotations.ReferenceCardinality;
 import org.apache.felix.scr.annotations.Service;
-import org.onlab.metrics.MetricsComponent;
-import org.onlab.metrics.MetricsFeature;
 import org.onlab.metrics.MetricsService;
 import org.onlab.onos.cluster.ClusterEvent;
 import org.onlab.onos.cluster.ClusterEventListener;
@@ -36,6 +35,7 @@
 import org.onlab.onos.cluster.ControllerNode;
 import org.onlab.onos.cluster.NodeId;
 import org.onlab.onos.cluster.RoleInfo;
+import org.onlab.onos.core.MetricsHelper;
 import org.onlab.onos.event.AbstractListenerRegistry;
 import org.onlab.onos.event.EventDeliveryService;
 import org.onlab.onos.mastership.MastershipAdminService;
@@ -56,7 +56,8 @@
 @Component(immediate = true)
 @Service
 public class MastershipManager
-    implements MastershipService, MastershipAdminService, MastershipTermService {
+    implements MastershipService, MastershipAdminService, MastershipTermService,
+               MetricsHelper {
 
     private static final String NODE_ID_NULL = "Node ID cannot be null";
     private static final String DEVICE_ID_NULL = "Device ID cannot be null";
@@ -192,7 +193,10 @@
         listenerRegistry.removeListener(listener);
     }
 
-    // FIXME: provide wiring to allow events to be triggered by changes within the store
+    @Override
+    public MetricsService metricsService() {
+        return metricsService;
+    }
 
     // Posts the specified event to the local event dispatcher.
     private void post(MastershipEvent event) {
@@ -201,30 +205,6 @@
         }
     }
 
-
-
-    private Timer createTimer(String component, String feature, String name) {
-        if (metricsService != null) {
-            MetricsComponent c = metricsService.registerComponent(component);
-            MetricsFeature f = c.registerFeature(feature);
-            return metricsService.createTimer(c, f, name);
-        }
-        return null;
-    }
-
-    private static final Context startTimer(Timer timer) {
-        if (timer != null) {
-            return timer.time();
-        }
-        return null;
-    }
-
-    private static final void stopTimer(Context context) {
-        if (context != null) {
-            context.stop();
-        }
-    }
-
     //callback for reacting to cluster events
     private class InternalClusterEventListener implements ClusterEventListener {
 
diff --git a/utils/misc/src/main/java/org/onlab/metrics/MetricsUtil.java b/utils/misc/src/main/java/org/onlab/metrics/MetricsUtil.java
new file mode 100644
index 0000000..e837c66
--- /dev/null
+++ b/utils/misc/src/main/java/org/onlab/metrics/MetricsUtil.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2014 Open Networking Laboratory
+ *
+ * Licensed 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.onlab.metrics;
+
+import com.codahale.metrics.Timer;
+import com.codahale.metrics.Timer.Context;
+
+public final class MetricsUtil {
+
+    /**
+     * Starts the Metric Timer.
+     * <p>
+     * If the given timer was null, it will silently return null.
+     * </p>
+     *
+     * @param timer timer to start
+     * @return timing context, if timer was not null
+     */
+    public static final Context startTimer(Timer timer) {
+        if (timer != null) {
+            return timer.time();
+        }
+        return null;
+    }
+
+    /**
+     * Stops the Metric Timer context.
+     * <p>
+     * If the given context was null, it will silently be ignored.
+     * </p>
+     *
+     * @param context timing context to stop, if not null.
+     */
+    public static final void stopTimer(Context context) {
+        if (context != null) {
+            context.stop();
+        }
+    }
+
+    // avoid instantiation
+    private MetricsUtil() {}
+}