From 74eb7bafe47a47e6a7924c1d6b86f3f720165d97 Mon Sep 17 00:00:00 2001 From: Gareth Collins Date: Mon, 7 Jul 2014 00:36:36 -0400 Subject: [PATCH] Add support for redirecting feature configs to file --- .../etc/org.apache.karaf.features.cfg | 5 ++ .../internal/FeatureConfigInstaller.java | 86 ++++++++++++++----- .../OSGI-INF/blueprint/blueprint.xml | 4 + 3 files changed, 75 insertions(+), 20 deletions(-) diff --git a/assemblies/features/framework/src/main/filtered-resources/resources/etc/org.apache.karaf.features.cfg b/assemblies/features/framework/src/main/filtered-resources/resources/etc/org.apache.karaf.features.cfg index 9bc5df184a0..bc45766e484 100644 --- a/assemblies/features/framework/src/main/filtered-resources/resources/etc/org.apache.karaf.features.cfg +++ b/assemblies/features/framework/src/main/filtered-resources/resources/etc/org.apache.karaf.features.cfg @@ -47,3 +47,8 @@ featuresBoot=config,standard,region,package,kar,ssh,management # Defines if the boot features are started in asynchronous mode (in a dedicated thread) # featuresBootAsynchronous=false + +# +# Determine if feature configurations should be output to file instead of added directly to config admin +# +featuresRedirectConfigsToFile=false diff --git a/features/core/src/main/java/org/apache/karaf/features/internal/FeatureConfigInstaller.java b/features/core/src/main/java/org/apache/karaf/features/internal/FeatureConfigInstaller.java index 5946a3a6719..d00a3333480 100644 --- a/features/core/src/main/java/org/apache/karaf/features/internal/FeatureConfigInstaller.java +++ b/features/core/src/main/java/org/apache/karaf/features/internal/FeatureConfigInstaller.java @@ -16,16 +16,6 @@ */ package org.apache.karaf.features.internal; -import java.io.BufferedInputStream; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.net.MalformedURLException; -import java.net.URL; -import java.util.Dictionary; -import java.util.Hashtable; - import org.apache.karaf.features.ConfigFileInfo; import org.apache.karaf.features.Feature; import org.osgi.framework.Constants; @@ -35,11 +25,23 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.io.*; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.Dictionary; +import java.util.Hashtable; +import java.util.Map; +import java.util.Properties; + public class FeatureConfigInstaller { private static final Logger LOGGER = LoggerFactory.getLogger(FeaturesServiceImpl.class); private static final String CONFIG_KEY = "org.apache.karaf.features.configKey"; + private static final String CONFIG_FILE_EXTENSION = ".cfg"; private final ConfigurationAdmin configAdmin; + + private boolean redirectFeatureConfigsToFile; + private String featureConfigsOutputDir; public FeatureConfigInstaller(ConfigurationAdmin configAdmin) { this.configAdmin = configAdmin; @@ -83,17 +85,45 @@ private Configuration findExistingConfiguration(ConfigurationAdmin configuration void installFeatureConfigs(Feature feature, boolean verbose) throws IOException, InvalidSyntaxException { for (String config : feature.getConfigurations().keySet()) { - Dictionary props = new Hashtable(feature.getConfigurations().get(config)); - String[] pid = parsePid(config); - Configuration cfg = findExistingConfiguration(configAdmin, pid[0], pid[1]); - if (cfg == null) { - cfg = createConfiguration(configAdmin, pid[0], pid[1]); - String key = createConfigurationKey(pid[0], pid[1]); - props.put(CONFIG_KEY, key); - if (cfg.getBundleLocation() != null) { - cfg.setBundleLocation(null); + if (!redirectFeatureConfigsToFile) { + Dictionary props = new Hashtable(feature.getConfigurations().get(config)); + String[] pid = parsePid(config); + Configuration cfg = findExistingConfiguration(configAdmin, pid[0], pid[1]); + if (cfg == null) { + cfg = createConfiguration(configAdmin, pid[0], pid[1]); + String key = createConfigurationKey(pid[0], pid[1]); + props.put(CONFIG_KEY, key); + if (cfg.getBundleLocation() != null) { + cfg.setBundleLocation(null); + } + cfg.update(props); } - cfg.update(props); + } else { + feature.getConfigurations().get(config); + String finalname = new StringBuilder(featureConfigsOutputDir) + .append(File.separator) + .append(config) + .append(CONFIG_FILE_EXTENSION) + .toString(); + File file = new File(finalname); + if (file.exists()) { + LOGGER.debug("configFile already exist, don't override it"); + continue; + } + if (!file.exists()) { + File parentFile = file.getParentFile(); + if (parentFile != null) { + parentFile.mkdirs(); + } + } + Map configItems = feature.getConfigurations().get(config); + Properties outputProperties = new Properties(); + for (Map.Entry configItemEntry : configItems.entrySet()) { + outputProperties.put(configItemEntry.getKey(), configItemEntry.getValue()); + } + Writer writer = new OutputStreamWriter(new FileOutputStream(finalname)); + outputProperties.store(writer, null); + writer.close(); } } for (ConfigFileInfo configFile : feature.getConfigurationFiles()) { @@ -101,6 +131,22 @@ void installFeatureConfigs(Feature feature, boolean verbose) throws IOException, } } + public boolean isRedirectFeatureConfigsToFile() { + return redirectFeatureConfigsToFile; + } + + public void setRedirectFeatureConfigsToFile(boolean redirectFeatureConfigsToFile) { + this.redirectFeatureConfigsToFile = redirectFeatureConfigsToFile; + } + + public String getFeatureConfigsOutputDir() { + return featureConfigsOutputDir; + } + + public void setFeatureConfigsOutputDir(String featureConfigsOutputDir) { + this.featureConfigsOutputDir = featureConfigsOutputDir; + } + private String createConfigurationKey(String pid, String factoryPid) { return factoryPid == null ? pid : pid + "-" + factoryPid; } diff --git a/features/core/src/main/resources/OSGI-INF/blueprint/blueprint.xml b/features/core/src/main/resources/OSGI-INF/blueprint/blueprint.xml index 8db41f1ba85..e27b2b81c2a 100644 --- a/features/core/src/main/resources/OSGI-INF/blueprint/blueprint.xml +++ b/features/core/src/main/resources/OSGI-INF/blueprint/blueprint.xml @@ -36,6 +36,8 @@ + + file:$(karaf.etc)/org.apache.karaf.features.cfg @@ -62,6 +64,8 @@ + +