Refine events package classes

This commit is contained in:
Richard Cordovano 2015-04-23 15:08:35 -04:00
parent a9ca930a60
commit ba2ecb8ab3
3 changed files with 61 additions and 64 deletions

View File

@ -191,7 +191,7 @@ public class Case implements SleuthkitCase.ErrorObserver {
private boolean hasData = false; private boolean hasData = false;
private static final LocalPublisher eventPublisher = new LocalPublisher(); private static final LocalPublisher eventPublisher = new LocalPublisher();
private RemotePublisher messenger; private RemotePublisher remoteEventPublisher;
/** /**
* Constructor for the Case class * Constructor for the Case class
@ -207,7 +207,7 @@ public class Case implements SleuthkitCase.ErrorObserver {
this.services = new Services(db); this.services = new Services(db);
if (CaseType.MULTI_USER_CASE == this.caseType) { if (CaseType.MULTI_USER_CASE == this.caseType) {
try { try {
this.messenger = new RemotePublisher(this.name, eventPublisher, UserPreferences.getMessageServiceConnectionInfo()); this.remoteEventPublisher = new RemotePublisher(this.name, eventPublisher, UserPreferences.getMessageServiceConnectionInfo());
} catch (URISyntaxException | JMSException ex) { } catch (URISyntaxException | JMSException ex) {
// RJCTODO: Add some sort of notification to user. // RJCTODO: Add some sort of notification to user.
logger.log(Level.SEVERE, "Failed to start messenger", ex); logger.log(Level.SEVERE, "Failed to start messenger", ex);
@ -607,7 +607,7 @@ public class Case implements SleuthkitCase.ErrorObserver {
changeCase(null); changeCase(null);
try { try {
if (CaseType.MULTI_USER_CASE == this.caseType) { if (CaseType.MULTI_USER_CASE == this.caseType) {
messenger.stop(); remoteEventPublisher.stop();
} }
services.close(); services.close();
this.xmlcm.close(); // close the xmlcm 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 eventNames The events the subscriber is interested in.
* @param subscriber The subscriber to add. * @param subscriber The subscriber to add.
*/ */
public static void addEventSubscriber(Collection<String> eventNames, PropertyChangeListener subscriber) { public static void addEventSubscriber(Set<String> eventNames, PropertyChangeListener subscriber) {
eventPublisher.addSubscriber(eventNames, 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 eventNames The event the subscriber is no longer interested in.
* @param subscriber The subscriber to add. * @param subscriber The subscriber to add.
*/ */
public static void removeEventSubscriber(Collection<String> eventNames, PropertyChangeListener subscriber) { public static void removeEventSubscriber(Set<String> eventNames, PropertyChangeListener subscriber) {
eventPublisher.removeSubscriber(eventNames, subscriber); eventPublisher.removeSubscriber(eventNames, subscriber);
} }
@ -1019,9 +1019,9 @@ public class Case implements SleuthkitCase.ErrorObserver {
* @param event The event to send. * @param event The event to send.
*/ */
public void sendEventMessage(AutopsyEvent event) { public void sendEventMessage(AutopsyEvent event) {
if (CaseType.MULTI_USER_CASE == this.caseType && null != messenger) { if (CaseType.MULTI_USER_CASE == this.caseType && null != remoteEventPublisher) {
try { try {
messenger.send(event); remoteEventPublisher.send(event);
} catch (JMSException ex) { } catch (JMSException ex) {
logger.log(Level.SEVERE, String.format("Failed to send %s event message", event.getPropertyName()), ex); logger.log(Level.SEVERE, String.format("Failed to send %s event message", event.getPropertyName()), ex);
} }

View File

@ -59,7 +59,7 @@ public final class LocalPublisher {
* @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 public void addSubscriber(Collection<String> eventNames, PropertyChangeListener subscriber) { synchronized public void addSubscriber(Set<String> eventNames, PropertyChangeListener subscriber) {
for (String eventName : eventNames) { for (String eventName : eventNames) {
addSubscriber(eventName, subscriber); addSubscriber(eventName, subscriber);
} }
@ -83,7 +83,7 @@ public final class LocalPublisher {
* @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 public void removeSubscriber(Collection<String> eventNames, PropertyChangeListener subscriber) { synchronized public void removeSubscriber(Set<String> eventNames, PropertyChangeListener subscriber) {
for (String eventName : eventNames) { for (String eventName : eventNames) {
removeSubscriber(eventName, subscriber); removeSubscriber(eventName, subscriber);
} }

View File

@ -29,6 +29,7 @@ import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set;
import java.util.concurrent.Callable; import java.util.concurrent.Callable;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ExecutorService; import java.util.concurrent.ExecutorService;
@ -36,6 +37,8 @@ import java.util.concurrent.Executors;
import java.util.concurrent.Future; import java.util.concurrent.Future;
import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.atomic.AtomicLong;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import javax.jms.JMSException; import javax.jms.JMSException;
import javax.swing.JOptionPane; import javax.swing.JOptionPane;
import org.netbeans.api.progress.ProgressHandle; import org.netbeans.api.progress.ProgressHandle;
@ -98,28 +101,24 @@ public class IngestManager {
private int numberOfFileIngestThreads; private int numberOfFileIngestThreads;
private final ExecutorService fileIngestThreadPool; private final ExecutorService fileIngestThreadPool;
/** /*
* The ingest manager uses the property change feature from JavaBeans as an * The ingest manager uses the property change feature from JavaBeans as an
* application event publishing mechanism. There are two kinds of events, * application event publishing mechanism. There are two kinds of events,
ingest job events and ingest module events. Events are published locally * ingest job events and ingest module events. Events are published locally
(via LocalPublisher) and remotely (via RemotePublisher) in a dedicated event * (via LocalPublisher) and remotely (via RemotePublisher) in a dedicated
publishing thread. * event publishing thread.
*/ */
private static final Map<IngestJobEvent, String> jobEventToName = new HashMap<>(); private static final Set<String> jobEventNames = Stream.of(IngestJobEvent.values())
private static final Map<IngestModuleEvent, String> moduleEventToName = new HashMap<>(); .map(IngestJobEvent::toString)
// RJCTODO: Can this be done with lambdas? .collect(Collectors.toSet());
static { private final LocalPublisher localJobEventPublisher;
for (IngestJobEvent event : IngestJobEvent.values()) { private RemotePublisher remoteJobEventPublisher;
jobEventToName.put(event, event.toString());
} private static final Set<String> moduleEventNames = Stream.of(IngestModuleEvent.values())
for (IngestModuleEvent event : IngestModuleEvent.values()) { .map(IngestModuleEvent::toString)
moduleEventToName.put(event, event.toString()); .collect(Collectors.toSet());
} private final LocalPublisher localModuleEventPublisher;
} private RemotePublisher remoteModuleEventPublisher;
private final LocalPublisher jobEventPublisher;
private RemotePublisher jobEventMessenger;
private final LocalPublisher moduleEventPublisher;
private RemotePublisher moduleEventMessenger;
private final ExecutorService eventPublishingExecutor; private final ExecutorService eventPublishingExecutor;
/** /**
@ -246,9 +245,9 @@ public class IngestManager {
this.ingestThreadActivitySnapshots = new ConcurrentHashMap<>(); this.ingestThreadActivitySnapshots = new ConcurrentHashMap<>();
this.ingestErrorMessagePosts = new AtomicLong(0L); this.ingestErrorMessagePosts = new AtomicLong(0L);
this.ingestMonitor = new IngestMonitor(); 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.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.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.startIngestJobsThreadPool = Executors.newSingleThreadExecutor(new ThreadFactoryBuilder().setNameFormat("IM-start-ingest-jobs-%d").build()); //NON-NLS
this.nextThreadId = new AtomicLong(0L); this.nextThreadId = new AtomicLong(0L);
@ -313,14 +312,14 @@ public class IngestManager {
Case openedCase = Case.getCurrentCase(); Case openedCase = Case.getCurrentCase();
if (Case.CaseType.MULTI_USER_CASE == openedCase.getCaseType()) { if (Case.CaseType.MULTI_USER_CASE == openedCase.getCaseType()) {
try { try {
jobEventMessenger = new RemotePublisher(openedCase.getName(), jobEventPublisher, UserPreferences.getMessageServiceConnectionInfo()); remoteJobEventPublisher = new RemotePublisher(openedCase.getName(), localJobEventPublisher, UserPreferences.getMessageServiceConnectionInfo());
} catch (URISyntaxException | JMSException ex) { } 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 { try {
moduleEventMessenger = new RemotePublisher(openedCase.getName(), moduleEventPublisher, UserPreferences.getMessageServiceConnectionInfo()); remoteModuleEventPublisher = new RemotePublisher(openedCase.getName(), localModuleEventPublisher, UserPreferences.getMessageServiceConnectionInfo());
} catch (URISyntaxException | JMSException ex) { } 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) { } catch (IllegalStateException ex) {
@ -329,11 +328,11 @@ public class IngestManager {
} }
synchronized void handleCaseClosed() { synchronized void handleCaseClosed() {
if (null != jobEventMessenger) { if (null != remoteJobEventPublisher) {
jobEventMessenger.stop(); remoteJobEventPublisher.stop();
} }
if (null != moduleEventMessenger) { if (null != remoteModuleEventPublisher) {
moduleEventMessenger.stop(); remoteModuleEventPublisher.stop();
} }
this.jobCreationIsEnabled = false; this.jobCreationIsEnabled = false;
cancelAllIngestJobs(); cancelAllIngestJobs();
@ -557,7 +556,7 @@ public class IngestManager {
* @param listener The PropertyChangeListener to register. * @param listener The PropertyChangeListener to register.
*/ */
public void addIngestJobEventListener(final PropertyChangeListener listener) { 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. * @param listener The PropertyChangeListener to unregister.
*/ */
public void removeIngestJobEventListener(final PropertyChangeListener listener) { 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. * @param listener The PropertyChangeListener to register.
*/ */
public void addIngestModuleEventListener(final PropertyChangeListener listener) { 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. * @param listener The PropertyChangeListener to unregister.
*/ */
public void removeIngestModuleEventListener(final PropertyChangeListener listener) { public void removeIngestModuleEventListener(final PropertyChangeListener listener) {
moduleEventPublisher.removeSubscriber(moduleEventToName.values(), listener); localModuleEventPublisher.removeSubscriber(moduleEventNames, listener);
} }
/** /**
@ -596,8 +595,8 @@ public class IngestManager {
*/ */
@Deprecated @Deprecated
public static void addPropertyChangeListener(final PropertyChangeListener listener) { public static void addPropertyChangeListener(final PropertyChangeListener listener) {
instance.jobEventPublisher.addSubscriber(jobEventToName.values(), listener); instance.localJobEventPublisher.addSubscriber(jobEventNames, listener);
instance.moduleEventPublisher.addSubscriber(moduleEventToName.values(), listener); instance.localModuleEventPublisher.addSubscriber(moduleEventNames, listener);
} }
/** /**
@ -609,8 +608,8 @@ public class IngestManager {
*/ */
@Deprecated @Deprecated
public static void removePropertyChangeListener(final PropertyChangeListener listener) { public static void removePropertyChangeListener(final PropertyChangeListener listener) {
instance.jobEventPublisher.removeSubscriber(jobEventToName.values(), listener); instance.localJobEventPublisher.removeSubscriber(jobEventNames, listener);
instance.moduleEventPublisher.removeSubscriber(moduleEventToName.values(), listener); instance.localModuleEventPublisher.removeSubscriber(moduleEventNames, listener);
} }
/** /**
@ -620,7 +619,7 @@ public class IngestManager {
*/ */
void fireIngestJobStarted(long ingestJobId) { void fireIngestJobStarted(long ingestJobId) {
AutopsyEvent event = new AutopsyEvent(AutopsyEvent.SourceType.LOCAL, IngestJobEvent.STARTED.toString(), ingestJobId, null); 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) { void fireIngestJobCompleted(long ingestJobId) {
AutopsyEvent event = new AutopsyEvent(AutopsyEvent.SourceType.LOCAL, IngestJobEvent.COMPLETED.toString(), ingestJobId, null); 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) { void fireIngestJobCancelled(long ingestJobId) {
AutopsyEvent event = new AutopsyEvent(AutopsyEvent.SourceType.LOCAL, IngestJobEvent.CANCELLED.toString(), ingestJobId, null); 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) { void fireFileIngestDone(AbstractFile file) {
AutopsyEvent event = new FileAnalyzedEvent(AutopsyEvent.SourceType.LOCAL, 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) { void fireIngestModuleDataEvent(ModuleDataEvent moduleDataEvent) {
AutopsyEvent event = new BlackboardPostEvent(AutopsyEvent.SourceType.LOCAL, 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) { void fireIngestModuleContentEvent(ModuleContentEvent moduleContentEvent) {
AutopsyEvent event = new ContentChangedEvent(AutopsyEvent.SourceType.LOCAL, 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 static final class PublishEventTask implements Runnable {
private final AutopsyEvent event; private final AutopsyEvent event;
private final LocalPublisher publisher; private final LocalPublisher localPublisher;
private final RemotePublisher messenger; private final RemotePublisher remotePublisher;
/** /**
* Constructs an object that publishes ingest events to both local and * Constructs an object that publishes ingest events to both local and
* remote subscribers. * remote subscribers.
* *
* @param event The event to publish * @param event The event to publish.
* @param publisher The event publisher to use for local event * @param localPublisher The local event publisher.
* publications. * @param remotePublisher The remote event publisher.
* @param messenger The jobEventMessenger to use for remote event
* publication.
*/ */
PublishEventTask(AutopsyEvent event, LocalPublisher publisher, RemotePublisher messenger) { PublishEventTask(AutopsyEvent event, LocalPublisher localPublisher, RemotePublisher remotePublisher) {
this.event = event; this.event = event;
this.publisher = publisher; this.localPublisher = localPublisher;
this.messenger = messenger; this.remotePublisher = remotePublisher;
} }
/** /**
@ -909,7 +906,7 @@ public class IngestManager {
*/ */
private void publishLocally() { private void publishLocally() {
event.setSourceType(AutopsyEvent.SourceType.LOCAL); event.setSourceType(AutopsyEvent.SourceType.LOCAL);
publisher.publish(event); localPublisher.publish(event);
} }
/** /**
@ -918,7 +915,7 @@ public class IngestManager {
private void publishRemotely() { private void publishRemotely() {
event.setSourceType(AutopsyEvent.SourceType.REMOTE); event.setSourceType(AutopsyEvent.SourceType.REMOTE);
try { try {
messenger.send(event); remotePublisher.send(event);
} catch (JMSException ex) { } catch (JMSException ex) {
logger.log(Level.SEVERE, "Failed to publish event to remote subscribers", ex); logger.log(Level.SEVERE, "Failed to publish event to remote subscribers", ex);
} }