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 2021/05/07 15:56:42 UTC

[karaf] branch main updated: [KARAF-7098] Add R7 configuration style support

This is an automated email from the ASF dual-hosted git repository.

jbonofre pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/karaf.git


The following commit(s) were added to refs/heads/main by this push:
     new b21c1ea  [KARAF-7098] Add R7 configuration style support
     new 58c7234  Merge pull request #1369 from jbonofre/KARAF-7098
b21c1ea is described below

commit b21c1eaedabcda71ab41b9eb924fd4afc6896023
Author: jbonofre <jb...@apache.org>
AuthorDate: Fri May 7 15:17:45 2021 +0200

    [KARAF-7098] Add R7 configuration style support
    
    Credit To: Oliver Lietz <ap...@oliverlietz.de>
---
 config/pom.xml                                     |  1 +
 .../config/core/impl/JsonConfigInstaller.java      | 60 ++++++++++------------
 2 files changed, 29 insertions(+), 32 deletions(-)

diff --git a/config/pom.xml b/config/pom.xml
index d909e30..19124e6 100644
--- a/config/pom.xml
+++ b/config/pom.xml
@@ -142,6 +142,7 @@
                             org.apache.karaf.config.core.impl,
                             org.apache.karaf.config.core.impl.osgi,
                             org.apache.karaf.util,
+                            org.apache.karaf.util.config,
                             org.apache.felix.utils.collections
                         </Private-Package>
                     </instructions>
diff --git a/config/src/main/java/org/apache/karaf/config/core/impl/JsonConfigInstaller.java b/config/src/main/java/org/apache/karaf/config/core/impl/JsonConfigInstaller.java
index 0466142..1d7560d 100644
--- a/config/src/main/java/org/apache/karaf/config/core/impl/JsonConfigInstaller.java
+++ b/config/src/main/java/org/apache/karaf/config/core/impl/JsonConfigInstaller.java
@@ -20,6 +20,7 @@ import org.apache.felix.cm.json.Configurations;
 import org.apache.felix.fileinstall.ArtifactInstaller;
 import org.apache.felix.fileinstall.internal.DirectoryWatcher;
 import org.apache.felix.utils.collections.DictionaryAsMap;
+import org.apache.karaf.util.config.ConfigurationPID;
 import org.osgi.framework.Constants;
 import org.osgi.service.cm.Configuration;
 import org.osgi.service.cm.ConfigurationAdmin;
@@ -37,12 +38,13 @@ import java.net.URISyntaxException;
 import java.net.URL;
 import java.util.Dictionary;
 import java.util.Hashtable;
+import java.util.Objects;
 
 public class JsonConfigInstaller implements ArtifactInstaller, ConfigurationListener {
 
     private final static Logger LOGGER = LoggerFactory.getLogger(JsonConfigInstaller.class);
 
-    private ConfigurationAdmin configurationAdmin;
+    private final ConfigurationAdmin configurationAdmin;
 
     public JsonConfigInstaller(ConfigurationAdmin configurationAdmin) {
         this.configurationAdmin = configurationAdmin;
@@ -69,9 +71,9 @@ public class JsonConfigInstaller implements ArtifactInstaller, ConfigurationList
     }
 
     private void setConfig(File artifact) throws Exception {
-        String name = artifact.getName();
-        String pid[] = parsePid(name);
-        Configuration configuration = getConfiguration(toConfigKey(artifact), pid[0], pid[1]);
+        final String filename = artifact.getName();
+        final ConfigurationPID configurationPID = ConfigurationPID.parseFilename(filename);
+        Configuration configuration = getConfiguration(toConfigKey(artifact), configurationPID);
         Dictionary<String, Object> props = configuration.getProperties();
         Hashtable<String, Object> old = props != null ? new Hashtable<>(new DictionaryAsMap<>(props)) : null;
         Hashtable<String, Object> properties = Configurations.buildReader().build(new FileReader(artifact)).readConfiguration();
@@ -84,20 +86,22 @@ public class JsonConfigInstaller implements ArtifactInstaller, ConfigurationList
         if (old == null || !old.equals(properties)) {
             properties.put(DirectoryWatcher.FILENAME, toConfigKey(artifact));
             if (old == null) {
-                LOGGER.info("Creating configuration from " + pid[0] + (pid[1] == null ? "" : "-" + pid[1]) + ".json");
+                LOGGER.info("Creating configuration from {}", artifact.getName());
             } else {
-                LOGGER.info("Updating configuration from " + pid[0] + (pid[1] == null ? "" : "-" + pid[1]) + ".json");
+                LOGGER.info("Updating configuration from {}", artifact.getName());
             }
             configuration.update(properties);
         }
     }
 
-    boolean deleteConfig(File f) throws Exception {
-        String pid[] = parsePid(f.getName());
-        LOGGER.info("Deleting configuration from " + pid[0] + (pid[1] == null ? "" : "-" + pid[1]) + ".json");
-        Configuration config = getConfiguration(toConfigKey(f), pid[0], pid[1]);
-        config.delete();
-        return true;
+    void deleteConfig(File artifact) throws Exception {
+        Configuration config = findExistingConfiguration(toConfigKey(artifact));
+        if (Objects.nonNull(config)) {
+            config.delete();
+            LOGGER.info("Configuration for {} found and deleted", artifact.getName());
+        } else {
+            LOGGER.info("Configuration for {} not found, unable to delete", artifact.getName());
+        }
     }
 
     @Override
@@ -140,41 +144,33 @@ public class JsonConfigInstaller implements ArtifactInstaller, ConfigurationList
         return null;
     }
 
-    String[] parsePid(String path) {
-        String pid = path.substring(0, path.lastIndexOf('.'));
-        int n = pid.indexOf('-');
-        if (n > 0) {
-            String factoryPid = pid.substring(n + 1);
-            pid = pid.substring(0, n);
-            return new String[]{pid, factoryPid};
-        } else {
-            return new String[]{pid, null};
-        }
-    }
-
     String toConfigKey(File f) {
         return f.getAbsoluteFile().toURI().toString();
     }
 
-    Configuration getConfiguration(String fileName, String pid, String factoryPid) throws Exception {
-        Configuration oldConfiguration = findExistingConfiguration(fileName);
+    Configuration getConfiguration(String configKey, ConfigurationPID configurationPID) throws Exception {
+        Configuration oldConfiguration = findExistingConfiguration(configKey);
         Configuration cachedConfiguration = oldConfiguration != null ?
                 configurationAdmin.getConfiguration(oldConfiguration.getPid(), null) : null;
         if (cachedConfiguration != null) {
             return cachedConfiguration;
         } else {
-            Configuration newConfiguration;
-            if (factoryPid != null) {
-                newConfiguration = configurationAdmin.createFactoryConfiguration(pid, "?");
+            final Configuration newConfiguration;
+            if (configurationPID.isFactory()) {
+                if (configurationPID.isR7()) {
+                    newConfiguration = configurationAdmin.getFactoryConfiguration(configurationPID.getFactoryPid(), configurationPID.getName(), "?");
+                } else {
+                    newConfiguration = configurationAdmin.createFactoryConfiguration(configurationPID.getFactoryPid(), "?");
+                }
             } else {
-                newConfiguration = configurationAdmin.getConfiguration(pid, "?");
+                newConfiguration = configurationAdmin.getConfiguration(configurationPID.getPid(), "?");
             }
             return newConfiguration;
         }
     }
 
-    Configuration findExistingConfiguration(String fileName) throws Exception {
-        String filter = "(" + DirectoryWatcher.FILENAME + "=" + escapeFilterValue(fileName) + ")";
+    Configuration findExistingConfiguration(String configKey) throws Exception {
+        String filter = "(" + DirectoryWatcher.FILENAME + "=" + escapeFilterValue(configKey) + ")";
         Configuration[] configurations = configurationAdmin.listConfigurations(filter);
         if (configurations != null && configurations.length > 0) {
             return configurations[0];