in config/src/main/java/org/apache/karaf/cellar/config/ConfigurationSynchronizer.java [113:178]
public void pull(Group group) {
if (group != null) {
String groupName = group.getName();
LOGGER.debug("CELLAR CONFIG: pulling configurations from cluster group {}", groupName);
Map<String, Properties> clusterConfigurations = clusterManager.getMap(Constants.CONFIGURATION_MAP + Configurations.SEPARATOR + groupName);
ClassLoader originalClassLoader = Thread.currentThread().getContextClassLoader();
try {
Thread.currentThread().setContextClassLoader(getClass().getClassLoader());
// get configurations on the cluster to update local configurations
for (String pid : clusterConfigurations.keySet()) {
if (isAllowed(group, Constants.CATEGORY, pid, EventType.INBOUND) && shouldReplicateConfig(clusterConfigurations.get(pid))) {
Dictionary clusterDictionary = clusterConfigurations.get(pid);
try {
// update the local configuration if needed
Configuration localConfiguration = findLocalConfiguration(pid, clusterDictionary);
if (localConfiguration == null) {
// Create new configuration
localConfiguration = createLocalConfiguration(pid, clusterDictionary);
}
Dictionary localDictionary = localConfiguration.getProperties();
if (localDictionary == null)
localDictionary = new Properties();
localDictionary = filter(localDictionary);
if (!equals(clusterDictionary, localDictionary) && canDistributeConfig(localDictionary) && shouldReplicateConfig(clusterDictionary)) {
LOGGER.debug("CELLAR CONFIG: updating configration {} on node", pid);
clusterDictionary = convertPropertiesFromCluster(clusterDictionary);
localConfiguration.update((Dictionary) clusterDictionary);
persistConfiguration(localConfiguration, clusterDictionary);
}
} catch (IOException ex) {
LOGGER.error("CELLAR CONFIG: failed to read local configuration", ex);
}
} else LOGGER.trace("CELLAR CONFIG: configuration with PID {} is marked BLOCKED INBOUND for cluster group {}", pid, groupName);
}
// cleanup the local configurations not present on the cluster if the node is not the first one in the cluster
if (CellarUtils.doCleanupResourcesNotPresentInCluster(configurationAdmin) && getSynchronizerMap().containsKey(Constants.CONFIGURATION_MAP + Configurations.SEPARATOR + groupName)) {
try {
Set<String> filenames = new HashSet();
for (Properties configuration : clusterConfigurations.values()) {
if (shouldReplicateConfig(configuration)) {
filenames.add(getKarafFilename(configuration));
}
}
filenames.remove(null);
for (Configuration configuration : configurationAdmin.listConfigurations(null)) {
String pid = configuration.getPid();
if ((!clusterConfigurations.containsKey(pid) || !shouldReplicateConfig(clusterConfigurations.get(pid))) && !filenames.contains(getKarafFilename(configuration.getProperties())) && isAllowed(group, Constants.CATEGORY, pid, EventType.INBOUND)) {
LOGGER.debug("CELLAR CONFIG: deleting local configuration {} which is not present in cluster", pid);
deleteConfiguration(configuration);
}
}
} catch (Exception e) {
LOGGER.warn("Can't get local configurations", e);
}
}
} catch (Exception ex) {
LOGGER.error("CELLAR CONFIG: failed to read cluster configuration", ex);
} finally {
Thread.currentThread().setContextClassLoader(originalClassLoader);
}
}
}