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 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<String> eventNames, PropertyChangeListener subscriber) {
public static void addEventSubscriber(Set<String> 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<String> eventNames, PropertyChangeListener subscriber) {
public static void removeEventSubscriber(Set<String> 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);
}

View File

@ -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<String> eventNames, PropertyChangeListener subscriber) {
synchronized public void addSubscriber(Set<String> 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<String> eventNames, PropertyChangeListener subscriber) {
synchronized public void removeSubscriber(Set<String> eventNames, PropertyChangeListener subscriber) {
for (String eventName : eventNames) {
removeSubscriber(eventName, subscriber);
}

View File

@ -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<IngestJobEvent, String> jobEventToName = new HashMap<>();
private static final Map<IngestModuleEvent, String> 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<String> jobEventNames = Stream.of(IngestJobEvent.values())
.map(IngestJobEvent::toString)
.collect(Collectors.toSet());
private final LocalPublisher localJobEventPublisher;
private RemotePublisher remoteJobEventPublisher;
private static final Set<String> 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);
}