mirror of
https://github.com/overcuriousity/autopsy-flatpak.git
synced 2025-07-20 03:24:55 +00:00
Adding UI
This commit is contained in:
parent
be4b528ebe
commit
9f437f8634
19
Core/src/org/sleuthkit/autopsy/newpackage/Bundle.properties
Normal file
19
Core/src/org/sleuthkit/autopsy/newpackage/Bundle.properties
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
FileSearchDialog.jLabel1.text=File Type
|
||||||
|
FileSearchDialog.dsCheckBox.text=Data source
|
||||||
|
FileSearchDialog.cancelButton.text=Cancel
|
||||||
|
FileSearchDialog.freqCheckBox.text=CR Frequency
|
||||||
|
FileSearchDialog.sizeCheckBox.text=Size
|
||||||
|
FileSearchDialog.kwCheckBox.text=Keyword
|
||||||
|
FileSearchDialog.addParentButton.text=Add
|
||||||
|
FileSearchDialog.deleteParentButton.text=Delete
|
||||||
|
FileSearchDialog.parentFullRadioButton.text=Full
|
||||||
|
FileSearchDialog.parentSubstringRadioButton.text=Substring
|
||||||
|
FileSearchDialog.parentTextField.text=
|
||||||
|
FileSearchDialog.jLabel2.text=(All will be used)
|
||||||
|
FileSearchDialog.jLabel3.text=Group by attribute:
|
||||||
|
FileSearchDialog.jLabel4.text=Order groups by:
|
||||||
|
FileSearchDialog.orderAttrRadioButton.text=Attribute
|
||||||
|
FileSearchDialog.orderSizeRadioButton.text=Group Size
|
||||||
|
FileSearchDialog.jLabel5.text=Order files by:
|
||||||
|
FileSearchDialog.parentCheckBox.text=Parent
|
||||||
|
FileSearchDialog.searchButton.text=Search
|
@ -4,6 +4,13 @@ CTL_FileSearchTestAction=Test file search
|
|||||||
FileSearch.DataSourceGroupKey.datasourceAndID={0}(ID: {1})
|
FileSearch.DataSourceGroupKey.datasourceAndID={0}(ID: {1})
|
||||||
# {0} - Data source ID
|
# {0} - Data source ID
|
||||||
FileSearch.DataSourceGroupKey.idOnly=Data source (ID: {0})
|
FileSearch.DataSourceGroupKey.idOnly=Data source (ID: {0})
|
||||||
|
FileSearch.GroupingAttributeType.datasource.displayName=Data source
|
||||||
|
FileSearch.GroupingAttributeType.fileType.displayName=File type
|
||||||
|
FileSearch.GroupingAttributeType.frequency.displayName=Past occurrences
|
||||||
|
FileSearch.GroupingAttributeType.keywordList.displayName=Keyword list names
|
||||||
|
FileSearch.GroupingAttributeType.none.displayName=None
|
||||||
|
FileSearch.GroupingAttributeType.parent.displayName=Parent folder
|
||||||
|
FileSearch.GroupingAttributeType.size.displayName=Size
|
||||||
FileSearch.KeywordListGroupKey.noKeywords=None
|
FileSearch.KeywordListGroupKey.noKeywords=None
|
||||||
FileSearch.NoGroupingGroupKey.allFiles=All Files
|
FileSearch.NoGroupingGroupKey.allFiles=All Files
|
||||||
FileSearchData.FileSize.large.displayName=200MB-1GB
|
FileSearchData.FileSize.large.displayName=200MB-1GB
|
||||||
@ -21,29 +28,58 @@ FileSearchData.Frequency.common.displayName=Common
|
|||||||
FileSearchData.Frequency.rare.displayName=Rare
|
FileSearchData.Frequency.rare.displayName=Rare
|
||||||
FileSearchData.Frequency.unique.displayName=Unique
|
FileSearchData.Frequency.unique.displayName=Unique
|
||||||
FileSearchData.Frequency.unknown.displayName=Unknown
|
FileSearchData.Frequency.unknown.displayName=Unknown
|
||||||
|
FileSearchDialog.jLabel1.text=File Type
|
||||||
|
FileSearchDialog.dsCheckBox.text=Data source
|
||||||
|
FileSearchDialog.cancelButton.text=Cancel
|
||||||
|
FileSearchDialog.freqCheckBox.text=CR Frequency
|
||||||
|
FileSearchDialog.sizeCheckBox.text=Size
|
||||||
|
FileSearchDialog.kwCheckBox.text=Keyword
|
||||||
|
FileSearchDialog.addParentButton.text=Add
|
||||||
|
FileSearchDialog.deleteParentButton.text=Delete
|
||||||
|
FileSearchDialog.parentFullRadioButton.text=Full
|
||||||
|
FileSearchDialog.parentSubstringRadioButton.text=Substring
|
||||||
|
FileSearchDialog.parentTextField.text=
|
||||||
|
FileSearchDialog.jLabel2.text=(All will be used)
|
||||||
|
FileSearchDialog.jLabel3.text=Group by attribute:
|
||||||
|
FileSearchDialog.jLabel4.text=Order groups by:
|
||||||
|
FileSearchDialog.orderAttrRadioButton.text=Attribute
|
||||||
|
FileSearchDialog.orderSizeRadioButton.text=Group Size
|
||||||
|
FileSearchDialog.jLabel5.text=Order files by:
|
||||||
|
FileSearchDialog.parentCheckBox.text=Parent
|
||||||
|
FileSearchDialog.searchButton.text=Search
|
||||||
# {0} - Data source name
|
# {0} - Data source name
|
||||||
# {1} - Data source ID
|
# {1} - Data source ID
|
||||||
FileSearchFiltering.DataSourceSubFilter.datasource={0}({1})
|
FileSearchFiltering.DataSourceFilter.datasource={0}({1})
|
||||||
# {0} - filters
|
# {0} - filters
|
||||||
FileSearchFiltering.DataSourceSubFilter.desc=Files in data source(s): {0}
|
FileSearchFiltering.DataSourceFilter.desc=Files in data source(s): {0}
|
||||||
FileSearchFiltering.DataSourceSubFilter.or=\ or
|
FileSearchFiltering.DataSourceFilter.or=\ or
|
||||||
# {0} - filters
|
# {0} - filters
|
||||||
FileSearchFiltering.FileTypeSubFilter.desc=Files with type: {0}
|
FileSearchFiltering.FileTypeFilter.desc=Files with type: {0}
|
||||||
FileSearchFiltering.FileTypeSubFilter.or=\ or
|
FileSearchFiltering.FileTypeFilter.or=\ or
|
||||||
# {0} - filters
|
# {0} - filters
|
||||||
FileSearchFiltering.FrequencySubFilter.desc=Files with frequency: {0}
|
FileSearchFiltering.FrequencyFilter.desc=Files with frequency: {0}
|
||||||
FileSearchFiltering.FrequencySubFilter.or=\ or
|
FileSearchFiltering.FrequencyFilter.or=\ or
|
||||||
FileSearchFiltering.KeywordListSubFilter.comma=,
|
FileSearchFiltering.KeywordListFilter.comma=,
|
||||||
# {0} - filters
|
# {0} - filters
|
||||||
FileSearchFiltering.KeywordListSubFilter.desc=Files with keywords in list(s): {0}
|
FileSearchFiltering.KeywordListFilter.desc=Files with keywords in list(s): {0}
|
||||||
# {0} - filters
|
# {0} - filters
|
||||||
FileSearchFiltering.ParentSubFilter.desc=Files with paths matching: {0}
|
FileSearchFiltering.ParentFilter.desc=Files with paths matching: {0}
|
||||||
FileSearchFiltering.ParentSubFilter.exact=(exact match)
|
FileSearchFiltering.ParentFilter.exact=(exact match)
|
||||||
FileSearchFiltering.ParentSubFilter.or=\ or
|
FileSearchFiltering.ParentFilter.or=\ or
|
||||||
FileSearchFiltering.ParentSubFilter.substring=(substring)
|
FileSearchFiltering.ParentFilter.substring=(substring)
|
||||||
|
# {0} - search term
|
||||||
|
FileSearchFiltering.ParentSearchTerm.fullString=\ {0} (exact)
|
||||||
|
FileSearchFiltering.ParentSearchTerm.subString=\ {0} (substring)
|
||||||
# {0} - filters
|
# {0} - filters
|
||||||
FileSearchFiltering.SizeSubFilter.desc=Files with size in range(s): {0}
|
FileSearchFiltering.SizeFilter.desc=Files with size in range(s): {0}
|
||||||
FileSearchFiltering.SizeSubFilter.or=\ or
|
FileSearchFiltering.SizeFilter.or=\ or
|
||||||
# {0} - Minimum bytes
|
# {0} - Minimum bytes
|
||||||
# {1} - Maximum bytes
|
# {1} - Maximum bytes
|
||||||
FileSearchFiltering.SizeSubFilter.range=({0} to {1})
|
FileSearchFiltering.SizeFilter.range=({0} to {1})
|
||||||
|
FileSorter.SortingMethod.datasource.displayName=By data source
|
||||||
|
FileSorter.SortingMethod.filename.displayName=By file name
|
||||||
|
FileSorter.SortingMethod.filesize.displayName=By file size
|
||||||
|
FileSorter.SortingMethod.filetype.displayName=By file type
|
||||||
|
FileSorter.SortingMethod.frequency.displayName=By central repo frequency
|
||||||
|
FileSorter.SortingMethod.keywordlist.displayName=By keyword list names
|
||||||
|
FileSorter.SortingMethod.parent.displayName=By parent path
|
||||||
|
@ -108,6 +108,45 @@ class FileSearch {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enum for the attribute types that can be used for grouping.
|
||||||
|
*/
|
||||||
|
@NbBundle.Messages({
|
||||||
|
"FileSearch.GroupingAttributeType.fileType.displayName=File type",
|
||||||
|
"FileSearch.GroupingAttributeType.frequency.displayName=Past occurrences",
|
||||||
|
"FileSearch.GroupingAttributeType.keywordList.displayName=Keyword list names",
|
||||||
|
"FileSearch.GroupingAttributeType.size.displayName=Size",
|
||||||
|
"FileSearch.GroupingAttributeType.datasource.displayName=Data source",
|
||||||
|
"FileSearch.GroupingAttributeType.parent.displayName=Parent folder",
|
||||||
|
"FileSearch.GroupingAttributeType.none.displayName=None",
|
||||||
|
})
|
||||||
|
enum GroupingAttributeType {
|
||||||
|
FILE_TYPE(new FileTypeAttribute(), Bundle.FileSearch_GroupingAttributeType_fileType_displayName()),
|
||||||
|
FREQUENCY(new FrequencyAttribute(), Bundle.FileSearch_GroupingAttributeType_frequency_displayName()),
|
||||||
|
KEYWORD_LIST_NAME(new KeywordListAttribute(), Bundle.FileSearch_GroupingAttributeType_keywordList_displayName()),
|
||||||
|
FILE_SIZE(new FileSizeAttribute(), Bundle.FileSearch_GroupingAttributeType_size_displayName()),
|
||||||
|
DATA_SOURCE(new DataSourceAttribute(), Bundle.FileSearch_GroupingAttributeType_datasource_displayName()),
|
||||||
|
PARENT_PATH(new ParentPathAttribute(), Bundle.FileSearch_GroupingAttributeType_parent_displayName()),
|
||||||
|
NO_GROUPING(new NoGroupingAttribute(), Bundle.FileSearch_GroupingAttributeType_none_displayName());
|
||||||
|
|
||||||
|
private final AttributeType attributeType;
|
||||||
|
private final String displayName;
|
||||||
|
|
||||||
|
GroupingAttributeType(AttributeType attributeType, String displayName) {
|
||||||
|
this.attributeType = attributeType;
|
||||||
|
this.displayName = displayName;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return displayName;
|
||||||
|
}
|
||||||
|
|
||||||
|
AttributeType getAttributeType() {
|
||||||
|
return attributeType;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Base class for the grouping attributes.
|
* Base class for the grouping attributes.
|
||||||
*/
|
*/
|
||||||
@ -403,7 +442,7 @@ class FileSearch {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
String getDisplayName() {
|
String getDisplayName() {
|
||||||
return fileType.getDisplayName();
|
return fileType.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -19,7 +19,9 @@
|
|||||||
package org.sleuthkit.autopsy.newpackage;
|
package org.sleuthkit.autopsy.newpackage;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
import java.util.List;
|
||||||
import org.openide.util.NbBundle;
|
import org.openide.util.NbBundle;
|
||||||
import org.sleuthkit.autopsy.datamodel.utils.FileTypeUtils;
|
import org.sleuthkit.autopsy.datamodel.utils.FileTypeUtils;
|
||||||
|
|
||||||
@ -78,6 +80,15 @@ class FileSearchData {
|
|||||||
return COMMON;
|
return COMMON;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the list of enums that are valid for filtering.
|
||||||
|
*
|
||||||
|
* @return enums that can be used to filter
|
||||||
|
*/
|
||||||
|
static List<Frequency> getOptionsForFiltering() {
|
||||||
|
return Arrays.asList(UNIQUE, RARE, COMMON);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return displayName;
|
return displayName;
|
||||||
@ -207,11 +218,16 @@ class FileSearchData {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the display name for this type
|
* Get the MIME types matching this category.
|
||||||
*
|
*
|
||||||
* @return the display name
|
* @return Collection of MIME type strings
|
||||||
*/
|
*/
|
||||||
String getDisplayName() {
|
Collection<String> getMediaTypes() {
|
||||||
|
return mediaTypes;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
return displayName;
|
return displayName;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -239,6 +255,15 @@ class FileSearchData {
|
|||||||
}
|
}
|
||||||
return OTHER;
|
return OTHER;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the list of enums that are valid for filtering.
|
||||||
|
*
|
||||||
|
* @return enums that can be used to filter
|
||||||
|
*/
|
||||||
|
static List<FileType> getOptionsForFiltering() {
|
||||||
|
return Arrays.asList(IMAGE, AUDIO, VIDEO, EXECUTABLE, DOCUMENTS);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private FileSearchData() {
|
private FileSearchData() {
|
||||||
|
481
Core/src/org/sleuthkit/autopsy/newpackage/FileSearchDialog.form
Normal file
481
Core/src/org/sleuthkit/autopsy/newpackage/FileSearchDialog.form
Normal file
@ -0,0 +1,481 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
|
|
||||||
|
<Form version="1.5" maxVersion="1.9" type="org.netbeans.modules.form.forminfo.JDialogFormInfo">
|
||||||
|
<NonVisualComponents>
|
||||||
|
<Component class="javax.swing.ButtonGroup" name="parentButtonGroup">
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.ButtonGroup" name="orderButtonGroup">
|
||||||
|
</Component>
|
||||||
|
</NonVisualComponents>
|
||||||
|
<Properties>
|
||||||
|
<Property name="defaultCloseOperation" type="int" value="2"/>
|
||||||
|
</Properties>
|
||||||
|
<SyntheticProperties>
|
||||||
|
<SyntheticProperty name="formSizePolicy" type="int" value="1"/>
|
||||||
|
<SyntheticProperty name="generateCenter" type="boolean" value="false"/>
|
||||||
|
</SyntheticProperties>
|
||||||
|
<AuxValues>
|
||||||
|
<AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="1"/>
|
||||||
|
<AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
|
||||||
|
<AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
|
||||||
|
<AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="true"/>
|
||||||
|
<AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="true"/>
|
||||||
|
<AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
|
||||||
|
<AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
|
||||||
|
<AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
|
||||||
|
<AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
|
||||||
|
</AuxValues>
|
||||||
|
|
||||||
|
<Layout>
|
||||||
|
<DimensionLayout dim="0">
|
||||||
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
|
<Group type="102" alignment="0" attributes="0">
|
||||||
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
|
<Group type="102" alignment="1" attributes="0">
|
||||||
|
<EmptySpace min="0" pref="0" max="32767" attributes="0"/>
|
||||||
|
<Component id="searchButton" min="-2" max="-2" attributes="0"/>
|
||||||
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
|
<Component id="cancelButton" min="-2" max="-2" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
<Group type="102" alignment="0" attributes="0">
|
||||||
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
|
<Component id="dsCheckBox" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||||
|
<Component id="jLabel1" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||||
|
<Component id="freqCheckBox" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||||
|
<Component id="sizeCheckBox" min="-2" max="-2" attributes="0"/>
|
||||||
|
<Component id="kwCheckBox" min="-2" max="-2" attributes="0"/>
|
||||||
|
<Component id="parentCheckBox" min="-2" max="-2" attributes="0"/>
|
||||||
|
<Component id="jLabel2" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
<EmptySpace type="separate" max="-2" attributes="0"/>
|
||||||
|
<Group type="103" groupAlignment="1" max="-2" attributes="0">
|
||||||
|
<Group type="102" attributes="0">
|
||||||
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
|
<Component id="parentTextField" max="32767" attributes="0"/>
|
||||||
|
<Group type="102" alignment="0" attributes="0">
|
||||||
|
<Component id="parentFullRadioButton" min="-2" max="-2" attributes="0"/>
|
||||||
|
<EmptySpace type="separate" max="-2" attributes="0"/>
|
||||||
|
<Component id="parentSubstringRadioButton" min="-2" max="-2" attributes="0"/>
|
||||||
|
<EmptySpace min="0" pref="0" max="32767" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
</Group>
|
||||||
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
|
<Group type="103" groupAlignment="0" max="-2" attributes="0">
|
||||||
|
<Component id="deleteParentButton" max="32767" attributes="0"/>
|
||||||
|
<Component id="addParentButton" max="32767" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
</Group>
|
||||||
|
<Component id="jScrollPane3" alignment="0" max="32767" attributes="0"/>
|
||||||
|
<Component id="jScrollPane1" alignment="0" max="32767" attributes="0"/>
|
||||||
|
<Component id="jScrollPane2" alignment="0" max="32767" attributes="0"/>
|
||||||
|
<Component id="jScrollPane4" alignment="0" max="32767" attributes="0"/>
|
||||||
|
<Component id="jScrollPane5" alignment="1" max="32767" attributes="0"/>
|
||||||
|
<Component id="jScrollPane6" alignment="0" max="32767" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
<EmptySpace min="-2" pref="35" max="-2" attributes="0"/>
|
||||||
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
|
<Component id="jLabel3" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||||
|
<Component id="jLabel4" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||||
|
<Component id="jLabel5" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
<EmptySpace type="separate" max="-2" attributes="0"/>
|
||||||
|
<Group type="103" groupAlignment="0" max="-2" attributes="0">
|
||||||
|
<Component id="orderAttrRadioButton" min="-2" max="-2" attributes="0"/>
|
||||||
|
<Component id="groupComboBox" max="32767" attributes="0"/>
|
||||||
|
<Component id="orderSizeRadioButton" min="-2" max="-2" attributes="0"/>
|
||||||
|
<Component id="fileOrderComboBox" alignment="0" pref="144" max="32767" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
<EmptySpace min="0" pref="93" max="32767" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
</Group>
|
||||||
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
</Group>
|
||||||
|
</DimensionLayout>
|
||||||
|
<DimensionLayout dim="1">
|
||||||
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
|
<Group type="102" alignment="0" attributes="0">
|
||||||
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
|
<Component id="jLabel1" min="-2" max="-2" attributes="0"/>
|
||||||
|
<Component id="jScrollPane1" min="-2" pref="82" max="-2" attributes="0"/>
|
||||||
|
<Group type="102" attributes="0">
|
||||||
|
<Group type="103" groupAlignment="3" attributes="0">
|
||||||
|
<Component id="jLabel3" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
|
<Component id="groupComboBox" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
<EmptySpace min="-2" pref="5" max="-2" attributes="0"/>
|
||||||
|
<Group type="103" groupAlignment="3" attributes="0">
|
||||||
|
<Component id="jLabel4" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
|
<Component id="orderAttrRadioButton" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
|
<Component id="orderSizeRadioButton" min="-2" max="-2" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
</Group>
|
||||||
|
<EmptySpace type="unrelated" max="-2" attributes="0"/>
|
||||||
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
|
<Component id="dsCheckBox" min="-2" max="-2" attributes="0"/>
|
||||||
|
<Group type="103" groupAlignment="3" attributes="0">
|
||||||
|
<Component id="jLabel5" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
|
<Component id="fileOrderComboBox" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
<Component id="jScrollPane2" min="-2" pref="56" max="-2" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
<EmptySpace type="unrelated" max="-2" attributes="0"/>
|
||||||
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
|
<Component id="freqCheckBox" min="-2" max="-2" attributes="0"/>
|
||||||
|
<Component id="jScrollPane3" min="-2" pref="54" max="-2" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
<EmptySpace type="unrelated" max="-2" attributes="0"/>
|
||||||
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
|
<Component id="jScrollPane4" min="-2" pref="49" max="-2" attributes="0"/>
|
||||||
|
<Component id="sizeCheckBox" min="-2" max="-2" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
<EmptySpace type="unrelated" max="-2" attributes="0"/>
|
||||||
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
|
<Component id="jScrollPane5" min="-2" pref="49" max="-2" attributes="0"/>
|
||||||
|
<Component id="kwCheckBox" min="-2" max="-2" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
<EmptySpace type="unrelated" max="-2" attributes="0"/>
|
||||||
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
|
<Component id="jScrollPane6" min="-2" pref="49" max="-2" attributes="0"/>
|
||||||
|
<Group type="102" attributes="0">
|
||||||
|
<Component id="parentCheckBox" min="-2" max="-2" attributes="0"/>
|
||||||
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
|
<Component id="jLabel2" min="-2" max="-2" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
</Group>
|
||||||
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
|
<Group type="103" groupAlignment="3" attributes="0">
|
||||||
|
<Component id="deleteParentButton" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
|
<Component id="parentFullRadioButton" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
|
<Component id="parentSubstringRadioButton" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
|
<Group type="103" groupAlignment="3" attributes="0">
|
||||||
|
<Component id="addParentButton" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
|
<Component id="parentTextField" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
<EmptySpace pref="8" max="32767" attributes="0"/>
|
||||||
|
<Group type="103" groupAlignment="3" attributes="0">
|
||||||
|
<Component id="cancelButton" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
|
<Component id="searchButton" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
</Group>
|
||||||
|
</DimensionLayout>
|
||||||
|
</Layout>
|
||||||
|
<SubComponents>
|
||||||
|
<Component class="javax.swing.JLabel" name="jLabel1">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/newpackage/Bundle.properties" key="FileSearchDialog.jLabel1.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JButton" name="cancelButton">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/newpackage/Bundle.properties" key="FileSearchDialog.cancelButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
<Events>
|
||||||
|
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="cancelButtonActionPerformed"/>
|
||||||
|
</Events>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JCheckBox" name="dsCheckBox">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/newpackage/Bundle.properties" key="FileSearchDialog.dsCheckBox.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
<Events>
|
||||||
|
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="dsCheckBoxActionPerformed"/>
|
||||||
|
</Events>
|
||||||
|
</Component>
|
||||||
|
<Container class="javax.swing.JScrollPane" name="jScrollPane1">
|
||||||
|
<AuxValues>
|
||||||
|
<AuxValue name="autoScrollPane" type="java.lang.Boolean" value="true"/>
|
||||||
|
</AuxValues>
|
||||||
|
|
||||||
|
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
|
||||||
|
<SubComponents>
|
||||||
|
<Component class="javax.swing.JList" name="fileTypeList">
|
||||||
|
<Properties>
|
||||||
|
<Property name="model" type="javax.swing.ListModel" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
|
||||||
|
<Connection code="new DefaultListModel<FileType>()" type="code"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
<AuxValues>
|
||||||
|
<AuxValue name="JavaCodeGenerator_TypeParameters" type="java.lang.String" value="<FileSearchData.FileType>"/>
|
||||||
|
</AuxValues>
|
||||||
|
</Component>
|
||||||
|
</SubComponents>
|
||||||
|
</Container>
|
||||||
|
<Container class="javax.swing.JScrollPane" name="jScrollPane2">
|
||||||
|
<AuxValues>
|
||||||
|
<AuxValue name="autoScrollPane" type="java.lang.Boolean" value="true"/>
|
||||||
|
</AuxValues>
|
||||||
|
|
||||||
|
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
|
||||||
|
<SubComponents>
|
||||||
|
<Component class="javax.swing.JList" name="dsList">
|
||||||
|
<Properties>
|
||||||
|
<Property name="model" type="javax.swing.ListModel" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
|
||||||
|
<Connection code="new DefaultListModel<DataSourceItem>()" type="code"/>
|
||||||
|
</Property>
|
||||||
|
<Property name="enabled" type="boolean" value="false"/>
|
||||||
|
</Properties>
|
||||||
|
<AuxValues>
|
||||||
|
<AuxValue name="JavaCodeGenerator_TypeParameters" type="java.lang.String" value="<DataSourceItem>"/>
|
||||||
|
</AuxValues>
|
||||||
|
</Component>
|
||||||
|
</SubComponents>
|
||||||
|
</Container>
|
||||||
|
<Component class="javax.swing.JCheckBox" name="freqCheckBox">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/newpackage/Bundle.properties" key="FileSearchDialog.freqCheckBox.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
<Events>
|
||||||
|
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="freqCheckBoxActionPerformed"/>
|
||||||
|
</Events>
|
||||||
|
</Component>
|
||||||
|
<Container class="javax.swing.JScrollPane" name="jScrollPane3">
|
||||||
|
<AuxValues>
|
||||||
|
<AuxValue name="autoScrollPane" type="java.lang.Boolean" value="true"/>
|
||||||
|
</AuxValues>
|
||||||
|
|
||||||
|
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
|
||||||
|
<SubComponents>
|
||||||
|
<Component class="javax.swing.JList" name="freqList">
|
||||||
|
<Properties>
|
||||||
|
<Property name="model" type="javax.swing.ListModel" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
|
||||||
|
<Connection code="new DefaultListModel<Frequency>()" type="code"/>
|
||||||
|
</Property>
|
||||||
|
<Property name="enabled" type="boolean" value="false"/>
|
||||||
|
</Properties>
|
||||||
|
<AuxValues>
|
||||||
|
<AuxValue name="JavaCodeGenerator_TypeParameters" type="java.lang.String" value="<Frequency>"/>
|
||||||
|
</AuxValues>
|
||||||
|
</Component>
|
||||||
|
</SubComponents>
|
||||||
|
</Container>
|
||||||
|
<Container class="javax.swing.JScrollPane" name="jScrollPane4">
|
||||||
|
<AuxValues>
|
||||||
|
<AuxValue name="autoScrollPane" type="java.lang.Boolean" value="true"/>
|
||||||
|
</AuxValues>
|
||||||
|
|
||||||
|
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
|
||||||
|
<SubComponents>
|
||||||
|
<Component class="javax.swing.JList" name="sizeList">
|
||||||
|
<Properties>
|
||||||
|
<Property name="model" type="javax.swing.ListModel" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
|
||||||
|
<Connection code="new DefaultListModel<FileSize>()" type="code"/>
|
||||||
|
</Property>
|
||||||
|
<Property name="enabled" type="boolean" value="false"/>
|
||||||
|
</Properties>
|
||||||
|
<AuxValues>
|
||||||
|
<AuxValue name="JavaCodeGenerator_TypeParameters" type="java.lang.String" value="<FileSize>"/>
|
||||||
|
</AuxValues>
|
||||||
|
</Component>
|
||||||
|
</SubComponents>
|
||||||
|
</Container>
|
||||||
|
<Component class="javax.swing.JCheckBox" name="sizeCheckBox">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/newpackage/Bundle.properties" key="FileSearchDialog.sizeCheckBox.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
<Events>
|
||||||
|
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="sizeCheckBoxActionPerformed"/>
|
||||||
|
</Events>
|
||||||
|
</Component>
|
||||||
|
<Container class="javax.swing.JScrollPane" name="jScrollPane5">
|
||||||
|
<AuxValues>
|
||||||
|
<AuxValue name="autoScrollPane" type="java.lang.Boolean" value="true"/>
|
||||||
|
</AuxValues>
|
||||||
|
|
||||||
|
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
|
||||||
|
<SubComponents>
|
||||||
|
<Component class="javax.swing.JList" name="kwList">
|
||||||
|
<Properties>
|
||||||
|
<Property name="model" type="javax.swing.ListModel" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
|
||||||
|
<Connection code="new DefaultListModel<String>()" type="code"/>
|
||||||
|
</Property>
|
||||||
|
<Property name="enabled" type="boolean" value="false"/>
|
||||||
|
</Properties>
|
||||||
|
<AuxValues>
|
||||||
|
<AuxValue name="JavaCodeGenerator_TypeParameters" type="java.lang.String" value="<String>"/>
|
||||||
|
</AuxValues>
|
||||||
|
</Component>
|
||||||
|
</SubComponents>
|
||||||
|
</Container>
|
||||||
|
<Component class="javax.swing.JCheckBox" name="kwCheckBox">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/newpackage/Bundle.properties" key="FileSearchDialog.kwCheckBox.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
<Events>
|
||||||
|
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="kwCheckBoxActionPerformed"/>
|
||||||
|
</Events>
|
||||||
|
</Component>
|
||||||
|
<Container class="javax.swing.JScrollPane" name="jScrollPane6">
|
||||||
|
<AuxValues>
|
||||||
|
<AuxValue name="autoScrollPane" type="java.lang.Boolean" value="true"/>
|
||||||
|
</AuxValues>
|
||||||
|
|
||||||
|
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
|
||||||
|
<SubComponents>
|
||||||
|
<Component class="javax.swing.JList" name="parentList">
|
||||||
|
<Properties>
|
||||||
|
<Property name="model" type="javax.swing.ListModel" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
|
||||||
|
<Connection code="new DefaultListModel<ParentSearchTerm>()" type="code"/>
|
||||||
|
</Property>
|
||||||
|
<Property name="selectionMode" type="int" value="0"/>
|
||||||
|
<Property name="enabled" type="boolean" value="false"/>
|
||||||
|
</Properties>
|
||||||
|
<Events>
|
||||||
|
<EventHandler event="valueChanged" listener="javax.swing.event.ListSelectionListener" parameters="javax.swing.event.ListSelectionEvent" handler="parentListValueChanged"/>
|
||||||
|
</Events>
|
||||||
|
<AuxValues>
|
||||||
|
<AuxValue name="JavaCodeGenerator_TypeParameters" type="java.lang.String" value="<ParentSearchTerm>"/>
|
||||||
|
</AuxValues>
|
||||||
|
</Component>
|
||||||
|
</SubComponents>
|
||||||
|
</Container>
|
||||||
|
<Component class="javax.swing.JCheckBox" name="parentCheckBox">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/newpackage/Bundle.properties" key="FileSearchDialog.parentCheckBox.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
<Events>
|
||||||
|
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="parentCheckBoxActionPerformed"/>
|
||||||
|
</Events>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JButton" name="deleteParentButton">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/newpackage/Bundle.properties" key="FileSearchDialog.deleteParentButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
<Property name="enabled" type="boolean" value="false"/>
|
||||||
|
</Properties>
|
||||||
|
<Events>
|
||||||
|
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="deleteParentButtonActionPerformed"/>
|
||||||
|
</Events>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JButton" name="addParentButton">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/newpackage/Bundle.properties" key="FileSearchDialog.addParentButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
<Property name="enabled" type="boolean" value="false"/>
|
||||||
|
</Properties>
|
||||||
|
<Events>
|
||||||
|
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="addParentButtonActionPerformed"/>
|
||||||
|
</Events>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JTextField" name="parentTextField">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/newpackage/Bundle.properties" key="FileSearchDialog.parentTextField.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
<Property name="enabled" type="boolean" value="false"/>
|
||||||
|
</Properties>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JRadioButton" name="parentFullRadioButton">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/newpackage/Bundle.properties" key="FileSearchDialog.parentFullRadioButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
<Property name="enabled" type="boolean" value="false"/>
|
||||||
|
</Properties>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JRadioButton" name="parentSubstringRadioButton">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/newpackage/Bundle.properties" key="FileSearchDialog.parentSubstringRadioButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
<Property name="enabled" type="boolean" value="false"/>
|
||||||
|
</Properties>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JLabel" name="jLabel2">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/newpackage/Bundle.properties" key="FileSearchDialog.jLabel2.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JLabel" name="jLabel3">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/newpackage/Bundle.properties" key="FileSearchDialog.jLabel3.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JComboBox" name="groupComboBox">
|
||||||
|
<Properties>
|
||||||
|
<Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor">
|
||||||
|
<StringArray count="0"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
<AuxValues>
|
||||||
|
<AuxValue name="JavaCodeGenerator_TypeParameters" type="java.lang.String" value="<GroupingAttributeType>"/>
|
||||||
|
</AuxValues>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JLabel" name="jLabel4">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/newpackage/Bundle.properties" key="FileSearchDialog.jLabel4.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JRadioButton" name="orderAttrRadioButton">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/newpackage/Bundle.properties" key="FileSearchDialog.orderAttrRadioButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JRadioButton" name="orderSizeRadioButton">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/newpackage/Bundle.properties" key="FileSearchDialog.orderSizeRadioButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JLabel" name="jLabel5">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/newpackage/Bundle.properties" key="FileSearchDialog.jLabel5.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JComboBox" name="fileOrderComboBox">
|
||||||
|
<Properties>
|
||||||
|
<Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor">
|
||||||
|
<StringArray count="0"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
<AuxValues>
|
||||||
|
<AuxValue name="JavaCodeGenerator_TypeParameters" type="java.lang.String" value="<SortingMethod>"/>
|
||||||
|
</AuxValues>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JButton" name="searchButton">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/newpackage/Bundle.properties" key="FileSearchDialog.searchButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
<Events>
|
||||||
|
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="searchButtonActionPerformed"/>
|
||||||
|
</Events>
|
||||||
|
</Component>
|
||||||
|
</SubComponents>
|
||||||
|
</Form>
|
609
Core/src/org/sleuthkit/autopsy/newpackage/FileSearchDialog.java
Normal file
609
Core/src/org/sleuthkit/autopsy/newpackage/FileSearchDialog.java
Normal file
@ -0,0 +1,609 @@
|
|||||||
|
/*
|
||||||
|
* 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.newpackage;
|
||||||
|
|
||||||
|
import org.sleuthkit.autopsy.casemodule.Case;
|
||||||
|
import org.sleuthkit.autopsy.newpackage.FileSearch.GroupingAttributeType;
|
||||||
|
import org.sleuthkit.autopsy.newpackage.FileSearchData.FileType;
|
||||||
|
import org.sleuthkit.autopsy.newpackage.FileSearchData.FileSize;
|
||||||
|
import org.sleuthkit.autopsy.newpackage.FileSearchData.Frequency;
|
||||||
|
import org.sleuthkit.autopsy.newpackage.FileSearchFiltering.ParentSearchTerm;
|
||||||
|
import org.sleuthkit.autopsy.newpackage.FileSorter.SortingMethod;
|
||||||
|
import org.sleuthkit.datamodel.SleuthkitCase;
|
||||||
|
import org.sleuthkit.datamodel.DataSource;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
import javax.swing.DefaultListModel;
|
||||||
|
import org.sleuthkit.datamodel.BlackboardArtifact;
|
||||||
|
import org.sleuthkit.datamodel.BlackboardAttribute;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class FileSearchDialog extends javax.swing.JDialog {
|
||||||
|
|
||||||
|
private DefaultListModel<ParentSearchTerm> parentListModel;
|
||||||
|
private ButtonPressed buttonPressed = ButtonPressed.SEARCH;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates new form FileSearchDialog
|
||||||
|
*/
|
||||||
|
public FileSearchDialog(java.awt.Frame parent, boolean modal) {
|
||||||
|
super(parent, modal);
|
||||||
|
initComponents();
|
||||||
|
customizeComponents();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void customizeComponents() {
|
||||||
|
|
||||||
|
int count = 0;
|
||||||
|
DefaultListModel<FileType> fileTypeListModel = (DefaultListModel<FileType>)fileTypeList.getModel();
|
||||||
|
for (FileType type : FileType.getOptionsForFiltering()) {
|
||||||
|
fileTypeListModel.add(count, type);
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
|
||||||
|
SleuthkitCase skCase = Case.getCurrentCase().getSleuthkitCase();
|
||||||
|
count = 0;
|
||||||
|
try {
|
||||||
|
DefaultListModel<DataSourceItem> dsListModel = (DefaultListModel<DataSourceItem>)dsList.getModel();
|
||||||
|
for(DataSource ds : skCase.getDataSources()) {
|
||||||
|
dsListModel.add(count, new DataSourceItem(ds));
|
||||||
|
}
|
||||||
|
} catch (Exception ex) {
|
||||||
|
dsCheckBox.setEnabled(false);
|
||||||
|
dsList.setEnabled(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
count = 0;
|
||||||
|
DefaultListModel<Frequency> frequencyListModel = (DefaultListModel<Frequency>)freqList.getModel();
|
||||||
|
for (Frequency freq : Frequency.getOptionsForFiltering()) {
|
||||||
|
frequencyListModel.add(count, freq);
|
||||||
|
}
|
||||||
|
|
||||||
|
count = 0;
|
||||||
|
DefaultListModel<FileSize> sizeListModel = (DefaultListModel<FileSize>)sizeList.getModel();
|
||||||
|
for (FileSize size : FileSize.values()) {
|
||||||
|
sizeListModel.add(count, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
count = 0;
|
||||||
|
try {
|
||||||
|
DefaultListModel<String> kwListModel = (DefaultListModel<String>)kwList.getModel();
|
||||||
|
|
||||||
|
// TODO - use query
|
||||||
|
List<BlackboardArtifact> arts = skCase.getBlackboardArtifacts(BlackboardArtifact.ARTIFACT_TYPE.TSK_KEYWORD_HIT);
|
||||||
|
List<String> setNames = new ArrayList<>();
|
||||||
|
for (BlackboardArtifact art : arts) {
|
||||||
|
for (BlackboardAttribute attr : art.getAttributes()) {
|
||||||
|
if (attr.getAttributeType().getTypeID() == BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SET_NAME.getTypeID()) {
|
||||||
|
String setName = attr.getValueString();
|
||||||
|
if ( ! setNames.contains(setName)) {
|
||||||
|
setNames.add(setName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Collections.sort(setNames);
|
||||||
|
for(String name : setNames) {
|
||||||
|
kwListModel.add(count, name);
|
||||||
|
}
|
||||||
|
} catch (Exception ex) {
|
||||||
|
kwCheckBox.setEnabled(false);
|
||||||
|
kwList.setEnabled(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
parentButtonGroup.add(parentFullRadioButton);
|
||||||
|
parentButtonGroup.add(parentSubstringRadioButton);
|
||||||
|
parentFullRadioButton.setSelected(true);
|
||||||
|
parentListModel = (DefaultListModel<ParentSearchTerm>)parentList.getModel();
|
||||||
|
|
||||||
|
for (GroupingAttributeType type : GroupingAttributeType.values()) {
|
||||||
|
groupComboBox.addItem(type);
|
||||||
|
}
|
||||||
|
|
||||||
|
orderButtonGroup.add(orderAttrRadioButton);
|
||||||
|
orderButtonGroup.add(orderSizeRadioButton);
|
||||||
|
orderAttrRadioButton.setSelected(true);
|
||||||
|
|
||||||
|
for (SortingMethod method : SortingMethod.values()) {
|
||||||
|
fileOrderComboBox.addItem(method);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
List<FileSearchFiltering.FileFilter> getFilters() {
|
||||||
|
List<FileSearchFiltering.FileFilter> filters = new ArrayList<>();
|
||||||
|
|
||||||
|
// There will always be a file type selected
|
||||||
|
filters.add(new FileSearchFiltering.FileTypeFilter(fileTypeList.getSelectedValuesList()));
|
||||||
|
|
||||||
|
if (parentCheckBox.isSelected()) {
|
||||||
|
filters.add(new FileSearchFiltering.ParentFilter(parentList.getSelectedValuesList()));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dsCheckBox.isSelected()) {
|
||||||
|
List<DataSource> dataSources = dsList.getSelectedValuesList().stream().map(t -> t.ds).collect(Collectors.toList());
|
||||||
|
filters.add(new FileSearchFiltering.DataSourceFilter(dataSources));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (freqCheckBox.isSelected()) {
|
||||||
|
filters.add(new FileSearchFiltering.FrequencyFilter(freqList.getSelectedValuesList()));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sizeCheckBox.isSelected()) {
|
||||||
|
filters.add(new FileSearchFiltering.SizeFilter(sizeList.getSelectedValuesList()));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (kwCheckBox.isSelected()) {
|
||||||
|
filters.add(new FileSearchFiltering.KeywordListFilter(kwList.getSelectedValuesList()));
|
||||||
|
}
|
||||||
|
|
||||||
|
return filters;
|
||||||
|
}
|
||||||
|
|
||||||
|
FileSearch.AttributeType getGroupingAttribute() {
|
||||||
|
GroupingAttributeType groupingAttrType = (GroupingAttributeType)groupComboBox.getSelectedItem();
|
||||||
|
return groupingAttrType.getAttributeType();
|
||||||
|
}
|
||||||
|
|
||||||
|
FileGroup.GroupSortingAlgorithm getGroupSortingMethod() {
|
||||||
|
if (orderAttrRadioButton.isSelected()) {
|
||||||
|
return FileGroup.GroupSortingAlgorithm.BY_GROUP_KEY;
|
||||||
|
}
|
||||||
|
return FileGroup.GroupSortingAlgorithm.BY_GROUP_SIZE;
|
||||||
|
}
|
||||||
|
|
||||||
|
SortingMethod getFileSortingMethod() {
|
||||||
|
return (SortingMethod)fileOrderComboBox.getSelectedItem();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private class DataSourceItem {
|
||||||
|
private DataSource ds;
|
||||||
|
|
||||||
|
DataSourceItem(DataSource ds) {
|
||||||
|
this.ds = ds;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return ds.getName() + " (ID: " + ds.getId() + ")";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean searchCancelled() {
|
||||||
|
return buttonPressed.equals(ButtonPressed.CANCEL);
|
||||||
|
}
|
||||||
|
|
||||||
|
private enum ButtonPressed {
|
||||||
|
SEARCH,
|
||||||
|
CANCEL
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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")
|
||||||
|
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
|
||||||
|
private void initComponents() {
|
||||||
|
|
||||||
|
parentButtonGroup = new javax.swing.ButtonGroup();
|
||||||
|
orderButtonGroup = new javax.swing.ButtonGroup();
|
||||||
|
jLabel1 = new javax.swing.JLabel();
|
||||||
|
cancelButton = new javax.swing.JButton();
|
||||||
|
dsCheckBox = new javax.swing.JCheckBox();
|
||||||
|
jScrollPane1 = new javax.swing.JScrollPane();
|
||||||
|
fileTypeList = new javax.swing.JList<>();
|
||||||
|
jScrollPane2 = new javax.swing.JScrollPane();
|
||||||
|
dsList = new javax.swing.JList<>();
|
||||||
|
freqCheckBox = new javax.swing.JCheckBox();
|
||||||
|
jScrollPane3 = new javax.swing.JScrollPane();
|
||||||
|
freqList = new javax.swing.JList<>();
|
||||||
|
jScrollPane4 = new javax.swing.JScrollPane();
|
||||||
|
sizeList = new javax.swing.JList<>();
|
||||||
|
sizeCheckBox = new javax.swing.JCheckBox();
|
||||||
|
jScrollPane5 = new javax.swing.JScrollPane();
|
||||||
|
kwList = new javax.swing.JList<>();
|
||||||
|
kwCheckBox = new javax.swing.JCheckBox();
|
||||||
|
jScrollPane6 = new javax.swing.JScrollPane();
|
||||||
|
parentList = new javax.swing.JList<>();
|
||||||
|
parentCheckBox = new javax.swing.JCheckBox();
|
||||||
|
deleteParentButton = new javax.swing.JButton();
|
||||||
|
addParentButton = new javax.swing.JButton();
|
||||||
|
parentTextField = new javax.swing.JTextField();
|
||||||
|
parentFullRadioButton = new javax.swing.JRadioButton();
|
||||||
|
parentSubstringRadioButton = new javax.swing.JRadioButton();
|
||||||
|
jLabel2 = new javax.swing.JLabel();
|
||||||
|
jLabel3 = new javax.swing.JLabel();
|
||||||
|
groupComboBox = new javax.swing.JComboBox<>();
|
||||||
|
jLabel4 = new javax.swing.JLabel();
|
||||||
|
orderAttrRadioButton = new javax.swing.JRadioButton();
|
||||||
|
orderSizeRadioButton = new javax.swing.JRadioButton();
|
||||||
|
jLabel5 = new javax.swing.JLabel();
|
||||||
|
fileOrderComboBox = new javax.swing.JComboBox<>();
|
||||||
|
searchButton = new javax.swing.JButton();
|
||||||
|
|
||||||
|
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
|
||||||
|
|
||||||
|
org.openide.awt.Mnemonics.setLocalizedText(jLabel1, org.openide.util.NbBundle.getMessage(FileSearchDialog.class, "FileSearchDialog.jLabel1.text")); // NOI18N
|
||||||
|
|
||||||
|
org.openide.awt.Mnemonics.setLocalizedText(cancelButton, org.openide.util.NbBundle.getMessage(FileSearchDialog.class, "FileSearchDialog.cancelButton.text")); // NOI18N
|
||||||
|
cancelButton.addActionListener(new java.awt.event.ActionListener() {
|
||||||
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||||
|
cancelButtonActionPerformed(evt);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
org.openide.awt.Mnemonics.setLocalizedText(dsCheckBox, org.openide.util.NbBundle.getMessage(FileSearchDialog.class, "FileSearchDialog.dsCheckBox.text")); // NOI18N
|
||||||
|
dsCheckBox.addActionListener(new java.awt.event.ActionListener() {
|
||||||
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||||
|
dsCheckBoxActionPerformed(evt);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
fileTypeList.setModel(new DefaultListModel<FileType>());
|
||||||
|
jScrollPane1.setViewportView(fileTypeList);
|
||||||
|
|
||||||
|
dsList.setModel(new DefaultListModel<DataSourceItem>());
|
||||||
|
dsList.setEnabled(false);
|
||||||
|
jScrollPane2.setViewportView(dsList);
|
||||||
|
|
||||||
|
org.openide.awt.Mnemonics.setLocalizedText(freqCheckBox, org.openide.util.NbBundle.getMessage(FileSearchDialog.class, "FileSearchDialog.freqCheckBox.text")); // NOI18N
|
||||||
|
freqCheckBox.addActionListener(new java.awt.event.ActionListener() {
|
||||||
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||||
|
freqCheckBoxActionPerformed(evt);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
freqList.setModel(new DefaultListModel<Frequency>());
|
||||||
|
freqList.setEnabled(false);
|
||||||
|
jScrollPane3.setViewportView(freqList);
|
||||||
|
|
||||||
|
sizeList.setModel(new DefaultListModel<FileSize>());
|
||||||
|
sizeList.setEnabled(false);
|
||||||
|
jScrollPane4.setViewportView(sizeList);
|
||||||
|
|
||||||
|
org.openide.awt.Mnemonics.setLocalizedText(sizeCheckBox, org.openide.util.NbBundle.getMessage(FileSearchDialog.class, "FileSearchDialog.sizeCheckBox.text")); // NOI18N
|
||||||
|
sizeCheckBox.addActionListener(new java.awt.event.ActionListener() {
|
||||||
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||||
|
sizeCheckBoxActionPerformed(evt);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
kwList.setModel(new DefaultListModel<String>());
|
||||||
|
kwList.setEnabled(false);
|
||||||
|
jScrollPane5.setViewportView(kwList);
|
||||||
|
|
||||||
|
org.openide.awt.Mnemonics.setLocalizedText(kwCheckBox, org.openide.util.NbBundle.getMessage(FileSearchDialog.class, "FileSearchDialog.kwCheckBox.text")); // NOI18N
|
||||||
|
kwCheckBox.addActionListener(new java.awt.event.ActionListener() {
|
||||||
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||||
|
kwCheckBoxActionPerformed(evt);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
parentList.setModel(new DefaultListModel<ParentSearchTerm>());
|
||||||
|
parentList.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
|
||||||
|
parentList.setEnabled(false);
|
||||||
|
parentList.addListSelectionListener(new javax.swing.event.ListSelectionListener() {
|
||||||
|
public void valueChanged(javax.swing.event.ListSelectionEvent evt) {
|
||||||
|
parentListValueChanged(evt);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
jScrollPane6.setViewportView(parentList);
|
||||||
|
|
||||||
|
org.openide.awt.Mnemonics.setLocalizedText(parentCheckBox, org.openide.util.NbBundle.getMessage(FileSearchDialog.class, "FileSearchDialog.parentCheckBox.text")); // NOI18N
|
||||||
|
parentCheckBox.addActionListener(new java.awt.event.ActionListener() {
|
||||||
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||||
|
parentCheckBoxActionPerformed(evt);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
org.openide.awt.Mnemonics.setLocalizedText(deleteParentButton, org.openide.util.NbBundle.getMessage(FileSearchDialog.class, "FileSearchDialog.deleteParentButton.text")); // NOI18N
|
||||||
|
deleteParentButton.setEnabled(false);
|
||||||
|
deleteParentButton.addActionListener(new java.awt.event.ActionListener() {
|
||||||
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||||
|
deleteParentButtonActionPerformed(evt);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
org.openide.awt.Mnemonics.setLocalizedText(addParentButton, org.openide.util.NbBundle.getMessage(FileSearchDialog.class, "FileSearchDialog.addParentButton.text")); // NOI18N
|
||||||
|
addParentButton.setEnabled(false);
|
||||||
|
addParentButton.addActionListener(new java.awt.event.ActionListener() {
|
||||||
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||||
|
addParentButtonActionPerformed(evt);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
parentTextField.setText(org.openide.util.NbBundle.getMessage(FileSearchDialog.class, "FileSearchDialog.parentTextField.text")); // NOI18N
|
||||||
|
parentTextField.setEnabled(false);
|
||||||
|
|
||||||
|
org.openide.awt.Mnemonics.setLocalizedText(parentFullRadioButton, org.openide.util.NbBundle.getMessage(FileSearchDialog.class, "FileSearchDialog.parentFullRadioButton.text")); // NOI18N
|
||||||
|
parentFullRadioButton.setEnabled(false);
|
||||||
|
|
||||||
|
org.openide.awt.Mnemonics.setLocalizedText(parentSubstringRadioButton, org.openide.util.NbBundle.getMessage(FileSearchDialog.class, "FileSearchDialog.parentSubstringRadioButton.text")); // NOI18N
|
||||||
|
parentSubstringRadioButton.setEnabled(false);
|
||||||
|
|
||||||
|
org.openide.awt.Mnemonics.setLocalizedText(jLabel2, org.openide.util.NbBundle.getMessage(FileSearchDialog.class, "FileSearchDialog.jLabel2.text")); // NOI18N
|
||||||
|
|
||||||
|
org.openide.awt.Mnemonics.setLocalizedText(jLabel3, org.openide.util.NbBundle.getMessage(FileSearchDialog.class, "FileSearchDialog.jLabel3.text")); // NOI18N
|
||||||
|
|
||||||
|
org.openide.awt.Mnemonics.setLocalizedText(jLabel4, org.openide.util.NbBundle.getMessage(FileSearchDialog.class, "FileSearchDialog.jLabel4.text")); // NOI18N
|
||||||
|
|
||||||
|
org.openide.awt.Mnemonics.setLocalizedText(orderAttrRadioButton, org.openide.util.NbBundle.getMessage(FileSearchDialog.class, "FileSearchDialog.orderAttrRadioButton.text")); // NOI18N
|
||||||
|
|
||||||
|
org.openide.awt.Mnemonics.setLocalizedText(orderSizeRadioButton, org.openide.util.NbBundle.getMessage(FileSearchDialog.class, "FileSearchDialog.orderSizeRadioButton.text")); // NOI18N
|
||||||
|
|
||||||
|
org.openide.awt.Mnemonics.setLocalizedText(jLabel5, org.openide.util.NbBundle.getMessage(FileSearchDialog.class, "FileSearchDialog.jLabel5.text")); // NOI18N
|
||||||
|
|
||||||
|
org.openide.awt.Mnemonics.setLocalizedText(searchButton, org.openide.util.NbBundle.getMessage(FileSearchDialog.class, "FileSearchDialog.searchButton.text")); // NOI18N
|
||||||
|
searchButton.addActionListener(new java.awt.event.ActionListener() {
|
||||||
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||||
|
searchButtonActionPerformed(evt);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
|
||||||
|
getContentPane().setLayout(layout);
|
||||||
|
layout.setHorizontalGroup(
|
||||||
|
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
|
.addGroup(layout.createSequentialGroup()
|
||||||
|
.addContainerGap()
|
||||||
|
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
|
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
|
||||||
|
.addGap(0, 0, Short.MAX_VALUE)
|
||||||
|
.addComponent(searchButton)
|
||||||
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||||
|
.addComponent(cancelButton))
|
||||||
|
.addGroup(layout.createSequentialGroup()
|
||||||
|
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
|
.addComponent(dsCheckBox)
|
||||||
|
.addComponent(jLabel1)
|
||||||
|
.addComponent(freqCheckBox)
|
||||||
|
.addComponent(sizeCheckBox)
|
||||||
|
.addComponent(kwCheckBox)
|
||||||
|
.addComponent(parentCheckBox)
|
||||||
|
.addComponent(jLabel2))
|
||||||
|
.addGap(18, 18, 18)
|
||||||
|
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
|
||||||
|
.addGroup(layout.createSequentialGroup()
|
||||||
|
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
|
.addComponent(parentTextField)
|
||||||
|
.addGroup(layout.createSequentialGroup()
|
||||||
|
.addComponent(parentFullRadioButton)
|
||||||
|
.addGap(18, 18, 18)
|
||||||
|
.addComponent(parentSubstringRadioButton)
|
||||||
|
.addGap(0, 0, Short.MAX_VALUE)))
|
||||||
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||||
|
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
|
||||||
|
.addComponent(deleteParentButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||||
|
.addComponent(addParentButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
|
||||||
|
.addComponent(jScrollPane3, javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
|
.addComponent(jScrollPane1, javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
|
.addComponent(jScrollPane2, javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
|
.addComponent(jScrollPane4, javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
|
.addComponent(jScrollPane5)
|
||||||
|
.addComponent(jScrollPane6, javax.swing.GroupLayout.Alignment.LEADING))
|
||||||
|
.addGap(35, 35, 35)
|
||||||
|
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
|
.addComponent(jLabel3)
|
||||||
|
.addComponent(jLabel4)
|
||||||
|
.addComponent(jLabel5))
|
||||||
|
.addGap(18, 18, 18)
|
||||||
|
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
|
||||||
|
.addComponent(orderAttrRadioButton)
|
||||||
|
.addComponent(groupComboBox, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||||
|
.addComponent(orderSizeRadioButton)
|
||||||
|
.addComponent(fileOrderComboBox, 0, 144, Short.MAX_VALUE))
|
||||||
|
.addGap(0, 93, Short.MAX_VALUE)))
|
||||||
|
.addContainerGap())
|
||||||
|
);
|
||||||
|
layout.setVerticalGroup(
|
||||||
|
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
|
.addGroup(layout.createSequentialGroup()
|
||||||
|
.addContainerGap()
|
||||||
|
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
|
.addComponent(jLabel1)
|
||||||
|
.addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 82, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
|
.addGroup(layout.createSequentialGroup()
|
||||||
|
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||||
|
.addComponent(jLabel3)
|
||||||
|
.addComponent(groupComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
|
||||||
|
.addGap(5, 5, 5)
|
||||||
|
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||||
|
.addComponent(jLabel4)
|
||||||
|
.addComponent(orderAttrRadioButton))
|
||||||
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||||
|
.addComponent(orderSizeRadioButton)))
|
||||||
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
||||||
|
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
|
.addComponent(dsCheckBox)
|
||||||
|
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||||
|
.addComponent(jLabel5)
|
||||||
|
.addComponent(fileOrderComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
|
||||||
|
.addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 56, javax.swing.GroupLayout.PREFERRED_SIZE))
|
||||||
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
||||||
|
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
|
.addComponent(freqCheckBox)
|
||||||
|
.addComponent(jScrollPane3, javax.swing.GroupLayout.PREFERRED_SIZE, 54, javax.swing.GroupLayout.PREFERRED_SIZE))
|
||||||
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
||||||
|
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
|
.addComponent(jScrollPane4, javax.swing.GroupLayout.PREFERRED_SIZE, 49, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
|
.addComponent(sizeCheckBox))
|
||||||
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
||||||
|
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
|
.addComponent(jScrollPane5, javax.swing.GroupLayout.PREFERRED_SIZE, 49, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
|
.addComponent(kwCheckBox))
|
||||||
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
||||||
|
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
|
.addComponent(jScrollPane6, javax.swing.GroupLayout.PREFERRED_SIZE, 49, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
|
.addGroup(layout.createSequentialGroup()
|
||||||
|
.addComponent(parentCheckBox)
|
||||||
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||||
|
.addComponent(jLabel2)))
|
||||||
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||||
|
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||||
|
.addComponent(deleteParentButton)
|
||||||
|
.addComponent(parentFullRadioButton)
|
||||||
|
.addComponent(parentSubstringRadioButton))
|
||||||
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||||
|
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||||
|
.addComponent(addParentButton)
|
||||||
|
.addComponent(parentTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
|
||||||
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 8, Short.MAX_VALUE)
|
||||||
|
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||||
|
.addComponent(cancelButton)
|
||||||
|
.addComponent(searchButton))
|
||||||
|
.addContainerGap())
|
||||||
|
);
|
||||||
|
|
||||||
|
pack();
|
||||||
|
}// </editor-fold>//GEN-END:initComponents
|
||||||
|
|
||||||
|
private void cancelButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cancelButtonActionPerformed
|
||||||
|
setVisible(false);
|
||||||
|
dispose();
|
||||||
|
buttonPressed = ButtonPressed.CANCEL;
|
||||||
|
}//GEN-LAST:event_cancelButtonActionPerformed
|
||||||
|
|
||||||
|
private void dsCheckBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_dsCheckBoxActionPerformed
|
||||||
|
dsList.setEnabled(dsCheckBox.isSelected());
|
||||||
|
}//GEN-LAST:event_dsCheckBoxActionPerformed
|
||||||
|
|
||||||
|
private void parentListValueChanged(javax.swing.event.ListSelectionEvent evt) {//GEN-FIRST:event_parentListValueChanged
|
||||||
|
if (parentList.getSelectedValuesList().isEmpty()) {
|
||||||
|
deleteParentButton.setEnabled(false);
|
||||||
|
} else {
|
||||||
|
deleteParentButton.setEnabled(true);
|
||||||
|
}
|
||||||
|
}//GEN-LAST:event_parentListValueChanged
|
||||||
|
|
||||||
|
private void deleteParentButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_deleteParentButtonActionPerformed
|
||||||
|
int index = parentList.getSelectedIndex();
|
||||||
|
parentListModel.remove(index);
|
||||||
|
}//GEN-LAST:event_deleteParentButtonActionPerformed
|
||||||
|
|
||||||
|
private void addParentButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_addParentButtonActionPerformed
|
||||||
|
if ( ! parentTextField.getText().isEmpty()) {
|
||||||
|
ParentSearchTerm searchTerm;
|
||||||
|
if (parentFullRadioButton.isSelected()) {
|
||||||
|
searchTerm = new ParentSearchTerm(parentTextField.getText(), true);
|
||||||
|
} else {
|
||||||
|
searchTerm = new ParentSearchTerm(parentTextField.getText(), false);
|
||||||
|
}
|
||||||
|
parentListModel.add(parentListModel.size(), searchTerm);
|
||||||
|
}
|
||||||
|
}//GEN-LAST:event_addParentButtonActionPerformed
|
||||||
|
|
||||||
|
private void freqCheckBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_freqCheckBoxActionPerformed
|
||||||
|
freqList.setEnabled(freqCheckBox.isSelected());
|
||||||
|
}//GEN-LAST:event_freqCheckBoxActionPerformed
|
||||||
|
|
||||||
|
private void sizeCheckBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_sizeCheckBoxActionPerformed
|
||||||
|
sizeList.setEnabled(sizeCheckBox.isSelected());
|
||||||
|
}//GEN-LAST:event_sizeCheckBoxActionPerformed
|
||||||
|
|
||||||
|
private void kwCheckBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_kwCheckBoxActionPerformed
|
||||||
|
kwList.setEnabled(kwCheckBox.isSelected());
|
||||||
|
}//GEN-LAST:event_kwCheckBoxActionPerformed
|
||||||
|
|
||||||
|
private void parentCheckBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_parentCheckBoxActionPerformed
|
||||||
|
parentList.setEnabled(parentCheckBox.isSelected());
|
||||||
|
parentFullRadioButton.setEnabled(parentCheckBox.isSelected());
|
||||||
|
parentSubstringRadioButton.setEnabled(parentCheckBox.isSelected());
|
||||||
|
addParentButton.setEnabled(parentCheckBox.isSelected());
|
||||||
|
deleteParentButton.setEnabled(parentCheckBox.isSelected());
|
||||||
|
}//GEN-LAST:event_parentCheckBoxActionPerformed
|
||||||
|
|
||||||
|
private void searchButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_searchButtonActionPerformed
|
||||||
|
buttonPressed = ButtonPressed.SEARCH;
|
||||||
|
setVisible(false);
|
||||||
|
}//GEN-LAST:event_searchButtonActionPerformed
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param args the command line arguments
|
||||||
|
*/
|
||||||
|
public static void main(String args[]) {
|
||||||
|
/* Set the Nimbus look and feel */
|
||||||
|
//<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
|
||||||
|
/* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
|
||||||
|
* For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
|
||||||
|
*/
|
||||||
|
try {
|
||||||
|
for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
|
||||||
|
if ("Nimbus".equals(info.getName())) {
|
||||||
|
javax.swing.UIManager.setLookAndFeel(info.getClassName());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (ClassNotFoundException ex) {
|
||||||
|
java.util.logging.Logger.getLogger(FileSearchDialog.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
|
||||||
|
} catch (InstantiationException ex) {
|
||||||
|
java.util.logging.Logger.getLogger(FileSearchDialog.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
|
||||||
|
} catch (IllegalAccessException ex) {
|
||||||
|
java.util.logging.Logger.getLogger(FileSearchDialog.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
|
||||||
|
} catch (javax.swing.UnsupportedLookAndFeelException ex) {
|
||||||
|
java.util.logging.Logger.getLogger(FileSearchDialog.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
|
||||||
|
}
|
||||||
|
//</editor-fold>
|
||||||
|
|
||||||
|
/* Create and display the dialog */
|
||||||
|
java.awt.EventQueue.invokeLater(new Runnable() {
|
||||||
|
public void run() {
|
||||||
|
FileSearchDialog dialog = new FileSearchDialog(new javax.swing.JFrame(), true);
|
||||||
|
dialog.addWindowListener(new java.awt.event.WindowAdapter() {
|
||||||
|
@Override
|
||||||
|
public void windowClosing(java.awt.event.WindowEvent e) {
|
||||||
|
System.exit(0);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
dialog.setVisible(true);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Variables declaration - do not modify//GEN-BEGIN:variables
|
||||||
|
private javax.swing.JButton addParentButton;
|
||||||
|
private javax.swing.JButton cancelButton;
|
||||||
|
private javax.swing.JButton deleteParentButton;
|
||||||
|
private javax.swing.JCheckBox dsCheckBox;
|
||||||
|
private javax.swing.JList<DataSourceItem> dsList;
|
||||||
|
private javax.swing.JComboBox<SortingMethod> fileOrderComboBox;
|
||||||
|
private javax.swing.JList<FileSearchData.FileType> fileTypeList;
|
||||||
|
private javax.swing.JCheckBox freqCheckBox;
|
||||||
|
private javax.swing.JList<Frequency> freqList;
|
||||||
|
private javax.swing.JComboBox<GroupingAttributeType> groupComboBox;
|
||||||
|
private javax.swing.JLabel jLabel1;
|
||||||
|
private javax.swing.JLabel jLabel2;
|
||||||
|
private javax.swing.JLabel jLabel3;
|
||||||
|
private javax.swing.JLabel jLabel4;
|
||||||
|
private javax.swing.JLabel jLabel5;
|
||||||
|
private javax.swing.JScrollPane jScrollPane1;
|
||||||
|
private javax.swing.JScrollPane jScrollPane2;
|
||||||
|
private javax.swing.JScrollPane jScrollPane3;
|
||||||
|
private javax.swing.JScrollPane jScrollPane4;
|
||||||
|
private javax.swing.JScrollPane jScrollPane5;
|
||||||
|
private javax.swing.JScrollPane jScrollPane6;
|
||||||
|
private javax.swing.JCheckBox kwCheckBox;
|
||||||
|
private javax.swing.JList<String> kwList;
|
||||||
|
private javax.swing.JRadioButton orderAttrRadioButton;
|
||||||
|
private javax.swing.ButtonGroup orderButtonGroup;
|
||||||
|
private javax.swing.JRadioButton orderSizeRadioButton;
|
||||||
|
private javax.swing.ButtonGroup parentButtonGroup;
|
||||||
|
private javax.swing.JCheckBox parentCheckBox;
|
||||||
|
private javax.swing.JRadioButton parentFullRadioButton;
|
||||||
|
private javax.swing.JList<ParentSearchTerm> parentList;
|
||||||
|
private javax.swing.JRadioButton parentSubstringRadioButton;
|
||||||
|
private javax.swing.JTextField parentTextField;
|
||||||
|
private javax.swing.JButton searchButton;
|
||||||
|
private javax.swing.JCheckBox sizeCheckBox;
|
||||||
|
private javax.swing.JList<FileSize> sizeList;
|
||||||
|
// End of variables declaration//GEN-END:variables
|
||||||
|
}
|
@ -24,6 +24,7 @@ import org.sleuthkit.autopsy.centralrepository.datamodel.EamDb;
|
|||||||
import org.sleuthkit.autopsy.centralrepository.datamodel.EamDbException;
|
import org.sleuthkit.autopsy.centralrepository.datamodel.EamDbException;
|
||||||
import org.sleuthkit.autopsy.datamodel.utils.FileTypeUtils;
|
import org.sleuthkit.autopsy.datamodel.utils.FileTypeUtils;
|
||||||
import org.sleuthkit.autopsy.newpackage.FileSearchData.FileSize;
|
import org.sleuthkit.autopsy.newpackage.FileSearchData.FileSize;
|
||||||
|
import org.sleuthkit.autopsy.newpackage.FileSearchData.FileType;
|
||||||
import org.sleuthkit.autopsy.newpackage.FileSearchData.Frequency;
|
import org.sleuthkit.autopsy.newpackage.FileSearchData.Frequency;
|
||||||
|
|
||||||
import org.sleuthkit.datamodel.AbstractFile;
|
import org.sleuthkit.datamodel.AbstractFile;
|
||||||
@ -50,6 +51,7 @@ class FileSearchFiltering {
|
|||||||
* @param filters The filters to run
|
* @param filters The filters to run
|
||||||
* @param caseDb The case database
|
* @param caseDb The case database
|
||||||
* @param crDb The central repo. Can be null as long as no filters need it.
|
* @param crDb The central repo. Can be null as long as no filters need it.
|
||||||
|
*
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
static List<ResultFile> runQueries(List<FileFilter> filters, SleuthkitCase caseDb, EamDb centralRepoDb) throws FileSearchException {
|
static List<ResultFile> runQueries(List<FileFilter> filters, SleuthkitCase caseDb, EamDb centralRepoDb) throws FileSearchException {
|
||||||
@ -77,32 +79,33 @@ class FileSearchFiltering {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (combinedQuery.isEmpty()) {
|
||||||
|
// The file search filter is required, so this should never be empty.
|
||||||
|
throw new FileSearchException("Selected filters do not include a case database query");
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// Get all matching abstract files
|
// Get all matching abstract files
|
||||||
List<ResultFile> resultList = new ArrayList<>();
|
List<ResultFile> resultList = new ArrayList<>();
|
||||||
|
|
||||||
if ( ! combinedQuery.isEmpty()) {
|
|
||||||
logger.log(Level.INFO, "Running SQL query: {0}", combinedQuery);
|
logger.log(Level.INFO, "Running SQL query: {0}", combinedQuery);
|
||||||
List<AbstractFile> sqlResults = caseDb.findAllFilesWhere(combinedQuery);
|
List<AbstractFile> sqlResults = caseDb.findAllFilesWhere(combinedQuery);
|
||||||
|
|
||||||
// If there are no results, return now
|
// If there are no results, return now
|
||||||
if (sqlResults.isEmpty()) {
|
if (sqlResults.isEmpty()) {
|
||||||
return resultList;
|
return resultList;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Wrap each result in a ResultFile
|
// Wrap each result in a ResultFile
|
||||||
for (AbstractFile abstractFile : sqlResults) {
|
for (AbstractFile abstractFile : sqlResults) {
|
||||||
resultList.add(new ResultFile(abstractFile));
|
resultList.add(new ResultFile(abstractFile));
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Now run any non-SQL filters. Note that resultList could be empty at this point if we had no SQL queries -
|
// Now run any non-SQL filters.
|
||||||
// applyAlternateFilter() will interpret this as no filters have been run up to this point
|
for (FileFilter filter : filters) {
|
||||||
// and act accordingly.
|
if (filter.useAlternateFilter()) {
|
||||||
// TODO maybe it is an error to have no SQL query
|
resultList = filter.applyAlternateFilter(resultList, caseDb, centralRepoDb);
|
||||||
for (FileFilter subFilter : filters) {
|
|
||||||
if (subFilter.useAlternateFilter()) {
|
|
||||||
resultList = subFilter.applyAlternateFilter(resultList, caseDb, centralRepoDb);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// There are no matches for the filters run so far, so return
|
// There are no matches for the filters run so far, so return
|
||||||
@ -137,8 +140,6 @@ class FileSearchFiltering {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Run a secondary filter that does not operate on tsk_files.
|
* Run a secondary filter that does not operate on tsk_files.
|
||||||
* If currentResults is empty, the assumption is that this is the first filter being run, not that
|
|
||||||
* there are no matches.
|
|
||||||
*
|
*
|
||||||
* @param currentResults The current list of matching files; empty if no filters have yet been run.
|
* @param currentResults The current list of matching files; empty if no filters have yet been run.
|
||||||
* @param caseDb The case database
|
* @param caseDb The case database
|
||||||
@ -164,15 +165,15 @@ class FileSearchFiltering {
|
|||||||
/**
|
/**
|
||||||
* A filter for specifying the file size
|
* A filter for specifying the file size
|
||||||
*/
|
*/
|
||||||
static class SizeSubFilter extends FileFilter {
|
static class SizeFilter extends FileFilter {
|
||||||
private final List<FileSize> fileSizes;
|
private final List<FileSize> fileSizes;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create the SizeSubFilter
|
* Create the SizeFilter
|
||||||
*
|
*
|
||||||
* @param fileSizes the file sizes that should match
|
* @param fileSizes the file sizes that should match
|
||||||
*/
|
*/
|
||||||
SizeSubFilter(List<FileSize> fileSizes) {
|
SizeFilter(List<FileSize> fileSizes) {
|
||||||
this.fileSizes = fileSizes;
|
this.fileSizes = fileSizes;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -194,28 +195,28 @@ class FileSearchFiltering {
|
|||||||
|
|
||||||
@NbBundle.Messages({
|
@NbBundle.Messages({
|
||||||
"# {0} - filters",
|
"# {0} - filters",
|
||||||
"FileSearchFiltering.SizeSubFilter.desc=Files with size in range(s): {0}",
|
"FileSearchFiltering.SizeFilter.desc=Files with size in range(s): {0}",
|
||||||
"FileSearchFiltering.SizeSubFilter.or= or ",
|
"FileSearchFiltering.SizeFilter.or= or ",
|
||||||
"# {0} - Minimum bytes",
|
"# {0} - Minimum bytes",
|
||||||
"# {1} - Maximum bytes",
|
"# {1} - Maximum bytes",
|
||||||
"FileSearchFiltering.SizeSubFilter.range=({0} to {1})",
|
"FileSearchFiltering.SizeFilter.range=({0} to {1})",
|
||||||
})
|
})
|
||||||
@Override
|
@Override
|
||||||
String getDesc() {
|
String getDesc() {
|
||||||
String desc = ""; // NON-NLS
|
String desc = ""; // NON-NLS
|
||||||
for (FileSize size : fileSizes) {
|
for (FileSize size : fileSizes) {
|
||||||
if ( ! desc.isEmpty()) {
|
if ( ! desc.isEmpty()) {
|
||||||
desc += Bundle.FileSearchFiltering_SizeSubFilter_or();
|
desc += Bundle.FileSearchFiltering_SizeFilter_or();
|
||||||
}
|
}
|
||||||
desc += Bundle.FileSearchFiltering_SizeSubFilter_range(size.getMinBytes(), size.getMaxBytes());
|
desc += Bundle.FileSearchFiltering_SizeFilter_range(size.getMinBytes(), size.getMaxBytes());
|
||||||
}
|
}
|
||||||
desc = Bundle.FileSearchFiltering_SizeSubFilter_desc(desc);
|
desc = Bundle.FileSearchFiltering_SizeFilter_desc(desc);
|
||||||
return desc;
|
return desc;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A utility class for the ParentSubFilter to store the search string
|
* A utility class for the ParentFilter to store the search string
|
||||||
* and whether it is a full path or a substring.
|
* and whether it is a full path or a substring.
|
||||||
*/
|
*/
|
||||||
static class ParentSearchTerm {
|
static class ParentSearchTerm {
|
||||||
@ -247,20 +248,33 @@ class FileSearchFiltering {
|
|||||||
return "parent_path LIKE \'%" + searchStr + "%\'"; // NON-NLS
|
return "parent_path LIKE \'%" + searchStr + "%\'"; // NON-NLS
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@NbBundle.Messages({
|
||||||
|
"# {0} - search term",
|
||||||
|
"FileSearchFiltering.ParentSearchTerm.fullString= {0} (exact)",
|
||||||
|
"FileSearchFiltering.ParentSearchTerm.subString= {0} (substring)",
|
||||||
|
})
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
if (isFullPath) {
|
||||||
|
return Bundle.FileSearchFiltering_ParentSearchTerm_fullString(searchStr);
|
||||||
|
}
|
||||||
|
return Bundle.FileSearchFiltering_ParentSearchTerm_subString(searchStr);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A filter for specifying parent path (either full path or substring)
|
* A filter for specifying parent path (either full path or substring)
|
||||||
*/
|
*/
|
||||||
static class ParentSubFilter extends FileFilter {
|
static class ParentFilter extends FileFilter {
|
||||||
private final List<ParentSearchTerm> parentSearchTerms;
|
private final List<ParentSearchTerm> parentSearchTerms;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create the ParentSubFilter
|
* Create the ParentFilter
|
||||||
*
|
*
|
||||||
* @param parentSearchTerms Full paths or substrings to filter on
|
* @param parentSearchTerms Full paths or substrings to filter on
|
||||||
*/
|
*/
|
||||||
ParentSubFilter(List<ParentSearchTerm> parentSearchTerms) {
|
ParentFilter(List<ParentSearchTerm> parentSearchTerms) {
|
||||||
this.parentSearchTerms = parentSearchTerms;
|
this.parentSearchTerms = parentSearchTerms;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -278,25 +292,25 @@ class FileSearchFiltering {
|
|||||||
|
|
||||||
@NbBundle.Messages({
|
@NbBundle.Messages({
|
||||||
"# {0} - filters",
|
"# {0} - filters",
|
||||||
"FileSearchFiltering.ParentSubFilter.desc=Files with paths matching: {0}",
|
"FileSearchFiltering.ParentFilter.desc=Files with paths matching: {0}",
|
||||||
"FileSearchFiltering.ParentSubFilter.or= or ",
|
"FileSearchFiltering.ParentFilter.or= or ",
|
||||||
"FileSearchFiltering.ParentSubFilter.exact=(exact match)",
|
"FileSearchFiltering.ParentFilter.exact=(exact match)",
|
||||||
"FileSearchFiltering.ParentSubFilter.substring=(substring)",
|
"FileSearchFiltering.ParentFilter.substring=(substring)",
|
||||||
})
|
})
|
||||||
@Override
|
@Override
|
||||||
String getDesc() {
|
String getDesc() {
|
||||||
String desc = ""; // NON-NLS
|
String desc = ""; // NON-NLS
|
||||||
for (ParentSearchTerm searchTerm : parentSearchTerms) {
|
for (ParentSearchTerm searchTerm : parentSearchTerms) {
|
||||||
if ( ! desc.isEmpty()) {
|
if ( ! desc.isEmpty()) {
|
||||||
desc += Bundle.FileSearchFiltering_ParentSubFilter_or();
|
desc += Bundle.FileSearchFiltering_ParentFilter_or();
|
||||||
}
|
}
|
||||||
if (searchTerm.isFullPath) {
|
if (searchTerm.isFullPath) {
|
||||||
desc += searchTerm.searchStr + Bundle.FileSearchFiltering_ParentSubFilter_exact();
|
desc += searchTerm.searchStr + Bundle.FileSearchFiltering_ParentFilter_exact();
|
||||||
} else {
|
} else {
|
||||||
desc += searchTerm.searchStr + Bundle.FileSearchFiltering_ParentSubFilter_substring();
|
desc += searchTerm.searchStr + Bundle.FileSearchFiltering_ParentFilter_substring();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
desc = Bundle.FileSearchFiltering_ParentSubFilter_desc(desc);
|
desc = Bundle.FileSearchFiltering_ParentFilter_desc(desc);
|
||||||
return desc;
|
return desc;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -304,15 +318,15 @@ class FileSearchFiltering {
|
|||||||
/**
|
/**
|
||||||
* A filter for specifying data sources
|
* A filter for specifying data sources
|
||||||
*/
|
*/
|
||||||
static class DataSourceSubFilter extends FileFilter {
|
static class DataSourceFilter extends FileFilter {
|
||||||
private final List<DataSource> dataSources;
|
private final List<DataSource> dataSources;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create the DataSourceSubFilter
|
* Create the DataSourceFilter
|
||||||
*
|
*
|
||||||
* @param dataSources the data sources to filter on
|
* @param dataSources the data sources to filter on
|
||||||
*/
|
*/
|
||||||
DataSourceSubFilter(List<DataSource> dataSources) {
|
DataSourceFilter(List<DataSource> dataSources) {
|
||||||
this.dataSources = dataSources;
|
this.dataSources = dataSources;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -331,22 +345,22 @@ class FileSearchFiltering {
|
|||||||
|
|
||||||
@NbBundle.Messages({
|
@NbBundle.Messages({
|
||||||
"# {0} - filters",
|
"# {0} - filters",
|
||||||
"FileSearchFiltering.DataSourceSubFilter.desc=Files in data source(s): {0}",
|
"FileSearchFiltering.DataSourceFilter.desc=Files in data source(s): {0}",
|
||||||
"FileSearchFiltering.DataSourceSubFilter.or= or ",
|
"FileSearchFiltering.DataSourceFilter.or= or ",
|
||||||
"# {0} - Data source name",
|
"# {0} - Data source name",
|
||||||
"# {1} - Data source ID",
|
"# {1} - Data source ID",
|
||||||
"FileSearchFiltering.DataSourceSubFilter.datasource={0}({1})",
|
"FileSearchFiltering.DataSourceFilter.datasource={0}({1})",
|
||||||
})
|
})
|
||||||
@Override
|
@Override
|
||||||
String getDesc() {
|
String getDesc() {
|
||||||
String desc = ""; // NON-NLS
|
String desc = ""; // NON-NLS
|
||||||
for (DataSource ds : dataSources) {
|
for (DataSource ds : dataSources) {
|
||||||
if ( ! desc.isEmpty()) {
|
if ( ! desc.isEmpty()) {
|
||||||
desc += Bundle.FileSearchFiltering_DataSourceSubFilter_or();
|
desc += Bundle.FileSearchFiltering_DataSourceFilter_or();
|
||||||
}
|
}
|
||||||
desc += Bundle.FileSearchFiltering_DataSourceSubFilter_datasource(ds.getName(), ds.getId());
|
desc += Bundle.FileSearchFiltering_DataSourceFilter_datasource(ds.getName(), ds.getId());
|
||||||
}
|
}
|
||||||
desc = Bundle.FileSearchFiltering_DataSourceSubFilter_desc(desc);
|
desc = Bundle.FileSearchFiltering_DataSourceFilter_desc(desc);
|
||||||
return desc;
|
return desc;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -355,14 +369,14 @@ class FileSearchFiltering {
|
|||||||
* A filter for specifying keyword list names.
|
* A filter for specifying keyword list names.
|
||||||
* A file must contain a keyword from one of the given lists to pass.
|
* A file must contain a keyword from one of the given lists to pass.
|
||||||
*/
|
*/
|
||||||
static class KeywordListSubFilter extends FileFilter {
|
static class KeywordListFilter extends FileFilter {
|
||||||
private final List<String> listNames;
|
private final List<String> listNames;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create the KeywordListSubFilter
|
* Create the KeywordListFilter
|
||||||
* @param listNames
|
* @param listNames
|
||||||
*/
|
*/
|
||||||
KeywordListSubFilter(List<String> listNames) {
|
KeywordListFilter(List<String> listNames) {
|
||||||
this.listNames = listNames;
|
this.listNames = listNames;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -385,19 +399,19 @@ class FileSearchFiltering {
|
|||||||
|
|
||||||
@NbBundle.Messages({
|
@NbBundle.Messages({
|
||||||
"# {0} - filters",
|
"# {0} - filters",
|
||||||
"FileSearchFiltering.KeywordListSubFilter.desc=Files with keywords in list(s): {0}",
|
"FileSearchFiltering.KeywordListFilter.desc=Files with keywords in list(s): {0}",
|
||||||
"FileSearchFiltering.KeywordListSubFilter.comma=, ",
|
"FileSearchFiltering.KeywordListFilter.comma=, ",
|
||||||
})
|
})
|
||||||
@Override
|
@Override
|
||||||
String getDesc() {
|
String getDesc() {
|
||||||
String desc = ""; // NON-NLS
|
String desc = ""; // NON-NLS
|
||||||
for (String listName : listNames) {
|
for (String listName : listNames) {
|
||||||
if ( ! desc.isEmpty()) {
|
if ( ! desc.isEmpty()) {
|
||||||
desc += Bundle.FileSearchFiltering_KeywordListSubFilter_comma();
|
desc += Bundle.FileSearchFiltering_KeywordListFilter_comma();
|
||||||
}
|
}
|
||||||
desc += listName;
|
desc += listName;
|
||||||
}
|
}
|
||||||
desc = Bundle.FileSearchFiltering_KeywordListSubFilter_desc(desc);
|
desc = Bundle.FileSearchFiltering_KeywordListFilter_desc(desc);
|
||||||
return desc;
|
return desc;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -405,21 +419,21 @@ class FileSearchFiltering {
|
|||||||
/**
|
/**
|
||||||
* A filter for specifying file types.
|
* A filter for specifying file types.
|
||||||
*/
|
*/
|
||||||
static class FileTypeSubFilter extends FileFilter {
|
static class FileTypeFilter extends FileFilter {
|
||||||
private final List<FileTypeUtils.FileTypeCategory> categories;
|
private final List<FileType> categories;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create the FileTypeSubFilter
|
* Create the FileTypeFilter
|
||||||
* @param categories List of file types to filter on
|
* @param categories List of file types to filter on
|
||||||
*/
|
*/
|
||||||
FileTypeSubFilter(List<FileTypeUtils.FileTypeCategory> categories) {
|
FileTypeFilter(List<FileType> categories) {
|
||||||
this.categories = categories;
|
this.categories = categories;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
String getWhereClause() {
|
String getWhereClause() {
|
||||||
String queryStr = ""; // NON-NLS
|
String queryStr = ""; // NON-NLS
|
||||||
for (FileTypeUtils.FileTypeCategory cat : categories) {
|
for (FileType cat : categories) {
|
||||||
for (String type : cat.getMediaTypes()) {
|
for (String type : cat.getMediaTypes()) {
|
||||||
if (! queryStr.isEmpty()) {
|
if (! queryStr.isEmpty()) {
|
||||||
queryStr += ","; // NON-NLS
|
queryStr += ","; // NON-NLS
|
||||||
@ -433,19 +447,19 @@ class FileSearchFiltering {
|
|||||||
|
|
||||||
@NbBundle.Messages({
|
@NbBundle.Messages({
|
||||||
"# {0} - filters",
|
"# {0} - filters",
|
||||||
"FileSearchFiltering.FileTypeSubFilter.desc=Files with type: {0}",
|
"FileSearchFiltering.FileTypeFilter.desc=Files with type: {0}",
|
||||||
"FileSearchFiltering.FileTypeSubFilter.or= or ",
|
"FileSearchFiltering.FileTypeFilter.or= or ",
|
||||||
})
|
})
|
||||||
@Override
|
@Override
|
||||||
String getDesc() {
|
String getDesc() {
|
||||||
String desc = "";
|
String desc = "";
|
||||||
for (FileTypeUtils.FileTypeCategory cat : categories) {
|
for (FileType cat : categories) {
|
||||||
if ( ! desc.isEmpty()) {
|
if ( ! desc.isEmpty()) {
|
||||||
desc += Bundle.FileSearchFiltering_FileTypeSubFilter_or();
|
desc += Bundle.FileSearchFiltering_FileTypeFilter_or();
|
||||||
}
|
}
|
||||||
desc += cat.getDisplayName();
|
desc += cat.toString();
|
||||||
}
|
}
|
||||||
desc = Bundle.FileSearchFiltering_FileTypeSubFilter_desc(desc);
|
desc = Bundle.FileSearchFiltering_FileTypeFilter_desc(desc);
|
||||||
return desc;
|
return desc;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -453,16 +467,16 @@ class FileSearchFiltering {
|
|||||||
/**
|
/**
|
||||||
* A filter for specifying frequency in the central repository.
|
* A filter for specifying frequency in the central repository.
|
||||||
*/
|
*/
|
||||||
static class FrequencySubFilter extends FileFilter {
|
static class FrequencyFilter extends FileFilter {
|
||||||
|
|
||||||
private final List<Frequency> frequencies;
|
private final List<Frequency> frequencies;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create the FrequencySubFilter
|
* Create the FrequencyFilter
|
||||||
*
|
*
|
||||||
* @param frequencies List of frequencies that will pass the filter
|
* @param frequencies List of frequencies that will pass the filter
|
||||||
*/
|
*/
|
||||||
FrequencySubFilter(List<Frequency> frequencies) {
|
FrequencyFilter(List<Frequency> frequencies) {
|
||||||
this.frequencies = frequencies;
|
this.frequencies = frequencies;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -486,50 +500,47 @@ class FileSearchFiltering {
|
|||||||
throw new FileSearchException("Can not run Frequency filter with null Central Repository DB"); // NON-NLS
|
throw new FileSearchException("Can not run Frequency filter with null Central Repository DB"); // NON-NLS
|
||||||
}
|
}
|
||||||
|
|
||||||
// For the moment, we have to have run some kind of SQL filter before getting to this point.
|
// We have to have run some kind of SQL filter before getting to this point,
|
||||||
// TODO what we should do if this is the only filter?
|
// and should have checked afterward to see if the results were empty.
|
||||||
if ( ! currentResults.isEmpty()) {
|
if (currentResults.isEmpty()) {
|
||||||
|
throw new FileSearchException("Can not run on empty list"); // NON-NLS
|
||||||
// We can try to make this more efficient later - for now, check the frequency of each file individually
|
|
||||||
List<ResultFile> frequencyResults = new ArrayList<>();
|
|
||||||
for (ResultFile file : currentResults) {
|
|
||||||
try {
|
|
||||||
if (file.getAbstractFile().getMd5Hash() != null && ! file.getAbstractFile().getMd5Hash().isEmpty()) {
|
|
||||||
CorrelationAttributeInstance.Type attributeType = centralRepoDb.getCorrelationTypeById(CorrelationAttributeInstance.FILES_TYPE_ID);
|
|
||||||
long count = centralRepoDb.getCountUniqueCaseDataSourceTuplesHavingTypeValue(attributeType, file.getAbstractFile().getMd5Hash());
|
|
||||||
file.setFrequency(Frequency.fromCount(count));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (frequencies.contains(file.getFrequency())) {
|
|
||||||
frequencyResults.add(file);
|
|
||||||
}
|
|
||||||
} catch (EamDbException | CorrelationAttributeNormalizationException ex) {
|
|
||||||
throw new FileSearchException("Error querying central repository", ex); // NON-NLS
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return frequencyResults;
|
|
||||||
} else {
|
|
||||||
// We need to load all files with the specified frequency - this will be essentially the same
|
|
||||||
// as a common properties search. TODO - do we want to do this or throw an error?
|
|
||||||
return currentResults;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// We can try to make this more efficient later - for now, check the frequency of each file individually
|
||||||
|
List<ResultFile> frequencyResults = new ArrayList<>();
|
||||||
|
for (ResultFile file : currentResults) {
|
||||||
|
try {
|
||||||
|
if (file.getAbstractFile().getMd5Hash() != null && ! file.getAbstractFile().getMd5Hash().isEmpty()) {
|
||||||
|
CorrelationAttributeInstance.Type attributeType = centralRepoDb.getCorrelationTypeById(CorrelationAttributeInstance.FILES_TYPE_ID);
|
||||||
|
long count = centralRepoDb.getCountUniqueCaseDataSourceTuplesHavingTypeValue(attributeType, file.getAbstractFile().getMd5Hash());
|
||||||
|
file.setFrequency(Frequency.fromCount(count));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (frequencies.contains(file.getFrequency())) {
|
||||||
|
frequencyResults.add(file);
|
||||||
|
}
|
||||||
|
} catch (EamDbException | CorrelationAttributeNormalizationException ex) {
|
||||||
|
throw new FileSearchException("Error querying central repository", ex); // NON-NLS
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return frequencyResults;
|
||||||
}
|
}
|
||||||
|
|
||||||
@NbBundle.Messages({
|
@NbBundle.Messages({
|
||||||
"# {0} - filters",
|
"# {0} - filters",
|
||||||
"FileSearchFiltering.FrequencySubFilter.desc=Files with frequency: {0}",
|
"FileSearchFiltering.FrequencyFilter.desc=Files with frequency: {0}",
|
||||||
"FileSearchFiltering.FrequencySubFilter.or= or ",
|
"FileSearchFiltering.FrequencyFilter.or= or ",
|
||||||
})
|
})
|
||||||
@Override
|
@Override
|
||||||
String getDesc() {
|
String getDesc() {
|
||||||
String desc = ""; // NON-NLS
|
String desc = ""; // NON-NLS
|
||||||
for (Frequency freq : frequencies) {
|
for (Frequency freq : frequencies) {
|
||||||
if ( ! desc.isEmpty()) {
|
if ( ! desc.isEmpty()) {
|
||||||
desc += Bundle.FileSearchFiltering_FrequencySubFilter_or();
|
desc += Bundle.FileSearchFiltering_FrequencyFilter_or();
|
||||||
}
|
}
|
||||||
desc += freq.name();
|
desc += freq.name();
|
||||||
}
|
}
|
||||||
return Bundle.FileSearchFiltering_FrequencySubFilter_desc(this);
|
return Bundle.FileSearchFiltering_FrequencyFilter_desc(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
package org.sleuthkit.autopsy.newpackage;
|
package org.sleuthkit.autopsy.newpackage;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
import javax.swing.JDialog;
|
||||||
import org.sleuthkit.autopsy.centralrepository.datamodel.EamDb;
|
import org.sleuthkit.autopsy.centralrepository.datamodel.EamDb;
|
||||||
import org.openide.awt.ActionID;
|
import org.openide.awt.ActionID;
|
||||||
import org.openide.awt.ActionReference;
|
import org.openide.awt.ActionReference;
|
||||||
@ -48,33 +49,86 @@ public final class FileSearchTestAction extends CallableSystemAction {
|
|||||||
@Override
|
@Override
|
||||||
@SuppressWarnings("fallthrough")
|
@SuppressWarnings("fallthrough")
|
||||||
public void performAction() {
|
public void performAction() {
|
||||||
|
|
||||||
|
EamDb crDb = null;
|
||||||
|
if (EamDb.isEnabled()) {
|
||||||
|
try {
|
||||||
|
crDb = EamDb.getInstance();
|
||||||
|
} catch (Exception ex) {
|
||||||
|
ex.printStackTrace();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
FileSearchDialog dialog = new FileSearchDialog(null, true);
|
||||||
|
|
||||||
|
while ( ! dialog.searchCancelled()) {
|
||||||
|
|
||||||
|
// Display the dialog
|
||||||
|
dialog.setVisible(true);
|
||||||
|
|
||||||
|
// Get the selected filters
|
||||||
|
List<FileSearchFiltering.FileFilter> filters = dialog.getFilters();
|
||||||
|
|
||||||
|
// Get the grouping attribute and group sorting method
|
||||||
|
FileSearch.AttributeType groupingAttr = dialog.getGroupingAttribute();
|
||||||
|
FileGroup.GroupSortingAlgorithm groupSortAlgorithm = dialog.getGroupSortingMethod();
|
||||||
|
|
||||||
|
// Get the file sorting method
|
||||||
|
FileSorter.SortingMethod fileSort = dialog.getFileSortingMethod();
|
||||||
|
|
||||||
|
try {
|
||||||
|
|
||||||
|
// Make a list of attributes that we want to add values for. Eventually this can be based on user input but
|
||||||
|
// for now just add all of them.
|
||||||
|
List<FileSearch.AttributeType> attributesNeededForSorting = Arrays.asList(new FileSearch.DataSourceAttribute(),
|
||||||
|
new FileSearch.FileSizeAttribute(), new FileSearch.FileTypeAttribute(), new FileSearch.FrequencyAttribute(),
|
||||||
|
new FileSearch.KeywordListAttribute(), new FileSearch.ParentPathAttribute());
|
||||||
|
|
||||||
|
FileSearch.runFileSearch(filters,
|
||||||
|
groupingAttr,
|
||||||
|
groupSortAlgorithm,
|
||||||
|
fileSort,
|
||||||
|
attributesNeededForSorting,
|
||||||
|
Case.getCurrentCase().getSleuthkitCase(), crDb);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} catch (Exception ex) {
|
||||||
|
ex.printStackTrace();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
System.out.println("\n#########################\nTesting file search!!!");
|
System.out.println("\n#########################\nTesting file search!!!");
|
||||||
|
|
||||||
// Set up all the test filters
|
// Set up all the test filters
|
||||||
FileSearchFiltering.FileFilter size_medSmallXS = new FileSearchFiltering.SizeSubFilter(Arrays.asList(FileSearchData.FileSize.MEDIUM, FileSearchData.FileSize.SMALL, FileSearchData.FileSize.XS));
|
FileSearchFiltering.FileFilter size_medSmallXS = new FileSearchFiltering.SizeFilter(Arrays.asList(FileSearchData.FileSize.MEDIUM, FileSearchData.FileSize.SMALL, FileSearchData.FileSize.XS));
|
||||||
FileSearchFiltering.FileFilter size_XL = new FileSearchFiltering.SizeSubFilter(Arrays.asList(FileSearchData.FileSize.XL));
|
FileSearchFiltering.FileFilter size_XL = new FileSearchFiltering.SizeFilter(Arrays.asList(FileSearchData.FileSize.XL));
|
||||||
FileSearchFiltering.FileFilter size_largeXL = new FileSearchFiltering.SizeSubFilter(Arrays.asList(FileSearchData.FileSize.LARGE, FileSearchData.FileSize.XL));
|
FileSearchFiltering.FileFilter size_largeXL = new FileSearchFiltering.SizeFilter(Arrays.asList(FileSearchData.FileSize.LARGE, FileSearchData.FileSize.XL));
|
||||||
FileSearchFiltering.FileFilter size_medLargeXL = new FileSearchFiltering.SizeSubFilter(Arrays.asList(FileSearchData.FileSize.MEDIUM, FileSearchData.FileSize.LARGE, FileSearchData.FileSize.XL));
|
FileSearchFiltering.FileFilter size_medLargeXL = new FileSearchFiltering.SizeFilter(Arrays.asList(FileSearchData.FileSize.MEDIUM, FileSearchData.FileSize.LARGE, FileSearchData.FileSize.XL));
|
||||||
|
|
||||||
FileSearchFiltering.FileFilter kw_alphaBeta = new FileSearchFiltering.KeywordListSubFilter(Arrays.asList("Alpha", "Beta"));
|
FileSearchFiltering.FileFilter kw_alphaBeta = new FileSearchFiltering.KeywordListFilter(Arrays.asList("Alpha", "Beta"));
|
||||||
FileSearchFiltering.FileFilter kw_alpha = new FileSearchFiltering.KeywordListSubFilter(Arrays.asList("Alpha"));
|
FileSearchFiltering.FileFilter kw_alpha = new FileSearchFiltering.KeywordListFilter(Arrays.asList("Alpha"));
|
||||||
|
|
||||||
FileSearchFiltering.FileFilter freq_uniqueRare = new FileSearchFiltering.FrequencySubFilter(Arrays.asList(FileSearchData.Frequency.UNIQUE, FileSearchData.Frequency.RARE));
|
FileSearchFiltering.FileFilter freq_uniqueRare = new FileSearchFiltering.FrequencyFilter(Arrays.asList(FileSearchData.Frequency.UNIQUE, FileSearchData.Frequency.RARE));
|
||||||
|
|
||||||
FileSearchFiltering.FileFilter path_II = new FileSearchFiltering.ParentSubFilter(Arrays.asList(new FileSearchFiltering.ParentSearchTerm("II", false)));
|
FileSearchFiltering.FileFilter path_II = new FileSearchFiltering.ParentFilter(Arrays.asList(new FileSearchFiltering.ParentSearchTerm("II", false)));
|
||||||
FileSearchFiltering.FileFilter path_IIfolderA = new FileSearchFiltering.ParentSubFilter(Arrays.asList(new FileSearchFiltering.ParentSearchTerm("II", false),
|
FileSearchFiltering.FileFilter path_IIfolderA = new FileSearchFiltering.ParentFilter(Arrays.asList(new FileSearchFiltering.ParentSearchTerm("II", false),
|
||||||
new FileSearchFiltering.ParentSearchTerm("/Rare in CR/Folder A/", true)));
|
new FileSearchFiltering.ParentSearchTerm("/Rare in CR/Folder A/", true)));
|
||||||
|
|
||||||
FileSearchFiltering.FileFilter type_video = new FileSearchFiltering.FileTypeSubFilter(Arrays.asList(FileTypeUtils.FileTypeCategory.VIDEO));
|
FileSearchFiltering.FileFilter type_video = new FileSearchFiltering.FileTypeFilter(Arrays.asList(FileSearchData.FileType.VIDEO));
|
||||||
FileSearchFiltering.FileFilter type_imageAudio = new FileSearchFiltering.FileTypeSubFilter(Arrays.asList(FileTypeUtils.FileTypeCategory.IMAGE,
|
FileSearchFiltering.FileFilter type_imageAudio = new FileSearchFiltering.FileTypeFilter(Arrays.asList(FileSearchData.FileType.IMAGE,
|
||||||
FileTypeUtils.FileTypeCategory.AUDIO));
|
FileSearchData.FileType.AUDIO));
|
||||||
FileSearchFiltering.FileFilter type_image = new FileSearchFiltering.FileTypeSubFilter(Arrays.asList(FileTypeUtils.FileTypeCategory.IMAGE));
|
FileSearchFiltering.FileFilter type_image = new FileSearchFiltering.FileTypeFilter(Arrays.asList(FileSearchData.FileType.IMAGE));
|
||||||
FileSearchFiltering.FileFilter type_doc = new FileSearchFiltering.FileTypeSubFilter(Arrays.asList(FileTypeUtils.FileTypeCategory.DOCUMENTS));
|
FileSearchFiltering.FileFilter type_doc = new FileSearchFiltering.FileTypeFilter(Arrays.asList(FileSearchData.FileType.DOCUMENTS));
|
||||||
|
|
||||||
FileSearchFiltering.FileFilter ds_46 = null;
|
FileSearchFiltering.FileFilter ds_46 = null;
|
||||||
try {
|
try {
|
||||||
DataSource ds = Case.getCurrentCase().getSleuthkitCase().getDataSource(46);
|
DataSource ds = Case.getCurrentCase().getSleuthkitCase().getDataSource(46);
|
||||||
ds_46 = new FileSearchFiltering.DataSourceSubFilter(Arrays.asList(ds));
|
ds_46 = new FileSearchFiltering.DataSourceFilter(Arrays.asList(ds));
|
||||||
} catch (Exception ex) {
|
} catch (Exception ex) {
|
||||||
ex.printStackTrace();
|
ex.printStackTrace();
|
||||||
return;
|
return;
|
||||||
@ -88,7 +142,8 @@ public final class FileSearchTestAction extends CallableSystemAction {
|
|||||||
List<FileSearchFiltering.FileFilter> filters = new ArrayList<>();
|
List<FileSearchFiltering.FileFilter> filters = new ArrayList<>();
|
||||||
filters.add(size_medSmallXS);
|
filters.add(size_medSmallXS);
|
||||||
//filters.add(kw_alpha);
|
//filters.add(kw_alpha);
|
||||||
//filters.add(freq_uniqueRare);
|
filters.add(freq_uniqueRare);
|
||||||
|
//filters.add(path_IIfolderA);
|
||||||
|
|
||||||
// Choose grouping attribute
|
// Choose grouping attribute
|
||||||
//FileSearch.AttributeType groupingAttr = new FileSearch.FileTypeAttribute();
|
//FileSearch.AttributeType groupingAttr = new FileSearch.FileTypeAttribute();
|
||||||
@ -105,14 +160,7 @@ public final class FileSearchTestAction extends CallableSystemAction {
|
|||||||
// Choose file sorting method
|
// Choose file sorting method
|
||||||
FileSorter.SortingMethod fileSort = FileSorter.SortingMethod.BY_FILE_SIZE;
|
FileSorter.SortingMethod fileSort = FileSorter.SortingMethod.BY_FILE_SIZE;
|
||||||
|
|
||||||
EamDb crDb = null;
|
|
||||||
if (EamDb.isEnabled()) {
|
|
||||||
try {
|
|
||||||
crDb = EamDb.getInstance();
|
|
||||||
} catch (Exception ex) {
|
|
||||||
ex.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|
||||||
|
@ -21,6 +21,7 @@ package org.sleuthkit.autopsy.newpackage;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import org.openide.util.NbBundle;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class used to sort ResultFiles using the supplied method.
|
* Class used to sort ResultFiles using the supplied method.
|
||||||
@ -217,13 +218,32 @@ class FileSorter implements Comparator<ResultFile> {
|
|||||||
/**
|
/**
|
||||||
* Enum for selecting the primary method for sorting result files.
|
* Enum for selecting the primary method for sorting result files.
|
||||||
*/
|
*/
|
||||||
|
@NbBundle.Messages({
|
||||||
|
"FileSorter.SortingMethod.datasource.displayName=By data source",
|
||||||
|
"FileSorter.SortingMethod.filename.displayName=By file name",
|
||||||
|
"FileSorter.SortingMethod.filesize.displayName=By file size",
|
||||||
|
"FileSorter.SortingMethod.filetype.displayName=By file type",
|
||||||
|
"FileSorter.SortingMethod.frequency.displayName=By central repo frequency",
|
||||||
|
"FileSorter.SortingMethod.keywordlist.displayName=By keyword list names",
|
||||||
|
"FileSorter.SortingMethod.parent.displayName=By parent path"})
|
||||||
enum SortingMethod {
|
enum SortingMethod {
|
||||||
BY_DATA_SOURCE, // Sort in increasing order of data source ID
|
BY_FILE_NAME(Bundle.FileSorter_SortingMethod_filename_displayName()), // Sort alphabetically by file name
|
||||||
BY_FILE_NAME, // Sort alphabetically by file name
|
BY_DATA_SOURCE(Bundle.FileSorter_SortingMethod_datasource_displayName()), // Sort in increasing order of data source ID
|
||||||
BY_FILE_SIZE, // Sort in decreasing order of size
|
BY_FILE_SIZE(Bundle.FileSorter_SortingMethod_filesize_displayName()), // Sort in decreasing order of size
|
||||||
BY_FILE_TYPE, // Sort in order of file type (defined in FileType enum), with secondary sort on MIME type
|
BY_FILE_TYPE(Bundle.FileSorter_SortingMethod_filetype_displayName()), // Sort in order of file type (defined in FileType enum), with secondary sort on MIME type
|
||||||
BY_FREQUENCY, // Sort by decreasing rarity in the central repository
|
BY_FREQUENCY(Bundle.FileSorter_SortingMethod_frequency_displayName()), // Sort by decreasing rarity in the central repository
|
||||||
BY_KEYWORD_LIST_NAMES, // Sort alphabetically by list of keyword list names found
|
BY_KEYWORD_LIST_NAMES(Bundle.FileSorter_SortingMethod_keywordlist_displayName()), // Sort alphabetically by list of keyword list names found
|
||||||
BY_PARENT_PATH; // Sort alphabetically by path
|
BY_PARENT_PATH(Bundle.FileSorter_SortingMethod_parent_displayName()); // Sort alphabetically by path
|
||||||
|
|
||||||
|
private final String displayName;
|
||||||
|
|
||||||
|
SortingMethod(String displayName) {
|
||||||
|
this.displayName = displayName;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return displayName;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user