Merge pull request #19 from rmannibucau/rmannibucau/enable-to-preload-configuration
enable to preload configuration
diff --git a/winegrower-core/src/main/java/org/apache/winegrower/Ripener.java b/winegrower-core/src/main/java/org/apache/winegrower/Ripener.java
index 84b336f..50c0918 100644
--- a/winegrower-core/src/main/java/org/apache/winegrower/Ripener.java
+++ b/winegrower-core/src/main/java/org/apache/winegrower/Ripener.java
@@ -139,6 +139,15 @@
"johnzon-osgi",
"pax-web-runtime",
"org.apache.aries.cdi");
+ private List<String> defaultConfigurationAdminPids;
+
+ public List<String> getDefaultConfigurationAdminPids() {
+ return defaultConfigurationAdminPids;
+ }
+
+ public void setDefaultConfigurationAdminPids(final List<String> defaultConfigurationAdminPids) {
+ this.defaultConfigurationAdminPids = defaultConfigurationAdminPids;
+ }
public boolean isLazyInstall() {
return lazyInstall;
@@ -260,6 +269,11 @@
throw new IllegalArgumentException(e.getTargetException());
}
});
+ ofNullable(properties.getProperty("winegrower.ripener.configuration.defaultConfigurationAdminPids"))
+ .ifPresent(it -> setDefaultConfigurationAdminPids(Stream.of(it.split(","))
+ .map(String::trim)
+ .filter(v -> !v.isEmpty())
+ .collect(toList())));
}
}
@@ -284,18 +298,21 @@
this.services = new OSGiServices(this, configurationListeners, eventListeners);
this.registry = new BundleRegistry(services, configuration);
- this.configurationAdmin = loadConfigurationAdmin(configurationListeners);
- this.eventAdmin = loadEventAdmin(eventListeners);
- registerBuiltInService(ConfigurationAdmin.class, this.configurationAdmin, new Hashtable<>());
- registerBuiltInService(EventAdmin.class, this.eventAdmin, new Hashtable<>());
- registerBuiltInService(org.osgi.service.log.LoggerFactory.class, loadLoggerFactory(), new Hashtable<>());
-
try (final InputStream stream = Thread.currentThread().getContextClassLoader()
.getResourceAsStream("winegrower.properties")) {
loadConfiguration(stream);
} catch (final IOException e) {
LOGGER.warn(e.getMessage());
}
+
+ this.configurationAdmin = loadConfigurationAdmin(configurationListeners);
+ this.eventAdmin = loadEventAdmin(eventListeners);
+ registerBuiltInService(ConfigurationAdmin.class, this.configurationAdmin, new Hashtable<>());
+ registerBuiltInService(EventAdmin.class, this.eventAdmin, new Hashtable<>());
+ registerBuiltInService(org.osgi.service.log.LoggerFactory.class, loadLoggerFactory(), new Hashtable<>());
+ if (DefaultConfigurationAdmin.class.isInstance(configurationAdmin)) {
+ DefaultConfigurationAdmin.class.cast(configurationAdmin).preload(configuration.getDefaultConfigurationAdminPids());
+ }
}
public <T> void registerBuiltInService(final Class<T> type, final T impl, final Dictionary<String, Object> props) {
diff --git a/winegrower-core/src/main/java/org/apache/winegrower/service/DefaultConfigurationAdmin.java b/winegrower-core/src/main/java/org/apache/winegrower/service/DefaultConfigurationAdmin.java
index b7f9f2b..e04d387 100644
--- a/winegrower-core/src/main/java/org/apache/winegrower/service/DefaultConfigurationAdmin.java
+++ b/winegrower-core/src/main/java/org/apache/winegrower/service/DefaultConfigurationAdmin.java
@@ -13,11 +13,15 @@
*/
package org.apache.winegrower.service;
-import static java.util.Arrays.asList;
-import static java.util.Collections.list;
-import static java.util.Optional.ofNullable;
-import static java.util.function.Function.identity;
-import static java.util.stream.Collectors.toMap;
+import org.apache.winegrower.lang.Substitutor;
+import org.osgi.framework.Filter;
+import org.osgi.framework.FrameworkUtil;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.cm.Configuration;
+import org.osgi.service.cm.ConfigurationAdmin;
+import org.osgi.service.cm.ConfigurationEvent;
+import org.osgi.service.cm.ConfigurationListener;
import java.io.File;
import java.io.FileInputStream;
@@ -31,21 +35,18 @@
import java.util.HashMap;
import java.util.HashSet;
import java.util.Hashtable;
+import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Properties;
import java.util.Set;
import java.util.concurrent.atomic.AtomicLong;
-import org.apache.winegrower.lang.Substitutor;
-import org.osgi.framework.Filter;
-import org.osgi.framework.FrameworkUtil;
-import org.osgi.framework.InvalidSyntaxException;
-import org.osgi.framework.ServiceReference;
-import org.osgi.service.cm.Configuration;
-import org.osgi.service.cm.ConfigurationAdmin;
-import org.osgi.service.cm.ConfigurationEvent;
-import org.osgi.service.cm.ConfigurationListener;
+import static java.util.Arrays.asList;
+import static java.util.Collections.list;
+import static java.util.Optional.ofNullable;
+import static java.util.function.Function.identity;
+import static java.util.stream.Collectors.toMap;
public abstract class DefaultConfigurationAdmin implements ConfigurationAdmin {
@@ -65,6 +66,13 @@
this.configurationListeners = configurationListeners;
}
+ public void preload(final List<String> names) {
+ if (names == null || names.isEmpty()) {
+ return;
+ }
+ names.forEach(it -> getConfiguration(it).setBundleLocation(null));
+ }
+
public Map<String, String> getProvidedConfiguration() {
return providedConfiguration;
}
diff --git a/winegrower-core/src/test/java/org/apache/winegrower/service/DefaultConfigurationAdminTest.java b/winegrower-core/src/test/java/org/apache/winegrower/service/DefaultConfigurationAdminTest.java
index 7b9cd56..47d2118 100644
--- a/winegrower-core/src/test/java/org/apache/winegrower/service/DefaultConfigurationAdminTest.java
+++ b/winegrower-core/src/test/java/org/apache/winegrower/service/DefaultConfigurationAdminTest.java
@@ -13,18 +13,26 @@
*/
package org.apache.winegrower.service;
-import static java.util.Collections.emptyList;
-import static java.util.Collections.emptyMap;
-
-import java.io.File;
-import java.util.Hashtable;
-
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.TestInfo;
import org.osgi.framework.ServiceReference;
import org.osgi.service.cm.Configuration;
import org.osgi.service.cm.ConfigurationAdmin;
+import org.osgi.service.cm.ConfigurationEvent;
+import org.osgi.service.cm.ConfigurationListener;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+import static java.util.Collections.emptyList;
+import static java.util.Collections.emptyMap;
+import static java.util.Collections.singletonList;
+import static org.junit.jupiter.api.Assertions.assertTrue;
class DefaultConfigurationAdminTest {
@@ -36,6 +44,27 @@
};
@Test
+ @DisplayName("Configuration creation can be forced - ConfigurationListener case")
+ void preload(final TestInfo info) {
+ final List<ConfigurationListener> listeners = new ArrayList<>();
+ final DefaultConfigurationAdmin configurationAdmin = new DefaultConfigurationAdmin(emptyMap(), listeners) {
+ @Override
+ protected ServiceReference<ConfigurationAdmin> getSelfReference() { // not needed for this tests
+ return new ServiceReferenceImpl<>(new Hashtable<>(), null, null);
+ }
+ };
+ final String pid = info.getTestClass().orElseThrow(IllegalStateException::new).getName() + "." +
+ info.getTestMethod().orElseThrow(IllegalStateException::new).getName() + ".pid";
+ final String key = "foo";
+ System.setProperty(pid + "." + key, "set");
+ final AtomicBoolean called = new AtomicBoolean();
+ listeners.add(event -> called.set(true));
+ configurationAdmin.preload(singletonList(pid));
+ System.clearProperty(pid + "." + key);
+ assertTrue(called.get());
+ }
+
+ @Test
@DisplayName("Should return value from system property")
void systemPropertiesTest() {
System.setProperty("winegrower.service.test.foo", "bar");