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

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


The following commit(s) were added to refs/heads/master by this push:
     new dfe4380  SLING-9464 - Use a ManagedServiceFactory to avoid polling 
(#36)
dfe4380 is described below

commit dfe4380123bcda9fff536da5ab5dab6ddf858e42
Author: Christian Schneider <ch...@die-schneider.net>
AuthorDate: Mon May 25 15:31:30 2020 +0200

    SLING-9464 - Use a ManagedServiceFactory to avoid polling (#36)
---
 .../shared/PublisherConfigurationAvailable.java    | 50 +++++------
 .../PublisherConfigurationAvailableTest.java       | 99 ++++++----------------
 2 files changed, 49 insertions(+), 100 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..5def842 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,10 @@ 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
-        }
+        immediate = true,
+        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 +74,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
index 9b968e9..b8ee5ce 100644
--- 
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
@@ -18,99 +18,56 @@
  */
 package org.apache.sling.distribution.journal.impl.shared;
 
-import org.junit.After;
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.junit.Assert.assertThat;
+import static org.mockito.Mockito.when;
+
+import java.util.Dictionary;
+import java.util.Hashtable;
+
 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.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;
+import org.osgi.service.cm.ConfigurationException;
 
 @RunWith(MockitoJUnitRunner.class)
 public class PublisherConfigurationAvailableTest {
 
-    @InjectMocks
-    private PublisherConfigurationAvailable pca;
-
+    private PublisherConfigurationAvailable configAvailable;
+    
     @Mock
     private BundleContext context;
 
     @Mock
-    private ConfigurationAdmin configAdmin;
+    private ServiceRegistration<PublisherConfigurationAvailable> reg;
 
     @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());
+    public void before() {
+        configAvailable = new PublisherConfigurationAvailable();
+        configAvailable.activate(context);
     }
 
     @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());
+    public void testNoConfig() {
+        assertThat(configAvailable.isAvailable(), equalTo(false));
     }
     
     @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]);
+    public void testConfig() throws ConfigurationException {
+        
when(context.registerService(Mockito.eq(PublisherConfigurationAvailable.class), 
Mockito.eq(configAvailable), Mockito.anyObject()))
+            .thenReturn(reg);
+        
+        Dictionary<String, ?> properties = new Hashtable<>();
+        configAvailable.updated("any", properties);
+        assertThat(configAvailable.isAvailable(), equalTo(true));
+        
+        configAvailable.deleted("any");
+        assertThat(configAvailable.isAvailable(), equalTo(true));
     }
 
-}
\ No newline at end of file
+}

Reply via email to