diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/Case.java b/Core/src/org/sleuthkit/autopsy/casemodule/Case.java index 6dfa935f6e..4ec24c9f7e 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/Case.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/Case.java @@ -1392,29 +1392,33 @@ public class Case { Case.clearTempFolder(); checkSubFolders(toChangeTo); - // enable these menus - CallableSystemAction.get(AddImageAction.class).setEnabled(true); - CallableSystemAction.get(CaseCloseAction.class).setEnabled(true); - CallableSystemAction.get(CasePropertiesAction.class).setEnabled(true); - CallableSystemAction.get(CaseDeleteAction.class).setEnabled(true); // Delete Case menu + if (IngestManager.getInstance().isRunningInteractively()) { + // enable these menus + CallableSystemAction.get(AddImageAction.class).setEnabled(true); + CallableSystemAction.get(CaseCloseAction.class).setEnabled(true); + CallableSystemAction.get(CasePropertiesAction.class).setEnabled(true); + CallableSystemAction.get(CaseDeleteAction.class).setEnabled(true); // Delete Case menu - if (toChangeTo.hasData()) { - // open all top components - CoreComponentControl.openCoreWindows(); - } else { - // close all top components - CoreComponentControl.closeCoreWindows(); + if (toChangeTo.hasData()) { + // open all top components + CoreComponentControl.openCoreWindows(); + } else { + // close all top components + CoreComponentControl.closeCoreWindows(); + } } } else { // case is closed - // close all top components first - CoreComponentControl.closeCoreWindows(); - - // disable these menus - CallableSystemAction.get(AddImageAction.class).setEnabled(false); // Add Image menu - CallableSystemAction.get(CaseCloseAction.class).setEnabled(false); // Case Close menu - CallableSystemAction.get(CasePropertiesAction.class).setEnabled(false); // Case Properties menu - CallableSystemAction.get(CaseDeleteAction.class).setEnabled(false); // Delete Case menu + if (IngestManager.getInstance().isRunningInteractively()) { + // close all top components first + CoreComponentControl.closeCoreWindows(); + // disable these menus + CallableSystemAction.get(AddImageAction.class).setEnabled(false); // Add Image menu + CallableSystemAction.get(CaseCloseAction.class).setEnabled(false); // Case Close menu + CallableSystemAction.get(CasePropertiesAction.class).setEnabled(false); // Case Properties menu + CallableSystemAction.get(CaseDeleteAction.class).setEnabled(false); // Delete Case menu + } + //clear pending notifications MessageNotifyUtil.Notify.clear(); diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/DeletedContent.java b/Core/src/org/sleuthkit/autopsy/datamodel/DeletedContent.java index abcade50e1..c32eb5c164 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/DeletedContent.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/DeletedContent.java @@ -1,7 +1,7 @@ /* * Autopsy Forensic Browser * - * Copyright 2013-2014 Basis Technology Corp. + * Copyright 2013-2015 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -180,17 +180,16 @@ public class DeletedContent implements AutopsyVisitableItem { @Override public void propertyChange(PropertyChangeEvent evt) { String eventType = evt.getPropertyName(); - - // new file was added if (eventType.equals(IngestManager.IngestModuleEvent.CONTENT_CHANGED.toString())) { /** - * This is a stop gap measure until a different way of - * handling the closing of cases is worked out. - * Currently, remote events may be received for a case - * that is already closed. + * Checking for a current case is a stop gap measure + * until a different way of handling the closing of + * cases is worked out. Currently, remote events may be + * received for a case that is already closed. */ try { Case.getCurrentCase(); + // new file was added // @@@ COULD CHECK If the new file is deleted before notifying... update(); } catch (IllegalStateException notUsed) { @@ -202,10 +201,10 @@ public class DeletedContent implements AutopsyVisitableItem { || eventType.equals(IngestManager.IngestJobEvent.CANCELLED.toString()) || eventType.equals(Case.Events.DATA_SOURCE_ADDED.toString())) { /** - * This is a stop gap measure until a different way of - * handling the closing of cases is worked out. - * Currently, remote events may be received for a case - * that is already closed. + * Checking for a current case is a stop gap measure + * until a different way of handling the closing of + * cases is worked out. Currently, remote events may be + * received for a case that is already closed. */ try { Case.getCurrentCase(); diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/EmailExtracted.java b/Core/src/org/sleuthkit/autopsy/datamodel/EmailExtracted.java index 519a018821..abbb88def7 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/EmailExtracted.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/EmailExtracted.java @@ -206,18 +206,19 @@ public class EmailExtracted implements AutopsyVisitableItem { String eventType = evt.getPropertyName(); if (eventType.equals(IngestManager.IngestModuleEvent.DATA_ADDED.toString())) { /** - * This is a stop gap measure until a different way of - * handling the closing of cases is worked out. Currently, - * remote events may be received for a case that is already - * closed. + * Checking for a current case is a stop gap measure until a + * different way of handling the closing of cases is worked + * out. Currently, remote events may be received for a case + * that is already closed. */ try { Case.getCurrentCase(); - /** - * Due to some unresolved issues with how cases are - * closed, it is possible for the event to have a null - * oldValue if the event is a remote event. - */ + /** + * Even with the check above, it is still possible that the + * case will be closed in a different thread before this + * code executes. If that happens, it is possible for the + * event to have a null oldValue. + */ ModuleDataEvent eventData = (ModuleDataEvent) evt.getOldValue(); if (null != eventData && eventData.getArtifactType() == BlackboardArtifact.ARTIFACT_TYPE.TSK_EMAIL_MSG) { emailResults.update(); @@ -230,10 +231,10 @@ public class EmailExtracted implements AutopsyVisitableItem { } else if (eventType.equals(IngestManager.IngestJobEvent.COMPLETED.toString()) || eventType.equals(IngestManager.IngestJobEvent.CANCELLED.toString())) { /** - * This is a stop gap measure until a different way of - * handling the closing of cases is worked out. Currently, - * remote events may be received for a case that is already - * closed. + * Checking for a current case is a stop gap measure until a + * different way of handling the closing of cases is worked + * out. Currently, remote events may be received for a case + * that is already closed. */ try { Case.getCurrentCase(); @@ -243,8 +244,7 @@ public class EmailExtracted implements AutopsyVisitableItem { * Case is closed, do nothing. */ } - } - else if (eventType.equals(Case.Events.CURRENT_CASE.toString())) { + } else if (eventType.equals(Case.Events.CURRENT_CASE.toString())) { // case was closed. Remove listeners so that we don't get called with a stale case handle if (evt.getNewValue() == null) { removeNotify(); diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/ExtractedContent.java b/Core/src/org/sleuthkit/autopsy/datamodel/ExtractedContent.java index 85c87adc10..728b79fd87 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/ExtractedContent.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/ExtractedContent.java @@ -1,7 +1,7 @@ /* * Autopsy Forensic Browser * - * Copyright 2011-2014 Basis Technology Corp. + * Copyright 2011-2015 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -126,7 +126,7 @@ public class ExtractedContent implements AutopsyVisitableItem { * more specific form elsewhere in the tree. */ private class TypeFactory extends ChildFactory.Detachable { - private final ArrayList doNotShow; + private final ArrayList doNotShow = new ArrayList<>(); // maps the artifact type to its child node private final HashMap typeNodeList = new HashMap<>(); @@ -134,7 +134,6 @@ public class ExtractedContent implements AutopsyVisitableItem { super(); // these are shown in other parts of the UI tree - doNotShow = new ArrayList<>(); doNotShow.add(BlackboardArtifact.ARTIFACT_TYPE.TSK_GEN_INFO); doNotShow.add(BlackboardArtifact.ARTIFACT_TYPE.TSK_EMAIL_MSG); doNotShow.add(BlackboardArtifact.ARTIFACT_TYPE.TSK_HASHSET_HIT); @@ -143,56 +142,53 @@ public class ExtractedContent implements AutopsyVisitableItem { doNotShow.add(BlackboardArtifact.ARTIFACT_TYPE.TSK_INTERESTING_ARTIFACT_HIT); } - private final PropertyChangeListener pcl = new PropertyChangeListener() { - @Override - public void propertyChange(PropertyChangeEvent evt) { - String eventType = evt.getPropertyName(); - if (eventType.equals(IngestManager.IngestModuleEvent.DATA_ADDED.toString())) { + private final PropertyChangeListener pcl = (PropertyChangeEvent evt) -> { + String eventType = evt.getPropertyName(); + if (eventType.equals(IngestManager.IngestModuleEvent.DATA_ADDED.toString())) { + /** + * This is a stop gap measure until a different way of + * handling the closing of cases is worked out. Currently, + * remote events may be received for a case that is already + * closed. + */ + try { + Case.getCurrentCase(); /** - * This is a stop gap measure until a different way of - * handling the closing of cases is worked out. Currently, - * remote events may be received for a case that is already - * closed. + * Due to some unresolved issues with how cases are + * closed, it is possible for the event to have a null + * oldValue if the event is a remote event. */ - try { - Case.getCurrentCase(); - /** - * Due to some unresolved issues with how cases are - * closed, it is possible for the event to have a null - * oldValue if the event is a remote event. - */ - final ModuleDataEvent event = (ModuleDataEvent) evt.getOldValue(); - if (null != event && doNotShow.contains(event.getArtifactType()) == false) { - refresh(true); - } - } catch (IllegalStateException notUsed) { - /** - * Case is closed, do nothing. - */ - } - } else if (eventType.equals(IngestManager.IngestJobEvent.COMPLETED.toString()) - || eventType.equals(IngestManager.IngestJobEvent.CANCELLED.toString())) { - /** - * This is a stop gap measure until a different way of - * handling the closing of cases is worked out. Currently, - * remote events may be received for a case that is already - * closed. - */ - try { - Case.getCurrentCase(); + final ModuleDataEvent event = (ModuleDataEvent) evt.getOldValue(); + if (null != event && doNotShow.contains(event.getArtifactType()) == false) { refresh(true); - } catch (IllegalStateException notUsed) { - /** - * Case is closed, do nothing. - */ } + } catch (IllegalStateException notUsed) { + /** + * Case is closed, do nothing. + */ } - else if (eventType.equals(Case.Events.CURRENT_CASE.toString())) { - // case was closed. Remove listeners so that we don't get called with a stale case handle - if (evt.getNewValue() == null) { - removeNotify(); - skCase = null; - } + } else if (eventType.equals(IngestManager.IngestJobEvent.COMPLETED.toString()) + || eventType.equals(IngestManager.IngestJobEvent.CANCELLED.toString())) { + /** + * This is a stop gap measure until a different way of + * handling the closing of cases is worked out. Currently, + * remote events may be received for a case that is already + * closed. + */ + try { + Case.getCurrentCase(); + refresh(true); + } catch (IllegalStateException notUsed) { + /** + * Case is closed, do nothing. + */ + } + } + else if (eventType.equals(Case.Events.CURRENT_CASE.toString())) { + // case was closed. Remove listeners so that we don't get called with a stale case handle + if (evt.getNewValue() == null) { + removeNotify(); + skCase = null; } } }; @@ -394,17 +390,18 @@ public class ExtractedContent implements AutopsyVisitableItem { String eventType = evt.getPropertyName(); if (eventType.equals(IngestManager.IngestModuleEvent.DATA_ADDED.toString())) { /** - * This is a stop gap measure until a different way of - * handling the closing of cases is worked out. Currently, - * remote events may be received for a case that is already - * closed. + * Checking for a current case is a stop gap measure until a + * different way of handling the closing of cases is worked + * out. Currently, remote events may be received for a case + * that is already closed. */ try { Case.getCurrentCase(); /** - * Due to some unresolved issues with how cases are - * closed, it is possible for the event to have a null - * oldValue if the event is a remote event. + * Even with the check above, it is still possible that + * the case will be closed in a different thread before + * this code executes. If that happens, it is possible + * for the event to have a null oldValue. */ final ModuleDataEvent event = (ModuleDataEvent) evt.getOldValue(); if (null != event && event.getArtifactType() == type) { @@ -418,10 +415,10 @@ public class ExtractedContent implements AutopsyVisitableItem { } else if (eventType.equals(IngestManager.IngestJobEvent.COMPLETED.toString()) || eventType.equals(IngestManager.IngestJobEvent.CANCELLED.toString())) { /** - * This is a stop gap measure until a different way of - * handling the closing of cases is worked out. Currently, - * remote events may be received for a case that is already - * closed. + * Checking for a current case is a stop gap measure until a + * different way of handling the closing of cases is worked + * out. Currently, remote events may be received for a case + * that is already closed. */ try { Case.getCurrentCase(); diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/FileSize.java b/Core/src/org/sleuthkit/autopsy/datamodel/FileSize.java index 4b4659aa94..521a529eb7 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/FileSize.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/FileSize.java @@ -1,7 +1,7 @@ /* * Autopsy Forensic Browser * - * Copyright 2013-2014 Basis Technology Corp. + * Copyright 2013-2015 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -178,15 +178,15 @@ public class FileSize implements AutopsyVisitableItem { public void propertyChange(PropertyChangeEvent evt) { String eventType = evt.getPropertyName(); - // new file was added if (eventType.equals(IngestManager.IngestModuleEvent.CONTENT_CHANGED.toString())) { /** - * This is a stop gap measure until a different way of - * handling the closing of cases is worked out. - * Currently, remote events may be received for a case - * that is already closed. + * Checking for a current case is a stop gap measure + * until a different way of handling the closing of + * cases is worked out. Currently, remote events may be + * received for a case that is already closed. */ try { + // new file was added // @@@ could check the size here and only fire off updates if we know the file meets the min size criteria Case.getCurrentCase(); update(); @@ -199,10 +199,10 @@ public class FileSize implements AutopsyVisitableItem { || eventType.equals(IngestManager.IngestJobEvent.CANCELLED.toString()) || eventType.equals(Case.Events.DATA_SOURCE_ADDED.toString())) { /** - * This is a stop gap measure until a different way of - * handling the closing of cases is worked out. - * Currently, remote events may be received for a case - * that is already closed. + * Checking for a current case is a stop gap measure + * until a different way of handling the closing of + * cases is worked out. Currently, remote events may be + * received for a case that is already closed. */ try { Case.getCurrentCase(); diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/FileTypesNode.java b/Core/src/org/sleuthkit/autopsy/datamodel/FileTypesNode.java index d230725410..23b1f40f12 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/FileTypesNode.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/FileTypesNode.java @@ -1,7 +1,7 @@ /* * Autopsy Forensic Browser * - * Copyright 2011-2014 Basis Technology Corp. + * Copyright 2011-2015 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -157,10 +157,10 @@ public class FileTypesNode extends DisplayableItemNode { || eventType.equals(IngestManager.IngestJobEvent.CANCELLED.toString()) || eventType.equals(Case.Events.DATA_SOURCE_ADDED.toString())) { /** - * This is a stop gap measure until a different way of - * handling the closing of cases is worked out. - * Currently, remote events may be received for a case - * that is already closed. + * Checking for a current case is a stop gap measure + * until a different way of handling the closing of + * cases is worked out. Currently, remote events may be + * received for a case that is already closed. */ try { Case.getCurrentCase(); diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/HashsetHits.java b/Core/src/org/sleuthkit/autopsy/datamodel/HashsetHits.java index 928ba3c5f2..b6d4794dd1 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/HashsetHits.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/HashsetHits.java @@ -1,7 +1,7 @@ /* * Autopsy Forensic Browser * - * Copyright 2011-2014 Basis Technology Corp. + * Copyright 2011-2015 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -180,13 +180,13 @@ public class HashsetHits implements AutopsyVisitableItem { private final PropertyChangeListener pcl = new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { - String eventType = evt.getPropertyName(); + String eventType = evt.getPropertyName(); if (eventType.equals(IngestManager.IngestModuleEvent.DATA_ADDED.toString())) { /** - * This is a stop gap measure until a different way of - * handling the closing of cases is worked out. Currently, - * remote events may be received for a case that is already - * closed. + * Checking for a current case is a stop gap measure until a + * different way of handling the closing of cases is worked + * out. Currently, remote events may be received for a case + * that is already closed. */ try { Case.getCurrentCase(); @@ -207,10 +207,10 @@ public class HashsetHits implements AutopsyVisitableItem { } else if (eventType.equals(IngestManager.IngestJobEvent.COMPLETED.toString()) || eventType.equals(IngestManager.IngestJobEvent.CANCELLED.toString())) { /** - * This is a stop gap measure until a different way of - * handling the closing of cases is worked out. Currently, - * remote events may be received for a case that is already - * closed. + * Checking for a current case is a stop gap measure until a + * different way of handling the closing of cases is worked + * out. Currently, remote events may be received for a case + * that is already closed. */ try { Case.getCurrentCase(); @@ -220,8 +220,7 @@ public class HashsetHits implements AutopsyVisitableItem { * Case is closed, do nothing. */ } - } - else if (eventType.equals(Case.Events.CURRENT_CASE.toString())) { + } else if (eventType.equals(Case.Events.CURRENT_CASE.toString())) { // case was closed. Remove listeners so that we don't get called with a stale case handle if (evt.getNewValue() == null) { removeNotify(); diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/InterestingHits.java b/Core/src/org/sleuthkit/autopsy/datamodel/InterestingHits.java index 4a476231ad..c4c0080679 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/InterestingHits.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/InterestingHits.java @@ -1,7 +1,7 @@ /* * Autopsy Forensic Browser * - * Copyright 2011 Basis Technology Corp. + * Copyright 2011-2015 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -177,17 +177,18 @@ public class InterestingHits implements AutopsyVisitableItem { String eventType = evt.getPropertyName(); if (eventType.equals(IngestManager.IngestModuleEvent.DATA_ADDED.toString())) { /** - * This is a stop gap measure until a different way of - * handling the closing of cases is worked out. Currently, - * remote events may be received for a case that is already - * closed. + * Checking for a current case is a stop gap measure until a + * different way of handling the closing of cases is worked + * out. Currently, remote events may be received for a case + * that is already closed. */ try { Case.getCurrentCase(); /** - * Due to some unresolved issues with how cases are - * closed, it is possible for the event to have a null - * oldValue if the event is a remote event. + * Even with the check above, it is still possible that + * the case will be closed in a different thread before + * this code executes. If that happens, it is possible + * for the event to have a null oldValue. */ ModuleDataEvent eventData = (ModuleDataEvent) evt.getOldValue(); if (null != eventData && (eventData.getArtifactType() == BlackboardArtifact.ARTIFACT_TYPE.TSK_INTERESTING_ARTIFACT_HIT @@ -202,10 +203,10 @@ public class InterestingHits implements AutopsyVisitableItem { } else if (eventType.equals(IngestManager.IngestJobEvent.COMPLETED.toString()) || eventType.equals(IngestManager.IngestJobEvent.CANCELLED.toString())) { /** - * This is a stop gap measure until a different way of - * handling the closing of cases is worked out. Currently, - * remote events may be received for a case that is already - * closed. + * Checking for a current case is a stop gap measure until a + * different way of handling the closing of cases is worked + * out. Currently, remote events may be received for a case + * that is already closed. */ try { Case.getCurrentCase(); diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/KeywordHits.java b/Core/src/org/sleuthkit/autopsy/datamodel/KeywordHits.java index 44c530251e..c4e01e12d2 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/KeywordHits.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/KeywordHits.java @@ -1,7 +1,7 @@ /* * Autopsy Forensic Browser * - * Copyright 2011-2014 Basis Technology Corp. + * Copyright 2011-2015 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -248,17 +248,18 @@ public class KeywordHits implements AutopsyVisitableItem { String eventType = evt.getPropertyName(); if (eventType.equals(IngestManager.IngestModuleEvent.DATA_ADDED.toString())) { /** - * This is a stop gap measure until a different way of - * handling the closing of cases is worked out. Currently, - * remote events may be received for a case that is already - * closed. + * Checking for a current case is a stop gap measure until a + * different way of handling the closing of cases is worked + * out. Currently, remote events may be received for a case + * that is already closed. */ try { Case.getCurrentCase(); /** - * Due to some unresolved issues with how cases are - * closed, it is possible for the event to have a null - * oldValue if the event is a remote event. + * Even with the check above, it is still possible that + * the case will be closed in a different thread before + * this code executes. If that happens, it is possible + * for the event to have a null oldValue. */ ModuleDataEvent eventData = (ModuleDataEvent) evt.getOldValue(); if (null != eventData && eventData.getArtifactType() == BlackboardArtifact.ARTIFACT_TYPE.TSK_KEYWORD_HIT) { @@ -272,10 +273,10 @@ public class KeywordHits implements AutopsyVisitableItem { } else if (eventType.equals(IngestManager.IngestJobEvent.COMPLETED.toString()) || eventType.equals(IngestManager.IngestJobEvent.CANCELLED.toString())) { /** - * This is a stop gap measure until a different way of - * handling the closing of cases is worked out. Currently, - * remote events may be received for a case that is already - * closed. + * Checking for a current case is a stop gap measure until a + * different way of handling the closing of cases is worked + * out. Currently, remote events may be received for a case + * that is already closed. */ try { Case.getCurrentCase(); @@ -285,8 +286,7 @@ public class KeywordHits implements AutopsyVisitableItem { * Case is closed, do nothing. */ } - } - else if (eventType.equals(Case.Events.CURRENT_CASE.toString())) { + } else if (eventType.equals(Case.Events.CURRENT_CASE.toString())) { // case was closed. Remove listeners so that we don't get called with a stale case handle if (evt.getNewValue() == null) { removeNotify(); diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/Reports.java b/Core/src/org/sleuthkit/autopsy/datamodel/Reports.java index 83a2772bda..105e7cd052 100755 --- a/Core/src/org/sleuthkit/autopsy/datamodel/Reports.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/Reports.java @@ -1,7 +1,7 @@ /* * Autopsy Forensic Browser * - * Copyright 2014 Basis Technology Corp. + * Copyright 2011-2015 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -99,10 +99,10 @@ public final class Reports implements AutopsyVisitableItem { String eventType = evt.getPropertyName(); if (eventType.equals(Case.Events.REPORT_ADDED.toString())) { /** - * This is a stop gap measure until a different way of - * handling the closing of cases is worked out. - * Currently, remote events may be received for a case - * that is already closed. + * Checking for a current case is a stop gap measure + * until a different way of handling the closing of + * cases is worked out. Currently, remote events may be + * received for a case that is already closed. */ try { Case.getCurrentCase(); diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/Tags.java b/Core/src/org/sleuthkit/autopsy/datamodel/Tags.java index 9894aa32fb..d57919afc2 100755 --- a/Core/src/org/sleuthkit/autopsy/datamodel/Tags.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/Tags.java @@ -1,7 +1,7 @@ /* * Autopsy Forensic Browser * - * Copyright 2013 Basis Technology Corp. + * Copyright 2011-2015 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -121,19 +121,20 @@ public class Tags implements AutopsyVisitableItem { String eventType = evt.getPropertyName(); if (eventType.equals(IngestManager.IngestModuleEvent.DATA_ADDED.toString())) { /** - * This is a stop gap measure until a different way of - * handling the closing of cases is worked out. Currently, - * remote events may be received for a case that is already - * closed. + * Checking for a current case is a stop gap measure until a + * different way of handling the closing of cases is worked + * out. Currently, remote events may be received for a case + * that is already closed. */ try { Case.getCurrentCase(); /** - * There are two things to note here. It is possible for - * the event to have a null oldValue if the event is a - * remote event and the case is closed after the above - * call, but before this code executes. Second, the use - * of deprecated artifact types here is explained by the + * There are two things to note here. * First, even with + * the check above, it is still possible that the case + * will be closed in a different thread before this code + * executes. If that happens, it is possible for the + * event to have a null oldValue. Second, the use of + * deprecated artifact types here is explained by the * fact that in an ideal world, the TagsManager would * fire tag-related events so that the tags tree would * refresh. But, we haven't had a chance to add that, so @@ -154,10 +155,10 @@ public class Tags implements AutopsyVisitableItem { } } else if (eventType.equals(IngestManager.IngestJobEvent.COMPLETED.toString()) || eventType.equals(IngestManager.IngestJobEvent.CANCELLED.toString())) { /** - * This is a stop gap measure until a different way of - * handling the closing of cases is worked out. Currently, - * remote events may be received for a case that is already - * closed. + * Checking for a current case is a stop gap measure until a + * different way of handling the closing of cases is worked + * out. Currently, remote events may be received for a case + * that is already closed. */ try { Case.getCurrentCase(); diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeTopComponent.java b/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeTopComponent.java index bd07ac054b..1674f68a91 100644 --- a/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeTopComponent.java +++ b/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeTopComponent.java @@ -34,7 +34,6 @@ import java.util.logging.Level; import java.util.prefs.PreferenceChangeEvent; import java.util.prefs.PreferenceChangeListener; import javax.swing.Action; -import javax.swing.JPanel; import javax.swing.SwingUtilities; import javax.swing.tree.TreeSelectionModel; import org.openide.explorer.ExplorerManager; @@ -524,78 +523,82 @@ public final class DirectoryTreeTopComponent extends TopComponent implements Dat */ @Override public void propertyChange(PropertyChangeEvent evt) { - String changed = evt.getPropertyName(); - if (changed.equals(Case.Events.CURRENT_CASE.toString())) { // changed current case - // 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 - // object. - // @@@ This needs to be revisited. Perhaps case closed and case - // opened events instead of property change events would be a better - // solution. Either way, more probably needs to be done to clean up - // data model objects when a case is closed. - if (evt.getOldValue() != null && evt.getNewValue() == null) { - // The current case has been closed. Reset the ExplorerManager. - SwingUtilities.invokeLater(() -> { - Node emptyNode = new AbstractNode(Children.LEAF); - em.setRootContext(emptyNode); - }); - } else if (evt.getNewValue() != null) { - // A new case has been opened. Reset the ExplorerManager. - Case newCase = (Case) evt.getNewValue(); - final String newCaseName = newCase.getName(); - SwingUtilities.invokeLater(() -> { - em.getRootContext().setName(newCaseName); - em.getRootContext().setDisplayName(newCaseName); + if (IngestManager.getInstance().isRunningInteractively()) { + String changed = evt.getPropertyName(); + if (changed.equals(Case.Events.CURRENT_CASE.toString())) { // changed current case + // 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 + // object. + // @@@ This needs to be revisited. Perhaps case closed and case + // opened events instead of property change events would be a better + // solution. Either way, more probably needs to be done to clean up + // data model objects when a case is closed. + if (evt.getOldValue() != null && evt.getNewValue() == null) { + // The current case has been closed. Reset the ExplorerManager. + SwingUtilities.invokeLater(() -> { + Node emptyNode = new AbstractNode(Children.LEAF); + em.setRootContext(emptyNode); + }); + } else if (evt.getNewValue() != null) { + // A new case has been opened. Reset the ExplorerManager. + Case newCase = (Case) evt.getNewValue(); + final String newCaseName = newCase.getName(); + SwingUtilities.invokeLater(() -> { + em.getRootContext().setName(newCaseName); + em.getRootContext().setDisplayName(newCaseName); // Reset the forward and back - // buttons. Note that a call to CoreComponentControl.openCoreWindows() - // by the new Case object will lead to a componentOpened() call - // that will repopulate the tree. - // @@@ The repopulation of the tree in this fashion also merits - // reconsideration. - resetHistory(); + // buttons. Note that a call to CoreComponentControl.openCoreWindows() + // by the new Case object will lead to a componentOpened() call + // that will repopulate the tree. + // @@@ The repopulation of the tree in this fashion also merits + // reconsideration. + resetHistory(); + }); + } + } // if the image is added to the case + else if (changed.equals(Case.Events.DATA_SOURCE_ADDED.toString())) { + /** + * Checking for a current case is a stop gap measure until a + * different way of handling the closing of cases is worked out. + * Currently, remote events may be received for a case that is + * already closed. + */ + try { + Case.getCurrentCase(); + CoreComponentControl.openCoreWindows(); + SwingUtilities.invokeLater(this::componentOpened); + } catch (IllegalStateException notUsed) { + /** + * Case is closed, do nothing. + */ + } + } // change in node selection + else if (changed.equals(ExplorerManager.PROP_SELECTED_NODES)) { + SwingUtilities.invokeLater(() -> { + respondSelection((Node[]) evt.getOldValue(), (Node[]) evt.getNewValue()); }); - } - } // if the image is added to the case - else if (changed.equals(Case.Events.DATA_SOURCE_ADDED.toString())) { - /** - * This is a stop gap measure until a different way of handling the - * closing of cases is worked out. Currently, remote events may be - * received for a case that is already closed. - */ - try { - Case.getCurrentCase(); - CoreComponentControl.openCoreWindows(); - SwingUtilities.invokeLater(this::componentOpened); - } catch (IllegalStateException notUsed) { - /** - * Case is closed, do nothing. - */ - } - } // change in node selection - else if (changed.equals(ExplorerManager.PROP_SELECTED_NODES)) { - SwingUtilities.invokeLater(() -> { - respondSelection((Node[]) evt.getOldValue(), (Node[]) evt.getNewValue()); - }); - } else if (changed.equals(IngestManager.IngestModuleEvent.DATA_ADDED.toString())) { + } else if (changed.equals(IngestManager.IngestModuleEvent.DATA_ADDED.toString())) { // nothing to do here. - // all nodes should be listening for these events and update accordingly. - } else if (changed.equals(IngestManager.IngestJobEvent.COMPLETED.toString()) - || changed.equals(IngestManager.IngestJobEvent.CANCELLED.toString()) - || changed.equals(IngestManager.IngestModuleEvent.CONTENT_CHANGED.toString())) { - /** - * This is a stop gap measure until a different way of handling the - * closing of cases is worked out. Currently, remote events may be - * received for a case that is already closed. - */ - try { - Case.getCurrentCase(); - SwingUtilities.invokeLater(this::refreshDataSourceTree); - } catch (IllegalStateException notUsed) { + // all nodes should be listening for these events and update accordingly. + } else if (changed.equals(IngestManager.IngestJobEvent.COMPLETED.toString()) + || changed.equals(IngestManager.IngestJobEvent.CANCELLED.toString()) + || changed.equals(IngestManager.IngestModuleEvent.CONTENT_CHANGED.toString())) { /** - * Case is closed, do nothing. + * Checking for a current case is a stop gap measure until a + * different way of handling the closing of cases is worked out. + * Currently, remote events may be received for a case that is + * already closed. */ + try { + Case.getCurrentCase(); + SwingUtilities.invokeLater(this::refreshDataSourceTree); + } catch (IllegalStateException notUsed) { + /** + * Case is closed, do nothing. + */ + } } } } diff --git a/Core/src/org/sleuthkit/autopsy/events/RemoteEventPublisher.java b/Core/src/org/sleuthkit/autopsy/events/RemoteEventPublisher.java index c4cf9248c7..85d4cc8f83 100644 --- a/Core/src/org/sleuthkit/autopsy/events/RemoteEventPublisher.java +++ b/Core/src/org/sleuthkit/autopsy/events/RemoteEventPublisher.java @@ -34,6 +34,7 @@ import javax.jms.Topic; import org.apache.activemq.ActiveMQConnectionFactory; import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.coreutils.Logger; +import org.sleuthkit.autopsy.ingest.IngestManager; /** * Provides thread-safe support for publishing events to registered subscribers @@ -135,38 +136,40 @@ final class RemoteEventPublisher { */ @Override public void onMessage(Message message) { - /** - * This is a stop gap measure until a different way of handling the - * closing of cases is worked out. Currently, Case.currentCase is - * set to null before Case.Event.CURRENT_CASE is published. That - * means that clients of this class have not had the chance to close - * their remote event channels and remote events may be received for - * a case that is already closed. - */ - try { - Case.getCurrentCase(); - } catch (IllegalStateException notUsed) { + if (IngestManager.getInstance().isRunningInteractively()) { /** - * Case is closed, do not publish the event. + * This is a stop gap measure until a different way of handling + * the closing of cases is worked out. Currently, + * Case.currentCase is set to null before + * Case.Event.CURRENT_CASE is published. That means that clients + * of this class have not had the chance to close their remote + * event channels and remote events may be received for a case + * that is already closed. */ - return; - } - - try { - if (message instanceof ObjectMessage) { - ObjectMessage objectMessage = (ObjectMessage) message; - Object object = objectMessage.getObject(); - if (object instanceof AutopsyEvent) { - AutopsyEvent event = (AutopsyEvent) object; - event.setSourceType(AutopsyEvent.SourceType.REMOTE); - localPublisher.publish(event); - } + try { + Case.getCurrentCase(); + } catch (IllegalStateException notUsed) { + /** + * Case is closed, do not publish the event. + */ + return; + } + + try { + if (message instanceof ObjectMessage) { + ObjectMessage objectMessage = (ObjectMessage) message; + Object object = objectMessage.getObject(); + if (object instanceof AutopsyEvent) { + AutopsyEvent event = (AutopsyEvent) object; + event.setSourceType(AutopsyEvent.SourceType.REMOTE); + localPublisher.publish(event); + } + } + } catch (Exception ex) { + logger.log(Level.SEVERE, "Error receiving message", ex); } - } catch (Exception ex) { - logger.log(Level.SEVERE, "Error receiving message", ex); } } - } } diff --git a/Core/src/org/sleuthkit/autopsy/filesearch/DateSearchFilter.java b/Core/src/org/sleuthkit/autopsy/filesearch/DateSearchFilter.java index 48b2e5d417..be8a799556 100644 --- a/Core/src/org/sleuthkit/autopsy/filesearch/DateSearchFilter.java +++ b/Core/src/org/sleuthkit/autopsy/filesearch/DateSearchFilter.java @@ -254,10 +254,10 @@ class DateSearchFilter extends AbstractFileSearchFilter { case DATA_SOURCE_ADDED: case DATA_SOURCE_DELETED: /** - * This is a stop gap measure until a different way of - * handling the closing of cases is worked out. Currently, - * remote events may be received for a case that is already - * closed. + * Checking for a current case is a stop gap measure until a + * different way of handling the closing of cases is worked + * out. Currently, remote events may be received for a case + * that is already closed. */ try { Case.getCurrentCase(); diff --git a/Core/src/org/sleuthkit/autopsy/ingest/IngestManager.java b/Core/src/org/sleuthkit/autopsy/ingest/IngestManager.java index 80eec14f1d..cb055fcb98 100644 --- a/Core/src/org/sleuthkit/autopsy/ingest/IngestManager.java +++ b/Core/src/org/sleuthkit/autopsy/ingest/IngestManager.java @@ -362,7 +362,7 @@ public class IngestManager { * ingest message box, NetBeans progress handles, etc. Running interactively * is the default. */ - synchronized boolean isRunningInteractively() { + public synchronized boolean isRunningInteractively() { return this.runInteractively; } diff --git a/Core/src/org/sleuthkit/autopsy/timeline/TimeLineController.java b/Core/src/org/sleuthkit/autopsy/timeline/TimeLineController.java index b5fcd7dc61..bb92d57611 100644 --- a/Core/src/org/sleuthkit/autopsy/timeline/TimeLineController.java +++ b/Core/src/org/sleuthkit/autopsy/timeline/TimeLineController.java @@ -680,10 +680,23 @@ public class TimeLineController { public void propertyChange(PropertyChangeEvent evt) { switch (IngestManager.IngestModuleEvent.valueOf(evt.getPropertyName())) { case FILE_DONE: - Platform.runLater(() -> { - newEventsFlag.set(true); - }); - break; + /** + * Checking for a current case is a stop gap measure until a + * different way of handling the closing of cases is worked + * out. Currently, remote events may be received for a case + * that is already closed. + */ + try { + Case.getCurrentCase(); + Platform.runLater(() -> { + newEventsFlag.set(true); + }); + break; + } catch (IllegalStateException notUsed) { + /** + * Case is closed, do nothing. + */ + } } } } @@ -697,10 +710,10 @@ public class TimeLineController { case CANCELLED: case COMPLETED: /** - * This is a stop gap measure until a different way of - * handling the closing of cases is worked out. Currently, - * remote events may be received for a case that is already - * closed. + * Checking for a current case is a stop gap measure until a + * different way of handling the closing of cases is worked + * out. Currently, remote events may be received for a case + * that is already closed. */ try { Case.getCurrentCase(); @@ -725,10 +738,10 @@ public class TimeLineController { switch (Case.Events.valueOf(evt.getPropertyName())) { case DATA_SOURCE_ADDED: /** - * This is a stop gap measure until a different way of - * handling the closing of cases is worked out. Currently, - * remote events may be received for a case that is already - * closed. + * Checking for a current case is a stop gap measure until a + * different way of handling the closing of cases is worked + * out. Currently, remote events may be received for a case + * that is already closed. */ try { Case.getCurrentCase(); diff --git a/branding/core/core.jar/org/netbeans/core/startup/Bundle.properties b/branding/core/core.jar/org/netbeans/core/startup/Bundle.properties index 0b319fa533..cd1d0cd2c8 100644 --- a/branding/core/core.jar/org/netbeans/core/startup/Bundle.properties +++ b/branding/core/core.jar/org/netbeans/core/startup/Bundle.properties @@ -1,5 +1,5 @@ #Updated by build script -#Mon, 08 Jun 2015 11:37:44 -0400 +#Fri, 19 Jun 2015 13:59:39 -0400 LBL_splash_window_title=Starting Autopsy SPLASH_HEIGHT=314 SPLASH_WIDTH=538 diff --git a/branding/modules/org-netbeans-core-windows.jar/org/netbeans/core/windows/view/ui/Bundle.properties b/branding/modules/org-netbeans-core-windows.jar/org/netbeans/core/windows/view/ui/Bundle.properties index 90c8ec5261..0639304dec 100644 --- a/branding/modules/org-netbeans-core-windows.jar/org/netbeans/core/windows/view/ui/Bundle.properties +++ b/branding/modules/org-netbeans-core-windows.jar/org/netbeans/core/windows/view/ui/Bundle.properties @@ -1,5 +1,5 @@ #Updated by build script -#Mon, 08 Jun 2015 11:37:44 -0400 +#Fri, 19 Jun 2015 13:59:39 -0400 CTL_MainWindow_Title=Autopsy 3.1.2 CTL_MainWindow_Title_No_Project=Autopsy 3.1.2