From 726de13af9def6a3bf39123290542b8a887038ef Mon Sep 17 00:00:00 2001
From: palador <palador@projektangriff.de
Date: Fri, 13 Feb 2015 14:41:58 +0100
Subject: [PATCH] Fixed appending config with feature

---
 .../internal/service/FeatureConfigInstaller.java   | 48 ++++++++++------------
 1 file changed, 22 insertions(+), 26 deletions(-)

diff --git a/features/core/src/main/java/org/apache/karaf/features/internal/service/FeatureConfigInstaller.java b/features/core/src/main/java/org/apache/karaf/features/internal/service/FeatureConfigInstaller.java
index aa5c21e..835d856 100644
--- a/features/core/src/main/java/org/apache/karaf/features/internal/service/FeatureConfigInstaller.java
+++ b/features/core/src/main/java/org/apache/karaf/features/internal/service/FeatureConfigInstaller.java
@@ -24,11 +24,7 @@ import java.io.InputStream;
 import java.io.StringReader;
 import java.net.MalformedURLException;
 import java.net.URL;
-import java.util.Dictionary;
-import java.util.Enumeration;
-import java.util.Hashtable;
-import java.util.List;
-import java.util.Properties;
+import java.util.*;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -93,33 +89,33 @@ public class FeatureConfigInstaller {
     	for (ConfigInfo config : feature.getConfigurations()) {
     		String name = config.getName();
 			Properties props = config.getProperties();
+            Dictionary<String, String> featureDict = convertToDict(props);
+
 			String[] pid = parsePid(config.getName());
 			Configuration cfg = findExistingConfiguration(configAdmin, pid[0],
 					pid[1]);
-			if (cfg == null) {
-				Dictionary<String, String> cfgProps = convertToDict(props);
 
-				cfg = createConfiguration(configAdmin, pid[0], pid[1]);
+            Dictionary<String, Object> existingDict = cfg.getProperties();
+            if (cfg == null) {
+                cfg = createConfiguration(configAdmin, pid[0], pid[1]);
 				String key = createConfigurationKey(pid[0], pid[1]);
-				cfgProps.put(CONFIG_KEY, key);
-				cfg.update(cfgProps);
+				featureDict.put(CONFIG_KEY, key);
+				cfg.update(featureDict);
 			} else if (config.isAppend()) {
-				Dictionary<String,Object> properties = cfg.getProperties();
-				for (Enumeration<String> propKeys = properties.keys(); propKeys
-						.hasMoreElements();) {
-					String key = propKeys.nextElement();
-					// remove existing entry, since it's about appending.
-					if (props.containsKey(key)) {
-						props.remove(key);
-					} 
-				}
-				if (props.size() > 0) {
-					// convert props to dictionary
-					Dictionary<String, String> cfgProps = convertToDict(props);
-					cfg.update(cfgProps);
-				}
-			}
-		}
+
+                int oldExistingDictSize = existingDict.size();
+                for (Enumeration<String> featureKeyEnum = existingDict.keys(); featureKeyEnum.hasMoreElements(); ) {
+                    String featureKey = featureKeyEnum.nextElement();
+                    if (existingDict.get(featureKey) == null) {
+                        existingDict.put(featureKey, featureDict.get(featureKey));
+                    }
+                }
+
+                if (existingDict.size() != oldExistingDictSize) {
+                    cfg.update(existingDict);
+                }
+            }
+        }
         for (ConfigFileInfo configFile : feature.getConfigurationFiles()) {
             installConfigurationFile(configFile.getLocation(), configFile.getFinalname(), configFile.isOverride());
         }
-- 
1.9.1

