Merge branch '845-multiselect-enabled-account-actions' into 841-maintain-selection

Conflicts:
	Core/src/org/sleuthkit/autopsy/datamodel/Accounts.java
This commit is contained in:
millmanorama 2016-09-21 18:51:03 +02:00
commit 7dcdaef389

View File

@ -24,14 +24,12 @@ import com.google.common.collect.TreeRangeMap;
import java.awt.event.ActionEvent; import java.awt.event.ActionEvent;
import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener; import java.beans.PropertyChangeListener;
import java.beans.PropertyVetoException;
import java.io.IOException; import java.io.IOException;
import java.io.InputStreamReader; import java.io.InputStreamReader;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
@ -49,7 +47,6 @@ import javax.annotation.concurrent.GuardedBy;
import javax.annotation.concurrent.Immutable; import javax.annotation.concurrent.Immutable;
import javax.swing.AbstractAction; import javax.swing.AbstractAction;
import javax.swing.Action; import javax.swing.Action;
import javax.swing.SwingUtilities;
import org.apache.commons.csv.CSVFormat; import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVParser; import org.apache.commons.csv.CSVParser;
import org.apache.commons.csv.CSVRecord; import org.apache.commons.csv.CSVRecord;
@ -57,15 +54,12 @@ import org.apache.commons.lang3.StringUtils;
import org.openide.nodes.ChildFactory; import org.openide.nodes.ChildFactory;
import org.openide.nodes.Children; import org.openide.nodes.Children;
import org.openide.nodes.Node; import org.openide.nodes.Node;
import org.openide.nodes.NodeOp;
import org.openide.nodes.Sheet; import org.openide.nodes.Sheet;
import org.openide.util.Exceptions;
import org.openide.util.NbBundle; import org.openide.util.NbBundle;
import org.openide.util.Utilities;
import org.openide.util.lookup.Lookups; import org.openide.util.lookup.Lookups;
import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.casemodule.Case;
import org.sleuthkit.autopsy.corecomponents.DataResultTopComponent;
import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil; import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil;
import org.sleuthkit.autopsy.directorytree.DirectoryTreeTopComponent;
import org.sleuthkit.autopsy.ingest.IngestManager; import org.sleuthkit.autopsy.ingest.IngestManager;
import org.sleuthkit.autopsy.ingest.ModuleDataEvent; import org.sleuthkit.autopsy.ingest.ModuleDataEvent;
import org.sleuthkit.datamodel.AbstractFile; import org.sleuthkit.datamodel.AbstractFile;
@ -162,6 +156,9 @@ public class Accounts extends Observable implements AutopsyVisitableItem {
} }
} }
private final RejectAccounts rejectActionInstance;
private final ApproveAccounts approveActionInstance;
/** /**
* Constructor * Constructor
* *
@ -169,6 +166,9 @@ public class Accounts extends Observable implements AutopsyVisitableItem {
*/ */
Accounts(SleuthkitCase skCase) { Accounts(SleuthkitCase skCase) {
this.skCase = skCase; this.skCase = skCase;
this.rejectActionInstance = new RejectAccounts();
this.approveActionInstance = new ApproveAccounts();
} }
/** /**
@ -895,9 +895,6 @@ public class Accounts extends Observable implements AutopsyVisitableItem {
return s; return s;
} }
@NbBundle.Messages({
"ApproveAccountsAction.name=Approve Accounts",
"RejectAccountsAction.name=Reject Accounts"})
@Override @Override
public Action[] getActions(boolean context) { public Action[] getActions(boolean context) {
Action[] actions = super.getActions(context); Action[] actions = super.getActions(context);
@ -908,8 +905,10 @@ public class Accounts extends Observable implements AutopsyVisitableItem {
} catch (TskCoreException ex) { } catch (TskCoreException ex) {
LOGGER.log(Level.SEVERE, "Error gettung content by id", ex); LOGGER.log(Level.SEVERE, "Error gettung content by id", ex);
} }
arrayList.add(new ApproveAccounts(getLookup().lookupAll(BlackboardArtifact.class)));
arrayList.add(new RejectAccounts(getLookup().lookupAll(BlackboardArtifact.class), this)); arrayList.add(approveActionInstance);
arrayList.add(rejectActionInstance);
return arrayList.toArray(new Action[arrayList.size()]); return arrayList.toArray(new Action[arrayList.size()]);
} }
} }
@ -1229,8 +1228,10 @@ public class Accounts extends Observable implements AutopsyVisitableItem {
public Action[] getActions(boolean context) { public Action[] getActions(boolean context) {
List<Action> actionsList = new ArrayList<>(); List<Action> actionsList = new ArrayList<>();
actionsList.addAll(Arrays.asList(super.getActions(context))); actionsList.addAll(Arrays.asList(super.getActions(context)));
actionsList.add(new ApproveAccounts(Collections.singleton(artifact)));
actionsList.add(new RejectAccounts(Collections.singleton(artifact), this)); actionsList.add(approveActionInstance);
actionsList.add(rejectActionInstance);
return actionsList.toArray(new Action[actionsList.size()]); return actionsList.toArray(new Action[actionsList.size()]);
} }
@ -1261,84 +1262,81 @@ public class Accounts extends Observable implements AutopsyVisitableItem {
@Override @Override
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
showRejected = !showRejected; showRejected = !showRejected;
update(); Accounts.this.update();
} }
} }
private class ApproveAccounts extends AbstractAction { private abstract class ReviewStatusAction extends AbstractAction {
private final Collection<? extends BlackboardArtifact> artifacts; private final BlackboardArtifact.ReviewStatus newStatus;
private ReviewStatusAction(String displayName, BlackboardArtifact.ReviewStatus newStatus) {
super(displayName);
this.newStatus = newStatus;
ApproveAccounts(Collection<? extends BlackboardArtifact> artifacts) {
super(Bundle.ApproveAccountsAction_name());
this.artifacts = artifacts;
} }
@Override @Override
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
try { Utilities.actionsGlobalContext().lookupAll(BlackboardArtifact.class).forEach(artifact -> {
for (BlackboardArtifact artifact : artifacts) { try {
skCase.setReviewStatus(artifact, BlackboardArtifact.ReviewStatus.APPROVED); skCase.setReviewStatus(artifact, newStatus);
} catch (TskCoreException ex) {
LOGGER.log(Level.SEVERE, "Error changing artifact review status.", ex); //NON-NLS
} }
Accounts.this.update(); });
} catch (TskCoreException ex) { Accounts.this.update();
LOGGER.log(Level.SEVERE, "Error approving artifacts.", ex); //NON-NLS
}
} }
} }
private class RejectAccounts extends AbstractAction { private class ApproveAccounts extends ReviewStatusAction {
private final Collection<? extends BlackboardArtifact> artifacts; @NbBundle.Messages({"ApproveAccountsAction.name=Approve Accounts"})
private final Node target; private ApproveAccounts() {
super(Bundle.ApproveAccountsAction_name(), BlackboardArtifact.ReviewStatus.APPROVED);
}
}
RejectAccounts(Collection<? extends BlackboardArtifact> artifacts, Node target) { private class RejectAccounts extends ReviewStatusAction {
super(Bundle.RejectAccountsAction_name());
this.artifacts = artifacts; @NbBundle.Messages({"RejectAccountsAction.name=Reject Accounts"})
this.target = target; private RejectAccounts() {
super(Bundle.RejectAccountsAction_name(), BlackboardArtifact.ReviewStatus.REJECTED);
} }
@Override @Override
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
try { super.actionPerformed(e);
for (BlackboardArtifact artifact : artifacts) { // //find the node to select after the target is removed from the UI
skCase.setReviewStatus(artifact, BlackboardArtifact.ReviewStatus.REJECTED); // List<Node> siblings = Arrays.asList(target.getParentNode().getChildren().getNodes());
} // if (siblings.size() <= 1) {
// Accounts.this.update();
//find the node to select after the target is removed from the UI // } else {
List<Node> siblings = Arrays.asList(target.getParentNode().getChildren().getNodes()); // final int indexOf = siblings.indexOf(target);
if (siblings.size() <= 1) { //
Accounts.this.update(); // final Node sibling = indexOf < siblings.size() - 1 // if it is not the last in the list
} else { // ? siblings.get(indexOf + 1) //select the next element
final int indexOf = siblings.indexOf(target); // : siblings.get(indexOf - 1);//else select the previous element
// String nodeToSelectName = sibling.getName();
final Node sibling = indexOf < siblings.size() - 1 // if it is not the last in the list // Accounts.this.update();
? siblings.get(indexOf + 1) //select the next element //
: siblings.get(indexOf - 1);//else select the previous element // if (showRejected == false && siblings.size() > 1) {
String nodeToSelectName = sibling.getName(); // SwingUtilities.invokeLater(() -> {
Accounts.this.update(); // final DirectoryTreeTopComponent directoryTree = DirectoryTreeTopComponent.findInstance();
// final DataResultTopComponent directoryListing = directoryTree.getDirectoryListing();
if (showRejected == false && siblings.size() > 1) { // final Node rootNode = directoryListing.getRootNode();
SwingUtilities.invokeLater(() -> { //
final DirectoryTreeTopComponent directoryTree = DirectoryTreeTopComponent.findInstance(); // Node child = NodeOp.findChild(rootNode, nodeToSelectName);
final DataResultTopComponent directoryListing = directoryTree.getDirectoryListing(); //
final Node rootNode = directoryListing.getRootNode(); // try {
// directoryTree.getExplorerManager().setSelectedNodes(new Node[]{child.getParentNode()});
Node child = NodeOp.findChild(rootNode, nodeToSelectName); // directoryListing.setSelectedNodes(new Node[]{child.getParentNode()});
// } catch (PropertyVetoException ex) {
try { // Exceptions.printStackTrace(ex);
directoryTree.getExplorerManager().setSelectedNodes(new Node[]{child.getParentNode()}); // }
directoryListing.setSelectedNodes(new Node[]{child.getParentNode()}); // });
} catch (PropertyVetoException ex) { // }
Exceptions.printStackTrace(ex); // }
}
});
}
}
} catch (TskCoreException ex) {
LOGGER.log(Level.SEVERE, "Error approving artifacts.", ex); //NON-NLS
}
} }
} }
} }