diff --git a/services/staticcm/pom.xml b/services/staticcm/pom.xml
index 3ba420d..46bb0b0 100644
--- a/services/staticcm/pom.xml
+++ b/services/staticcm/pom.xml
@@ -55,7 +55,7 @@
!org.osgi.service.cm,
*
- org.osgi.service.cm;version=1.6
+ org.osgi.service.cm;provider:=true
org.apache.karaf.services.staticcm,
org.apache.felix.utils.properties
@@ -77,10 +77,11 @@
org.osgi.core
provided
-
+
org.osgi
- org.osgi.compendium
- provided
+ org.osgi.service.cm
+ 1.6.0
+ provided
org.apache.felix
diff --git a/services/staticcm/src/main/java/org/apache/karaf/services/staticcm/Configurations.java b/services/staticcm/src/main/java/org/apache/karaf/services/staticcm/Configurations.java
index dd33b45..4edfe0b 100644
--- a/services/staticcm/src/main/java/org/apache/karaf/services/staticcm/Configurations.java
+++ b/services/staticcm/src/main/java/org/apache/karaf/services/staticcm/Configurations.java
@@ -31,33 +31,44 @@
import java.util.Properties;
import org.apache.felix.utils.properties.InterpolationHelper;
+import org.apache.felix.utils.properties.TypedProperties;
import org.osgi.framework.BundleContext;
import org.osgi.framework.Constants;
import org.osgi.service.cm.Configuration;
+import org.osgi.service.cm.ConfigurationAdmin;
public class Configurations {
public static List loadConfigurations(BundleContext context, File directory) throws IOException {
- Map> configs = new HashMap<>();
+ Map> configs = new HashMap<>();
File[] files = directory.listFiles();
+
+ final InterpolationHelper.SubstitutionCallback cb = new InterpolationHelper.BundleContextSubstitutionCallback(context);
+ TypedProperties.SubstitutionCallback substitutionCallback = (name, key, value) -> cb.getValue(value);
+
if (files != null) {
for (File file : files) {
if (file.getName().endsWith(".cfg")) {
try (InputStream in = new BufferedInputStream(new FileInputStream(file))) {
- final Properties p = new Properties();
+
in.mark(1);
boolean isXml = in.read() == '<';
in.reset();
if (isXml) {
+ final Properties p = new Properties();
p.loadFromXML(in);
+
+ Map strMap = new HashMap<>();
+ for (Object k : p.keySet()) {
+ strMap.put(k.toString(), p.getProperty(k.toString()));
+ }
+ configs.put(file.getName(), strMap);
} else {
- p.load(in);
+ TypedProperties prop = new TypedProperties(substitutionCallback);
+ prop.load(in);
+ configs.put(file.getName(), prop);
}
- Map strMap = new HashMap<>();
- for (Object k : p.keySet()) {
- strMap.put(k.toString(), p.getProperty(k.toString()));
- }
- configs.put(file.getName(), strMap);
+
}
}
}
@@ -65,14 +76,30 @@
return createConfigurations(context, configs);
}
- public static List createConfigurations(BundleContext context, Map> configs) {
+ public static List createConfigurations(BundleContext context, Map> configs) {
List configurations = new ArrayList<>();
- for (Map.Entry> entry : configs.entrySet()) {
+ for (Map.Entry> entry : configs.entrySet()) {
String pid[] = parsePid(entry.getKey());
- Map cfg = entry.getValue();
- InterpolationHelper.performSubstitution(cfg, context);
- cfg.put(Constants.SERVICE_PID, pid[0]);
- configurations.add(new StaticConfigurationImpl(pid[0], pid[1], new Hashtable<>(cfg)));
+ Map cfg = entry.getValue();
+
+ String servicePid;
+ String factoryPid;
+
+ if (pid[1] == null) {
+ servicePid = pid[0];
+ factoryPid = null;
+ cfg.put(Constants.SERVICE_PID, pid[0]);
+ } else {
+ servicePid = pid[0] + "." + pid[1];
+ factoryPid = pid[0];
+
+ }
+
+ cfg.put(Constants.SERVICE_PID, servicePid);
+ if (factoryPid != null) {
+ cfg.put(ConfigurationAdmin.SERVICE_FACTORYPID, factoryPid);
+ }
+ configurations.add(new StaticConfigurationImpl(servicePid, factoryPid, new Hashtable<>(cfg)));
}
return configurations;
}
diff --git a/services/staticcm/src/main/java/org/apache/karaf/services/staticcm/StaticConfigAdminImpl.java b/services/staticcm/src/main/java/org/apache/karaf/services/staticcm/StaticConfigAdminImpl.java
index 0d353fa..123cf95 100644
--- a/services/staticcm/src/main/java/org/apache/karaf/services/staticcm/StaticConfigAdminImpl.java
+++ b/services/staticcm/src/main/java/org/apache/karaf/services/staticcm/StaticConfigAdminImpl.java
@@ -39,7 +39,7 @@
public class StaticConfigAdminImpl implements ConfigurationAdmin {
private final BundleContext context;
private final List configurations;
-
+
public StaticConfigAdminImpl(BundleContext context, List configs) throws IOException {
Objects.requireNonNull(configs, "configs");
this.context = context;
@@ -49,29 +49,25 @@
public ManagedService addingService(ServiceReference reference) {
ManagedService service = context.getService(reference);
Object pidObj = reference.getProperty(Constants.SERVICE_PID);
+
+ boolean found = false;
+
if (pidObj instanceof String) {
String pid = (String) pidObj;
- boolean found = false;
+
for (Configuration config : configurations) {
if (config.getPid().equals(pid) && config.getFactoryPid() == null) {
- try {
- found = true;
- service.updated(config.getProperties());
- } catch (ConfigurationException e) {
- e.printStackTrace();
- }
+ found = true;
+ invokeUpdate(service, config);
}
}
- if (!found) {
- try {
- service.updated(null);
- } catch (ConfigurationException e) {
- e.printStackTrace();
- }
- }
- } else {
- System.err.println("Unsupported pid: " + pidObj);
+
}
+
+ if (!found) {
+ invokeUpdate(service, null);
+ }
+
return service;
}
@@ -112,6 +108,14 @@
};
factoryTracker.open();
}
+
+ private void invokeUpdate(ManagedService service, Configuration config) {
+ try {
+ service.updated(config == null ? null : config.getProperties());
+ } catch (final Exception e) {
+ e.printStackTrace();
+ }
+ }
@Override
public Configuration createFactoryConfiguration(String factoryPid) throws IOException {
@@ -157,4 +161,14 @@
return configs.isEmpty() ? null : configs.toArray(new Configuration[configs.size()]);
}
+ @Override
+ public Configuration getFactoryConfiguration(String factoryPid, String name, String location) throws IOException {
+ throw new UnsupportedOperationException("getFactoryConfiguration");
+ }
+
+ @Override
+ public Configuration getFactoryConfiguration(String factoryPid, String name) throws IOException {
+ throw new UnsupportedOperationException("getFactoryConfiguration(pid,name)");
+ }
+
}
diff --git a/services/staticcm/src/main/java/org/apache/karaf/services/staticcm/StaticConfigurationImpl.java b/services/staticcm/src/main/java/org/apache/karaf/services/staticcm/StaticConfigurationImpl.java
index b7d3fe6..c25d63f 100644
--- a/services/staticcm/src/main/java/org/apache/karaf/services/staticcm/StaticConfigurationImpl.java
+++ b/services/staticcm/src/main/java/org/apache/karaf/services/staticcm/StaticConfigurationImpl.java
@@ -19,10 +19,13 @@
package org.apache.karaf.services.staticcm;
import java.io.IOException;
+import java.util.Collections;
import java.util.Dictionary;
import java.util.Hashtable;
import java.util.Map;
+import java.util.Set;
+import org.osgi.framework.ServiceReference;
import org.osgi.service.cm.Configuration;
public class StaticConfigurationImpl implements Configuration {
@@ -80,4 +83,29 @@
return 0;
}
+ @Override
+ public Dictionary getProcessedProperties(ServiceReference> reference) {
+ return getProperties();
+ }
+
+ @Override
+ public boolean updateIfDifferent(Dictionary properties) throws IOException {
+ throw new UnsupportedOperationException("updateIfDifferent");
+ }
+
+ @Override
+ public void addAttributes(ConfigurationAttribute... attrs) throws IOException {
+ //
+ }
+
+ @Override
+ public Set getAttributes() {
+ return Collections.emptySet();
+ }
+
+ @Override
+ public void removeAttributes(ConfigurationAttribute... attrs) throws IOException {
+ //
+ }
+
}