TAMAYA-120: Add Observer for triggering events on certain configuration key ranges
Project: http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/commit/19a5dae4 Tree: http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/tree/19a5dae4 Diff: http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/diff/19a5dae4 Branch: refs/heads/master Commit: 19a5dae4b37df1be45f38cfdda4a23180e2088a8 Parents: fb52d6c Author: anatole <anat...@apache.org> Authored: Tue Oct 13 03:09:08 2015 +0200 Committer: Oliver B. Fischer <ple...@apache.org> Committed: Tue Sep 27 00:18:31 2016 +0200 ---------------------------------------------------------------------- .../apache/tamaya/events/ConfigListener.java | 11 ++-- .../tamaya/events/ConfigurationObserver.java | 54 +++++++++++++------- .../internal/DefaultConfigObserverSpi.java | 47 ++++++----------- .../events/internal/LoggingConfigListener.java | 10 +--- .../tamaya/events/spi/ConfigObserverSpi.java | 23 ++++----- 5 files changed, 65 insertions(+), 80 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/19a5dae4/src/main/java/org/apache/tamaya/events/ConfigListener.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/tamaya/events/ConfigListener.java b/src/main/java/org/apache/tamaya/events/ConfigListener.java index 1381c38..3608921 100644 --- a/src/main/java/org/apache/tamaya/events/ConfigListener.java +++ b/src/main/java/org/apache/tamaya/events/ConfigListener.java @@ -18,19 +18,14 @@ */ package org.apache.tamaya.events; -import org.apache.tamaya.Configuration; +import org.apache.tamaya.events.delta.ConfigurationChange; /** * Simple observer interface that can be registered using the current {@code ServiceContext}. * This class will be called on each configuration change detected in the current environment. */ +// @FunctionalInterface public interface ConfigListener - extends ConfigEventListener<ChangeNotification<Configuration>> { - - /** - * Get a regular expression to define, which keys this listener is interested in. - * @return - */ - String getKeyExpression(); + extends ConfigEventListener<ConfigurationChange> { } http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/19a5dae4/src/main/java/org/apache/tamaya/events/ConfigurationObserver.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/tamaya/events/ConfigurationObserver.java b/src/main/java/org/apache/tamaya/events/ConfigurationObserver.java index ffde3a3..1eafc0c 100644 --- a/src/main/java/org/apache/tamaya/events/ConfigurationObserver.java +++ b/src/main/java/org/apache/tamaya/events/ConfigurationObserver.java @@ -24,9 +24,10 @@ import org.apache.tamaya.spi.ServiceContextManager; import java.util.Arrays; import java.util.Collection; +import java.util.Set; /** - * Created by Anatole on 04.10.2015. + * Singleton accessor for managing {@link ConfigListener} instances and mappings. */ public class ConfigurationObserver { @@ -44,48 +45,63 @@ public class ConfigurationObserver { /** - * Add a listener for observing change events on {@link org.apache.tamaya.Configuration}. References of this - * component to the listeners must be managed as weak references. + * Add key expressions for generating ConfigurationChange events. * - * @param l the listener not null. + * @param keys the keys to be observed for changes. */ - public static <T> void addListener(ConfigListener l) { + public static <T> void addObservedKeys(Collection<String> keys) { if (SPI == null) { throw new ConfigException("No SPI registered for " + ConfigurationObserver.class.getName()); } - SPI.addListener(l); + SPI.addObservedKeys(keys); } /** - * Add a listener for observing change events on {@link org.apache.tamaya.spi.PropertySource}. References of this - * component to the listeners must be managed as weak references. + * Add key expressions for generating ConfigurationChange events. * - * @param l the listener not null. + * @param keys the keys to be observed for changes. */ - public static <T> void removeListener(ConfigListener l) { + public static <T> void addObservedKeys(String... keys) { if (SPI == null) { throw new ConfigException("No SPI registered for " + ConfigurationObserver.class.getName()); } - SPI.removeListener(l); + SPI.addObservedKeys(Arrays.asList(keys)); } /** - * Access all registered ConfigEventListeners listening to the given event key(s). + * Removes key expressions for generating ConfigurationChange events. * - * @return a list with the listeners found, never null. + * @param keys the keys to be observed for changes. */ - public static Collection<ConfigListener> getListeners(Collection<String> keys) { - return SPI.getListeners(keys); + public static <T> void removeObservedKeys(Collection<String> keys) { + if (SPI == null) { + throw new ConfigException("No SPI registered for " + + ConfigurationObserver.class.getName()); + } + SPI.removeObservedKeys(keys); + } + + /** + * Removes key expressions for generating ConfigurationChange events. + * + * @param keys the keys to be observed for changes. + */ + public static <T> void removeObservedKeys(String... keys) { + if (SPI == null) { + throw new ConfigException("No SPI registered for " + + ConfigurationObserver.class.getName()); + } + SPI.removeObservedKeys(Arrays.asList(keys)); } /** - * Access all registered ConfigEventListeners listening to the given event key(s). + * Get all registered key expressions for generating ConfigurationChange events. * - * @return a list with the listeners found, never null. + * @return set with the keys found, never null. */ - public static Collection<ConfigListener> getListeners(String... keys) { - return SPI.getListeners(Arrays.asList(keys)); + public static Set<String> getObservedKeys() { + return SPI.getObservedKeys(); } } http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/19a5dae4/src/main/java/org/apache/tamaya/events/internal/DefaultConfigObserverSpi.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/tamaya/events/internal/DefaultConfigObserverSpi.java b/src/main/java/org/apache/tamaya/events/internal/DefaultConfigObserverSpi.java index 1340f2c..a753040 100644 --- a/src/main/java/org/apache/tamaya/events/internal/DefaultConfigObserverSpi.java +++ b/src/main/java/org/apache/tamaya/events/internal/DefaultConfigObserverSpi.java @@ -19,6 +19,7 @@ package org.apache.tamaya.events.internal; import org.apache.tamaya.ConfigurationProvider; +import org.apache.tamaya.events.ConfigEventManager; import org.apache.tamaya.events.ConfigListener; import org.apache.tamaya.events.FrozenConfiguration; import org.apache.tamaya.events.delta.ConfigurationChange; @@ -29,6 +30,7 @@ import org.apache.tamaya.spi.ServiceContextManager; import java.beans.PropertyChangeEvent; import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Map; @@ -52,7 +54,7 @@ public class DefaultConfigObserverSpi implements ConfigObserverSpi { private static final Logger LOG = Logger.getLogger(DefaultConfigObserverSpi.class.getName()); - private Map<String, List<ConfigListener>> listenerMap = new ConcurrentHashMap<>(); + private Set<String> keys = new HashSet<>(); private Timer timer = new Timer("ConfigurationObserver", true); @@ -69,8 +71,9 @@ public class DefaultConfigObserverSpi implements ConfigObserverSpi { */ public DefaultConfigObserverSpi() { try { + // Load and register ConfigListener from the current ServiceContext for (ConfigListener l : ServiceContextManager.getServiceContext().getServices(ConfigListener.class)) { - addListener(l); + ConfigEventManager.addListener(l); } } catch (Exception e) { LOG.log(Level.WARNING, "Failed to load configured listeners.", e); @@ -98,49 +101,29 @@ public class DefaultConfigObserverSpi implements ConfigObserverSpi { } Set<ConfigListener> affected = new HashSet<>(); for(PropertyChangeEvent evt: changes.getChanges()) { - for (Map.Entry<String, List<ConfigListener>> en : listenerMap.entrySet()) { - if (evt.getPropertyName().matches(en.getKey())) { - for(ConfigListener l:en.getValue()){ - affected.add(l); - } + for (String key : keys) { + if (evt.getPropertyName().matches(key)) { + ConfigEventManager.fireEvent(changes); + return; } } } - for(ConfigListener l:affected){ - publisher.submit(new PublishConfigChangeTask(l, changes)); - } } @Override - public synchronized <T> void addListener(final ConfigListener l) { - List<ConfigListener> items = listenerMap.get(l.getKeyExpression()); - if (items == null) { - items = new ArrayList<>(); - listenerMap.put(l.getKeyExpression(), items); - } - items.add(l); + public synchronized <T> void addObservedKeys(Collection<String> keys) { + this.keys.addAll(keys); } @Override - public synchronized <T> void removeListener(ConfigListener l) { - List<ConfigListener> items = listenerMap.get(l.getKeyExpression()); - if (items != null) { - items.remove(l); - } + public synchronized <T> void removeObservedKeys(Collection<String> keys) { + this.keys.removeAll(keys); } @Override - public synchronized Collection<ConfigListener> getListeners(Collection<String> keys) { - List<ConfigListener> listeners = new ArrayList<>(); - for (String key : keys) { - for (Map.Entry<String, List<ConfigListener>> en : listenerMap.entrySet()) { - if (key.matches(en.getKey())) { - listeners.addAll(en.getValue()); - } - } - } - return listeners; + public synchronized Set<String> getObservedKeys() { + return Collections.unmodifiableSet(this.keys); } @Override http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/19a5dae4/src/main/java/org/apache/tamaya/events/internal/LoggingConfigListener.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/tamaya/events/internal/LoggingConfigListener.java b/src/main/java/org/apache/tamaya/events/internal/LoggingConfigListener.java index 059d1b5..43b2700 100644 --- a/src/main/java/org/apache/tamaya/events/internal/LoggingConfigListener.java +++ b/src/main/java/org/apache/tamaya/events/internal/LoggingConfigListener.java @@ -18,9 +18,8 @@ */ package org.apache.tamaya.events.internal; -import org.apache.tamaya.Configuration; -import org.apache.tamaya.events.ChangeNotification; import org.apache.tamaya.events.ConfigListener; +import org.apache.tamaya.events.delta.ConfigurationChange; import java.util.logging.Logger; @@ -32,12 +31,7 @@ public class LoggingConfigListener implements ConfigListener{ private static final Logger LOG = Logger.getLogger(LoggingConfigListener.class.getName()); @Override - public String getKeyExpression() { - return ".*"; - } - - @Override - public void onConfigEvent(ChangeNotification<Configuration> event) { + public void onConfigEvent(ConfigurationChange event) { LOG.info("Configuration changed: " + event); } } http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/19a5dae4/src/main/java/org/apache/tamaya/events/spi/ConfigObserverSpi.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/tamaya/events/spi/ConfigObserverSpi.java b/src/main/java/org/apache/tamaya/events/spi/ConfigObserverSpi.java index 17f5ccb..95eb6e7 100644 --- a/src/main/java/org/apache/tamaya/events/spi/ConfigObserverSpi.java +++ b/src/main/java/org/apache/tamaya/events/spi/ConfigObserverSpi.java @@ -18,9 +18,8 @@ */ package org.apache.tamaya.events.spi; -import org.apache.tamaya.events.ConfigListener; - import java.util.Collection; +import java.util.Set; /** * SPI interface to implement the {@link org.apache.tamaya.events.ConfigurationObserver} singleton. @@ -30,27 +29,25 @@ import java.util.Collection; */ public interface ConfigObserverSpi { /** - * Add a listener for observing events. References of this - * component to the listeners must be managed as weak references. + * Add key expressions for generating ConfigurationChange events. * - * @param l the listener not null. + * @param keys the keys to be observed for changes. */ - <T> void addListener(ConfigListener l); - + <T> void addObservedKeys(Collection<String> keys); /** - * Removes a listener for observing events. + * Remove key expressions for generating ConfigurationChange events. * - * @param l the listener not null. + * @param keys the keys to be observed for changes. */ - <T> void removeListener(ConfigListener l); + <T> void removeObservedKeys(Collection<String> keys); /** - * Access all registered ConfigEventListeners listening to the given event type. + * Get all registered key expressions for generating ConfigurationChange events. * - * @return a list with the listeners found, never null. + * @return a set with the keys found, never null. */ - Collection<ConfigListener> getListeners(Collection<String> keys); + Set<String> getObservedKeys(); /** * Get the current check period to check for configuration changes.