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");