19package org.sleuthkit.autopsy.events;
21import java.beans.PropertyChangeListener;
24import java.util.concurrent.ConcurrentHashMap;
25import java.util.logging.Level;
26import javax.annotation.concurrent.ThreadSafe;
27import org.sleuthkit.autopsy.coreutils.Logger;
37final class LocalEventPublisher {
39 private static final Logger logger = Logger.getLogger(LocalEventPublisher.class.getName());
40 private final Map<String, Set<PropertyChangeListener>> subscribersByEvent;
46 LocalEventPublisher() {
47 subscribersByEvent =
new ConcurrentHashMap<>();
56 void addSubscriber(Set<String> eventNames, PropertyChangeListener subscriber) {
57 for (String eventName : eventNames) {
58 addSubscriber(eventName, subscriber);
68 void addSubscriber(String eventName, PropertyChangeListener subscriber) {
69 subscribersByEvent.putIfAbsent(eventName, ConcurrentHashMap.<PropertyChangeListener>newKeySet());
70 Set<PropertyChangeListener> subscribers = subscribersByEvent.get(eventName);
71 subscribers.add(subscriber);
80 void removeSubscriber(Set<String> eventNames, PropertyChangeListener subscriber) {
81 for (String eventName : eventNames) {
82 removeSubscriber(eventName, subscriber);
92 void removeSubscriber(String eventName, PropertyChangeListener subscriber) {
93 Set<PropertyChangeListener> subscribers = subscribersByEvent.getOrDefault(eventName,
null);
94 if (
null != subscribers) {
95 subscribers.remove(subscriber);
105 void publish(AutopsyEvent event) {
106 Set<PropertyChangeListener> subscribers = subscribersByEvent.getOrDefault(event.getPropertyName(),
null);
107 if (
null != subscribers) {
108 subscribers.forEach((subscriber) -> {
110 subscriber.propertyChange(event);
111 }
catch (Exception ex) {
112 logger.log(Level.SEVERE,
"Exception thrown by subscriber", ex);