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 +}