This is an automated email from the ASF dual-hosted git repository.

cschneider pushed a commit to branch SLING-9464-ManagedServiceFactory
in repository 
https://gitbox.apache.org/repos/asf/sling-org-apache-sling-distribution-journal.git

commit 709cfd70a924c51b95d54ab1aa945ec98ed94d93
Author: Christian Schneider <[email protected]>
AuthorDate: Mon May 25 14:32:34 2020 +0200

    SLING-9464 - Use a ManagedServiceFactory to avoid polling
---
 .../shared/PublisherConfigurationAvailable.java    |  49 ++++-----
 .../PublisherConfigurationAvailableTest.java       | 116 ---------------------
 2 files changed, 20 insertions(+), 145 deletions(-)

diff --git 
a/src/main/java/org/apache/sling/distribution/journal/impl/shared/PublisherConfigurationAvailable.java
 
b/src/main/java/org/apache/sling/distribution/journal/impl/shared/PublisherConfigurationAvailable.java
index c0a6db4..eb3bf67 100644
--- 
a/src/main/java/org/apache/sling/distribution/journal/impl/shared/PublisherConfigurationAvailable.java
+++ 
b/src/main/java/org/apache/sling/distribution/journal/impl/shared/PublisherConfigurationAvailable.java
@@ -18,14 +18,15 @@
  */
 package org.apache.sling.distribution.journal.impl.shared;
 
-import java.io.IOException;
+import java.util.Dictionary;
 
 import 
org.apache.sling.distribution.journal.impl.publisher.DistributionPublisher;
 import org.osgi.framework.BundleContext;
-import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.Constants;
 import org.osgi.framework.ServiceRegistration;
-import org.osgi.service.cm.Configuration;
 import org.osgi.service.cm.ConfigurationAdmin;
+import org.osgi.service.cm.ConfigurationException;
+import org.osgi.service.cm.ManagedServiceFactory;
 import org.osgi.service.component.annotations.Activate;
 import org.osgi.service.component.annotations.Component;
 import org.osgi.service.component.annotations.Deactivate;
@@ -33,11 +34,6 @@ import org.osgi.service.component.annotations.Reference;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import static 
org.apache.sling.commons.scheduler.Scheduler.PROPERTY_SCHEDULER_CONCURRENT;
-import static 
org.apache.sling.commons.scheduler.Scheduler.PROPERTY_SCHEDULER_IMMEDIATE;
-import static 
org.apache.sling.commons.scheduler.Scheduler.PROPERTY_SCHEDULER_PERIOD;
-import static org.osgi.service.cm.ConfigurationAdmin.SERVICE_FACTORYPID;
-
 /**
  * This task periodically checks for DistributionPublisher agent
  * configuration availability and registers the marker service
@@ -47,13 +43,9 @@ import static 
org.osgi.service.cm.ConfigurationAdmin.SERVICE_FACTORYPID;
  * This task is meant to be executed on every instance, even in a cluster.
  */
 @Component(
-        property = {
-                PROPERTY_SCHEDULER_CONCURRENT + ":Boolean=false",
-                PROPERTY_SCHEDULER_IMMEDIATE + ":Boolean=false",
-                PROPERTY_SCHEDULER_PERIOD + ":Long=" + 60, // 1 minute
-        }
+        property = { Constants.SERVICE_PID + "=" + 
DistributionPublisher.FACTORY_PID}
 )
-public class PublisherConfigurationAvailable implements Runnable {
+public class PublisherConfigurationAvailable implements ManagedServiceFactory {
 
     private static final Logger LOG = 
LoggerFactory.getLogger(PublisherConfigurationAvailable.class);
 
@@ -81,28 +73,27 @@ public class PublisherConfigurationAvailable implements 
Runnable {
         }
     }
 
+    protected boolean isAvailable() {
+        return reg != null;
+    }
+
     @Override
-    public void run() {
+    public String getName() {
+        return "DistributionPublisher marker";
+    }
+
+    @Override
+    public void updated(String pid, Dictionary<String, ?> properties) throws 
ConfigurationException {
         synchronized (lock) {
-            if (reg == null && hasPublisherConfigurations()) {
+            if (reg == null) {
                 reg = 
context.registerService(PublisherConfigurationAvailable.class, this, null);
                 LOG.info("Registered marker service");
             }
         }
     }
 
-    protected boolean isAvailable() {
-        return reg != null;
-    }
-
-    private boolean hasPublisherConfigurations() {
-        String filter = "(" + SERVICE_FACTORYPID + "=" + 
DistributionPublisher.FACTORY_PID + ")";
-        try {
-            Configuration[] configs = configAdmin.listConfigurations(filter);
-            return configs != null && configs.length > 0;
-        } catch (IOException | InvalidSyntaxException e) {
-            LOG.warn("Failed to search for DistributionPublisher agent 
configurations", e);
-        }
-        return false;
+    @Override
+    public void deleted(String pid) {
+        // We keep the registration up even if the config goes away
     }
 }
diff --git 
a/src/test/java/org/apache/sling/distribution/journal/impl/shared/PublisherConfigurationAvailableTest.java
 
b/src/test/java/org/apache/sling/distribution/journal/impl/shared/PublisherConfigurationAvailableTest.java
deleted file mode 100644
index 9b968e9..0000000
--- 
a/src/test/java/org/apache/sling/distribution/journal/impl/shared/PublisherConfigurationAvailableTest.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * 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.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.runners.MockitoJUnitRunner;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.ServiceRegistration;
-import org.osgi.service.cm.Configuration;
-import org.osgi.service.cm.ConfigurationAdmin;
-
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-import static org.mockito.Mockito.*;
-import static org.mockito.Mockito.when;
-
-@RunWith(MockitoJUnitRunner.class)
-public class PublisherConfigurationAvailableTest {
-
-    @InjectMocks
-    private PublisherConfigurationAvailable pca;
-
-    @Mock
-    private BundleContext context;
-
-    @Mock
-    private ConfigurationAdmin configAdmin;
-
-    @Before
-    public void before() throws Exception {
-        ServiceRegistration<PublisherConfigurationAvailable> serviceReg = 
mock(ServiceRegistration.class);
-        
when(context.registerService(eq(PublisherConfigurationAvailable.class), 
any(PublisherConfigurationAvailable.class), any()))
-                .thenReturn(serviceReg);
-        when(configAdmin.listConfigurations(anyString()))
-                .thenReturn(null);
-        pca.activate(context);
-    }
-
-    @After
-    public void after() {
-        pca.deactivate();
-    }
-
-    @Test
-    public void testNoConfiguration() {
-        assertFalse(pca.isAvailable());
-        pca.run();
-        assertFalse(pca.isAvailable());
-    }
-
-    @Test
-    public void testWithZeroConfiguration() throws Exception {
-        assertFalse(pca.isAvailable());
-        addConfigurations(0);
-        pca.run();
-        assertFalse(pca.isAvailable());
-    }
-
-    @Test
-    public void testWithOneConfiguration() throws Exception {
-        assertFalse(pca.isAvailable());
-        addConfigurations(1);
-        pca.run();
-        assertTrue(pca.isAvailable());
-    }
-
-    @Test
-    public void testWithManyConfigurations() throws Exception {
-        assertFalse(pca.isAvailable());
-        addConfigurations(10);
-        pca.run();
-        assertTrue(pca.isAvailable());
-    }
-    
-    @Test
-    public void testRemainAvailable() throws Exception {
-        addConfigurations(1);
-        pca.run();
-        assertTrue(pca.isAvailable());
-        removeAllConfigurations();
-        pca.run();
-        assertTrue(pca.isAvailable());
-    }
-    
-    private void removeAllConfigurations() throws Exception {
-        when(configAdmin.listConfigurations(anyString()))
-                .thenReturn(null);
-    }
-
-    private void addConfigurations(int nbConfigurations) throws Exception {
-        when(configAdmin.listConfigurations(anyString()))
-                .thenReturn(new Configuration[nbConfigurations]);
-    }
-
-}
\ No newline at end of file

Reply via email to