[GERONIMO-6769] Override default methods from MetricRegistry
diff --git a/geronimo-metrics-common/src/main/java/org/apache/geronimo/microprofile/metrics/common/RegistryImpl.java b/geronimo-metrics-common/src/main/java/org/apache/geronimo/microprofile/metrics/common/RegistryImpl.java
index 881450c..1e46b77 100644
--- a/geronimo-metrics-common/src/main/java/org/apache/geronimo/microprofile/metrics/common/RegistryImpl.java
+++ b/geronimo-metrics-common/src/main/java/org/apache/geronimo/microprofile/metrics/common/RegistryImpl.java
@@ -93,6 +93,26 @@
     }
 
     @Override
+    public Counter getCounter(MetricID metricID) {
+        return getMetric(metricID, Counter.class);
+    }
+
+    @Override
+    public Counter counter(final String name) {
+        return counter(Metadata.builder().withName(name).withType(MetricType.COUNTER).build(), NO_TAG);
+    }
+
+    @Override
+    public Counter counter(final String name, final Tag... tags) {
+        return counter(Metadata.builder().withName(name).withType(MetricType.COUNTER).build(), tags);
+    }
+
+    @Override
+    public Counter counter(final MetricID metricID) {
+        return counter(metricID.getName(), metricID.getTagsAsArray());
+    }
+
+    @Override
     public Counter counter(final Metadata metadata) {
         return counter(metadata, NO_TAG);
     }
@@ -120,6 +140,11 @@
     }
 
     @Override
+    public ConcurrentGauge getConcurrentGauge(MetricID metricID) {
+        return getMetric(metricID, ConcurrentGauge.class);
+    }
+
+    @Override
     public ConcurrentGauge concurrentGauge(final String name) {
         return concurrentGauge(Metadata.builder().withName(name).withType(MetricType.CONCURRENT_GAUGE).build());
     }
@@ -162,8 +187,13 @@
     }
 
     @Override
-    public Gauge<?> gauge(final MetricID metricID, final Gauge<?> gauge) {
-        return gauge(metricID.getName(), gauge, metricID.getTagsAsArray());
+    public Gauge<?> getGauge(MetricID metricID) {
+        return getMetric(metricID, Gauge.class);
+    }
+
+    @Override
+    public Gauge<?> gauge(String name, Gauge<?> gauge) {
+        return gauge(new MetricID(name), gauge);
     }
 
     @Override
@@ -172,6 +202,31 @@
     }
 
     @Override
+    public Gauge<?> gauge(final MetricID metricID, final Gauge<?> gauge) {
+        return gauge(metricID.getName(), gauge, metricID.getTagsAsArray());
+    }
+
+    @Override
+    public Histogram getHistogram(MetricID metricID) {
+        return this.getMetric(metricID, Histogram.class);
+    }
+
+    @Override
+    public Histogram histogram(final String name) {
+        return histogram(Metadata.builder().withName(name).withType(MetricType.HISTOGRAM).build());
+    }
+
+    @Override
+    public Histogram histogram(final String name, final Tag... tags) {
+        return histogram(Metadata.builder().withName(name).withType(MetricType.HISTOGRAM).build(), tags);
+    }
+
+    @Override
+    public Histogram histogram(final MetricID metricID) {
+        return histogram(metricID.getName(), metricID.getTagsAsArray());
+    }
+
+    @Override
     public Histogram histogram(final Metadata metadata) {
         return histogram(metadata, NO_TAG);
     }
@@ -198,6 +253,26 @@
     }
 
     @Override
+    public Meter getMeter(MetricID metricID) {
+        return getMetric(metricID, Meter.class);
+    }
+
+    @Override
+    public Meter meter(final String name) {
+        return meter(Metadata.builder().withName(name).withType(MetricType.METERED).build());
+    }
+
+    @Override
+    public Meter meter(final String name, final Tag... tags) {
+        return meter(Metadata.builder().withName(name).withType(MetricType.METERED).build(), tags);
+    }
+
+    @Override
+    public Meter meter(final MetricID metricID) {
+        return meter(metricID.getName(), metricID.getTagsAsArray());
+    }
+
+    @Override
     public Meter meter(final Metadata metadata) {
         return meter(metadata, NO_TAG);
     }
@@ -224,29 +299,8 @@
     }
 
     @Override
-    public Timer timer(final Metadata metadata) {
-        return timer(metadata, NO_TAG);
-    }
-
-    @Override
-    public Timer timer(final Metadata metadata, final Tag... tags) {
-        final MetricID metricID = new MetricID(metadata.getName(), tags);
-        Holder<? extends Metric> holder = metrics.get(metricID);
-        if (holder == null) {
-            holder = new Holder<>(new TimerImpl(metadata.getUnit().orElse(MetricUnits.NONE)), metadata, metricID);
-            final Holder<? extends Metric> existing = metrics.putIfAbsent(metricID, holder);
-            if (existing != null) {
-                holder = existing;
-            }
-        } else if (!metadata.isReusable()) {
-            throw new IllegalArgumentException("Metric " + metadata.getName() + " already exists and is not set as reusable");
-        } else if (!holder.metadata.isReusable()) {
-            throw new IllegalArgumentException("Metric " + metadata.getName() + " already exists and was not set as reusable");
-        }
-        if (!Timer.class.isInstance(holder.metric)) {
-            throw new IllegalArgumentException(holder.metric + " is not a timer");
-        }
-        return Timer.class.cast(holder.metric);
+    public SimpleTimer getSimpleTimer(MetricID metricID) {
+        return getMetric(metricID, SimpleTimer.class);
     }
 
     @Override
@@ -260,6 +314,11 @@
     }
 
     @Override
+    public SimpleTimer simpleTimer(String name) {
+        return simpleTimer(new MetricID(name));
+    }
+
+    @Override
     public SimpleTimer simpleTimer(final String name, final Tag... tags) {
         return simpleTimer(Metadata.builder().withName(name).withType(MetricType.SIMPLE_TIMER).build(), tags);
     }
@@ -286,60 +345,8 @@
     }
 
     @Override
-    public Metric getMetric(final MetricID metricID) {
-        final Holder<? extends Metric> holder = metrics.get(metricID);
-        return holder == null ? null : holder.metric;
-    }
-
-    @Override
-    public Metadata getMetadata(final String name) {
-        final Holder<? extends Metric> holder = metrics.get(new MetricID(name));
-        return holder == null ? null : holder.metadata;
-    }
-
-    @Override
-    public Counter counter(final String name) {
-        return counter(Metadata.builder().withName(name).withType(MetricType.COUNTER).build(), NO_TAG);
-    }
-
-    @Override
-    public Counter counter(final String name, final Tag... tags) {
-        return counter(Metadata.builder().withName(name).withType(MetricType.COUNTER).build(), tags);
-    }
-
-    @Override
-    public Counter counter(final MetricID metricID) {
-        return counter(metricID.getName(), metricID.getTagsAsArray());
-    }
-
-    @Override
-    public Histogram histogram(final String name) {
-        return histogram(Metadata.builder().withName(name).withType(MetricType.HISTOGRAM).build());
-    }
-
-    @Override
-    public Histogram histogram(final String name, final Tag... tags) {
-        return histogram(Metadata.builder().withName(name).withType(MetricType.HISTOGRAM).build(), tags);
-    }
-
-    @Override
-    public Histogram histogram(final MetricID metricID) {
-        return histogram(metricID.getName(), metricID.getTagsAsArray());
-    }
-
-    @Override
-    public Meter meter(final String name) {
-        return meter(Metadata.builder().withName(name).withType(MetricType.METERED).build());
-    }
-
-    @Override
-    public Meter meter(final String name, final Tag... tags) {
-        return meter(Metadata.builder().withName(name).withType(MetricType.METERED).build(), tags);
-    }
-
-    @Override
-    public Meter meter(final MetricID metricID) {
-        return meter(metricID.getName(), metricID.getTagsAsArray());
+    public Timer getTimer(MetricID metricID) {
+        return getMetric(metricID, Timer.class);
     }
 
     @Override
@@ -358,6 +365,47 @@
     }
 
     @Override
+    public Timer timer(final Metadata metadata) {
+        return timer(metadata, NO_TAG);
+    }
+
+    @Override
+    public Timer timer(final Metadata metadata, final Tag... tags) {
+        final MetricID metricID = new MetricID(metadata.getName(), tags);
+        Holder<? extends Metric> holder = metrics.get(metricID);
+        if (holder == null) {
+            holder = new Holder<>(new TimerImpl(metadata.getUnit().orElse(MetricUnits.NONE)), metadata, metricID);
+            final Holder<? extends Metric> existing = metrics.putIfAbsent(metricID, holder);
+            if (existing != null) {
+                holder = existing;
+            }
+        } else if (!metadata.isReusable()) {
+            throw new IllegalArgumentException("Metric " + metadata.getName() + " already exists and is not set as reusable");
+        } else if (!holder.metadata.isReusable()) {
+            throw new IllegalArgumentException("Metric " + metadata.getName() + " already exists and was not set as reusable");
+        }
+        if (!Timer.class.isInstance(holder.metric)) {
+            throw new IllegalArgumentException(holder.metric + " is not a timer");
+        }
+        return Timer.class.cast(holder.metric);
+    }
+
+    @Override
+    public Metric getMetric(final MetricID metricID) {
+        final Holder<? extends Metric> holder = metrics.get(metricID);
+        return holder == null ? null : holder.metric;
+    }
+
+    @Override
+    public <T extends Metric> T getMetric(MetricID metricID, Class<T> asType) {
+        try {
+            return asType.cast(this.getMetric(metricID));
+        } catch (ClassCastException e) {
+            throw new IllegalArgumentException(metricID + " was not of expected type " + asType, e);
+        }
+    }
+
+    @Override
     public boolean remove(final String name) {
         final AtomicBoolean done = new AtomicBoolean(false);
         removeMatching((metricID, metric) -> {
@@ -466,11 +514,24 @@
     }
 
     @Override
+    public <T extends Metric> SortedMap<MetricID, T> getMetrics(Class<T> ofType, MetricFilter filter) {
+        return (SortedMap<MetricID, T>) getMetrics(
+                (metricID, metric) -> filter.matches(metricID, metric)
+                        && ofType.isAssignableFrom(metric.getClass()));
+    }
+
+    @Override
     public Map<MetricID, Metric> getMetrics() {
         return metrics.entrySet().stream().collect(toMap(Map.Entry::getKey, e -> e.getValue().metric));
     }
 
     @Override
+    public Metadata getMetadata(final String name) {
+        final Holder<? extends Metric> holder = metrics.get(new MetricID(name));
+        return holder == null ? null : holder.metadata;
+    }
+
+    @Override
     public Map<String, Metadata> getMetadata() {
         return metrics.entrySet().stream()
                 .collect(toMap(e -> e.getKey().getName(), e -> e.getValue().metadata, (a, b) -> a));