Merge pull request #1582 from rcordovano/local_event_pub_restore

Rollback LocalEventPublisher commit f5dd822128878096d79add9bdc4aae703…
This commit is contained in:
Richard Cordovano 2015-09-21 09:16:06 -04:00
commit 68ca2f34ff

View File

@ -19,10 +19,9 @@
package org.sleuthkit.autopsy.events; package org.sleuthkit.autopsy.events;
import java.beans.PropertyChangeListener; import java.beans.PropertyChangeListener;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.logging.Level; import java.util.logging.Level;
import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.coreutils.Logger;
@ -43,15 +42,7 @@ final class LocalEventPublisher {
* this Autopsy node. * this Autopsy node.
*/ */
LocalEventPublisher() { LocalEventPublisher() {
/* subscribersByEvent = new ConcurrentHashMap<>();
* Thread-safety was originally provided through use of a
* ConcurrentHashMap as the subscribers by event collection. However,
* the semantics of ConcurrentHashMap are such that it was possible for
* a subscriber to receive an event after unsubscribing. To eliminate
* this possibility, the map was changed to an ordinary map and the
* methods of this class were made synchronized instead.
*/
subscribersByEvent = new HashMap<>();
} }
/** /**
@ -60,7 +51,7 @@ final class LocalEventPublisher {
* @param eventNames The events the subscriber is interested in. * @param eventNames The events the subscriber is interested in.
* @param subscriber The subscriber to add. * @param subscriber The subscriber to add.
*/ */
synchronized void addSubscriber(Set<String> eventNames, PropertyChangeListener subscriber) { void addSubscriber(Set<String> eventNames, PropertyChangeListener subscriber) {
for (String eventName : eventNames) { for (String eventName : eventNames) {
addSubscriber(eventName, subscriber); addSubscriber(eventName, subscriber);
} }
@ -72,10 +63,8 @@ final class LocalEventPublisher {
* @param eventName The event the subscriber is interested in. * @param eventName The event the subscriber is interested in.
* @param subscriber The subscriber to add. * @param subscriber The subscriber to add.
*/ */
synchronized void addSubscriber(String eventName, PropertyChangeListener subscriber) { void addSubscriber(String eventName, PropertyChangeListener subscriber) {
if (!subscribersByEvent.containsKey(eventName)) { subscribersByEvent.putIfAbsent(eventName, ConcurrentHashMap.<PropertyChangeListener>newKeySet());
subscribersByEvent.put(eventName, new HashSet<>());
}
Set<PropertyChangeListener> subscribers = subscribersByEvent.get(eventName); Set<PropertyChangeListener> subscribers = subscribersByEvent.get(eventName);
subscribers.add(subscriber); subscribers.add(subscriber);
} }
@ -86,7 +75,7 @@ final class LocalEventPublisher {
* @param eventNames The events the subscriber is no longer interested in. * @param eventNames The events the subscriber is no longer interested in.
* @param subscriber The subscriber to remove. * @param subscriber The subscriber to remove.
*/ */
synchronized void removeSubscriber(Set<String> eventNames, PropertyChangeListener subscriber) { void removeSubscriber(Set<String> eventNames, PropertyChangeListener subscriber) {
for (String eventName : eventNames) { for (String eventName : eventNames) {
removeSubscriber(eventName, subscriber); removeSubscriber(eventName, subscriber);
} }
@ -98,7 +87,7 @@ final class LocalEventPublisher {
* @param eventNames The event the subscriber is no longer interested in. * @param eventNames The event the subscriber is no longer interested in.
* @param subscriber The subscriber to remove. * @param subscriber The subscriber to remove.
*/ */
synchronized void removeSubscriber(String eventName, PropertyChangeListener subscriber) { void removeSubscriber(String eventName, PropertyChangeListener subscriber) {
Set<PropertyChangeListener> subscribers = subscribersByEvent.getOrDefault(eventName, null); Set<PropertyChangeListener> subscribers = subscribersByEvent.getOrDefault(eventName, null);
if (null != subscribers) { if (null != subscribers) {
subscribers.remove(subscriber); subscribers.remove(subscriber);
@ -111,7 +100,7 @@ final class LocalEventPublisher {
* *
* @param event The event to be published. * @param event The event to be published.
*/ */
synchronized void publish(AutopsyEvent event) { void publish(AutopsyEvent event) {
Set<PropertyChangeListener> subscribers = subscribersByEvent.getOrDefault(event.getPropertyName(), null); Set<PropertyChangeListener> subscribers = subscribersByEvent.getOrDefault(event.getPropertyName(), null);
if (null != subscribers) { if (null != subscribers) {
for (PropertyChangeListener subscriber : subscribers) { for (PropertyChangeListener subscriber : subscribers) {