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