From ba2ecb8ab3298a0259d242582a92a74a45c415a0 Mon Sep 17 00:00:00 2001 From: Richard Cordovano Date: Thu, 23 Apr 2015 15:08:35 -0400 Subject: [PATCH] Refine events package classes --- .../sleuthkit/autopsy/casemodule/Case.java | 14 +-- .../autopsy/events/LocalPublisher.java | 4 +- .../autopsy/ingest/IngestManager.java | 107 +++++++++--------- 3 files changed, 61 insertions(+), 64 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/Case.java b/Core/src/org/sleuthkit/autopsy/casemodule/Case.java index 8765fbdd20..b293026c95 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/Case.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/Case.java @@ -191,7 +191,7 @@ public class Case implements SleuthkitCase.ErrorObserver { private boolean hasData = false; private static final LocalPublisher eventPublisher = new LocalPublisher(); - private RemotePublisher messenger; + private RemotePublisher remoteEventPublisher; /** * Constructor for the Case class @@ -207,7 +207,7 @@ public class Case implements SleuthkitCase.ErrorObserver { this.services = new Services(db); if (CaseType.MULTI_USER_CASE == this.caseType) { try { - this.messenger = new RemotePublisher(this.name, eventPublisher, UserPreferences.getMessageServiceConnectionInfo()); + this.remoteEventPublisher = new RemotePublisher(this.name, eventPublisher, UserPreferences.getMessageServiceConnectionInfo()); } catch (URISyntaxException | JMSException ex) { // RJCTODO: Add some sort of notification to user. logger.log(Level.SEVERE, "Failed to start messenger", ex); @@ -607,7 +607,7 @@ public class Case implements SleuthkitCase.ErrorObserver { changeCase(null); try { if (CaseType.MULTI_USER_CASE == this.caseType) { - messenger.stop(); + remoteEventPublisher.stop(); } services.close(); this.xmlcm.close(); // close the xmlcm @@ -976,7 +976,7 @@ public class Case implements SleuthkitCase.ErrorObserver { * @param eventNames The events the subscriber is interested in. * @param subscriber The subscriber to add. */ - public static void addEventSubscriber(Collection eventNames, PropertyChangeListener subscriber) { + public static void addEventSubscriber(Set eventNames, PropertyChangeListener subscriber) { eventPublisher.addSubscriber(eventNames, subscriber); } @@ -1009,7 +1009,7 @@ public class Case implements SleuthkitCase.ErrorObserver { * @param eventNames The event the subscriber is no longer interested in. * @param subscriber The subscriber to add. */ - public static void removeEventSubscriber(Collection eventNames, PropertyChangeListener subscriber) { + public static void removeEventSubscriber(Set eventNames, PropertyChangeListener subscriber) { eventPublisher.removeSubscriber(eventNames, subscriber); } @@ -1019,9 +1019,9 @@ public class Case implements SleuthkitCase.ErrorObserver { * @param event The event to send. */ public void sendEventMessage(AutopsyEvent event) { - if (CaseType.MULTI_USER_CASE == this.caseType && null != messenger) { + if (CaseType.MULTI_USER_CASE == this.caseType && null != remoteEventPublisher) { try { - messenger.send(event); + remoteEventPublisher.send(event); } catch (JMSException ex) { logger.log(Level.SEVERE, String.format("Failed to send %s event message", event.getPropertyName()), ex); } diff --git a/Core/src/org/sleuthkit/autopsy/events/LocalPublisher.java b/Core/src/org/sleuthkit/autopsy/events/LocalPublisher.java index 4d0e307223..b992c74b48 100644 --- a/Core/src/org/sleuthkit/autopsy/events/LocalPublisher.java +++ b/Core/src/org/sleuthkit/autopsy/events/LocalPublisher.java @@ -59,7 +59,7 @@ public final class LocalPublisher { * @param eventNames The events the subscriber is interested in. * @param subscriber The subscriber to add. */ - synchronized public void addSubscriber(Collection eventNames, PropertyChangeListener subscriber) { + synchronized public void addSubscriber(Set eventNames, PropertyChangeListener subscriber) { for (String eventName : eventNames) { addSubscriber(eventName, subscriber); } @@ -83,7 +83,7 @@ public final class LocalPublisher { * @param eventNames The events the subscriber is no longer interested in. * @param subscriber The subscriber to remove. */ - synchronized public void removeSubscriber(Collection eventNames, PropertyChangeListener subscriber) { + synchronized public void removeSubscriber(Set eventNames, PropertyChangeListener subscriber) { for (String eventName : eventNames) { removeSubscriber(eventName, subscriber); } diff --git a/Core/src/org/sleuthkit/autopsy/ingest/IngestManager.java b/Core/src/org/sleuthkit/autopsy/ingest/IngestManager.java index 3a04c4b9c6..10e0f4bea6 100644 --- a/Core/src/org/sleuthkit/autopsy/ingest/IngestManager.java +++ b/Core/src/org/sleuthkit/autopsy/ingest/IngestManager.java @@ -29,6 +29,7 @@ import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.concurrent.Callable; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ExecutorService; @@ -36,6 +37,8 @@ import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.atomic.AtomicLong; import java.util.logging.Level; +import java.util.stream.Collectors; +import java.util.stream.Stream; import javax.jms.JMSException; import javax.swing.JOptionPane; import org.netbeans.api.progress.ProgressHandle; @@ -98,28 +101,24 @@ public class IngestManager { private int numberOfFileIngestThreads; private final ExecutorService fileIngestThreadPool; - /** + /* * The ingest manager uses the property change feature from JavaBeans as an * application event publishing mechanism. There are two kinds of events, - ingest job events and ingest module events. Events are published locally - (via LocalPublisher) and remotely (via RemotePublisher) in a dedicated event - publishing thread. + * ingest job events and ingest module events. Events are published locally + * (via LocalPublisher) and remotely (via RemotePublisher) in a dedicated + * event publishing thread. */ - private static final Map jobEventToName = new HashMap<>(); - private static final Map moduleEventToName = new HashMap<>(); - // RJCTODO: Can this be done with lambdas? - static { - for (IngestJobEvent event : IngestJobEvent.values()) { - jobEventToName.put(event, event.toString()); - } - for (IngestModuleEvent event : IngestModuleEvent.values()) { - moduleEventToName.put(event, event.toString()); - } - } - private final LocalPublisher jobEventPublisher; - private RemotePublisher jobEventMessenger; - private final LocalPublisher moduleEventPublisher; - private RemotePublisher moduleEventMessenger; + private static final Set jobEventNames = Stream.of(IngestJobEvent.values()) + .map(IngestJobEvent::toString) + .collect(Collectors.toSet()); + private final LocalPublisher localJobEventPublisher; + private RemotePublisher remoteJobEventPublisher; + + private static final Set moduleEventNames = Stream.of(IngestModuleEvent.values()) + .map(IngestModuleEvent::toString) + .collect(Collectors.toSet()); + private final LocalPublisher localModuleEventPublisher; + private RemotePublisher remoteModuleEventPublisher; private final ExecutorService eventPublishingExecutor; /** @@ -246,9 +245,9 @@ public class IngestManager { this.ingestThreadActivitySnapshots = new ConcurrentHashMap<>(); this.ingestErrorMessagePosts = new AtomicLong(0L); this.ingestMonitor = new IngestMonitor(); - this.moduleEventPublisher = new LocalPublisher(); + this.localModuleEventPublisher = new LocalPublisher(); this.eventPublishingExecutor = Executors.newSingleThreadExecutor(new ThreadFactoryBuilder().setNameFormat("IM-ingest-events-%d").build()); //NON-NLS - this.jobEventPublisher = new LocalPublisher(); + this.localJobEventPublisher = new LocalPublisher(); this.dataSourceIngestThreadPool = Executors.newSingleThreadExecutor(new ThreadFactoryBuilder().setNameFormat("IM-data-source-ingest-%d").build()); //NON-NLS this.startIngestJobsThreadPool = Executors.newSingleThreadExecutor(new ThreadFactoryBuilder().setNameFormat("IM-start-ingest-jobs-%d").build()); //NON-NLS this.nextThreadId = new AtomicLong(0L); @@ -313,14 +312,14 @@ public class IngestManager { Case openedCase = Case.getCurrentCase(); if (Case.CaseType.MULTI_USER_CASE == openedCase.getCaseType()) { try { - jobEventMessenger = new RemotePublisher(openedCase.getName(), jobEventPublisher, UserPreferences.getMessageServiceConnectionInfo()); + remoteJobEventPublisher = new RemotePublisher(openedCase.getName(), localJobEventPublisher, UserPreferences.getMessageServiceConnectionInfo()); } catch (URISyntaxException | JMSException ex) { - logger.log(Level.SEVERE, "Failed to start messenger, cannot publish job events to remotes", ex); + logger.log(Level.SEVERE, "Failed to start remote job events publisher", ex); //NON-NLS } try { - moduleEventMessenger = new RemotePublisher(openedCase.getName(), moduleEventPublisher, UserPreferences.getMessageServiceConnectionInfo()); + remoteModuleEventPublisher = new RemotePublisher(openedCase.getName(), localModuleEventPublisher, UserPreferences.getMessageServiceConnectionInfo()); } catch (URISyntaxException | JMSException ex) { - logger.log(Level.SEVERE, "Failed to start messenger, cannot publish module events to remotes", ex); + logger.log(Level.SEVERE, "Failed to start remote module events publisher", ex); //NON-NLS } } } catch (IllegalStateException ex) { @@ -329,11 +328,11 @@ public class IngestManager { } synchronized void handleCaseClosed() { - if (null != jobEventMessenger) { - jobEventMessenger.stop(); + if (null != remoteJobEventPublisher) { + remoteJobEventPublisher.stop(); } - if (null != moduleEventMessenger) { - moduleEventMessenger.stop(); + if (null != remoteModuleEventPublisher) { + remoteModuleEventPublisher.stop(); } this.jobCreationIsEnabled = false; cancelAllIngestJobs(); @@ -557,7 +556,7 @@ public class IngestManager { * @param listener The PropertyChangeListener to register. */ public void addIngestJobEventListener(final PropertyChangeListener listener) { - jobEventPublisher.addSubscriber(jobEventToName.values(), listener); + localJobEventPublisher.addSubscriber(jobEventNames, listener); } /** @@ -566,7 +565,7 @@ public class IngestManager { * @param listener The PropertyChangeListener to unregister. */ public void removeIngestJobEventListener(final PropertyChangeListener listener) { - jobEventPublisher.removeSubscriber(jobEventToName.values(), listener); + localJobEventPublisher.removeSubscriber(jobEventNames, listener); } /** @@ -575,7 +574,7 @@ public class IngestManager { * @param listener The PropertyChangeListener to register. */ public void addIngestModuleEventListener(final PropertyChangeListener listener) { - moduleEventPublisher.addSubscriber(moduleEventToName.values(), listener); + localModuleEventPublisher.addSubscriber(moduleEventNames, listener); } /** @@ -584,7 +583,7 @@ public class IngestManager { * @param listener The PropertyChangeListener to unregister. */ public void removeIngestModuleEventListener(final PropertyChangeListener listener) { - moduleEventPublisher.removeSubscriber(moduleEventToName.values(), listener); + localModuleEventPublisher.removeSubscriber(moduleEventNames, listener); } /** @@ -596,8 +595,8 @@ public class IngestManager { */ @Deprecated public static void addPropertyChangeListener(final PropertyChangeListener listener) { - instance.jobEventPublisher.addSubscriber(jobEventToName.values(), listener); - instance.moduleEventPublisher.addSubscriber(moduleEventToName.values(), listener); + instance.localJobEventPublisher.addSubscriber(jobEventNames, listener); + instance.localModuleEventPublisher.addSubscriber(moduleEventNames, listener); } /** @@ -609,8 +608,8 @@ public class IngestManager { */ @Deprecated public static void removePropertyChangeListener(final PropertyChangeListener listener) { - instance.jobEventPublisher.removeSubscriber(jobEventToName.values(), listener); - instance.moduleEventPublisher.removeSubscriber(moduleEventToName.values(), listener); + instance.localJobEventPublisher.removeSubscriber(jobEventNames, listener); + instance.localModuleEventPublisher.removeSubscriber(moduleEventNames, listener); } /** @@ -620,7 +619,7 @@ public class IngestManager { */ void fireIngestJobStarted(long ingestJobId) { AutopsyEvent event = new AutopsyEvent(AutopsyEvent.SourceType.LOCAL, IngestJobEvent.STARTED.toString(), ingestJobId, null); - eventPublishingExecutor.submit(new PublishEventTask(event, jobEventPublisher, jobEventMessenger)); + eventPublishingExecutor.submit(new PublishEventTask(event, localJobEventPublisher, remoteJobEventPublisher)); } /** @@ -630,7 +629,7 @@ public class IngestManager { */ void fireIngestJobCompleted(long ingestJobId) { AutopsyEvent event = new AutopsyEvent(AutopsyEvent.SourceType.LOCAL, IngestJobEvent.COMPLETED.toString(), ingestJobId, null); - eventPublishingExecutor.submit(new PublishEventTask(event, jobEventPublisher, jobEventMessenger)); + eventPublishingExecutor.submit(new PublishEventTask(event, localJobEventPublisher, remoteJobEventPublisher)); } /** @@ -640,7 +639,7 @@ public class IngestManager { */ void fireIngestJobCancelled(long ingestJobId) { AutopsyEvent event = new AutopsyEvent(AutopsyEvent.SourceType.LOCAL, IngestJobEvent.CANCELLED.toString(), ingestJobId, null); - eventPublishingExecutor.submit(new PublishEventTask(event, jobEventPublisher, jobEventMessenger)); + eventPublishingExecutor.submit(new PublishEventTask(event, localJobEventPublisher, remoteJobEventPublisher)); } /** @@ -650,7 +649,7 @@ public class IngestManager { */ void fireFileIngestDone(AbstractFile file) { AutopsyEvent event = new FileAnalyzedEvent(AutopsyEvent.SourceType.LOCAL, file); - eventPublishingExecutor.submit(new PublishEventTask(event, moduleEventPublisher, jobEventMessenger)); + eventPublishingExecutor.submit(new PublishEventTask(event, localModuleEventPublisher, remoteJobEventPublisher)); } /** @@ -660,7 +659,7 @@ public class IngestManager { */ void fireIngestModuleDataEvent(ModuleDataEvent moduleDataEvent) { AutopsyEvent event = new BlackboardPostEvent(AutopsyEvent.SourceType.LOCAL, moduleDataEvent); - eventPublishingExecutor.submit(new PublishEventTask(event, moduleEventPublisher, jobEventMessenger)); + eventPublishingExecutor.submit(new PublishEventTask(event, localModuleEventPublisher, remoteJobEventPublisher)); } /** @@ -672,7 +671,7 @@ public class IngestManager { */ void fireIngestModuleContentEvent(ModuleContentEvent moduleContentEvent) { AutopsyEvent event = new ContentChangedEvent(AutopsyEvent.SourceType.LOCAL, moduleContentEvent); - eventPublishingExecutor.submit(new PublishEventTask(event, moduleEventPublisher, jobEventMessenger)); + eventPublishingExecutor.submit(new PublishEventTask(event, localModuleEventPublisher, remoteJobEventPublisher)); } /** @@ -876,23 +875,21 @@ public class IngestManager { private static final class PublishEventTask implements Runnable { private final AutopsyEvent event; - private final LocalPublisher publisher; - private final RemotePublisher messenger; + private final LocalPublisher localPublisher; + private final RemotePublisher remotePublisher; /** * Constructs an object that publishes ingest events to both local and * remote subscribers. * - * @param event The event to publish - * @param publisher The event publisher to use for local event - * publications. - * @param messenger The jobEventMessenger to use for remote event - * publication. + * @param event The event to publish. + * @param localPublisher The local event publisher. + * @param remotePublisher The remote event publisher. */ - PublishEventTask(AutopsyEvent event, LocalPublisher publisher, RemotePublisher messenger) { + PublishEventTask(AutopsyEvent event, LocalPublisher localPublisher, RemotePublisher remotePublisher) { this.event = event; - this.publisher = publisher; - this.messenger = messenger; + this.localPublisher = localPublisher; + this.remotePublisher = remotePublisher; } /** @@ -909,7 +906,7 @@ public class IngestManager { */ private void publishLocally() { event.setSourceType(AutopsyEvent.SourceType.LOCAL); - publisher.publish(event); + localPublisher.publish(event); } /** @@ -918,7 +915,7 @@ public class IngestManager { private void publishRemotely() { event.setSourceType(AutopsyEvent.SourceType.REMOTE); try { - messenger.send(event); + remotePublisher.send(event); } catch (JMSException ex) { logger.log(Level.SEVERE, "Failed to publish event to remote subscribers", ex); }