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