package org.talend.esb.mep.requestcallback.impl.osgi;
import java.util.Dictionary;
import java.util.Hashtable;
import java.util.LinkedList;
import java.util.List;
import org.osgi.framework.BundleContext;
import org.osgi.framework.Constants;
import org.osgi.framework.ServiceRegistration;
import org.osgi.service.cm.ConfigurationException;
import org.osgi.service.cm.ManagedService;
import org.talend.esb.mep.requestcallback.feature.Configuration;
import org.talend.esb.mep.requestcallback.feature.Configuration.PidMode;
import org.talend.esb.mep.requestcallback.feature.ConfigurationInitializer;
import org.talend.esb.mep.requestcallback.feature.ConfigurationInitializer.ConfigurationCreationListener;
public class ConfigurationUpdater implements ManagedService {
private static final class Manager {
private final List<ConfigurationUpdater> updaters =
new LinkedList<ConfigurationUpdater>();
private BundleContext bundleContext = null;
public Manager() {
super();
}
public synchronized boolean addUpdater(ConfigurationUpdater updater) {
if (updaters.add(updater)) {
if (bundleContext != null) {
updater.register(bundleContext);
}
return true;
}
return false;
}
public synchronized boolean removeUpdater(ConfigurationUpdater updater) {
if (updaters.remove(updater)) {
updater.unregister();
return true;
}
return false;
}
public synchronized void activateUpdaters(final BundleContext bundleContext) {
if (bundleContext == null) {
return;
}
deactivateUpdaters();
for (ConfigurationUpdater updater : updaters) {
updater.register(bundleContext);
}
this.bundleContext = bundleContext;
}
public synchronized void deactivateUpdaters() {
if (bundleContext == null) {
return;
}
for (ConfigurationUpdater updater : updaters) {
updater.unregister();
}
bundleContext = null;
}
}
private static final Manager MANAGER = new Manager();
private final Configuration configuration;
private String configIdentifier = null;
private ServiceRegistration registration = null;
static {
setupListener();
}
public ConfigurationUpdater(Configuration configuration) {
super();
this.configuration = configuration;
}
@Override
public synchronized void updated(@SuppressWarnings("rawtypes") Dictionary properties)
throws ConfigurationException {
if (properties == null) {
return;
}
configuration.updateDynamicConfiguration(properties, true);
}
public synchronized void register(BundleContext bundleContext) {
if (registration != null) {
registration.unregister();
}
configIdentifier = resolveConfigIdentifier();
registration = register(bundleContext, configIdentifier);
}
public synchronized void unregister() {
if (registration != null) {
registration.unregister();
registration = null;
}
}
public static boolean addUpdater(ConfigurationUpdater updater) {
return MANAGER.addUpdater(updater);
}
public static boolean removeUpdater(ConfigurationUpdater updater) {
return MANAGER.removeUpdater(updater);
}
public static void activateUpdaters(BundleContext bundleContext) {
MANAGER.activateUpdaters(bundleContext);
}
public static void deactivateUpdaters() {
MANAGER.deactivateUpdaters();
}
private String resolveConfigIdentifier() {
if (configuration.getAlternateConfigurationIdentifier() == null) {
return configuration.getConfigurationIdentifier();
}
final Configuration baseConfig = ConfigurationInitializer.resolveConfiguration(null);
String key = configuration.getConfigurationName().toString() + ".pidMode";
PidMode pidMode = baseConfig.getPidModeProperty(key);
if (pidMode == null) {
pidMode = baseConfig.getPidModeProperty("default.pidMode");
}
if (pidMode == PidMode.FULL_NAME) {
return configuration.getConfigurationIdentifier();
}
return configuration.getAlternateConfigurationIdentifier();
}
private ServiceRegistration register(
BundleContext bundleContext, String servicePid) {
final Hashtable<String, Object> properties =
new Hashtable<String, Object>();
properties.put(Constants.SERVICE_PID, servicePid);
return bundleContext.registerService(
ManagedService.class.getName(), this, properties);
}
private static void registerUpdaterFor(Configuration configuration) {
ConfigurationUpdater updater = new ConfigurationUpdater(configuration);
MANAGER.addUpdater(updater);
}
private static void setupListener() {
ConfigurationInitializer.addConfigurationCreationListener(
new ConfigurationCreationListener() {
@Override
public void configurationCreated(Configuration configuration) {
registerUpdaterFor(configuration);
}
}, true);
}
}