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 2012/05/11 10:00:42 UTC
svn commit: r1337048 - in /karaf/cellar/trunk/config/src:
main/java/org/apache/karaf/cellar/config/
test/java/org/apache/karaf/cellar/config/
Author: jbonofre
Date: Fri May 11 08:00:42 2012
New Revision: 1337048
URL: http://svn.apache.org/viewvc?rev=1337048&view=rev
Log:
[KARAF-1463] Reintroduce config filtering, specially for the karaf.home property
Removed:
karaf/cellar/trunk/config/src/test/java/org/apache/karaf/cellar/config/ConfigurationSupportTest.java
Modified:
karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/config/ConfigurationEventHandler.java
karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/config/ConfigurationSupport.java
karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/config/ConfigurationSynchronizer.java
karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/config/LocalConfigurationListener.java
Modified: karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/config/ConfigurationEventHandler.java
URL: http://svn.apache.org/viewvc/karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/config/ConfigurationEventHandler.java?rev=1337048&r1=1337047&r2=1337048&view=diff
==============================================================================
--- karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/config/ConfigurationEventHandler.java (original)
+++ karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/config/ConfigurationEventHandler.java Fri May 11 08:00:42 2012
@@ -72,10 +72,8 @@ public class ConfigurationEventHandler e
conf.delete();
} else {
if (remoteDictionary != null) {
- Dictionary existingConfiguration = conf.getProperties();
- if (!equals(remoteDictionary, existingConfiguration)) {
- conf.update(remoteDictionary);
- }
+ Dictionary localDictionary = conf.getProperties();
+ conf.update(filter(remoteDictionary, true));
}
}
}
Modified: karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/config/ConfigurationSupport.java
URL: http://svn.apache.org/viewvc/karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/config/ConfigurationSupport.java?rev=1337048&r1=1337047&r2=1337048&view=diff
==============================================================================
--- karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/config/ConfigurationSupport.java (original)
+++ karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/config/ConfigurationSupport.java Fri May 11 08:00:42 2012
@@ -24,6 +24,10 @@ import java.util.Properties;
*/
public class ConfigurationSupport extends CellarSupport {
+ private static String HOME_PLACEHOLDER = "karaf.home";
+ private static String RELATIVE_HOME = "${" + HOME_PLACEHOLDER + "}";
+ private static String HOME = System.getProperty("karaf.home");
+
/**
* Reads a {@code Dictionary} object and creates a property object out of it.
*
@@ -47,33 +51,49 @@ public class ConfigurationSupport extend
}
/**
- * Returns true if dictionaries are equal.
- *
- * @param dict1
- * @param dict2
+ * Filter a dictionary, specially replace the karaf.home property with a relative value.
+ * @param dictionary
* @return
*/
- protected boolean equals(Dictionary dict1, Dictionary dict2) {
- if (dict1 == null && dict2 == null)
- return true;
-
- if (dict1 == null && dict2 != null)
- return false;
-
- if (dict1 != null && dict2 == null)
- return false;
-
- if (dict1.size() != dict2.size())
- return false;
-
- for (Enumeration e = dict1.keys(); e.hasMoreElements(); ) {
- Object key = e.nextElement();
- if (!dict1.get(key).equals(dict2.get(key))) {
- return false;
+ public Dictionary filter(Dictionary dictionary) {
+ Dictionary properties = new Properties();
+ Enumeration keys = dictionary.keys();
+ while (keys.hasMoreElements()) {
+ String key = (String) keys.nextElement();
+ if (key != null && dictionary.get(key) != null) {
+ String value = String.valueOf(dictionary.get(key));
+ value = this.convert(value, HOME, RELATIVE_HOME);
+ properties.put(key, value);
}
}
+ return properties;
+ }
- return true;
+ /**
+ * Filter a dictionary, specially replace the karaf.home property with a relative value.
+ * @param dictionary
+ * @return
+ */
+ public Dictionary filter(Dictionary dictionary, boolean reverse) {
+ Dictionary properties = new Properties();
+ Enumeration keys = dictionary.keys();
+ while (keys.hasMoreElements()) {
+ String key = (String) keys.nextElement();
+ if (key != null && dictionary.get(key) != null) {
+ String value = String.valueOf(dictionary.get(key));
+ value = this.convert(value, RELATIVE_HOME, HOME);
+ properties.put(key, value);
+ }
+ }
+ return properties;
+ }
+
+ public String convert(String value, String absolute, String relative) {
+ String result = value;
+ if (absolute != null && (absolute.trim().length() > 0) && value.contains(absolute)) {
+ result = value.replace(absolute, relative);
+ }
+ return result;
}
}
Modified: karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/config/ConfigurationSynchronizer.java
URL: http://svn.apache.org/viewvc/karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/config/ConfigurationSynchronizer.java?rev=1337048&r1=1337047&r2=1337048&view=diff
==============================================================================
--- karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/config/ConfigurationSynchronizer.java (original)
+++ karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/config/ConfigurationSynchronizer.java Fri May 11 08:00:42 2012
@@ -88,7 +88,7 @@ public class ConfigurationSynchronizer e
try {
// update the local configuration if needed
Configuration conf = configurationAdmin.getConfiguration(pid);
- conf.update(remoteDictionary);
+ conf.update(filter(remoteDictionary, true));
} catch (IOException ex) {
LOGGER.error("CELLAR CONFIG: failed to read distributed map", ex);
}
@@ -125,17 +125,16 @@ public class ConfigurationSynchronizer e
String pid = conf.getPid();
// check if the pid is marked as local.
if (isAllowed(group, Constants.CATEGORY, pid, EventType.OUTBOUND)) {
- Properties localDictionary = dictionaryToProperties(conf.getProperties());
+ Properties localDictionary = dictionaryToProperties(filter(conf.getProperties()));
Properties remoteDictionary = configurationTable.get(pid);
- if (!this.equals(localDictionary, remoteDictionary)) {
- // update the distributed map
- configurationTable.put(pid, localDictionary);
- // broadcast the cluster event
- RemoteConfigurationEvent event = new RemoteConfigurationEvent(conf.getPid());
- event.setSourceGroup(group);
- eventProducer.produce(event);
- }
- }
+ // update the distributed map
+ configurationTable.put(pid, localDictionary);
+ // broadcast the cluster event
+ RemoteConfigurationEvent event = new RemoteConfigurationEvent(conf.getPid());
+ event.setSourceGroup(group);
+ eventProducer.produce(event);
+ } else
+ LOGGER.warn("CELLAR CONFIG: configuration with PID {} is marked as BLOCKED OUTBOUND", pid);
}
} catch (IOException ex) {
LOGGER.error("CELLAR CONFIG: failed to read the distributed map (IO error)", ex);
Modified: karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/config/LocalConfigurationListener.java
URL: http://svn.apache.org/viewvc/karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/config/LocalConfigurationListener.java?rev=1337048&r1=1337047&r2=1337048&view=diff
==============================================================================
--- karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/config/LocalConfigurationListener.java (original)
+++ karaf/cellar/trunk/config/src/main/java/org/apache/karaf/cellar/config/LocalConfigurationListener.java Fri May 11 08:00:42 2012
@@ -70,13 +70,11 @@ public class LocalConfigurationListener
// TODO broadcast the cluster event
} else {
Configuration conf = configurationAdmin.getConfiguration(pid);
- Properties localDictionary = dictionaryToProperties(conf.getProperties());
+ Properties localDictionary = dictionaryToProperties(filter(conf.getProperties()));
Dictionary remoteDictionary = configurationTable.get(pid);
- if (!equals(localDictionary, remoteDictionary)) {
- // update the distributed map
- configurationTable.put(pid, localDictionary);
- // TODO broadcast the cluster event but it creates a loop
- }
+ // update the distributed map
+ configurationTable.put(pid, localDictionary);
+ // TODO broadcast a cluster event but it creates a loop
}
} catch (Exception e) {
LOGGER.error("CELLAR CONFIG: failed to push configuration with PID {} to the distributed map", pid, e);