X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-distributed-datastore%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fcluster%2Fdatastore%2FDatastoreContextConfigAdminOverlay.java;h=abf07ecb40ea94e01ff965eaaa370bc256f24793;hp=20ee55519b945e42ffb3e06acf53b53d42a93556;hb=28e9832cc97a345d5ceb69262784e5c8fef77e37;hpb=3927509ec3ecfa32a51b725d2b7155d425f5b877 diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/DatastoreContextConfigAdminOverlay.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/DatastoreContextConfigAdminOverlay.java index 20ee55519b..abf07ecb40 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/DatastoreContextConfigAdminOverlay.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/DatastoreContextConfigAdminOverlay.java @@ -11,8 +11,11 @@ import java.io.IOException; import java.util.Dictionary; import org.osgi.framework.BundleContext; import org.osgi.framework.ServiceReference; +import org.osgi.framework.ServiceRegistration; import org.osgi.service.cm.Configuration; import org.osgi.service.cm.ConfigurationAdmin; +import org.osgi.service.cm.ConfigurationEvent; +import org.osgi.service.cm.ConfigurationListener; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -25,41 +28,60 @@ import org.slf4j.LoggerFactory; public class DatastoreContextConfigAdminOverlay implements AutoCloseable { public static final String CONFIG_ID = "org.opendaylight.controller.cluster.datastore"; + public interface Listener { + void onDatastoreContextUpdated(DatastoreContextFactory contextFactory); + } + private static final Logger LOG = LoggerFactory.getLogger(DatastoreContextConfigAdminOverlay.class); private final DatastoreContextIntrospector introspector; private final BundleContext bundleContext; + private ServiceRegistration configListenerServiceRef; + private Listener listener; - public DatastoreContextConfigAdminOverlay(DatastoreContextIntrospector introspector, BundleContext bundleContext) { + public DatastoreContextConfigAdminOverlay(DatastoreContextIntrospector introspector, + BundleContext bundleContext) { this.introspector = introspector; this.bundleContext = bundleContext; ServiceReference configAdminServiceReference = bundleContext.getServiceReference(ConfigurationAdmin.class); - if(configAdminServiceReference == null) { + if (configAdminServiceReference == null) { LOG.warn("No ConfigurationAdmin service found"); } else { overlaySettings(configAdminServiceReference); + + configListenerServiceRef = bundleContext.registerService(ConfigurationListener.class.getName(), + new DatastoreConfigurationListener(), null); } } + public void setListener(Listener listener) { + this.listener = listener; + } + + @SuppressWarnings("checkstyle:IllegalCatch") private void overlaySettings(ServiceReference configAdminServiceReference) { try { ConfigurationAdmin configAdmin = bundleContext.getService(configAdminServiceReference); Configuration config = configAdmin.getConfiguration(CONFIG_ID); - if(config != null) { + if (config != null) { Dictionary properties = config.getProperties(); LOG.debug("Overlaying settings: {}", properties); - introspector.update(properties); + if (introspector.update(properties)) { + if (listener != null) { + listener.onDatastoreContextUpdated(introspector.newContextFactory()); + } + } } else { LOG.debug("No Configuration found for {}", CONFIG_ID); } } catch (IOException e) { LOG.error("Error obtaining Configuration for pid {}", CONFIG_ID, e); - } catch(IllegalStateException e) { + } catch (IllegalStateException e) { // Ignore - indicates the bundleContext has been closed. } finally { try { @@ -72,5 +94,20 @@ public class DatastoreContextConfigAdminOverlay implements AutoCloseable { @Override public void close() { + listener = null; + + if (configListenerServiceRef != null) { + configListenerServiceRef.unregister(); + } + } + + private class DatastoreConfigurationListener implements ConfigurationListener { + @Override + public void configurationEvent(ConfigurationEvent event) { + if (CONFIG_ID.equals(event.getPid()) && event.getType() == ConfigurationEvent.CM_UPDATED) { + LOG.debug("configurationEvent: config {} was updated", CONFIG_ID); + overlaySettings(event.getReference()); + } + } } }