diff --git a/Core/nbproject/project.properties b/Core/nbproject/project.properties
index 1452a1c82a..31a2400e50 100644
--- a/Core/nbproject/project.properties
+++ b/Core/nbproject/project.properties
@@ -1,6 +1,7 @@
+file.reference.activemq-all-5.11.1.jar=C:\\autopsy\\Core\\release\\modules\\ext\\activemq-all-5.11.1.jar
file.reference.jdom-2.0.5-contrib.jar=release/modules/ext/jdom-2.0.5-contrib.jar
file.reference.jdom-2.0.5.jar=release/modules/ext/jdom-2.0.5.jar
-file.reference.jython.jar=C:\\autopsy\\Core\\release\\modules\\ext\\jython.jar
+file.reference.jython.jar=release/modules/ext/jython.jar
file.reference.jython.jar-1=release/modules/ext/jython.jar
file.reference.metadata-extractor-2.6.2.jar=release/modules/ext/metadata-extractor-2.6.2.jar
file.reference.Rejistry-1.0-SNAPSHOT.jar=release/modules/ext/Rejistry-1.0-SNAPSHOT.jar
diff --git a/Core/nbproject/project.xml b/Core/nbproject/project.xml
index 592a2ab655..d55d332ea6 100644
--- a/Core/nbproject/project.xml
+++ b/Core/nbproject/project.xml
@@ -206,14 +206,6 @@
ext/jdom-2.0.5.jar
release/modules/ext/jdom-2.0.5.jar
-
- ext/Rejistry-1.0-SNAPSHOT.jar
- release/modules/ext/Rejistry-1.0-SNAPSHOT.jar
-
-
- ext/sevenzipjbinding.jar
- release/modules/ext/sevenzipjbinding.jar
-
ext/StixLib.jar
release/modules/ext/StixLib.jar
@@ -222,6 +214,18 @@
ext/sqlite-jdbc-3.7.15-M1.jar
release/modules/ext/sqlite-jdbc-3.7.15-M1.jar
+
+ ext/activemq-all-5.11.1.jar
+ release/modules/ext/activemq-all-5.11.1.jar
+
+
+ ext/Rejistry-1.0-SNAPSHOT.jar
+ release/modules/ext/Rejistry-1.0-SNAPSHOT.jar
+
+
+ ext/sevenzipjbinding.jar
+ release/modules/ext/sevenzipjbinding.jar
+
ext/sevenzipjbinding-AllPlatforms.jar
release/modules/ext/sevenzipjbinding-AllPlatforms.jar
diff --git a/Core/release/modules/ext/activemq-all-5.11.1.jar b/Core/release/modules/ext/activemq-all-5.11.1.jar
new file mode 100644
index 0000000000..59eff437fa
Binary files /dev/null and b/Core/release/modules/ext/activemq-all-5.11.1.jar differ
diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/Case.java b/Core/src/org/sleuthkit/autopsy/casemodule/Case.java
index b19a8d8979..e4734cf917 100644
--- a/Core/src/org/sleuthkit/autopsy/casemodule/Case.java
+++ b/Core/src/org/sleuthkit/autopsy/casemodule/Case.java
@@ -146,6 +146,8 @@ public class Case implements SleuthkitCase.ErrorObserver {
// we cache if the case has data in it yet since a few places ask for it and we dont' need to keep going to DB
private boolean hasData = false;
+ private Messenger messenger;
+
/**
* Constructor for the Case class
*/
@@ -158,6 +160,7 @@ public class Case implements SleuthkitCase.ErrorObserver {
this.db = db;
this.services = new Services(db);
db.addErrorObserver(this);
+ messenger = new Messenger(this.name);
}
/**
@@ -299,6 +302,7 @@ public class Case implements SleuthkitCase.ErrorObserver {
}
Case newCase = new Case(caseName, caseNumber, examiner, configFilePath, xmlcm, db);
+ newCase.messenger.start();
changeCase(newCase);
}
@@ -341,7 +345,8 @@ public class Case implements SleuthkitCase.ErrorObserver {
checkImagesExist(db);
Case openedCase = new Case(caseName, caseNumber, examiner, configFilePath, xmlcm, db);
-
+ openedCase.messenger.start();
+
changeCase(openedCase);
} catch (Exception ex) {
@@ -492,6 +497,7 @@ public class Case implements SleuthkitCase.ErrorObserver {
changeCase(null);
try {
+ messenger.stop();
services.close();
this.xmlcm.close(); // close the xmlcm
this.db.close();
diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/Messenger.java b/Core/src/org/sleuthkit/autopsy/casemodule/Messenger.java
new file mode 100644
index 0000000000..22cf212a02
--- /dev/null
+++ b/Core/src/org/sleuthkit/autopsy/casemodule/Messenger.java
@@ -0,0 +1,115 @@
+/*
+ * Autopsy Forensic Browser
+ *
+ * Copyright 2013-2015 Basis Technology Corp.
+ * Contact: carrier sleuthkit org
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.sleuthkit.autopsy.casemodule;
+
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.io.Serializable;
+import java.util.logging.Level;
+import javax.jms.Connection;
+import javax.jms.Message;
+import javax.jms.MessageConsumer;
+import javax.jms.MessageListener;
+import javax.jms.MessageProducer;
+import javax.jms.ObjectMessage;
+import javax.jms.Session;
+import javax.jms.TextMessage;
+import javax.jms.Topic;
+import org.apache.activemq.ActiveMQConnectionFactory;
+import org.sleuthkit.autopsy.coreutils.Logger;
+
+class Messenger implements PropertyChangeListener, MessageListener {
+
+ private static final String BROKER_URL = "tcp://10.1.8.234:61616";
+ private static final Logger logger = Logger.getLogger(Messenger.class.getName());
+ private final String caseName;
+ private Connection connection;
+ private Session session;
+ private MessageProducer producer;
+
+ Messenger(String caseName) {
+ this.caseName = caseName;
+ }
+
+ void start() {
+ try {
+ ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(BROKER_URL);
+ connection = connectionFactory.createConnection();
+ connection.start();
+ session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+ Topic topic = session.createTopic(caseName);
+ producer = session.createProducer(topic);
+
+ MessageConsumer consumer = session.createConsumer(topic, "event = '" + Case.Events.DATA_SOURCE_ADDED.toString() + "'", true);
+ consumer.setMessageListener(this);
+
+ Case.addPropertyChangeListener(this);
+ } catch (Exception ex) {
+ logger.log(Level.SEVERE, "Startup error", ex);
+ }
+ }
+
+ void stop() {
+ Case.removePropertyChangeListener(this);
+ try {
+ session.close();
+ connection.close();
+ } catch (Exception ex) {
+ logger.log(Level.SEVERE, "Shutdown error", ex);
+ }
+ }
+
+ @Override
+ public void propertyChange(PropertyChangeEvent event) {
+ switch (Case.Events.valueOf(event.getPropertyName())) {
+ case DATA_SOURCE_ADDED:
+ if (null != event.getNewValue()) {
+ send(event);
+ }
+ break;
+ }
+ }
+
+ private void send(PropertyChangeEvent event) {
+ try {
+ ObjectMessage message = session.createObjectMessage();
+ message.setStringProperty("event", Case.Events.DATA_SOURCE_ADDED.toString());
+ message.setObject(Case.Events.DATA_SOURCE_ADDED.toString());
+ producer.send(message);
+ } catch (Exception ex) {
+ logger.log(Level.SEVERE, "Publishing error", ex);
+ }
+ }
+
+ @Override
+ public void onMessage(Message message) {
+ try {
+ if (message instanceof ObjectMessage) {
+ ObjectMessage objMessage = (ObjectMessage) message;
+ String event = (String) objMessage.getObject();
+ logger.log(Level.INFO, "Received {0}", event);
+ }
+ Case.getCurrentCase().notifyNewDataSource(null);
+ } catch (Exception ex) {
+ logger.log(Level.SEVERE, "Publishing error", ex);
+ }
+
+ }
+
+}