Merge pull request #5 from cschneider/SLING-8443

SLING-8443 - Simplify journal_available metric

* Improve test coverage
diff --git a/src/main/java/org/apache/sling/distribution/journal/impl/shared/DistributionMetricsService.java b/src/main/java/org/apache/sling/distribution/journal/impl/shared/DistributionMetricsService.java
index 24474ac..a81630c 100644
--- a/src/main/java/org/apache/sling/distribution/journal/impl/shared/DistributionMetricsService.java
+++ b/src/main/java/org/apache/sling/distribution/journal/impl/shared/DistributionMetricsService.java
@@ -19,33 +19,25 @@
 package org.apache.sling.distribution.journal.impl.shared;
 
 import org.apache.sling.commons.metrics.Counter;
-import org.apache.sling.commons.metrics.Gauge;
 import org.apache.sling.commons.metrics.Histogram;
 import org.apache.sling.commons.metrics.Meter;
 import org.apache.sling.commons.metrics.MetricsService;
 import org.apache.sling.commons.metrics.Timer;
-import org.apache.sling.distribution.journal.JournalAvailable;
 
-import java.util.Dictionary;
-import java.util.Hashtable;
 import java.util.concurrent.Callable;
 
 import org.osgi.framework.BundleContext;
-import org.osgi.framework.Constants;
-import org.osgi.framework.ServiceRegistration;
 import org.osgi.service.component.annotations.Activate;
 import org.osgi.service.component.annotations.Component;
-import org.osgi.service.component.annotations.Deactivate;
 import org.osgi.service.component.annotations.Reference;
 
 import static java.lang.String.format;
-import static org.osgi.service.component.annotations.ReferenceCardinality.OPTIONAL;
-import static org.osgi.service.component.annotations.ReferencePolicy.DYNAMIC;
 
 @Component(service = DistributionMetricsService.class)
 public class DistributionMetricsService {
 
-    private static final String BASE_COMPONENT = "distribution.journal";
+
+    public static final String BASE_COMPONENT = "distribution.journal";
 
     private static final String PUB_COMPONENT = BASE_COMPONENT + ".publisher";
 
@@ -88,12 +80,6 @@
 
     private Counter queueCacheFetchCount;
 
-    /** Marker service. Indicates journal availability */
-    @Reference(cardinality = OPTIONAL, policy = DYNAMIC)
-    private volatile JournalAvailable journalAvailable;
-
-    private ServiceRegistration<Gauge> availableStatusReg;
-
     @Activate
     public void activate(BundleContext context) {
         cleanupPackageRemovedCount = getCounter(getMetricName(PUB_COMPONENT, "cleanup_package_removed_count"));
@@ -114,18 +100,6 @@
         sendStoredStatusDuration = getTimer(getMetricName(SUB_COMPONENT, "send_stored_status_duration"));
         processQueueItemDuration = getTimer(getMetricName(SUB_COMPONENT, "process_queue_item_duration"));
         packageDistributedDuration = getTimer(getMetricName(SUB_COMPONENT, "request_distributed_duration"));
-        final Dictionary<String, String> regProps = new Hashtable<>();
-        regProps.put(Constants.SERVICE_DESCRIPTION, "Journal Availablility Status");
-        regProps.put(Constants.SERVICE_VENDOR, "The Apache Software Foundation");
-        regProps.put("name", getMetricName(BASE_COMPONENT, "journal_available"));
-        availableStatusReg = context.registerService(Gauge.class, () -> journalAvailable != null, regProps);
-    }
-
-    @Deactivate
-    public void deactivate() {
-        if (availableStatusReg != null) {
-            availableStatusReg.unregister();
-        }
     }
 
     /**
diff --git a/src/main/java/org/apache/sling/distribution/journal/impl/shared/JournalAvailableChecker.java b/src/main/java/org/apache/sling/distribution/journal/impl/shared/JournalAvailableChecker.java
index c0ad8f9..4fc2540 100644
--- a/src/main/java/org/apache/sling/distribution/journal/impl/shared/JournalAvailableChecker.java
+++ b/src/main/java/org/apache/sling/distribution/journal/impl/shared/JournalAvailableChecker.java
@@ -61,15 +61,6 @@
 
     private volatile ServiceRegistration<JournalAvailable> reg;
 
-    public JournalAvailableChecker(){
-
-    }
-
-    public JournalAvailableChecker(MessagingProvider provider, Topics topics) {
-        this.provider = provider;
-        this.topics = topics;
-    }
-
     @Activate
     public void activate(BundleContext context) {
         requireNonNull(provider);
diff --git a/src/main/java/org/apache/sling/distribution/journal/impl/shared/JournalAvailableGauge.java b/src/main/java/org/apache/sling/distribution/journal/impl/shared/JournalAvailableGauge.java
new file mode 100644
index 0000000..deefbfd
--- /dev/null
+++ b/src/main/java/org/apache/sling/distribution/journal/impl/shared/JournalAvailableGauge.java
@@ -0,0 +1,39 @@
+/*
+ * 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.sling.distribution.journal.impl.shared;
+
+import org.apache.sling.commons.metrics.Gauge;
+import org.osgi.framework.Constants;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Reference;
+
+@Component(property = { 
+        Constants.SERVICE_DESCRIPTION + "=Journal Availablility Status",
+        Constants.SERVICE_VENDOR + "=The Apache Software Foundation",
+        "name=" + DistributionMetricsService.BASE_COMPONENT + ".journal_available"})
+public class JournalAvailableGauge implements Gauge<Boolean>{
+    @Reference
+    private JournalAvailableChecker journalChecker;
+
+    @Override
+    public Boolean getValue() {
+        return journalChecker.isAvailable();
+    }
+
+}
diff --git a/src/test/java/org/apache/sling/distribution/journal/impl/shared/JournalAvailableCheckerTest.java b/src/test/java/org/apache/sling/distribution/journal/impl/shared/JournalAvailableCheckerTest.java
index dc2ac70..3226b8e 100644
--- a/src/test/java/org/apache/sling/distribution/journal/impl/shared/JournalAvailableCheckerTest.java
+++ b/src/test/java/org/apache/sling/distribution/journal/impl/shared/JournalAvailableCheckerTest.java
@@ -18,6 +18,14 @@
  */
 package org.apache.sling.distribution.journal.impl.shared;
 
+import static java.util.Collections.emptyMap;
+import static java.util.Collections.singletonMap;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.when;
+import static org.osgi.util.converter.Converters.standardConverter;
+
 import java.util.Map;
 
 import org.apache.sling.distribution.journal.JournalAvailable;
@@ -26,25 +34,21 @@
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
 import org.mockito.Mock;
 import org.mockito.Mockito;
-import org.mockito.MockitoAnnotations;
 import org.mockito.Spy;
+import org.mockito.runners.MockitoJUnitRunner;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.ServiceRegistration;
 
-import static java.util.Collections.emptyMap;
-import static java.util.Collections.singletonMap;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.assertFalse;
-import static org.mockito.Mockito.when;
-import static org.mockito.Mockito.doThrow;
-import static org.osgi.util.converter.Converters.standardConverter;
-
+@RunWith(MockitoJUnitRunner.class)
 public class JournalAvailableCheckerTest {
 
     private static final String INVALID_TOPIC = "invalid_topic_name";
 
+    @InjectMocks
     private JournalAvailableChecker checker;
 
     @Spy
@@ -58,15 +62,13 @@
 
     @Mock
     private ServiceRegistration<JournalAvailable> reg;
-
+    
     @Before
     public void before() throws Exception {
-        MockitoAnnotations.initMocks(this);
         doThrow(new MessagingException("topic is invalid"))
                 .when(provider).assertTopic(INVALID_TOPIC);
         when(context.registerService(Mockito.eq(JournalAvailable.class), Mockito.any(JournalAvailable.class), Mockito.any()))
                 .thenReturn(reg);
-        checker = new JournalAvailableChecker(provider, topics);
         checker.activate(context);
     }
 
diff --git a/src/test/java/org/apache/sling/distribution/journal/impl/shared/JournalAvalableGaugeTest.java b/src/test/java/org/apache/sling/distribution/journal/impl/shared/JournalAvalableGaugeTest.java
new file mode 100644
index 0000000..e3cfb61
--- /dev/null
+++ b/src/test/java/org/apache/sling/distribution/journal/impl/shared/JournalAvalableGaugeTest.java
@@ -0,0 +1,47 @@
+/*
+ * 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.sling.distribution.journal.impl.shared;
+
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.junit.Assert.assertThat;
+import static org.mockito.Mockito.when;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.runners.MockitoJUnitRunner;
+
+@RunWith(MockitoJUnitRunner.class)
+public class JournalAvalableGaugeTest {
+
+    @Mock
+    JournalAvailableChecker journalChecker;
+    
+    @InjectMocks
+    private JournalAvailableGauge journalAvailableGauge;
+
+    @Test
+    public void test() {
+        when(journalChecker.isAvailable()).thenReturn(true, false);
+        assertThat(journalAvailableGauge.getValue(), equalTo(true));
+        assertThat(journalAvailableGauge.getValue(), equalTo(false));
+    }
+    
+}