/* * Copyright (c) 2009-2010 by Christian Lorenz, * Zuse Institute Berlin * * Licensed under the BSD License, see LICENSE file for details. * */ package de.mxro.thrd.xstreemfs.foundation.monitoring; import java.util.List; import java.util.Set; import java.util.Map.Entry; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.CopyOnWriteArrayList; /** * The class provides the ability to monitor data. The data must be added via push (put-method). For getting the * contained data poll (get-method) and push (via listeners) is supported.<br> * NOTE: This class is thread-safe. <br> * 22.07.2009 */ public class Monitoring<V> { /** * contains the monitored data */ protected ConcurrentHashMap<String, V> datasets; /** * contains the registered listeners */ protected ConcurrentHashMap<String, List<MonitoringListener<V>>> listeners; /** * */ public Monitoring() { datasets = new ConcurrentHashMap<String, V>(); listeners = new ConcurrentHashMap<String, List<MonitoringListener<V>>>(); } /** * Adds the value to the given key and overwrites the old value. Notifies all associated listeners. * * @param key * @param value * @return * @see java.util.HashMap#put(java.lang.Object, java.lang.Object) */ public V put(String key, V value) { assert (key != null && value != null); V oldValue = datasets.put(key, value); // check if listeners are registered if (listeners.containsKey(key)) { MonitoringEvent<V> event = new MonitoringEvent<V>(this, key, value); for (MonitoringListener<V> listener : listeners.get(key)) listener.valueAddedOrChanged(event); } return oldValue; } /** * @param key * @return * @see java.util.HashMap#get(java.lang.Object) */ public V get(String key) { return datasets.get(key); } /** * @param key * @return * @see java.util.HashMap#containsKey(java.lang.Object) */ public boolean containsKey(String key) { return datasets.containsKey(key); } /** * @return * @see java.util.HashMap#entrySet() */ public Set<Entry<String, V>> entrySet() { return datasets.entrySet(); } /** * @param key * @return * @see java.util.HashMap#remove(java.lang.Object) */ public V remove(String key) { return datasets.remove(key); } /** * @return * @see java.util.HashMap#size() */ public int size() { return datasets.size(); } /** * @return * @see java.util.AbstractMap#toString() */ public String toString() { return datasets.toString(); } /** * Registers a listener for the specified key. If the value of the key changes, the associated listeners * will be notified. * * @param key * @param listener */ public void registerListener(String key, MonitoringListener<V> listener) { List<MonitoringListener<V>> list = listeners.get(key); if (list == null) { list = new CopyOnWriteArrayList<MonitoringListener<V>>(); listeners.put(key, list); } list.add(listener); } /** * Unregisters the given listener for the given key. * * @param key * @param listener */ public void unregisterListener(String key, MonitoringListener<V> listener) { List<MonitoringListener<V>> list = listeners.get(key); if (list != null) { int index = list.indexOf(listener); if (index != -1) list.remove(index); } } /* * system-wide stuff */ private static boolean monitoringEnabled = false; /** * enables monitoring for the whole system */ public static void enable() { monitoringEnabled = true; } /** * @return the monitoringEnabled */ public static boolean isEnabled() { return monitoringEnabled; } }