ensure winegrower.properties also configured DefaultConfigurationAdmin
diff --git a/winegrower-core/src/main/asciidoc/index.adoc b/winegrower-core/src/main/asciidoc/index.adoc
index 61cd6a0..156747c 100644
--- a/winegrower-core/src/main/asciidoc/index.adoc
+++ b/winegrower-core/src/main/asciidoc/index.adoc
@@ -24,6 +24,8 @@
=== Package default configuration
-The configuration is takend from the agent by default but you can also embed some default values for your convenience.
+The configuration is taken from the agent by default but you can also embed some default values for your convenience.
This is done providing a `winegrower.properties` in the agent classloader. It takes the same configuration as the agent.
+TIP: you can also pass `winegrower.service.*` properties in this file.
+
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 917ff6d..26b8792 100644
--- a/winegrower-core/src/main/java/org/apache/winegrower/Ripener.java
+++ b/winegrower-core/src/main/java/org/apache/winegrower/Ripener.java
@@ -38,6 +38,7 @@
import java.util.ArrayList;
import java.util.Collection;
import java.util.Dictionary;
+import java.util.HashMap;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;
@@ -201,7 +202,7 @@
if (configurationAdminIterator.hasNext()) {
return configurationAdminIterator.next();
}
- return new DefaultConfigurationAdmin();
+ return new DefaultConfigurationAdmin(new HashMap<>());
}
public void loadConfiguration(final InputStream stream) throws IOException {
@@ -276,6 +277,15 @@
}
});
+ if (DefaultConfigurationAdmin.class.isInstance(configurationAdmin)) {
+ final DefaultConfigurationAdmin dca = DefaultConfigurationAdmin.class.cast(configurationAdmin);
+ embedConfig.stringPropertyNames()
+ .stream()
+ .filter(it -> it.startsWith("winegrower.service."))
+ .peek(matched::add)
+ .forEach(key -> dca.getProvidedConfiguration().put(key, embedConfig.getProperty(key)));
+ }
+
embedConfig.stringPropertyNames().stream().filter(it -> !matched.contains(it.toLowerCase(ROOT)))
.forEach(it -> LOGGER.warn("Didn't match configuration {}, did you mispell it?", it));
}
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 bbe3d9b..e66d821 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
@@ -43,26 +43,35 @@
private final static String WINEGROWER_CONFIG_PATH = "winegrower.config.path";
private final static String WINEGROWER_CONFIG_EXTENSION = ".cfg";
+ private final Map<String, String> providedConfiguration;
private final Map<String, Configuration> configurations = new HashMap<>();
+ public DefaultConfigurationAdmin(final Map<String, String> providedConfiguration) {
+ this.providedConfiguration = providedConfiguration;
+ }
+
+ public Map<String, String> getProvidedConfiguration() {
+ return providedConfiguration;
+ }
+
@Override
public Configuration createFactoryConfiguration(final String pid) {
- return new DefaultConfiguration(pid, null, null);
+ return new DefaultConfiguration(providedConfiguration, pid, null, null);
}
@Override
public Configuration createFactoryConfiguration(final String pid, final String location) {
- return new DefaultConfiguration(pid, null, location);
+ return new DefaultConfiguration(providedConfiguration, pid, null, location);
}
@Override
public Configuration getConfiguration(final String pid, final String location) {
- return configurations.computeIfAbsent(pid, p -> new DefaultConfiguration(null, p, location));
+ return configurations.computeIfAbsent(pid, p -> new DefaultConfiguration(providedConfiguration, null, p, location));
}
@Override
public Configuration getConfiguration(final String pid) {
- return configurations.computeIfAbsent(pid, p -> new DefaultConfiguration(null, p, null));
+ return configurations.computeIfAbsent(pid, p -> new DefaultConfiguration(providedConfiguration, null, p, null));
}
@Override
@@ -82,11 +91,14 @@
private final String pid;
private final Map<String, String> defaultConfig = new HashMap<>();
private final File defaultExternalConfigLocation;
+ private final Map<String, String> configRegistry;
private String location;
private final Hashtable<String, Object> properties;
private final AtomicLong changeCount = new AtomicLong();
- private DefaultConfiguration(final String factoryPid, final String pid, final String location) {
+ private DefaultConfiguration(final Map<String, String> configRegistry,
+ final String factoryPid, final String pid, final String location) {
+ this.configRegistry = configRegistry;
this.factoryPid = factoryPid;
this.pid = pid;
this.location = location;
@@ -104,6 +116,8 @@
}
private void loadConfig(final String pid) {
+ final String prefix = "winegrower.service." + pid + "."; // for "global" registries like system props
+
// we first read the config from the classpath (lowest priority)
try (final InputStream embedConfig = Thread.currentThread().getContextClassLoader()
.getResourceAsStream(pid + WINEGROWER_CONFIG_EXTENSION)) {
@@ -115,6 +129,11 @@
}
properties.putAll(defaultConfig);
+ // then the default registry which is considered "in JVM" so less prioritized than external config
+ configRegistry.entrySet().stream()
+ .filter(it -> it.getKey().startsWith(prefix))
+ .forEach(entry -> properties.put(entry.getKey().substring(prefix.length()), entry.getValue()));
+
// then from an external file
if (defaultExternalConfigLocation.isFile()) {
try (final InputStream stream = new FileInputStream(defaultExternalConfigLocation)) {
@@ -125,7 +144,6 @@
}
// and finally from system properties
- final String prefix = "winegrower.service." + pid + ".";
System.getProperties().stringPropertyNames().stream()
.filter(it -> it.startsWith(prefix))
.forEach(key -> properties.put(key.substring(prefix.length()), System.getProperty(key)));
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 c0aa517..6fe5c0d 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,39 +13,41 @@
*/
package org.apache.winegrower.service;
+import static java.util.Collections.emptyMap;
+
+import java.io.File;
+
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.osgi.service.cm.Configuration;
-import java.io.File;
-
-public class DefaultConfigurationAdminTest {
+class DefaultConfigurationAdminTest {
@Test
@DisplayName("Should return value from system property")
- public void systemPropertiesTest() throws Exception {
+ void systemPropertiesTest() {
System.setProperty("winegrower.service.test.foo", "bar");
- DefaultConfigurationAdmin configurationAdmin = new DefaultConfigurationAdmin();
+ DefaultConfigurationAdmin configurationAdmin = new DefaultConfigurationAdmin(emptyMap());
Configuration configuration = configurationAdmin.getConfiguration("test");
Assertions.assertEquals("bar", configuration.getProperties().get("foo"));
}
@Test
@DisplayName("Should return value from cfg file in classpath")
- public void externalConfigClasspathTest() throws Exception {
- DefaultConfigurationAdmin configurationAdmin = new DefaultConfigurationAdmin();
+ void externalConfigClasspathTest() {
+ DefaultConfigurationAdmin configurationAdmin = new DefaultConfigurationAdmin(emptyMap());
Configuration configuration = configurationAdmin.getConfiguration("external.test");
Assertions.assertEquals("bar", configuration.getProperties().get("foo"));
}
@Test
@DisplayName("Should return value from cfg file in winegrower.config.path location")
- public void externalConfigPathTest() throws Exception {
+ void externalConfigPathTest() {
File file = new File("src/test/resources");
System.out.println(file.getAbsolutePath());
System.setProperty("winegrower.config.path", "src/test/resources");
- DefaultConfigurationAdmin configurationAdmin = new DefaultConfigurationAdmin();
+ DefaultConfigurationAdmin configurationAdmin = new DefaultConfigurationAdmin(emptyMap());
Configuration configuration = configurationAdmin.getConfiguration("external.test");
Assertions.assertEquals("bar", configuration.getProperties().get("foo"));
}