3501-Remove status column from open multi-user case browser

This commit is contained in:
William Schaefer 2018-01-22 15:55:12 -05:00
parent 16418659d4
commit eefc085bc1
2 changed files with 32 additions and 83 deletions

View File

@ -31,14 +31,12 @@ import java.awt.EventQueue;
import java.io.File; import java.io.File;
import java.nio.file.Path; import java.nio.file.Path;
import java.nio.file.Paths; import java.nio.file.Paths;
import java.util.HashMap; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.logging.Level; import java.util.logging.Level;
import javax.swing.SwingWorker; import javax.swing.SwingWorker;
import org.openide.explorer.ExplorerManager; import org.openide.explorer.ExplorerManager;
import org.openide.util.NbBundle; import org.openide.util.NbBundle;
import org.sleuthkit.autopsy.coordinationservice.CaseNodeData;
import org.sleuthkit.autopsy.coordinationservice.CoordinationService; import org.sleuthkit.autopsy.coordinationservice.CoordinationService;
import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.coreutils.Logger;
import org.sleuthkit.autopsy.datamodel.EmptyNode; import org.sleuthkit.autopsy.datamodel.EmptyNode;
@ -59,7 +57,7 @@ class CaseBrowser extends javax.swing.JPanel implements ExplorerManager.Provider
private final org.openide.explorer.view.OutlineView outlineView; private final org.openide.explorer.view.OutlineView outlineView;
private int originalPathColumnIndex = 0; private int originalPathColumnIndex = 0;
private static final Logger LOGGER = Logger.getLogger(CaseBrowser.class.getName()); private static final Logger LOGGER = Logger.getLogger(CaseBrowser.class.getName());
private LoadCaseMapWorker tableWorker; private LoadCaseListWorker tableWorker;
@Override @Override
public ExplorerManager getExplorerManager() { public ExplorerManager getExplorerManager() {
@ -76,7 +74,6 @@ class CaseBrowser extends javax.swing.JPanel implements ExplorerManager.Provider
outline = outlineView.getOutline(); outline = outlineView.getOutline();
outlineView.setPropertyColumns( outlineView.setPropertyColumns(
Bundle.CaseNode_column_createdTime(), Bundle.CaseNode_column_createdTime(), Bundle.CaseNode_column_createdTime(), Bundle.CaseNode_column_createdTime(),
Bundle.CaseNode_column_status(), Bundle.CaseNode_column_status(),
Bundle.CaseNode_column_metadataFilePath(), Bundle.CaseNode_column_metadataFilePath()); Bundle.CaseNode_column_metadataFilePath(), Bundle.CaseNode_column_metadataFilePath());
((DefaultOutlineModel) outline.getOutlineModel()).setNodesColumnLabel(Bundle.CaseNode_column_name()); ((DefaultOutlineModel) outline.getOutlineModel()).setNodesColumnLabel(Bundle.CaseNode_column_name());
customize(); customize();
@ -123,8 +120,8 @@ class CaseBrowser extends javax.swing.JPanel implements ExplorerManager.Provider
} }
/** /**
* Get the path to the .aut file for the selected case. * Get the path to the .aut file for the selected case.
* *
* @return the full path to the selected case's .aut file * @return the full path to the selected case's .aut file
*/ */
String getCasePath() { String getCasePath() {
@ -160,7 +157,7 @@ class CaseBrowser extends javax.swing.JPanel implements ExplorerManager.Provider
//set the table to display text informing the user that the list is being retreived and disable case selection //set the table to display text informing the user that the list is being retreived and disable case selection
EmptyNode emptyNode = new EmptyNode(Bundle.CaseBrowser_caseListLoading_message()); EmptyNode emptyNode = new EmptyNode(Bundle.CaseBrowser_caseListLoading_message());
em.setRootContext(emptyNode); em.setRootContext(emptyNode);
tableWorker = new LoadCaseMapWorker(); tableWorker = new LoadCaseListWorker();
tableWorker.execute(); tableWorker.execute();
} }
@ -192,13 +189,11 @@ class CaseBrowser extends javax.swing.JPanel implements ExplorerManager.Provider
// End of variables declaration//GEN-END:variables // End of variables declaration//GEN-END:variables
/** /**
* Swingworker to fetch the updated map of cases and their status in a * Swingworker to fetch the updated List of cases in a background thread
* background thread
*/ */
private class LoadCaseMapWorker extends SwingWorker<Void, Void> { private class LoadCaseListWorker extends SwingWorker<Void, Void> {
private static final String ALERT_FILE_NAME = "autoingest.alert"; private List<CaseMetadata> cases;
private Map<CaseMetadata, Boolean> cases;
/** /**
* Gets a list of the cases in the top level case folder * Gets a list of the cases in the top level case folder
@ -207,8 +202,8 @@ class CaseBrowser extends javax.swing.JPanel implements ExplorerManager.Provider
* *
* @throws CoordinationServiceException * @throws CoordinationServiceException
*/ */
private Map<CaseMetadata, Boolean> getCases() throws CoordinationService.CoordinationServiceException { private List<CaseMetadata> getCases() throws CoordinationService.CoordinationServiceException {
Map<CaseMetadata, Boolean> casesMap = new HashMap<>(); List<CaseMetadata> caseList = new ArrayList<>();
List<String> nodeList = CoordinationService.getInstance().getNodeList(CoordinationService.CategoryNode.CASES); List<String> nodeList = CoordinationService.getInstance().getNodeList(CoordinationService.CategoryNode.CASES);
for (String node : nodeList) { for (String node : nodeList) {
@ -216,64 +211,27 @@ class CaseBrowser extends javax.swing.JPanel implements ExplorerManager.Provider
File caseFolder = casePath.toFile(); File caseFolder = casePath.toFile();
if (caseFolder.exists()) { if (caseFolder.exists()) {
/* /*
* Search for '*.aut' and 'autoingest.alert' files. * Search for '*.aut' files.
*/ */
File[] fileArray = caseFolder.listFiles(); File[] fileArray = caseFolder.listFiles();
if (fileArray == null) { if (fileArray == null) {
continue; continue;
} }
String autFilePath = null; String autFilePath = null;
boolean alertFileFound = false;
for (File file : fileArray) { for (File file : fileArray) {
String name = file.getName().toLowerCase(); String name = file.getName().toLowerCase();
if (autFilePath == null && name.endsWith(".aut")) { if (autFilePath == null && name.endsWith(".aut")) {
autFilePath = file.getAbsolutePath(); try {
if (!alertFileFound) { caseList.add(new CaseMetadata(Paths.get(file.getAbsolutePath())));
continue; } catch (CaseMetadata.CaseMetadataException ex) {
LOGGER.log(Level.SEVERE, String.format("Error reading case metadata file '%s'.", autFilePath), ex);
} }
}
if (!alertFileFound && name.endsWith(ALERT_FILE_NAME)) {
alertFileFound = true;
}
if (autFilePath != null && alertFileFound) {
break; break;
} }
} }
if (autFilePath != null) {
try {
boolean hasAlertStatus = false;
if (alertFileFound) {
/*
* When an alert file exists, ignore the node
* data and use the ALERT status.
*/
hasAlertStatus = true;
} else {
byte[] rawData = CoordinationService.getInstance().getNodeData(CoordinationService.CategoryNode.CASES, node);
if (rawData != null && rawData.length > 0) {
/*
* When node data exists, use the status
* stored in the node data.
*/
CaseNodeData caseNodeData = new CaseNodeData(rawData);
if (caseNodeData.getErrorsOccurred()) {
hasAlertStatus = true;
}
}
}
CaseMetadata caseMetadata = new CaseMetadata(Paths.get(autFilePath));
casesMap.put(caseMetadata, hasAlertStatus);
} catch (CaseMetadata.CaseMetadataException ex) {
LOGGER.log(Level.SEVERE, String.format("Error reading case metadata file '%s'.", autFilePath), ex);
} catch (InterruptedException | CaseNodeData.InvalidDataException ex) {
LOGGER.log(Level.SEVERE, String.format("Error reading case node data for '%s'.", node), ex);
}
}
} }
} }
return casesMap; return caseList;
} }
@Override @Override

View File

@ -25,8 +25,6 @@ import java.nio.file.Path;
import java.nio.file.Paths; import java.nio.file.Paths;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.logging.Level; import java.util.logging.Level;
import javax.swing.AbstractAction; import javax.swing.AbstractAction;
import javax.swing.Action; import javax.swing.Action;
@ -49,7 +47,6 @@ final class MultiUserNode extends AbstractNode {
@Messages({"CaseNode.column.name=Name", @Messages({"CaseNode.column.name=Name",
"CaseNode.column.createdTime=Created Time", "CaseNode.column.createdTime=Created Time",
"CaseNode.column.status=Status",
"CaseNode.column.metadataFilePath=Path"}) "CaseNode.column.metadataFilePath=Path"})
private static final Logger LOGGER = Logger.getLogger(MultiUserNode.class.getName()); private static final Logger LOGGER = Logger.getLogger(MultiUserNode.class.getName());
private static final String LOG_FILE_NAME = "auto_ingest_log.txt"; private static final String LOG_FILE_NAME = "auto_ingest_log.txt";
@ -57,31 +54,30 @@ final class MultiUserNode extends AbstractNode {
/** /**
* Provides a root node with children which each represent a case. * Provides a root node with children which each represent a case.
* *
* @param caseMap the map of cases and a boolean indicating if they have an * @param caseList the list of CaseMetadata objects representing the cases
* alert
*/ */
MultiUserNode(Map<CaseMetadata, Boolean> caseMap) { MultiUserNode(List<CaseMetadata> caseList) {
super(Children.create(new MultiUserNodeChildren(caseMap), true)); super(Children.create(new MultiUserNodeChildren(caseList), true));
} }
static class MultiUserNodeChildren extends ChildFactory<Entry<CaseMetadata, Boolean>> { static class MultiUserNodeChildren extends ChildFactory<CaseMetadata> {
private final Map<CaseMetadata, Boolean> caseMap; private final List<CaseMetadata> caseList;
MultiUserNodeChildren(Map<CaseMetadata, Boolean> caseMap) { MultiUserNodeChildren(List<CaseMetadata> caseList) {
this.caseMap = caseMap; this.caseList = caseList;
} }
@Override @Override
protected boolean createKeys(List<Entry<CaseMetadata, Boolean>> list) { protected boolean createKeys(List<CaseMetadata> list) {
if (caseMap != null && caseMap.size() > 0) { if (caseList != null && caseList.size() > 0) {
list.addAll(caseMap.entrySet()); list.addAll(caseList);
} }
return true; return true;
} }
@Override @Override
protected Node createNodeForKey(Entry<CaseMetadata, Boolean> key) { protected Node createNodeForKey(CaseMetadata key) {
return new MultiUserCaseNode(key); return new MultiUserCaseNode(key);
} }
@ -95,19 +91,17 @@ final class MultiUserNode extends AbstractNode {
private final String caseName; private final String caseName;
private final String caseCreatedDate; private final String caseCreatedDate;
private final String caseMetadataFilePath; private final String caseMetadataFilePath;
private final boolean caseHasAlert;
private final Path caseLogFilePath; private final Path caseLogFilePath;
MultiUserCaseNode(Entry<CaseMetadata, Boolean> multiUserCase) { MultiUserCaseNode(CaseMetadata multiUserCase) {
super(Children.LEAF); super(Children.LEAF);
caseName = multiUserCase.getKey().getCaseDisplayName(); caseName = multiUserCase.getCaseDisplayName();
caseCreatedDate = multiUserCase.getKey().getCreatedDate(); caseCreatedDate = multiUserCase.getCreatedDate();
caseHasAlert = multiUserCase.getValue();
super.setName(caseName); super.setName(caseName);
setName(caseName); setName(caseName);
setDisplayName(caseName); setDisplayName(caseName);
caseMetadataFilePath = multiUserCase.getKey().getFilePath().toString(); caseMetadataFilePath = multiUserCase.getFilePath().toString();
caseLogFilePath = Paths.get(multiUserCase.getKey().getCaseDirectory(), LOG_FILE_NAME); caseLogFilePath = Paths.get(multiUserCase.getCaseDirectory(), LOG_FILE_NAME);
} }
/** /**
@ -119,7 +113,6 @@ final class MultiUserNode extends AbstractNode {
return new OpenMultiUserCaseAction(caseMetadataFilePath); return new OpenMultiUserCaseAction(caseMetadataFilePath);
} }
@Messages({"MultiUserNode.AlertColumn.text=Alert"}) //text to display when there is an alert present
@Override @Override
protected Sheet createSheet() { protected Sheet createSheet() {
Sheet s = super.createSheet(); Sheet s = super.createSheet();
@ -132,8 +125,6 @@ final class MultiUserNode extends AbstractNode {
caseName)); caseName));
ss.put(new NodeProperty<>(Bundle.CaseNode_column_createdTime(), Bundle.CaseNode_column_createdTime(), Bundle.CaseNode_column_createdTime(), ss.put(new NodeProperty<>(Bundle.CaseNode_column_createdTime(), Bundle.CaseNode_column_createdTime(), Bundle.CaseNode_column_createdTime(),
caseCreatedDate)); caseCreatedDate));
ss.put(new NodeProperty<>(Bundle.CaseNode_column_status(), Bundle.CaseNode_column_status(), Bundle.CaseNode_column_status(),
(caseHasAlert == true ? Bundle.MultiUserNode_AlertColumn_text() : "")));
ss.put(new NodeProperty<>(Bundle.CaseNode_column_metadataFilePath(), Bundle.CaseNode_column_metadataFilePath(), Bundle.CaseNode_column_metadataFilePath(), ss.put(new NodeProperty<>(Bundle.CaseNode_column_metadataFilePath(), Bundle.CaseNode_column_metadataFilePath(), Bundle.CaseNode_column_metadataFilePath(),
caseMetadataFilePath)); caseMetadataFilePath));
return s; return s;