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();