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 2014/09/19 15:41:35 UTC

git commit: [KARAF-2656] Config layer manages the cfg files

Repository: karaf
Updated Branches:
  refs/heads/master 100ab566b -> ba840519e


[KARAF-2656] Config layer manages the cfg files


Project: http://git-wip-us.apache.org/repos/asf/karaf/repo
Commit: http://git-wip-us.apache.org/repos/asf/karaf/commit/ba840519
Tree: http://git-wip-us.apache.org/repos/asf/karaf/tree/ba840519
Diff: http://git-wip-us.apache.org/repos/asf/karaf/diff/ba840519

Branch: refs/heads/master
Commit: ba840519ed453ff0679c9b87083f424f06de7a72
Parents: 100ab56
Author: Jean-Baptiste Onofré <jb...@apache.org>
Authored: Fri Sep 19 15:40:09 2014 +0200
Committer: Jean-Baptiste Onofré <jb...@apache.org>
Committed: Fri Sep 19 15:40:09 2014 +0200

----------------------------------------------------------------------
 config/pom.xml                                  |  3 +-
 .../config/core/impl/ConfigRepositoryImpl.java  | 89 +++++++++++++++++++-
 .../karaf/config/core/impl/osgi/Activator.java  |  4 +-
 3 files changed, 91 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/karaf/blob/ba840519/config/pom.xml
----------------------------------------------------------------------
diff --git a/config/pom.xml b/config/pom.xml
index 84be65e..dfcbac6 100644
--- a/config/pom.xml
+++ b/config/pom.xml
@@ -109,7 +109,8 @@
                         <Private-Package>
                             org.apache.karaf.config.core.impl,
                             org.apache.karaf.config.core.impl.osgi,
-                            org.apache.karaf.util.tracker
+                            org.apache.karaf.util.tracker,
+                            org.apache.felix.utils.properties
                         </Private-Package>
                         <Provide-Capability>
                             ${capabilities}

http://git-wip-us.apache.org/repos/asf/karaf/blob/ba840519/config/src/main/java/org/apache/karaf/config/core/impl/ConfigRepositoryImpl.java
----------------------------------------------------------------------
diff --git a/config/src/main/java/org/apache/karaf/config/core/impl/ConfigRepositoryImpl.java b/config/src/main/java/org/apache/karaf/config/core/impl/ConfigRepositoryImpl.java
index 4055cd9..34fac59 100644
--- a/config/src/main/java/org/apache/karaf/config/core/impl/ConfigRepositoryImpl.java
+++ b/config/src/main/java/org/apache/karaf/config/core/impl/ConfigRepositoryImpl.java
@@ -18,31 +18,54 @@ package org.apache.karaf.config.core.impl;
 
 import java.io.File;
 import java.io.IOException;
+import java.net.URI;
+import java.net.URL;
+import java.util.ArrayList;
 import java.util.Dictionary;
+import java.util.Enumeration;
 import java.util.Hashtable;
 
+import org.apache.felix.utils.properties.Properties;
 import org.apache.karaf.config.core.ConfigRepository;
+import org.osgi.framework.Constants;
 import org.osgi.framework.InvalidSyntaxException;
 import org.osgi.service.cm.Configuration;
 import org.osgi.service.cm.ConfigurationAdmin;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public class ConfigRepositoryImpl implements ConfigRepository {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(ConfigRepositoryImpl.class);
+
+    private static final String FILEINSTALL_FILE_NAME = "felix.fileinstall.filename";
+
     private ConfigurationAdmin configAdmin;
-    
     private File storage;
 
     public ConfigRepositoryImpl(ConfigurationAdmin configAdmin) {
         this.configAdmin = configAdmin;
     }
 
+    public ConfigRepositoryImpl(ConfigurationAdmin configAdmin, File storage) {
+        this.configAdmin = configAdmin;
+        this.storage = storage;
+    }
+
     /* (non-Javadoc)
      * @see org.apache.karaf.shell.config.impl.ConfigRepository#update(java.lang.String, java.util.Dictionary, boolean)
      */
     @Override
     @SuppressWarnings({ "rawtypes", "unchecked" })
     public void update(String pid, Dictionary props) throws IOException {
+        LOGGER.trace("Update configuration {}", pid);
         Configuration cfg = this.configAdmin.getConfiguration(pid, null);
         cfg.update(props);
+        try {
+            updateStorage(pid, props);
+        } catch (Exception e) {
+            LOGGER.warn("Can't update cfg file", e);
+        }
     }
 
     /* (non-Javadoc)
@@ -50,25 +73,85 @@ public class ConfigRepositoryImpl implements ConfigRepository {
      */
     @Override
     public void delete(String pid) throws Exception {
+        LOGGER.trace("Delete configuration {}", pid);
         Configuration configuration = this.configAdmin.getConfiguration(pid);
         configuration.delete();
-        deleteStorage(pid);
+        try {
+            deleteStorage(pid);
+        } catch (Exception e) {
+            LOGGER.warn("Can't delete cfg file", e);
+        }
     }
     
     protected void deleteStorage(String pid) throws Exception {
         if (storage != null) {
             File cfgFile = new File(storage, pid + ".cfg");
+            LOGGER.trace("Delete {}", cfgFile.getName());
             cfgFile.delete();
         }
     }
 
+    protected void updateStorage(String pid, Dictionary props) throws IOException {
+        if (storage != null) {
+            // get the cfg file
+            File cfgFile = new File(storage, pid + ".cfg");
+            Configuration cfg = configAdmin.getConfiguration(pid, null);
+            // update the cfg file depending of the configuration
+            if (cfg != null && cfg.getProperties() != null) {
+                Object val = cfg.getProperties().get(FILEINSTALL_FILE_NAME);
+                try {
+                    if (val instanceof URL) {
+                        cfgFile = new File(((URL) val).toURI());
+                    }
+                    if (val instanceof URI) {
+                        cfgFile = new File((URI) val);
+                    }
+                    if (val instanceof String) {
+                        cfgFile = new File(new URL((String) val).toURI());
+                    }
+                } catch (Exception e) {
+                    throw (IOException) new IOException(e.getMessage()).initCause(e);
+                }
+            }
+            LOGGER.trace("Update {}", cfgFile.getName());
+            // update the cfg file
+            Properties properties = new Properties(cfgFile);
+            for (Enumeration<String> keys = props.keys(); keys.hasMoreElements(); ) {
+                String key = keys.nextElement();
+                if (!Constants.SERVICE_PID.equals(key)
+                        && !ConfigurationAdmin.SERVICE_FACTORYPID.equals(key)
+                        && !FILEINSTALL_FILE_NAME.equals(key)) {
+                    if (props.get(key) != null) {
+                        properties.put(key, props.get(key).toString());
+                    }
+                }
+            }
+            // remove "removed" properties from the cfg file
+            ArrayList<String> propertiesToRemove = new ArrayList<>();
+            for (String key : properties.keySet()) {
+                if (props.get(key) == null
+                        && !Constants.SERVICE_PID.equals(key)
+                        && !ConfigurationAdmin.SERVICE_FACTORYPID.equals(key)
+                        && !FILEINSTALL_FILE_NAME.equals(key)) {
+                    propertiesToRemove.add(key);
+                }
+            }
+            for (String key : propertiesToRemove) {
+                properties.remove(key);
+            }
+            // save the cfg file
+            storage.mkdirs();
+            properties.save();
+        }
+    }
+
     /* (non-Javadoc)
      * @see org.apache.karaf.shell.config.impl.ConfigRepository#getConfigProperties(java.lang.String)
      */
     @Override
     @SuppressWarnings("rawtypes")
     public Dictionary getConfigProperties(String pid) throws IOException, InvalidSyntaxException {
-        if(pid != null && configAdmin != null) {
+        if (pid != null && configAdmin != null) {
             Configuration configuration = this.configAdmin.getConfiguration(pid);
             if(configuration != null) {
                 Dictionary props = configuration.getProperties();

http://git-wip-us.apache.org/repos/asf/karaf/blob/ba840519/config/src/main/java/org/apache/karaf/config/core/impl/osgi/Activator.java
----------------------------------------------------------------------
diff --git a/config/src/main/java/org/apache/karaf/config/core/impl/osgi/Activator.java b/config/src/main/java/org/apache/karaf/config/core/impl/osgi/Activator.java
index ca5268f..41f50db 100644
--- a/config/src/main/java/org/apache/karaf/config/core/impl/osgi/Activator.java
+++ b/config/src/main/java/org/apache/karaf/config/core/impl/osgi/Activator.java
@@ -25,6 +25,8 @@ import org.apache.karaf.util.tracker.RequireService;
 import org.apache.karaf.util.tracker.Services;
 import org.osgi.service.cm.ConfigurationAdmin;
 
+import java.io.File;
+
 @Services(
         requires = @RequireService(ConfigurationAdmin.class),
         provides = @ProvideService(ConfigRepository.class)
@@ -37,7 +39,7 @@ public class Activator extends BaseActivator {
             return;
         }
 
-        ConfigRepository configRepository = new ConfigRepositoryImpl(configurationAdmin);
+        ConfigRepository configRepository = new ConfigRepositoryImpl(configurationAdmin, new File(System.getProperty("karaf.etc")));
         register(ConfigRepository.class, configRepository);
 
         ConfigMBeanImpl configMBean = new ConfigMBeanImpl();