mirror of
https://github.com/overcuriousity/autopsy-flatpak.git
synced 2025-07-12 16:06:15 +00:00
replace ImmutableSet with regular Set
This commit is contained in:
parent
a7718a4435
commit
c995069b17
@ -220,15 +220,10 @@ AddImageWizardIngestConfigPanel.dsProcDone.errs.text=*Errors encountered in addi
|
|||||||
AddImageWizardIngestConfigVisual.getName.text=Configure Ingest Modules
|
AddImageWizardIngestConfigVisual.getName.text=Configure Ingest Modules
|
||||||
AddImageWizardIterator.stepXofN=Step {0} of {1}
|
AddImageWizardIterator.stepXofN=Step {0} of {1}
|
||||||
AddLocalFilesTask.localFileAdd.progress.text=Adding: {0}/{1}
|
AddLocalFilesTask.localFileAdd.progress.text=Adding: {0}/{1}
|
||||||
Case.getCurCase.exception.noneOpen=Cannot get the current case; there is no case open\!
|
Case.getCurCase.exception.noneOpen=Cannot get the current case; there is no case open!
|
||||||
Case.open.msgDlg.updated.msg=Updated case database schema.\nA backup copy of the database with the following path has been made:\n {0}
|
Case.open.msgDlg.updated.msg=Updated case database schema.\nA backup copy of the database with the following path has been made:\n {0}
|
||||||
Case.open.msgDlg.updated.title=Case Database Schema Update
|
Case.open.msgDlg.updated.title=Case Database Schema Update
|
||||||
Case.checkImgExist.confDlg.doesntExist.msg=One of the images associated with \n\
|
Case.checkImgExist.confDlg.doesntExist.msg=One of the images associated with \nthis case are missing. Would you like to search for them now?\nPreviously, the image was located at:\n{0}\nPlease note that you will still be able to browse directories and generate reports\nif you choose No, but you will not be able to view file content or run the ingest process.
|
||||||
this case are missing. Would you like to search for them now?\n\
|
|
||||||
Previously, the image was located at:\n\
|
|
||||||
{0}\n\
|
|
||||||
Please note that you will still be able to browse directories and generate reports\n\
|
|
||||||
if you choose No, but you will not be able to view file content or run the ingest process.
|
|
||||||
Case.checkImgExist.confDlg.doesntExist.title=Missing Image
|
Case.checkImgExist.confDlg.doesntExist.title=Missing Image
|
||||||
Case.addImg.exception.msg=Error adding image to the case
|
Case.addImg.exception.msg=Error adding image to the case
|
||||||
Case.updateCaseName.exception.msg=Error while trying to update the case name.
|
Case.updateCaseName.exception.msg=Error while trying to update the case name.
|
||||||
@ -247,12 +242,9 @@ Case.GetCaseTypeGivenPath.Failure=Unable to get case type
|
|||||||
Case.metaDataFileCorrupt.exception.msg=The case metadata file (.aut) is corrupted.
|
Case.metaDataFileCorrupt.exception.msg=The case metadata file (.aut) is corrupted.
|
||||||
Case.deleteReports.deleteFromDiskException.log.msg=Unable to delete the report from the disk.
|
Case.deleteReports.deleteFromDiskException.log.msg=Unable to delete the report from the disk.
|
||||||
Case.deleteReports.deleteFromDiskException.msg=Unable to delete the report {0} from the disk.\nYou may manually delete it from {1}
|
Case.deleteReports.deleteFromDiskException.msg=Unable to delete the report {0} from the disk.\nYou may manually delete it from {1}
|
||||||
CaseDeleteAction.closeConfMsg.text=Are you sure want to close and delete this case? \n\
|
CaseDeleteAction.closeConfMsg.text=Are you sure want to close and delete this case? \nCase Name: {0}\nCase Directory: {1}
|
||||||
Case Name: {0}\n\
|
|
||||||
Case Directory: {1}
|
|
||||||
CaseDeleteAction.closeConfMsg.title=Warning: Closing the Current Case
|
CaseDeleteAction.closeConfMsg.title=Warning: Closing the Current Case
|
||||||
CaseDeleteAction.msgDlg.fileInUse.msg=The delete action cannot be fully completed because the folder or file in it is open by another program.\n\n\
|
CaseDeleteAction.msgDlg.fileInUse.msg=The delete action cannot be fully completed because the folder or file in it is open by another program.\n\nClose the folder and file and try again or you can delete the case manually.
|
||||||
Close the folder and file and try again or you can delete the case manually.
|
|
||||||
CaseDeleteAction.msgDlg.fileInUse.title=Error: Folder In Use
|
CaseDeleteAction.msgDlg.fileInUse.title=Error: Folder In Use
|
||||||
CaseDeleteAction.msgDlg.caseDelete.msg=Case {0} has been deleted.
|
CaseDeleteAction.msgDlg.caseDelete.msg=Case {0} has been deleted.
|
||||||
CaseOpenAction.autFilter.title={0} Case File ( {1})
|
CaseOpenAction.autFilter.title={0} Case File ( {1})
|
||||||
@ -284,8 +276,7 @@ NewCaseWizardAction.databaseProblem1.text=Cannot open database. Cancelling case
|
|||||||
NewCaseWizardAction.databaseProblem2.text=Error
|
NewCaseWizardAction.databaseProblem2.text=Error
|
||||||
NewCaseWizardPanel1.validate.errMsg.invalidSymbols=The Case Name cannot contain any of the following symbols: \\ / : * ? " < > |
|
NewCaseWizardPanel1.validate.errMsg.invalidSymbols=The Case Name cannot contain any of the following symbols: \\ / : * ? " < > |
|
||||||
NewCaseWizardPanel1.validate.errMsg.dirExists=Case directory ''{0}'' already exists.
|
NewCaseWizardPanel1.validate.errMsg.dirExists=Case directory ''{0}'' already exists.
|
||||||
NewCaseWizardPanel1.validate.confMsg.createDir.msg=The base directory "{0}" does not exist. \n\n\
|
NewCaseWizardPanel1.validate.confMsg.createDir.msg=The base directory "{0}" does not exist. \n\nDo you want to create that directory?
|
||||||
Do you want to create that directory?
|
|
||||||
NewCaseWizardPanel1.validate.confMsg.createDir.title=Create directory
|
NewCaseWizardPanel1.validate.confMsg.createDir.title=Create directory
|
||||||
NewCaseWizardPanel1.validate.errMsg.cantCreateParDir.msg=Error: Could not create case parent directory {0}
|
NewCaseWizardPanel1.validate.errMsg.cantCreateParDir.msg=Error: Could not create case parent directory {0}
|
||||||
NewCaseWizardPanel1.validate.errMsg.prevCreateBaseDir.msg=Prevented from creating base directory {0}
|
NewCaseWizardPanel1.validate.errMsg.prevCreateBaseDir.msg=Prevented from creating base directory {0}
|
||||||
@ -321,15 +312,15 @@ StartupWindow.title.text=Welcome
|
|||||||
UpdateRecentCases.menuItem.clearRecentCases.text=Clear Recent Cases
|
UpdateRecentCases.menuItem.clearRecentCases.text=Clear Recent Cases
|
||||||
UpdateRecentCases.menuItem.empty=-Empty-
|
UpdateRecentCases.menuItem.empty=-Empty-
|
||||||
AddImageWizardIngestConfigPanel.CANCEL_BUTTON.text=Cancel
|
AddImageWizardIngestConfigPanel.CANCEL_BUTTON.text=Cancel
|
||||||
NewCaseVisualPanel1.CaseFolderOnCDriveError.text=Warning: Path to multi-user case folder is on \"C:\" drive
|
NewCaseVisualPanel1.CaseFolderOnCDriveError.text=Warning: Path to multi-user case folder is on "C:" drive
|
||||||
NewCaseVisualPanel1.CaseFolderOnInternalDriveWindowsError.text=Warning: Path to case folder is on \"C:\" drive. Case folder is created on the target system
|
NewCaseVisualPanel1.CaseFolderOnInternalDriveWindowsError.text=Warning: Path to case folder is on "C:" drive. Case folder is created on the target system
|
||||||
NewCaseVisualPanel1.CaseFolderOnInternalDriveLinuxError.text=Warning: Path to case folder is on the target system. Create case folder in mounted drive.
|
NewCaseVisualPanel1.CaseFolderOnInternalDriveLinuxError.text=Warning: Path to case folder is on the target system. Create case folder in mounted drive.
|
||||||
CollaborationMonitor.addingDataSourceStatus.msg={0} adding data source
|
CollaborationMonitor.addingDataSourceStatus.msg={0} adding data source
|
||||||
CollaborationMonitor.analyzingDataSourceStatus.msg={0} analyzing {1}
|
CollaborationMonitor.analyzingDataSourceStatus.msg={0} analyzing {1}
|
||||||
MissingImageDialog.lbWarning.text=
|
MissingImageDialog.lbWarning.text=
|
||||||
MissingImageDialog.lbWarning.toolTipText=
|
MissingImageDialog.lbWarning.toolTipText=
|
||||||
NewCaseVisualPanel1.caseParentDirWarningLabel.text=
|
NewCaseVisualPanel1.caseParentDirWarningLabel.text=
|
||||||
NewCaseVisualPanel1.multiUserCaseRadioButton.text=Multi-user
|
NewCaseVisualPanel1.multiUserCaseRadioButton.text=Multi-user\t\t
|
||||||
NewCaseVisualPanel1.singleUserCaseRadioButton.text=Single-user
|
NewCaseVisualPanel1.singleUserCaseRadioButton.text=Single-user
|
||||||
NewCaseVisualPanel1.caseTypeLabel.text=Case Type:
|
NewCaseVisualPanel1.caseTypeLabel.text=Case Type:
|
||||||
SingleUserCaseConverter.BadDatabaseFileName=Database file does not exist!
|
SingleUserCaseConverter.BadDatabaseFileName=Database file does not exist!
|
||||||
|
@ -5,10 +5,7 @@ CentralRepoCommentDialog.title.addEditCentralRepoComment=Add/Edit Central Reposi
|
|||||||
OpenIDE-Module-Name=Central Repository
|
OpenIDE-Module-Name=Central Repository
|
||||||
OpenIDE-Module-Display-Category=Ingest Module
|
OpenIDE-Module-Display-Category=Ingest Module
|
||||||
OpenIDE-Module-Short-Description=Correlation Engine Ingest Module
|
OpenIDE-Module-Short-Description=Correlation Engine Ingest Module
|
||||||
OpenIDE-Module-Long-Description=\
|
OpenIDE-Module-Long-Description=Correlation Engine ingest module and central database. \n\nThe Correlation Engine ingest module stores attributes of artifacts matching selected correlation types into a central database.\nStored attributes are used in future cases to correlate and analyzes files and artifacts during ingest.
|
||||||
Correlation Engine ingest module and central database. \n\n\
|
|
||||||
The Correlation Engine ingest module stores attributes of artifacts matching selected correlation types into a central database.\n\
|
|
||||||
Stored attributes are used in future cases to correlate and analyzes files and artifacts during ingest.
|
|
||||||
CentralRepoCommentDialog.commentLabel.text=Comment:
|
CentralRepoCommentDialog.commentLabel.text=Comment:
|
||||||
CentralRepoCommentDialog.okButton.text=&OK
|
CentralRepoCommentDialog.okButton.text=&OK
|
||||||
CentralRepoCommentDialog.cancelButton.text=C&ancel
|
CentralRepoCommentDialog.cancelButton.text=C&ancel
|
||||||
|
@ -3,13 +3,7 @@ Installer.closing.confirmationDialog.title=Ingest is Running
|
|||||||
# {0} - exception message
|
# {0} - exception message
|
||||||
Installer.closing.messageBox.caseCloseExceptionMessage=Error closing case: {0}
|
Installer.closing.messageBox.caseCloseExceptionMessage=Error closing case: {0}
|
||||||
OpenIDE-Module-Display-Category=Infrastructure
|
OpenIDE-Module-Display-Category=Infrastructure
|
||||||
OpenIDE-Module-Long-Description=\
|
OpenIDE-Module-Long-Description=This is the core Autopsy module.\n\nThe module contains the core components needed for the bare application to run; the RCP platform, windowing GUI, sleuthkit bindings, datamodel / storage, explorer, result viewers, content viewers, ingest framework, reporting, and core tools, such as the file search.\n\nThe framework included in the module contains APIs for developing modules for ingest, viewers and reporting. The modules can be deployed as Plugins using the Autopsy plugin installer.\nThis module should not be uninstalled - without it, Autopsy will not run.\n\nFor more information, see http://www.sleuthkit.org/autopsy/
|
||||||
This is the core Autopsy module.\n\n\
|
|
||||||
The module contains the core components needed for the bare application to run; the RCP platform, windowing GUI, sleuthkit bindings, datamodel / storage, explorer, result viewers, content viewers, ingest framework, reporting, and core tools, such as the file search.\n\n\
|
|
||||||
The framework included in the module contains APIs for developing modules for ingest, viewers and reporting. \
|
|
||||||
The modules can be deployed as Plugins using the Autopsy plugin installer.\n\
|
|
||||||
This module should not be uninstalled - without it, Autopsy will not run.\n\n\
|
|
||||||
For more information, see http://www.sleuthkit.org/autopsy/
|
|
||||||
OpenIDE-Module-Name=Autopsy-Core
|
OpenIDE-Module-Name=Autopsy-Core
|
||||||
OpenIDE-Module-Short-Description=Autopsy Core Module
|
OpenIDE-Module-Short-Description=Autopsy Core Module
|
||||||
org_sleuthkit_autopsy_core_update_center=http://sleuthkit.org/autopsy/updates.xml
|
org_sleuthkit_autopsy_core_update_center=http://sleuthkit.org/autopsy/updates.xml
|
||||||
|
@ -63,9 +63,9 @@ DataContentViewerHex.pageLabel2.text=Page
|
|||||||
DataContentViewerString.pageLabel2.text=Page
|
DataContentViewerString.pageLabel2.text=Page
|
||||||
|
|
||||||
# Product Information panel
|
# Product Information panel
|
||||||
LBL_Description=<div style=\"font-size: 12pt; font-family: Verdana, 'Verdana CE', Arial, 'Arial CE', 'Lucida Grande CE', lucida, 'Helvetica CE', sans-serif;\">\n <b>Product Version:</b> {0} ({9}) <br><b>Sleuth Kit Version:</b> {7} <br><b>Netbeans RCP Build:</b> {8} <br> <b>Java:</b> {1}; {2}<br> <b>System:</b> {3}; {4}; {5}<br><b>Userdir:</b> {6}</div>
|
LBL_Description=<div style="font-size: 12pt; font-family: Verdana, 'Verdana CE', Arial, 'Arial CE', 'Lucida Grande CE', lucida, 'Helvetica CE', sans-serif;">\n <b>Product Version:</b> {0} ({9}) <br><b>Sleuth Kit Version:</b> {7} <br><b>Netbeans RCP Build:</b> {8} <br> <b>Java:</b> {1}; {2}<br> <b>System:</b> {3}; {4}; {5}<br><b>Userdir:</b> {6}</div>
|
||||||
Format_OperatingSystem_Value={0} version {1} running on {2}
|
Format_OperatingSystem_Value={0} version {1} running on {2}
|
||||||
LBL_Copyright=<div style\="font-size: 12pt; font-family: Verdana, 'Verdana CE', Arial, 'Arial CE', 'Lucida Grande CE', lucida, 'Helvetica CE', sans-serif; ">Autopsy™ is a digital forensics platform based on The Sleuth Kit™ and other tools. <br><ul><li>General Information: <a style\="color: \#1E2A60;" href\="http://www.sleuthkit.org">http://www.sleuthkit.org</a>.</li><li>Training: <a style\="color: \#1E2A60;" href\="http://www.basistech.com/autopsy-training">http://www.basistech.com/autopsy-training</a></li><li>Commercial Support: <a style\="color: \#1E2A60;" href\="http://www.basistech.com/digital-forensics/autopsy/support/">http://www.basistech.com/digital-forensics/autopsy/support/</a></li></ul>Copyright © 2003-2018. </div>
|
LBL_Copyright=<div style="font-size: 12pt; font-family: Verdana, 'Verdana CE', Arial, 'Arial CE', 'Lucida Grande CE', lucida, 'Helvetica CE', sans-serif; ">Autopsy™ is a digital forensics platform based on The Sleuth Kit™ and other tools. <br><ul><li>General Information: <a style="color: #1E2A60;" href="http://www.sleuthkit.org">http://www.sleuthkit.org</a>.</li><li>Training: <a style="color: #1E2A60;" href="http://www.basistech.com/autopsy-training">http://www.basistech.com/autopsy-training</a></li><li>Commercial Support: <a style="color: #1E2A60;" href="http://www.basistech.com/digital-forensics/autopsy/support/">http://www.basistech.com/digital-forensics/autopsy/support/</a></li></ul>Copyright © 2003-2018. </div>
|
||||||
SortChooser.dialogTitle=Choose Sort Criteria
|
SortChooser.dialogTitle=Choose Sort Criteria
|
||||||
ThumbnailViewChildren.progress.cancelling=(Cancelling)
|
ThumbnailViewChildren.progress.cancelling=(Cancelling)
|
||||||
# {0} - file name
|
# {0} - file name
|
||||||
@ -102,7 +102,7 @@ DataResultViewerThumbnail.pageNextButton.text=
|
|||||||
DataResultViewerThumbnail.imagesLabel.text=Images:
|
DataResultViewerThumbnail.imagesLabel.text=Images:
|
||||||
DataResultViewerThumbnail.imagesRangeLabel.text=-
|
DataResultViewerThumbnail.imagesRangeLabel.text=-
|
||||||
DataResultViewerThumbnail.pageNumLabel.text=-
|
DataResultViewerThumbnail.pageNumLabel.text=-
|
||||||
DataResultViewerThumbnail.filePathLabel.text=\ \ \
|
DataResultViewerThumbnail.filePathLabel.text=\
|
||||||
DataResultViewerThumbnail.goToPageLabel.text=Go to Page:
|
DataResultViewerThumbnail.goToPageLabel.text=Go to Page:
|
||||||
DataResultViewerThumbnail.goToPageField.text=
|
DataResultViewerThumbnail.goToPageField.text=
|
||||||
AdvancedConfigurationDialog.cancelButton.text=Cancel
|
AdvancedConfigurationDialog.cancelButton.text=Cancel
|
||||||
|
@ -23,9 +23,7 @@ PlatformUtil.getProcVmUsed.sigarNotInit.msg=Cannot get virt mem used, sigar not
|
|||||||
PlatformUtil.getProcVmUsed.gen.msg=Cannot get virt mem used, {0}
|
PlatformUtil.getProcVmUsed.gen.msg=Cannot get virt mem used, {0}
|
||||||
PlatformUtil.getJvmMemInfo.usageText=JVM heap usage: {0}, JVM non-heap usage: {1}
|
PlatformUtil.getJvmMemInfo.usageText=JVM heap usage: {0}, JVM non-heap usage: {1}
|
||||||
PlatformUtil.getPhysicalMemInfo.usageText=Physical memory usage (max, total, free): {0}, {1}, {2}
|
PlatformUtil.getPhysicalMemInfo.usageText=Physical memory usage (max, total, free): {0}, {1}, {2}
|
||||||
PlatformUtil.getAllMemUsageInfo.usageText={0}\n\
|
PlatformUtil.getAllMemUsageInfo.usageText={0}\n{1}\nProcess Virtual Memory: {2}
|
||||||
{1}\n\
|
|
||||||
Process Virtual Memory: {2}
|
|
||||||
# {0} - file name
|
# {0} - file name
|
||||||
ReadImageTask.mesageText=Reading image: {0}
|
ReadImageTask.mesageText=Reading image: {0}
|
||||||
StringExtract.illegalStateException.cannotInit.msg=Unicode table not properly initialized, cannot instantiate StringExtract
|
StringExtract.illegalStateException.cannotInit.msg=Unicode table not properly initialized, cannot instantiate StringExtract
|
||||||
|
@ -258,10 +258,10 @@ ImageNode.getActions.viewInNewWin.text=View in New Window
|
|||||||
ImageNode.createSheet.name.name=Name
|
ImageNode.createSheet.name.name=Name
|
||||||
ImageNode.createSheet.name.displayName=Name
|
ImageNode.createSheet.name.displayName=Name
|
||||||
ImageNode.createSheet.name.desc=no description
|
ImageNode.createSheet.name.desc=no description
|
||||||
Installer.exception.tskVerStringNull.msg=Sleuth Kit JNI test call returned without error, but version string was null\!
|
Installer.exception.tskVerStringNull.msg=Sleuth Kit JNI test call returned without error, but version string was null!
|
||||||
Installer.exception.taskVerStringBang.msg=Sleuth Kit JNI test call returned without error, but version string was ""\!
|
Installer.exception.taskVerStringBang.msg=Sleuth Kit JNI test call returned without error, but version string was ""!
|
||||||
Installer.tskLibErr.msg=Problem with Sleuth Kit JNI. Test call failed\!\n\nDetails: {0}
|
Installer.tskLibErr.msg=Problem with Sleuth Kit JNI. Test call failed!\n\nDetails: {0}
|
||||||
Installer.tskLibErr.err=Fatal Error\!
|
Installer.tskLibErr.err=Fatal Error!
|
||||||
InterestingHits.interestingItems.text=INTERESTING ITEMS
|
InterestingHits.interestingItems.text=INTERESTING ITEMS
|
||||||
InterestingHits.displayName.text=Interesting Items
|
InterestingHits.displayName.text=Interesting Items
|
||||||
InterestingHits.createSheet.name.name=Name
|
InterestingHits.createSheet.name.name=Name
|
||||||
|
@ -14,7 +14,7 @@ KnownStatusSearchPanel.knownCheckBox.text=Known Status:
|
|||||||
KnownStatusSearchPanel.knownBadOptionCheckBox.text=Notable
|
KnownStatusSearchPanel.knownBadOptionCheckBox.text=Notable
|
||||||
KnownStatusSearchPanel.knownOptionCheckBox.text=Known (NSRL or other)
|
KnownStatusSearchPanel.knownOptionCheckBox.text=Known (NSRL or other)
|
||||||
KnownStatusSearchPanel.unknownOptionCheckBox.text=Unknown
|
KnownStatusSearchPanel.unknownOptionCheckBox.text=Unknown
|
||||||
DateSearchFilter.noneSelectedMsg.text=At least one date type must be selected\!
|
DateSearchFilter.noneSelectedMsg.text=At least one date type must be selected!
|
||||||
DateSearchPanel.dateCheckBox.text=Date:
|
DateSearchPanel.dateCheckBox.text=Date:
|
||||||
DateSearchPanel.jLabel4.text=Timezone:
|
DateSearchPanel.jLabel4.text=Timezone:
|
||||||
DateSearchPanel.jLabel3.text=*The date format is mm/dd/yyyy
|
DateSearchPanel.jLabel3.text=*The date format is mm/dd/yyyy
|
||||||
@ -56,7 +56,7 @@ FileSearchPanel.search.results.details=Large number of matches may impact perfor
|
|||||||
FileSearchPanel.search.exception.noFilterSelected.msg=At least one filter must be selected.
|
FileSearchPanel.search.exception.noFilterSelected.msg=At least one filter must be selected.
|
||||||
FileSearchPanel.search.validationErr.msg=Validation Error: {0}
|
FileSearchPanel.search.validationErr.msg=Validation Error: {0}
|
||||||
FileSearchPanel.emptyWhereClause.text=Invalid options, nothing to show.
|
FileSearchPanel.emptyWhereClause.text=Invalid options, nothing to show.
|
||||||
KnownStatusSearchFilter.noneSelectedMsg.text=At least one known status must be selected\!
|
KnownStatusSearchFilter.noneSelectedMsg.text=At least one known status must be selected!
|
||||||
NameSearchFilter.emptyNameMsg.text=Must enter something for name search.
|
NameSearchFilter.emptyNameMsg.text=Must enter something for name search.
|
||||||
SearchNode.getName.text=Search Result
|
SearchNode.getName.text=Search Result
|
||||||
SizeSearchPanel.sizeCompareComboBox.equalTo=equal to
|
SizeSearchPanel.sizeCompareComboBox.equalTo=equal to
|
||||||
|
@ -140,7 +140,7 @@ IngestJob.cancelReason.outOfDiskSpace.text=Out of disk space
|
|||||||
IngestJob.cancelReason.servicesDown.text=Services Down
|
IngestJob.cancelReason.servicesDown.text=Services Down
|
||||||
IngestJob.cancelReason.caseClosed.text=Case closed
|
IngestJob.cancelReason.caseClosed.text=Case closed
|
||||||
IngestJobSettingsPanel.globalSettingsButton.text=Global Settings
|
IngestJobSettingsPanel.globalSettingsButton.text=Global Settings
|
||||||
gest
|
gest=
|
||||||
IngestJobSettingsPanel.globalSettingsButton.actionCommand=Advanced
|
IngestJobSettingsPanel.globalSettingsButton.actionCommand=Advanced
|
||||||
IngestJobSettingsPanel.globalSettingsButton.text=Global Settings
|
IngestJobSettingsPanel.globalSettingsButton.text=Global Settings
|
||||||
IngestJobSettingsPanel.pastJobsButton.text=History
|
IngestJobSettingsPanel.pastJobsButton.text=History
|
||||||
|
@ -11,12 +11,7 @@ ExtractArchiveWithPasswordAction.progress.text=Unpacking contents of archive: {0
|
|||||||
ExtractArchiveWithPasswordAction.prompt.text=Enter Password
|
ExtractArchiveWithPasswordAction.prompt.text=Enter Password
|
||||||
ExtractArchiveWithPasswordAction.prompt.title=Enter Password
|
ExtractArchiveWithPasswordAction.prompt.title=Enter Password
|
||||||
OpenIDE-Module-Display-Category=Ingest Module
|
OpenIDE-Module-Display-Category=Ingest Module
|
||||||
OpenIDE-Module-Long-Description=\
|
OpenIDE-Module-Long-Description=Embedded File Extraction Ingest Module\n\nThe Embedded File Extraction Ingest Module processes document files (such as doc, docx, ppt, pptx, xls, xlsx) and archive files (such as zip and others archive types supported by the 7zip extractor).\nContents of these files are extracted and the derived files are added back to the current ingest to be processed by the configured ingest modules.\nIf the derived file happens to be an archive file, it will be re-processed by the 7zip extractor - the extractor will process archive files N-levels deep.\n\nThe extracted files are navigable in the directory tree.\n\nThe module is supported on Windows, Linux and Mac operating systems.
|
||||||
Embedded File Extraction Ingest Module\n\nThe Embedded File Extraction Ingest Module processes document files (such as doc, docx, ppt, pptx, xls, xlsx) and archive files (such as zip and others archive types supported by the 7zip extractor).\n\
|
|
||||||
Contents of these files are extracted and the derived files are added back to the current ingest to be processed by the configured ingest modules.\n\
|
|
||||||
If the derived file happens to be an archive file, it will be re-processed by the 7zip extractor - the extractor will process archive files N-levels deep.\n\n\
|
|
||||||
The extracted files are navigable in the directory tree.\n\n\
|
|
||||||
The module is supported on Windows, Linux and Mac operating systems.
|
|
||||||
OpenIDE-Module-Name=Embedded File Extraction
|
OpenIDE-Module-Name=Embedded File Extraction
|
||||||
OpenIDE-Module-Short-Description=Embedded File Extraction Ingest Module
|
OpenIDE-Module-Short-Description=Embedded File Extraction Ingest Module
|
||||||
EmbeddedFileExtractorIngestModule.SevenZipContentReadStream.seek.exception.invalidOrigin=Invalid seek origin: {0}
|
EmbeddedFileExtractorIngestModule.SevenZipContentReadStream.seek.exception.invalidOrigin=Invalid seek origin: {0}
|
||||||
|
@ -1,9 +1,7 @@
|
|||||||
CannotRunFileTypeDetection=Cannot run file type detection.
|
CannotRunFileTypeDetection=Cannot run file type detection.
|
||||||
ExifParserFileIngestModule.indexError.message=Failed to post EXIF Metadata artifact(s).
|
ExifParserFileIngestModule.indexError.message=Failed to post EXIF Metadata artifact(s).
|
||||||
OpenIDE-Module-Display-Category=Ingest Module
|
OpenIDE-Module-Display-Category=Ingest Module
|
||||||
OpenIDE-Module-Long-Description=\
|
OpenIDE-Module-Long-Description=Exif metadata ingest module. \n\nThe ingest module analyzes image files, extracts Exif information and posts the Exif data as results.
|
||||||
Exif metadata ingest module. \n\n\
|
|
||||||
The ingest module analyzes image files, extracts Exif information and posts the Exif data as results.
|
|
||||||
OpenIDE-Module-Name=ExifParser
|
OpenIDE-Module-Name=ExifParser
|
||||||
OpenIDE-Module-Short-Description=Exif metadata ingest module
|
OpenIDE-Module-Short-Description=Exif metadata ingest module
|
||||||
ExifParserFileIngestModule.moduleName.text=Exif Parser
|
ExifParserFileIngestModule.moduleName.text=Exif Parser
|
||||||
|
@ -36,27 +36,27 @@ FileExtMismatchSettingsPanel.jLabel1.text=File Types:
|
|||||||
FileExtMismatchSettingsPanel.newExtButton.text=New Extension
|
FileExtMismatchSettingsPanel.newExtButton.text=New Extension
|
||||||
FileExtMismatchSettingsPanel.newMimePrompt.message=Add a new MIME file type:
|
FileExtMismatchSettingsPanel.newMimePrompt.message=Add a new MIME file type:
|
||||||
FileExtMismatchSettingsPanel.newMimePrompt.title=New MIME
|
FileExtMismatchSettingsPanel.newMimePrompt.title=New MIME
|
||||||
FileExtMismatchSettingsPanel.newMimePrompt.emptyMime.message=MIME type text is empty\!
|
FileExtMismatchSettingsPanel.newMimePrompt.emptyMime.message=MIME type text is empty!
|
||||||
FileExtMismatchSettingsPanel.newMimePrompt.emptyMime.title=Empty type
|
FileExtMismatchSettingsPanel.newMimePrompt.emptyMime.title=Empty type
|
||||||
FileExtMismatchSettingsPanel.newMimePrompt.mimeTypeNotSupported.message=MIME type not supported\!
|
FileExtMismatchSettingsPanel.newMimePrompt.mimeTypeNotSupported.message=MIME type not supported!
|
||||||
FileExtMismatchSettingsPanel.newMimePrompt.mimeTypeNotSupported.title=Type not supported
|
FileExtMismatchSettingsPanel.newMimePrompt.mimeTypeNotSupported.title=Type not supported
|
||||||
FileExtMismatchSettingsPanel.newMimePrompt.mimeTypeExists.message=MIME type already exists\!
|
FileExtMismatchSettingsPanel.newMimePrompt.mimeTypeExists.message=MIME type already exists!
|
||||||
FileExtMismatchSettingsPanel.newMimePrompt.mimeTypeExists.title=Type already exists
|
FileExtMismatchSettingsPanel.newMimePrompt.mimeTypeExists.title=Type already exists
|
||||||
FileExtMismatchSettingsPanel.newMimePrompt.mimeTypeNotDetectable.message=MIME type is not detectable by this module.
|
FileExtMismatchSettingsPanel.newMimePrompt.mimeTypeNotDetectable.message=MIME type is not detectable by this module.
|
||||||
FileExtMismatchSettingsPanel.newMimePrompt.mimeTypeNotDetectable.title=Type not detectable
|
FileExtMismatchSettingsPanel.newMimePrompt.mimeTypeNotDetectable.title=Type not detectable
|
||||||
FileExtMismatchSettingsPanel.removeTypeButton.noneSelected.message=No MIME type selected\!
|
FileExtMismatchSettingsPanel.removeTypeButton.noneSelected.message=No MIME type selected!
|
||||||
FileExtMismatchSettingsPanel.removeTypeButton.noneSelected.title=No type selected
|
FileExtMismatchSettingsPanel.removeTypeButton.noneSelected.title=No type selected
|
||||||
FileExtMismatchSettingsPanel.newExtPrompt.message=Add an allowed extension:
|
FileExtMismatchSettingsPanel.newExtPrompt.message=Add an allowed extension:
|
||||||
FileExtMismatchSettingsPanel.newExtPrompt.title=New allowed extension
|
FileExtMismatchSettingsPanel.newExtPrompt.title=New allowed extension
|
||||||
FileExtMismatchSettingsPanel.newExtPrompt.empty.message=Extension text is empty\!
|
FileExtMismatchSettingsPanel.newExtPrompt.empty.message=Extension text is empty!
|
||||||
FileExtMismatchSettingsPanel.newExtPrompt.empty.title=Extension text empty
|
FileExtMismatchSettingsPanel.newExtPrompt.empty.title=Extension text empty
|
||||||
FileExtMismatchSettingsPanel.newExtPrompt.noMimeType.message=No MIME type selected\!
|
FileExtMismatchSettingsPanel.newExtPrompt.noMimeType.message=No MIME type selected!
|
||||||
FileExtMismatchSettingsPanel.newExtPrompt.noMimeType.title=No MIME type selected
|
FileExtMismatchSettingsPanel.newExtPrompt.noMimeType.title=No MIME type selected
|
||||||
FileExtMismatchSettingsPanel.newExtPrompt.extExists.message=Extension already exists\!
|
FileExtMismatchSettingsPanel.newExtPrompt.extExists.message=Extension already exists!
|
||||||
FileExtMismatchSettingsPanel.newExtPrompt.extExists.title=Extension already exists
|
FileExtMismatchSettingsPanel.newExtPrompt.extExists.title=Extension already exists
|
||||||
FileExtMismatchSettingsPanel.removeExtButton.noneSelected.message=No extension selected\!
|
FileExtMismatchSettingsPanel.removeExtButton.noneSelected.message=No extension selected!
|
||||||
FileExtMismatchSettingsPanel.removeExtButton.noneSelected.title=No extension selected
|
FileExtMismatchSettingsPanel.removeExtButton.noneSelected.title=No extension selected
|
||||||
FileExtMismatchSettingsPanel.removeExtButton.noMimeTypeSelected.message=No MIME type selected\!
|
FileExtMismatchSettingsPanel.removeExtButton.noMimeTypeSelected.message=No MIME type selected!
|
||||||
FileExtMismatchSettingsPanel.removeExtButton.noMimeTypeSelected.title=No MIME type selected
|
FileExtMismatchSettingsPanel.removeExtButton.noMimeTypeSelected.title=No MIME type selected
|
||||||
FileExtMismatchSettingsPanel.removeTypeButton.toolTipText=
|
FileExtMismatchSettingsPanel.removeTypeButton.toolTipText=
|
||||||
FileExtMismatchModuleSettingsPanel.checkAllRadioButton.text=Check all file types
|
FileExtMismatchModuleSettingsPanel.checkAllRadioButton.text=Check all file types
|
||||||
|
@ -40,10 +40,7 @@ ImportCentralRepoDbProgressDialog.errorParsingFile.message=Error parsing hash se
|
|||||||
ImportCentralRepoDbProgressDialog.linesProcessed.message=\ hashes processed
|
ImportCentralRepoDbProgressDialog.linesProcessed.message=\ hashes processed
|
||||||
ImportCentralRepoDbProgressDialog.title.text=Central Repository Import Progress
|
ImportCentralRepoDbProgressDialog.title.text=Central Repository Import Progress
|
||||||
OpenIDE-Module-Display-Category=Ingest Module
|
OpenIDE-Module-Display-Category=Ingest Module
|
||||||
OpenIDE-Module-Long-Description=\
|
OpenIDE-Module-Long-Description=Hash Set ingest module. \n\nThe ingest module analyzes files in the disk image and marks them as "known" (based on NSRL hashset lookup for "known" files) and "bad / interesting" (based on one or more hash sets supplied by the user).\n\nThe module also contains additional non-ingest tools that are integrated in the GUI, such as file lookup by hash and hash set configuration.
|
||||||
Hash Set ingest module. \n\n\
|
|
||||||
The ingest module analyzes files in the disk image and marks them as "known" (based on NSRL hashset lookup for "known" files) and "bad / interesting" (based on one or more hash sets supplied by the user).\n\n\
|
|
||||||
The module also contains additional non-ingest tools that are integrated in the GUI, such as file lookup by hash and hash set configuration.
|
|
||||||
OpenIDE-Module-Name=HashDatabases
|
OpenIDE-Module-Name=HashDatabases
|
||||||
OptionsCategory_Name_HashDatabase=Hash Sets
|
OptionsCategory_Name_HashDatabase=Hash Sets
|
||||||
OptionsCategory_Keywords_HashDatabase=Hash Sets
|
OptionsCategory_Keywords_HashDatabase=Hash Sets
|
||||||
@ -172,10 +169,7 @@ HashDbSearchThread.name.searching=Searching
|
|||||||
HashDbSearchThread.noMoreFilesWithMD5Msg=No other files with the same MD5 hash were found.
|
HashDbSearchThread.noMoreFilesWithMD5Msg=No other files with the same MD5 hash were found.
|
||||||
ModalNoButtons.indexingDbsTitle=Indexing hash sets
|
ModalNoButtons.indexingDbsTitle=Indexing hash sets
|
||||||
ModalNoButtons.indexingDbTitle=Indexing hash set
|
ModalNoButtons.indexingDbTitle=Indexing hash set
|
||||||
ModalNoButtons.exitHashDbIndexingMsg=You are about to exit out of indexing your hash sets. \n\
|
ModalNoButtons.exitHashDbIndexingMsg=You are about to exit out of indexing your hash sets. \nThe generated index will be left unusable. If you choose to continue,\nplease delete the corresponding -md5.idx file in the hash folder.\nExit indexing?
|
||||||
The generated index will be left unusable. If you choose to continue,\n\
|
|
||||||
please delete the corresponding -md5.idx file in the hash folder.\n\
|
|
||||||
Exit indexing?
|
|
||||||
ModalNoButtons.dlgTitle.unfinishedIndexing=Unfinished Indexing
|
ModalNoButtons.dlgTitle.unfinishedIndexing=Unfinished Indexing
|
||||||
ModalNoButtons.indexThis.currentlyIndexing1Db=Currently indexing 1 hash set
|
ModalNoButtons.indexThis.currentlyIndexing1Db=Currently indexing 1 hash set
|
||||||
ModalNoButtons.indexThese.currentlyIndexing1OfNDbs=Currently indexing 1 of {0}
|
ModalNoButtons.indexThese.currentlyIndexing1OfNDbs=Currently indexing 1 of {0}
|
||||||
|
@ -81,8 +81,8 @@ FilesSetRulePanel.nameTextField.text=
|
|||||||
FilesSetRulePanel.ruleNameLabel.text=Rule Name (Optional):
|
FilesSetRulePanel.ruleNameLabel.text=Rule Name (Optional):
|
||||||
FilesSetRulePanel.messages.emptyNameCondition=You must specify a name pattern for this rule.
|
FilesSetRulePanel.messages.emptyNameCondition=You must specify a name pattern for this rule.
|
||||||
FilesSetRulePanel.messages.invalidNameRegex=The name regular expression is not valid:\n\n{0}
|
FilesSetRulePanel.messages.invalidNameRegex=The name regular expression is not valid:\n\n{0}
|
||||||
FilesSetRulePanel.messages.invalidCharInName=The name cannot contain \\, /, :, *, ?, \", <, or > unless it is a regular expression.
|
FilesSetRulePanel.messages.invalidCharInName=The name cannot contain \\, /, :, *, ?, ", <, or > unless it is a regular expression.
|
||||||
FilesSetRulePanel.messages.invalidCharInPath=The path cannot contain \\, :, *, ?, \", <, or > unless it is a regular expression.
|
FilesSetRulePanel.messages.invalidCharInPath=The path cannot contain \\, :, *, ?, ", <, or > unless it is a regular expression.
|
||||||
FilesSetRulePanel.messages.invalidPathRegex=The path regular expression is not valid:\n\n{0}
|
FilesSetRulePanel.messages.invalidPathRegex=The path regular expression is not valid:\n\n{0}
|
||||||
FilesSetDefsPanel.doFileSetsDialog.duplicateRuleSet.text=Rule set with name {0} already exists.
|
FilesSetDefsPanel.doFileSetsDialog.duplicateRuleSet.text=Rule set with name {0} already exists.
|
||||||
FilesSetRulePanel.pathSeparatorInfoLabel.text=Use / as path separator
|
FilesSetRulePanel.pathSeparatorInfoLabel.text=Use / as path separator
|
||||||
|
@ -21,7 +21,7 @@ PhotoRecIngestModule.complete.totalParsetime=Total Parsing Time:
|
|||||||
PhotoRecIngestModule.complete.photoRecResults=PhotoRec Results
|
PhotoRecIngestModule.complete.photoRecResults=PhotoRec Results
|
||||||
PhotoRecIngestModule.NotEnoughDiskSpace.detail.msg=PhotoRec error processing {0} with {1} Not enough space on primary disk to save unallocated space.
|
PhotoRecIngestModule.NotEnoughDiskSpace.detail.msg=PhotoRec error processing {0} with {1} Not enough space on primary disk to save unallocated space.
|
||||||
PhotoRecIngestModule.cancelledByUser=PhotoRec cancelled by user.
|
PhotoRecIngestModule.cancelledByUser=PhotoRec cancelled by user.
|
||||||
PhotoRecIngestModule.error.exitValue=PhotoRec carver returned error exit value \= {0} when scanning {1}
|
PhotoRecIngestModule.error.exitValue=PhotoRec carver returned error exit value = {0} when scanning {1}
|
||||||
PhotoRecIngestModule.error.msg=Error processing {0} with PhotoRec carver.
|
PhotoRecIngestModule.error.msg=Error processing {0} with PhotoRec carver.
|
||||||
PhotoRecIngestModule.complete.numberOfErrors=Number of Errors while Carving:
|
PhotoRecIngestModule.complete.numberOfErrors=Number of Errors while Carving:
|
||||||
PhotoRecCarverIngestJobSettingsPanel.detectionSettingsLabel.text=PhotoRec Settings
|
PhotoRecCarverIngestJobSettingsPanel.detectionSettingsLabel.text=PhotoRec Settings
|
||||||
|
@ -86,7 +86,7 @@ FileReportDataTypes.path.text=Full Path
|
|||||||
FileReportText.getName.text=Files - Text
|
FileReportText.getName.text=Files - Text
|
||||||
FileReportText.getDesc.text=A tab delimited text file containing information about individual files in the case.
|
FileReportText.getDesc.text=A tab delimited text file containing information about individual files in the case.
|
||||||
ReportBodyFile.progress.querying=Querying files...
|
ReportBodyFile.progress.querying=Querying files...
|
||||||
ReportBodyFile.ingestWarning.text=Warning, this report was run before ingest services completed\!
|
ReportBodyFile.ingestWarning.text=Warning, this report was run before ingest services completed!
|
||||||
ReportBodyFile.progress.loading=Loading files...
|
ReportBodyFile.progress.loading=Loading files...
|
||||||
ReportBodyFile.progress.processing=Now processing {0}...
|
ReportBodyFile.progress.processing=Now processing {0}...
|
||||||
ReportBodyFile.getName.text=TSK Body File
|
ReportBodyFile.getName.text=TSK Body File
|
||||||
@ -228,13 +228,13 @@ ReportHTML.getName.text=HTML Report
|
|||||||
ReportHTML.getDesc.text=A report about results and tagged items in HTML format.
|
ReportHTML.getDesc.text=A report about results and tagged items in HTML format.
|
||||||
ReportHTML.writeIndex.title=for case {0}
|
ReportHTML.writeIndex.title=for case {0}
|
||||||
ReportHTML.writeIndex.noFrames.msg=Your browser is not compatible with our frame setup.
|
ReportHTML.writeIndex.noFrames.msg=Your browser is not compatible with our frame setup.
|
||||||
ReportHTML.writeIndex.noFrames.seeNav=Please see <a href\="content\nav.html">the navigation page</a> for artifact links,
|
ReportHTML.writeIndex.noFrames.seeNav=Please see <a href="content\nav.html">the navigation page</a> for artifact links,
|
||||||
ReportHTML.writeIndex.seeSum=and <a href\="content\summary.html">the summary page</a> for a case summary.
|
ReportHTML.writeIndex.seeSum=and <a href="contentsummary.html">the summary page</a> for a case summary.
|
||||||
ReportHTML.writeNav.title=Report Navigation
|
ReportHTML.writeNav.title=Report Navigation
|
||||||
ReportHTML.writeNav.h1=Report Navigation
|
ReportHTML.writeNav.h1=Report Navigation
|
||||||
ReportHTML.writeNav.summary=Case Summary
|
ReportHTML.writeNav.summary=Case Summary
|
||||||
ReportHTML.writeSum.title=Case Summary
|
ReportHTML.writeSum.title=Case Summary
|
||||||
ReportHTML.writeSum.warningMsg=<span>Warning, this report was run before ingest services completed\!</span>
|
ReportHTML.writeSum.warningMsg=<span>Warning, this report was run before ingest services completed!</span>
|
||||||
#
|
#
|
||||||
# autopsy/test/scripts/regression.py._html_report_diff() uses reportGenOn.text, caseName, caseNum,
|
# autopsy/test/scripts/regression.py._html_report_diff() uses reportGenOn.text, caseName, caseNum,
|
||||||
# examiner as a regex signature to skip report.html and summary.html
|
# examiner as a regex signature to skip report.html and summary.html
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/*
|
/*=
|
||||||
* Autopsy Forensic Browser
|
* Autopsy Forensic Browser
|
||||||
*
|
*
|
||||||
* Copyright 2013-15 Basis Technology Corp.
|
* Copyright 2013-15 Basis Technology Corp.
|
||||||
@ -14,8 +14,8 @@
|
|||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
*=limitations under the License.
|
||||||
*/
|
*/=
|
||||||
|
|
||||||
AbstractTimelineChart.defaultTooltip.text=Drag the mouse to select a time interval to zoom into.\nRight-click for more actions.
|
AbstractTimelineChart.defaultTooltip.text=Drag the mouse to select a time interval to zoom into.\nRight-click for more actions.
|
||||||
HistoryToolBar.historyLabel.text=History
|
HistoryToolBar.historyLabel.text=History
|
||||||
|
@ -380,11 +380,9 @@ abstract class DetailsChartLane<Y extends DetailViewEvent> extends XYChart<DateT
|
|||||||
* @param maxXatY a map from y ranges to the max x within that range. NOTE:
|
* @param maxXatY a map from y ranges to the max x within that range. NOTE:
|
||||||
* This map will be updated to include the node in question.
|
* This map will be updated to include the node in question.
|
||||||
* @param xLeft the left x-cord of the node to position
|
* @param xLeft the left x-cord of the node to position
|
||||||
* @param xRight the left x-cord of the node to position
|
* @param xRight the right x-cord of the node to position
|
||||||
*
|
*
|
||||||
* @return the y position for the node in question.
|
* @return the y position for the node in question.
|
||||||
*
|
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
double computeYTop(double yMin, double h, TreeRangeMap<Double, Double> maxXatY, double xLeft, double xRight) {
|
double computeYTop(double yMin, double h, TreeRangeMap<Double, Double> maxXatY, double xLeft, double xRight) {
|
||||||
double yTop = yMin;
|
double yTop = yMin;
|
||||||
|
@ -18,13 +18,13 @@
|
|||||||
*/
|
*/
|
||||||
package org.sleuthkit.autopsy.timeline.ui.detailview;
|
package org.sleuthkit.autopsy.timeline.ui.detailview;
|
||||||
|
|
||||||
import com.google.common.collect.ImmutableSet;
|
|
||||||
import com.google.common.collect.Iterables;
|
import com.google.common.collect.Iterables;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import static java.util.Objects.nonNull;
|
import static java.util.Objects.nonNull;
|
||||||
|
import java.util.Set;
|
||||||
import java.util.concurrent.ExecutionException;
|
import java.util.concurrent.ExecutionException;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
@ -259,7 +259,7 @@ final class EventClusterNode extends MultiEventNodeBase<EventCluster, EventStrip
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
EventNodeBase<?> createChildNode(EventStripe stripe) throws TskCoreException {
|
EventNodeBase<?> createChildNode(EventStripe stripe) throws TskCoreException {
|
||||||
ImmutableSet<Long> eventIDs = stripe.getEventIDs();
|
Set<Long> eventIDs = stripe.getEventIDs();
|
||||||
if (eventIDs.size() == 1) {
|
if (eventIDs.size() == 1) {
|
||||||
//If the stripe is a single event, make a single event node rather than a stripe node.
|
//If the stripe is a single event, make a single event node rather than a stripe node.
|
||||||
TimelineEvent singleEvent = getController().getEventsModel().getEventById(Iterables.getOnlyElement(eventIDs));
|
TimelineEvent singleEvent = getController().getEventsModel().getEventById(Iterables.getOnlyElement(eventIDs));
|
||||||
|
@ -18,9 +18,9 @@
|
|||||||
*/
|
*/
|
||||||
package org.sleuthkit.autopsy.timeline.ui.detailview;
|
package org.sleuthkit.autopsy.timeline.ui.detailview;
|
||||||
|
|
||||||
import com.google.common.collect.ImmutableSet;
|
|
||||||
import com.google.common.collect.Iterables;
|
import com.google.common.collect.Iterables;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
import java.util.Set;
|
||||||
import javafx.event.EventHandler;
|
import javafx.event.EventHandler;
|
||||||
import javafx.geometry.Pos;
|
import javafx.geometry.Pos;
|
||||||
import javafx.scene.control.Button;
|
import javafx.scene.control.Button;
|
||||||
@ -117,7 +117,7 @@ final public class EventStripeNode extends MultiEventNodeBase<EventStripe, Event
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected EventNodeBase<?> createChildNode(EventCluster cluster) throws TskCoreException {
|
protected EventNodeBase<?> createChildNode(EventCluster cluster) throws TskCoreException {
|
||||||
ImmutableSet<Long> eventIDs = cluster.getEventIDs();
|
Set<Long> eventIDs = cluster.getEventIDs();
|
||||||
if (eventIDs.size() == 1) {
|
if (eventIDs.size() == 1) {
|
||||||
TimelineEvent singleEvent = getController().getEventsModel().getEventById(Iterables.getOnlyElement(eventIDs));
|
TimelineEvent singleEvent = getController().getEventsModel().getEventById(Iterables.getOnlyElement(eventIDs));
|
||||||
SingleDetailsViewEvent singleDetailEvent = new SingleDetailsViewEvent(singleEvent).withParent(cluster);
|
SingleDetailsViewEvent singleDetailEvent = new SingleDetailsViewEvent(singleEvent).withParent(cluster);
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Autopsy Forensic Browser
|
* Autopsy Forensic Browser
|
||||||
*
|
*
|
||||||
* Copyright 2018 Basis Technology Corp.
|
* Copyright 2018-2019 Basis Technology Corp.
|
||||||
* Contact: carrier <at> sleuthkit <dot> org
|
* Contact: carrier <at> sleuthkit <dot> org
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
@ -18,18 +18,18 @@
|
|||||||
*/
|
*/
|
||||||
package org.sleuthkit.autopsy.timeline.ui.detailview.datamodel;
|
package org.sleuthkit.autopsy.timeline.ui.detailview.datamodel;
|
||||||
|
|
||||||
import com.google.common.collect.ImmutableSet;
|
|
||||||
import com.google.common.collect.ImmutableSortedSet;
|
|
||||||
import static com.google.common.collect.Sets.union;
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
import java.util.Collections;
|
||||||
import static java.util.Collections.emptySet;
|
import static java.util.Collections.emptySet;
|
||||||
import static java.util.Collections.singleton;
|
import static java.util.Collections.singleton;
|
||||||
import java.util.Comparator;
|
import java.util.HashSet;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.SortedSet;
|
import java.util.SortedSet;
|
||||||
|
import java.util.TreeSet;
|
||||||
import org.joda.time.Interval;
|
import org.joda.time.Interval;
|
||||||
|
import static org.sleuthkit.autopsy.timeline.ui.detailview.datamodel.SetUtils.union;
|
||||||
import org.sleuthkit.autopsy.timeline.utils.IntervalUtils;
|
import org.sleuthkit.autopsy.timeline.utils.IntervalUtils;
|
||||||
import org.sleuthkit.datamodel.DescriptionLoD;
|
import org.sleuthkit.datamodel.DescriptionLoD;
|
||||||
import org.sleuthkit.datamodel.timeline.EventType;
|
import org.sleuthkit.datamodel.timeline.EventType;
|
||||||
@ -67,19 +67,19 @@ public class EventCluster implements MultiEvent<EventStripe> {
|
|||||||
/**
|
/**
|
||||||
* the set of ids of the clustered events
|
* the set of ids of the clustered events
|
||||||
*/
|
*/
|
||||||
final private ImmutableSet<Long> eventIDs;
|
final private Set<Long> eventIDs;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* the ids of the subset of clustered events that have at least one tag
|
* the ids of the subset of clustered events that have at least one tag
|
||||||
* applied to them
|
* applied to them
|
||||||
*/
|
*/
|
||||||
private final ImmutableSet<Long> tagged;
|
private final Set<Long> tagged;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* the ids of the subset of clustered events that have at least one hash set
|
* the ids of the subset of clustered events that have at least one hash set
|
||||||
* hit
|
* hit
|
||||||
*/
|
*/
|
||||||
private final ImmutableSet<Long> hashHits;
|
private final Set<Long> hashHits;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* merge two event clusters into one new event cluster.
|
* merge two event clusters into one new event cluster.
|
||||||
@ -101,9 +101,9 @@ public class EventCluster implements MultiEvent<EventStripe> {
|
|||||||
|
|
||||||
Interval spanningInterval = IntervalUtils.span(cluster1.span, cluster2.span);
|
Interval spanningInterval = IntervalUtils.span(cluster1.span, cluster2.span);
|
||||||
|
|
||||||
Set<Long> idsUnion = union(cluster1.getEventIDs(), cluster2.getEventIDs());
|
Set<Long> idsUnion = Sets.union(cluster2.getEventIDs(), cluster2.getEventIDs());
|
||||||
Set<Long> hashHitsUnion = union(cluster1.getEventIDsWithHashHits(), cluster2.getEventIDsWithHashHits());
|
Set<Long> hashHitsUnion = Sets.union(cluster2.getEventIDsWithHashHits(), cluster2.getEventIDsWithHashHits());
|
||||||
Set<Long> taggedUnion = union(cluster1.getEventIDsWithTags(), cluster2.getEventIDsWithTags());
|
Set<Long> taggedUnion = Sets.union(cluster2.getEventIDsWithTags(), cluster2.getEventIDsWithTags());
|
||||||
|
|
||||||
return new EventCluster(spanningInterval,
|
return new EventCluster(spanningInterval,
|
||||||
cluster1.getEventType(), idsUnion, hashHitsUnion, taggedUnion,
|
cluster1.getEventType(), idsUnion, hashHitsUnion, taggedUnion,
|
||||||
@ -116,10 +116,10 @@ public class EventCluster implements MultiEvent<EventStripe> {
|
|||||||
|
|
||||||
this.span = spanningInterval;
|
this.span = spanningInterval;
|
||||||
this.type = type;
|
this.type = type;
|
||||||
this.hashHits = ImmutableSet.copyOf(hashHits);
|
this.hashHits = new HashSet<>(hashHits);
|
||||||
this.tagged = ImmutableSet.copyOf(tagged);
|
this.tagged = new HashSet<>(tagged);
|
||||||
this.description = description;
|
this.description = description;
|
||||||
this.eventIDs = ImmutableSet.copyOf(eventIDs);
|
this.eventIDs = new HashSet<>(eventIDs);
|
||||||
this.lod = lod;
|
this.lod = lod;
|
||||||
this.parent = parent;
|
this.parent = parent;
|
||||||
}
|
}
|
||||||
@ -177,17 +177,17 @@ public class EventCluster implements MultiEvent<EventStripe> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ImmutableSet<Long> getEventIDs() {
|
public Set<Long> getEventIDs() {
|
||||||
return eventIDs;
|
return eventIDs;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ImmutableSet<Long> getEventIDsWithHashHits() {
|
public Set<Long> getEventIDsWithHashHits() {
|
||||||
return hashHits;
|
return hashHits;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ImmutableSet<Long> getEventIDsWithTags() {
|
public Set<Long> getEventIDsWithTags() {
|
||||||
return tagged;
|
return tagged;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -221,7 +221,7 @@ public class EventCluster implements MultiEvent<EventStripe> {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public SortedSet<EventCluster> getClusters() {
|
public SortedSet<EventCluster> getClusters() {
|
||||||
return ImmutableSortedSet.orderedBy(Comparator.comparing(EventCluster::getStartMillis)).add(this).build();
|
return new TreeSet<>(Collections.singleton(this));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Autopsy Forensic Browser
|
* Autopsy Forensic Browser
|
||||||
*
|
*
|
||||||
* Copyright 2018 Basis Technology Corp.
|
* Copyright 2018-2019 Basis Technology Corp.
|
||||||
* Contact: carrier <at> sleuthkit <dot> org
|
* Contact: carrier <at> sleuthkit <dot> org
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
@ -19,12 +19,15 @@
|
|||||||
package org.sleuthkit.autopsy.timeline.ui.detailview.datamodel;
|
package org.sleuthkit.autopsy.timeline.ui.detailview.datamodel;
|
||||||
|
|
||||||
import com.google.common.base.Preconditions;
|
import com.google.common.base.Preconditions;
|
||||||
import com.google.common.collect.ImmutableSet;
|
import static java.util.Collections.singleton;
|
||||||
import com.google.common.collect.ImmutableSortedSet;
|
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
|
import static java.util.Comparator.comparing;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
import java.util.Set;
|
||||||
import java.util.SortedSet;
|
import java.util.SortedSet;
|
||||||
|
import static org.sleuthkit.autopsy.timeline.ui.detailview.datamodel.SetUtils.copyAsSortedSet;
|
||||||
|
import static org.sleuthkit.autopsy.timeline.ui.detailview.datamodel.SetUtils.union;
|
||||||
import org.sleuthkit.datamodel.DescriptionLoD;
|
import org.sleuthkit.datamodel.DescriptionLoD;
|
||||||
import org.sleuthkit.datamodel.timeline.EventType;
|
import org.sleuthkit.datamodel.timeline.EventType;
|
||||||
|
|
||||||
@ -34,206 +37,201 @@ import org.sleuthkit.datamodel.timeline.EventType;
|
|||||||
*/
|
*/
|
||||||
public final class EventStripe implements MultiEvent<EventCluster> {
|
public final class EventStripe implements MultiEvent<EventCluster> {
|
||||||
|
|
||||||
private final EventCluster parent;
|
private final EventCluster parent;
|
||||||
|
|
||||||
private final ImmutableSortedSet<EventCluster> clusters;
|
private final SortedSet<EventCluster> clusters;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* the type of all the events
|
* the type of all the events
|
||||||
*/
|
*/
|
||||||
private final EventType type;
|
private final EventType type;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* the common description of all the events
|
* the common description of all the events
|
||||||
*/
|
*/
|
||||||
private final String description;
|
private final String description;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* the description level of detail that the events were clustered at.
|
* the description level of detail that the events were clustered at.
|
||||||
*/
|
*/
|
||||||
private final DescriptionLoD lod;
|
private final DescriptionLoD lod;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* the set of ids of the events
|
* the set of ids of the events
|
||||||
*/
|
*/
|
||||||
private final ImmutableSet<Long> eventIDs;
|
private final Set<Long> eventIDs;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* the ids of the subset of events that have at least one tag applied to
|
* the ids of the subset of events that have at least one tag applied to
|
||||||
* them
|
* them
|
||||||
*/
|
*/
|
||||||
private final ImmutableSet<Long> tagged;
|
private final Set<Long> tagged;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* the ids of the subset of events that have at least one hash set hit
|
* the ids of the subset of events that have at least one hash set hit
|
||||||
*/
|
*/
|
||||||
private final ImmutableSet<Long> hashHits;
|
private final Set<Long> hashHits;
|
||||||
|
|
||||||
public static EventStripe merge(EventStripe u, EventStripe v) { //NOPMD
|
public static EventStripe merge(EventStripe u, EventStripe v) { //NOPMD
|
||||||
Preconditions.checkNotNull(u);
|
Preconditions.checkNotNull(u);
|
||||||
Preconditions.checkNotNull(v);
|
Preconditions.checkNotNull(v);
|
||||||
Preconditions.checkArgument(Objects.equals(u.description, v.description));
|
Preconditions.checkArgument(Objects.equals(u.description, v.description));
|
||||||
Preconditions.checkArgument(Objects.equals(u.lod, v.lod));
|
Preconditions.checkArgument(Objects.equals(u.lod, v.lod));
|
||||||
Preconditions.checkArgument(Objects.equals(u.type, v.type));
|
Preconditions.checkArgument(Objects.equals(u.type, v.type));
|
||||||
Preconditions.checkArgument(Objects.equals(u.parent, v.parent));
|
Preconditions.checkArgument(Objects.equals(u.parent, v.parent));
|
||||||
return new EventStripe(u, v);
|
return new EventStripe(u, v);
|
||||||
}
|
}
|
||||||
|
|
||||||
public EventStripe withParent(EventCluster parent) {
|
public EventStripe withParent(EventCluster parent) {
|
||||||
if (Objects.nonNull(this.parent)) {
|
if (Objects.nonNull(this.parent)) {
|
||||||
throw new IllegalStateException("Event Stripe already has a parent!");
|
throw new IllegalStateException("Event Stripe already has a parent!");
|
||||||
}
|
}
|
||||||
return new EventStripe(parent, this.type, this.description, this.lod, clusters, eventIDs, tagged, hashHits);
|
return new EventStripe(parent, this.type, this.description, this.lod, clusters, eventIDs, tagged, hashHits);
|
||||||
}
|
}
|
||||||
|
|
||||||
private EventStripe(EventCluster parent, EventType type, String description, DescriptionLoD lod, SortedSet<EventCluster> clusters, ImmutableSet<Long> eventIDs, ImmutableSet<Long> tagged, ImmutableSet<Long> hashHits) {
|
private EventStripe(EventCluster parent, EventType type, String description, DescriptionLoD lod, SortedSet<EventCluster> clusters, Set<Long> eventIDs, Set<Long> tagged, Set<Long> hashHits) {
|
||||||
this.parent = parent;
|
this.parent = parent;
|
||||||
this.type = type;
|
this.type = type;
|
||||||
this.description = description;
|
this.description = description;
|
||||||
this.lod = lod;
|
this.lod = lod;
|
||||||
this.clusters = ImmutableSortedSet.copyOf(Comparator.comparing(EventCluster::getStartMillis), clusters);
|
this.clusters = clusters;
|
||||||
|
|
||||||
this.eventIDs = eventIDs;
|
this.eventIDs = eventIDs;
|
||||||
this.tagged = tagged;
|
this.tagged = tagged;
|
||||||
this.hashHits = hashHits;
|
this.hashHits = hashHits;
|
||||||
}
|
}
|
||||||
|
|
||||||
public EventStripe(EventCluster cluster) {
|
public EventStripe(EventCluster cluster) {
|
||||||
this.clusters = ImmutableSortedSet.orderedBy(Comparator.comparing(EventCluster::getStartMillis))
|
this.clusters = copyAsSortedSet(singleton(cluster.withParent(this)),
|
||||||
.add(cluster.withParent(this)).build();
|
comparing(EventCluster::getStartMillis));
|
||||||
|
|
||||||
type = cluster.getEventType();
|
type = cluster.getEventType();
|
||||||
description = cluster.getDescription();
|
description = cluster.getDescription();
|
||||||
lod = cluster.getDescriptionLoD();
|
lod = cluster.getDescriptionLoD();
|
||||||
eventIDs = cluster.getEventIDs();
|
eventIDs = cluster.getEventIDs();
|
||||||
tagged = cluster.getEventIDsWithTags();
|
tagged = cluster.getEventIDsWithTags();
|
||||||
hashHits = cluster.getEventIDsWithHashHits();
|
hashHits = cluster.getEventIDsWithHashHits();
|
||||||
this.parent = null;
|
this.parent = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private EventStripe(EventStripe u, EventStripe v) { //NOPMD
|
private EventStripe(EventStripe u, EventStripe v) { //NOPMD
|
||||||
clusters = ImmutableSortedSet.orderedBy(Comparator.comparing(EventCluster::getStartMillis))
|
clusters = copyAsSortedSet(union(u.getClusters(), v.getClusters()), Comparator.comparing(EventCluster::getStartMillis));
|
||||||
.addAll(u.getClusters())
|
|
||||||
.addAll(v.getClusters())
|
|
||||||
.build();
|
|
||||||
|
|
||||||
type = u.getEventType();
|
type = u.getEventType();
|
||||||
description = u.getDescription();
|
description = u.getDescription();
|
||||||
lod = u.getDescriptionLoD();
|
lod = u.getDescriptionLoD();
|
||||||
eventIDs = ImmutableSet.<Long>builder()
|
eventIDs = union(u.getEventIDs(), v.getEventIDs());
|
||||||
.addAll(u.getEventIDs())
|
tagged = union(u.getEventIDsWithTags(), v.getEventIDsWithTags());
|
||||||
.addAll(v.getEventIDs())
|
hashHits = union(u.getEventIDsWithHashHits(), v.getEventIDsWithHashHits());
|
||||||
.build();
|
parent = u.getParent().orElse(v.getParent().orElse(null));
|
||||||
tagged = ImmutableSet.<Long>builder()
|
}
|
||||||
.addAll(u.getEventIDsWithTags())
|
|
||||||
.addAll(v.getEventIDsWithTags())
|
|
||||||
.build();
|
|
||||||
hashHits = ImmutableSet.<Long>builder()
|
|
||||||
.addAll(u.getEventIDsWithHashHits())
|
|
||||||
.addAll(v.getEventIDsWithHashHits())
|
|
||||||
.build();
|
|
||||||
parent = u.getParent().orElse(v.getParent().orElse(null));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Optional<EventCluster> getParent() {
|
public Optional<EventCluster> getParent() {
|
||||||
return Optional.ofNullable(parent);
|
return Optional.ofNullable(parent);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Optional<EventStripe> getParentStripe() {
|
public Optional<EventStripe> getParentStripe() {
|
||||||
if (getParent().isPresent()) {
|
if (getParent().isPresent()) {
|
||||||
return getParent().get().getParent();
|
return getParent().get().getParent();
|
||||||
} else {
|
} else {
|
||||||
return Optional.empty();
|
return Optional.empty();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getDescription() {
|
public String getDescription() {
|
||||||
return description;
|
return description;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public EventType getEventType() {
|
public EventType getEventType() {
|
||||||
return type;
|
return type;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public DescriptionLoD getDescriptionLoD() {
|
public DescriptionLoD getDescriptionLoD() {
|
||||||
return lod;
|
return lod;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ImmutableSet<Long> getEventIDs() {
|
public Set<Long> getEventIDs() {
|
||||||
return eventIDs;
|
return eventIDs;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ImmutableSet<Long> getEventIDsWithHashHits() {
|
public Set<Long> getEventIDsWithHashHits() {
|
||||||
return hashHits;
|
return hashHits;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ImmutableSet<Long> getEventIDsWithTags() {
|
public Set<Long> getEventIDsWithTags() {
|
||||||
return tagged;
|
return tagged;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public long getStartMillis() {
|
public long getStartMillis() {
|
||||||
return clusters.first().getStartMillis();
|
return clusters.first().getStartMillis();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public long getEndMillis() {
|
public long getEndMillis() {
|
||||||
return clusters.last().getEndMillis();
|
return clusters.last().getEndMillis();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ImmutableSortedSet< EventCluster> getClusters() {
|
public SortedSet< EventCluster> getClusters() {
|
||||||
return clusters;
|
return clusters;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return "EventStripe{" + "description=" + description + ", eventIDs=" + (Objects.isNull(eventIDs) ? 0 : eventIDs.size()) + '}'; //NON-NLS
|
return "EventStripe{" + "description=" + description + ", eventIDs=" + (Objects.isNull(eventIDs) ? 0 : eventIDs.size()) + '}'; //NON-NLS
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int hashCode() {
|
public int hashCode() {
|
||||||
int hash = 3;
|
int hash = 3;
|
||||||
hash = 79 * hash + Objects.hashCode(this.clusters);
|
hash = 79 * hash + Objects.hashCode(this.clusters);
|
||||||
hash = 79 * hash + Objects.hashCode(this.type);
|
hash = 79 * hash + Objects.hashCode(this.type);
|
||||||
hash = 79 * hash + Objects.hashCode(this.description);
|
hash = 79 * hash + Objects.hashCode(this.description);
|
||||||
hash = 79 * hash + Objects.hashCode(this.lod);
|
hash = 79 * hash + Objects.hashCode(this.lod);
|
||||||
hash = 79 * hash + Objects.hashCode(this.eventIDs);
|
hash = 79 * hash + Objects.hashCode(this.eventIDs);
|
||||||
return hash;
|
return hash;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean equals(Object obj) {
|
public boolean equals(Object obj) {
|
||||||
if (this == obj) {
|
if (this == obj) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (obj == null) {
|
if (obj == null) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (getClass() != obj.getClass()) {
|
if (getClass() != obj.getClass()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
final EventStripe other = (EventStripe) obj;
|
final EventStripe other = (EventStripe) obj;
|
||||||
if (!Objects.equals(this.description, other.description)) {
|
if (!Objects.equals(this.description, other.description)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (!Objects.equals(this.clusters, other.clusters)) {
|
if (!Objects.equals(this.clusters, other.clusters)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (!Objects.equals(this.type, other.type)) {
|
if (!Objects.equals(this.type, other.type)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (this.lod != other.lod) {
|
if (this.lod != other.lod) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return Objects.equals(this.eventIDs, other.eventIDs);
|
return Objects.equals(this.eventIDs, other.eventIDs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static <X> SortedSet<X> copyAsSortedSet(Collection<X> setA, Comparator<X> comparator) {
|
||||||
|
|
||||||
|
TreeSet<X> treeSet = new TreeSet<>(comparator);
|
||||||
|
treeSet.addAll(setA);
|
||||||
|
return treeSet;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,34 @@
|
|||||||
|
/*
|
||||||
|
* 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.timeline.ui.detailview.datamodel;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.Comparator;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.SortedSet;
|
||||||
|
import java.util.TreeSet;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
final class SetUtils {
|
||||||
|
|
||||||
|
static public <X> Set<X> union(Set<X> setA, Set<X> setB) {
|
||||||
|
HashSet<X> union = new HashSet<>(setA);
|
||||||
|
union.addAll(setB);
|
||||||
|
return union;
|
||||||
|
}
|
||||||
|
|
||||||
|
static public <X> SortedSet<X> copyAsSortedSet(Collection<X> setA, Comparator<X> comparator) {
|
||||||
|
TreeSet<X> treeSet = new TreeSet<>(comparator);
|
||||||
|
treeSet.addAll(setA);
|
||||||
|
return treeSet;
|
||||||
|
}
|
||||||
|
|
||||||
|
private SetUtils() {
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user