Merge branch 'develop' of github.com:sleuthkit/autopsy into develop

This commit is contained in:
Brian Carrier 2014-02-26 22:34:43 -05:00
commit c7ead95530
17 changed files with 93 additions and 138 deletions

View File

@ -61,47 +61,7 @@ public class Case implements SleuthkitCase.ErrorObserver {
private static final String autopsyVer = Version.getVersion(); // current version of autopsy. Change it when the version is changed
private static String appName = null;
/**
* Property name that indicates the name of the current case has changed.
* When a case is opened, "old name" is empty string and "new name" is the name.
* When a case is closed, "old name" is the case name and "new name" is empty string.
* When a case is renamed, "old name" has the original name and "new name" has the new name.
*/
public static final String CASE_NAME = "caseName";
/**
* Property name that indicates the number of the current case has changed.
* Fired with the case number is changed. The value is an int: the number of
* the case. -1 is used for no case number set.
*/
public static final String CASE_NUMBER = "caseNumber";
/**
* Property name that indicates the examiner of the current case has
* changed. Fired with the case examiner is changed. The value is a String:
* the name of the examiner. The empty string ("") is used for no examiner
* set.
*/
public static final String CASE_EXAMINER = "caseExaminer";
/**
* Property name that indicates a new data source (image, disk or local
* file) has been added to the current case. The new value is the
* newly-added instance of the new data source, and the old value is always
* null.
*/
public static final String CASE_ADD_DATA_SOURCE = "addDataSource";
/**
* Property name that indicates a data source has been removed from the
* current case. The "old value" is the (int) content ID of the data source
* that was removed, the new value is the instance of the data source.
*/
public static final String CASE_DEL_DATA_SOURCE = "removeDataSource";
/**
* Property name that indicates the currently open case has changed.
* When a case is opened, the "new value" will be an instance of the opened
* Case object and the "old value" will be null.
* When a case is closed, the "new value" will be null and the "old value"
* will be the instance of the Case object being closed.
*/
public static final String CASE_CURRENT_CASE = "currentCase";
/**
* Name for the property that determines whether to show the dialog at
* startup
@ -114,69 +74,53 @@ public class Case implements SleuthkitCase.ErrorObserver {
* Events that the case module will fire. Event listeners can get the event
* name by using String returned by toString() method on a specific event.
*/
/* @@@ BC: I added this as a place holder for what I want this to be, but
* this is not the time to change it. We'll start using this at a major release
* version.
*/
private enum CaseModuleEvent_DoNotUse {
/**
* Property name that indicates the name of the current case has changed.
* Fired with the case is renamed, and when the current case is
* opened/closed/changed. The value is a String: the name of the case. The
* empty string ("") is used for no open case.
*/
// @@@ BC: I propose that this is no longer called for case open/close.
CASE_NAME("caseName"),
/**
* Property name that indicates the number of the current case has changed.
* Fired with the case number is changed. The value is an int: the number of
* the case. -1 is used for no case number set.
*/
CASE_NUMBER("caseNumber"),
/**
* Property name that indicates the examiner of the current case has
* changed. Fired with the case examiner is changed. The value is a String:
* the name of the examiner. The empty string ("") is used for no examiner
* set.
*/
CASE_EXAMINER("caseExaminer"),
/**
* Property name that indicates a new data source (image, disk or local
* file) has been added to the current case. The new value is the
* newly-added instance of the new data source, and the old value is always
* null.
*/
CASE_ADD_DATA_SOURCE("addDataSource"),
/**
* Property name that indicates a data source has been removed from the
* current case. The "old value" is the (int) content ID of the data source
* that was removed, the new value is the instance of the data source.
*/
CASE_DEL_DATA_SOURCE("removeDataSource"),
public enum Events {
/**
* Property name that indicates the currently open case has changed. The new
* value is the instance of the opened Case, or null if there is no open
* case. The old value is the instance of the closed Case, or null if there
* was no open case.
* Property name that indicates the name of the current case has
* changed. When a case is opened, "old name" is empty string and "new
* name" is the name. When a case is closed, "old name" is the case name
* and "new name" is empty string. When a case is renamed, "old name"
* has the original name and "new name" has the new name.
*/
CASE_CURRENT_CASE("currentCase");
private String name;
CaseModuleEvent_DoNotUse(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
// @@@ BC: I propose that this is no longer called for case open/close.
NAME,
/**
* Property name that indicates the number of the current case has
* changed. Fired with the case number is changed. The value is an int:
* the number of the case. -1 is used for no case number set.
*/
NUMBER,
/**
* Property name that indicates the examiner of the current case has
* changed. Fired with the case examiner is changed. The value is a
* String: the name of the examiner. The empty string ("") is used for
* no examiner set.
*/
EXAMINER,
/**
* Property name that indicates a new data source (image, disk or local
* file) has been added to the current case. The new value is the
* newly-added instance of the new data source, and the old value is
* always null.
*/
DATA_SOURCE_ADDED,
/**
* Property name that indicates a data source has been removed from the
* current case. The "old value" is the (int) content ID of the data
* source that was removed, the new value is the instance of the data
* source.
*/
DATA_SOURCE_DELETED,
/**
* Property name that indicates the currently open case has changed.
* When a case is opened, the "new value" will be an instance of the
* opened Case object and the "old value" will be null. When a case is
* closed, the "new value" will be null and the "old value" will be the
* instance of the Case object being closed.
*/
CURRENT_CASE;
};
private String name;
private String number;
private String examiner;
@ -244,7 +188,7 @@ public class Case implements SleuthkitCase.ErrorObserver {
doCaseChange(null); //closes windows, etc
try {
pcs.firePropertyChange(CASE_CURRENT_CASE, oldCase, null);
pcs.firePropertyChange(Events.CURRENT_CASE.toString(), oldCase, null);
}
catch (Exception e) {
logger.log(Level.SEVERE, "Case listener threw exception", e);
@ -253,7 +197,7 @@ public class Case implements SleuthkitCase.ErrorObserver {
doCaseNameChange("");
try {
pcs.firePropertyChange(CASE_NAME, oldCase.name, "");
pcs.firePropertyChange(Events.NAME.toString(), oldCase.name, "");
}
catch (Exception e) {
logger.log(Level.SEVERE, "Case listener threw exception", e);
@ -266,7 +210,7 @@ public class Case implements SleuthkitCase.ErrorObserver {
try {
pcs.firePropertyChange(CASE_CURRENT_CASE, null, currentCase);
pcs.firePropertyChange(Events.CURRENT_CASE.toString(), null, currentCase);
}
catch (Exception e) {
logger.log(Level.SEVERE, "Case listener threw exception", e);
@ -276,7 +220,7 @@ public class Case implements SleuthkitCase.ErrorObserver {
try {
pcs.firePropertyChange(CASE_NAME, "", currentCase.name);
pcs.firePropertyChange(Events.NAME.toString(), "", currentCase.name);
}
catch (Exception e) {
logger.log(Level.SEVERE, "Case threw exception", e);
@ -441,7 +385,7 @@ public class Case implements SleuthkitCase.ErrorObserver {
Image newImage = db.getImageById(imgId);
try {
pcs.firePropertyChange(CASE_ADD_DATA_SOURCE, null, newImage); // the new value is the instance of the image
pcs.firePropertyChange(Events.DATA_SOURCE_ADDED.toString(), null, newImage); // the new value is the instance of the image
}
catch (Exception e) {
logger.log(Level.SEVERE, "Case listener threw exception", e);
@ -475,7 +419,7 @@ public class Case implements SleuthkitCase.ErrorObserver {
void notifyNewDataSource(Content newDataSource) {
try {
pcs.firePropertyChange(CASE_ADD_DATA_SOURCE, null, newDataSource);
pcs.firePropertyChange(Events.DATA_SOURCE_ADDED.toString(), null, newDataSource);
}
catch (Exception e) {
logger.log(Level.SEVERE, "Case threw exception", e);
@ -556,7 +500,7 @@ public class Case implements SleuthkitCase.ErrorObserver {
name = newCaseName; // change the local value
RecentCases.getInstance().updateRecentCase(oldCaseName, oldPath, newCaseName, newPath); // update the recent case
try {
pcs.firePropertyChange(CASE_NAME, oldCaseName, newCaseName);
pcs.firePropertyChange(Events.NAME.toString(), oldCaseName, newCaseName);
}
catch (Exception e) {
logger.log(Level.SEVERE, "Case listener threw exception", e);
@ -580,7 +524,7 @@ public class Case implements SleuthkitCase.ErrorObserver {
xmlcm.setCaseExaminer(newExaminer); // set the examiner
examiner = newExaminer;
try {
pcs.firePropertyChange(CASE_EXAMINER, oldExaminer, newExaminer);
pcs.firePropertyChange(Events.EXAMINER.toString(), oldExaminer, newExaminer);
}
catch (Exception e) {
logger.log(Level.SEVERE, "Case listener threw exception", e);
@ -603,7 +547,7 @@ public class Case implements SleuthkitCase.ErrorObserver {
number = newCaseNumber;
try {
pcs.firePropertyChange(CASE_NUMBER, oldCaseNumber, newCaseNumber);
pcs.firePropertyChange(Events.NUMBER.toString(), oldCaseNumber, newCaseNumber);
}
catch (Exception e) {
logger.log(Level.SEVERE, "Case listener threw exception", e);

View File

@ -236,6 +236,10 @@ import org.sleuthkit.autopsy.corecomponentinterfaces.DataResultViewer;
return true;
}
/**
* Thread note: Make sure to run this in the EDT as it causes GUI operations.
* @param selectedNode
*/
@Override
public void setNode(Node selectedNode) {
// change the cursor to "waiting cursor" for this operation

View File

@ -516,7 +516,7 @@ public final class DirectoryTreeTopComponent extends TopComponent implements Dat
Object newValue = evt.getNewValue();
// change in the case name
if (changed.equals(Case.CASE_NAME)) {
if (changed.equals(Case.Events.NAME.toString())) {
// set the main title of the window
String oldCaseName = oldValue.toString();
String newCaseName = newValue.toString();
@ -529,7 +529,7 @@ public final class DirectoryTreeTopComponent extends TopComponent implements Dat
em.getRootContext().setDisplayName(newCaseName);
}
} // changed current case
else if (changed.equals(Case.CASE_CURRENT_CASE)) {
else if (changed.equals(Case.Events.CURRENT_CASE.toString())) {
// When a case is closed, the old value of this property is the
// closed Case object and the new value is null. When a case is
// opened, the old value is null and the new value is the new Case
@ -553,7 +553,7 @@ public final class DirectoryTreeTopComponent extends TopComponent implements Dat
resetHistory();
}
} // if the image is added to the case
else if (changed.equals(Case.CASE_ADD_DATA_SOURCE)) {
else if (changed.equals(Case.Events.DATA_SOURCE_ADDED.toString())) {
componentOpened();
// Image img = (Image)newValue;
//

View File

@ -239,7 +239,7 @@ class DateSearchFilter extends AbstractFileSearchFilter<DateSearchPanel> {
Object oldValue = evt.getOldValue();
Object newValue = evt.getNewValue();
if (changed.equals(Case.CASE_CURRENT_CASE)) {
if (changed.equals(Case.Events.CURRENT_CASE.toString().toString())) {
// create or open a case
if (newValue != null) {
DateSearchFilter.this.updateTimeZoneList();
@ -247,12 +247,12 @@ class DateSearchFilter extends AbstractFileSearchFilter<DateSearchPanel> {
}
// if the image is added to the case
if (changed.equals(Case.CASE_ADD_DATA_SOURCE)) {
if (changed.equals(Case.Events.DATA_SOURCE_ADDED.toString())) {
DateSearchFilter.this.updateTimeZoneList();
}
// if the image is removed from the case
if (changed.equals(Case.CASE_DEL_DATA_SOURCE)) {
if (changed.equals(Case.Events.DATA_SOURCE_DELETED.toString())) {
DateSearchFilter.this.updateTimeZoneList();
}
}

View File

@ -38,7 +38,7 @@ import org.sleuthkit.autopsy.directorytree.FileSearchProvider;
@Override
public void propertyChange(PropertyChangeEvent evt) {
if(evt.getPropertyName().equals(Case.CASE_CURRENT_CASE)){
if(evt.getPropertyName().equals(Case.Events.CURRENT_CASE.toString())){
setEnabled(evt.getNewValue() != null);
}
}

View File

@ -213,7 +213,7 @@ import org.sleuthkit.datamodel.Content;
Case.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
if (evt.getPropertyName().equals(Case.CASE_CURRENT_CASE)) {
if (evt.getPropertyName().equals(Case.Events.CURRENT_CASE.toString())) {
Case oldCase = (Case) evt.getOldValue();
if (oldCase == null) //nothing to do, new case had been opened
{

View File

@ -143,7 +143,7 @@ import org.sleuthkit.autopsy.casemodule.Case;
Case.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
if (evt.getPropertyName().equals(Case.CASE_CURRENT_CASE)) {
if (evt.getPropertyName().equals(Case.Events.CURRENT_CASE.toString())) {
setEnabled(evt.getNewValue() != null);
}
}

View File

@ -123,7 +123,7 @@ import org.sleuthkit.autopsy.coreutils.PlatformUtil;
String changed = evt.getPropertyName();
Object newValue = evt.getNewValue();
if (changed.equals(Case.CASE_CURRENT_CASE)) {
if (changed.equals(Case.Events.CURRENT_CASE.toString())) {
if (newValue != null) {
setMonitorDir();
}

View File

@ -49,7 +49,7 @@ import org.sleuthkit.autopsy.casemodule.Case;
Object oldValue = evt.getOldValue();
Object newValue = evt.getNewValue();
if (changed.equals(Case.CASE_CURRENT_CASE)) {
if (changed.equals(Case.Events.CURRENT_CASE.toString())) {
if (newValue != null) {
// enable all menus when a case is created / opened
int totalMenus = menu.getItemCount();

View File

@ -83,7 +83,7 @@ public final class ReportWizardAction extends CallableSystemAction implements P
Case.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
if (evt.getPropertyName().equals(Case.CASE_CURRENT_CASE)) {
if (evt.getPropertyName().equals(Case.Events.CURRENT_CASE.toString())) {
Case newCase = (Case) evt.getNewValue();
setEnabled(newCase != null);

View File

@ -47,7 +47,7 @@ class HashDbPanelSearchAction extends CallableSystemAction {
@Override
public void propertyChange(PropertyChangeEvent evt) {
if(evt.getPropertyName().equals(Case.CASE_CURRENT_CASE)){
if(evt.getPropertyName().equals(Case.Events.CURRENT_CASE.toString())){
setEnabled(evt.getNewValue() != null);
}
}

View File

@ -66,9 +66,9 @@ class Installer extends ModuleInstall {
int serverStopPort = server.getCurrentSolrStopPort();
logger.log(Level.SEVERE, "There's already a server running on "
+ serverPort + " port that can't be shutdown.");
if (!Server.available(serverPort)) {
if (!Server.isPortAvailable(serverPort)) {
reportPortError(serverPort);
} else if (!Server.available(serverStopPort)) {
} else if (!Server.isPortAvailable(serverStopPort)) {
reportStopPortError(serverStopPort);
} else {
//some other reason
@ -95,7 +95,7 @@ class Installer extends ModuleInstall {
//TODO move some of this logic to Server class
for (int i = 0; i <= 3; i++) {
logger.log(Level.INFO, "Checking if port available.");
if (Server.available(server.getCurrentSolrServerPort())) {
if (Server.isPortAvailable(server.getCurrentSolrServerPort())) {
logger.log(Level.INFO, "Port available, trying to start server.");
server.start();
break;
@ -165,9 +165,9 @@ class Installer extends ModuleInstall {
//check if port is taken or some other reason
int serverPort = server.getCurrentSolrServerPort();
int serverStopPort = server.getCurrentSolrStopPort();
if (!Server.available(serverPort)) {
if (!Server.isPortAvailable(serverPort)) {
reportPortError(serverPort);
} else if (!Server.available(serverStopPort)) {
} else if (!Server.isPortAvailable(serverStopPort)) {
reportStopPortError(serverStopPort);
} else {
//some other reason

View File

@ -126,7 +126,7 @@ public class KeywordSearch {
Object newValue = evt.getNewValue();
final Logger logger = Logger.getLogger(CaseChangeListener.class.getName());
if (changed.equals(Case.CASE_CURRENT_CASE)) {
if (changed.equals(Case.Events.CURRENT_CASE.toString())) {
if (newValue != null) {
// new case is open
try {

View File

@ -44,6 +44,7 @@ import org.netbeans.api.progress.aggregate.AggregateProgressFactory;
import org.netbeans.api.progress.aggregate.AggregateProgressHandle;
import org.netbeans.api.progress.aggregate.ProgressContributor;
import org.openide.util.Cancellable;
import org.openide.util.Exceptions;
import org.sleuthkit.autopsy.casemodule.Case;
import org.sleuthkit.autopsy.coreutils.EscapeUtil;
import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil;
@ -361,8 +362,7 @@ public final class KeywordSearchIngestModule extends IngestModuleAbstractFile {
logger.log(Level.SEVERE, msg);
String details = NbBundle.getMessage(this.getClass(), "KeywordSearchIngestModule.init.tryStopSolrMsg", msg);
services.postMessage(IngestMessage.createErrorMessage(++messageID, instance, msg, details));
return;
throw new IngestModuleException(msg);
}
} catch (KeywordSearchModuleException ex) {
logger.log(Level.WARNING, "Error checking if Solr server is running while initializing ingest", ex);
@ -370,9 +370,15 @@ public final class KeywordSearchIngestModule extends IngestModuleAbstractFile {
String msg = NbBundle.getMessage(this.getClass(), "KeywordSearchIngestModule.init.badInitMsg");
String details = NbBundle.getMessage(this.getClass(), "KeywordSearchIngestModule.init.tryStopSolrMsg", msg);
services.postMessage(IngestMessage.createErrorMessage(++messageID, instance, msg, details));
return;
throw new IngestModuleException(msg);
}
try {
// make an actual query to verify that server is responding
// we had cases where getStatus was OK, but the connection resulted in a 404
server.queryNumIndexedDocuments();
} catch (KeywordSearchModuleException | NoOpenCoreException ex) {
throw new IngestModuleException("Error connecting to SOLR server: " + ex.getMessage());
}
//initialize extractors
stringExtractor = new AbstractFileStringExtract();
@ -415,7 +421,7 @@ public final class KeywordSearchIngestModule extends IngestModuleAbstractFile {
curDataSourceIds = new HashSet<Long>();
indexer = new Indexer();
final int updateIntervalMs = KeywordSearchSettings.getUpdateFrequency().getTime() * 60 * 1000;
logger.log(Level.INFO, "Using commit interval (ms): " + updateIntervalMs);
logger.log(Level.INFO, "Using searcher interval (ms): " + updateIntervalMs);

View File

@ -395,7 +395,7 @@ class KeywordSearchPanel extends AbstractKeywordSearchPerformer {
Object oldValue = evt.getOldValue();
Object newValue = evt.getNewValue();
if (changed.equals(Case.CASE_CURRENT_CASE)) {
if (changed.equals(Case.Events.CURRENT_CASE.toString())) {
resetSearchBox();
if (newValue == null) {
setFields(false);

View File

@ -350,7 +350,7 @@ public class Server {
*/
void start() throws KeywordSearchModuleException, SolrServerNoPortException {
logger.log(Level.INFO, "Starting Solr server from: " + solrFolder.getAbsolutePath());
if (available(currentSolrServerPort)) {
if (isPortAvailable(currentSolrServerPort)) {
logger.log(Level.INFO, "Port [" + currentSolrServerPort + "] available, starting Solr");
try {
final String MAX_SOLR_MEM_MB_PAR = "-Xmx" + Integer.toString(MAX_SOLR_MEM_MB) + "m";
@ -419,7 +419,7 @@ public class Server {
*
* @param port the port to check for availability
*/
static boolean available(int port) {
static boolean isPortAvailable(int port) {
ServerSocket ss = null;
try {
@ -524,6 +524,7 @@ public class Server {
//TODO handle timeout in cases when some other type of server on that port
CoreAdminRequest.getStatus(null, solrServer);
logger.log(Level.INFO, "Solr server is running");
} catch (SolrServerException ex) {

View File

@ -613,7 +613,7 @@ public class Timeline extends CallableSystemAction implements Presenter.Toolbar,
@Override
public void propertyChange(PropertyChangeEvent evt) {
String prop = evt.getPropertyName();
if (prop.equals(Case.CASE_ADD_DATA_SOURCE)) {
if (prop.equals(Case.Events.DATA_SOURCE_ADDED.toString())) {
if (mainFrame != null && !mainFrame.isVisible()) {
// change the lastObjectId to trigger a reparse of mactime barData
++lastObjectId;
@ -629,7 +629,7 @@ public class Timeline extends CallableSystemAction implements Presenter.Toolbar,
// call performAction as if the user selected 'Make Timeline' from the menu
performAction();
} else if (prop.equals(Case.CASE_CURRENT_CASE)) {
} else if (prop.equals(Case.Events.CURRENT_CASE.toString())) {
if (mainFrame != null && mainFrame.isVisible()) {
mainFrame.dispose();
mainFrame = null;