19package org.sleuthkit.autopsy.directorytree;
21import java.awt.EventQueue;
22import java.awt.event.ActionEvent;
23import java.beans.PropertyVetoException;
24import java.util.ArrayList;
25import java.util.Arrays;
26import java.util.Collections;
28import java.util.Objects;
29import java.util.logging.Level;
30import java.util.stream.Collectors;
31import java.util.stream.Stream;
32import org.sleuthkit.autopsy.coreutils.Logger;
33import javax.swing.AbstractAction;
34import org.apache.commons.lang3.StringUtils;
35import org.openide.nodes.AbstractNode;
36import org.openide.explorer.ExplorerManager;
37import org.openide.explorer.view.TreeView;
38import org.openide.nodes.Children;
39import org.openide.nodes.Node;
40import org.openide.util.NbBundle.Messages;
41import org.sleuthkit.autopsy.casemodule.Case;
42import org.sleuthkit.autopsy.casemodule.CasePreferences;
43import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException;
44import org.sleuthkit.autopsy.core.UserPreferences;
45import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil;
46import org.sleuthkit.autopsy.datamodel.AbstractAbstractFileNode;
47import org.sleuthkit.autopsy.datamodel.AbstractFsContentNode;
48import org.sleuthkit.autopsy.datamodel.BlackboardArtifactNode;
49import org.sleuthkit.autopsy.datamodel.ContentNodeSelectionInfo;
50import org.sleuthkit.autopsy.datamodel.DataSourcesNode;
51import org.sleuthkit.autopsy.datamodel.DataSourceFilesNode;
52import org.sleuthkit.autopsy.datamodel.DisplayableItemNode;
53import org.sleuthkit.autopsy.datamodel.PersonNode;
54import org.sleuthkit.autopsy.datamodel.RootContentChildren;
55import org.sleuthkit.datamodel.AbstractFile;
56import org.sleuthkit.datamodel.BlackboardArtifact;
57import org.sleuthkit.datamodel.Content;
58import org.sleuthkit.datamodel.ContentVisitor;
59import org.sleuthkit.datamodel.DataSource;
60import org.sleuthkit.datamodel.FileSystem;
61import org.sleuthkit.datamodel.Host;
62import org.sleuthkit.datamodel.Person;
63import org.sleuthkit.datamodel.SleuthkitCase;
64import org.sleuthkit.datamodel.TskCoreException;
65import org.sleuthkit.datamodel.TskData;
66import org.sleuthkit.datamodel.TskDataException;
67import org.sleuthkit.datamodel.UnsupportedContent;
68import org.sleuthkit.datamodel.VolumeSystem;
93 this.content = artifactNode.getLookup().lookup(Content.class);
94 if (this.content !=
null && this.content instanceof AbstractFile) {
95 AbstractFile file = (AbstractFile)
content;
99 this.setEnabled(
false);
116 this.content = fileSystemContentNode.getLookup().lookup(Content.class);
131 this.content = abstractAbstractFileNode.getLookup().lookup(Content.class);
164 "ViewContextAction.errorMessage.cannotFindDirectory=Failed to locate directory.",
165 "ViewContextAction.errorMessage.cannotSelectDirectory=Failed to select directory in tree.",
166 "ViewContextAction.errorMessage.cannotFindNode=Failed to locate data source node in tree.",
167 "ViewContextAction.errorMessage.unsupportedParent=Unable to navigate to content not supported in this release."
170 EventQueue.invokeLater(() -> {
174 if ((parentContent !=
null) && (parentContent instanceof UnsupportedContent)) {
176 logger.log(Level.WARNING, String.format(
"Could not navigate to unsupported content with id: %d", parentContent.getId()));
184 Node parentTreeViewNode =
null;
185 if (parentContent !=
null) {
194 if (parentTreeViewNode ==
null) {
196 logger.log(Level.SEVERE,
"Failed to locate data source node in tree.");
200 setNodeSelection(this.content, parentTreeViewNode, treeViewTopComponent, treeViewExplorerMgr);
220 return (
content instanceof DataSource)
223 }
catch (TskCoreException ex) {
225 logger.log(Level.SEVERE, String.format(
"Could not get parent of Content object: %s",
content), ex);
244 Children rootChildren = treeViewExplorerMgr.getRootContext().getChildren();
246 if (rootDsNode !=
null) {
248 DataSource dataSource = dataSourceLevelNode.getLookup().lookup(DataSource.class);
249 if (dataSource !=
null) {
252 if (potentialParentTreeViewNode !=
null) {
253 return potentialParentTreeViewNode;
276 SleuthkitCase skCase;
281 long contentDSObjid = parentContent.getDataSource().getId();
282 DataSource datasource = skCase.getDataSource(contentDSObjid);
283 dsname = datasource.getName();
284 Children rootChildren = treeViewExplorerMgr.getRootContext().getChildren();
292 List<Node> dataSourceLevelNodes = Stream.of(rootChildren.getNodes(
true))
294 .collect(Collectors.toList());
296 for (Node treeNode : dataSourceLevelNodes) {
298 if (!(treeNode.getName().equals(dsname))) {
307 if (parentTreeViewNode !=
null) {
309 return parentTreeViewNode;
314 logger.log(Level.SEVERE,
"Failed to locate data source node in tree.", ex);
337 if (
content instanceof BlackboardArtifact) {
338 BlackboardArtifact artifact = ((BlackboardArtifact)
content);
339 long associatedId = artifact.getObjectID();
341 Content associatedFileContent = artifact.getSleuthkitCase().getContentById(associatedId);
343 }
catch (TskCoreException ex) {
344 logger.log(Level.SEVERE,
"Could not find associated content from artifact with id %d", artifact.getId());
348 TreeView treeView = treeViewTopComponent.getTree();
349 treeView.expandNode(parentTreeViewNode);
350 if (treeViewTopComponent.
getSelectedNode().equals(parentTreeViewNode)) {
357 treeViewTopComponent.respondSelection(treeViewExplorerMgr.getSelectedNodes(),
new Node[]{parentTreeViewNode});
360 treeViewExplorerMgr.setExploredContextAndSelection(parentTreeViewNode,
new Node[]{parentTreeViewNode});
361 }
catch (PropertyVetoException ex) {
363 logger.log(Level.SEVERE,
"Failed to select the parent node in the tree view", ex);
378 return Collections.emptyList();
379 }
else if (node.getLookup().lookup(Host.class) !=
null
380 || node.getLookup().lookup(Person.class) !=
null
383 Children children = node.getChildren();
384 Node[] childNodes = children ==
null ? null : children.getNodes(
true);
385 if (childNodes ==
null) {
386 return Collections.emptyList();
389 return Stream.of(node.getChildren().getNodes(
true))
391 .collect(Collectors.toList());
393 return Arrays.asList(node);
413 List<Content> contentBranch = parentContent.accept(ancestorVisitor);
414 Collections.reverse(contentBranch);
427 Node dummyRootNode =
new DirectoryTreeFilterNode(
new AbstractNode(
new RootContentChildren(contentBranch)),
true);
428 Children ancestorChildren = dummyRootNode.getChildren();
431 if (ancestorChildren.getNodesCount() == 1 && StringUtils.equals(ancestorChildren.getNodeAt(0).getName(), node.getName())) {
441 Children treeNodeChildren = node.getChildren();
442 Node parentTreeViewNode =
null;
443 for (
int i = 0; i < ancestorChildren.getNodesCount(); i++) {
444 Node ancestorNode = ancestorChildren.getNodeAt(i);
445 Node[] treeNodeChilds = treeNodeChildren.getNodes(
true);
446 for (
int j = 0; j < treeNodeChilds.length; j++) {
447 Node treeNode = treeNodeChilds[j];
448 if (ancestorNode.getName().equals(treeNode.getName())) {
449 parentTreeViewNode = treeNode;
450 treeNodeChildren = treeNode.getChildren();
455 return parentTreeViewNode;
465 List<Content> lineage =
new ArrayList<>();
470 Content parent =
null;
473 }
catch (TskCoreException ex) {
474 logger.log(Level.SEVERE, String.format(
"Could not get parent of Content object: %s",
content), ex);
476 return parent ==
null ? lineage : parent.accept(
this);
480 public List<Content>
visit(VolumeSystem volumeSystem) {
490 public List<Content>
visit(FileSystem fileSystem) {
500 Content parent =
null;
503 }
catch (TskCoreException ex) {
504 logger.log(Level.SEVERE, String.format(
"Could not get parent of Content object: %s",
content), ex);
506 return parent ==
null ? lineage : parent.accept(
this);
SleuthkitCase getSleuthkitCase()
static Case getCurrentCaseThrows()
static Boolean getGroupItemsInTreeByDataSource()
static boolean hideSlackFilesInDataSourcesTree()
static boolean hideKnownFilesInDataSourcesTree()
synchronized static Logger getLogger(String name)
static void error(String message)
static String getNameIdentifier()
static String getNameIdentifier()
void setChildNodeSelectionInfo(NodeSelectionInfo selectedChildNodeInfo)
static String getUnknownPersonId()
void setDirectoryListingActive()
static synchronized DirectoryTreeTopComponent findInstance()
ExplorerManager getExplorerManager()
List< Content > visit(FileSystem fileSystem)
List< Content > skipToParent(Content content)
List< Content > defaultVisit(Content content)
List< Content > visit(VolumeSystem volumeSystem)
Node getParentNodeGroupedByDataSource(ExplorerManager treeViewExplorerMgr, Content parentContent)
ViewContextAction(String displayName, BlackboardArtifactNode artifactNode)
ViewContextAction(String displayName, Content content)
ViewContextAction(String displayName, AbstractAbstractFileNode<? extends AbstractFile > abstractAbstractFileNode)
List< Node > getDataSourceLevelNodes(Node node)
void setNodeSelection(Content content, Node parentTreeViewNode, DirectoryTreeTopComponent treeViewTopComponent, ExplorerManager treeViewExplorerMgr)
ViewContextAction(String displayName, AbstractFsContentNode<? extends AbstractFile > fileSystemContentNode)
Node getParentNodeGroupedByPersonHost(ExplorerManager treeViewExplorerMgr, Content parentContent)
static final Logger logger
static final long serialVersionUID
Content getParentContent(Content content)
Node findParentNodeInTree(Content parentContent, Node node)
void actionPerformed(ActionEvent event)