package de.is24.util.monitoring; import java.util.Collection; import java.util.List; import java.util.concurrent.ConcurrentHashMap; /** * Wrapper class for monitors. Simplifies boilerplate administration. * * @param <T> the type of monitor beans */ class Monitors<T extends Reportable> { private final ConcurrentHashMap<String, T> monitors = new ConcurrentHashMap<String, T>(); private final List<ReportableObserver> reportableObservers; public Monitors(List<ReportableObserver> reportableObservers) { this.reportableObservers = reportableObservers; } public T get(String key, Factory<T> factory) { T result = get(key); if (result == null) { synchronized (monitors) { result = get(key); if (result == null) { result = factory.createMonitor(); put(key, result); notifyReportableObservers(result); } } } return result; } public T get(String key) { return monitors.get(key); } public T put(String key, T reportable) { return monitors.put(key, reportable); } public void putIfAbsent(String key, T reportable) { monitors.putIfAbsent(key, reportable); notifyReportableObservers(reportable); } private void notifyReportableObservers(Reportable reportable) { for (ReportableObserver reportableObserver : reportableObservers) { reportableObserver.addNewReportable(reportable); } } public void accept(ReportVisitor reportVisitor) { for (Reportable reportable : getMonitors()) { reportable.accept(reportVisitor); } } public Collection<T> getMonitors() { return monitors.values(); } public interface Factory<T> { T createMonitor(); } }