You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@karaf.apache.org by jb...@apache.org on 2019/11/09 06:14:07 UTC
[karaf] branch karaf-4.2.x updated: [KARAF-6498] Improve SCR
support in staticcm
This is an automated email from the ASF dual-hosted git repository.
jbonofre pushed a commit to branch karaf-4.2.x
in repository https://gitbox.apache.org/repos/asf/karaf.git
The following commit(s) were added to refs/heads/karaf-4.2.x by this push:
new f9e4abf [KARAF-6498] Improve SCR support in staticcm
f9e4abf is described below
commit f9e4abf7b670f68b7267e932a0579eb01a259836
Author: Jean-Baptiste Onofré <jb...@apache.org>
AuthorDate: Fri Nov 8 08:30:49 2019 +0100
[KARAF-6498] Improve SCR support in staticcm
(cherry picked from commit d85f7f5b8704ecb2f2a9b63208e4e01f142ced4d)
---
services/staticcm/pom.xml | 5 +-
.../karaf/services/staticcm/Configurations.java | 55 ++++++++++++++++------
.../services/staticcm/StaticConfigAdminImpl.java | 48 ++++++++++++-------
.../services/staticcm/StaticConfigurationImpl.java | 28 +++++++++++
4 files changed, 103 insertions(+), 33 deletions(-)
diff --git a/services/staticcm/pom.xml b/services/staticcm/pom.xml
index 2a28b32..31053a1 100644
--- a/services/staticcm/pom.xml
+++ b/services/staticcm/pom.xml
@@ -55,7 +55,7 @@
!org.osgi.service.cm,
*
</Import-Package>
- <Export-Package>org.osgi.service.cm;version=1.6</Export-Package>
+ <Export-Package>org.osgi.service.cm;provider:=true</Export-Package>
<Private-Package>
org.apache.karaf.services.staticcm,
org.apache.felix.utils.properties
@@ -79,7 +79,8 @@
</dependency>
<dependency>
<groupId>org.osgi</groupId>
- <artifactId>osgi.cmpn</artifactId>
+ <artifactId>org.osgi.service.cm</artifactId>
+ <version>1.6.0</version>
<scope>provided</scope>
</dependency>
<dependency>
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.Map;
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<Configuration> loadConfigurations(BundleContext context, File directory) throws IOException {
- Map<String, Map<String, String>> configs = new HashMap<>();
+ Map<String, Map<String, Object>> 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<String, Object> 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<String, String> 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 @@ public class Configurations {
return createConfigurations(context, configs);
}
- public static List<Configuration> createConfigurations(BundleContext context, Map<String, Map<String, String>> configs) {
+ public static List<Configuration> createConfigurations(BundleContext context, Map<String, Map<String, Object>> configs) {
List<Configuration> configurations = new ArrayList<>();
- for (Map.Entry<String, Map<String, String>> entry : configs.entrySet()) {
+ for (Map.Entry<String, Map<String, Object>> entry : configs.entrySet()) {
String pid[] = parsePid(entry.getKey());
- Map<String, String> 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<String, Object> 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 @@ import org.osgi.util.tracker.ServiceTracker;
public class StaticConfigAdminImpl implements ConfigurationAdmin {
private final BundleContext context;
private final List<Configuration> configurations;
-
+
public StaticConfigAdminImpl(BundleContext context, List<Configuration> configs) throws IOException {
Objects.requireNonNull(configs, "configs");
this.context = context;
@@ -49,29 +49,25 @@ public class StaticConfigAdminImpl implements ConfigurationAdmin {
public ManagedService addingService(ServiceReference<ManagedService> 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();
- }
- }
- }
- if (!found) {
- try {
- service.updated(null);
- } catch (ConfigurationException e) {
- e.printStackTrace();
+ found = true;
+ invokeUpdate(service, config);
}
}
- } else {
- System.err.println("Unsupported pid: " + pidObj);
+
+ }
+
+ if (!found) {
+ invokeUpdate(service, null);
}
+
return service;
}
@@ -112,6 +108,14 @@ public class StaticConfigAdminImpl implements ConfigurationAdmin {
};
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 @@ public class StaticConfigAdminImpl implements ConfigurationAdmin {
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 @@ public class StaticConfigurationImpl implements Configuration {
return 0;
}
+ @Override
+ public Dictionary<String, Object> getProcessedProperties(ServiceReference<?> reference) {
+ return getProperties();
+ }
+
+ @Override
+ public boolean updateIfDifferent(Dictionary<String, ?> properties) throws IOException {
+ throw new UnsupportedOperationException("updateIfDifferent");
+ }
+
+ @Override
+ public void addAttributes(ConfigurationAttribute... attrs) throws IOException {
+ //
+ }
+
+ @Override
+ public Set<ConfigurationAttribute> getAttributes() {
+ return Collections.emptySet();
+ }
+
+ @Override
+ public void removeAttributes(ConfigurationAttribute... attrs) throws IOException {
+ //
+ }
+
}