Package org.talend.esb.mep.requestcallback.impl.osgi

Source Code of org.talend.esb.mep.requestcallback.impl.osgi.ConfigurationUpdater$Manager

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);
  }
}
TOP

Related Classes of org.talend.esb.mep.requestcallback.impl.osgi.ConfigurationUpdater$Manager

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.