diff --git a/Core/src/org/sleuthkit/autopsy/discovery/AbstractDiscoveryFilterPanel.java b/Core/src/org/sleuthkit/autopsy/discovery/AbstractDiscoveryFilterPanel.java index 24d8a8e946..36e0318a75 100644 --- a/Core/src/org/sleuthkit/autopsy/discovery/AbstractDiscoveryFilterPanel.java +++ b/Core/src/org/sleuthkit/autopsy/discovery/AbstractDiscoveryFilterPanel.java @@ -90,12 +90,12 @@ abstract class AbstractDiscoveryFilterPanel extends javax.swing.JPanel { } /** - * Get the FileFilter which is represented by this Panel. + * Get the AbstractFilter which is represented by this Panel. * - * @return The FileFilter for the selected settings, null if the settings + * @return The AbstractFilter for the selected settings, null if the settings * are not in use. */ - abstract FileSearchFiltering.FileFilter getFilter(); + abstract AbstractFilter getFilter(); /** * Remove listeners from the checkbox and the list if they exist. diff --git a/Core/src/org/sleuthkit/autopsy/discovery/AbstractFilter.java b/Core/src/org/sleuthkit/autopsy/discovery/AbstractFilter.java new file mode 100644 index 0000000000..39826ca36a --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/discovery/AbstractFilter.java @@ -0,0 +1,62 @@ +/* + * 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.discovery; + +import java.util.ArrayList; +import java.util.List; +import org.sleuthkit.autopsy.centralrepository.datamodel.CentralRepository; +import org.sleuthkit.datamodel.SleuthkitCase; + +/** + * Base class for the filters. + */ +abstract class AbstractFilter { + + /** + * Returns part of a query on the tsk_files table that can be AND-ed with + * other pieces + * + * @return the SQL query or an empty string if there is no SQL query for + * this filter. + */ + abstract String getWhereClause(); + + /** + * Indicates whether this filter needs to use the secondary, non-SQL method + * applyAlternateFilter(). + * + * @return false by default + */ + boolean useAlternateFilter() { + return false; + } + + /** + * Run a secondary filter that does not operate on tsk_files. + * + * @param currentResults The current list of matching files; empty if no + * filters have yet been run. + * @param caseDb The case database + * @param centralRepoDb The central repo database. Can be null if the + * filter does not require it. + * + * @return The list of files that match this filter (and any that came + * before it) + * + * @throws FileSearchException + */ + List applyAlternateFilter(List currentResults, SleuthkitCase caseDb, + CentralRepository centralRepoDb) throws FileSearchException { + return new ArrayList<>(); + } + + /** + * Get a description of the selected filter. + * + * @return A description of the filter + */ + abstract String getDesc(); +} diff --git a/Core/src/org/sleuthkit/autopsy/discovery/AbstractFiltersPanel.java b/Core/src/org/sleuthkit/autopsy/discovery/AbstractFiltersPanel.java index 2f718c3aa5..e36963feac 100644 --- a/Core/src/org/sleuthkit/autopsy/discovery/AbstractFiltersPanel.java +++ b/Core/src/org/sleuthkit/autopsy/discovery/AbstractFiltersPanel.java @@ -61,6 +61,8 @@ abstract class AbstractFiltersPanel extends JPanel implements ActionListener, Li secondColumnPanel.setLayout(new GridBagLayout()); } + abstract SearchData.ResultType getResultType(); + /** * Get the type of results this filters panel is for. * @@ -242,12 +244,18 @@ abstract class AbstractFiltersPanel extends JPanel implements ActionListener, Li * * @return The list of filters selected by the user. */ - synchronized List getFilters() { - List filtersToUse = new ArrayList<>(); - filtersToUse.add(new FileSearchFiltering.FileTypeFilter(getFileType())); + synchronized List getFilters() { + + List filtersToUse = new ArrayList<>(); + if (getResultType().equals(SearchData.ResultType.FILE)) { + filtersToUse.add(new SearchFiltering.FileTypeFilter(getFileType())); + } else if (getResultType().equals(SearchData.ResultType.ARTIFACT)){ + + } + for (AbstractDiscoveryFilterPanel filterPanel : filters) { if (filterPanel.getCheckbox().isSelected()) { - FileSearchFiltering.FileFilter filter = filterPanel.getFilter(); + AbstractFilter filter = filterPanel.getFilter(); if (filter != null) { filtersToUse.add(filter); } diff --git a/Core/src/org/sleuthkit/autopsy/discovery/ArtifactSearchData.java b/Core/src/org/sleuthkit/autopsy/discovery/ArtifactSearchData.java new file mode 100644 index 0000000000..a4e84b3242 --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/discovery/ArtifactSearchData.java @@ -0,0 +1,82 @@ +/* + * 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.discovery; + +import org.openide.util.NbBundle; +import org.sleuthkit.datamodel.BlackboardArtifact; + +/** + * Utility enums for searches made for artifacts with Discovery. + */ +public class ArtifactSearchData extends SearchData { + + + @Override + ResultType getResultType(){ + return ResultType.ARTIFACT; + } + + + /** + * Enum representing the file type. We don't simply use + * FileTypeUtils.FileTypeCategory because: - Some file types categories + * overlap - It is convenient to have the "OTHER" option for files that + * don't match the given types + */ + @NbBundle.Messages({ + "ArtifactSearchData.ArtifactType.Domain.displayName=Domain", + "ArtifactSearchData.ArtifactType.Other.displayName=Other"}) + enum ArtifactType { + + DOMAIN(0, Bundle.ArtifactSearchData_ArtifactType_Domain_displayName(), BlackboardArtifact.ARTIFACT_TYPE.TSK_WEB_BOOKMARK), + OTHER(1, Bundle.ArtifactSearchData_ArtifactType_Other_displayName(), null); + + private final int ranking; // For ordering in the UI + private final String displayName; + private final BlackboardArtifact.ARTIFACT_TYPE artifactType; + + ArtifactType(int value, String displayName, BlackboardArtifact.ARTIFACT_TYPE type) { + this.ranking = value; + this.displayName = displayName; + this.artifactType = type; + } + + /** + * Get the MIME types matching this category. + * + * @return Collection of MIME type strings + */ + BlackboardArtifact.ARTIFACT_TYPE getMediaTypes() { + return artifactType; + } + + @Override + public String toString() { + return displayName; + } + + /** + * Get the rank for sorting. + * + * @return the rank (lower should be displayed first) + */ + int getRanking() { + return ranking; + } + + + static ArtifactType fromBlackboardArtifact(final BlackboardArtifact.ARTIFACT_TYPE type) { + switch (type) { + case TSK_WEB_BOOKMARK: + return DOMAIN; + default: + return OTHER; + } + } + + } + +} diff --git a/Core/src/org/sleuthkit/autopsy/discovery/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/discovery/Bundle.properties-MERGED index a964a1826e..74512110fe 100644 --- a/Core/src/org/sleuthkit/autopsy/discovery/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/discovery/Bundle.properties-MERGED @@ -1,3 +1,5 @@ +ArtifactSearchData.ArtifactType.Domain.displayName=Domain +ArtifactSearchData.ArtifactType.Other.displayName=Other CTL_OpenDiscoveryAction=Discovery # {0} - dataSourceName DataSourceModuleWrapper.exifModule.text=Exif Parser module was not run on data source: {0}\n diff --git a/Core/src/org/sleuthkit/autopsy/discovery/DataSourceFilterPanel.java b/Core/src/org/sleuthkit/autopsy/discovery/DataSourceFilterPanel.java index a2a2cf4de9..7ecd859e52 100644 --- a/Core/src/org/sleuthkit/autopsy/discovery/DataSourceFilterPanel.java +++ b/Core/src/org/sleuthkit/autopsy/discovery/DataSourceFilterPanel.java @@ -194,10 +194,10 @@ final class DataSourceFilterPanel extends AbstractDiscoveryFilterPanel { } @Override - FileSearchFiltering.FileFilter getFilter() { + AbstractFilter getFilter() { if (dataSourceCheckbox.isSelected()) { List dataSources = dataSourceList.getSelectedValuesList().stream().map(t -> t.getDataSource()).collect(Collectors.toList()); - return new FileSearchFiltering.DataSourceFilter(dataSources); + return new SearchFiltering.DataSourceFilter(dataSources); } return null; } diff --git a/Core/src/org/sleuthkit/autopsy/discovery/DiscoveryDialog.java b/Core/src/org/sleuthkit/autopsy/discovery/DiscoveryDialog.java index 4a2713ba94..8c080e2b18 100644 --- a/Core/src/org/sleuthkit/autopsy/discovery/DiscoveryDialog.java +++ b/Core/src/org/sleuthkit/autopsy/discovery/DiscoveryDialog.java @@ -503,7 +503,7 @@ final class DiscoveryDialog extends javax.swing.JDialog { tc.open(); } tc.resetTopComponent(); - List filters; + List filters; if (videosButton.isSelected()) { filters = videoFilterPanel.getFilters(); } else if (documentsButton.isSelected()) { diff --git a/Core/src/org/sleuthkit/autopsy/discovery/DiscoveryEventUtils.java b/Core/src/org/sleuthkit/autopsy/discovery/DiscoveryEventUtils.java index ea5fca6676..9fb97bc088 100644 --- a/Core/src/org/sleuthkit/autopsy/discovery/DiscoveryEventUtils.java +++ b/Core/src/org/sleuthkit/autopsy/discovery/DiscoveryEventUtils.java @@ -116,7 +116,7 @@ final class DiscoveryEventUtils { static final class SearchCompleteEvent { private final Map groupMap; - private final List searchFilters; + private final List searchFilters; private final FileSearch.AttributeType groupingAttribute; private final FileGroup.GroupSortingAlgorithm groupSort; private final FileSorter.SortingMethod fileSortMethod; @@ -132,7 +132,7 @@ final class DiscoveryEventUtils { * @param groupSort The sorting algorithm used for groups. * @param fileSortMethod The sorting method used for files. */ - SearchCompleteEvent(Map groupMap, List searchfilters, + SearchCompleteEvent(Map groupMap, List searchfilters, FileSearch.AttributeType groupingAttribute, FileGroup.GroupSortingAlgorithm groupSort, FileSorter.SortingMethod fileSortMethod) { this.groupMap = groupMap; @@ -156,7 +156,7 @@ final class DiscoveryEventUtils { * * @return The search filters which were used by the search. */ - List getFilters() { + List getFilters() { return Collections.unmodifiableList(searchFilters); } @@ -275,7 +275,7 @@ final class DiscoveryEventUtils { private final FileType resultType; private final GroupKey groupKey; private final int groupSize; - private final List searchfilters; + private final List searchfilters; private final FileSearch.AttributeType groupingAttribute; private final FileGroup.GroupSortingAlgorithm groupSort; private final FileSorter.SortingMethod fileSortMethod; @@ -294,7 +294,7 @@ final class DiscoveryEventUtils { * selected. * @param resultType The type of files which exist in the group. */ - GroupSelectedEvent(List searchfilters, + GroupSelectedEvent(List searchfilters, FileSearch.AttributeType groupingAttribute, FileGroup.GroupSortingAlgorithm groupSort, FileSorter.SortingMethod fileSortMethod, GroupKey groupKey, int groupSize, FileType resultType) { this.searchfilters = searchfilters; @@ -358,7 +358,7 @@ final class DiscoveryEventUtils { * * @return The search filters which were used by the search. */ - List getFilters() { + List getFilters() { return Collections.unmodifiableList(searchfilters); } diff --git a/Core/src/org/sleuthkit/autopsy/discovery/DiscoveryTopComponent.java b/Core/src/org/sleuthkit/autopsy/discovery/DiscoveryTopComponent.java index 633bf5c612..caef97f838 100644 --- a/Core/src/org/sleuthkit/autopsy/discovery/DiscoveryTopComponent.java +++ b/Core/src/org/sleuthkit/autopsy/discovery/DiscoveryTopComponent.java @@ -36,7 +36,6 @@ import org.openide.windows.RetainLocation; import org.openide.windows.TopComponent; import org.openide.windows.WindowManager; import org.sleuthkit.autopsy.coreutils.ThreadConfined; -import org.sleuthkit.autopsy.discovery.FileSearchFiltering.FileFilter; /** * Create a dialog for displaying the Discovery results. @@ -299,7 +298,7 @@ public final class DiscoveryTopComponent extends TopComponent { void handleSearchCompleteEvent(DiscoveryEventUtils.SearchCompleteEvent searchCompleteEvent) { newSearchButton.setText(Bundle.DiscoveryTopComponent_newSearch_text()); progressMessageTextArea.setForeground(Color.black); - progressMessageTextArea.setText(Bundle.DiscoveryTopComponent_searchComplete_text(searchCompleteEvent.getFilters().stream().map(FileFilter::getDesc).collect(Collectors.joining("; ")))); + progressMessageTextArea.setText(Bundle.DiscoveryTopComponent_searchComplete_text(searchCompleteEvent.getFilters().stream().map(AbstractFilter::getDesc).collect(Collectors.joining("; ")))); progressMessageTextArea.setCaretPosition(0); } diff --git a/Core/src/org/sleuthkit/autopsy/discovery/DocumentFilterPanel.java b/Core/src/org/sleuthkit/autopsy/discovery/DocumentFilterPanel.java index fcd26fed08..015e14e2ab 100644 --- a/Core/src/org/sleuthkit/autopsy/discovery/DocumentFilterPanel.java +++ b/Core/src/org/sleuthkit/autopsy/discovery/DocumentFilterPanel.java @@ -98,4 +98,9 @@ final class DocumentFilterPanel extends AbstractFiltersPanel { private javax.swing.JSplitPane documentsFiltersSplitPane; // End of variables declaration//GEN-END:variables + @Override + SearchData.ResultType getResultType() { + return SearchData.ResultType.FILE; + } + } diff --git a/Core/src/org/sleuthkit/autopsy/discovery/DomainFilterPanel.form b/Core/src/org/sleuthkit/autopsy/discovery/DomainFilterPanel.form new file mode 100644 index 0000000000..4f9abb50dc --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/discovery/DomainFilterPanel.form @@ -0,0 +1,28 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/Core/src/org/sleuthkit/autopsy/discovery/DomainFilterPanel.java b/Core/src/org/sleuthkit/autopsy/discovery/DomainFilterPanel.java new file mode 100644 index 0000000000..f25324f43f --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/discovery/DomainFilterPanel.java @@ -0,0 +1,58 @@ +/* + * 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.discovery; + +/** + * + * @author wschaefer + */ +public class DomainFilterPanel extends AbstractFiltersPanel { + + private static final long serialVersionUID = 1L; + private static final ArtifactSearchData.ArtifactType ARTIFACT_TYPE = ArtifactSearchData.ArtifactType.DOMAIN; + + /** + * Creates new form DomainFilterPanel + */ + public DomainFilterPanel() { + initComponents(); + } + + /** + * This method is called from within the constructor to initialize the form. + * WARNING: Do NOT modify this code. The content of this method is always + * regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); + this.setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGap(0, 400, Short.MAX_VALUE) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGap(0, 300, Short.MAX_VALUE) + ); + }// //GEN-END:initComponents + + @Override + FileSearchData.FileType getFileType() { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + SearchData.ResultType getResultType() { + return SearchData.ResultType.ARTIFACT; + } + + + // Variables declaration - do not modify//GEN-BEGIN:variables + // End of variables declaration//GEN-END:variables +} diff --git a/Core/src/org/sleuthkit/autopsy/discovery/FileSearch.java b/Core/src/org/sleuthkit/autopsy/discovery/FileSearch.java index 0590351793..a2fad07be3 100644 --- a/Core/src/org/sleuthkit/autopsy/discovery/FileSearch.java +++ b/Core/src/org/sleuthkit/autopsy/discovery/FileSearch.java @@ -122,7 +122,7 @@ class FileSearch { * @throws FileSearchException */ static SearchResults runFileSearchDebug(String userName, - List filters, + List filters, AttributeType groupAttributeType, FileGroup.GroupSortingAlgorithm groupSortingType, FileSorter.SortingMethod fileSortingMethod, @@ -136,7 +136,7 @@ class FileSearch { attributesNeededForGroupingOrSorting.addAll(fileSortingMethod.getRequiredAttributes()); // Run the queries for each filter - List resultFiles = FileSearchFiltering.runQueries(filters, caseDb, centralRepoDb); + List resultFiles = SearchFiltering.runQueries(filters, caseDb, centralRepoDb); // Add the data to resultFiles for any attributes needed for sorting and grouping addAttributes(attributesNeededForGroupingOrSorting, resultFiles, caseDb, centralRepoDb); @@ -174,7 +174,7 @@ class FileSearch { * @throws FileSearchException */ static Map getGroupSizes(String userName, - List filters, + List filters, AttributeType groupAttributeType, FileGroup.GroupSortingAlgorithm groupSortingType, FileSorter.SortingMethod fileSortingMethod, @@ -211,7 +211,7 @@ class FileSearch { * @throws FileSearchException */ static List getFilesInGroup(String userName, - List filters, + List filters, AttributeType groupAttributeType, FileGroup.GroupSortingAlgorithm groupSortingType, FileSorter.SortingMethod fileSortingMethod, @@ -483,7 +483,7 @@ class FileSearch { * @throws FileSearchException */ private static Map> runFileSearch(String userName, - List filters, + List filters, AttributeType groupAttributeType, FileGroup.GroupSortingAlgorithm groupSortingType, FileSorter.SortingMethod fileSortingMethod, @@ -498,7 +498,7 @@ class FileSearch { attributesNeededForGroupingOrSorting.addAll(fileSortingMethod.getRequiredAttributes()); // Run the queries for each filter - List resultFiles = FileSearchFiltering.runQueries(filters, caseDb, centralRepoDb); + List resultFiles = SearchFiltering.runQueries(filters, caseDb, centralRepoDb); // Add the data to resultFiles for any attributes needed for sorting and grouping addAttributes(attributesNeededForGroupingOrSorting, resultFiles, caseDb, centralRepoDb); @@ -2077,13 +2077,13 @@ class FileSearch { * @param groupSortingType The algorithm to sort the groups by. * @param fileSortingMethod The method to sort the files by. */ - SearchKey(String userName, List filters, + SearchKey(String userName, List filters, AttributeType groupAttributeType, FileGroup.GroupSortingAlgorithm groupSortingType, FileSorter.SortingMethod fileSortingMethod) { StringBuilder searchStringBuilder = new StringBuilder(); searchStringBuilder.append(userName); - for (FileSearchFiltering.FileFilter filter : filters) { + for (AbstractFilter filter : filters) { searchStringBuilder.append(filter.toString()); } searchStringBuilder.append(groupAttributeType).append(groupSortingType).append(fileSortingMethod); diff --git a/Core/src/org/sleuthkit/autopsy/discovery/FileSearchData.java b/Core/src/org/sleuthkit/autopsy/discovery/FileSearchData.java index 81bb2ca641..a672930966 100644 --- a/Core/src/org/sleuthkit/autopsy/discovery/FileSearchData.java +++ b/Core/src/org/sleuthkit/autopsy/discovery/FileSearchData.java @@ -28,12 +28,17 @@ import org.openide.util.NbBundle; import org.sleuthkit.autopsy.coreutils.FileTypeUtils; /** - * Utility enums for FileSearch. + * Utility enums for searches made for files with Discovery. */ -final class FileSearchData { +final class FileSearchData extends SearchData { private final static long BYTES_PER_MB = 1000000; + @Override + ResultType getResultType() { + return ResultType.FILE; + } + /** * Enum representing how often the file occurs in the Central Repository. */ @@ -256,8 +261,8 @@ final class FileSearchData { public String toString() { return sizeGroup + displaySize; } - - String getSizeGroup(){ + + String getSizeGroup() { return sizeGroup; } @@ -384,14 +389,6 @@ final class FileSearchData { return OTHER; } - /** - * Get the list of enums that are valid for filtering. - * - * @return enums that can be used to filter - */ - static List getOptionsForFiltering() { - return Arrays.asList(IMAGE, VIDEO); - } } /** diff --git a/Core/src/org/sleuthkit/autopsy/discovery/GroupListPanel.java b/Core/src/org/sleuthkit/autopsy/discovery/GroupListPanel.java index a71876e88d..2fa91c2380 100644 --- a/Core/src/org/sleuthkit/autopsy/discovery/GroupListPanel.java +++ b/Core/src/org/sleuthkit/autopsy/discovery/GroupListPanel.java @@ -39,7 +39,7 @@ final class GroupListPanel extends javax.swing.JPanel { private static final long serialVersionUID = 1L; private FileType resultType = null; private Map groupMap = null; - private List searchfilters; + private List searchfilters; private FileSearch.AttributeType groupingAttribute; private FileGroup.GroupSortingAlgorithm groupSort; private FileSorter.SortingMethod fileSortMethod; diff --git a/Core/src/org/sleuthkit/autopsy/discovery/HashSetFilterPanel.java b/Core/src/org/sleuthkit/autopsy/discovery/HashSetFilterPanel.java index eaad0f06f2..17673cfece 100644 --- a/Core/src/org/sleuthkit/autopsy/discovery/HashSetFilterPanel.java +++ b/Core/src/org/sleuthkit/autopsy/discovery/HashSetFilterPanel.java @@ -161,9 +161,9 @@ final class HashSetFilterPanel extends AbstractDiscoveryFilterPanel { } @Override - FileSearchFiltering.FileFilter getFilter() { + AbstractFilter getFilter() { if (hashSetCheckbox.isSelected()) { - return new FileSearchFiltering.HashSetFilter(hashSetList.getSelectedValuesList()); + return new SearchFiltering.HashSetFilter(hashSetList.getSelectedValuesList()); } return null; } diff --git a/Core/src/org/sleuthkit/autopsy/discovery/ImageFilterPanel.java b/Core/src/org/sleuthkit/autopsy/discovery/ImageFilterPanel.java index dfe8a9de31..fc22e7af8f 100644 --- a/Core/src/org/sleuthkit/autopsy/discovery/ImageFilterPanel.java +++ b/Core/src/org/sleuthkit/autopsy/discovery/ImageFilterPanel.java @@ -103,4 +103,9 @@ final class ImageFilterPanel extends AbstractFiltersPanel { // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JSplitPane imageFiltersSplitPane; // End of variables declaration//GEN-END:variables + + @Override + SearchData.ResultType getResultType() { + return SearchData.ResultType.FILE; + } } diff --git a/Core/src/org/sleuthkit/autopsy/discovery/InterestingItemsFilterPanel.java b/Core/src/org/sleuthkit/autopsy/discovery/InterestingItemsFilterPanel.java index a073d6b928..1eea4a020b 100644 --- a/Core/src/org/sleuthkit/autopsy/discovery/InterestingItemsFilterPanel.java +++ b/Core/src/org/sleuthkit/autopsy/discovery/InterestingItemsFilterPanel.java @@ -163,9 +163,9 @@ final class InterestingItemsFilterPanel extends AbstractDiscoveryFilterPanel { } @Override - FileSearchFiltering.FileFilter getFilter() { + AbstractFilter getFilter() { if (interestingItemsCheckbox.isSelected()) { - return new FileSearchFiltering.InterestingFileSetFilter(interestingItemsList.getSelectedValuesList()); + return new SearchFiltering.InterestingFileSetFilter(interestingItemsList.getSelectedValuesList()); } return null; } diff --git a/Core/src/org/sleuthkit/autopsy/discovery/ObjectDetectedFilterPanel.java b/Core/src/org/sleuthkit/autopsy/discovery/ObjectDetectedFilterPanel.java index 335ca8af43..a87c826f33 100644 --- a/Core/src/org/sleuthkit/autopsy/discovery/ObjectDetectedFilterPanel.java +++ b/Core/src/org/sleuthkit/autopsy/discovery/ObjectDetectedFilterPanel.java @@ -167,9 +167,9 @@ final class ObjectDetectedFilterPanel extends AbstractDiscoveryFilterPanel { } @Override - FileSearchFiltering.FileFilter getFilter() { + AbstractFilter getFilter() { if (objectsCheckbox.isSelected()) { - return new FileSearchFiltering.ObjectDetectionFilter(objectsList.getSelectedValuesList()); + return new SearchFiltering.ObjectDetectionFilter(objectsList.getSelectedValuesList()); } return null; } diff --git a/Core/src/org/sleuthkit/autopsy/discovery/PageWorker.java b/Core/src/org/sleuthkit/autopsy/discovery/PageWorker.java index 6eda6c6c3a..52418bef11 100644 --- a/Core/src/org/sleuthkit/autopsy/discovery/PageWorker.java +++ b/Core/src/org/sleuthkit/autopsy/discovery/PageWorker.java @@ -34,7 +34,7 @@ final class PageWorker extends SwingWorker { private final static Logger logger = Logger.getLogger(PageWorker.class.getName()); private static final String USER_NAME_PROPERTY = "user.name"; //NON-NLS - private final List searchfilters; + private final List searchfilters; private final FileSearch.AttributeType groupingAttribute; private final FileGroup.GroupSortingAlgorithm groupSort; private final FileSorter.SortingMethod fileSortMethod; @@ -61,7 +61,7 @@ final class PageWorker extends SwingWorker { * @param resultType The type of files which exist in the group. * @param centralRepo The central repository to be used. */ - PageWorker(List searchfilters, FileSearch.AttributeType groupingAttribute, + PageWorker(List searchfilters, FileSearch.AttributeType groupingAttribute, FileGroup.GroupSortingAlgorithm groupSort, FileSorter.SortingMethod fileSortMethod, GroupKey groupKey, int startingEntry, int pageSize, FileSearchData.FileType resultType, CentralRepository centralRepo) { this.searchfilters = searchfilters; diff --git a/Core/src/org/sleuthkit/autopsy/discovery/ParentFolderFilterPanel.java b/Core/src/org/sleuthkit/autopsy/discovery/ParentFolderFilterPanel.java index 7f10b38692..3df211b2d0 100644 --- a/Core/src/org/sleuthkit/autopsy/discovery/ParentFolderFilterPanel.java +++ b/Core/src/org/sleuthkit/autopsy/discovery/ParentFolderFilterPanel.java @@ -24,7 +24,7 @@ import javax.swing.DefaultListModel; import javax.swing.JCheckBox; import javax.swing.JLabel; import javax.swing.JList; -import org.sleuthkit.autopsy.discovery.FileSearchFiltering.ParentSearchTerm; +import org.sleuthkit.autopsy.discovery.SearchFiltering.ParentSearchTerm; /** * Panel to allow configuration of the Parent Folder filter. @@ -32,7 +32,7 @@ import org.sleuthkit.autopsy.discovery.FileSearchFiltering.ParentSearchTerm; final class ParentFolderFilterPanel extends AbstractDiscoveryFilterPanel { private static final long serialVersionUID = 1L; - private DefaultListModel parentListModel; + private DefaultListModel parentListModel; private static final String[] DEFAULT_IGNORED_PATHS = {"/Windows/", "/Program Files/"}; //NON-NLS /** @@ -49,7 +49,7 @@ final class ParentFolderFilterPanel extends AbstractDiscoveryFilterPanel { private void setUpParentPathFilter() { fullRadioButton.setSelected(true); includeRadioButton.setSelected(true); - parentListModel = (DefaultListModel) parentList.getModel(); + parentListModel = (DefaultListModel) parentList.getModel(); for (String ignorePath : DEFAULT_IGNORED_PATHS) { parentListModel.add(parentListModel.size(), new ParentSearchTerm(ignorePath, false, false)); } @@ -291,8 +291,8 @@ final class ParentFolderFilterPanel extends AbstractDiscoveryFilterPanel { * * @return The list of entered ParentSearchTerm objects */ - private List getParentPaths() { - List results = new ArrayList<>(); + private List getParentPaths() { + List results = new ArrayList<>(); for (int i = 0; i < parentListModel.getSize(); i++) { results.add(parentListModel.get(i)); } @@ -305,9 +305,9 @@ final class ParentFolderFilterPanel extends AbstractDiscoveryFilterPanel { } @Override - FileSearchFiltering.FileFilter getFilter() { + AbstractFilter getFilter() { if (parentCheckbox.isSelected()) { - return new FileSearchFiltering.ParentFilter(getParentPaths()); + return new SearchFiltering.ParentFilter(getParentPaths()); } return null; } diff --git a/Core/src/org/sleuthkit/autopsy/discovery/PastOccurrencesFilterPanel.java b/Core/src/org/sleuthkit/autopsy/discovery/PastOccurrencesFilterPanel.java index f80bfbfad5..a6d3d2b841 100644 --- a/Core/src/org/sleuthkit/autopsy/discovery/PastOccurrencesFilterPanel.java +++ b/Core/src/org/sleuthkit/autopsy/discovery/PastOccurrencesFilterPanel.java @@ -154,9 +154,9 @@ final class PastOccurrencesFilterPanel extends AbstractDiscoveryFilterPanel { } @Override - FileSearchFiltering.FileFilter getFilter() { + AbstractFilter getFilter() { if (pastOccurrencesCheckbox.isSelected()) { - return new FileSearchFiltering.FrequencyFilter(crFrequencyList.getSelectedValuesList()); + return new SearchFiltering.FrequencyFilter(crFrequencyList.getSelectedValuesList()); } return null; } diff --git a/Core/src/org/sleuthkit/autopsy/discovery/ResultsPanel.java b/Core/src/org/sleuthkit/autopsy/discovery/ResultsPanel.java index fc86f7a963..eb844a7a73 100644 --- a/Core/src/org/sleuthkit/autopsy/discovery/ResultsPanel.java +++ b/Core/src/org/sleuthkit/autopsy/discovery/ResultsPanel.java @@ -51,7 +51,7 @@ final class ResultsPanel extends javax.swing.JPanel { private final VideoThumbnailViewer videoThumbnailViewer; private final ImageThumbnailViewer imageThumbnailViewer; private final DocumentPreviewViewer documentPreviewViewer; - private List searchFilters; + private List searchFilters; private FileSearch.AttributeType groupingAttribute; private FileGroup.GroupSortingAlgorithm groupSort; private FileSorter.SortingMethod fileSortMethod; diff --git a/Core/src/org/sleuthkit/autopsy/discovery/SearchData.java b/Core/src/org/sleuthkit/autopsy/discovery/SearchData.java new file mode 100644 index 0000000000..c6700c5a16 --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/discovery/SearchData.java @@ -0,0 +1,19 @@ +/* + * 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.discovery; + + +abstract class SearchData { + + enum ResultType { + FILE, + ARTIFACT; + } + + abstract ResultType getResultType(); + + +} diff --git a/Core/src/org/sleuthkit/autopsy/discovery/FileSearchFiltering.java b/Core/src/org/sleuthkit/autopsy/discovery/SearchFiltering.java similarity index 91% rename from Core/src/org/sleuthkit/autopsy/discovery/FileSearchFiltering.java rename to Core/src/org/sleuthkit/autopsy/discovery/SearchFiltering.java index adf301537a..a21b11fd1e 100644 --- a/Core/src/org/sleuthkit/autopsy/discovery/FileSearchFiltering.java +++ b/Core/src/org/sleuthkit/autopsy/discovery/SearchFiltering.java @@ -42,7 +42,7 @@ import org.sleuthkit.autopsy.centralrepository.datamodel.CentralRepository; /** * Run various filters to return a subset of files from the current case. */ -class FileSearchFiltering { +class SearchFiltering { /** * Run the given filters to get a list of matching files. @@ -54,13 +54,13 @@ class FileSearchFiltering { * * @return */ - static List runQueries(List filters, SleuthkitCase caseDb, CentralRepository centralRepoDb) throws FileSearchException { + static List runQueries(List filters, SleuthkitCase caseDb, CentralRepository centralRepoDb) throws FileSearchException { if (caseDb == null) { throw new FileSearchException("Case DB parameter is null"); // NON-NLS } // Combine all the SQL queries from the filters into one query String combinedQuery = ""; - for (FileFilter filter : filters) { + for (AbstractFilter filter : filters) { if (!filter.getWhereClause().isEmpty()) { if (!combinedQuery.isEmpty()) { combinedQuery += " AND "; // NON-NLS @@ -94,7 +94,7 @@ class FileSearchFiltering { * @throws TskCoreException * @throws FileSearchException */ - private static List getResultList(List filters, String combinedQuery, SleuthkitCase caseDb, CentralRepository centralRepoDb) throws TskCoreException, FileSearchException { + private static List getResultList(List filters, String combinedQuery, SleuthkitCase caseDb, CentralRepository centralRepoDb) throws TskCoreException, FileSearchException { // Get all matching abstract files List resultList = new ArrayList<>(); List sqlResults = caseDb.findAllFilesWhere(combinedQuery); @@ -110,7 +110,7 @@ class FileSearchFiltering { } // Now run any non-SQL filters. - for (FileFilter filter : filters) { + for (AbstractFilter filter : filters) { if (filter.useAlternateFilter()) { resultList = filter.applyAlternateFilter(resultList, caseDb, centralRepoDb); } @@ -122,61 +122,10 @@ class FileSearchFiltering { return resultList; } - /** - * Base class for the filters. - */ - static abstract class FileFilter { - - /** - * Returns part of a query on the tsk_files table that can be AND-ed - * with other pieces - * - * @return the SQL query or an empty string if there is no SQL query for - * this filter. - */ - abstract String getWhereClause(); - - /** - * Indicates whether this filter needs to use the secondary, non-SQL - * method applyAlternateFilter(). - * - * @return false by default - */ - boolean useAlternateFilter() { - return false; - } - - /** - * Run a secondary filter that does not operate on tsk_files. - * - * @param currentResults The current list of matching files; empty if no - * filters have yet been run. - * @param caseDb The case database - * @param centralRepoDb The central repo database. Can be null if the - * filter does not require it. - * - * @return The list of files that match this filter (and any that came - * before it) - * - * @throws FileSearchException - */ - List applyAlternateFilter(List currentResults, SleuthkitCase caseDb, - CentralRepository centralRepoDb) throws FileSearchException { - return new ArrayList<>(); - } - - /** - * Get a description of the selected filter. - * - * @return A description of the filter - */ - abstract String getDesc(); - } - /** * A filter for specifying the file size */ - static class SizeFilter extends FileFilter { + static class SizeFilter extends AbstractFilter { private final List fileSizes; @@ -316,7 +265,7 @@ class FileSearchFiltering { /** * A filter for specifying parent path (either full path or substring) */ - static class ParentFilter extends FileFilter { + static class ParentFilter extends AbstractFilter { private final List parentSearchTerms; @@ -393,7 +342,7 @@ class FileSearchFiltering { /** * A filter for specifying data sources */ - static class DataSourceFilter extends FileFilter { + static class DataSourceFilter extends AbstractFilter { private final List dataSources; @@ -444,7 +393,7 @@ class FileSearchFiltering { * A filter for specifying keyword list names. A file must contain a keyword * from one of the given lists to pass. */ - static class KeywordListFilter extends FileFilter { + static class KeywordListFilter extends AbstractFilter { private final List listNames; @@ -480,7 +429,7 @@ class FileSearchFiltering { /** * A filter for specifying file types. */ - static class FileTypeFilter extends FileFilter { + static class FileTypeFilter extends AbstractFilter { private final List categories; @@ -539,7 +488,7 @@ class FileSearchFiltering { /** * A filter for specifying frequency in the central repository. */ - static class FrequencyFilter extends FileFilter { + static class FrequencyFilter extends AbstractFilter { private final List frequencies; @@ -609,7 +558,7 @@ class FileSearchFiltering { * A filter for specifying hash set names. A file must match one of the * given sets to pass. */ - static class HashSetFilter extends FileFilter { + static class HashSetFilter extends AbstractFilter { private final List setNames; @@ -647,7 +596,7 @@ class FileSearchFiltering { * A filter for specifying interesting file set names. A file must match one * of the given sets to pass. */ - static class InterestingFileSetFilter extends FileFilter { + static class InterestingFileSetFilter extends AbstractFilter { private final List setNames; @@ -685,7 +634,7 @@ class FileSearchFiltering { * A filter for specifying object types detected. A file must match one of * the given types to pass. */ - static class ObjectDetectionFilter extends FileFilter { + static class ObjectDetectionFilter extends AbstractFilter { private final List typeNames; @@ -723,7 +672,7 @@ class FileSearchFiltering { * A filter for specifying the score. A file must have one of the given * scores to pass */ - static class ScoreFilter extends FileFilter { + static class ScoreFilter extends AbstractFilter { private final List scores; @@ -800,7 +749,7 @@ class FileSearchFiltering { * A filter for specifying tag names. A file must contain one of the given * tags to pass. */ - static class TagsFilter extends FileFilter { + static class TagsFilter extends AbstractFilter { private final List tagNames; @@ -849,7 +798,7 @@ class FileSearchFiltering { * A filter for specifying that the file must have user content suspected * data. */ - static class UserCreatedFilter extends FileFilter { + static class UserCreatedFilter extends AbstractFilter { /** * Create the ExifFilter @@ -877,7 +826,7 @@ class FileSearchFiltering { * A filter for specifying that the file must have been marked as notable in * the CR. */ - static class NotableFilter extends FileFilter { + static class NotableFilter extends AbstractFilter { /** * Create the NotableFilter @@ -945,7 +894,7 @@ class FileSearchFiltering { /** * A filter for specifying if known files should be included. */ - static class KnownFilter extends FileFilter { + static class KnownFilter extends AbstractFilter { @Override String getWhereClause() { @@ -992,7 +941,7 @@ class FileSearchFiltering { return result; } - private FileSearchFiltering() { + private SearchFiltering(){ // Class should not be instantiated } } diff --git a/Core/src/org/sleuthkit/autopsy/discovery/SearchWorker.java b/Core/src/org/sleuthkit/autopsy/discovery/SearchWorker.java index 1a513afda1..c1877109b5 100644 --- a/Core/src/org/sleuthkit/autopsy/discovery/SearchWorker.java +++ b/Core/src/org/sleuthkit/autopsy/discovery/SearchWorker.java @@ -35,7 +35,7 @@ final class SearchWorker extends SwingWorker { private final static Logger logger = Logger.getLogger(SearchWorker.class.getName()); private static final String USER_NAME_PROPERTY = "user.name"; //NON-NLS - private final List filters; + private final List filters; private final FileSearch.AttributeType groupingAttr; private final FileSorter.SortingMethod fileSort; private final FileGroup.GroupSortingAlgorithm groupSortAlgorithm; @@ -52,7 +52,7 @@ final class SearchWorker extends SwingWorker { * @param groupSort The Algorithm to sort groups by. * @param fileSortMethod The SortingMethod to use for files. */ - SearchWorker(CentralRepository centralRepo, List searchfilters, FileSearch.AttributeType groupingAttribute, FileGroup.GroupSortingAlgorithm groupSort, FileSorter.SortingMethod fileSortMethod) { + SearchWorker(CentralRepository centralRepo, List searchfilters, FileSearch.AttributeType groupingAttribute, FileGroup.GroupSortingAlgorithm groupSort, FileSorter.SortingMethod fileSortMethod) { centralRepoDb = centralRepo; filters = searchfilters; groupingAttr = groupingAttribute; diff --git a/Core/src/org/sleuthkit/autopsy/discovery/SizeFilterPanel.java b/Core/src/org/sleuthkit/autopsy/discovery/SizeFilterPanel.java index 1e78b9a079..c6f0478f38 100644 --- a/Core/src/org/sleuthkit/autopsy/discovery/SizeFilterPanel.java +++ b/Core/src/org/sleuthkit/autopsy/discovery/SizeFilterPanel.java @@ -178,9 +178,9 @@ final class SizeFilterPanel extends AbstractDiscoveryFilterPanel { } @Override - FileSearchFiltering.FileFilter getFilter() { + AbstractFilter getFilter() { if (sizeCheckbox.isSelected()) { - return new FileSearchFiltering.SizeFilter(sizeList.getSelectedValuesList()); + return new SearchFiltering.SizeFilter(sizeList.getSelectedValuesList()); } return null; } diff --git a/Core/src/org/sleuthkit/autopsy/discovery/UserCreatedFilterPanel.java b/Core/src/org/sleuthkit/autopsy/discovery/UserCreatedFilterPanel.java index 6c0ca9d67a..8f6be8b12b 100644 --- a/Core/src/org/sleuthkit/autopsy/discovery/UserCreatedFilterPanel.java +++ b/Core/src/org/sleuthkit/autopsy/discovery/UserCreatedFilterPanel.java @@ -98,9 +98,9 @@ final class UserCreatedFilterPanel extends AbstractDiscoveryFilterPanel { } @Override - FileSearchFiltering.FileFilter getFilter() { + AbstractFilter getFilter() { if (userCreatedCheckbox.isSelected()) { - return new FileSearchFiltering.UserCreatedFilter(); + return new SearchFiltering.UserCreatedFilter(); } return null; } diff --git a/Core/src/org/sleuthkit/autopsy/discovery/VideoFilterPanel.java b/Core/src/org/sleuthkit/autopsy/discovery/VideoFilterPanel.java index 97cd8e818d..3cb69f0ff4 100644 --- a/Core/src/org/sleuthkit/autopsy/discovery/VideoFilterPanel.java +++ b/Core/src/org/sleuthkit/autopsy/discovery/VideoFilterPanel.java @@ -105,4 +105,9 @@ final class VideoFilterPanel extends AbstractFiltersPanel { private javax.swing.JSplitPane videoFiltersSplitPane; // End of variables declaration//GEN-END:variables + @Override + SearchData.ResultType getResultType() { + return SearchData.ResultType.FILE; + } + }