search result children and loading in DataResultTopComponent

This commit is contained in:
Greg DiCristofaro 2021-10-06 13:24:33 -04:00
parent bb255017ca
commit 33c5c08a43
9 changed files with 384 additions and 96 deletions

View File

@ -18,10 +18,12 @@
*/ */
package org.sleuthkit.autopsy.corecomponents; package org.sleuthkit.autopsy.corecomponents;
import java.text.MessageFormat;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.logging.Level; import java.util.logging.Level;
import javax.swing.JComponent; import javax.swing.JComponent;
import org.openide.explorer.ExplorerManager; import org.openide.explorer.ExplorerManager;
@ -39,6 +41,9 @@ import org.sleuthkit.autopsy.corecomponentinterfaces.DataResult;
import org.sleuthkit.autopsy.corecomponentinterfaces.DataResultViewer; import org.sleuthkit.autopsy.corecomponentinterfaces.DataResultViewer;
import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.coreutils.Logger;
import org.sleuthkit.autopsy.datamodel.DataArtifactTypeNodev2; import org.sleuthkit.autopsy.datamodel.DataArtifactTypeNodev2;
import org.sleuthkit.autopsy.datamodel.ThreePanelDAO;
import org.sleuthkit.autopsy.datamodel.ThreePanelDAO.DataArtifactTableDTO;
import org.sleuthkit.autopsy.datamodel.ThreePanelDAO.DataArtifactTableSearchResultsDTO;
import org.sleuthkit.autopsy.directorytree.ExternalViewerShortcutAction; import org.sleuthkit.autopsy.directorytree.ExternalViewerShortcutAction;
import org.sleuthkit.datamodel.BlackboardArtifact; import org.sleuthkit.datamodel.BlackboardArtifact;
@ -362,8 +367,20 @@ public final class DataResultTopComponent extends TopComponent implements DataRe
dataResultPanel.setNode(selectedNode); dataResultPanel.setNode(selectedNode);
} }
private final ThreePanelDAO threePanelDAO = ThreePanelDAO.getInstance();
public void displayDataArtifact(BlackboardArtifact.Type artifactType, Long dataSourceId) { public void displayDataArtifact(BlackboardArtifact.Type artifactType, Long dataSourceId) {
setNode(new TableFilterNode(new DataArtifactTypeNodev2(artifactType, dataSourceId), true)); try {
DataArtifactTableSearchResultsDTO table = threePanelDAO.getDataArtifactsForTable(artifactType, dataSourceId);
dataResultPanel.setNode(new DataArtifactTypeNodev2(table));
dataResultPanel.setNumberOfChildNodes(table.getTotalResultsCount());
} catch (ExecutionException | IllegalArgumentException ex) {
logger.log(Level.WARNING, MessageFormat.format(
"There was an error fetching data for artifact type: {0} and data source id: {1}.",
artifactType.getTypeName(),
dataSourceId == null ? "<null>" : dataSourceId),
ex);
}
} }
@Override @Override

View File

@ -175,6 +175,10 @@ FileNode.getActions.openInExtViewer.text=Open in External Viewer Ctrl+E
FileNode.getActions.searchFilesSameMD5.text=Search for files with the same MD5 hash FileNode.getActions.searchFilesSameMD5.text=Search for files with the same MD5 hash
FileNode.getActions.viewFileInDir.text=View File in Directory FileNode.getActions.viewFileInDir.text=View File in Directory
FileNode.getActions.viewInNewWin.text=View Item in New Window FileNode.getActions.viewInNewWin.text=View Item in New Window
FileNodev2.getActions.openInExtViewer.text=Open in External Viewer Ctrl+E
FileNodev2.getActions.searchFilesSameMD5.text=Search for files with the same MD5 hash
FileNodev2.getActions.viewFileInDir.text=View File in Directory
FileNodev2.getActions.viewInNewWin.text=View Item in New Window
FileTypeExtensionFilters.tskDatabaseFilter.text=Databases FileTypeExtensionFilters.tskDatabaseFilter.text=Databases
FileTypes.bgCounting.placeholder=\ (counting...) FileTypes.bgCounting.placeholder=\ (counting...)
FileTypes.createSheet.name.desc=no description FileTypes.createSheet.name.desc=no description

View File

@ -5,71 +5,25 @@
*/ */
package org.sleuthkit.autopsy.datamodel; package org.sleuthkit.autopsy.datamodel;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.logging.Level;
import java.util.stream.Collectors;
import org.openide.nodes.ChildFactory;
import org.openide.nodes.Node; import org.openide.nodes.Node;
import org.sleuthkit.autopsy.coreutils.Logger;
import org.sleuthkit.autopsy.datamodel.DataArtifactFactoryv2.ChildData;
import org.sleuthkit.autopsy.datamodel.ThreePanelDAO.DataArtifactRow;
import org.sleuthkit.autopsy.datamodel.ThreePanelDAO.DataArtifactTableDTO; import org.sleuthkit.autopsy.datamodel.ThreePanelDAO.DataArtifactTableDTO;
import org.sleuthkit.datamodel.BlackboardArtifact; import org.sleuthkit.autopsy.datamodel.ThreePanelDAO.DataArtifactTableSearchResultsDTO;
/** /**
* *
* @author gregd * @author gregd
*/ */
public class DataArtifactFactoryv2 extends ChildFactory.Detachable<DataArtifactFactoryv2.ChildData> { public class DataArtifactFactoryv2 extends SearchResultChildFactory<DataArtifactTableSearchResultsDTO, DataArtifactTableDTO> {
public static class ChildData { public DataArtifactFactoryv2() {
private final DataArtifactTableDTO tableData;
private final DataArtifactRow artifactRow;
public ChildData(DataArtifactTableDTO tableData, DataArtifactRow artifactRow) {
this.tableData = tableData;
this.artifactRow = artifactRow;
} }
public DataArtifactTableDTO getTableData() { public DataArtifactFactoryv2(DataArtifactTableSearchResultsDTO initialResults) {
return tableData; super(initialResults);
}
public DataArtifactRow getArtifactRow() {
return artifactRow;
}
}
private static final Logger logger = Logger.getLogger(DataArtifactFactoryv2.class.getName());
private final BlackboardArtifact.Type type;
private final Long filteringDSObjId;
private final ThreePanelDAO dao = ThreePanelDAO.getInstance();
DataArtifactFactoryv2(BlackboardArtifact.Type type, Long filteringDSObjId) {
this.type = type;
this.filteringDSObjId = filteringDSObjId;
} }
@Override @Override
protected boolean createKeys(List<ChildData> toPopulate) { protected Node createNodeForKey(DataArtifactTableSearchResultsDTO searchResults, DataArtifactTableDTO itemData) {
try { return new DataArtifactNodev2(searchResults, itemData);
DataArtifactTableDTO table = dao.getDataArtifactsForTable(type, filteringDSObjId);
List<ChildData> keys = table.getRows().stream()
.map((row) -> new ChildData(table, row))
.collect(Collectors.toList());
toPopulate.addAll(keys);
return true;
} catch (ExecutionException ex) {
logger.log(Level.WARNING, "There was an error fetching data for type: " + type, ex);
return false;
}
}
@Override
protected Node createNodeForKey(ChildData key) {
return new DataArtifactNodev2(key.getTableData(), key.getArtifactRow());
} }
} }

View File

@ -61,8 +61,8 @@ import org.sleuthkit.autopsy.centralrepository.datamodel.CentralRepository;
import org.sleuthkit.autopsy.coreutils.ContextMenuExtensionPoint; import org.sleuthkit.autopsy.coreutils.ContextMenuExtensionPoint;
import org.sleuthkit.autopsy.coreutils.TimeZoneUtils; import org.sleuthkit.autopsy.coreutils.TimeZoneUtils;
import static org.sleuthkit.autopsy.datamodel.AbstractContentNode.NO_DESCR; import static org.sleuthkit.autopsy.datamodel.AbstractContentNode.NO_DESCR;
import org.sleuthkit.autopsy.datamodel.ThreePanelDAO.DataArtifactRow;
import org.sleuthkit.autopsy.datamodel.ThreePanelDAO.DataArtifactTableDTO; import org.sleuthkit.autopsy.datamodel.ThreePanelDAO.DataArtifactTableDTO;
import org.sleuthkit.autopsy.datamodel.ThreePanelDAO.DataArtifactTableSearchResultsDTO;
import org.sleuthkit.autopsy.texttranslation.TextTranslationService; import org.sleuthkit.autopsy.texttranslation.TextTranslationService;
import org.sleuthkit.autopsy.directorytree.ExportCSVAction; import org.sleuthkit.autopsy.directorytree.ExportCSVAction;
import org.sleuthkit.autopsy.directorytree.ExternalViewerAction; import org.sleuthkit.autopsy.directorytree.ExternalViewerAction;
@ -88,7 +88,7 @@ public class DataArtifactNodev2 extends AbstractNode {
private static final Logger logger = Logger.getLogger(DataArtifactNodev2.class.getName()); private static final Logger logger = Logger.getLogger(DataArtifactNodev2.class.getName());
private static Lookup createLookup(DataArtifactRow row) { private static Lookup createLookup(DataArtifactTableDTO row) {
DataArtifactItem artifactItem = new DataArtifactItem(row.getDataArtifact(), row.getSrcContent()); DataArtifactItem artifactItem = new DataArtifactItem(row.getDataArtifact(), row.getSrcContent());
if (row.getSrcContent() == null) { if (row.getSrcContent() == null) {
return Lookups.fixed(row.getDataArtifact(), artifactItem); return Lookups.fixed(row.getDataArtifact(), artifactItem);
@ -99,15 +99,15 @@ public class DataArtifactNodev2 extends AbstractNode {
private final BlackboardArtifact.Type artifactType; private final BlackboardArtifact.Type artifactType;
private final Map<Integer, BlackboardAttribute.Type> attributeTypes; private final Map<Integer, BlackboardAttribute.Type> attributeTypes;
private final DataArtifactRow artifactRow; private final DataArtifactTableDTO artifactRow;
private final boolean hasSupportedTimeStamp; private final boolean hasSupportedTimeStamp;
private String translatedSourceName = null; private String translatedSourceName = null;
public DataArtifactNodev2(DataArtifactTableDTO tableData, DataArtifactRow artifactRow) { public DataArtifactNodev2(DataArtifactTableSearchResultsDTO tableData, DataArtifactTableDTO artifactRow) {
this(tableData, artifactRow, IconsUtil.getIconFilePath(tableData.getArtifactType().getTypeID())); this(tableData, artifactRow, IconsUtil.getIconFilePath(tableData.getArtifactType().getTypeID()));
} }
public DataArtifactNodev2(DataArtifactTableDTO tableData, DataArtifactRow artifactRow, String iconPath) { public DataArtifactNodev2(DataArtifactTableSearchResultsDTO tableData, DataArtifactTableDTO artifactRow, String iconPath) {
super(Children.LEAF, createLookup(artifactRow)); super(Children.LEAF, createLookup(artifactRow));
setDisplayName(artifactRow.getSrcContent().getName()); setDisplayName(artifactRow.getSrcContent().getName());

View File

@ -9,23 +9,26 @@ import org.openide.nodes.AbstractNode;
import org.openide.nodes.Children; import org.openide.nodes.Children;
import org.openide.nodes.Sheet; import org.openide.nodes.Sheet;
import org.openide.util.NbBundle; import org.openide.util.NbBundle;
import org.sleuthkit.autopsy.datamodel.ThreePanelDAO.DataArtifactTableSearchResultsDTO;
import org.sleuthkit.autopsy.datamodel.utils.IconsUtil; import org.sleuthkit.autopsy.datamodel.utils.IconsUtil;
import org.sleuthkit.datamodel.BlackboardArtifact;
/** /**
* *
* @author gregd * @author gregd
*/ */
public class DataArtifactTypeNodev2 extends AbstractNode { public class DataArtifactTypeNodev2 extends AbstractNode {
private final SearchResultChildFactory<?,?> factory;
private final BlackboardArtifact.Type artifactType; public DataArtifactTypeNodev2(DataArtifactTableSearchResultsDTO initialResults) {
this(initialResults, new DataArtifactFactoryv2(initialResults));
}
public DataArtifactTypeNodev2(BlackboardArtifact.Type artifactType, Long dataSourceId) { private DataArtifactTypeNodev2(DataArtifactTableSearchResultsDTO initialResults, DataArtifactFactoryv2 factory) {
super(Children.create(new DataArtifactFactoryv2(artifactType, dataSourceId), true)); super(Children.create(factory, true));
setName(artifactType.getTypeName()); this.factory = factory;
setDisplayName(artifactType.getDisplayName()); setName(initialResults.getArtifactType().getTypeName());
this.artifactType = artifactType; setDisplayName(initialResults.getArtifactType().getDisplayName());
String iconPath = IconsUtil.getIconFilePath(artifactType.getTypeID()); String iconPath = IconsUtil.getIconFilePath(initialResults.getArtifactType().getTypeID());
setIconBaseWithExtension(iconPath != null && iconPath.charAt(0) == '/' ? iconPath.substring(1) : iconPath); setIconBaseWithExtension(iconPath != null && iconPath.charAt(0) == '/' ? iconPath.substring(1) : iconPath);
} }
@ -41,12 +44,13 @@ public class DataArtifactTypeNodev2 extends AbstractNode {
sheetSet.put(new NodeProperty<>(NbBundle.getMessage(this.getClass(), "ArtifactTypeNode.createSheet.artType.name"), sheetSet.put(new NodeProperty<>(NbBundle.getMessage(this.getClass(), "ArtifactTypeNode.createSheet.artType.name"),
NbBundle.getMessage(this.getClass(), "ArtifactTypeNode.createSheet.artType.displayName"), NbBundle.getMessage(this.getClass(), "ArtifactTypeNode.createSheet.artType.displayName"),
NbBundle.getMessage(this.getClass(), "ArtifactTypeNode.createSheet.artType.desc"), NbBundle.getMessage(this.getClass(), "ArtifactTypeNode.createSheet.artType.desc"),
this.artifactType.getDisplayName())); getDisplayName()));
sheetSet.put(new NodeProperty<>(NbBundle.getMessage(this.getClass(), "ArtifactTypeNode.createSheet.childCnt.name"),
NbBundle.getMessage(this.getClass(), "ArtifactTypeNode.createSheet.childCnt.displayName"),
NbBundle.getMessage(this.getClass(), "ArtifactTypeNode.createSheet.childCnt.desc"),
this.factory.getResultCount()));
// sheetSet.put(new NodeProperty<>(NbBundle.getMessage(this.getClass(), "ArtifactTypeNode.createSheet.childCnt.name"),
// NbBundle.getMessage(this.getClass(), "ArtifactTypeNode.createSheet.childCnt.displayName"),
// NbBundle.getMessage(this.getClass(), "ArtifactTypeNode.createSheet.childCnt.desc"),
// getChildCount()));
return sheet; return sheet;
} }
} }

View File

@ -197,28 +197,28 @@ public class FileNodev2 extends AbstractNode {
*/ */
@Override @Override
@NbBundle.Messages({ @NbBundle.Messages({
"FileNode.getActions.viewFileInDir.text=View File in Directory", "FileNodev2.getActions.viewFileInDir.text=View File in Directory",
"FileNode.getActions.viewInNewWin.text=View Item in New Window", "FileNodev2.getActions.viewInNewWin.text=View Item in New Window",
"FileNode.getActions.openInExtViewer.text=Open in External Viewer Ctrl+E", "FileNodev2.getActions.openInExtViewer.text=Open in External Viewer Ctrl+E",
"FileNode.getActions.searchFilesSameMD5.text=Search for files with the same MD5 hash"}) "FileNodev2.getActions.searchFilesSameMD5.text=Search for files with the same MD5 hash"})
public Action[] getActions(boolean context) { public Action[] getActions(boolean context) {
List<Action> actionsList = new ArrayList<>(); List<Action> actionsList = new ArrayList<>();
// GVDTODO: action requires node // GVDTODO: action requires node
// if (!this.directoryBrowseMode) { // if (!this.directoryBrowseMode) {
// actionsList.add(new ViewContextAction(Bundle.FileNode_getActions_viewFileInDir_text(), this)); // actionsList.add(new ViewContextAction(Bundle.FileNodev2_getActions_viewFileInDir_text(), this));
// } // }
actionsList.add(ViewFileInTimelineAction.createViewFileAction(this.fileData.getAbstractFile())); actionsList.add(ViewFileInTimelineAction.createViewFileAction(this.fileData.getAbstractFile()));
actionsList.add(null); // Creates an item separator actionsList.add(null); // Creates an item separator
actionsList.add(new NewWindowViewAction(Bundle.FileNode_getActions_viewInNewWin_text(), this)); actionsList.add(new NewWindowViewAction(Bundle.FileNodev2_getActions_viewInNewWin_text(), this));
final Collection<AbstractFile> selectedFilesList final Collection<AbstractFile> selectedFilesList
= new HashSet<>(Utilities.actionsGlobalContext().lookupAll(AbstractFile.class)); = new HashSet<>(Utilities.actionsGlobalContext().lookupAll(AbstractFile.class));
if (selectedFilesList.size() == 1) { if (selectedFilesList.size() == 1) {
actionsList.add(new ExternalViewerAction( actionsList.add(new ExternalViewerAction(
Bundle.FileNode_getActions_openInExtViewer_text(), this)); Bundle.FileNodev2_getActions_openInExtViewer_text(), this));
} else { } else {
actionsList.add(ExternalViewerShortcutAction.getInstance()); actionsList.add(ExternalViewerShortcutAction.getInstance());
} }

View File

@ -0,0 +1,108 @@
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package org.sleuthkit.autopsy.datamodel;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
import org.openide.nodes.ChildFactory;
import org.openide.nodes.Node;
import org.sleuthkit.autopsy.datamodel.SearchResultChildFactory.ChildKey;
import org.sleuthkit.autopsy.datamodel.ThreePanelDAO.SearchResultsDTO;
/**
*
* @author gregd
*/
public abstract class SearchResultChildFactory<T extends SearchResultsDTO<S>, S> extends ChildFactory<ChildKey<S, T>> {
private T results;
public SearchResultChildFactory() {
this(null);
}
public SearchResultChildFactory(T initialResults) {
this.results = initialResults;
}
@Override
protected boolean createKeys(List<ChildKey<S, T>> toPopulate) {
T results = this.results;
if (results != null) {
List<ChildKey<S, T>> childKeys = results.getItems().stream()
.map((item) -> new ChildKey<>(results, item))
.collect(Collectors.toList());
toPopulate.addAll(childKeys);
}
return true;
}
@Override
protected Node createNodeForKey(ChildKey<S, T> key) {
return createNodeForKey(key.getSearchResults(), key.getChild());
}
protected abstract Node createNodeForKey(T searchResults, S itemData);
public void update(T newResults) {
this.results = newResults;
this.refresh(false);
}
public int getResultCount() {
return results == null ? 0 : results.getTotalResultsCount();
}
static class ChildKey<S, T extends SearchResultsDTO<S>> {
private final T searchResults;
private final S child;
ChildKey(T searchResults, S child) {
this.searchResults = searchResults;
this.child = child;
}
T getSearchResults() {
return searchResults;
}
S getChild() {
return child;
}
@Override
public int hashCode() {
int hash = 3;
hash = 97 * hash + Objects.hashCode(this.child);
return hash;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final ChildKey<?, ?> other = (ChildKey<?, ?>) obj;
if (!Objects.equals(this.child, other.child)) {
return false;
}
return true;
}
}
}

View File

@ -53,14 +53,14 @@ public class ThreePanelDAO {
return instance; return instance;
} }
private final Cache<DataArtifactCacheKey, DataArtifactTableDTO> dataArtifactCache = CacheBuilder.newBuilder().maximumSize(1000).build(); private final Cache<DataArtifactCacheKey, DataArtifactTableSearchResultsDTO> dataArtifactCache = CacheBuilder.newBuilder().maximumSize(1000).build();
private final Cache<Long, List<FilesContentTableDTO>> filesCache = CacheBuilder.newBuilder().maximumSize(1000).build(); private final Cache<Long, List<FilesContentTableDTO>> filesCache = CacheBuilder.newBuilder().maximumSize(1000).build();
private SleuthkitCase getCase() throws NoCurrentCaseException { private SleuthkitCase getCase() throws NoCurrentCaseException {
return Case.getCurrentCaseThrows().getSleuthkitCase(); return Case.getCurrentCaseThrows().getSleuthkitCase();
} }
private DataArtifactTableDTO fetchDataArtifactsForTable(DataArtifactCacheKey cacheKey) throws NoCurrentCaseException, TskCoreException { private DataArtifactTableSearchResultsDTO fetchDataArtifactsForTable(DataArtifactCacheKey cacheKey) throws NoCurrentCaseException, TskCoreException {
SleuthkitCase skCase = getCase(); SleuthkitCase skCase = getCase();
Blackboard blackboard = skCase.getBlackboard(); Blackboard blackboard = skCase.getBlackboard();
@ -74,7 +74,7 @@ public class ThreePanelDAO {
// determine all different attribute types present as well as row data for each artifact // determine all different attribute types present as well as row data for each artifact
Set<BlackboardAttribute.Type> attributeTypes = new HashSet<>(); Set<BlackboardAttribute.Type> attributeTypes = new HashSet<>();
List<DataArtifactRow> rows = new ArrayList<>(); List<DataArtifactTableDTO> rows = new ArrayList<>();
for (DataArtifact artifact : arts) { for (DataArtifact artifact : arts) {
long id = artifact.getId(); long id = artifact.getId();
@ -91,14 +91,14 @@ public class ThreePanelDAO {
Content srcContent = artifact.getParent(); Content srcContent = artifact.getParent();
String dataSourceName = getDataSourceName(srcContent); String dataSourceName = getDataSourceName(srcContent);
rows.add(new DataArtifactRow(id, attributeValues, artifact, srcContent, linkedFile, dataSourceName)); rows.add(new DataArtifactTableDTO(id, attributeValues, artifact, srcContent, linkedFile, dataSourceName));
} }
List<BlackboardAttribute.Type> attributeTypeSortedList = attributeTypes.stream() List<BlackboardAttribute.Type> attributeTypeSortedList = attributeTypes.stream()
.sorted((a, b) -> a.getDisplayName().compareToIgnoreCase(b.getDisplayName())) .sorted((a, b) -> a.getDisplayName().compareToIgnoreCase(b.getDisplayName()))
.collect(Collectors.toList()); .collect(Collectors.toList());
return new DataArtifactTableDTO(artType, attributeTypeSortedList, rows); return new DataArtifactTableSearchResultsDTO(artType, attributeTypeSortedList, rows);
} }
private String getDataSourceName(Content srcContent) throws TskCoreException { private String getDataSourceName(Content srcContent) throws TskCoreException {
@ -181,7 +181,7 @@ public class ThreePanelDAO {
} }
} }
public DataArtifactTableDTO getDataArtifactsForTable(BlackboardArtifact.Type artType, Long dataSourceId) throws ExecutionException, IllegalArgumentException { public DataArtifactTableSearchResultsDTO getDataArtifactsForTable(BlackboardArtifact.Type artType, Long dataSourceId) throws ExecutionException, IllegalArgumentException {
if (artType == null || artType.getCategory() != BlackboardArtifact.Category.DATA_ARTIFACT) { if (artType == null || artType.getCategory() != BlackboardArtifact.Category.DATA_ARTIFACT) {
throw new IllegalArgumentException(MessageFormat.format("Illegal data. " throw new IllegalArgumentException(MessageFormat.format("Illegal data. "
+ "Artifact type must be non-null and data artifact. " + "Artifact type must be non-null and data artifact. "
@ -305,7 +305,7 @@ public class ThreePanelDAO {
} }
public static class DataArtifactRow { public static class DataArtifactTableDTO {
private final long id; private final long id;
@ -316,7 +316,7 @@ public class ThreePanelDAO {
private final Content linkedFile; private final Content linkedFile;
private String dataSourceName; private String dataSourceName;
public DataArtifactRow(long id, Map<Integer, Object> attributeValues, DataArtifact dataArtifact, Content srcContent, Content linkedFile, String dataSourceName) { public DataArtifactTableDTO(long id, Map<Integer, Object> attributeValues, DataArtifact dataArtifact, Content srcContent, Content linkedFile, String dataSourceName) {
this.id = id; this.id = id;
this.attributeValues = attributeValues; this.attributeValues = attributeValues;
this.dataArtifact = dataArtifact; this.dataArtifact = dataArtifact;
@ -348,18 +348,57 @@ public class ThreePanelDAO {
public String getDataSourceName() { public String getDataSourceName() {
return dataSourceName; return dataSourceName;
} }
@Override
public int hashCode() {
int hash = 7;
hash = 67 * hash + (int) (this.id ^ (this.id >>> 32));
return hash;
} }
public static class DataArtifactTableDTO { @Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final DataArtifactTableDTO other = (DataArtifactTableDTO) obj;
if (this.id != other.id) {
return false;
}
return true;
}
}
public interface SearchResultsDTO<T> {
int getTotalResultsCount();
List<T> getItems();
}
public static class DataArtifactTableSearchResultsDTO implements SearchResultsDTO<DataArtifactTableDTO> {
private final BlackboardArtifact.Type artifactType; private final BlackboardArtifact.Type artifactType;
private final List<BlackboardAttribute.Type> attributeTypes; private final List<BlackboardAttribute.Type> attributeTypes;
private final List<DataArtifactRow> rows; private final List<DataArtifactTableDTO> items;
private final int totalResultsCount;
public DataArtifactTableDTO(BlackboardArtifact.Type artifactType, List<BlackboardAttribute.Type> attributeKeys, List<DataArtifactRow> rows) { public DataArtifactTableSearchResultsDTO(BlackboardArtifact.Type artifactType, List<BlackboardAttribute.Type> attributeKeys, List<DataArtifactTableDTO> items) {
this(artifactType, attributeKeys, items, items.size());
}
public DataArtifactTableSearchResultsDTO(BlackboardArtifact.Type artifactType, List<BlackboardAttribute.Type> attributeKeys, List<DataArtifactTableDTO> items, int totalResultsCount) {
this.artifactType = artifactType; this.artifactType = artifactType;
this.attributeTypes = attributeKeys; this.attributeTypes = attributeKeys;
this.rows = rows; this.items = items;
this.totalResultsCount = totalResultsCount;
} }
public BlackboardArtifact.Type getArtifactType() { public BlackboardArtifact.Type getArtifactType() {
@ -370,9 +409,17 @@ public class ThreePanelDAO {
return attributeTypes; return attributeTypes;
} }
public List<DataArtifactRow> getRows() { @Override
return rows; public List<DataArtifactTableDTO> getItems() {
return items;
} }
@Override
public int getTotalResultsCount() {
return totalResultsCount;
}
} }
public enum FilesType { public enum FilesType {

View File

@ -0,0 +1,154 @@
///*
// * Autopsy Forensic Browser
// *
// * Copyright 2011-2021 Basis Technology Corp.
// * Contact: carrier <at> sleuthkit <dot> org
// *
// * Licensed under the Apache License, Version 2.0 (the "License");
// * you may not use this file except in compliance with the License.
// * You may obtain a copy of the License at
// *
// * http://www.apache.org/licenses/LICENSE-2.0
// *
// * Unless required by applicable law or agreed to in writing, software
// * distributed under the License is distributed on an "AS IS" BASIS,
// * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// * See the License for the specific language governing permissions and
// * limitations under the License.
// */
//package org.sleuthkit.autopsy.datamodel;
//
//import java.beans.PropertyChangeEvent;
//import java.beans.PropertyChangeListener;
//import java.util.ArrayList;
//import java.util.Arrays;
//import java.util.EnumSet;
//import java.util.List;
//import java.util.Set;
//import java.util.logging.Level;
//import javax.swing.Action;
//import org.openide.nodes.AbstractNode;
//import org.openide.nodes.Sheet;
//import org.openide.util.NbBundle;
//import org.sleuthkit.autopsy.casemodule.Case;
//import org.sleuthkit.autopsy.coreutils.Logger;
//import org.sleuthkit.autopsy.datamodel.BaseChildFactory.NoSuchEventBusException;
//import org.sleuthkit.autopsy.directorytree.ExplorerNodeActionVisitor;
//import org.sleuthkit.autopsy.directorytree.NewWindowViewAction;
//import org.sleuthkit.autopsy.ingest.IngestManager;
//import org.sleuthkit.autopsy.ingest.ModuleContentEvent;
//import org.sleuthkit.datamodel.Content;
//import org.sleuthkit.datamodel.Pool;
//import org.sleuthkit.datamodel.TskCoreException;
//import org.sleuthkit.datamodel.VirtualDirectory;
//import org.sleuthkit.datamodel.Volume;
//import org.sleuthkit.autopsy.directorytree.FileSystemDetailsAction;
//import org.sleuthkit.datamodel.Tag;
//
///**
// * This class is used to represent the "Node" for the volume. Its child is the
// * root directory of a file system
// */
//public class VolumeNodev2 extends AbstractNode {
//
// private static final Logger logger = Logger.getLogger(VolumeNodev2.class.getName());
//
//
// public static class VolumeTableDTO {
// private final long volAddr;
//
// public long getVolAddr() {
// return volAddr;
// }
// }
//
////
//// static String nameForVolume(VolumeTableDTO vol) {
//// return "vol" + Long.toString(vol.getAddr()); //NON-NLS
//// }
//
// /**
// *
// * @param vol underlying Content instance
// */
// public VolumeNodev2(VolumeTableDTO vol) {
// super(vol);
//
// // set name, display name, and icon
// String volName = nameForVolume(vol);
// long end = vol.getStart() + (vol.getLength() - 1);
// String tempVolName = volName + " (" + vol.getDescription() + ": " + vol.getStart() + "-" + end + ")";
//
// // If this is a pool volume use a custom display name
// try {
// if (vol.getParent() != null
// && vol.getParent().getParent() instanceof Pool) {
// // Pool volumes are not contiguous so printing a range of blocks is inaccurate
// tempVolName = volName + " (" + vol.getDescription() + ": " + vol.getStart() + ")";
// }
// } catch (TskCoreException ex) {
// logger.log(Level.WARNING, "Error looking up parent(s) of volume with obj ID = " + vol.getId(), ex);
// }
// this.setDisplayName(tempVolName);
//
// this.setIconBaseWithExtension("org/sleuthkit/autopsy/images/vol-icon.png"); //NON-NLS
// }
//
//
// /**
// * Right click action for volume node
// *
// * @param popup
// *
// * @return
// */
// @Override
// public Action[] getActions(boolean popup) {
// List<Action> actionsList = new ArrayList<>();
// actionsList.add(new FileSystemDetailsAction(content));
// actionsList.add(new NewWindowViewAction(
// NbBundle.getMessage(this.getClass(), "VolumeNode.getActions.viewInNewWin.text"), this));
// actionsList.addAll(ExplorerNodeActionVisitor.getActions(content));
// actionsList.add(null);
// actionsList.addAll(Arrays.asList(super.getActions(true)));
//
// return actionsList.toArray(new Action[actionsList.size()]);
// }
//
// @Override
// protected Sheet createSheet() {
// Sheet sheet = super.createSheet();
// Sheet.Set sheetSet = sheet.get(Sheet.PROPERTIES);
// if (sheetSet == null) {
// sheetSet = Sheet.createPropertiesSet();
// sheet.put(sheetSet);
// }
//
// sheetSet.put(new NodeProperty<>(NbBundle.getMessage(this.getClass(), "VolumeNode.createSheet.name.name"),
// NbBundle.getMessage(this.getClass(), "VolumeNode.createSheet.name.displayName"),
// NbBundle.getMessage(this.getClass(), "VolumeNode.createSheet.name.desc"),
// this.getDisplayName()));
// sheetSet.put(new NodeProperty<>(NbBundle.getMessage(this.getClass(), "VolumeNode.createSheet.id.name"),
// NbBundle.getMessage(this.getClass(), "VolumeNode.createSheet.id.displayName"),
// NbBundle.getMessage(this.getClass(), "VolumeNode.createSheet.id.desc"),
// content.getAddr()));
// sheetSet.put(new NodeProperty<>(NbBundle.getMessage(this.getClass(), "VolumeNode.createSheet.startSector.name"),
// NbBundle.getMessage(this.getClass(), "VolumeNode.createSheet.startSector.displayName"),
// NbBundle.getMessage(this.getClass(), "VolumeNode.createSheet.startSector.desc"),
// content.getStart()));
// sheetSet.put(new NodeProperty<>(NbBundle.getMessage(this.getClass(), "VolumeNode.createSheet.lenSectors.name"),
// NbBundle.getMessage(this.getClass(), "VolumeNode.createSheet.lenSectors.displayName"),
// NbBundle.getMessage(this.getClass(), "VolumeNode.createSheet.lenSectors.desc"),
// content.getLength()));
// sheetSet.put(new NodeProperty<>(NbBundle.getMessage(this.getClass(), "VolumeNode.createSheet.description.name"),
// NbBundle.getMessage(this.getClass(), "VolumeNode.createSheet.description.displayName"),
// NbBundle.getMessage(this.getClass(), "VolumeNode.createSheet.description.desc"),
// content.getDescription()));
// sheetSet.put(new NodeProperty<>(NbBundle.getMessage(this.getClass(), "VolumeNode.createSheet.flags.name"),
// NbBundle.getMessage(this.getClass(), "VolumeNode.createSheet.flags.displayName"),
// NbBundle.getMessage(this.getClass(), "VolumeNode.createSheet.flags.desc"),
// content.getFlagsAsString()));
//
// return sheet;
// }
//}