numberOfFileIngestThreadsComboBox;
+ private javax.swing.JLabel restartRequiredLabel;
private javax.swing.JRadioButton useBestViewerRB;
private javax.swing.JRadioButton useGMTTimeRB;
private javax.swing.JRadioButton useLocalTimeRB;
diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/GeneralOptionsPanelController.java b/Core/src/org/sleuthkit/autopsy/corecomponents/AutopsyOptionsPanelController.java
similarity index 92%
rename from Core/src/org/sleuthkit/autopsy/corecomponents/GeneralOptionsPanelController.java
rename to Core/src/org/sleuthkit/autopsy/corecomponents/AutopsyOptionsPanelController.java
index 990576ea0c..c0de3942ea 100644
--- a/Core/src/org/sleuthkit/autopsy/corecomponents/GeneralOptionsPanelController.java
+++ b/Core/src/org/sleuthkit/autopsy/corecomponents/AutopsyOptionsPanelController.java
@@ -34,12 +34,12 @@ import org.sleuthkit.autopsy.coreutils.Logger;
position = 1,
keywords = "#OptionsCategory_Keywords_General",
keywordsCategory = "General")
-public final class GeneralOptionsPanelController extends OptionsPanelController {
+public final class AutopsyOptionsPanelController extends OptionsPanelController {
- private GeneralPanel panel;
+ private AutopsyOptionsPanel panel;
private final PropertyChangeSupport pcs = new PropertyChangeSupport(this);
private boolean changed;
- private static final Logger logger = Logger.getLogger(GeneralOptionsPanelController.class.getName());
+ private static final Logger logger = Logger.getLogger(AutopsyOptionsPanelController.class.getName());
@Override
public void update() {
@@ -87,9 +87,9 @@ public final class GeneralOptionsPanelController extends OptionsPanelController
pcs.removePropertyChangeListener(l);
}
- private GeneralPanel getPanel() {
+ private AutopsyOptionsPanel getPanel() {
if (panel == null) {
- panel = new GeneralPanel(this);
+ panel = new AutopsyOptionsPanel(this);
}
return panel;
}
diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/Bundle.properties b/Core/src/org/sleuthkit/autopsy/corecomponents/Bundle.properties
index 4eb9d18d40..191e21f78c 100644
--- a/Core/src/org/sleuthkit/autopsy/corecomponents/Bundle.properties
+++ b/Core/src/org/sleuthkit/autopsy/corecomponents/Bundle.properties
@@ -60,11 +60,6 @@ DataResultViewerThumbnail.pageNumLabel.text=-
DataResultViewerThumbnail.filePathLabel.text=\ \ \
DataResultViewerThumbnail.goToPageLabel.text=Go to Page:
DataResultViewerThumbnail.goToPageField.text=
-GeneralPanel.jLabel1.text=When selecting a file:
-GeneralPanel.useBestViewerRB.text=Change to the most specific file viewer
-GeneralPanel.keepCurrentViewerRB.text=Stay on the same file viewer
-GeneralPanel.useBestViewerRB.toolTipText=For example, change from Hex to Media when a JPEG is selected.
-GeneralPanel.keepCurrentViewerRB.toolTipText=For example, stay in Hex view when a JPEG is selected.
AdvancedConfigurationDialog.cancelButton.text=Cancel
DataResultPanel.directoryTablePath.text=directoryPath
DataResultPanel.numberMatchLabel.text=0
@@ -73,12 +68,6 @@ MediaViewVideoPanel.pauseButton.text=\u25ba
MediaViewVideoPanel.progressLabel.text=00:00
DataContentViewerMedia.AccessibleContext.accessibleDescription=
MediaViewVideoPanel.infoLabel.text=info
-GeneralPanel.jLabel2.text=When displaying times:
-GeneralPanel.useLocalTimeRB.text=Use local time zone
-GeneralPanel.useGMTTimeRB.text=Use GMT
-GeneralPanel.jLabel3.text=Hide known files (i.e. those in the NIST NSRL) in the:
-GeneralPanel.viewsHideKnownCB.text= Views area
-GeneralPanel.dataSourcesHideKnownCB.text=Data Sources area (the directory hierarchy)
DataContentViewerArtifact.waitText=Retrieving and preparing data, please wait...
DataContentViewerArtifact.errorText=Error retrieving result
DataContentViewerArtifact.title=Results
@@ -137,5 +126,17 @@ DataResultViewerThumbnail.switchPage.done.errMsg=Error making thumbnails\: {0}
FXVideoPanel.pauseButton.infoLabel.playbackErr=Playback error.
GstVideoPanel.progress.infoLabel.updateErr=Error updating video progress\: {0}
GstVideoPanel.ExtractMedia.progress.buffering=Buffering {0}
-GeneralPanel.jLabel4.text=Number of threads to use for file ingest:
AboutWindowPanel.actVerboseLogging.text=Activate verbose logging
+AutopsyOptionsPanel.jLabel4.text=Number of threads to use for file ingest:
+AutopsyOptionsPanel.viewsHideKnownCB.text=Views area
+AutopsyOptionsPanel.dataSourcesHideKnownCB.text=Data Sources area (the directory hierarchy)
+AutopsyOptionsPanel.jLabel3.text=Hide known files (i.e. those in the NIST NSRL) in the:
+AutopsyOptionsPanel.useBestViewerRB.toolTipText=For example, change from Hex to Media when a JPEG is selected.
+AutopsyOptionsPanel.useBestViewerRB.text=Change to the most specific file viewer
+AutopsyOptionsPanel.useGMTTimeRB.text=Use GMT
+AutopsyOptionsPanel.useLocalTimeRB.text=Use local time zone
+AutopsyOptionsPanel.keepCurrentViewerRB.toolTipText=For example, stay in Hex view when a JPEG is selected.
+AutopsyOptionsPanel.keepCurrentViewerRB.text=Stay on the same file viewer
+AutopsyOptionsPanel.jLabel1.text=When selecting a file:
+AutopsyOptionsPanel.jLabel2.text=When displaying times:
+AutopsyOptionsPanel.restartRequiredLabel.text=Restart required to take effect
diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/corecomponents/Bundle_ja.properties
index 01f91dc4d8..d111a9c60a 100644
--- a/Core/src/org/sleuthkit/autopsy/corecomponents/Bundle_ja.properties
+++ b/Core/src/org/sleuthkit/autopsy/corecomponents/Bundle_ja.properties
@@ -1,123 +1,134 @@
-CTL_DataContentAction=\u30C7\u30FC\u30BF\u30B3\u30F3\u30C6\u30F3\u30C4
+CTL_DataContentAction=\u30c7\u30fc\u30bf\u30b3\u30f3\u30c6\u30f3\u30c4
OptionsCategory_Name_General=Autopsy
-OptionsCategory_Keywords_General=Autopsy\u30AA\u30D7\u30B7\u30E7\u30F3
-CTL_CustomAboutAction=Autopsy\u306B\u3064\u3044\u3066
-CTL_DataContentTopComponent=\u30C7\u30FC\u30BF\u30B3\u30F3\u30C6\u30F3\u30C4
-HINT_DataContentTopComponent=\u3053\u308C\u306F\u30C7\u30FC\u30BF\u30B3\u30F3\u30C6\u30F3\u30C4\u306E\u30A6\u30A3\u30F3\u30C9\u30A6\u3067\u3059
-HINT_NodeTableTopComponent=\u3053\u308C\u306F\u30C7\u30FC\u30BF\u7D50\u679C\u306E\u30A6\u30A3\u30F3\u30C9\u30A6\u3067\u3059
-OpenIDE-Module-Name=\u4E3B\u8981\u30B3\u30F3\u30DD\u30FC\u30CD\u30F3\u30C8
-DataContentViewerHex.pageLabel.text_1=\u30DA\u30FC\u30B8\uFF1A
+OptionsCategory_Keywords_General=Autopsy\u30aa\u30d7\u30b7\u30e7\u30f3
+CTL_CustomAboutAction=Autopsy\u306b\u3064\u3044\u3066
+CTL_DataContentTopComponent=\u30c7\u30fc\u30bf\u30b3\u30f3\u30c6\u30f3\u30c4
+HINT_DataContentTopComponent=\u3053\u308c\u306f\u30c7\u30fc\u30bf\u30b3\u30f3\u30c6\u30f3\u30c4\u306e\u30a6\u30a3\u30f3\u30c9\u30a6\u3067\u3059
+HINT_NodeTableTopComponent=\u3053\u308c\u306f\u30c7\u30fc\u30bf\u7d50\u679c\u306e\u30a6\u30a3\u30f3\u30c9\u30a6\u3067\u3059
+OpenIDE-Module-Name=\u4e3b\u8981\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8
+DataContentViewerHex.pageLabel.text_1=\u30da\u30fc\u30b8\uff1a
DataContentViewerHex.currentPageLabel.text_1=1
DataContentViewerHex.totalPageLabel.text_1=100
-DataContentViewerString.pageLabel.text_1=\u30DA\u30FC\u30B8\uFF1A
+DataContentViewerString.pageLabel.text_1=\u30da\u30fc\u30b8\uff1a
DataContentViewerString.currentPageLabel.text_1=1
DataContentViewerString.totalPageLabel.text_1=100
-DataContentViewerHex.pageLabel2.text=\u30DA\u30FC\u30B8
-DataContentViewerString.pageLabel2.text=\u30DA\u30FC\u30B8
-Format_OperatingSystem_Value={0} \u30D0\u30FC\u30B8\u30E7\u30F3 {1} \u30A2\u30FC\u30AD\u30C6\u30AF\u30C1\u30E3 {2}
+DataContentViewerHex.pageLabel2.text=\u30da\u30fc\u30b8
+DataContentViewerString.pageLabel2.text=\u30da\u30fc\u30b8
+Format_OperatingSystem_Value={0} \u30d0\u30fc\u30b8\u30e7\u30f3 {1} \u30a2\u30fc\u30ad\u30c6\u30af\u30c1\u30e3 {2}
URL_ON_IMG=http\://www.sleuthkit.org/
-LBL_Close=\u9589\u3058\u308B
-DataContentViewerString.copyMenuItem.text=\u30B3\u30D4\u30FC
-DataContentViewerHex.copyMenuItem.text=\u30B3\u30D4\u30FC
-DataContentViewerString.selectAllMenuItem.text=\u3059\u3079\u3066\u9078\u629E
-DataContentViewerHex.selectAllMenuItem.text=\u3059\u3079\u3066\u9078\u629E
+LBL_Close=\u9589\u3058\u308b
+DataContentViewerString.copyMenuItem.text=\u30b3\u30d4\u30fc
+DataContentViewerHex.copyMenuItem.text=\u30b3\u30d4\u30fc
+DataContentViewerString.selectAllMenuItem.text=\u3059\u3079\u3066\u9078\u629e
+DataContentViewerHex.selectAllMenuItem.text=\u3059\u3079\u3066\u9078\u629e
DataContentViewerArtifact.totalPageLabel.text=100
-DataContentViewerArtifact.pageLabel2.text=\u7D50\u679C
+DataContentViewerArtifact.pageLabel2.text=\u7d50\u679c
DataContentViewerArtifact.currentPageLabel.text=1
-DataContentViewerArtifact.copyMenuItem.text=\u30B3\u30D4\u30FC
-DataContentViewerArtifact.selectAllMenuItem.text=\u3059\u3079\u3066\u9078\u629E
-DataContentViewerArtifact.pageLabel.text=\u7D50\u679C\uFF1A
+DataContentViewerArtifact.copyMenuItem.text=\u30b3\u30d4\u30fc
+DataContentViewerArtifact.selectAllMenuItem.text=\u3059\u3079\u3066\u9078\u629e
+DataContentViewerArtifact.pageLabel.text=\u7d50\u679c\uff1a
AdvancedConfigurationDialog.applyButton.text=OK
-DataContentViewerString.goToPageLabel.text=\u4E0B\u8A18\u306E\u30DA\u30FC\u30B8\u3078\u79FB\u52D5\uFF1A
-DataContentViewerHex.goToPageLabel.text=\u4E0B\u8A18\u306E\u30DA\u30FC\u30B8\u3078\u79FB\u52D5\uFF1A
-DataContentViewerString.languageLabel.text=\u30B9\u30AF\u30EA\u30D7\u30C8\uFF1A
-DataContentViewerString.languageCombo.toolTipText=\u30D0\u30A4\u30CA\u30EA\u30B9\u30C8\u30EA\u30F3\u30B0\u306E\u51E6\u7406\uFF08\u62BD\u51FA\u304A\u3088\u3073\u30C7\u30B3\u30FC\u30C9\uFF09\u306B\u4F7F\u7528\u3059\u308B\u8A00\u8A9E
-DataResultViewerThumbnail.pageLabel.text=\u30DA\u30FC\u30B8\uFF1A
-DataResultViewerThumbnail.pagesLabel.text=\u30DA\u30FC\u30B8\uFF1A
-DataResultViewerThumbnail.imagesLabel.text=\u30A4\u30E1\u30FC\u30B8\uFF1A
+DataContentViewerString.goToPageLabel.text=\u4e0b\u8a18\u306e\u30da\u30fc\u30b8\u3078\u79fb\u52d5\uff1a
+DataContentViewerHex.goToPageLabel.text=\u4e0b\u8a18\u306e\u30da\u30fc\u30b8\u3078\u79fb\u52d5\uff1a
+DataContentViewerString.languageLabel.text=\u30b9\u30af\u30ea\u30d7\u30c8\uff1a
+DataContentViewerString.languageCombo.toolTipText=\u30d0\u30a4\u30ca\u30ea\u30b9\u30c8\u30ea\u30f3\u30b0\u306e\u51e6\u7406\uff08\u62bd\u51fa\u304a\u3088\u3073\u30c7\u30b3\u30fc\u30c9\uff09\u306b\u4f7f\u7528\u3059\u308b\u8a00\u8a9e
+DataResultViewerThumbnail.pageLabel.text=\u30da\u30fc\u30b8\uff1a
+DataResultViewerThumbnail.pagesLabel.text=\u30da\u30fc\u30b8\uff1a
+DataResultViewerThumbnail.imagesLabel.text=\u30a4\u30e1\u30fc\u30b8\uff1a
DataResultViewerThumbnail.imagesRangeLabel.text=-
DataResultViewerThumbnail.pageNumLabel.text=-
-DataResultViewerThumbnail.goToPageLabel.text=\u4E0B\u8A18\u306E\u30DA\u30FC\u30B8\u306B\u79FB\u52D5\uFF1A
-GeneralPanel.jLabel1.text=\u30D5\u30A1\u30A4\u30EB\u3092\u9078\u629E\u3059\u308B\u5834\u5408\uFF1A
-GeneralPanel.useBestViewerRB.text=\u6700\u3082\u5C02\u9580\u7684\u306A\u30D5\u30A1\u30A4\u30EB\u30D3\u30E5\u30FC\u30A2\u306B\u5909\u66F4
-GeneralPanel.keepCurrentViewerRB.text=\u305D\u306E\u307E\u307E\u540C\u3058\u30D5\u30A1\u30A4\u30EB\u30D3\u30E5\u30FC\u30A2\u3092\u4F7F\u7528
-GeneralPanel.useBestViewerRB.toolTipText=\u4F8B\u3048\u3070\u3001JPEG\u304C\u9078\u629E\u3055\u308C\u305F\u5834\u5408\u306B\u306FHEX\u304B\u3089\u30E1\u30C7\u30A3\u30A2\u306B\u5909\u66F4\u3059\u308B\u3002
-GeneralPanel.keepCurrentViewerRB.toolTipText=\u4F8B\u3048\u3070\u3001JPEG\u304C\u9078\u629E\u3055\u308C\u305F\u5834\u5408\u306B\u305D\u306E\u307E\u307EHEX\u30D3\u30E5\u30FC\u3092\u4F7F\u7528\u3002
-AdvancedConfigurationDialog.cancelButton.text=\u30AD\u30E3\u30F3\u30BB\u30EB
-DataResultPanel.directoryTablePath.text=\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u30D1\u30B9
+DataResultViewerThumbnail.goToPageLabel.text=\u4e0b\u8a18\u306e\u30da\u30fc\u30b8\u306b\u79fb\u52d5\uff1a
+AdvancedConfigurationDialog.cancelButton.text=\u30ad\u30e3\u30f3\u30bb\u30eb
+DataResultPanel.directoryTablePath.text=\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u30d1\u30b9
DataResultPanel.numberMatchLabel.text=0
-DataResultPanel.matchLabel.text=\u7D50\u679C
-MediaViewVideoPanel.pauseButton.text=\u25BA
+DataResultPanel.matchLabel.text=\u7d50\u679c
+MediaViewVideoPanel.pauseButton.text=\u25ba
MediaViewVideoPanel.progressLabel.text=00\:00
-MediaViewVideoPanel.infoLabel.text=\u60C5\u5831
-GeneralPanel.jLabel2.text=\u30A2\u30A4\u30C6\u30E0\u3092\u8868\u793A\u3059\u308B\u5834\u5408\uFF1A
-GeneralPanel.useLocalTimeRB.text=\u30ED\u30FC\u30AB\u30EB\u30BF\u30A4\u30E0\u30BE\u30FC\u30F3\u3092\u4F7F\u7528
-GeneralPanel.useGMTTimeRB.text=GMT\u3092\u4F7F\u7528
-GeneralPanel.jLabel3.text=\u65E2\u77E5\u30D5\u30A1\u30A4\u30EB\uFF08NIST NSRL\u5185\u306E\uFF09\u3092\u4E0B\u8A18\u306B\u96A0\u3059\uFF1A
-GeneralPanel.viewsHideKnownCB.text=\u30D3\u30E5\u30FC\u304B\u3089\u9078\u629E\u3057\u3066\u3044\u308B\u5834\u5408
-GeneralPanel.dataSourcesHideKnownCB.text=\u30C7\u30FC\u30BF\u30BD\u30FC\u30B9\u30A8\u30EA\u30A2\uFF08\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u968E\u5C64\uFF09
-DataContentViewerArtifact.waitText=\u30C7\u30FC\u30BF\u3092\u53D6\u8FBC\u307F\u304A\u3088\u3073\u6E96\u5099\u4E2D\u3002\u3057\u3070\u3089\u304F\u304A\u5F85\u3061\u4E0B\u3055\u3044\u2026
-DataContentViewerArtifact.errorText=\u7D50\u679C\u306E\u53D6\u8FBC\u307F\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F
-DataContentViewerArtifact.title=\u7D50\u679C
-DataContentViewerArtifact.toolTip=\u30D5\u30A1\u30A4\u30EB\u306B\u95A2\u9023\u3059\u308B\u7D50\u679C\u3092\u8868\u793A\u3057\u307E\u3059
-DataContentViewerHex.goToPageTextField.msgDlg=\uFF11\u304B\u3089 {0}\u306E\u9593\u306E\u6709\u52B9\u306A\u30DA\u30FC\u30B8\u6570\u3092\u5165\u529B\u3057\u3066\u4E0B\u3055\u3044
-DataContentViewerHex.goToPageTextField.err=\u7121\u52B9\u306A\u30DA\u30FC\u30B8\u6570
-DataContentViewerHex.setDataView.errorText=\uFF08\u30AA\u30D5\u30BB\u30C3\u30C8{0}-{1}\u306F\u8AAD\u307F\u53D6\u308C\u307E\u305B\u3093\u3067\u3057\u305F\uFF09
+MediaViewVideoPanel.infoLabel.text=\u60c5\u5831
+DataContentViewerArtifact.waitText=\u30c7\u30fc\u30bf\u3092\u53d6\u8fbc\u307f\u304a\u3088\u3073\u6e96\u5099\u4e2d\u3002\u3057\u3070\u3089\u304f\u304a\u5f85\u3061\u4e0b\u3055\u3044\u2026
+DataContentViewerArtifact.errorText=\u7d50\u679c\u306e\u53d6\u8fbc\u307f\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
+DataContentViewerArtifact.title=\u7d50\u679c
+DataContentViewerArtifact.toolTip=\u30d5\u30a1\u30a4\u30eb\u306b\u95a2\u9023\u3059\u308b\u7d50\u679c\u3092\u8868\u793a\u3057\u307e\u3059
+DataContentViewerHex.goToPageTextField.msgDlg=\uff11\u304b\u3089 {0}\u306e\u9593\u306e\u6709\u52b9\u306a\u30da\u30fc\u30b8\u6570\u3092\u5165\u529b\u3057\u3066\u4e0b\u3055\u3044
+DataContentViewerHex.goToPageTextField.err=\u7121\u52b9\u306a\u30da\u30fc\u30b8\u6570
+DataContentViewerHex.setDataView.errorText=\uff08\u30aa\u30d5\u30bb\u30c3\u30c8{0}-{1}\u306f\u8aad\u307f\u53d6\u308c\u307e\u305b\u3093\u3067\u3057\u305f\uff09
DataContentViewerHex.title=HEX
-DataContentViewerHex.toolTip=\u30D0\u30A4\u30CA\u30EA\u30B3\u30F3\u30C6\u30F3\u30C4\u3092HEX\u30D5\u30A1\u30A4\u30EB\u3068\u3057\u3066\u8868\u793A\u3057\u3001ASCII\u3068\u3057\u3066\u8868\u793A\u3067\u304D\u308B\u30D0\u30A4\u30C8\u306F\u53F3\u5074\u306B\u8868\u793A\u3057\u307E\u3059\u3002
-DataContentViewerMedia.title=\u30E1\u30C7\u30A3\u30A2
-DataContentViewerMedia.toolTip=\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u3066\u3044\u308B\u30DE\u30EB\u30C1\u30E1\u30C7\u30A3\u30A2\u30D5\u30A1\u30A4\u30EB\uFF08\u30A4\u30E1\u30FC\u30B8\u3001\u30D3\u30C7\u30AA\u3001\u30AA\u30FC\u30C7\u30A3\u30AA\uFF09\u3092\u8868\u793A\u3057\u307E\u3059\u3002
-DataContentViewerString.goToPageTextField.msgDlg=\uFF11\u304B\u3089{0}\u306E\u9593\u306E\u6709\u52B9\u306A\u30DA\u30FC\u30B8\u6570\u3092\u5165\u529B\u3057\u3066\u4E0B\u3055\u3044
-DataContentViewerString.goToPageTextField.err=\u7121\u52B9\u306A\u30DA\u30FC\u30B8\u6570
-DataContentViewerString.setDataView.errorText=\uFF08\u30AA\u30D5\u30BB\u30C3\u30C8{0}-{1}\u306F\u8AAD\u307F\u53D6\u308C\u307E\u305B\u3093\u3067\u3057\u305F\uFF09
-DataContentViewerString.title=\u30B9\u30C8\u30EA\u30F3\u30B0
-DataContentViewerString.toolTip=\u30D5\u30A1\u30A4\u30EB\u304B\u3089\u62BD\u51FA\u3055\u308C\u305FASCII\u304A\u3088\u3073\u30E6\u30CB\u30B3\u30FC\u30C9\u306E\u30B9\u30C8\u30EA\u30F3\u30B0\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002
-DataResultPanel.dummyNodeDisplayName=\u3057\u3070\u3089\u304F\u304A\u5F85\u3061\u304F\u3060\u3055\u3044\u2026
-DataResultViewerTable.firstColLbl=\u540D\u524D
-DataResultViewerTable.illegalArgExc.noChildFromParent=\u6307\u5B9A\u3055\u308C\u305F\u30DA\u30A2\u30EC\u30F3\u30C8\u304B\u3089\u30C1\u30E3\u30A4\u30EB\u30C9\u30CE\u30FC\u30C9\u3092\u53D6\u5F97\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002
-DataResultViewerTable.illegalArgExc.childWithoutPropertySet=\u30C1\u30E3\u30A4\u30EB\u30C9\u30CE\u30FC\u30C9\u306F\u901A\u5E38\u306EPropertySet\u3092\u6301\u3063\u3066\u3044\u307E\u305B\u3093\u3002
-DataResultViewerTable.title=\u30C6\u30FC\u30D6\u30EB
-DataResultViewerTable.dummyNodeDisplayName=\u3057\u3070\u3089\u304F\u304A\u5F85\u3061\u304F\u3060\u3055\u3044\u2026
-DataResultViewerThumbnail.title=\u30B5\u30E0\u30CD\u30A4\u30EB
-DataResultViewerThumbnail.goToPageTextField.msgDlg=\uFF11\u304B\u3089{0}\u306E\u9593\u306E\u6709\u52B9\u306A\u30DA\u30FC\u30B8\u6570\u3092\u5165\u529B\u3057\u3066\u4E0B\u3055\u3044
-DataResultViewerThumbnail.goToPageTextField.err=\u7121\u52B9\u306A\u30DA\u30FC\u30B8\u6570
-DataResultViewerThumbnail.genThumbs=\u30B5\u30E0\u30CD\u30A4\u30EB\u3092\u4F5C\u6210\u4E2D\u2026
-DataResultViewerThumbnail.pageNumbers.curOfTotal={0}\uFF0F{1}\u3064\u76EE
-FXVideoPanel.mediaPane.infoLabel=\u524A\u9664\u3055\u308C\u305F\u30D3\u30C7\u30AA\u306E\u518D\u751F\u306F\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002\u5916\u90E8\u30D7\u30EC\u30FC\u30E4\u30FC\u3092\u4F7F\u7528\u3057\u3066\u4E0B\u3055\u3044\u3002
-FXVideoPanel.progress.bufferingFile={0}\u3092\u30D0\u30C3\u30D5\u30A1\u30EA\u30F3\u30B0
-FXVideoPanel.progressLabel.buffering=\u30D0\u30C3\u30D5\u30A1\u30EA\u30F3\u30B0\u4E2D\u2026
-FXVideoPanel.media.unsupportedFormat=\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u3066\u3044\u306A\u3044\u30D5\u30A9\u30FC\u30DE\u30C3\u30C8\u3067\u3059\u3002
-GeneralOptionsPanelController.moduleErr=\u30E2\u30B8\u30E5\u30FC\u30EB\u30A8\u30E9\u30FC
-GeneralOptionsPanelController.moduleErr.msg=GeneralOptionsPanelController\u30A2\u30C3\u30D7\u30C7\u30FC\u30C8\u3092\u78BA\u8A8D\u4E2D\u306B\u30E2\u30B8\u30E5\u30FC\u30EB\u304C\u30A8\u30E9\u30FC\u3092\u8D77\u3053\u3057\u307E\u3057\u305F\u3002\u3069\u306E\u30E2\u30B8\u30E5\u30FC\u30EB\u304B\u30ED\u30B0\u3067\u78BA\u8A8D\u3057\u3066\u4E0B\u3055\u3044\u3002\u4E00\u90E8\u306E\u30C7\u30FC\u30BF\u304C\u4E0D\u5B8C\u5168\u304B\u3082\u3057\u308C\u307E\u305B\u3093\u3002
-GstVideoPanel.cannotProcFile.err=\u30E1\u30C7\u30A4\u30A2\u30D7\u30EC\u30FC\u30E4\u30FC\u304C\u3053\u306E\u30D5\u30A1\u30A4\u30EB\u3092\u51E6\u7406\u3067\u304D\u307E\u305B\u3093\u3002
-GstVideoPanel.initGst.gstException.msg=\u30AA\u30FC\u30C7\u30A3\u30AA\uFF0F\u30D3\u30C7\u30AA\u306E\u518D\u751F\u304A\u3088\u3073\u30D5\u30EC\u30FC\u30E0\u306E\u62BD\u51FA\u306B\u4F7F\u7528\u3059\u308BGStreamer\u306E\u521D\u671F\u5316\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002\u30D3\u30C7\u30AA\u304A\u3088\u3073\u30AA\u30FC\u30C7\u30A3\u30AA\u518D\u751F\u304C\u7121\u52B9\u5316\u3055\u308C\u307E\u3059\u3002
-GstVideoPanel.initGst.otherException.msg=\u30AA\u30FC\u30C7\u30A3\u30AA\uFF0F\u30D3\u30C7\u30AA\u306E\u518D\u751F\u304A\u3088\u3073\u30D5\u30EC\u30FC\u30E0\u306E\u62BD\u51FA\u306B\u4F7F\u7528\u3059\u308BGStreamer\u306E\u521D\u671F\u5316\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002\u30D3\u30C7\u30AA\u304A\u3088\u3073\u30AA\u30FC\u30C7\u30A3\u30AA\u518D\u751F\u304C\u7121\u52B9\u5316\u3055\u308C\u307E\u3059\u3002
-GstVideoPanel.setupVideo.infoLabel.text=\u524A\u9664\u3055\u308C\u305F\u30D3\u30C7\u30AA\u306E\u518D\u751F\u306F\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002\u5916\u90E8\u30D7\u30EC\u30FC\u30E4\u30FC\u3092\u4F7F\u7528\u3057\u3066\u4E0B\u3055\u3044\u3002
-GstVideoPanel.exception.problemFile.msg=\u30D5\u30A1\u30A4\u30EB({0})\u304B\u3089\u306F\u30D5\u30EC\u30FC\u30E0\u3092\u62BD\u51FA\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002
-GstVideoPanel.exception.problemPlay.msg=\u30D3\u30C7\u30AA\u30D5\u30A1\u30A4\u30EB\u306B\u554F\u984C\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002\u9577\u3055\u3092\u78BA\u8A8D\u4E2D\u306B\u518D\u751F\u3092\u3057\u3088\u3046\u3068\u3057\u305F\u969B\u306B\u554F\u984C\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002
-LBL_Description=\n \u88FD\u54C1\u30D0\u30FC\u30B8\u30E7\u30F3\uFF1A {0} ({9})
Sleuth Kit\u30D0\u30FC\u30B8\u30E7\u30F3\uFF1A {7}
Netbeans RCP\u30D3\u30EB\u30C9\: {8}
Java\: {1}; {2}
\u30B7\u30B9\u30C6\u30E0\uFF1A {3}; {4}; {5}
\u30E6\u30FC\u30B6\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u540D {6}
-LBL_Copyright=Autopsy™\u306FSleuth Kit™\u3084\u305D\u306E\u4ED6\u30C4\u30FC\u30EB\u3092\u57FA\u306B\u3057\u305F\u30C7\u30B8\u30BF\u30EB\u30FB\u30D5\u30A9\u30EC\u30F3\u30B8\u30C3\u30AF\u30FB\u30D7\u30E9\u30C3\u30C8\u30D5\u30A9\u30FC\u30E0\u3067\u3059\u3002
Copyright © 2003-2013. \u8A73\u7D30\u306F\u4E0B\u8A18\u3092\u3054\u89A7\u4E0B\u3055\u3044\u3002
http\://www.sleuthkit.org.
-GstVideoPanel.exception.problemPause.msg=\u30D3\u30C7\u30AA\u30D5\u30A1\u30A4\u30EB\u306B\u554F\u984C\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002\u9577\u3055\u3092\u78BA\u8A8D\u4E2D\u306B\u4E00\u6642\u505C\u6B62\u3092\u3057\u3088\u3046\u3068\u3057\u305F\u969B\u306B\u554F\u984C\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002
-GstVideoPanel.exception.problemPauseCaptFrame.msg=\u30D3\u30C7\u30AA\u30D5\u30A1\u30A4\u30EB\u306B\u554F\u984C\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002\u30D5\u30EC\u30FC\u30E0\u306E\u62BD\u51FA\u4E2D\u306B\u4E00\u6642\u505C\u6B62\u3092\u3057\u3088\u3046\u3068\u3057\u305F\u969B\u306B\u554F\u984C\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002
-GstVideoPanel.exception.problemPlayCaptFrame.msg=\u30D3\u30C7\u30AA\u30D5\u30A1\u30A4\u30EB\u306B\u554F\u984C\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002\u30D5\u30EC\u30FC\u30E0\u306E\u62BD\u51FA\u4E2D\u306B\u518D\u751F\u3057\u3088\u3046\u3068\u3057\u305F\u969B\u306B\u554F\u984C\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002
-GstVideoPanel.exception.problemStopCaptFrame.msg=\u30D3\u30C7\u30AA\u30D5\u30A1\u30A4\u30EB\u306B\u554F\u984C\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002\u30D5\u30EC\u30FC\u30E0\u306E\u62BD\u51FA\u4E2D\u306B\u505C\u6B62\u3057\u3088\u3046\u3068\u3057\u305F\u969B\u306B\u554F\u984C\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002
-GstVideoPanel.progress.buffering=\u30D0\u30C3\u30D5\u30A1\u30EA\u30F3\u30B0\u4E2D\u2026
-GstVideoPanel.progressLabel.bufferingErr=\u30D5\u30A1\u30A4\u30EB\u306E\u30D0\u30C3\u30D5\u30A1\u30EA\u30F3\u30B0\u30A8\u30E9\u30FC
-MediaViewImagePanel.imgFileTooLarge.msg=\u30A4\u30E1\u30FC\u30B8\u30D5\u30A1\u30A4\u30EB\u3092\u8AAD\u307F\u8FBC\u3081\u307E\u305B\u3093\u3067\u3057\u305F\uFF08\u5927\u304D\u3059\u304E\u3067\u3059\uFF09\uFF1A {0}
-ProductInformationPanel.verbLoggingEnabled.text=Verbose\u30ED\u30B0\u304C\u6709\u52B9\u3067\u3059
-ProductInformationPanel.propertyUnknown.text=\u4E0D\u660E
+DataContentViewerHex.toolTip=\u30d0\u30a4\u30ca\u30ea\u30b3\u30f3\u30c6\u30f3\u30c4\u3092HEX\u30d5\u30a1\u30a4\u30eb\u3068\u3057\u3066\u8868\u793a\u3057\u3001ASCII\u3068\u3057\u3066\u8868\u793a\u3067\u304d\u308b\u30d0\u30a4\u30c8\u306f\u53f3\u5074\u306b\u8868\u793a\u3057\u307e\u3059\u3002
+DataContentViewerMedia.title=\u30e1\u30c7\u30a3\u30a2
+DataContentViewerMedia.toolTip=\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u308b\u30de\u30eb\u30c1\u30e1\u30c7\u30a3\u30a2\u30d5\u30a1\u30a4\u30eb\uff08\u30a4\u30e1\u30fc\u30b8\u3001\u30d3\u30c7\u30aa\u3001\u30aa\u30fc\u30c7\u30a3\u30aa\uff09\u3092\u8868\u793a\u3057\u307e\u3059\u3002
+DataContentViewerString.goToPageTextField.msgDlg=\uff11\u304b\u3089{0}\u306e\u9593\u306e\u6709\u52b9\u306a\u30da\u30fc\u30b8\u6570\u3092\u5165\u529b\u3057\u3066\u4e0b\u3055\u3044
+DataContentViewerString.goToPageTextField.err=\u7121\u52b9\u306a\u30da\u30fc\u30b8\u6570
+DataContentViewerString.setDataView.errorText=\uff08\u30aa\u30d5\u30bb\u30c3\u30c8{0}-{1}\u306f\u8aad\u307f\u53d6\u308c\u307e\u305b\u3093\u3067\u3057\u305f\uff09
+DataContentViewerString.title=\u30b9\u30c8\u30ea\u30f3\u30b0
+DataContentViewerString.toolTip=\u30d5\u30a1\u30a4\u30eb\u304b\u3089\u62bd\u51fa\u3055\u308c\u305fASCII\u304a\u3088\u3073\u30e6\u30cb\u30b3\u30fc\u30c9\u306e\u30b9\u30c8\u30ea\u30f3\u30b0\u304c\u8868\u793a\u3055\u308c\u307e\u3059\u3002
+DataResultPanel.dummyNodeDisplayName=\u3057\u3070\u3089\u304f\u304a\u5f85\u3061\u304f\u3060\u3055\u3044\u2026
+DataResultViewerTable.firstColLbl=\u540d\u524d
+DataResultViewerTable.illegalArgExc.noChildFromParent=\u6307\u5b9a\u3055\u308c\u305f\u30da\u30a2\u30ec\u30f3\u30c8\u304b\u3089\u30c1\u30e3\u30a4\u30eb\u30c9\u30ce\u30fc\u30c9\u3092\u53d6\u5f97\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002
+DataResultViewerTable.illegalArgExc.childWithoutPropertySet=\u30c1\u30e3\u30a4\u30eb\u30c9\u30ce\u30fc\u30c9\u306f\u901a\u5e38\u306ePropertySet\u3092\u6301\u3063\u3066\u3044\u307e\u305b\u3093\u3002
+DataResultViewerTable.title=\u30c6\u30fc\u30d6\u30eb
+DataResultViewerTable.dummyNodeDisplayName=\u3057\u3070\u3089\u304f\u304a\u5f85\u3061\u304f\u3060\u3055\u3044\u2026
+DataResultViewerThumbnail.title=\u30b5\u30e0\u30cd\u30a4\u30eb
+DataResultViewerThumbnail.goToPageTextField.msgDlg=\uff11\u304b\u3089{0}\u306e\u9593\u306e\u6709\u52b9\u306a\u30da\u30fc\u30b8\u6570\u3092\u5165\u529b\u3057\u3066\u4e0b\u3055\u3044
+DataResultViewerThumbnail.goToPageTextField.err=\u7121\u52b9\u306a\u30da\u30fc\u30b8\u6570
+DataResultViewerThumbnail.genThumbs=\u30b5\u30e0\u30cd\u30a4\u30eb\u3092\u4f5c\u6210\u4e2d\u2026
+DataResultViewerThumbnail.pageNumbers.curOfTotal={0}\uff0f{1}\u3064\u76ee
+FXVideoPanel.mediaPane.infoLabel=\u524a\u9664\u3055\u308c\u305f\u30d3\u30c7\u30aa\u306e\u518d\u751f\u306f\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002\u5916\u90e8\u30d7\u30ec\u30fc\u30e4\u30fc\u3092\u4f7f\u7528\u3057\u3066\u4e0b\u3055\u3044\u3002
+FXVideoPanel.progress.bufferingFile={0}\u3092\u30d0\u30c3\u30d5\u30a1\u30ea\u30f3\u30b0
+FXVideoPanel.progressLabel.buffering=\u30d0\u30c3\u30d5\u30a1\u30ea\u30f3\u30b0\u4e2d\u2026
+FXVideoPanel.media.unsupportedFormat=\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u306a\u3044\u30d5\u30a9\u30fc\u30de\u30c3\u30c8\u3067\u3059\u3002
+GeneralOptionsPanelController.moduleErr=\u30e2\u30b8\u30e5\u30fc\u30eb\u30a8\u30e9\u30fc
+GeneralOptionsPanelController.moduleErr.msg=GeneralOptionsPanelController\u30a2\u30c3\u30d7\u30c7\u30fc\u30c8\u3092\u78ba\u8a8d\u4e2d\u306b\u30e2\u30b8\u30e5\u30fc\u30eb\u304c\u30a8\u30e9\u30fc\u3092\u8d77\u3053\u3057\u307e\u3057\u305f\u3002\u3069\u306e\u30e2\u30b8\u30e5\u30fc\u30eb\u304b\u30ed\u30b0\u3067\u78ba\u8a8d\u3057\u3066\u4e0b\u3055\u3044\u3002\u4e00\u90e8\u306e\u30c7\u30fc\u30bf\u304c\u4e0d\u5b8c\u5168\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u3002
+GstVideoPanel.cannotProcFile.err=\u30e1\u30c7\u30a4\u30a2\u30d7\u30ec\u30fc\u30e4\u30fc\u304c\u3053\u306e\u30d5\u30a1\u30a4\u30eb\u3092\u51e6\u7406\u3067\u304d\u307e\u305b\u3093\u3002
+GstVideoPanel.initGst.gstException.msg=\u30aa\u30fc\u30c7\u30a3\u30aa\uff0f\u30d3\u30c7\u30aa\u306e\u518d\u751f\u304a\u3088\u3073\u30d5\u30ec\u30fc\u30e0\u306e\u62bd\u51fa\u306b\u4f7f\u7528\u3059\u308bGStreamer\u306e\u521d\u671f\u5316\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002\u30d3\u30c7\u30aa\u304a\u3088\u3073\u30aa\u30fc\u30c7\u30a3\u30aa\u518d\u751f\u304c\u7121\u52b9\u5316\u3055\u308c\u307e\u3059\u3002
+GstVideoPanel.initGst.otherException.msg=\u30aa\u30fc\u30c7\u30a3\u30aa\uff0f\u30d3\u30c7\u30aa\u306e\u518d\u751f\u304a\u3088\u3073\u30d5\u30ec\u30fc\u30e0\u306e\u62bd\u51fa\u306b\u4f7f\u7528\u3059\u308bGStreamer\u306e\u521d\u671f\u5316\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002\u30d3\u30c7\u30aa\u304a\u3088\u3073\u30aa\u30fc\u30c7\u30a3\u30aa\u518d\u751f\u304c\u7121\u52b9\u5316\u3055\u308c\u307e\u3059\u3002
+GstVideoPanel.setupVideo.infoLabel.text=\u524a\u9664\u3055\u308c\u305f\u30d3\u30c7\u30aa\u306e\u518d\u751f\u306f\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002\u5916\u90e8\u30d7\u30ec\u30fc\u30e4\u30fc\u3092\u4f7f\u7528\u3057\u3066\u4e0b\u3055\u3044\u3002
+GstVideoPanel.exception.problemFile.msg=\u30d5\u30a1\u30a4\u30eb({0})\u304b\u3089\u306f\u30d5\u30ec\u30fc\u30e0\u3092\u62bd\u51fa\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002
+GstVideoPanel.exception.problemPlay.msg=\u30d3\u30c7\u30aa\u30d5\u30a1\u30a4\u30eb\u306b\u554f\u984c\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002\u9577\u3055\u3092\u78ba\u8a8d\u4e2d\u306b\u518d\u751f\u3092\u3057\u3088\u3046\u3068\u3057\u305f\u969b\u306b\u554f\u984c\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002
+LBL_Description=\n \u88fd\u54c1\u30d0\u30fc\u30b8\u30e7\u30f3\uff1a {0} ({9})
Sleuth Kit\u30d0\u30fc\u30b8\u30e7\u30f3\uff1a {7}
Netbeans RCP\u30d3\u30eb\u30c9\: {8}
Java\: {1}; {2}
\u30b7\u30b9\u30c6\u30e0\uff1a {3}; {4}; {5}
\u30e6\u30fc\u30b6\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u540d {6}
+LBL_Copyright=Autopsy™\u306fSleuth Kit™\u3084\u305d\u306e\u4ed6\u30c4\u30fc\u30eb\u3092\u57fa\u306b\u3057\u305f\u30c7\u30b8\u30bf\u30eb\u30fb\u30d5\u30a9\u30ec\u30f3\u30b8\u30c3\u30af\u30fb\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\u3067\u3059\u3002
Copyright © 2003-2013. \u8a73\u7d30\u306f\u4e0b\u8a18\u3092\u3054\u89a7\u4e0b\u3055\u3044\u3002
http\://www.sleuthkit.org.
+GstVideoPanel.exception.problemPause.msg=\u30d3\u30c7\u30aa\u30d5\u30a1\u30a4\u30eb\u306b\u554f\u984c\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002\u9577\u3055\u3092\u78ba\u8a8d\u4e2d\u306b\u4e00\u6642\u505c\u6b62\u3092\u3057\u3088\u3046\u3068\u3057\u305f\u969b\u306b\u554f\u984c\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002
+GstVideoPanel.exception.problemPauseCaptFrame.msg=\u30d3\u30c7\u30aa\u30d5\u30a1\u30a4\u30eb\u306b\u554f\u984c\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002\u30d5\u30ec\u30fc\u30e0\u306e\u62bd\u51fa\u4e2d\u306b\u4e00\u6642\u505c\u6b62\u3092\u3057\u3088\u3046\u3068\u3057\u305f\u969b\u306b\u554f\u984c\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002
+GstVideoPanel.exception.problemPlayCaptFrame.msg=\u30d3\u30c7\u30aa\u30d5\u30a1\u30a4\u30eb\u306b\u554f\u984c\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002\u30d5\u30ec\u30fc\u30e0\u306e\u62bd\u51fa\u4e2d\u306b\u518d\u751f\u3057\u3088\u3046\u3068\u3057\u305f\u969b\u306b\u554f\u984c\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002
+GstVideoPanel.exception.problemStopCaptFrame.msg=\u30d3\u30c7\u30aa\u30d5\u30a1\u30a4\u30eb\u306b\u554f\u984c\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002\u30d5\u30ec\u30fc\u30e0\u306e\u62bd\u51fa\u4e2d\u306b\u505c\u6b62\u3057\u3088\u3046\u3068\u3057\u305f\u969b\u306b\u554f\u984c\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002
+GstVideoPanel.progress.buffering=\u30d0\u30c3\u30d5\u30a1\u30ea\u30f3\u30b0\u4e2d\u2026
+GstVideoPanel.progressLabel.bufferingErr=\u30d5\u30a1\u30a4\u30eb\u306e\u30d0\u30c3\u30d5\u30a1\u30ea\u30f3\u30b0\u30a8\u30e9\u30fc
+MediaViewImagePanel.imgFileTooLarge.msg=\u30a4\u30e1\u30fc\u30b8\u30d5\u30a1\u30a4\u30eb\u3092\u8aad\u307f\u8fbc\u3081\u307e\u305b\u3093\u3067\u3057\u305f\uff08\u5927\u304d\u3059\u304e\u3067\u3059\uff09\uff1a {0}
+ProductInformationPanel.verbLoggingEnabled.text=Verbose\u30ed\u30b0\u304c\u6709\u52b9\u3067\u3059
+ProductInformationPanel.propertyUnknown.text=\u4e0d\u660e
ProductInformationPanel.getVMValue.text={0} {1}
-TableFilterNode.displayName.text=\u540D\u524D
+TableFilterNode.displayName.text=\u540d\u524d
DataContentViewerHex.ofLabel.text_1=of
DataContentViewerString.ofLabel.text_1=of
DataContentViewerArtifact.ofLabel.text=of
-DataContentViewerString.setDataView.errorNoText=\uFF08\u30AA\u30D5\u30BB\u30C3\u30C8{0}-{1}\u306B\u306F\u30C6\u30AD\u30B9\u30C8\u304C\u3042\u308A\u307E\u305B\u3093\uFF09
-DataResultViewerThumbnail.comboBox.smallThumbnails=\u30B5\u30E0\u30CD\u30A4\u30EB\uFF08\u5C0F\uFF09
-DataResultViewerThumbnail.comboBox.mediumThumbnails=\u30B5\u30E0\u30CD\u30A4\u30EB\uFF08\u4E2D\uFF09
-DataResultViewerThumbnail.comboBox.largeThumbnails=\u30B5\u30E0\u30CD\u30A4\u30EB\uFF08\u5927\uFF09
-DataResultViewerThumbnail.switchPage.done.errMsg=\u30B5\u30E0\u30CD\u30A4\u30EB\u4F5C\u6210\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\uFF1A {0}
-FXVideoPanel.pauseButton.infoLabel.playbackErr=\u518D\u751F\u30A8\u30E9\u30FC\u3002
-GstVideoPanel.progress.infoLabel.updateErr=\u30D3\u30C7\u30AA\u30D7\u30ED\u30B0\u30EC\u30B9\u306E\u30A2\u30C3\u30D7\u30C7\u30FC\u30C8\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\uFF1A {0}
-GstVideoPanel.ExtractMedia.progress.buffering={0}\u3092\u30D0\u30C3\u30D5\u30A1\u30EA\u30F3\u30B0\u4E2D
-AboutWindowPanel.actVerboseLogging.text=Verbose\u30ED\u30B0\u3092\u30A2\u30AF\u30C6\u30A3\u30D9\u30FC\u30C8
-GeneralPanel.jLabel4.text=\u30D5\u30A1\u30A4\u30EB\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u306B\u4F7F\u7528\u3059\u308B\u30B9\u30EC\u30C3\u30C9\u6570\uFF1A
\ No newline at end of file
+DataContentViewerString.setDataView.errorNoText=\uff08\u30aa\u30d5\u30bb\u30c3\u30c8{0}-{1}\u306b\u306f\u30c6\u30ad\u30b9\u30c8\u304c\u3042\u308a\u307e\u305b\u3093\uff09
+DataResultViewerThumbnail.comboBox.smallThumbnails=\u30b5\u30e0\u30cd\u30a4\u30eb\uff08\u5c0f\uff09
+DataResultViewerThumbnail.comboBox.mediumThumbnails=\u30b5\u30e0\u30cd\u30a4\u30eb\uff08\u4e2d\uff09
+DataResultViewerThumbnail.comboBox.largeThumbnails=\u30b5\u30e0\u30cd\u30a4\u30eb\uff08\u5927\uff09
+DataResultViewerThumbnail.switchPage.done.errMsg=\u30b5\u30e0\u30cd\u30a4\u30eb\u4f5c\u6210\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\uff1a {0}
+FXVideoPanel.pauseButton.infoLabel.playbackErr=\u518d\u751f\u30a8\u30e9\u30fc\u3002
+GstVideoPanel.progress.infoLabel.updateErr=\u30d3\u30c7\u30aa\u30d7\u30ed\u30b0\u30ec\u30b9\u306e\u30a2\u30c3\u30d7\u30c7\u30fc\u30c8\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\uff1a {0}
+GstVideoPanel.ExtractMedia.progress.buffering={0}\u3092\u30d0\u30c3\u30d5\u30a1\u30ea\u30f3\u30b0\u4e2d
+AboutWindowPanel.actVerboseLogging.text=Verbose\u30ed\u30b0\u3092\u30a2\u30af\u30c6\u30a3\u30d9\u30fc\u30c8
+AutopsyOptionsPanel.jLabel4.text=\u30d5\u30a1\u30a4\u30eb\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u306b\u4f7f\u7528\u3059\u308b\u30b9\u30ec\u30c3\u30c9\u6570\uff1a
+
+AutopsyOptionsPanel.viewsHideKnownCB.text=\u30d3\u30e5\u30fc\u304b\u3089\u9078\u629e\u3057\u3066\u3044\u308b\u5834\u5408
+
+AutopsyOptionsPanel.dataSourcesHideKnownCB.text=\u30c7\u30fc\u30bf\u30bd\u30fc\u30b9\u30a8\u30ea\u30a2\uff08\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u968e\u5c64\uff09
+
+AutopsyOptionsPanel.jLabel3.text=\u65e2\u77e5\u30d5\u30a1\u30a4\u30eb\uff08NIST NSRL\u5185\u306e\uff09\u3092\u4e0b\u8a18\u306b\u96a0\u3059\uff1a
+
+AutopsyOptionsPanel.useBestViewerRB.toolTipText=\u4f8b\u3048\u3070\u3001JPEG\u304c\u9078\u629e\u3055\u308c\u305f\u5834\u5408\u306b\u306fHEX\u304b\u3089\u30e1\u30c7\u30a3\u30a2\u306b\u5909\u66f4\u3059\u308b\u3002
+
+AutopsyOptionsPanel.useBestViewerRB.text=\u6700\u3082\u5c02\u9580\u7684\u306a\u30d5\u30a1\u30a4\u30eb\u30d3\u30e5\u30fc\u30a2\u306b\u5909\u66f4
+
+AutopsyOptionsPanel.useGMTTimeRB.text=GMT\u3092\u4f7f\u7528
+
+AutopsyOptionsPanel.useLocalTimeRB.text=\u30ed\u30fc\u30ab\u30eb\u30bf\u30a4\u30e0\u30be\u30fc\u30f3\u3092\u4f7f\u7528
+
+AutopsyOptionsPanel.keepCurrentViewerRB.toolTipText=\u4f8b\u3048\u3070\u3001JPEG\u304c\u9078\u629e\u3055\u308c\u305f\u5834\u5408\u306b\u305d\u306e\u307e\u307eHEX\u30d3\u30e5\u30fc\u3092\u4f7f\u7528\u3002
+
+AutopsyOptionsPanel.keepCurrentViewerRB.text=\u305d\u306e\u307e\u307e\u540c\u3058\u30d5\u30a1\u30a4\u30eb\u30d3\u30e5\u30fc\u30a2\u3092\u4f7f\u7528
+
+AutopsyOptionsPanel.jLabel1.text=\u30d5\u30a1\u30a4\u30eb\u3092\u9078\u629e\u3059\u308b\u5834\u5408\uff1a
+
+AutopsyOptionsPanel.jLabel2.text=\u30a2\u30a4\u30c6\u30e0\u3092\u8868\u793a\u3059\u308b\u5834\u5408\uff1a
diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/DataContentPanel.java b/Core/src/org/sleuthkit/autopsy/corecomponents/DataContentPanel.java
index f04a485a12..7e5a235c0c 100644
--- a/Core/src/org/sleuthkit/autopsy/corecomponents/DataContentPanel.java
+++ b/Core/src/org/sleuthkit/autopsy/corecomponents/DataContentPanel.java
@@ -1,6 +1,20 @@
/*
- * To change this template, choose Tools | Templates
- * and open the template in the editor.
+ * Autopsy Forensic Browser
+ *
+ * Copyright 2011-2014 Basis Technology Corp.
+ * Contact: carrier sleuthkit org
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
*/
package org.sleuthkit.autopsy.corecomponents;
@@ -10,14 +24,13 @@ import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.logging.Level;
-import java.util.prefs.Preferences;
import javax.swing.JTabbedPane;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import org.openide.nodes.Node;
import org.openide.util.Lookup;
import org.openide.util.NbBundle;
-import org.openide.util.NbPreferences;
+import org.sleuthkit.autopsy.core.UserPreferences;
import org.sleuthkit.autopsy.corecomponentinterfaces.DataContent;
import org.sleuthkit.autopsy.corecomponentinterfaces.DataContentViewer;
import org.sleuthkit.autopsy.coreutils.Logger;
@@ -34,7 +47,7 @@ import org.sleuthkit.datamodel.TskCoreException;
private Node currentNode;
private final boolean isMain;
private boolean listeningToTabbedPane = false;
-
+
/**
* Creates new DataContentPanel panel
* The main data content panel can only be created by the data content top component,
@@ -162,10 +175,6 @@ import org.sleuthkit.datamodel.TskCoreException;
listeningToTabbedPane = true;
}
- // get the preference for the preferred viewer
- Preferences pref = NbPreferences.forModule(GeneralPanel.class);
- boolean keepCurrentViewer = pref.getBoolean("keepPreferredViewer", false); //NON-NLS
-
int currTabIndex = jTabbedPane1.getSelectedIndex();
int totalTabs = jTabbedPane1.getTabCount();
int maxPreferred = 0;
@@ -190,8 +199,7 @@ import org.sleuthkit.datamodel.TskCoreException;
}
// let the user decide if we should stay with the current viewer
- int tabIndex = keepCurrentViewer ? currTabIndex : preferredViewerIndex;
-
+ int tabIndex = UserPreferences.keepPreferredContentViewer() ? currTabIndex : preferredViewerIndex;
UpdateWrapper dcv = viewers.get(tabIndex);
// this is really only needed if no tabs were enabled
diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/warning16.png b/Core/src/org/sleuthkit/autopsy/corecomponents/warning16.png
new file mode 100755
index 0000000000..f5ba881738
Binary files /dev/null and b/Core/src/org/sleuthkit/autopsy/corecomponents/warning16.png differ
diff --git a/Core/src/org/sleuthkit/autopsy/coreutils/ExecUtil.java b/Core/src/org/sleuthkit/autopsy/coreutils/ExecUtil.java
index 0850400b1f..725b2ca026 100644
--- a/Core/src/org/sleuthkit/autopsy/coreutils/ExecUtil.java
+++ b/Core/src/org/sleuthkit/autopsy/coreutils/ExecUtil.java
@@ -24,17 +24,18 @@ import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Writer;
import java.util.logging.Level;
-import org.sleuthkit.autopsy.coreutils.Logger;
/**
* Takes care of forking a process and reading output / error streams to either a
* string buffer or directly to a file writer
+ * BC: @@@ This code scares me in a multi-threaded env. I think the arguments should be passed into the constructor
+ * and different run methods that either return the string or use the redirected writer.
*/
public final class ExecUtil {
private static final Logger logger = Logger.getLogger(ExecUtil.class.getName());
private Process proc = null;
- private String command = null;
+ private final String command = null;
private ExecUtil.StreamToStringRedirect errorStringRedirect = null;
private ExecUtil.StreamToStringRedirect outputStringRedirect = null;
private ExecUtil.StreamToWriterRedirect outputWriterRedirect = null;
@@ -49,8 +50,6 @@ import org.sleuthkit.autopsy.coreutils.Logger;
* @return string buffer with captured stdout
*/
public synchronized String execute(final String aCommand, final String... params) throws IOException, InterruptedException {
- String output = "";
-
// build command array
String[] arrayCommand = new String[params.length + 1];
arrayCommand[0] = aCommand;
@@ -70,29 +69,21 @@ import org.sleuthkit.autopsy.coreutils.Logger;
//stderr redirect
errorStringRedirect = new ExecUtil.StreamToStringRedirect(proc.getErrorStream(), "ERROR"); //NON-NLS
+ errorStringRedirect.start();
+
//stdout redirect
outputStringRedirect = new ExecUtil.StreamToStringRedirect(proc.getInputStream(), "OUTPUT"); //NON-NLS
-
- //start redurectors
- errorStringRedirect.start();
outputStringRedirect.start();
//wait for process to complete and capture error core
final int exitVal = proc.waitFor();
logger.log(Level.INFO, aCommand + " exit value: " + exitVal); //NON-NLS
- errorStringRedirect.stopRun();
- errorStringRedirect = null;
-
- outputStringRedirect.stopRun();
- output = outputStringRedirect.getOutput();
-
- outputStringRedirect = null;
-
- //gc process with its streams
- //proc = null;
-
- return output;
+ // wait for output redirectors to finish writing / reading
+ outputWriterRedirect.join();
+ errorStringRedirect.join();
+
+ return outputStringRedirect.getOutput();
}
/**
@@ -125,20 +116,26 @@ import org.sleuthkit.autopsy.coreutils.Logger;
//stderr redirect
errorStringRedirect = new ExecUtil.StreamToStringRedirect(proc.getErrorStream(), "ERROR"); //NON-NLS
+ errorStringRedirect.start();
+
//stdout redirect
outputWriterRedirect = new ExecUtil.StreamToWriterRedirect(proc.getInputStream(), stdoutWriter);
-
- //start redurectors
- errorStringRedirect.start();
outputWriterRedirect.start();
//wait for process to complete and capture error core
final int exitVal = proc.waitFor();
logger.log(Level.INFO, aCommand + " exit value: " + exitVal); //NON-NLS
+ // wait for them to finish writing / reading
+ outputWriterRedirect.join();
+ errorStringRedirect.join();
+
//gc process with its streams
//proc = null;
}
+
+
+
/**
* Interrupt the running process and stop its stream redirect threads
@@ -173,7 +170,7 @@ import org.sleuthkit.autopsy.coreutils.Logger;
* managed in this thread.
*
*/
- public static class StreamToStringRedirect extends Thread {
+ private static class StreamToStringRedirect extends Thread {
private static final Logger logger = Logger.getLogger(StreamToStringRedirect.class.getName());
private InputStream is;
@@ -243,7 +240,7 @@ import org.sleuthkit.autopsy.coreutils.Logger;
* Any exception during execution of the command is managed in this thread.
*
*/
- public static class StreamToWriterRedirect extends Thread {
+ private static class StreamToWriterRedirect extends Thread {
private static final Logger logger = Logger.getLogger(StreamToStringRedirect.class.getName());
private InputStream is;
diff --git a/Core/src/org/sleuthkit/autopsy/coreutils/Logger.java b/Core/src/org/sleuthkit/autopsy/coreutils/Logger.java
index b1b3e2402d..6f58f1df01 100644
--- a/Core/src/org/sleuthkit/autopsy/coreutils/Logger.java
+++ b/Core/src/org/sleuthkit/autopsy/coreutils/Logger.java
@@ -1,7 +1,7 @@
/*
* Autopsy Forensic Browser
*
- * Copyright 2012 Basis Technology Corp.
+ * Copyright 2012-2014 Basis Technology Corp.
* Contact: carrier sleuthkit org
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -19,161 +19,107 @@
package org.sleuthkit.autopsy.coreutils;
import java.io.IOException;
-import java.nio.charset.Charset;
import java.util.logging.*;
-import org.openide.modules.Places;
/**
- * Custom Autopsy logger wrapper over java.util.logging.Logger with default file
- * streams logging to autopsy.log (general high level messages),
- * autopsy_traces.log (also including exception traces).
- * In development build, those are also redirected to console / messages log.
- *
- * Contains a utility method to log user actions to autopsy_actions.log via noteAction()
- *
- * Use like java.util.logging.Logger API, get a
- * org.sleuthkit.autopsy.coreutils.Logger handle using factory method
- * org.sleuthkit.autopsy.coreutils.Logger.getLogger(String name) passing
- * component/module/class name.
- *
- * If logging behavior is to be customized, you can add or remove handlers or
- * filters from the provided Logger object.
+ * Autopsy specialization of the Java Logger class with custom file handlers.
*/
-public class Logger extends java.util.logging.Logger {
+public final class Logger extends java.util.logging.Logger {
private static final String LOG_ENCODING = PlatformUtil.getLogFileEncoding();
private static final String LOG_DIR = PlatformUtil.getLogDirectory();
- static final int LOG_SIZE = 0; // in bytes, zero is unlimited
- static final int LOG_FILE_COUNT = 10;
-
- //File Handlers which point to the output logs
- private static final FileHandler traces = initTraces();
- private static final FileHandler normal = initNormal();
+ private static final int LOG_SIZE = 0; // In bytes, zero is unlimited
+ private static final int LOG_FILE_COUNT = 10;
+ private static final String LOG_WITHOUT_STACK_TRACES = "autopsy.log"; //NON-NLS
+ private static final String LOG_WITH_STACK_TRACES = "autopsy_traces.log"; //NON-NLS
+ private static final FileHandler userFriendlyLogFile = createFileHandler(LOG_WITHOUT_STACK_TRACES);
+ private static final FileHandler developersLogFile = createFileHandler(LOG_WITH_STACK_TRACES);
private static final Handler console = new java.util.logging.ConsoleHandler();
- private static final java.util.logging.Logger actionsLogger = initActionsLogger();
-
-
- /**
- * Main messages log file name
- */
- public static final String messagesLog = "autopsy.log"; //NON-NLS
- /**
- * Detailed exception trace log file name
- */
- public static final String tracesLog = "autopsy_traces.log"; //NON-NLS
-
- /**
- * Action logger file name
- */
- public static final String actionsLog = "autopsy_actions.log"; //NON-NLS
-
- /**
- * Static blocks to get around compile errors such as "variable might not
- * have been initialized
- *
- */
- //
- private static FileHandler initTraces() {
+ private static FileHandler createFileHandler(String fileName) {
try {
-
- FileHandler f = new FileHandler(LOG_DIR + tracesLog, LOG_SIZE, LOG_FILE_COUNT);
+ FileHandler f = new FileHandler(LOG_DIR + fileName, LOG_SIZE, LOG_FILE_COUNT);
f.setEncoding(LOG_ENCODING);
f.setFormatter(new SimpleFormatter());
return f;
} catch (IOException e) {
- throw new RuntimeException("Error initializing traces logger", e); //NON-NLS
+ throw new RuntimeException("Error initializing " + fileName + " file handler", e); //NON-NLS
}
}
- private static FileHandler initNormal() {
- try {
- FileHandler f = new FileHandler(LOG_DIR + messagesLog, LOG_SIZE, LOG_FILE_COUNT);
- f.setEncoding(LOG_ENCODING);
- f.setFormatter(new SimpleFormatter());
- return f;
- } catch (IOException e) {
- throw new RuntimeException("Error initializing normal logger", e); //NON-NLS
- }
- }
-
- private static java.util.logging.Logger initActionsLogger() {
- try {
- FileHandler f = new FileHandler(LOG_DIR + actionsLog, LOG_SIZE, LOG_FILE_COUNT);
- f.setEncoding(LOG_ENCODING);
- f.setFormatter(new SimpleFormatter());
- java.util.logging.Logger _actionsLogger = java.util.logging.Logger.getLogger("Actions"); //NON-NLS
- _actionsLogger.setUseParentHandlers(false);
- _actionsLogger.addHandler(f);
- _actionsLogger.addHandler(console);
- return _actionsLogger;
- } catch (IOException e) {
- throw new RuntimeException("Error initializing actions logger", e); //NON-NLS
- }
- }
-
- //
- private Logger(java.util.logging.Logger log) {
- super(log.getName(), log.getResourceBundleName());
- //do forward to messages, so that IDE window shows them
- if (Version.getBuildType() == Version.Type.DEVELOPMENT) {
- addHandler(console);
- }
- setUseParentHandlers(false); //do not forward to parent logger, sharing static handlers anyway
- //addHandler(new AutopsyExceptionHandler());
- addHandler(normal);
- addHandler(traces);
- }
-
-
-
-
- /**
- * Log an action to autopsy_actions.log
- * @param actionClass class where user triggered action occurs
- */
- public static void noteAction(Class> actionClass) {
- actionsLogger.log(Level.INFO, "Action performed: {0}", actionClass.getName()); //NON-NLS
- }
-
/**
* Factory method to retrieve a org.sleuthkit.autopsy.coreutils.Logger
- * instance The logger logs by default to autopsy.log and
- * autopsy_traces.log. Add/remove handlers if the desired behavior should be
- * different.
+ * instance derived from java.util.logging.Logger. Hides the base class
+ * factory method.
*
- * @param name ID for the logger or empty string for a root logger
+ * @param name A name for the logger. This should be a dot-separated name
+ * and should normally be based on the package name or class name.
* @return org.sleuthkit.autopsy.coreutils.Logger instance
*/
public static Logger getLogger(String name) {
- Logger l = new Logger(java.util.logging.Logger.getLogger(name));
- return l;
+ return new Logger(java.util.logging.Logger.getLogger(name));
}
/**
* Factory method to retrieve a org.sleuthkit.autopsy.coreutils.Logger
- * instance
+ * instance derived from java.util.logging.Logger. Hides the base class
+ * factory method.
*
- * @param name ID for the logger or empty string for a root logger
- * @param resourceBundleName bundle name associated with the logger
+ * @param name A name for the logger. This should be a dot-separated name
+ * and should normally be based on the package name or class name.
+ * @param resourceBundleName - name of ResourceBundle to be used for
+ * localizing messages for this logger. May be null if none of the messages
+ * require localization.
* @return org.sleuthkit.autopsy.coreutils.Logger instance
*/
public static Logger getLogger(String name, String resourceBundleName) {
- return new Logger(Logger.getLogger(name, resourceBundleName));
+ return new Logger(java.util.logging.Logger.getLogger(name, resourceBundleName));
+ }
+
+ private Logger(java.util.logging.Logger log) {
+ super(log.getName(), log.getResourceBundleName());
+ if (Version.getBuildType() == Version.Type.DEVELOPMENT) {
+ addHandler(console);
+ }
+ setUseParentHandlers(false);
+ addHandler(userFriendlyLogFile);
+ addHandler(developersLogFile);
}
@Override
public void log(Level level, String message, Throwable thrown) {
- super.log(level, message + "\nException: " + thrown.toString()); //NON-NLS
- removeHandler(normal);
+ logUserFriendlyOnly(level, message, thrown);
+ removeHandler(userFriendlyLogFile);
super.log(level, message, thrown);
- addHandler(normal);
+ addHandler(userFriendlyLogFile);
}
+ @Override
+ public void logp(Level level, String sourceClass, String sourceMethod, String message, Throwable thrown) {
+ logUserFriendlyOnly(level, message, thrown);
+ removeHandler(userFriendlyLogFile);
+ super.logp(level, sourceClass, sourceMethod, message, thrown);
+ addHandler(userFriendlyLogFile);
+ }
+
+ @Override
+ public void logrb(Level level, String sourceClass, String sourceMethod, String bundleName, String message, Throwable thrown) {
+ logUserFriendlyOnly(level, message, thrown);
+ removeHandler(userFriendlyLogFile);
+ super.logrb(level, sourceClass, sourceMethod, bundleName, message, thrown);
+ addHandler(userFriendlyLogFile);
+ }
+
+ private void logUserFriendlyOnly(Level level, String message, Throwable thrown) {
+ removeHandler(developersLogFile);
+ super.log(level, "{0}\nException: {1}", new Object[]{message, thrown.toString()}); //NON-NLS
+ addHandler(developersLogFile);
+ }
+
@Override
public void throwing(String sourceClass, String sourceMethod, Throwable thrown) {
- removeHandler(normal);
+ removeHandler(userFriendlyLogFile);
super.throwing(sourceClass, sourceMethod, thrown);
- addHandler(normal);
+ addHandler(userFriendlyLogFile);
}
}
diff --git a/Core/src/org/sleuthkit/autopsy/coreutils/XMLUtil.java b/Core/src/org/sleuthkit/autopsy/coreutils/XMLUtil.java
index 5b87e0ce42..3d95d8e529 100644
--- a/Core/src/org/sleuthkit/autopsy/coreutils/XMLUtil.java
+++ b/Core/src/org/sleuthkit/autopsy/coreutils/XMLUtil.java
@@ -1,7 +1,7 @@
/*
* Autopsy Forensic Browser
*
- * Copyright 2012 Basis Technology Corp.
+ * Copyright 2012-2014 Basis Technology Corp.
* Contact: carrier sleuthkit org
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -45,114 +45,120 @@ import javax.xml.validation.Validator;
import org.w3c.dom.Document;
import org.xml.sax.SAXException;
-/**
+/**
* XML Utilities
- *
+ *
* This class provides basic utilities for working with XML files, such as
- * -Validating XML files against a given schema
- * -Saving documents to disk
- * -Loading documents from disk
- *
+ * -Validating XML files against a given schema -Saving documents to disk
+ * -Loading documents from disk
*/
-
public class XMLUtil {
+
/**
* Utility to validate XML files against pre-defined schema files.
- *
- * The schema files are extracted automatically when this function is called, the XML being validated is not.
- * Be sure the XML file is already extracted otherwise it will return false.
+ *
+ * The schema files are extracted automatically when this function is
+ * called, the XML being validated is not. Be sure the XML file is already
+ * extracted otherwise it will return false.
+ *
* @param xmlfile The XML file to validate, in DOMSource format
* @param clazz class frm package to extract schema file from
- * @param schemaFile The file name of the schema to validate against, must exist as a resource in the same package as where this function is being called.
- *
- * For example usages, please see KeywordSearchListsXML, HashDbXML, or IngestModuleLoader.
- *
+ * @param schemaFile The file name of the schema to validate against, must
+ * exist as a resource in the same package as where this function is being
+ * called.
+ *
+ * For example usages, please see KeywordSearchListsXML, HashDbXML, or
+ * IngestModuleLoader.
+ *
*/
public static boolean xmlIsValid(DOMSource xmlfile, Class clazz, String schemaFile) {
- try{
- PlatformUtil.extractResourceToUserConfigDir(clazz, schemaFile, false);
- File schemaLoc = new File(PlatformUtil.getUserConfigDirectory() + File.separator + schemaFile);
- SchemaFactory schm = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
- try{
- Schema schema = schm.newSchema(schemaLoc);
- Validator validator = schema.newValidator();
- DOMResult result = new DOMResult();
- validator.validate(xmlfile, result);
- return true;
- }
- catch(SAXException e){
- Logger.getLogger(clazz.getName()).log(Level.WARNING, "Unable to validate XML file.", e); //NON-NLS
- return false;
- }
- }
- catch(IOException e){
- Logger.getLogger(clazz.getName()).log(Level.WARNING, "Unable to load XML file [" + xmlfile.toString() + "] of type ["+schemaFile+"]", e); //NON-NLS
+ try {
+ PlatformUtil.extractResourceToUserConfigDir(clazz, schemaFile, false);
+ File schemaLoc = new File(PlatformUtil.getUserConfigDirectory() + File.separator + schemaFile);
+ SchemaFactory schm = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
+ try {
+ Schema schema = schm.newSchema(schemaLoc);
+ Validator validator = schema.newValidator();
+ DOMResult result = new DOMResult();
+ validator.validate(xmlfile, result);
+ return true;
+ } catch (SAXException e) {
+ Logger.getLogger(clazz.getName()).log(Level.WARNING, "Unable to validate XML file.", e); //NON-NLS
+ return false;
+ }
+ } catch (IOException e) {
+ Logger.getLogger(clazz.getName()).log(Level.WARNING, "Unable to load XML file [" + xmlfile.toString() + "] of type [" + schemaFile + "]", e); //NON-NLS
return false;
}
}
-
+
/**
* Evaluates XML files against an XSD.
- *
- * The schema files are extracted automatically when this function is called, the XML being validated is not.
- * Be sure the XML file is already extracted otherwise it will return false.
+ *
+ * The schema files are extracted automatically when this function is
+ * called, the XML being validated is not. Be sure the XML file is already
+ * extracted otherwise it will return false.
+ *
* @param doc The XML DOM to validate
* @param clazz class from package to extract schema from
- * @param type The file name of the schema to validate against, must exist as a resource in the same package as where this function is being called
- *
- * For example usages, please see KeywordSearchListsXML, HashDbXML, or IngestModuleLoader.
- *
+ * @param type The file name of the schema to validate against, must exist
+ * as a resource in the same package as where this function is being called
+ *
+ * For example usages, please see KeywordSearchListsXML, HashDbXML, or
+ * IngestModuleLoader.
+ *
*/
- public static boolean xmlIsValid(Document doc, Class clazz, String type){
- DOMSource dms = new DOMSource(doc);
- return xmlIsValid(dms, clazz, type);
+ public static boolean xmlIsValid(Document doc, Class clazz, String type) {
+ DOMSource dms = new DOMSource(doc);
+ return xmlIsValid(dms, clazz, type);
}
-
-
-
- /**
+
+ /**
* Loads XML files from disk
- *
+ *
* @param clazz the class this method is invoked from
* @param xmlPath the full path to the file to load
- * @param xsdPath the full path to the file to validate against
- *
*/
- public static Document loadDoc(Class clazz, String xmlPath, String xsdPath) {
- DocumentBuilderFactory builderFactory =
- DocumentBuilderFactory.newInstance();
+ public static Document loadDoc(Class clazz, String xmlPath) {
+ DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
Document ret = null;
-
try {
DocumentBuilder builder = builderFactory.newDocumentBuilder();
- ret = builder.parse(
- new FileInputStream(xmlPath));
+ ret = builder.parse(new FileInputStream(xmlPath));
} catch (ParserConfigurationException e) {
Logger.getLogger(clazz.getName()).log(Level.SEVERE, "Error loading XML file: can't initialize parser.", e); //NON-NLS
-
} catch (SAXException e) {
Logger.getLogger(clazz.getName()).log(Level.SEVERE, "Error loading XML file: can't parse XML.", e); //NON-NLS
-
} catch (IOException e) {
//error reading file
Logger.getLogger(clazz.getName()).log(Level.SEVERE, "Error loading XML file: can't read file.", e); //NON-NLS
-
}
- if (!XMLUtil.xmlIsValid(ret, clazz, xsdPath)) {
- Logger.getLogger(clazz.getName()).log(Level.SEVERE, "Error loading XML file: could not validate against [" + xsdPath + "], results may not be accurate"); //NON-NLS
- }
-
return ret;
}
-
- /**
+
+ /**
+ * Loads XML files from disk
+ *
+ * @param clazz the class this method is invoked from
+ * @param xmlPath the full path to the file to load
+ * @param xsdPath the full path to the file to validate against
+ */
+ public static Document loadDoc(Class clazz, String xmlPath, String xsdPath) {
+ DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
+ Document ret = loadDoc(clazz, xmlPath);
+ if (!XMLUtil.xmlIsValid(ret, clazz, xsdPath)) {
+ Logger.getLogger(clazz.getName()).log(Level.WARNING, "Error loading XML file: could not validate against [{0}], results may not be accurate", xsdPath); //NON-NLS
+ }
+ return ret;
+ }
+
+ /**
* Saves XML files to disk
- *
+ *
* @param clazz the class this method is invoked from
* @param xmlPath the full path to save the XML to
* @param encoding to encoding, such as "UTF-8", to encode the file with
* @param doc the document to save
- *
*/
public static boolean saveDoc(Class clazz, String xmlPath, String encoding, final Document doc) {
TransformerFactory xf = TransformerFactory.newInstance();
@@ -166,11 +172,11 @@ public class XMLUtil {
xformer.setOutputProperty(OutputKeys.STANDALONE, "yes"); //NON-NLS
xformer.setOutputProperty(OutputKeys.VERSION, "1.0");
File file = new File(xmlPath);
- FileOutputStream stream = new FileOutputStream(file);
- Result out = new StreamResult(new OutputStreamWriter(stream, encoding));
- xformer.transform(new DOMSource(doc), out);
- stream.flush();
- stream.close();
+ try (FileOutputStream stream = new FileOutputStream(file)) {
+ Result out = new StreamResult(new OutputStreamWriter(stream, encoding));
+ xformer.transform(new DOMSource(doc), out);
+ stream.flush();
+ }
success = true;
} catch (UnsupportedEncodingException e) {
@@ -186,5 +192,4 @@ public class XMLUtil {
}
return success;
}
-
}
diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/AbstractContentChildren.java b/Core/src/org/sleuthkit/autopsy/datamodel/AbstractContentChildren.java
index 539fb1e1fc..409a9f6483 100644
--- a/Core/src/org/sleuthkit/autopsy/datamodel/AbstractContentChildren.java
+++ b/Core/src/org/sleuthkit/autopsy/datamodel/AbstractContentChildren.java
@@ -22,7 +22,6 @@ import org.openide.nodes.AbstractNode;
import org.openide.nodes.Children.Keys;
import org.openide.nodes.Node;
import org.openide.util.NbBundle;
-import org.sleuthkit.autopsy.datamodel.KeywordHits.KeywordHitsRootNode;
import org.sleuthkit.datamodel.Content;
import org.sleuthkit.datamodel.DerivedFile;
import org.sleuthkit.datamodel.Directory;
@@ -119,8 +118,8 @@ abstract class AbstractContentChildren extends Keys {
static class CreateAutopsyNodeVisitor extends AutopsyItemVisitor.Default {
@Override
- public ExtractedContentNode visit(ExtractedContent ec) {
- return new ExtractedContentNode(ec.getSleuthkitCase());
+ public ExtractedContent.RootNode visit(ExtractedContent ec) {
+ return ec.new RootNode(ec.getSleuthkitCase());
}
@Override
@@ -145,27 +144,27 @@ abstract class AbstractContentChildren extends Keys {
@Override
public AbstractNode visit(KeywordHits kh) {
- return kh.new KeywordHitsRootNode();
+ return kh.new RootNode();
}
@Override
public AbstractNode visit(HashsetHits hh) {
- return hh.new HashsetHitsRootNode();
+ return hh.new RootNode();
}
@Override
public AbstractNode visit(InterestingHits ih) {
- return ih.new InterestingHitsRootNode();
+ return ih.new RootNode();
}
@Override
public AbstractNode visit(EmailExtracted ee) {
- return ee.new EmailExtractedRootNode();
+ return ee.new RootNode();
}
@Override
- public AbstractNode visit(TagsNodeKey tagsNodeKey) {
- return new TagsNode();
+ public AbstractNode visit(Tags tagsNodeKey) {
+ return tagsNodeKey.new RootNode();
}
@Override
diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/ArtifactTypeChildren.java b/Core/src/org/sleuthkit/autopsy/datamodel/ArtifactTypeChildren.java
deleted file mode 100644
index a1c3182978..0000000000
--- a/Core/src/org/sleuthkit/autopsy/datamodel/ArtifactTypeChildren.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Autopsy Forensic Browser
- *
- * Copyright 2011 Basis Technology Corp.
- * Contact: carrier sleuthkit org
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.sleuthkit.autopsy.datamodel;
-
-import java.util.List;
-import java.util.logging.Level;
-import org.sleuthkit.autopsy.coreutils.Logger;
-import org.openide.nodes.ChildFactory;
-import org.openide.nodes.Node;
-import org.sleuthkit.datamodel.BlackboardArtifact;
-import org.sleuthkit.datamodel.SleuthkitCase;
-import org.sleuthkit.datamodel.TskException;
-
-/**
- *
- * @author dfickling
- */
-class ArtifactTypeChildren extends ChildFactory{
-
- private SleuthkitCase skCase;
- private BlackboardArtifact.ARTIFACT_TYPE type;
-
- public ArtifactTypeChildren(BlackboardArtifact.ARTIFACT_TYPE type, SleuthkitCase skCase) {
- this.skCase = skCase;
- this.type = type;
- }
-
- @Override
- protected boolean createKeys(List list) {
- try {
- List arts = skCase.getBlackboardArtifacts(type.getTypeID());
- //list.addAll(arts.subList(0, Math.min(arts.size(), getTypeLimit(type))));
- list.addAll(arts);
- } catch (TskException ex) {
- Logger.getLogger(ArtifactTypeChildren.class.getName())
- .log(Level.SEVERE, "Couldn't get blackboard artifacts from database", ex); //NON-NLS
- }
- return true;
- }
-
- @Override
- protected Node createNodeForKey(BlackboardArtifact key){
- return new BlackboardArtifactNode(key);
- }
-
- /**
- private static int getTypeLimit(BlackboardArtifact.ARTIFACT_TYPE type) {
- switch(type) {
- case TSK_WEB_HISTORY:
- return 1000000;
- case TSK_WEB_COOKIE:
- return 1000000;
- default:
- return 1000000;
- }
- }
- */
-
-}
diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/ArtifactTypeNode.java b/Core/src/org/sleuthkit/autopsy/datamodel/ArtifactTypeNode.java
deleted file mode 100644
index 5df1fc1474..0000000000
--- a/Core/src/org/sleuthkit/autopsy/datamodel/ArtifactTypeNode.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- * Autopsy Forensic Browser
- *
- * Copyright 2011-2014 Basis Technology Corp.
- * Contact: carrier sleuthkit org
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.sleuthkit.autopsy.datamodel;
-
-import java.util.logging.Level;
-
-import org.openide.util.NbBundle;
-import org.sleuthkit.autopsy.coreutils.Logger;
-import org.openide.nodes.Children;
-import org.openide.nodes.Sheet;
-import org.openide.util.lookup.Lookups;
-import org.sleuthkit.datamodel.BlackboardArtifact;
-import org.sleuthkit.datamodel.SleuthkitCase;
-import org.sleuthkit.datamodel.TskException;
-
-/**
- * Node encapsulating blackboard artifact type. This is used on the left-hand
- * navigation side of the Autopsy UI as the parent node for all of the artifacts
- * of a given type. Its children will be BlackboardArtifactNode objects.
- */
-public class ArtifactTypeNode extends DisplayableItemNode {
-
- private BlackboardArtifact.ARTIFACT_TYPE type;
- private long childCount = 0;
-
- ArtifactTypeNode(BlackboardArtifact.ARTIFACT_TYPE type, SleuthkitCase skCase) {
- super(Children.create(new ArtifactTypeChildren(type, skCase), true), Lookups.singleton(type.getDisplayName()));
- super.setName(type.getLabel());
- // NOTE: This completely destroys our lazy-loading ideal
- // a performance increase might be had by adding a
- // "getBlackboardArtifactCount()" method to skCase
- try {
- this.childCount = skCase.getBlackboardArtifactsTypeCount(type.getTypeID());
- } catch (TskException ex) {
- Logger.getLogger(ArtifactTypeNode.class.getName())
- .log(Level.WARNING, "Error getting child count", ex); //NON-NLS
- }
- super.setDisplayName(type.getDisplayName() + " (" + childCount + ")");
- this.type = type;
- this.setIconBaseWithExtension("org/sleuthkit/autopsy/images/" + getIcon(type)); //NON-NLS
-
- }
-
- @Override
- protected Sheet createSheet() {
- Sheet s = super.createSheet();
- Sheet.Set ss = s.get(Sheet.PROPERTIES);
- if (ss == null) {
- ss = Sheet.createPropertiesSet();
- s.put(ss);
- }
-
- ss.put(new NodeProperty<>(NbBundle.getMessage(this.getClass(), "ArtifactTypeNode.createSheet.artType.name"),
- NbBundle.getMessage(this.getClass(), "ArtifactTypeNode.createSheet.artType.displayName"),
- NbBundle.getMessage(this.getClass(), "ArtifactTypeNode.createSheet.artType.desc"),
- type.getDisplayName()));
-
- ss.put(new NodeProperty<>(NbBundle.getMessage(this.getClass(), "ArtifactTypeNode.createSheet.childCnt.name"),
- NbBundle.getMessage(this.getClass(), "ArtifactTypeNode.createSheet.childCnt.displayName"),
- NbBundle.getMessage(this.getClass(), "ArtifactTypeNode.createSheet.childCnt.desc"),
- childCount));
-
- return s;
- }
-
- @Override
- public T accept(DisplayableItemNodeVisitor v) {
- return v.visit(this);
- }
-
- // @@@ TODO: Merge with BlackboartArtifactNode.getIcon()
- private String getIcon(BlackboardArtifact.ARTIFACT_TYPE type) {
- switch (type) {
- case TSK_WEB_BOOKMARK:
- return "bookmarks.png"; //NON-NLS
- case TSK_WEB_COOKIE:
- return "cookies.png"; //NON-NLS
- case TSK_WEB_HISTORY:
- return "history.png"; //NON-NLS
- case TSK_WEB_DOWNLOAD:
- return "downloads.png"; //NON-NLS
- case TSK_INSTALLED_PROG:
- return "programs.png"; //NON-NLS
- case TSK_RECENT_OBJECT:
- return "recent_docs.png"; //NON-NLS
- case TSK_DEVICE_ATTACHED:
- return "usb_devices.png"; //NON-NLS
- case TSK_WEB_SEARCH_QUERY:
- return "searchquery.png"; //NON-NLS
- case TSK_METADATA_EXIF:
- return "camera-icon-16.png"; //NON-NLS
- case TSK_CONTACT:
- return "contact.png"; //NON-NLS
- case TSK_MESSAGE:
- return "message.png"; //NON-NLS
- case TSK_CALLLOG:
- return "calllog.png"; //NON-NLS
- case TSK_CALENDAR_ENTRY:
- return "calendar.png"; //NON-NLS
- case TSK_SPEED_DIAL_ENTRY:
- return "speeddialentry.png"; //NON-NLS
- case TSK_BLUETOOTH_PAIRING:
- return "bluetooth.png"; //NON-NLS
- case TSK_GPS_BOOKMARK:
- return "gpsfav.png"; //NON-NLS
- case TSK_GPS_LAST_KNOWN_LOCATION:
- return "gps-lastlocation.png"; //NON-NLS
- case TSK_GPS_SEARCH:
- return "gps-search.png"; //NON-NLS
- case TSK_SERVICE_ACCOUNT:
- return "account-icon-16.png"; //NON-NLS
- case TSK_ENCRYPTION_DETECTED:
- return "encrypted-file.png"; //NON-NLS
- case TSK_EXT_MISMATCH_DETECTED:
- return "mismatch-16.png"; //NON-NLS
- }
- return "artifact-icon.png"; //NON-NLS
- }
-
- @Override
- public boolean isLeafTypeNode() {
- return true;
- }
-}
diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/AutopsyItemVisitor.java b/Core/src/org/sleuthkit/autopsy/datamodel/AutopsyItemVisitor.java
index 3a53552739..1f5cf9ae71 100644
--- a/Core/src/org/sleuthkit/autopsy/datamodel/AutopsyItemVisitor.java
+++ b/Core/src/org/sleuthkit/autopsy/datamodel/AutopsyItemVisitor.java
@@ -19,8 +19,6 @@
package org.sleuthkit.autopsy.datamodel;
/**
- *
- * @author dfickling
*/
interface AutopsyItemVisitor {
@@ -52,7 +50,7 @@ package org.sleuthkit.autopsy.datamodel;
T visit(EmailExtracted ee);
- T visit(TagsNodeKey tagsNodeKey);
+ T visit(Tags tagsNodeKey);
T visit(InterestingHits ih);
@@ -141,7 +139,7 @@ package org.sleuthkit.autopsy.datamodel;
}
@Override
- public T visit(TagsNodeKey tagsNodeKey) {
+ public T visit(Tags tagsNodeKey) {
return defaultVisit(tagsNodeKey);
}
diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/BlackboardArtifactNode.java b/Core/src/org/sleuthkit/autopsy/datamodel/BlackboardArtifactNode.java
index 9cebc3a51c..69af7dccaf 100644
--- a/Core/src/org/sleuthkit/autopsy/datamodel/BlackboardArtifactNode.java
+++ b/Core/src/org/sleuthkit/autopsy/datamodel/BlackboardArtifactNode.java
@@ -41,8 +41,8 @@ import org.sleuthkit.datamodel.TskCoreException;
import org.sleuthkit.datamodel.TskException;
/**
- * Node wrapping a blackboard artifact object. This represents a single artifact.
- * Its parent is typically an ArtifactTypeNode.
+ * Node wrapping a blackboard artifact object. This is generated from several
+ * places in the tree.
*/
public class BlackboardArtifactNode extends DisplayableItemNode {
diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/Bundle.properties b/Core/src/org/sleuthkit/autopsy/datamodel/Bundle.properties
index 9fccb340ce..45e8f78bd1 100644
--- a/Core/src/org/sleuthkit/autopsy/datamodel/Bundle.properties
+++ b/Core/src/org/sleuthkit/autopsy/datamodel/Bundle.properties
@@ -48,6 +48,9 @@ BlackboardArtifactTagNode.createSheet.unavail.text=Unavailable
BlackboardArtifactTagNode.createSheet.srcFilePath.text=Source File Path
BlackboardArtifactTagNode.createSheet.resultType.text=Result Type
BlackboardArtifactTagNode.createSheet.comment.text=Comment
+BlackboardArtifactTagTypeNode.displayName.text=Result Tags
+BlackboardArtifactTagTypeNode.createSheet.name.name=Name
+BlackboardArtifactTagTypeNode.createSheet.name.displayName=Name
ContentTagNode.createSheet.file.name=File
ContentTagNode.createSheet.file.displayName=File
ContentTagNode.createSheet.unavail.path=Unavailable
diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/datamodel/Bundle_ja.properties
index 6e0bb7a032..99286125a3 100644
--- a/Core/src/org/sleuthkit/autopsy/datamodel/Bundle_ja.properties
+++ b/Core/src/org/sleuthkit/autopsy/datamodel/Bundle_ja.properties
@@ -1,250 +1,253 @@
-OpenIDE-Module-Name=\u30C7\u30FC\u30BF\u30E2\u30C7\u30EB
-AbstractAbstractFileNode.nameColLbl=\u540D\u524D
-AbstractAbstractFileNode.locationColLbl=\u30ED\u30B1\u30FC\u30B7\u30E7\u30F3
-AbstractAbstractFileNode.modifiedTimeColLbl=\u4FEE\u6B63\u65E5\u6642
-AbstractAbstractFileNode.changeTimeColLbl=\u5909\u66F4\u65E5\u6642
-AbstractAbstractFileNode.accessTimeColLbl=\u30A2\u30AF\u30BB\u30B9\u65E5\u6642
-AbstractAbstractFileNode.createdTimeColLbl=\u4F5C\u6210\u65E5\u6642
-AbstractAbstractFileNode.sizeColLbl=\u30B5\u30A4\u30BA
-AbstractAbstractFileNode.modeColLbl=\u30E2\u30FC\u30C9
-AbstractAbstractFileNode.useridColLbl=\u30E6\u30FC\u30B6ID
-AbstractAbstractFileNode.groupidColLbl=\u30B0\u30EB\u30FC\u30D7ID
-AbstractAbstractFileNode.knownColLbl=\u65E2\u77E5
-AbstractAbstractFileNode.inHashsetsColLbl=HashSet\u306B\u5B58\u5728
-AbstractAbstractFileNode.md5HashColLbl=MD5\u30CF\u30C3\u30B7\u30E5
-AbstractContentChildren.CreateTSKNodeVisitor.exception.noNodeMsg=\u6307\u5B9A\u3055\u308C\u305FSleuthkitItem\u306E\u30CE\u30FC\u30C9\u304C\u5B9A\u7FA9\u3055\u308C\u3066\u3044\u307E\u305B\u3093
-AbstractContentChildren.createAutopsyNodeVisitor.exception.noNodeMsg=\u6307\u5B9A\u3055\u308C\u305F\u8868\u793A\u53EF\u80FD\u306A\u30A2\u30A4\u30C6\u30E0\u306E\u30CE\u30FC\u30C9\u304C\u5B9A\u7FA9\u3055\u308C\u3066\u3044\u307E\u305B\u3093
-AbstractContentNode.exception.cannotChangeSysName.msg=\u30B7\u30B9\u30C6\u30E0\u540D\u3092\u5909\u66F4\u3067\u304D\u307E\u305B\u3093\u3002
-AbstractFsContentNode.noDesc.text=\u8AAC\u660E\u304C\u3042\u308A\u307E\u305B\u3093
-ArtifactStringContent.getStr.srcFilePath.text=\u30BD\u30FC\u30B9\u30D5\u30A1\u30A4\u30EB\u30D1\u30B9
-ArtifactStringContent.getStr.err=\u30B3\u30F3\u30C6\u30F3\u30C4\u53D6\u5F97\u30A8\u30E9\u30FC
-ArtifactStringContent.exception.msg=\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u304B\u3089\u30D5\u30A1\u30A4\u30EB\u3092\u53D6\u5F97\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F
-ArtifactTypeNode.createSheet.artType.desc=\u8AAC\u660E\u304C\u3042\u308A\u307E\u305B\u3093
-ArtifactTypeNode.createSheet.childCnt.name=\u30C1\u30E3\u30A4\u30EB\u30C9\u6570
-ArtifactTypeNode.createSheet.childCnt.desc=\u8AAC\u660E\u304C\u3042\u308A\u307E\u305B\u3093
-BlackboardArtifactNode.noDesc.text=\u8AAC\u660E\u304C\u3042\u308A\u307E\u305B\u3093
-BlackboardArtifactNode.createSheet.srcFile.name=\u30BD\u30FC\u30B9\u30D5\u30A1\u30A4\u30EB
-BlackboardArtifactNode.createSheet.srcFile.displayName=\u30BD\u30FC\u30B9\u30D5\u30A1\u30A4\u30EB
-BlackboardArtifactNode.createSheet.ext.name=\u62E1\u5F35\u5B50
-BlackboardArtifactNode.createSheet.ext.displayName=\u62E1\u5F35\u5B50
-BlackboardArtifactNode.createSheet.mimeType.name=MIME\u30BF\u30A4\u30D7
-BlackboardArtifactNode.createSheet.mimeType.displayName=MIME\u30BF\u30A4\u30D7
-BlackboardArtifactNode.createSheet.filePath.name=\u30D5\u30A1\u30A4\u30EB\u30D1\u30B9
-BlackboardArtifactNode.createSheet.filePath.displayName=\u30D5\u30A1\u30A4\u30EB\u30D1\u30B9
-BlackboardArtifactNode.createSheet.dataSrc.name=\u30C7\u30FC\u30BF\u30BD\u30FC\u30B9
-BlackboardArtifactNode.createSheet.dataSrc.displayName=\u30C7\u30FC\u30BF\u30BD\u30FC\u30B9
-BlackboardArtifactNode.getAssocCont.exception.msg=\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u304B\u3089\u30D5\u30A1\u30A4\u30EB\u3092\u53D6\u5F97\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F
-BlackboardArtifactTagNode.createSheet.srcFile.text=\u30BD\u30FC\u30B9\u30D5\u30A1\u30A4\u30EB
-BlackboardArtifactTagNode.createSheet.unavail.text=\u4F7F\u7528\u3067\u304D\u307E\u305B\u3093
-BlackboardArtifactTagNode.createSheet.srcFilePath.text=\u30BD\u30FC\u30B9\u30D5\u30A1\u30A4\u30EB\u30D1\u30B9
-BlackboardArtifactTagNode.createSheet.resultType.text=\u7D50\u679C\u30BF\u30A4\u30D7
-BlackboardArtifactTagNode.createSheet.comment.text=\u30B3\u30E1\u30F3\u30C8
-ContentTagNode.createSheet.file.name=\u30D5\u30A1\u30A4\u30EB
-ContentTagNode.createSheet.file.displayName=\u30D5\u30A1\u30A4\u30EB
-ContentTagNode.createSheet.unavail.path=\u4F7F\u7528\u3067\u304D\u307E\u305B\u3093
-ContentTagNode.createSheet.filePath.name=\u30D5\u30A1\u30A4\u30EB\u30D1\u30B9
-ContentTagNode.createSheet.filePath.displayName=\u30D5\u30A1\u30A4\u30EB\u30D1\u30B9
-ContentTagNode.createSheet.comment.name=\u30B3\u30E1\u30F3\u30C8
-ContentTagNode.createSheet.comment.displayName=\u30B3\u30E1\u30F3\u30C8
-ContentTagTypeNode.displayName.text=\u30D5\u30A1\u30A4\u30EB\u30BF\u30B0
-ContentTagTypeNode.createSheet.name.name=\u540D\u524D
-ContentTagTypeNode.createSheet.name.displayName=\u540D\u524D
-ContentUtils.exception.msg={0}\u3092\u62BD\u51FA\u3067\u304D\u307E\u305B\u3093
-DataModelActionsFactory.srcFileInDir.text=\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u5185\u306E\u30BD\u30FC\u30B9\u30D5\u30A1\u30A4\u30EB\u3092\u8868\u793A
-DataModelActionsFactory.fileInDir.text=\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u5185\u306E\u30D5\u30A1\u30A4\u30EB\u3092\u8868\u793A
-DataModelActionsFactory.viewNewWin.text=\u65B0\u898F\u30A6\u30A3\u30F3\u30C9\u30A6\u306B\u8868\u793A
-DataModelActionsFactory.openExtViewer.text=\u5916\u90E8\u30D3\u30E5\u30FC\u30A2\u306B\u8868\u793A
-DataModelActionsFactory.srfFileSameMD5.text=\u540C\u3058MD5\u30CF\u30C3\u30B7\u30E5\u3092\u6301\u3064\u30D5\u30A1\u30A4\u30EB\u3092\u691C\u7D22
-DataSourcesNode.name=\u30C7\u30FC\u30BF\u30BD\u30FC\u30B9
-DataSourcesNode.createSheet.name.name=\u540D\u524D
-DataSourcesNode.createSheet.name.displayName=\u540D\u524D
-DataSourcesNode.createSheet.name.desc=\u8AAC\u660E\u304C\u3042\u308A\u307E\u305B\u3093
-DeletedContent.fsDelFilter.text=\u30D5\u30A1\u30A4\u30EB\u30B7\u30B9\u30C6\u30E0
+OpenIDE-Module-Name=\u30c7\u30fc\u30bf\u30e2\u30c7\u30eb
+AbstractAbstractFileNode.nameColLbl=\u540d\u524d
+AbstractAbstractFileNode.locationColLbl=\u30ed\u30b1\u30fc\u30b7\u30e7\u30f3
+AbstractAbstractFileNode.modifiedTimeColLbl=\u4fee\u6b63\u65e5\u6642
+AbstractAbstractFileNode.changeTimeColLbl=\u5909\u66f4\u65e5\u6642
+AbstractAbstractFileNode.accessTimeColLbl=\u30a2\u30af\u30bb\u30b9\u65e5\u6642
+AbstractAbstractFileNode.createdTimeColLbl=\u4f5c\u6210\u65e5\u6642
+AbstractAbstractFileNode.sizeColLbl=\u30b5\u30a4\u30ba
+AbstractAbstractFileNode.modeColLbl=\u30e2\u30fc\u30c9
+AbstractAbstractFileNode.useridColLbl=\u30e6\u30fc\u30b6ID
+AbstractAbstractFileNode.groupidColLbl=\u30b0\u30eb\u30fc\u30d7ID
+AbstractAbstractFileNode.knownColLbl=\u65e2\u77e5
+AbstractAbstractFileNode.inHashsetsColLbl=HashSet\u306b\u5b58\u5728
+AbstractAbstractFileNode.md5HashColLbl=MD5\u30cf\u30c3\u30b7\u30e5
+AbstractContentChildren.CreateTSKNodeVisitor.exception.noNodeMsg=\u6307\u5b9a\u3055\u308c\u305fSleuthkitItem\u306e\u30ce\u30fc\u30c9\u304c\u5b9a\u7fa9\u3055\u308c\u3066\u3044\u307e\u305b\u3093
+AbstractContentChildren.createAutopsyNodeVisitor.exception.noNodeMsg=\u6307\u5b9a\u3055\u308c\u305f\u8868\u793a\u53ef\u80fd\u306a\u30a2\u30a4\u30c6\u30e0\u306e\u30ce\u30fc\u30c9\u304c\u5b9a\u7fa9\u3055\u308c\u3066\u3044\u307e\u305b\u3093
+AbstractContentNode.exception.cannotChangeSysName.msg=\u30b7\u30b9\u30c6\u30e0\u540d\u3092\u5909\u66f4\u3067\u304d\u307e\u305b\u3093\u3002
+AbstractFsContentNode.noDesc.text=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093
+ArtifactStringContent.getStr.srcFilePath.text=\u30bd\u30fc\u30b9\u30d5\u30a1\u30a4\u30eb\u30d1\u30b9
+ArtifactStringContent.getStr.err=\u30b3\u30f3\u30c6\u30f3\u30c4\u53d6\u5f97\u30a8\u30e9\u30fc
+ArtifactStringContent.exception.msg=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u304b\u3089\u30d5\u30a1\u30a4\u30eb\u3092\u53d6\u5f97\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f
+ArtifactTypeNode.createSheet.artType.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093
+ArtifactTypeNode.createSheet.childCnt.name=\u30c1\u30e3\u30a4\u30eb\u30c9\u6570
+ArtifactTypeNode.createSheet.childCnt.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093
+BlackboardArtifactNode.noDesc.text=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093
+BlackboardArtifactNode.createSheet.srcFile.name=\u30bd\u30fc\u30b9\u30d5\u30a1\u30a4\u30eb
+BlackboardArtifactNode.createSheet.srcFile.displayName=\u30bd\u30fc\u30b9\u30d5\u30a1\u30a4\u30eb
+BlackboardArtifactNode.createSheet.ext.name=\u62e1\u5f35\u5b50
+BlackboardArtifactNode.createSheet.ext.displayName=\u62e1\u5f35\u5b50
+BlackboardArtifactNode.createSheet.mimeType.name=MIME\u30bf\u30a4\u30d7
+BlackboardArtifactNode.createSheet.mimeType.displayName=MIME\u30bf\u30a4\u30d7
+BlackboardArtifactNode.createSheet.filePath.name=\u30d5\u30a1\u30a4\u30eb\u30d1\u30b9
+BlackboardArtifactNode.createSheet.filePath.displayName=\u30d5\u30a1\u30a4\u30eb\u30d1\u30b9
+BlackboardArtifactNode.createSheet.dataSrc.name=\u30c7\u30fc\u30bf\u30bd\u30fc\u30b9
+BlackboardArtifactNode.createSheet.dataSrc.displayName=\u30c7\u30fc\u30bf\u30bd\u30fc\u30b9
+BlackboardArtifactNode.getAssocCont.exception.msg=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u304b\u3089\u30d5\u30a1\u30a4\u30eb\u3092\u53d6\u5f97\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f
+BlackboardArtifactTagNode.createSheet.srcFile.text=\u30bd\u30fc\u30b9\u30d5\u30a1\u30a4\u30eb
+BlackboardArtifactTagNode.createSheet.unavail.text=\u4f7f\u7528\u3067\u304d\u307e\u305b\u3093
+BlackboardArtifactTagNode.createSheet.srcFilePath.text=\u30bd\u30fc\u30b9\u30d5\u30a1\u30a4\u30eb\u30d1\u30b9
+BlackboardArtifactTagNode.createSheet.resultType.text=\u7d50\u679c\u30bf\u30a4\u30d7
+BlackboardArtifactTagNode.createSheet.comment.text=\u30b3\u30e1\u30f3\u30c8
+BlackboardArtifactTagTypeNode.displayName.text=\u7d50\u679c\u30bf\u30b0
+BlackboardArtifactTagTypeNode.createSheet.name.name=\u540d\u524d
+BlackboardArtifactTagTypeNode.createSheet.name.displayName=\u540d\u524d
+ContentTagNode.createSheet.file.name=\u30d5\u30a1\u30a4\u30eb
+ContentTagNode.createSheet.file.displayName=\u30d5\u30a1\u30a4\u30eb
+ContentTagNode.createSheet.unavail.path=\u4f7f\u7528\u3067\u304d\u307e\u305b\u3093
+ContentTagNode.createSheet.filePath.name=\u30d5\u30a1\u30a4\u30eb\u30d1\u30b9
+ContentTagNode.createSheet.filePath.displayName=\u30d5\u30a1\u30a4\u30eb\u30d1\u30b9
+ContentTagNode.createSheet.comment.name=\u30b3\u30e1\u30f3\u30c8
+ContentTagNode.createSheet.comment.displayName=\u30b3\u30e1\u30f3\u30c8
+ContentTagTypeNode.displayName.text=\u30d5\u30a1\u30a4\u30eb\u30bf\u30b0
+ContentTagTypeNode.createSheet.name.name=\u540d\u524d
+ContentTagTypeNode.createSheet.name.displayName=\u540d\u524d
+ContentUtils.exception.msg={0}\u3092\u62bd\u51fa\u3067\u304d\u307e\u305b\u3093
+DataModelActionsFactory.srcFileInDir.text=\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u5185\u306e\u30bd\u30fc\u30b9\u30d5\u30a1\u30a4\u30eb\u3092\u8868\u793a
+DataModelActionsFactory.fileInDir.text=\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u5185\u306e\u30d5\u30a1\u30a4\u30eb\u3092\u8868\u793a
+DataModelActionsFactory.viewNewWin.text=\u65b0\u898f\u30a6\u30a3\u30f3\u30c9\u30a6\u306b\u8868\u793a
+DataModelActionsFactory.openExtViewer.text=\u5916\u90e8\u30d3\u30e5\u30fc\u30a2\u306b\u8868\u793a
+DataModelActionsFactory.srfFileSameMD5.text=\u540c\u3058MD5\u30cf\u30c3\u30b7\u30e5\u3092\u6301\u3064\u30d5\u30a1\u30a4\u30eb\u3092\u691c\u7d22
+DataSourcesNode.name=\u30c7\u30fc\u30bf\u30bd\u30fc\u30b9
+DataSourcesNode.createSheet.name.name=\u540d\u524d
+DataSourcesNode.createSheet.name.displayName=\u540d\u524d
+DataSourcesNode.createSheet.name.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093
+DeletedContent.fsDelFilter.text=\u30d5\u30a1\u30a4\u30eb\u30b7\u30b9\u30c6\u30e0
DeletedContent.allDelFilter.text=\u3059\u3079\u3066
-DeletedContent.deletedContentsNode.name=\u524A\u9664\u3055\u308C\u305F\u30D5\u30A1\u30A4\u30EB
-DeletedContent.createSheet.name.name=\u540D\u524D
-DeletedContent.createSheet.name.displayName=\u540D\u524D
-DeletedContent.createSheet.name.desc=\u8AAC\u660E\u304C\u3042\u308A\u307E\u305B\u3093
-DeletedContent.createSheet.filterType.name=\u30D5\u30A1\u30A4\u30EB\u30BF\u30BF\u30A4\u30D7
-DeletedContent.createSheet.filterType.displayName=\u30D5\u30A3\u30EB\u30BF\u30BF\u30A4\u30D7
-DeletedContent.createSheet.filterType.desc=\u8AAC\u660E\u304C\u3042\u308A\u307E\u305B\u3093
-DeletedContent.createKeys.maxObjects.msg=\u8868\u793A\u53EF\u80FD\u306A\u6570\u3088\u308A\u3082\u591A\u304F\u306E\u524A\u9664\u3055\u308C\u305F\u30D5\u30A1\u30A4\u30EB\u304C\u5B58\u5728\u3057\u307E\u3059\u3002\u6700\u521D\u306E{0}\u306E\u524A\u9664\u3055\u308C\u305F\u30D5\u30A1\u30A4\u30EB\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002
-DeletedContent.createNodeForKey.typeNotSupported.msg=\u3053\u306E\u30BF\u30A4\u30D7\u306E\u8868\u793A\u53EF\u80FD\u306A\u30A2\u30A4\u30C6\u30E0\u306F\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u3066\u3044\u307E\u305B\u3093\uFF1A{0}
-DirectoryNode.parFolder.text=[\u30DA\u30A2\u30EC\u30F3\u30C8\u30D5\u30A9\u30EB\u30C0]
-DirectoryNode.curFolder.text=[\u73FE\u5728\u306E\u30D5\u30A9\u30EB\u30C0]
-DirectoryNode.getActions.viewFileInDir.text=\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u5185\u306E\u30D5\u30A1\u30A4\u30EB\u3092\u8868\u793A
-DirectoryNode.viewInNewWin.text=\u65B0\u898F\u30A6\u30A3\u30F3\u30C9\u30A6\u306B\u8868\u793A
-EmailExtracted.mailAccount.text=\u30A2\u30AB\u30A6\u30F3\u30C8
-EmailExtracted.mailFolder.text=\u30D5\u30A9\u30EB\u30C0
-EmailExtracted.defaultAcct.text=\u30C7\u30D5\u30A9\u30EB\u30C8
-EmailExtracted.defaultFolder.text=\u30C7\u30D5\u30A9\u30EB\u30C8
-EmailExtracted.createSheet.name.name=\u540D\u524D
-EmailExtracted.createSheet.name.displayName=\u540D\u524D
-EmailExtracted.createSheet.name.desc=\u8AAC\u660E\u304C\u3042\u308A\u307E\u305B\u3093
-ExtractedContentNode.name.text=\u62BD\u51FA\u3055\u308C\u305F\u30B3\u30F3\u30C6\u30F3\u30C4
-ExtractedContentNode.createSheet.name.name=\u540D\u524D
-ExtractedContentNode.createSheet.name.displayName=\u540D\u524D
-ExtractedContentNode.createSheet.name.desc=\u8AAC\u660E\u304C\u3042\u308A\u307E\u305B\u3093
-FileNode.viewFileInDir.text=\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u5185\u306E\u30D5\u30A1\u30A4\u30EB\u3092\u8868\u793A
-FileNode.getActions.viewInNewWin.text=\u65B0\u898F\u30A6\u30A3\u30F3\u30C9\u30A6\u306B\u8868\u793A
-FileNode.getActions.openInExtViewer.text=\u5916\u90E8\u30D3\u30E5\u30FC\u30A2\u3067\u958B\u304F
-FileNode.getActions.searchFilesSameMD5.text=\u540C\u3058MD5\u30CF\u30C3\u30B7\u30E5\u3092\u6301\u3064\u30D5\u30A1\u30A4\u30EB\u3092\u691C\u7D22
-FileSize.fileSizeRootNode.name=\u30D5\u30A1\u30A4\u30EB\u30B5\u30A4\u30BA
-FileSize.createSheet.name.name=\u540D\u524D
-FileSize.createSheet.name.displayName=\u540D\u524D
-FileSize.createSheet.name.desc=\u8AAC\u660E\u304C\u3042\u308A\u307E\u305B\u3093
-FileSize.createSheet.filterType.name=\u30D5\u30A3\u30EB\u30BF\u30BF\u30A4\u30D7
-FileSize.createSheet.filterType.displayName=\u30D5\u30A3\u30EB\u30BF\u30BF\u30A4\u30D7
-FileSize.createSheet.filterType.desc=\u8AAC\u660E\u304C\u3042\u308A\u307E\u305B\u3093
-FileSize.exception.notSupported.msg=\u3053\u306E\u30BF\u30A4\u30D7\u306E\u8868\u793A\u53EF\u80FD\u306A\u30A2\u30A4\u30C6\u30E0\u306F\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u3066\u3044\u307E\u305B\u3093\uFF1A{0}
-FileTypeChildren.exception.notSupported.msg=\u3053\u306E\u30BF\u30A4\u30D7\u306E\u8868\u793A\u53EF\u80FD\u306A\u30A2\u30A4\u30C6\u30E0\u306F\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u3066\u3044\u307E\u305B\u3093\uFF1A{0}
-FileTypeExtensionFilters.tskImgFilter.text=\u30A4\u30E1\u30FC\u30B8
-FileTypeExtensionFilters.tskVideoFilter.text=\u30D3\u30C7\u30AA
-FileTypeExtensionFilters.tskAudioFilter.text=\u30AA\u30FC\u30C7\u30A3\u30AA
-FileTypeExtensionFilters.tskArchiveFilter.text=\u30A2\u30FC\u30AB\u30A4\u30D6
-FileTypeExtensionFilters.tskDocumentFilter.text=\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8
-FileTypeExtensionFilters.tskExecFilter.text=\u5B9F\u884C\u53EF\u80FD
+DeletedContent.deletedContentsNode.name=\u524a\u9664\u3055\u308c\u305f\u30d5\u30a1\u30a4\u30eb
+DeletedContent.createSheet.name.name=\u540d\u524d
+DeletedContent.createSheet.name.displayName=\u540d\u524d
+DeletedContent.createSheet.name.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093
+DeletedContent.createSheet.filterType.name=\u30d5\u30a1\u30a4\u30eb\u30bf\u30bf\u30a4\u30d7
+DeletedContent.createSheet.filterType.displayName=\u30d5\u30a3\u30eb\u30bf\u30bf\u30a4\u30d7
+DeletedContent.createSheet.filterType.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093
+DeletedContent.createKeys.maxObjects.msg=\u8868\u793a\u53ef\u80fd\u306a\u6570\u3088\u308a\u3082\u591a\u304f\u306e\u524a\u9664\u3055\u308c\u305f\u30d5\u30a1\u30a4\u30eb\u304c\u5b58\u5728\u3057\u307e\u3059\u3002\u6700\u521d\u306e{0}\u306e\u524a\u9664\u3055\u308c\u305f\u30d5\u30a1\u30a4\u30eb\u304c\u8868\u793a\u3055\u308c\u307e\u3059\u3002
+DeletedContent.createNodeForKey.typeNotSupported.msg=\u3053\u306e\u30bf\u30a4\u30d7\u306e\u8868\u793a\u53ef\u80fd\u306a\u30a2\u30a4\u30c6\u30e0\u306f\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u307e\u305b\u3093\uff1a{0}
+DirectoryNode.parFolder.text=[\u30da\u30a2\u30ec\u30f3\u30c8\u30d5\u30a9\u30eb\u30c0]
+DirectoryNode.curFolder.text=[\u73fe\u5728\u306e\u30d5\u30a9\u30eb\u30c0]
+DirectoryNode.getActions.viewFileInDir.text=\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u5185\u306e\u30d5\u30a1\u30a4\u30eb\u3092\u8868\u793a
+DirectoryNode.viewInNewWin.text=\u65b0\u898f\u30a6\u30a3\u30f3\u30c9\u30a6\u306b\u8868\u793a
+EmailExtracted.mailAccount.text=\u30a2\u30ab\u30a6\u30f3\u30c8
+EmailExtracted.mailFolder.text=\u30d5\u30a9\u30eb\u30c0
+EmailExtracted.defaultAcct.text=\u30c7\u30d5\u30a9\u30eb\u30c8
+EmailExtracted.defaultFolder.text=\u30c7\u30d5\u30a9\u30eb\u30c8
+EmailExtracted.createSheet.name.name=\u540d\u524d
+EmailExtracted.createSheet.name.displayName=\u540d\u524d
+EmailExtracted.createSheet.name.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093
+ExtractedContentNode.name.text=\u62bd\u51fa\u3055\u308c\u305f\u30b3\u30f3\u30c6\u30f3\u30c4
+ExtractedContentNode.createSheet.name.name=\u540d\u524d
+ExtractedContentNode.createSheet.name.displayName=\u540d\u524d
+ExtractedContentNode.createSheet.name.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093
+FileNode.viewFileInDir.text=\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u5185\u306e\u30d5\u30a1\u30a4\u30eb\u3092\u8868\u793a
+FileNode.getActions.viewInNewWin.text=\u65b0\u898f\u30a6\u30a3\u30f3\u30c9\u30a6\u306b\u8868\u793a
+FileNode.getActions.openInExtViewer.text=\u5916\u90e8\u30d3\u30e5\u30fc\u30a2\u3067\u958b\u304f
+FileNode.getActions.searchFilesSameMD5.text=\u540c\u3058MD5\u30cf\u30c3\u30b7\u30e5\u3092\u6301\u3064\u30d5\u30a1\u30a4\u30eb\u3092\u691c\u7d22
+FileSize.fileSizeRootNode.name=\u30d5\u30a1\u30a4\u30eb\u30b5\u30a4\u30ba
+FileSize.createSheet.name.name=\u540d\u524d
+FileSize.createSheet.name.displayName=\u540d\u524d
+FileSize.createSheet.name.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093
+FileSize.createSheet.filterType.name=\u30d5\u30a3\u30eb\u30bf\u30bf\u30a4\u30d7
+FileSize.createSheet.filterType.displayName=\u30d5\u30a3\u30eb\u30bf\u30bf\u30a4\u30d7
+FileSize.createSheet.filterType.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093
+FileSize.exception.notSupported.msg=\u3053\u306e\u30bf\u30a4\u30d7\u306e\u8868\u793a\u53ef\u80fd\u306a\u30a2\u30a4\u30c6\u30e0\u306f\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u307e\u305b\u3093\uff1a{0}
+FileTypeChildren.exception.notSupported.msg=\u3053\u306e\u30bf\u30a4\u30d7\u306e\u8868\u793a\u53ef\u80fd\u306a\u30a2\u30a4\u30c6\u30e0\u306f\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u307e\u305b\u3093\uff1a{0}
+FileTypeExtensionFilters.tskImgFilter.text=\u30a4\u30e1\u30fc\u30b8
+FileTypeExtensionFilters.tskVideoFilter.text=\u30d3\u30c7\u30aa
+FileTypeExtensionFilters.tskAudioFilter.text=\u30aa\u30fc\u30c7\u30a3\u30aa
+FileTypeExtensionFilters.tskArchiveFilter.text=\u30a2\u30fc\u30ab\u30a4\u30d6
+FileTypeExtensionFilters.tskDocumentFilter.text=\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8
+FileTypeExtensionFilters.tskExecFilter.text=\u5b9f\u884c\u53ef\u80fd
FileTypeExtensionFilters.autDocHtmlFilter.text=HTML
-FileTypeExtensionFilters.autDocOfficeFilter.text=\u30AA\u30D5\u30A3\u30B9
+FileTypeExtensionFilters.autDocOfficeFilter.text=\u30aa\u30d5\u30a3\u30b9
FileTypeExtensionFilters.autoDocPdfFilter.text=PDF
-FileTypeExtensionFilters.autDocTxtFilter.text=\u30D7\u30EC\u30FC\u30F3\u30C6\u30AD\u30B9\u30C8
-FileTypeExtensionFilters.autDocRtfFilter.text=\u30EA\u30C3\u30C1\u30C6\u30AD\u30B9\u30C8
-FileTypeNode.createSheet.filterType.name=\u30D5\u30A3\u30EB\u30BF\u30BF\u30A4\u30D7
-FileTypeNode.createSheet.filterType.displayName=\u30D5\u30A3\u30EB\u30BF\u30BF\u30A4\u30D7
-FileTypeNode.createSheet.filterType.desc=\u8AAC\u660E\u304C\u3042\u308A\u307E\u305B\u3093
-FileTypeNode.createSheet.fileExt.name=\u30D5\u30A1\u30A4\u30EB\u62E1\u5F35\u5B50
-FileTypeNode.createSheet.fileExt.displayName=\u30D5\u30A1\u30A4\u30EB\u62E1\u5F35\u5B50
-FileTypeNode.createSheet.fileExt.desc=\u8AAC\u660E\u304C\u3042\u308A\u307E\u305B\u3093
-FileTypesNode.fname.text=\u30D5\u30A1\u30A4\u30EB\u30BF\u30A4\u30D7
-FileTypesNode.createSheet.name.name=\u540D\u524D
-FileTypesNode.createSheet.name.displayName=\u540D\u524D
-FileTypesNode.createSheet.name.desc=\u8AAC\u660E\u304C\u3042\u308A\u307E\u305B\u3093
-HashsetHits.createSheet.name.name=\u540D\u524D
-HashsetHits.createSheet.name.displayName=\u540D\u524D
-HashsetHits.createSheet.name.desc=\u8AAC\u660E\u304C\u3042\u308A\u307E\u305B\u3093
-ImageNode.getActions.viewInNewWin.text=\u65B0\u898F\u30A6\u30A3\u30F3\u30C9\u30A6\u306B\u8868\u793A
-ImageNode.getActions.openFileSearchByAttr.text=\u5C5E\u6027\u306B\u3088\u308B\u30D5\u30A1\u30A4\u30EB\u691C\u7D22\u3092\u958B\u304F
-ImageNode.createSheet.name.name=\u540D\u524D
-ImageNode.createSheet.name.displayName=\u540D\u524D
-ImageNode.createSheet.name.desc=\u8AAC\u660E\u304C\u3042\u308A\u307E\u305B\u3093
-Installer.exception.tskVerStringNull.msg=Sleuth Kit JNI\u30C6\u30B9\u30C8\u30B3\u30FC\u30EB\u3067\u306F\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u305B\u3093\u3067\u3057\u305F\u304C\u3001\u30D0\u30FC\u30B8\u30E7\u30F3\u30B9\u30C8\u30EA\u30F3\u30B0\u306F\u30CC\u30EB\u3067\u3057\u305F\uFF01
-Installer.tskLibErr.msg=Sleuth Kit JNI\u306B\u554F\u984C\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002\u30C6\u30B9\u30C8\u30B3\u30FC\u30EB\u304C\u5931\u6557\u3057\u307E\u3057\u305F\uFF1A\
+FileTypeExtensionFilters.autDocTxtFilter.text=\u30d7\u30ec\u30fc\u30f3\u30c6\u30ad\u30b9\u30c8
+FileTypeExtensionFilters.autDocRtfFilter.text=\u30ea\u30c3\u30c1\u30c6\u30ad\u30b9\u30c8
+FileTypeNode.createSheet.filterType.name=\u30d5\u30a3\u30eb\u30bf\u30bf\u30a4\u30d7
+FileTypeNode.createSheet.filterType.displayName=\u30d5\u30a3\u30eb\u30bf\u30bf\u30a4\u30d7
+FileTypeNode.createSheet.filterType.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093
+FileTypeNode.createSheet.fileExt.name=\u30d5\u30a1\u30a4\u30eb\u62e1\u5f35\u5b50
+FileTypeNode.createSheet.fileExt.displayName=\u30d5\u30a1\u30a4\u30eb\u62e1\u5f35\u5b50
+FileTypeNode.createSheet.fileExt.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093
+FileTypesNode.fname.text=\u30d5\u30a1\u30a4\u30eb\u30bf\u30a4\u30d7
+FileTypesNode.createSheet.name.name=\u540d\u524d
+FileTypesNode.createSheet.name.displayName=\u540d\u524d
+FileTypesNode.createSheet.name.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093
+HashsetHits.createSheet.name.name=\u540d\u524d
+HashsetHits.createSheet.name.displayName=\u540d\u524d
+HashsetHits.createSheet.name.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093
+ImageNode.getActions.viewInNewWin.text=\u65b0\u898f\u30a6\u30a3\u30f3\u30c9\u30a6\u306b\u8868\u793a
+ImageNode.getActions.openFileSearchByAttr.text=\u5c5e\u6027\u306b\u3088\u308b\u30d5\u30a1\u30a4\u30eb\u691c\u7d22\u3092\u958b\u304f
+ImageNode.createSheet.name.name=\u540d\u524d
+ImageNode.createSheet.name.displayName=\u540d\u524d
+ImageNode.createSheet.name.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093
+Installer.exception.tskVerStringNull.msg=Sleuth Kit JNI\u30c6\u30b9\u30c8\u30b3\u30fc\u30eb\u3067\u306f\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u305b\u3093\u3067\u3057\u305f\u304c\u3001\u30d0\u30fc\u30b8\u30e7\u30f3\u30b9\u30c8\u30ea\u30f3\u30b0\u306f\u30cc\u30eb\u3067\u3057\u305f\uff01
+Installer.tskLibErr.msg=Sleuth Kit JNI\u306b\u554f\u984c\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002\u30c6\u30b9\u30c8\u30b3\u30fc\u30eb\u304c\u5931\u6557\u3057\u307e\u3057\u305f\uff1a\
\
-\u8A73\u7D30\uFF1A {0}
-Installer.tskLibErr.err=\u81F4\u547D\u7684\u30A8\u30E9\u30FC\uFF1A
-InterestingHits.interestingItems.text=\u7591\u308F\u3057\u3044\u30A2\u30A4\u30C6\u30E0
-InterestingHits.displayName.text=\u7591\u308F\u3057\u3044\u30A2\u30A4\u30C6\u30E0
-InterestingHits.createSheet.name.name=\u540D\u524D
-InterestingHits.createSheet.name.displayName=\u540D\u524D
-InterestingHits.createSheet.name.desc=\u8AAC\u660E\u304C\u3042\u308A\u307E\u305B\u3093
-KeyValueNode.createSheet.name.name=\u540D\u524D
-KeyValueNode.createSheet.name.displayName=\u540D\u524D
-KeyValueNode.createSheet.name.desc=\u8A72\u5F53\u306A\u3057
-KeyValueNode.createSheet.map.desc=\u8A72\u5F53\u306A\u3057
-KeywordHits.kwHits.text=\u30AD\u30FC\u30EF\u30FC\u30C9\u30D2\u30C3\u30C8
-KeywordHits.createSheet.name.name=\u540D\u524D
-KeywordHits.createSheet.name.displayName=\u540D\u524D
-KeywordHits.createSheet.name.desc=\u8AAC\u660E\u304C\u3042\u308A\u307E\u305B\u3093
-KeywordHits.createSheet.listName.name=\u30EA\u30B9\u30C8\u540D
-KeywordHits.createSheet.listName.displayName=\u30EA\u30B9\u30C8\u540D
-KeywordHits.createSheet.listName.desc=\u8AAC\u660E\u304C\u3042\u308A\u307E\u305B\u3093
-KeywordHits.createSheet.numChildren.desc=\u8AAC\u660E\u304C\u3042\u308A\u307E\u305B\u3093
-KeywordHits.createSheet.filesWithHits.name=\u30D2\u30C3\u30C8\u3057\u305F\u30D5\u30A1\u30A4\u30EB
-KeywordHits.createSheet.filesWithHits.displayName=\u30D2\u30C3\u30C8\u3057\u305F\u30D5\u30A1\u30A4\u30EB
-KeywordHits.createSheet.filesWithHits.desc=\u8AAC\u660E\u304C\u3042\u308A\u307E\u305B\u3093
-KeywordHits.createNodeForKey.modTime.displayName=\u4FEE\u6B63\u65E5\u6642
-KeywordHits.createNodeForKey.modTime.desc=\u4FEE\u6B63\u65E5\u6642
-KeywordHits.createNodeForKey.accessTime.displayName=\u30A2\u30AF\u30BB\u30B9\u65E5\u6642
-KeywordHits.createNodeForKey.accessTime.desc=\u30A2\u30AF\u30BB\u30B9\u65E5\u6642
-KeywordHits.createNodeForKey.chgTime.displayName=\u5909\u66F4\u65E5\u6642
-KeywordHits.createNodeForKey.chgTime.desc=\u5909\u66F4\u65E5\u6642
-KeywordHits.createNodeForKey.chgTime.name=\u5909\u66F4\u65E5\u6642
-KeywordHits.createNodeForKey.accessTime.name=\u30A2\u30AF\u30BB\u30B9\u65E5\u6642
-KeywordHits.createNodeForKey.modTime.name=\u4FEE\u6B63\u65E5\u6642
-KnownFileFilterNode.selectionContext.dataSources=\u30C7\u30FC\u30BF\u30BD\u30FC\u30B9
-KnownFileFilterNode.selectionContext.views=\u30D3\u30E5\u30FC
-LayoutFileNode.propertyType.parts=\u30D1\u30FC\u30C4
-LayoutFileNode.createSheet.name.name=\u540D\u524D
-LayoutFileNode.createSheet.name.displayName=\u540D\u524D
-LayoutFileNode.createSheet.name.desc=\u8AAC\u660E\u304C\u3042\u308A\u307E\u305B\u3093
-LayoutFileNode.createSheet.noDescr.text=\u8AAC\u660E\u304C\u3042\u308A\u307E\u305B\u3093
-LayoutFileNode.getActions.viewInNewWin.text=\u65B0\u898F\u30A6\u30A3\u30F3\u30C9\u30A6\u3067\u8868\u793A
-LayoutFileNode.getActions.openInExtViewer.text=\u5916\u90E8\u30D3\u30E5\u30FC\u30A2\u3067\u958B\u304F
-LocalFileNode.createSheet.name.name=\u540D\u524D
-LocalFileNode.createSheet.name.displayName=\u540D\u524D
-LocalFileNode.createSheet.name.desc=\u8AAC\u660E\u304C\u3042\u308A\u307E\u305B\u3093
-LocalFileNode.createSheet.noDescr.text=\u8AAC\u660E\u304C\u3042\u308A\u307E\u305B\u3093
-LocalFileNode.getActions.viewInNewWin.text=\u65B0\u898F\u30A6\u30A3\u30F3\u30C9\u30A6\u306B\u8868\u793A
-LocalFileNode.getActions.openInExtViewer.text=\u5916\u90E8\u30D3\u30E5\u30FC\u30A2\u3067\u958B\u304F
-LocalFileNode.getActions.searchFilesSameMd5.text=\u540C\u3058MD5\u30CF\u30C3\u30B7\u30E5\u3092\u6301\u3064\u30D5\u30A1\u30A4\u30EB\u3092\u691C\u7D22
-RecentFiles.aut0DayFilter.displayName.text=\u6700\u7D42\u65E5
-RecentFiles.aut1dayFilter.displayName.text=\u6700\u7D42\u65E5 - 1
-RecentFiles.aut2dayFilter.displayName.text=\u6700\u7D42\u65E5 - \uFF12
-RecentFiles.aut3dayFilter.displayName.text=\u6700\u7D42\u65E5 - \uFF13
-RecentFiles.aut4dayFilter.displayName.text=\u6700\u7D42\u65E5 - \uFF14
-RecentFiles.aut5dayFilter.displayName.text=\u6700\u7D42\u65E5 - \uFF15
-RecentFiles.aut6dayFilter.displayName.text=\u6700\u7D42\u65E5 - \uFF16
-RecentFilesFilterChildren.exception.defaultVisit.msg=\u3053\u306E\u30BF\u30A4\u30D7\u306E\u8868\u793A\u3067\u304D\u308B\u30A2\u30A4\u30C6\u30E0
-Installer.exception.taskVerStringBang.msg=Sleuth Kit JNI\u30C6\u30B9\u30C8\u30B3\u30FC\u30EB\u3067\u306F\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u305B\u3093\u3067\u3057\u305F\u304C\u3001\u30D0\u30FC\u30B8\u30E7\u30F3\u30B9\u30C8\u30EA\u30F3\u30B0\u306F""\u3067\u3057\u305F\uFF01
-RecentFilesFilterNode.createSheet.filterType.name=\u30D5\u30A3\u30EB\u30BF\u30BF\u30A4\u30D7
-RecentFilesFilterNode.createSheet.filterType.displayName=\u30D5\u30A3\u30EB\u30BF\u30BF\u30A4\u30D7
-RecentFilesFilterNode.createSheet.filterType.desc=\u8AAC\u660E\u304C\u3042\u308A\u307E\u305B\u3093
-RecentFilesNode.createSheet.name.name=\u540D\u524D
-RecentFilesNode.createSheet.name.displayName=\u540D\u524D
-RecentFilesNode.createSheet.name.desc=\u8AAC\u660E\u304C\u3042\u308A\u307E\u305B\u3093
-RecentFilesNode.name.text=\u6700\u8FD1\u4F7F\u7528\u3055\u308C\u305F\u30D5\u30A1\u30A4\u30EB
-ResultsNode.name.text=\u7D50\u679C
-ResultsNode.createSheet.name.name=\u540D\u524D
-ResultsNode.createSheet.name.displayName=\u540D\u524D
-ResultsNode.createSheet.name.desc=\u8AAC\u660E\u304C\u3042\u308A\u307E\u305B\u3093
-TagNameNode.namePlusTags.text={0}\u30BF\u30B0
-TagNameNode.contentTagTypeNodeKey.text=\u30B3\u30F3\u30C6\u30F3\u30C4\u30BF\u30B0
-TagNameNode.bbArtTagTypeNodeKey.text=\u7D50\u679C\u30BF\u30B0
-TagNameNode.bookmark.text=\u30D6\u30C3\u30AF\u30DE\u30FC\u30AF
-TagNameNode.createSheet.name.name=\u540D\u524D
-TagNameNode.createSheet.name.displayName=\u540D\u524D
-TagsNode.displayName.text=\u30BF\u30B0
-TagsNode.createSheet.name.name=\u540D\u524D
-AbstractAbstractFileNode.flagsDirColLbl=\u30D5\u30E9\u30B0\uFF08\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\uFF09
-AbstractAbstractFileNode.flagsMetaColLbl=\u30D5\u30E9\u30B0\uFF08\u30E1\u30BF\u30C7\u30FC\u30BF\uFF09
-AbstractAbstractFileNode.metaAddrColLbl=\u30E1\u30BF\u30C7\u30FC\u30BF\u30A2\u30C9\u30EC\u30B9
-AbstractAbstractFileNode.attrAddrColLbl=\u5C5E\u6027\u30A2\u30C9\u30EC\u30B9
-AbstractAbstractFileNode.typeDirColLbl=\u30BF\u30A4\u30D7\uFF08\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\uFF09
-AbstractAbstractFileNode.typeMetaColLbl=\u30BF\u30A4\u30D7\uFF08\u30E1\u30BF\u30C7\u30FC\u30BF\uFF09
-ArtifactTypeNode.createSheet.childCnt.displayName=\u30C1\u30E3\u30A4\u30EB\u30C9\u6570
-TagsNode.createSheet.name.displayName=\u540D\u524D
-ViewsNode.name.text=\u30D3\u30E5\u30FC
-ViewsNode.createSheet.name.name=\u540D\u524D
-ViewsNode.createSheet.name.displayName=\u540D\u524D
-ViewsNode.createSheet.name.desc=\u8AAC\u660E\u304C\u3042\u308A\u307E\u305B\u3093
-VirtualDirectoryNode.getActions.viewInNewWin.text=\u65B0\u898F\u30A6\u30A3\u30F3\u30C9\u30A6\u306B\u8868\u793A
-VirtualDirectoryNode.createSheet.name.name=\u540D\u524D
-VirtualDirectoryNode.createSheet.name.displayName=\u540D\u524D
-VirtualDirectoryNode.createSheet.name.desc=\u8AAC\u660E\u304C\u3042\u308A\u307E\u305B\u3093
-VirtualDirectoryNode.createSheet.noDesc=\u8AAC\u660E\u304C\u3042\u308A\u307E\u305B\u3093
-VolumeNode.getActions.viewInNewWin.text=\u65B0\u898F\u30A6\u30A3\u30F3\u30C9\u30A6\u306B\u8868\u793A
-VolumeNode.createSheet.name.name=\u540D\u524D
-VolumeNode.createSheet.name.displayName=\u540D\u524D
-VolumeNode.createSheet.name.desc=\u8AAC\u660E\u304C\u3042\u308A\u307E\u305B\u3093
+\u8a73\u7d30\uff1a {0}
+Installer.tskLibErr.err=\u81f4\u547d\u7684\u30a8\u30e9\u30fc\uff1a
+InterestingHits.interestingItems.text=\u7591\u308f\u3057\u3044\u30a2\u30a4\u30c6\u30e0
+InterestingHits.displayName.text=\u7591\u308f\u3057\u3044\u30a2\u30a4\u30c6\u30e0
+InterestingHits.createSheet.name.name=\u540d\u524d
+InterestingHits.createSheet.name.displayName=\u540d\u524d
+InterestingHits.createSheet.name.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093
+KeyValueNode.createSheet.name.name=\u540d\u524d
+KeyValueNode.createSheet.name.displayName=\u540d\u524d
+KeyValueNode.createSheet.name.desc=\u8a72\u5f53\u306a\u3057
+KeyValueNode.createSheet.map.desc=\u8a72\u5f53\u306a\u3057
+KeywordHits.kwHits.text=\u30ad\u30fc\u30ef\u30fc\u30c9\u30d2\u30c3\u30c8
+KeywordHits.createSheet.name.name=\u540d\u524d
+KeywordHits.createSheet.name.displayName=\u540d\u524d
+KeywordHits.createSheet.name.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093
+KeywordHits.createSheet.listName.name=\u30ea\u30b9\u30c8\u540d
+KeywordHits.createSheet.listName.displayName=\u30ea\u30b9\u30c8\u540d
+KeywordHits.createSheet.listName.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093
+KeywordHits.createSheet.numChildren.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093
+KeywordHits.createSheet.filesWithHits.name=\u30d2\u30c3\u30c8\u3057\u305f\u30d5\u30a1\u30a4\u30eb
+KeywordHits.createSheet.filesWithHits.displayName=\u30d2\u30c3\u30c8\u3057\u305f\u30d5\u30a1\u30a4\u30eb
+KeywordHits.createSheet.filesWithHits.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093
+KeywordHits.createNodeForKey.modTime.displayName=\u4fee\u6b63\u65e5\u6642
+KeywordHits.createNodeForKey.modTime.desc=\u4fee\u6b63\u65e5\u6642
+KeywordHits.createNodeForKey.accessTime.displayName=\u30a2\u30af\u30bb\u30b9\u65e5\u6642
+KeywordHits.createNodeForKey.accessTime.desc=\u30a2\u30af\u30bb\u30b9\u65e5\u6642
+KeywordHits.createNodeForKey.chgTime.displayName=\u5909\u66f4\u65e5\u6642
+KeywordHits.createNodeForKey.chgTime.desc=\u5909\u66f4\u65e5\u6642
+KeywordHits.createNodeForKey.chgTime.name=\u5909\u66f4\u65e5\u6642
+KeywordHits.createNodeForKey.accessTime.name=\u30a2\u30af\u30bb\u30b9\u65e5\u6642
+KeywordHits.createNodeForKey.modTime.name=\u4fee\u6b63\u65e5\u6642
+KnownFileFilterNode.selectionContext.dataSources=\u30c7\u30fc\u30bf\u30bd\u30fc\u30b9
+KnownFileFilterNode.selectionContext.views=\u30d3\u30e5\u30fc
+LayoutFileNode.propertyType.parts=\u30d1\u30fc\u30c4
+LayoutFileNode.createSheet.name.name=\u540d\u524d
+LayoutFileNode.createSheet.name.displayName=\u540d\u524d
+LayoutFileNode.createSheet.name.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093
+LayoutFileNode.createSheet.noDescr.text=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093
+LayoutFileNode.getActions.viewInNewWin.text=\u65b0\u898f\u30a6\u30a3\u30f3\u30c9\u30a6\u3067\u8868\u793a
+LayoutFileNode.getActions.openInExtViewer.text=\u5916\u90e8\u30d3\u30e5\u30fc\u30a2\u3067\u958b\u304f
+LocalFileNode.createSheet.name.name=\u540d\u524d
+LocalFileNode.createSheet.name.displayName=\u540d\u524d
+LocalFileNode.createSheet.name.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093
+LocalFileNode.createSheet.noDescr.text=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093
+LocalFileNode.getActions.viewInNewWin.text=\u65b0\u898f\u30a6\u30a3\u30f3\u30c9\u30a6\u306b\u8868\u793a
+LocalFileNode.getActions.openInExtViewer.text=\u5916\u90e8\u30d3\u30e5\u30fc\u30a2\u3067\u958b\u304f
+LocalFileNode.getActions.searchFilesSameMd5.text=\u540c\u3058MD5\u30cf\u30c3\u30b7\u30e5\u3092\u6301\u3064\u30d5\u30a1\u30a4\u30eb\u3092\u691c\u7d22
+RecentFiles.aut0DayFilter.displayName.text=\u6700\u7d42\u65e5
+RecentFiles.aut1dayFilter.displayName.text=\u6700\u7d42\u65e5 - 1
+RecentFiles.aut2dayFilter.displayName.text=\u6700\u7d42\u65e5 - \uff12
+RecentFiles.aut3dayFilter.displayName.text=\u6700\u7d42\u65e5 - \uff13
+RecentFiles.aut4dayFilter.displayName.text=\u6700\u7d42\u65e5 - \uff14
+RecentFiles.aut5dayFilter.displayName.text=\u6700\u7d42\u65e5 - \uff15
+RecentFiles.aut6dayFilter.displayName.text=\u6700\u7d42\u65e5 - \uff16
+RecentFilesFilterChildren.exception.defaultVisit.msg=\u3053\u306e\u30bf\u30a4\u30d7\u306e\u8868\u793a\u3067\u304d\u308b\u30a2\u30a4\u30c6\u30e0
+Installer.exception.taskVerStringBang.msg=Sleuth Kit JNI\u30c6\u30b9\u30c8\u30b3\u30fc\u30eb\u3067\u306f\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u305b\u3093\u3067\u3057\u305f\u304c\u3001\u30d0\u30fc\u30b8\u30e7\u30f3\u30b9\u30c8\u30ea\u30f3\u30b0\u306f""\u3067\u3057\u305f\uff01
+RecentFilesFilterNode.createSheet.filterType.name=\u30d5\u30a3\u30eb\u30bf\u30bf\u30a4\u30d7
+RecentFilesFilterNode.createSheet.filterType.displayName=\u30d5\u30a3\u30eb\u30bf\u30bf\u30a4\u30d7
+RecentFilesFilterNode.createSheet.filterType.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093
+RecentFilesNode.createSheet.name.name=\u540d\u524d
+RecentFilesNode.createSheet.name.displayName=\u540d\u524d
+RecentFilesNode.createSheet.name.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093
+RecentFilesNode.name.text=\u6700\u8fd1\u4f7f\u7528\u3055\u308c\u305f\u30d5\u30a1\u30a4\u30eb
+ResultsNode.name.text=\u7d50\u679c
+ResultsNode.createSheet.name.name=\u540d\u524d
+ResultsNode.createSheet.name.displayName=\u540d\u524d
+ResultsNode.createSheet.name.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093
+TagNameNode.namePlusTags.text={0}\u30bf\u30b0
+TagNameNode.contentTagTypeNodeKey.text=\u30b3\u30f3\u30c6\u30f3\u30c4\u30bf\u30b0
+TagNameNode.bbArtTagTypeNodeKey.text=\u7d50\u679c\u30bf\u30b0
+TagNameNode.bookmark.text=\u30d6\u30c3\u30af\u30de\u30fc\u30af
+TagNameNode.createSheet.name.name=\u540d\u524d
+TagNameNode.createSheet.name.displayName=\u540d\u524d
+TagsNode.displayName.text=\u30bf\u30b0
+TagsNode.createSheet.name.name=\u540d\u524d
+AbstractAbstractFileNode.flagsDirColLbl=\u30d5\u30e9\u30b0\uff08\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\uff09
+AbstractAbstractFileNode.flagsMetaColLbl=\u30d5\u30e9\u30b0\uff08\u30e1\u30bf\u30c7\u30fc\u30bf\uff09
+AbstractAbstractFileNode.metaAddrColLbl=\u30e1\u30bf\u30c7\u30fc\u30bf\u30a2\u30c9\u30ec\u30b9
+AbstractAbstractFileNode.attrAddrColLbl=\u5c5e\u6027\u30a2\u30c9\u30ec\u30b9
+AbstractAbstractFileNode.typeDirColLbl=\u30bf\u30a4\u30d7\uff08\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\uff09
+AbstractAbstractFileNode.typeMetaColLbl=\u30bf\u30a4\u30d7\uff08\u30e1\u30bf\u30c7\u30fc\u30bf\uff09
+ArtifactTypeNode.createSheet.childCnt.displayName=\u30c1\u30e3\u30a4\u30eb\u30c9\u6570
+TagsNode.createSheet.name.displayName=\u540d\u524d
+ViewsNode.name.text=\u30d3\u30e5\u30fc
+ViewsNode.createSheet.name.name=\u540d\u524d
+ViewsNode.createSheet.name.displayName=\u540d\u524d
+ViewsNode.createSheet.name.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093
+VirtualDirectoryNode.getActions.viewInNewWin.text=\u65b0\u898f\u30a6\u30a3\u30f3\u30c9\u30a6\u306b\u8868\u793a
+VirtualDirectoryNode.createSheet.name.name=\u540d\u524d
+VirtualDirectoryNode.createSheet.name.displayName=\u540d\u524d
+VirtualDirectoryNode.createSheet.name.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093
+VirtualDirectoryNode.createSheet.noDesc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093
+VolumeNode.getActions.viewInNewWin.text=\u65b0\u898f\u30a6\u30a3\u30f3\u30c9\u30a6\u306b\u8868\u793a
+VolumeNode.createSheet.name.name=\u540d\u524d
+VolumeNode.createSheet.name.displayName=\u540d\u524d
+VolumeNode.createSheet.name.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093
VolumeNode.createSheet.id.name=ID
VolumeNode.createSheet.id.displayName=ID
-VolumeNode.createSheet.id.desc=\u8AAC\u660E\u304C\u3042\u308A\u307E\u305B\u3093
-VolumeNode.createSheet.startSector.name=\u6700\u521D\u306E\u30BB\u30AF\u30BF\u30FC
-VolumeNode.createSheet.startSector.displayName=\u6700\u521D\u306E\u30BB\u30AF\u30BF\u30FC
-VolumeNode.createSheet.startSector.desc=\u8AAC\u660E\u304C\u3042\u308A\u307E\u305B\u3093
-VolumeNode.createSheet.lenSectors.name=\u30BB\u30AF\u30BF\u30FC\u306E\u9577\u3055
-VolumeNode.createSheet.lenSectors.displayName=\u30BB\u30AF\u30BF\u30FC\u306E\u9577\u3055
-VolumeNode.createSheet.lenSectors.desc=\u8AAC\u660E\u304C\u3042\u308A\u307E\u305B\u3093
-VolumeNode.createSheet.description.name=\u8AAC\u660E
-VolumeNode.createSheet.description.displayName=\u8AAC\u660E
-VolumeNode.createSheet.description.desc=\u8AAC\u660E\u304C\u3042\u308A\u307E\u305B\u3093
-VolumeNode.createSheet.flags.name=\u30D5\u30E9\u30B0
-VolumeNode.createSheet.flags.displayName=\u30D5\u30E9\u30B0
-VolumeNode.createSheet.flags.desc=\u8AAC\u660E\u304C\u3042\u308A\u307E\u305B\u3093
-ArtifactTypeNode.createSheet.artType.name=\u30A2\u30FC\u30C6\u30A3\u30D5\u30A1\u30AF\u30C8\u30BF\u30A4\u30D7
-ArtifactTypeNode.createSheet.artType.displayName=\u30A2\u30FC\u30C6\u30A3\u30D5\u30A1\u30AF\u30C8\u30BF\u30A4\u30D7
-KeywordHits.createSheet.numChildren.name=\u30C1\u30E3\u30A4\u30EB\u30C9\u6570
-KeywordHits.createSheet.numChildren.displayName=\u30C1\u30E3\u30A4\u30EB\u30C9\u6570
-KeywordHits.simpleLiteralSearch.text=\u30B7\u30F3\u30B0\u30EB\u30EA\u30C6\u30E9\u30EB\u691C\u7D22
-KeywordHits.singleRegexSearch.text=\u30B7\u30F3\u30B0\u30EB\u6B63\u898F\u8868\u73FE\u691C\u7D22
-AbstractAbstractFileNode.objectId=\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8ID
\ No newline at end of file
+VolumeNode.createSheet.id.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093
+VolumeNode.createSheet.startSector.name=\u6700\u521d\u306e\u30bb\u30af\u30bf\u30fc
+VolumeNode.createSheet.startSector.displayName=\u6700\u521d\u306e\u30bb\u30af\u30bf\u30fc
+VolumeNode.createSheet.startSector.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093
+VolumeNode.createSheet.lenSectors.name=\u30bb\u30af\u30bf\u30fc\u306e\u9577\u3055
+VolumeNode.createSheet.lenSectors.displayName=\u30bb\u30af\u30bf\u30fc\u306e\u9577\u3055
+VolumeNode.createSheet.lenSectors.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093
+VolumeNode.createSheet.description.name=\u8aac\u660e
+VolumeNode.createSheet.description.displayName=\u8aac\u660e
+VolumeNode.createSheet.description.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093
+VolumeNode.createSheet.flags.name=\u30d5\u30e9\u30b0
+VolumeNode.createSheet.flags.displayName=\u30d5\u30e9\u30b0
+VolumeNode.createSheet.flags.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093
+ArtifactTypeNode.createSheet.artType.name=\u30a2\u30fc\u30c6\u30a3\u30d5\u30a1\u30af\u30c8\u30bf\u30a4\u30d7
+ArtifactTypeNode.createSheet.artType.displayName=\u30a2\u30fc\u30c6\u30a3\u30d5\u30a1\u30af\u30c8\u30bf\u30a4\u30d7
+KeywordHits.createSheet.numChildren.name=\u30c1\u30e3\u30a4\u30eb\u30c9\u6570
+KeywordHits.createSheet.numChildren.displayName=\u30c1\u30e3\u30a4\u30eb\u30c9\u6570
+KeywordHits.simpleLiteralSearch.text=\u30b7\u30f3\u30b0\u30eb\u30ea\u30c6\u30e9\u30eb\u691c\u7d22
+KeywordHits.singleRegexSearch.text=\u30b7\u30f3\u30b0\u30eb\u6b63\u898f\u8868\u73fe\u691c\u7d22
+AbstractAbstractFileNode.objectId=\u30aa\u30d6\u30b8\u30a7\u30af\u30c8ID
\ No newline at end of file
diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/ContentTagTypeNode.java b/Core/src/org/sleuthkit/autopsy/datamodel/ContentTagTypeNode.java
deleted file mode 100755
index 661365827c..0000000000
--- a/Core/src/org/sleuthkit/autopsy/datamodel/ContentTagTypeNode.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Autopsy Forensic Browser
- *
- * Copyright 2013 Basis Technology Corp.
- * Contact: carrier sleuthkit org
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.sleuthkit.autopsy.datamodel;
-
-import java.util.List;
-import java.util.logging.Level;
-import org.openide.nodes.ChildFactory;
-import org.openide.nodes.Children;
-import org.openide.nodes.Node;
-import org.openide.nodes.Sheet;
-import org.openide.util.NbBundle;
-import org.openide.util.lookup.Lookups;
-import org.sleuthkit.autopsy.casemodule.Case;
-import org.sleuthkit.autopsy.coreutils.Logger;
-import org.sleuthkit.datamodel.ContentTag;
-import org.sleuthkit.datamodel.TagName;
-import org.sleuthkit.datamodel.TskCoreException;
-
-/**
- * Instances of this class are are elements of a directory tree sub-tree
- * consisting of content and blackboard artifact tags, grouped first by tag
- * type, then by tag name.
- */
-public class ContentTagTypeNode extends DisplayableItemNode {
-
- private static final String DISPLAY_NAME = NbBundle.getMessage(ContentTagTypeNode.class, "ContentTagTypeNode.displayName.text");
- private static final String ICON_PATH = "org/sleuthkit/autopsy/images/tag-folder-blue-icon-16.png"; //NON-NLS
-
- public ContentTagTypeNode(TagName tagName) {
- super(Children.create(new ContentTagNodeFactory(tagName), true), Lookups.singleton(tagName.getDisplayName() + " " + DISPLAY_NAME));
-
- long tagsCount = 0;
- try {
- tagsCount = Case.getCurrentCase().getServices().getTagsManager().getContentTagsCountByTagName(tagName);
- } catch (TskCoreException ex) {
- Logger.getLogger(ContentTagTypeNode.class.getName()).log(Level.SEVERE, "Failed to get content tags count for " + tagName.getDisplayName() + " tag name", ex); //NON-NLS
- }
-
- super.setName(DISPLAY_NAME);
- super.setDisplayName(DISPLAY_NAME + " (" + tagsCount + ")");
- this.setIconBaseWithExtension(ICON_PATH);
- }
-
- @Override
- protected Sheet createSheet() {
- Sheet propertySheet = super.createSheet();
- Sheet.Set properties = propertySheet.get(Sheet.PROPERTIES);
- if (properties == null) {
- properties = Sheet.createPropertiesSet();
- propertySheet.put(properties);
- }
-
- properties.put(new NodeProperty<>(NbBundle.getMessage(this.getClass(), "ContentTagTypeNode.createSheet.name.name"),
- NbBundle.getMessage(this.getClass(), "ContentTagTypeNode.createSheet.name.displayName"),
- "",
- getName()));
-
- return propertySheet;
- }
-
- @Override
- public T accept(DisplayableItemNodeVisitor v) {
- return v.visit(this);
- }
-
- @Override
- public boolean isLeafTypeNode() {
- return true;
- }
-
- private static class ContentTagNodeFactory extends ChildFactory {
-
- private final TagName tagName;
-
- ContentTagNodeFactory(TagName tagName) {
- this.tagName = tagName;
- }
-
- @Override
- protected boolean createKeys(List keys) {
- // Use the content tags bearing the specified tag name as the keys.
- try {
- keys.addAll(Case.getCurrentCase().getServices().getTagsManager().getContentTagsByTagName(tagName));
- } catch (TskCoreException ex) {
- Logger.getLogger(ContentTagTypeNode.ContentTagNodeFactory.class.getName()).log(Level.SEVERE, "Failed to get tag names", ex); //NON-NLS
- }
- return true;
- }
-
- @Override
- protected Node createNodeForKey(ContentTag key) {
- // The content tags to be wrapped are used as the keys.
- return new ContentTagNode(key);
- }
- }
-}
\ No newline at end of file
diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/ContentUtils.java b/Core/src/org/sleuthkit/autopsy/datamodel/ContentUtils.java
index 8310d430ed..059a6367d1 100644
--- a/Core/src/org/sleuthkit/autopsy/datamodel/ContentUtils.java
+++ b/Core/src/org/sleuthkit/autopsy/datamodel/ContentUtils.java
@@ -1,7 +1,7 @@
/*
* Autopsy Forensic Browser
*
- * Copyright 2011 Basis Technology Corp.
+ * Copyright 2011-2014 Basis Technology Corp.
* Contact: carrier sleuthkit org
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -24,13 +24,13 @@ import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.TimeZone;
import java.util.logging.Level;
-import java.util.prefs.Preferences;
-
+import java.util.prefs.PreferenceChangeEvent;
+import java.util.prefs.PreferenceChangeListener;
import org.openide.util.NbBundle;
import org.sleuthkit.autopsy.coreutils.Logger;
import javax.swing.SwingWorker;
import org.netbeans.api.progress.ProgressHandle;
-import org.openide.util.NbPreferences;
+import org.sleuthkit.autopsy.core.UserPreferences;
import org.sleuthkit.datamodel.AbstractFile;
import org.sleuthkit.datamodel.Content;
import org.sleuthkit.datamodel.ContentVisitor;
@@ -50,9 +50,21 @@ import org.sleuthkit.datamodel.VirtualDirectory;
public final class ContentUtils {
private final static Logger logger = Logger.getLogger(ContentUtils.class.getName());
+ private static boolean displayTimesInLocalTime = UserPreferences.displayTimesInLocalTime();
private static final SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z");
private static final SimpleDateFormat dateFormatterISO8601 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
- private static boolean displayInLocalTime;
+
+ static {
+ UserPreferences.addChangeListener(new PreferenceChangeListener() {
+ @Override
+ public void preferenceChange(PreferenceChangeEvent evt) {
+ if (evt.getKey().equals(UserPreferences.DISPLAY_TIMES_IN_LOCAL_TIME)) {
+ displayTimesInLocalTime = UserPreferences.displayTimesInLocalTime();
+ }
+ }
+ });
+ }
+
// don't instantiate
private ContentUtils() {
throw new AssertionError();
@@ -68,8 +80,10 @@ public final class ContentUtils {
public static String getStringTime(long epochSeconds, TimeZone tzone) {
String time = "0000-00-00 00:00:00";
if (epochSeconds != 0) {
- dateFormatter.setTimeZone(tzone);
- time = dateFormatter.format(new java.util.Date(epochSeconds * 1000));
+ synchronized (dateFormatter) {
+ dateFormatter.setTimeZone(tzone);
+ time = dateFormatter.format(new java.util.Date(epochSeconds * 1000));
+ }
}
return time;
}
@@ -77,8 +91,10 @@ public final class ContentUtils {
public static String getStringTimeISO8601(long epochSeconds, TimeZone tzone) {
String time = "0000-00-00T00:00:00Z"; //NON-NLS
if (epochSeconds != 0) {
- dateFormatterISO8601.setTimeZone(tzone);
- time = dateFormatterISO8601.format(new java.util.Date(epochSeconds * 1000));
+ synchronized (dateFormatterISO8601) {
+ dateFormatterISO8601.setTimeZone(tzone);
+ time = dateFormatterISO8601.format(new java.util.Date(epochSeconds * 1000));
+ }
}
return time;
@@ -110,7 +126,7 @@ public final class ContentUtils {
public static TimeZone getTimeZone(Content c) {
try {
- if (!getDisplayInLocalTime()) {
+ if (!shouldDisplayTimesInLocalTime()) {
return TimeZone.getTimeZone("GMT");
}
else {
@@ -362,18 +378,13 @@ public final class ContentUtils {
cntnt.getClass().getSimpleName()));
}
}
- /**sets displayInlocalTime value based on button in GeneralPanel.java
+
+ /**
+ * Indicates whether or not times should be displayed using local time.
*
- * @param flag
+ * @return True or false.
*/
- public static void setDisplayInLocalTime(boolean flag) {
- displayInLocalTime = flag;
- }
- /** get global timezone setting for displaying time values
- *
- * @return
- */
- public static boolean getDisplayInLocalTime(){
- return displayInLocalTime;
+ public static boolean shouldDisplayTimesInLocalTime(){
+ return displayTimesInLocalTime;
}
}
diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/DisplayableItemNodeVisitor.java b/Core/src/org/sleuthkit/autopsy/datamodel/DisplayableItemNodeVisitor.java
index 88921891fd..dd93eb24ab 100644
--- a/Core/src/org/sleuthkit/autopsy/datamodel/DisplayableItemNodeVisitor.java
+++ b/Core/src/org/sleuthkit/autopsy/datamodel/DisplayableItemNodeVisitor.java
@@ -20,19 +20,8 @@ package org.sleuthkit.autopsy.datamodel;
import org.sleuthkit.autopsy.datamodel.DeletedContent.DeletedContentsChildren.DeletedContentNode;
import org.sleuthkit.autopsy.datamodel.DeletedContent.DeletedContentsNode;
-import org.sleuthkit.autopsy.datamodel.EmailExtracted.EmailExtractedAccountNode;
-import org.sleuthkit.autopsy.datamodel.EmailExtracted.EmailExtractedFolderNode;
-import org.sleuthkit.autopsy.datamodel.EmailExtracted.EmailExtractedRootNode;
import org.sleuthkit.autopsy.datamodel.FileSize.FileSizeRootChildren.FileSizeNode;
import org.sleuthkit.autopsy.datamodel.FileSize.FileSizeRootNode;
-import org.sleuthkit.autopsy.datamodel.HashsetHits.HashsetHitsRootNode;
-import org.sleuthkit.autopsy.datamodel.HashsetHits.HashsetHitsSetNode;
-import org.sleuthkit.autopsy.datamodel.InterestingHits.InterestingHitsRootNode;
-import org.sleuthkit.autopsy.datamodel.InterestingHits.InterestingHitsSetNode;
-import org.sleuthkit.autopsy.datamodel.KeywordHits.KeywordHitsKeywordNode;
-import org.sleuthkit.autopsy.datamodel.KeywordHits.KeywordHitsListNode;
-import org.sleuthkit.autopsy.datamodel.KeywordHits.KeywordHitsRootNode;
-import org.sleuthkit.autopsy.directorytree.BlackboardArtifactTagTypeNode;
/**
* Visitor pattern implementation for DisplayableItemNodes
@@ -49,9 +38,9 @@ public interface DisplayableItemNodeVisitor {
T visit(BlackboardArtifactNode ban);
- T visit(ArtifactTypeNode atn);
+ T visit(ExtractedContent.TypeNode atn);
- T visit(ExtractedContentNode ecn);
+ T visit(ExtractedContent.RootNode ecn);
T visit(FileTypeNode fsfn);
@@ -69,35 +58,35 @@ public interface DisplayableItemNodeVisitor {
T visit(RecentFilesFilterNode rffn);
- T visit(KeywordHitsRootNode khrn);
+ T visit(KeywordHits.RootNode khrn);
- T visit(KeywordHitsListNode khsn);
+ T visit(KeywordHits.ListNode khsn);
- T visit(KeywordHitsKeywordNode khmln);
+ T visit(KeywordHits.TermNode khmln);
- T visit(HashsetHitsRootNode hhrn);
+ T visit(HashsetHits.RootNode hhrn);
- T visit(HashsetHitsSetNode hhsn);
+ T visit(HashsetHits.HashsetNameNode hhsn);
- T visit(EmailExtractedRootNode eern);
+ T visit(EmailExtracted.RootNode eern);
- T visit(EmailExtractedAccountNode eean);
+ T visit(EmailExtracted.AccountNode eean);
- T visit(EmailExtractedFolderNode eefn);
+ T visit(EmailExtracted.FolderNode eefn);
- T visit(TagsNode node);
+ T visit(Tags.RootNode node);
- T visit(InterestingHitsRootNode ihrn);
+ T visit(InterestingHits.RootNode ihrn);
- T visit(InterestingHitsSetNode ihsn);
+ T visit(InterestingHits.SetNameNode ihsn);
- T visit(TagNameNode node);
+ T visit(Tags.TagNameNode node);
- T visit(ContentTagTypeNode node);
+ T visit(Tags.ContentTagTypeNode node);
T visit(ContentTagNode node);
- T visit(BlackboardArtifactTagTypeNode node);
+ T visit(Tags.BlackboardArtifactTagTypeNode node);
T visit(BlackboardArtifactTagNode node);
@@ -155,12 +144,12 @@ public interface DisplayableItemNodeVisitor {
}
@Override
- public T visit(ArtifactTypeNode atn) {
+ public T visit(ExtractedContent.TypeNode atn) {
return defaultVisit(atn);
}
@Override
- public T visit(ExtractedContentNode ecn) {
+ public T visit(ExtractedContent.RootNode ecn) {
return defaultVisit(ecn);
}
@@ -205,17 +194,17 @@ public interface DisplayableItemNodeVisitor {
}
@Override
- public T visit(KeywordHitsRootNode khrn) {
+ public T visit(KeywordHits.RootNode khrn) {
return defaultVisit(khrn);
}
@Override
- public T visit(KeywordHitsListNode khsn) {
+ public T visit(KeywordHits.ListNode khsn) {
return defaultVisit(khsn);
}
@Override
- public T visit(KeywordHitsKeywordNode khmln) {
+ public T visit(KeywordHits.TermNode khmln) {
return defaultVisit(khmln);
}
@@ -235,37 +224,37 @@ public interface DisplayableItemNodeVisitor {
}
@Override
- public T visit(HashsetHitsRootNode hhrn) {
+ public T visit(HashsetHits.RootNode hhrn) {
return defaultVisit(hhrn);
}
@Override
- public T visit(HashsetHitsSetNode hhsn) {
+ public T visit(HashsetHits.HashsetNameNode hhsn) {
return defaultVisit(hhsn);
}
@Override
- public T visit(InterestingHitsRootNode ihrn) {
+ public T visit(InterestingHits.RootNode ihrn) {
return defaultVisit(ihrn);
}
@Override
- public T visit(InterestingHitsSetNode ihsn) {
+ public T visit(InterestingHits.SetNameNode ihsn) {
return defaultVisit(ihsn);
}
@Override
- public T visit(EmailExtractedRootNode eern) {
+ public T visit(EmailExtracted.RootNode eern) {
return defaultVisit(eern);
}
@Override
- public T visit(EmailExtractedAccountNode eean) {
+ public T visit(EmailExtracted.AccountNode eean) {
return defaultVisit(eean);
}
@Override
- public T visit(EmailExtractedFolderNode eefn) {
+ public T visit(EmailExtracted.FolderNode eefn) {
return defaultVisit(eefn);
}
@@ -285,17 +274,17 @@ public interface DisplayableItemNodeVisitor {
}
@Override
- public T visit(TagsNode node) {
+ public T visit(Tags.RootNode node) {
return defaultVisit(node);
}
@Override
- public T visit(TagNameNode node) {
+ public T visit(Tags.TagNameNode node) {
return defaultVisit(node);
}
@Override
- public T visit(ContentTagTypeNode node) {
+ public T visit(Tags.ContentTagTypeNode node) {
return defaultVisit(node);
}
@@ -305,7 +294,7 @@ public interface DisplayableItemNodeVisitor {
}
@Override
- public T visit(BlackboardArtifactTagTypeNode node) {
+ public T visit(Tags.BlackboardArtifactTagTypeNode node) {
return defaultVisit(node);
}
diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/EmailExtracted.java b/Core/src/org/sleuthkit/autopsy/datamodel/EmailExtracted.java
index 7e0d8801f4..38f7662e0c 100644
--- a/Core/src/org/sleuthkit/autopsy/datamodel/EmailExtracted.java
+++ b/Core/src/org/sleuthkit/autopsy/datamodel/EmailExtracted.java
@@ -18,6 +18,8 @@
*/
package org.sleuthkit.autopsy.datamodel;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
@@ -25,6 +27,9 @@ import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
+import java.util.Observable;
+import java.util.Observer;
+import java.util.Set;
import java.util.logging.Level;
import org.openide.util.NbBundle;
@@ -34,11 +39,15 @@ import org.openide.nodes.Children;
import org.openide.nodes.Node;
import org.openide.nodes.Sheet;
import org.openide.util.lookup.Lookups;
+import org.sleuthkit.autopsy.casemodule.Case;
+import org.sleuthkit.autopsy.ingest.IngestManager;
+import org.sleuthkit.autopsy.ingest.ModuleDataEvent;
import org.sleuthkit.datamodel.BlackboardArtifact;
import org.sleuthkit.datamodel.BlackboardAttribute;
import org.sleuthkit.datamodel.SleuthkitCase;
import org.sleuthkit.datamodel.TskException;
+
/**
* Support for TSK_EMAIL_MSG nodes and displaying emails in the directory tree
* Email messages are grouped into parent folders, and the folders are grouped
@@ -54,64 +63,89 @@ public class EmailExtracted implements AutopsyVisitableItem {
private static final String MAIL_FOLDER = NbBundle.getMessage(EmailExtracted.class, "EmailExtracted.mailFolder.text");
private static final String MAIL_PATH_SEPARATOR = "/";
private SleuthkitCase skCase;
- private Map>> accounts;
+ private final EmailResults emailResults;
+
public EmailExtracted(SleuthkitCase skCase) {
this.skCase = skCase;
- accounts = new LinkedHashMap<>();
+ emailResults = new EmailResults();
}
-
- @SuppressWarnings("deprecation")
- private void initArtifacts() {
- accounts.clear();
- try {
- int artId = BlackboardArtifact.ARTIFACT_TYPE.TSK_EMAIL_MSG.getTypeID();
- int pathAttrId = BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PATH.getTypeID();
- String query = "SELECT value_text,blackboard_attributes.artifact_id,attribute_type_id " //NON-NLS
- + "FROM blackboard_attributes,blackboard_artifacts WHERE " //NON-NLS
- + "attribute_type_id=" + pathAttrId //NON-NLS
- + " AND blackboard_attributes.artifact_id=blackboard_artifacts.artifact_id" //NON-NLS
- + " AND blackboard_artifacts.artifact_type_id=" + artId; //NON-NLS
- ResultSet rs = skCase.runQuery(query);
- while (rs.next()) {
- final String path = rs.getString("value_text"); //NON-NLS
- final long artifactId = rs.getLong("artifact_id"); //NON-NLS
- final Map parsedPath = parsePath(path);
- final String account = parsedPath.get(MAIL_ACCOUNT);
- final String folder = parsedPath.get(MAIL_FOLDER);
-
- Map> folders = accounts.get(account);
- if (folders == null) {
- folders = new LinkedHashMap<>();
- accounts.put(account, folders);
- }
- List messages = folders.get(folder);
- if (messages == null) {
- messages = new ArrayList<>();
- folders.put(folder, messages);
- }
- messages.add(artifactId);
- }
- skCase.closeRunQuery(rs);
-
- } catch (SQLException ex) {
- logger.log(Level.WARNING, "Cannot initialize email extraction", ex); //NON-NLS
+
+ private final class EmailResults extends Observable {
+ private final Map>> accounts = new LinkedHashMap<>();
+
+ EmailResults() {
+ update();
}
- }
+
+ public Set getAccounts() {
+ return accounts.keySet();
+ }
+
+ public Set getFolders(String account) {
+ return accounts.get(account).keySet();
+ }
+
+ public List getArtifactIds(String account, String folder) {
+ return accounts.get(account).get(folder);
+ }
+
+ public void update() {
+ accounts.clear();
+ if (skCase == null) {
+ return;
+ }
+
+ try {
+ int artId = BlackboardArtifact.ARTIFACT_TYPE.TSK_EMAIL_MSG.getTypeID();
+ int pathAttrId = BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PATH.getTypeID();
+ String query = "SELECT value_text,blackboard_attributes.artifact_id,attribute_type_id " //NON-NLS
+ + "FROM blackboard_attributes,blackboard_artifacts WHERE " //NON-NLS
+ + "attribute_type_id=" + pathAttrId //NON-NLS
+ + " AND blackboard_attributes.artifact_id=blackboard_artifacts.artifact_id" //NON-NLS
+ + " AND blackboard_artifacts.artifact_type_id=" + artId; //NON-NLS
+ ResultSet rs = skCase.runQuery(query);
+ while (rs.next()) {
+ final String path = rs.getString("value_text"); //NON-NLS
+ final long artifactId = rs.getLong("artifact_id"); //NON-NLS
+ final Map parsedPath = parsePath(path);
+ final String account = parsedPath.get(MAIL_ACCOUNT);
+ final String folder = parsedPath.get(MAIL_FOLDER);
- private static Map parsePath(String path) {
- Map parsed = new HashMap<>();
- String[] split = path.split(MAIL_PATH_SEPARATOR);
- if (split.length < 4) {
- logger.log(Level.WARNING, "Unexpected number of tokens when parsing email PATH: {0}, will use defaults", split.length); //NON-NLS
- parsed.put(MAIL_ACCOUNT, NbBundle.getMessage(EmailExtracted.class, "EmailExtracted.defaultAcct.text"));
- parsed.put(MAIL_FOLDER, NbBundle.getMessage(EmailExtracted.class, "EmailExtracted.defaultFolder.text"));
+ Map> folders = accounts.get(account);
+ if (folders == null) {
+ folders = new LinkedHashMap<>();
+ accounts.put(account, folders);
+ }
+ List messages = folders.get(folder);
+ if (messages == null) {
+ messages = new ArrayList<>();
+ folders.put(folder, messages);
+ }
+ messages.add(artifactId);
+ }
+ skCase.closeRunQuery(rs);
+
+ } catch (SQLException ex) {
+ logger.log(Level.WARNING, "Cannot initialize email extraction", ex); //NON-NLS
+ }
+ }
+
+
+ private Map parsePath(String path) {
+ Map parsed = new HashMap<>();
+ String[] split = path.split(MAIL_PATH_SEPARATOR);
+ if (split.length < 4) {
+ logger.log(Level.WARNING, "Unexpected number of tokens when parsing email PATH: {0}, will use defaults", split.length); //NON-NLS
+ parsed.put(MAIL_ACCOUNT, NbBundle.getMessage(EmailExtracted.class, "EmailExtracted.defaultAcct.text"));
+ parsed.put(MAIL_FOLDER, NbBundle.getMessage(EmailExtracted.class, "EmailExtracted.defaultFolder.text"));
+ return parsed;
+ }
+
+ parsed.put(MAIL_ACCOUNT, split[2]);
+ parsed.put(MAIL_FOLDER, split[3]);
return parsed;
}
-
- parsed.put(MAIL_ACCOUNT, split[2]);
- parsed.put(MAIL_FOLDER, split[3]);
- return parsed;
}
@Override
@@ -122,94 +156,94 @@ public class EmailExtracted implements AutopsyVisitableItem {
/**
* Mail root node showing all emails
*/
- public class EmailExtractedRootNodeFlat extends DisplayableItemNode {
-
- public EmailExtractedRootNodeFlat() {
- super(Children.create(new EmailExtractedRootChildrenFlat(), true), Lookups.singleton(DISPLAY_NAME));
- super.setName(LABEL_NAME);
- super.setDisplayName(DISPLAY_NAME);
- this.setIconBaseWithExtension("org/sleuthkit/autopsy/images/mail-icon-16.png"); //NON-NLS
- initArtifacts();
- }
-
- @Override
- public boolean isLeafTypeNode() {
- return false;
- }
-
- @Override
- public T accept(DisplayableItemNodeVisitor v) {
- //return v.visit(this);
- return null;
- }
-
- @Override
- protected Sheet createSheet() {
- Sheet s = super.createSheet();
- Sheet.Set ss = s.get(Sheet.PROPERTIES);
- if (ss == null) {
- ss = Sheet.createPropertiesSet();
- s.put(ss);
- }
-
- ss.put(new NodeProperty<>(NbBundle.getMessage(this.getClass(), "EmailExtracted.createSheet.name.name"),
- NbBundle.getMessage(this.getClass(), "EmailExtracted.createSheet.name.displayName"),
- NbBundle.getMessage(this.getClass(), "EmailExtracted.createSheet.name.desc"),
- getName()));
- return s;
- }
- }
-
- /**
- * Mail root child node showing flattened emails
- */
- private class EmailExtractedRootChildrenFlat extends ChildFactory {
-
- private EmailExtractedRootChildrenFlat() {
- super();
- }
-
- @Override
- protected boolean createKeys(List list) {
- //flatten all emails
- List tempList = new ArrayList<>();
- for (String account : accounts.keySet()) {
- Map> folders = accounts.get(account);
- for (String folder : folders.keySet()) {
- List messages = folders.get(folder);
- for (long l : messages) {
- try {
- //TODO: bulk artifact gettings
- tempList.add(skCase.getBlackboardArtifact(l));
- } catch (TskException ex) {
- logger.log(Level.WARNING, "Error creating mail messages nodes", ex); //NON-NLS
- }
- }
- }
- }
-
- list.addAll(tempList);
- return true;
- }
-
- @Override
- protected Node createNodeForKey(BlackboardArtifact artifact) {
- return new BlackboardArtifactNode(artifact);
- }
- }
+// public class FlatRootNode extends DisplayableItemNode {
+//
+// public FlatRootNode() {
+// super(Children.create(new FlatRootFactory(), true), Lookups.singleton(DISPLAY_NAME));
+// super.setName(LABEL_NAME);
+// super.setDisplayName(DISPLAY_NAME);
+// this.setIconBaseWithExtension("org/sleuthkit/autopsy/images/mail-icon-16.png"); //NON-NLS
+// initArtifacts();
+// }
+//
+// @Override
+// public boolean isLeafTypeNode() {
+// return false;
+// }
+//
+// @Override
+// public T accept(DisplayableItemNodeVisitor v) {
+// //return v.visit(this);
+// return null;
+// }
+//
+// @Override
+// protected Sheet createSheet() {
+// Sheet s = super.createSheet();
+// Sheet.Set ss = s.get(Sheet.PROPERTIES);
+// if (ss == null) {
+// ss = Sheet.createPropertiesSet();
+// s.put(ss);
+// }
+//
+// ss.put(new NodeProperty<>(NbBundle.getMessage(this.getClass(), "EmailExtracted.createSheet.name.name"),
+// NbBundle.getMessage(this.getClass(), "EmailExtracted.createSheet.name.displayName"),
+// NbBundle.getMessage(this.getClass(), "EmailExtracted.createSheet.name.desc"),
+// getName()));
+// return s;
+// }
+// }
+//
+// /**
+// * Mail root child node showing flattened emails
+// */
+// private class FlatRootFactory extends ChildFactory {
+//
+// private FlatRootFactory() {
+// super();
+// }
+//
+// @Override
+// protected boolean createKeys(List list) {
+// //flatten all emails
+// List tempList = new ArrayList<>();
+// for (String account : accounts.keySet()) {
+// Map> folders = accounts.get(account);
+// for (String folder : folders.keySet()) {
+// List messages = folders.get(folder);
+// for (long l : messages) {
+// try {
+// //TODO: bulk artifact gettings
+// tempList.add(skCase.getBlackboardArtifact(l));
+// } catch (TskException ex) {
+// logger.log(Level.WARNING, "Error creating mail messages nodes", ex); //NON-NLS
+// }
+// }
+// }
+// }
+//
+// list.addAll(tempList);
+// return true;
+// }
+//
+// @Override
+// protected Node createNodeForKey(BlackboardArtifact artifact) {
+// return new BlackboardArtifactNode(artifact);
+// }
+// }
/**
* Mail root node grouping all mail accounts, supports account-> folder
* structure
*/
- public class EmailExtractedRootNode extends DisplayableItemNode {
+ public class RootNode extends DisplayableItemNode {
- public EmailExtractedRootNode() {
- super(Children.create(new EmailExtractedRootChildren(), true), Lookups.singleton(DISPLAY_NAME));
+ public RootNode() {
+ super(Children.create(new AccountFactory(), true), Lookups.singleton(DISPLAY_NAME));
super.setName(LABEL_NAME);
super.setDisplayName(DISPLAY_NAME);
this.setIconBaseWithExtension("org/sleuthkit/autopsy/images/mail-icon-16.png"); //NON-NLS
- initArtifacts();
+ emailResults.update();
}
@Override
@@ -220,7 +254,6 @@ public class EmailExtracted implements AutopsyVisitableItem {
@Override
public T accept(DisplayableItemNodeVisitor v) {
return v.visit(this);
- //return null;
}
@Override
@@ -244,30 +277,86 @@ public class EmailExtracted implements AutopsyVisitableItem {
/**
* Mail root child node creating each account node
*/
- private class EmailExtractedRootChildren extends ChildFactory {
+ private class AccountFactory extends ChildFactory.Detachable implements Observer {
+
+ /* The pcl is in the class because it has the easiest mechanisms to add and remove itself
+ * during its life cycles.
+ */
+ private final PropertyChangeListener pcl = new PropertyChangeListener() {
+ @Override
+ public void propertyChange(PropertyChangeEvent evt) {
+ String eventType = evt.getPropertyName();
+
+ if (eventType.equals(IngestManager.IngestModuleEvent.DATA_ADDED.toString())) {
+ if (((ModuleDataEvent) evt.getOldValue()).getArtifactType() == BlackboardArtifact.ARTIFACT_TYPE.TSK_EMAIL_MSG) {
+ emailResults.update();
+ }
+ }
+ else if (eventType.equals(IngestManager.IngestJobEvent.COMPLETED.toString())
+ || eventType.equals(IngestManager.IngestJobEvent.CANCELLED.toString())) {
+ emailResults.update();
+ }
+ else if (eventType.equals(Case.Events.CURRENT_CASE.toString())) {
+ // case was closed. Remove listeners so that we don't get called with a stale case handle
+ if (evt.getNewValue() == null) {
+ removeNotify();
+ skCase = null;
+ }
+ }
+ }
+ };
+
+ @Override
+ protected void addNotify() {
+ IngestManager.getInstance().addIngestJobEventListener(pcl);
+ IngestManager.getInstance().addIngestModuleEventListener(pcl);
+ Case.addPropertyChangeListener(pcl);
+ emailResults.update();
+ emailResults.addObserver(this);
+ }
+ @Override
+ protected void removeNotify() {
+ IngestManager.getInstance().removeIngestJobEventListener(pcl);
+ IngestManager.getInstance().removeIngestModuleEventListener(pcl);
+ Case.removePropertyChangeListener(pcl);
+ emailResults.deleteObserver(this);
+ }
+
@Override
protected boolean createKeys(List list) {
- list.addAll(accounts.keySet());
+ list.addAll(emailResults.getAccounts());
return true;
}
@Override
protected Node createNodeForKey(String key) {
- return new EmailExtractedAccountNode(key, accounts.get(key));
+ return new AccountNode(key);
+ }
+
+ @Override
+ public void update(Observable o, Object arg) {
+ refresh(true);
}
}
/**
* Account node representation
*/
- public class EmailExtractedAccountNode extends DisplayableItemNode {
-
- public EmailExtractedAccountNode(String name, Map> children) {
- super(Children.create(new EmailExtractedAccountChildrenNode(children), true), Lookups.singleton(name));
- super.setName(name);
- super.setDisplayName(name + " (" + children.size() + ")");
+ public class AccountNode extends DisplayableItemNode implements Observer {
+ private String accountName;
+
+ public AccountNode(String accountName) {
+ super(Children.create(new FolderFactory(accountName), true), Lookups.singleton(accountName));
+ super.setName(accountName);
+ this.accountName = accountName;
this.setIconBaseWithExtension("org/sleuthkit/autopsy/images/account-icon-16.png"); //NON-NLS
+ updateDisplayName();
+ emailResults.addObserver(this);
+ }
+
+ private void updateDisplayName() {
+ super.setDisplayName(accountName + " (" + emailResults.getFolders(accountName) + ")");
}
@Override
@@ -296,43 +385,61 @@ public class EmailExtracted implements AutopsyVisitableItem {
public T accept(DisplayableItemNodeVisitor v) {
return v.visit(this);
}
+
+ @Override
+ public void update(Observable o, Object arg) {
+ updateDisplayName();
+ }
}
/**
* Account node child creating sub nodes for every folder
*/
- private class EmailExtractedAccountChildrenNode extends ChildFactory {
+ private class FolderFactory extends ChildFactory implements Observer {
- private Map> folders;
+ private String accountName;
- private EmailExtractedAccountChildrenNode(Map> folders) {
+ private FolderFactory(String accountName) {
super();
- this.folders = folders;
+ this.accountName = accountName;
+ emailResults.addObserver(this);
}
@Override
protected boolean createKeys(List list) {
- list.addAll(folders.keySet());
-
+ list.addAll(emailResults.getFolders(accountName));
return true;
}
@Override
- protected Node createNodeForKey(String key) {
- return new EmailExtractedFolderNode(key, folders.get(key));
+ protected Node createNodeForKey(String folderName) {
+ return new FolderNode(accountName, folderName);
+ }
+
+ @Override
+ public void update(Observable o, Object arg) {
+ refresh(true);
}
}
/**
* Node representing mail folder
*/
- public class EmailExtractedFolderNode extends DisplayableItemNode {
-
- public EmailExtractedFolderNode(String name, List children) {
- super(Children.create(new EmailExtractedFolderChildrenNode(children), true), Lookups.singleton(name));
- super.setName(name);
- super.setDisplayName(name + " (" + children.size() + ")");
+ public class FolderNode extends DisplayableItemNode implements Observer {
+ private String accountName;
+ private String folderName;
+
+ public FolderNode(String accountName, String folderName) {
+ super(Children.create(new MessageFactory(accountName, folderName), true), Lookups.singleton(accountName));
+ super.setName(folderName);
this.setIconBaseWithExtension("org/sleuthkit/autopsy/images/folder-icon-16.png"); //NON-NLS
+ updateDisplayName();
+ emailResults.addObserver(this);
+ }
+
+ private void updateDisplayName() {
+ super.setDisplayName(folderName + " (" + emailResults.getArtifactIds(accountName, folderName).size() + ")");
+
}
@Override
@@ -361,38 +468,51 @@ public class EmailExtracted implements AutopsyVisitableItem {
public T accept(DisplayableItemNodeVisitor v) {
return v.visit(this);
}
+
+ @Override
+ public void update(Observable o, Object arg) {
+ updateDisplayName();
+ }
}
/**
* Node representing mail folder content (mail messages)
*/
- private class EmailExtractedFolderChildrenNode extends ChildFactory {
+ private class MessageFactory extends ChildFactory implements Observer {
- private List messages;
+ private String accountName;
+ private String folderName;
- private EmailExtractedFolderChildrenNode(List messages) {
+ private MessageFactory(String accountName, String folderName) {
super();
- this.messages = messages;
+ this.accountName = accountName;
+ this.folderName = folderName;
+ emailResults.addObserver(this);
}
@Override
- protected boolean createKeys(List list) {
- List tempList = new ArrayList<>();
- for (long l : messages) {
- try {
- //TODO: bulk artifact gettings
- tempList.add(skCase.getBlackboardArtifact(l));
- } catch (TskException ex) {
- logger.log(Level.WARNING, "Error creating mail messages nodes", ex); //NON-NLS
- }
- }
- list.addAll(tempList);
+ protected boolean createKeys(List list) {
+ list.addAll(emailResults.getArtifactIds(accountName, folderName));
return true;
}
@Override
- protected Node createNodeForKey(BlackboardArtifact artifact) {
- return new BlackboardArtifactNode(artifact);
+ protected Node createNodeForKey(Long artifactId) {
+ if (skCase == null) {
+ return null;
+ }
+ try {
+ BlackboardArtifact artifact = skCase.getBlackboardArtifact(artifactId);
+ return new BlackboardArtifactNode(artifact);
+ } catch (TskException ex) {
+ logger.log(Level.WARNING, "Error creating mail messages nodes", ex); //NON-NLS
+ }
+ return null;
+ }
+
+ @Override
+ public void update(Observable o, Object arg) {
+ refresh(true);
}
}
}
diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/ExtractedContent.java b/Core/src/org/sleuthkit/autopsy/datamodel/ExtractedContent.java
index 394eb2228e..5486a952dc 100644
--- a/Core/src/org/sleuthkit/autopsy/datamodel/ExtractedContent.java
+++ b/Core/src/org/sleuthkit/autopsy/datamodel/ExtractedContent.java
@@ -1,7 +1,7 @@
/*
* Autopsy Forensic Browser
*
- * Copyright 2011 Basis Technology Corp.
+ * Copyright 2011-2014 Basis Technology Corp.
* Contact: carrier sleuthkit org
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -18,17 +18,60 @@
*/
package org.sleuthkit.autopsy.datamodel;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.List;
+import java.util.logging.Level;
+import org.openide.nodes.ChildFactory;
+import org.openide.nodes.Children;
+import org.openide.nodes.Node;
+import org.openide.nodes.Sheet;
+import org.openide.util.NbBundle;
+import org.openide.util.lookup.Lookups;
+import org.sleuthkit.autopsy.casemodule.Case;
+import org.sleuthkit.autopsy.coreutils.Logger;
+import org.sleuthkit.autopsy.ingest.IngestManager;
+import org.sleuthkit.autopsy.ingest.ModuleDataEvent;
+import org.sleuthkit.datamodel.BlackboardArtifact;
+import static org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_BLUETOOTH_PAIRING;
+import static org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_CALENDAR_ENTRY;
+import static org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_CALLLOG;
+import static org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_CONTACT;
+import static org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_DEVICE_ATTACHED;
+import static org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_ENCRYPTION_DETECTED;
+import static org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_EXT_MISMATCH_DETECTED;
+import static org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_GPS_BOOKMARK;
+import static org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_GPS_LAST_KNOWN_LOCATION;
+import static org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_GPS_SEARCH;
+import static org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_INSTALLED_PROG;
+import static org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_MESSAGE;
+import static org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_METADATA_EXIF;
+import static org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_RECENT_OBJECT;
+import static org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_SERVICE_ACCOUNT;
+import static org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_SPEED_DIAL_ENTRY;
+import static org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_WEB_BOOKMARK;
+import static org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_WEB_COOKIE;
+import static org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_WEB_DOWNLOAD;
+import static org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_WEB_HISTORY;
+import static org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_WEB_SEARCH_QUERY;
import org.sleuthkit.datamodel.SleuthkitCase;
+import org.sleuthkit.datamodel.TskCoreException;
+import org.sleuthkit.datamodel.TskException;
/**
- * Parent of the "extracted content" artifacts to be displayed in the tree. Other
- * artifacts are displayed under other more specific parents.
+ * Parent of the "extracted content" artifacts to be displayed in the tree.
+ * Other artifacts are displayed under other more specific parents.
*/
- class ExtractedContent implements AutopsyVisitableItem{
+public class ExtractedContent implements AutopsyVisitableItem {
- SleuthkitCase skCase;
+ private SleuthkitCase skCase; // set to null after case has been closed
+ public static final String NAME = NbBundle.getMessage(RootNode.class, "ExtractedContentNode.name.text");
- public ExtractedContent(SleuthkitCase skCase){
+ public ExtractedContent(SleuthkitCase skCase) {
this.skCase = skCase;
}
@@ -37,7 +80,328 @@ import org.sleuthkit.datamodel.SleuthkitCase;
return v.visit(this);
}
- public SleuthkitCase getSleuthkitCase(){
+ public SleuthkitCase getSleuthkitCase() {
return skCase;
}
+
+ public class RootNode extends DisplayableItemNode {
+
+ public RootNode(SleuthkitCase skCase) {
+ super(Children.create(new TypeFactory(), true), Lookups.singleton(NAME));
+ super.setName(NAME);
+ super.setDisplayName(NAME);
+ this.setIconBaseWithExtension("org/sleuthkit/autopsy/images/extracted_content.png"); //NON-NLS
+ }
+
+ @Override
+ public boolean isLeafTypeNode() {
+ return false;
+ }
+
+ @Override
+ public T accept(DisplayableItemNodeVisitor v) {
+ return v.visit(this);
+ }
+
+ @Override
+ protected Sheet createSheet() {
+ Sheet s = super.createSheet();
+ Sheet.Set ss = s.get(Sheet.PROPERTIES);
+ if (ss == null) {
+ ss = Sheet.createPropertiesSet();
+ s.put(ss);
+ }
+
+ ss.put(new NodeProperty<>(NbBundle.getMessage(this.getClass(), "ExtractedContentNode.createSheet.name.name"),
+ NbBundle.getMessage(this.getClass(), "ExtractedContentNode.createSheet.name.displayName"),
+ NbBundle.getMessage(this.getClass(), "ExtractedContentNode.createSheet.name.desc"),
+ NAME));
+ return s;
+ }
+ }
+
+ /**
+ * Creates the children for the ExtractedContent area of the results tree.
+ * This area has all of the blackboard artifacts that are not displayed in a
+ * more specific form elsewhere in the tree.
+ */
+ private class TypeFactory extends ChildFactory.Detachable {
+ private final ArrayList doNotShow;
+ // maps the artifact type to its child node
+ private final HashMap typeNodeList = new HashMap<>();
+
+ public TypeFactory() {
+ super();
+
+ // these are shown in other parts of the UI tree
+ doNotShow = new ArrayList<>();
+ doNotShow.add(BlackboardArtifact.ARTIFACT_TYPE.TSK_GEN_INFO);
+ doNotShow.add(BlackboardArtifact.ARTIFACT_TYPE.TSK_EMAIL_MSG);
+ doNotShow.add(BlackboardArtifact.ARTIFACT_TYPE.TSK_HASHSET_HIT);
+ doNotShow.add(BlackboardArtifact.ARTIFACT_TYPE.TSK_KEYWORD_HIT);
+ doNotShow.add(BlackboardArtifact.ARTIFACT_TYPE.TSK_TAG_ARTIFACT);
+ doNotShow.add(BlackboardArtifact.ARTIFACT_TYPE.TSK_TAG_FILE);
+ doNotShow.add(BlackboardArtifact.ARTIFACT_TYPE.TSK_INTERESTING_FILE_HIT);
+ doNotShow.add(BlackboardArtifact.ARTIFACT_TYPE.TSK_INTERESTING_ARTIFACT_HIT);
+ }
+
+ private final PropertyChangeListener pcl = new PropertyChangeListener() {
+ @Override
+ public void propertyChange(PropertyChangeEvent evt) {
+ String eventType = evt.getPropertyName();
+
+ if (eventType.equals(IngestManager.IngestModuleEvent.DATA_ADDED.toString())) {
+ final ModuleDataEvent event = (ModuleDataEvent) evt.getOldValue();
+ if (doNotShow.contains(event.getArtifactType()) == false) {
+ refresh(true);
+ }
+ } else if (eventType.equals(IngestManager.IngestJobEvent.COMPLETED.toString())
+ || eventType.equals(IngestManager.IngestJobEvent.CANCELLED.toString())) {
+ refresh(true);
+ }
+ else if (eventType.equals(Case.Events.CURRENT_CASE.toString())) {
+ // case was closed. Remove listeners so that we don't get called with a stale case handle
+ if (evt.getNewValue() == null) {
+ removeNotify();
+ skCase = null;
+ }
+ }
+ }
+ };
+
+ @Override
+ protected void addNotify() {
+ IngestManager.getInstance().addIngestJobEventListener(pcl);
+ IngestManager.getInstance().addIngestModuleEventListener(pcl);
+ Case.addPropertyChangeListener(pcl);
+ }
+
+ @Override
+ protected void removeNotify() {
+ IngestManager.getInstance().removeIngestJobEventListener(pcl);
+ IngestManager.getInstance().removeIngestModuleEventListener(pcl);
+ Case.removePropertyChangeListener(pcl);
+ typeNodeList.clear();
+ }
+
+ @Override
+ protected boolean createKeys(List list) {
+ if (skCase == null) {
+ return false;
+ }
+
+ try {
+ List inUse = skCase.getBlackboardArtifactTypesInUse();
+ inUse.removeAll(doNotShow);
+ Collections.sort(inUse,
+ new Comparator() {
+ @Override
+ public int compare(BlackboardArtifact.ARTIFACT_TYPE a, BlackboardArtifact.ARTIFACT_TYPE b) {
+ return a.getDisplayName().compareTo(b.getDisplayName());
+ }
+ });
+ list.addAll(inUse);
+
+ // the create node method will get called only for new types
+ // refresh the counts if we already created them from a previous update
+ for (BlackboardArtifact.ARTIFACT_TYPE art : inUse) {
+ TypeNode node = typeNodeList.get(art);
+ if (node != null) {
+ node.updateDisplayName();
+ }
+ }
+ } catch (TskCoreException ex) {
+ Logger.getLogger(TypeFactory.class.getName()).log(Level.SEVERE, "Error getting list of artifacts in use: " + ex.getLocalizedMessage()); //NON-NLS
+ return false;
+ }
+ return true;
+ }
+
+ @Override
+ protected Node createNodeForKey(BlackboardArtifact.ARTIFACT_TYPE key) {
+ TypeNode node = new TypeNode(key);
+ typeNodeList.put(key, node);
+ return node;
+ }
+ }
+
+ /**
+ * Node encapsulating blackboard artifact type. This is used on the
+ * left-hand navigation side of the Autopsy UI as the parent node for all of
+ * the artifacts of a given type. Its children will be
+ * BlackboardArtifactNode objects.
+ */
+ public class TypeNode extends DisplayableItemNode {
+
+ private BlackboardArtifact.ARTIFACT_TYPE type;
+ private long childCount = 0;
+
+ TypeNode(BlackboardArtifact.ARTIFACT_TYPE type) {
+ super(Children.create(new ArtifactFactory(type), true), Lookups.singleton(type.getDisplayName()));
+ super.setName(type.getLabel());
+ this.type = type;
+ this.setIconBaseWithExtension("org/sleuthkit/autopsy/images/" + getIcon(type)); //NON-NLS
+ updateDisplayName();
+ }
+
+ final void updateDisplayName() {
+ if (skCase == null) {
+ return;
+ }
+
+ // NOTE: This completely destroys our lazy-loading ideal
+ // a performance increase might be had by adding a
+ // "getBlackboardArtifactCount()" method to skCase
+ try {
+ this.childCount = skCase.getBlackboardArtifactsTypeCount(type.getTypeID());
+ } catch (TskException ex) {
+ Logger.getLogger(TypeNode.class.getName())
+ .log(Level.WARNING, "Error getting child count", ex); //NON-NLS
+ }
+ super.setDisplayName(type.getDisplayName() + " (" + childCount + ")");
+ }
+
+ @Override
+ protected Sheet createSheet() {
+ Sheet s = super.createSheet();
+ Sheet.Set ss = s.get(Sheet.PROPERTIES);
+ if (ss == null) {
+ ss = Sheet.createPropertiesSet();
+ s.put(ss);
+ }
+
+ ss.put(new NodeProperty<>(NbBundle.getMessage(this.getClass(), "ArtifactTypeNode.createSheet.artType.name"),
+ NbBundle.getMessage(this.getClass(), "ArtifactTypeNode.createSheet.artType.displayName"),
+ NbBundle.getMessage(this.getClass(), "ArtifactTypeNode.createSheet.artType.desc"),
+ type.getDisplayName()));
+
+ ss.put(new NodeProperty<>(NbBundle.getMessage(this.getClass(), "ArtifactTypeNode.createSheet.childCnt.name"),
+ NbBundle.getMessage(this.getClass(), "ArtifactTypeNode.createSheet.childCnt.displayName"),
+ NbBundle.getMessage(this.getClass(), "ArtifactTypeNode.createSheet.childCnt.desc"),
+ childCount));
+
+ return s;
+ }
+
+ @Override
+ public T accept(DisplayableItemNodeVisitor v) {
+ return v.visit(this);
+ }
+
+ // @@@ TODO: Merge with BlackboartArtifactNode.getIcon()
+ private String getIcon(BlackboardArtifact.ARTIFACT_TYPE type) {
+ switch (type) {
+ case TSK_WEB_BOOKMARK:
+ return "bookmarks.png"; //NON-NLS
+ case TSK_WEB_COOKIE:
+ return "cookies.png"; //NON-NLS
+ case TSK_WEB_HISTORY:
+ return "history.png"; //NON-NLS
+ case TSK_WEB_DOWNLOAD:
+ return "downloads.png"; //NON-NLS
+ case TSK_INSTALLED_PROG:
+ return "programs.png"; //NON-NLS
+ case TSK_RECENT_OBJECT:
+ return "recent_docs.png"; //NON-NLS
+ case TSK_DEVICE_ATTACHED:
+ return "usb_devices.png"; //NON-NLS
+ case TSK_WEB_SEARCH_QUERY:
+ return "searchquery.png"; //NON-NLS
+ case TSK_METADATA_EXIF:
+ return "camera-icon-16.png"; //NON-NLS
+ case TSK_CONTACT:
+ return "contact.png"; //NON-NLS
+ case TSK_MESSAGE:
+ return "message.png"; //NON-NLS
+ case TSK_CALLLOG:
+ return "calllog.png"; //NON-NLS
+ case TSK_CALENDAR_ENTRY:
+ return "calendar.png"; //NON-NLS
+ case TSK_SPEED_DIAL_ENTRY:
+ return "speeddialentry.png"; //NON-NLS
+ case TSK_BLUETOOTH_PAIRING:
+ return "bluetooth.png"; //NON-NLS
+ case TSK_GPS_BOOKMARK:
+ return "gpsfav.png"; //NON-NLS
+ case TSK_GPS_LAST_KNOWN_LOCATION:
+ return "gps-lastlocation.png"; //NON-NLS
+ case TSK_GPS_SEARCH:
+ return "gps-search.png"; //NON-NLS
+ case TSK_SERVICE_ACCOUNT:
+ return "account-icon-16.png"; //NON-NLS
+ case TSK_ENCRYPTION_DETECTED:
+ return "encrypted-file.png"; //NON-NLS
+ case TSK_EXT_MISMATCH_DETECTED:
+ return "mismatch-16.png"; //NON-NLS
+ }
+ return "artifact-icon.png"; //NON-NLS
+ }
+
+ @Override
+ public boolean isLeafTypeNode() {
+ return true;
+ }
+ }
+
+ /**
+ * Creates children for a given artifact type
+ */
+ private class ArtifactFactory extends ChildFactory.Detachable {
+
+ private BlackboardArtifact.ARTIFACT_TYPE type;
+
+ public ArtifactFactory(BlackboardArtifact.ARTIFACT_TYPE type) {
+ super();
+ this.type = type;
+ }
+
+ private final PropertyChangeListener pcl = new PropertyChangeListener() {
+ @Override
+ public void propertyChange(PropertyChangeEvent evt) {
+ String eventType = evt.getPropertyName();
+
+ if (eventType.equals(IngestManager.IngestModuleEvent.DATA_ADDED.toString())) {
+ final ModuleDataEvent event = (ModuleDataEvent) evt.getOldValue();
+ if (event.getArtifactType() == type) {
+ refresh(true);
+ }
+ } else if (eventType.equals(IngestManager.IngestJobEvent.COMPLETED.toString())
+ || eventType.equals(IngestManager.IngestJobEvent.CANCELLED.toString())) {
+ refresh(true);
+ }
+ }
+ };
+
+ @Override
+ protected void addNotify() {
+ IngestManager.getInstance().addIngestJobEventListener(pcl);
+ IngestManager.getInstance().addIngestModuleEventListener(pcl);
+ }
+
+ @Override
+ protected void removeNotify() {
+ IngestManager.getInstance().removeIngestJobEventListener(pcl);
+ IngestManager.getInstance().removeIngestModuleEventListener(pcl);
+ }
+
+ @Override
+ protected boolean createKeys(List list) {
+ if (skCase == null) {
+ return false;
+ }
+
+ try {
+ List arts = skCase.getBlackboardArtifacts(type.getTypeID());
+ list.addAll(arts);
+ } catch (TskException ex) {
+ Logger.getLogger(ArtifactFactory.class.getName()).log(Level.SEVERE, "Couldn't get blackboard artifacts from database", ex); //NON-NLS
+ }
+ return true;
+ }
+
+ @Override
+ protected Node createNodeForKey(BlackboardArtifact key) {
+ return new BlackboardArtifactNode(key);
+ }
+ }
}
diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/ExtractedContentChildren.java b/Core/src/org/sleuthkit/autopsy/datamodel/ExtractedContentChildren.java
deleted file mode 100644
index 9d48f7fb70..0000000000
--- a/Core/src/org/sleuthkit/autopsy/datamodel/ExtractedContentChildren.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Autopsy Forensic Browser
- *
- * Copyright 2011-2013 Basis Technology Corp.
- * Contact: carrier sleuthkit org
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.sleuthkit.autopsy.datamodel;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-import java.util.logging.Level;
-import org.openide.nodes.ChildFactory;
-import org.openide.nodes.Node;
-import org.openide.util.Exceptions;
-import org.sleuthkit.autopsy.coreutils.Logger;
-import org.sleuthkit.datamodel.BlackboardArtifact;
-import org.sleuthkit.datamodel.SleuthkitCase;
-import org.sleuthkit.datamodel.TskCoreException;
-
-/**
- * Creates the children for the ExtractedContent area of the results tree. This area
- * has all of the blackboard artifacts that are not displayed in a more specific form elsewhere
- * in the tree.
- */
-class ExtractedContentChildren extends ChildFactory {
- private SleuthkitCase skCase;
- private final ArrayList doNotShow;
-
- public ExtractedContentChildren(SleuthkitCase skCase) {
- super();
- this.skCase = skCase;
-
- // these are shown in other parts of the UI tree
- doNotShow = new ArrayList<>();
- doNotShow.add(BlackboardArtifact.ARTIFACT_TYPE.TSK_GEN_INFO);
- doNotShow.add(BlackboardArtifact.ARTIFACT_TYPE.TSK_EMAIL_MSG);
- doNotShow.add(BlackboardArtifact.ARTIFACT_TYPE.TSK_HASHSET_HIT);
- doNotShow.add(BlackboardArtifact.ARTIFACT_TYPE.TSK_KEYWORD_HIT);
- doNotShow.add(BlackboardArtifact.ARTIFACT_TYPE.TSK_TAG_ARTIFACT);
- doNotShow.add(BlackboardArtifact.ARTIFACT_TYPE.TSK_TAG_FILE);
- doNotShow.add(BlackboardArtifact.ARTIFACT_TYPE.TSK_INTERESTING_FILE_HIT);
- doNotShow.add(BlackboardArtifact.ARTIFACT_TYPE.TSK_INTERESTING_ARTIFACT_HIT);
- }
-
- @Override
- protected boolean createKeys(List list) {
- try {
- List inUse = skCase.getBlackboardArtifactTypesInUse();
- inUse.removeAll(doNotShow);
- Collections.sort(inUse,
- new Comparator() {
- @Override
- public int compare(BlackboardArtifact.ARTIFACT_TYPE a, BlackboardArtifact.ARTIFACT_TYPE b) {
- return a.getDisplayName().compareTo(b.getDisplayName());
- }
- });
- list.addAll(inUse);
- } catch (TskCoreException ex) {
- Logger.getLogger(ExtractedContentChildren.class.getName()).log(Level.SEVERE, "Error getting list of artifacts in use: " + ex.getLocalizedMessage()); //NON-NLS
- return false;
- }
- return true;
- }
-
-
- @Override
- protected Node createNodeForKey(BlackboardArtifact.ARTIFACT_TYPE key){
- return new ArtifactTypeNode(key, skCase);
- }
-
-}
diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/ExtractedContentNode.java b/Core/src/org/sleuthkit/autopsy/datamodel/ExtractedContentNode.java
deleted file mode 100644
index e4077c7dcf..0000000000
--- a/Core/src/org/sleuthkit/autopsy/datamodel/ExtractedContentNode.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Autopsy Forensic Browser
- *
- * Copyright 2011-2014 Basis Technology Corp.
- * Contact: carrier sleuthkit org
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.sleuthkit.autopsy.datamodel;
-
-import org.openide.nodes.Children;
-import org.openide.nodes.Sheet;
-import org.openide.util.NbBundle;
-import org.openide.util.lookup.Lookups;
-import org.sleuthkit.datamodel.SleuthkitCase;
-
-/**
- * Node for the extracted content artifacts (artifacts that are not shown in
- * more specific areas of the tree)
- */
-public class ExtractedContentNode extends DisplayableItemNode {
-
- public static final String NAME = NbBundle.getMessage(ExtractedContentNode.class, "ExtractedContentNode.name.text");
-
- public ExtractedContentNode(SleuthkitCase skCase) {
- super(Children.create(new ExtractedContentChildren(skCase), true), Lookups.singleton(NAME));
- super.setName(NAME);
- super.setDisplayName(NAME);
- this.setIconBaseWithExtension("org/sleuthkit/autopsy/images/extracted_content.png"); //NON-NLS
- }
-
- @Override
- public boolean isLeafTypeNode() {
- return false;
- }
-
- @Override
- public T accept(DisplayableItemNodeVisitor v) {
- return v.visit(this);
- }
-
- @Override
- protected Sheet createSheet() {
- Sheet s = super.createSheet();
- Sheet.Set ss = s.get(Sheet.PROPERTIES);
- if (ss == null) {
- ss = Sheet.createPropertiesSet();
- s.put(ss);
- }
-
- ss.put(new NodeProperty<>(NbBundle.getMessage(this.getClass(), "ExtractedContentNode.createSheet.name.name"),
- NbBundle.getMessage(this.getClass(), "ExtractedContentNode.createSheet.name.displayName"),
- NbBundle.getMessage(this.getClass(), "ExtractedContentNode.createSheet.name.desc"),
- NAME));
- return s;
- }
-}
diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/FileTypeChildren.java b/Core/src/org/sleuthkit/autopsy/datamodel/FileTypeChildren.java
index 281e6593eb..29c1306a23 100644
--- a/Core/src/org/sleuthkit/autopsy/datamodel/FileTypeChildren.java
+++ b/Core/src/org/sleuthkit/autopsy/datamodel/FileTypeChildren.java
@@ -1,7 +1,7 @@
/*
* Autopsy Forensic Browser
*
- * Copyright 2011 Basis Technology Corp.
+ * Copyright 2011-2014 Basis Technology Corp.
* Contact: carrier sleuthkit org
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -18,16 +18,14 @@
*/
package org.sleuthkit.autopsy.datamodel;
-import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
-
import org.openide.util.NbBundle;
import org.sleuthkit.autopsy.coreutils.Logger;
import org.openide.nodes.AbstractNode;
import org.openide.nodes.ChildFactory;
import org.openide.nodes.Node;
-import org.sleuthkit.datamodel.AbstractFile;
+import org.sleuthkit.autopsy.core.UserPreferences;
import org.sleuthkit.datamodel.Content;
import org.sleuthkit.datamodel.ContentVisitor;
import org.sleuthkit.datamodel.DerivedFile;
@@ -40,50 +38,19 @@ import org.sleuthkit.datamodel.TskCoreException;
import org.sleuthkit.datamodel.TskData;
/**
- * Children factory for a specific file type - does the database query.
+ * Child node factory for a specific file type - does the database query.
*/
-class FileTypeChildren extends ChildFactory {
-
+public class FileTypeChildren extends ChildFactory {
+
private SleuthkitCase skCase;
private FileTypeExtensionFilters.SearchFilterInterface filter;
private static final Logger logger = Logger.getLogger(FileTypeChildren.class.getName());
- //private final static int MAX_OBJECTS = 2000;
-
- public FileTypeChildren(FileTypeExtensionFilters.SearchFilterInterface filter, SleuthkitCase skCase) {
+
+ FileTypeChildren(FileTypeExtensionFilters.SearchFilterInterface filter, SleuthkitCase skCase) {
this.filter = filter;
this.skCase = skCase;
}
- @Override
- protected boolean createKeys(List list) {
- list.addAll(runQuery());
- return true;
- }
-
- private String createQuery(){
- String query = "(dir_type = " + TskData.TSK_FS_NAME_TYPE_ENUM.REG.getValue() + ")" //NON-NLS
- + " AND (known IS NULL OR known != " + TskData.FileKnown.KNOWN.getFileKnownValue() + ") AND (0"; //NON-NLS
- for(String s : filter.getFilter()){
- query += " OR name LIKE '%" + s + "'"; //NON-NLS
- }
- query += ')';
-// query += " LIMIT " + MAX_OBJECTS;
- return query;
- }
-
-
- private List runQuery(){
- List list = new ArrayList<>();
- try {
- list = skCase.findAllFilesWhere(createQuery());
- } catch (TskCoreException ex) {
- logger.log(Level.SEVERE, "Couldn't get search results", ex); //NON-NLS
- }
-
- return list;
-
- }
-
/**
* Get children count without actually loading all nodes
* @return
@@ -96,7 +63,31 @@ class FileTypeChildren extends ChildFactory {
return 0;
}
}
-
+
+ @Override
+ protected boolean createKeys(List list) {
+ try {
+ list.addAll(skCase.findAllFilesWhere(createQuery()));
+ } catch (TskCoreException ex) {
+ logger.log(Level.SEVERE, "Couldn't get search results", ex); //NON-NLS
+ }
+ return true;
+ }
+
+ private String createQuery(){
+ StringBuilder query = new StringBuilder();
+ query.append("(dir_type = ").append(TskData.TSK_FS_NAME_TYPE_ENUM.REG.getValue()).append(")"); //NON-NLS
+ if (UserPreferences.hideKnownFilesInViewsTree()) {
+ query.append(" AND (known IS NULL OR known != ").append(TskData.FileKnown.KNOWN.getFileKnownValue()).append(")"); //NON-NLS
+ }
+ query.append(" AND (0"); //NON-NLS
+ for(String s : filter.getFilter()){
+ query.append(" OR name LIKE '%").append(s).append("'"); //NON-NLS
+ }
+ query.append(')');
+ return query.toString();
+ }
+
@Override
protected Node createNodeForKey(Content key) {
return key.accept(new ContentVisitor.Default() {
diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/HashsetHits.java b/Core/src/org/sleuthkit/autopsy/datamodel/HashsetHits.java
index e2970c3993..067e9562b0 100644
--- a/Core/src/org/sleuthkit/autopsy/datamodel/HashsetHits.java
+++ b/Core/src/org/sleuthkit/autopsy/datamodel/HashsetHits.java
@@ -18,12 +18,18 @@
*/
package org.sleuthkit.autopsy.datamodel;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
import java.sql.ResultSet;
import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.Collections;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
+import java.util.Observable;
+import java.util.Observer;
import java.util.Set;
import java.util.logging.Level;
@@ -34,13 +40,17 @@ import org.openide.nodes.Children;
import org.openide.nodes.Node;
import org.openide.nodes.Sheet;
import org.openide.util.lookup.Lookups;
+import org.sleuthkit.autopsy.casemodule.Case;
+import org.sleuthkit.autopsy.ingest.IngestManager;
+import org.sleuthkit.autopsy.ingest.ModuleDataEvent;
import org.sleuthkit.datamodel.BlackboardArtifact;
-import org.sleuthkit.datamodel.BlackboardAttribute;
+import org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE;
+import org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE;
import org.sleuthkit.datamodel.SleuthkitCase;
import org.sleuthkit.datamodel.TskException;
/**
- * Hash set hits node support
+ * Hash set hits node support. Inner classes have all of the nodes in the tree.
*/
public class HashsetHits implements AutopsyVisitableItem {
@@ -48,65 +58,92 @@ public class HashsetHits implements AutopsyVisitableItem {
private static final String DISPLAY_NAME = BlackboardArtifact.ARTIFACT_TYPE.TSK_HASHSET_HIT.getDisplayName();
private static final Logger logger = Logger.getLogger(HashsetHits.class.getName());
private SleuthkitCase skCase;
- private Map> hashSetHitsMap;
-
+ private final HashsetResults hashsetResults;
+
public HashsetHits(SleuthkitCase skCase) {
this.skCase = skCase;
- hashSetHitsMap = new LinkedHashMap<>();
- }
-
- @SuppressWarnings("deprecation")
- private void initArtifacts() {
- hashSetHitsMap.clear();
- ResultSet rs = null;
- try {
- int setNameId = BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SET_NAME.getTypeID();
- int artId = BlackboardArtifact.ARTIFACT_TYPE.TSK_HASHSET_HIT.getTypeID();
- String query = "SELECT value_text,blackboard_attributes.artifact_id,attribute_type_id " //NON-NLS
- + "FROM blackboard_attributes,blackboard_artifacts WHERE " //NON-NLS
- + "attribute_type_id=" + setNameId //NON-NLS
- + " AND blackboard_attributes.artifact_id=blackboard_artifacts.artifact_id" //NON-NLS
- + " AND blackboard_artifacts.artifact_type_id=" + artId; //NON-NLS
- rs = skCase.runQuery(query);
- while (rs.next()) {
- String value = rs.getString("value_text"); //NON-NLS
- long artifactId = rs.getLong("artifact_id"); //NON-NLS
- if (!hashSetHitsMap.containsKey(value)) {
- hashSetHitsMap.put(value, new HashSet());
- }
- hashSetHitsMap.get(value).add(artifactId);
-
- }
-
- } catch (SQLException ex) {
- logger.log(Level.WARNING, "SQL Exception occurred: ", ex); //NON-NLS
- } finally {
- if (rs != null) {
- try {
- skCase.closeRunQuery(rs);
- } catch (SQLException ex) {
- logger.log(Level.WARNING, "Error closing result set after getting hashset hits", ex); //NON-NLS
- }
- }
- }
+ hashsetResults = new HashsetResults();
}
+
@Override
public T accept(AutopsyItemVisitor v) {
return v.visit(this);
}
+
+ /**
+ * Stores all of the hashset results in a single class that is observable for the
+ * child nodes
+ */
+ private class HashsetResults extends Observable {
+ // maps hashset name to list of artifacts for that set
+ private final Map> hashSetHitsMap = new LinkedHashMap<>();
+
+ HashsetResults() {
+ update();
+ }
+
+ List getSetNames() {
+ List names = new ArrayList<>(hashSetHitsMap.keySet());
+ Collections.sort(names);
+ return names;
+ }
+
+ Set getArtifactIds(String hashSetName) {
+ return hashSetHitsMap.get(hashSetName);
+ }
+
+ final void update() {
+ hashSetHitsMap.clear();
+
+ if (skCase == null) {
+ return;
+ }
+
+ ResultSet rs = null;
+ try {
+ int setNameId = ATTRIBUTE_TYPE.TSK_SET_NAME.getTypeID();
+ int artId = ARTIFACT_TYPE.TSK_HASHSET_HIT.getTypeID();
+ String query = "SELECT value_text,blackboard_attributes.artifact_id,attribute_type_id " //NON-NLS
+ + "FROM blackboard_attributes,blackboard_artifacts WHERE " //NON-NLS
+ + "attribute_type_id=" + setNameId //NON-NLS
+ + " AND blackboard_attributes.artifact_id=blackboard_artifacts.artifact_id" //NON-NLS
+ + " AND blackboard_artifacts.artifact_type_id=" + artId; //NON-NLS
+ rs = skCase.runQuery(query);
+ while (rs.next()) {
+ String setName = rs.getString("value_text"); //NON-NLS
+ long artifactId = rs.getLong("artifact_id"); //NON-NLS
+ if (!hashSetHitsMap.containsKey(setName)) {
+ hashSetHitsMap.put(setName, new HashSet());
+ }
+ hashSetHitsMap.get(setName).add(artifactId);
+ }
+ } catch (SQLException ex) {
+ logger.log(Level.WARNING, "SQL Exception occurred: ", ex); //NON-NLS
+ } finally {
+ if (rs != null) {
+ try {
+ skCase.closeRunQuery(rs);
+ } catch (SQLException ex) {
+ logger.log(Level.WARNING, "Error closing result set after getting hashset hits", ex); //NON-NLS
+ }
+ }
+ }
+ setChanged();
+ notifyObservers();
+ }
+ }
/**
- * Node for the hash set hits
+ * Top-level node for all hash sets
*/
- public class HashsetHitsRootNode extends DisplayableItemNode {
+ public class RootNode extends DisplayableItemNode {
- public HashsetHitsRootNode() {
- super(Children.create(new HashsetHitsRootChildren(), true), Lookups.singleton(DISPLAY_NAME));
+ public RootNode() {
+ super(Children.create(new HashsetNameFactory(), true), Lookups.singleton(DISPLAY_NAME));
super.setName(HASHSET_HITS);
super.setDisplayName(DISPLAY_NAME);
this.setIconBaseWithExtension("org/sleuthkit/autopsy/images/hashset_hits.png"); //NON-NLS
- initArtifacts();
}
@Override
@@ -137,27 +174,92 @@ public class HashsetHits implements AutopsyVisitableItem {
}
}
- private class HashsetHitsRootChildren extends ChildFactory {
+ /**
+ * Creates child nodes for each hashset name
+ */
+ private class HashsetNameFactory extends ChildFactory.Detachable implements Observer {
+
+ /* This should probably be in the HashsetHits class, but the factory has nice methods
+ * for its startup and shutdown, so it seemed like a cleaner place to register the
+ * property change listener.
+ */
+ private final PropertyChangeListener pcl = new PropertyChangeListener() {
+ @Override
+ public void propertyChange(PropertyChangeEvent evt) {
+ String eventType = evt.getPropertyName();
+
+ if (eventType.equals(IngestManager.IngestModuleEvent.DATA_ADDED.toString())) {
+ if (((ModuleDataEvent) evt.getOldValue()).getArtifactType() == ARTIFACT_TYPE.TSK_HASHSET_HIT) {
+ hashsetResults.update();
+ }
+ }
+ else if (eventType.equals(IngestManager.IngestJobEvent.COMPLETED.toString())
+ || eventType.equals(IngestManager.IngestJobEvent.CANCELLED.toString())) {
+ hashsetResults.update();
+ }
+ else if (eventType.equals(Case.Events.CURRENT_CASE.toString())) {
+ // case was closed. Remove listeners so that we don't get called with a stale case handle
+ if (evt.getNewValue() == null) {
+ removeNotify();
+ skCase = null;
+ }
+ }
+ }
+ };
@Override
- protected boolean createKeys(List list) {
- list.addAll(hashSetHitsMap.keySet());
+ protected void addNotify() {
+ IngestManager.getInstance().addIngestJobEventListener(pcl);
+ IngestManager.getInstance().addIngestModuleEventListener(pcl);
+ Case.addPropertyChangeListener(pcl);
+ hashsetResults.update();
+ hashsetResults.addObserver(this);
+ }
+
+ @Override
+ protected void removeNotify() {
+ IngestManager.getInstance().removeIngestJobEventListener(pcl);
+ IngestManager.getInstance().removeIngestModuleEventListener(pcl);
+ Case.removePropertyChangeListener(pcl);
+ hashsetResults.deleteObserver(this);
+ }
+
+ @Override
+ protected boolean createKeys(List list) {
+ list.addAll(hashsetResults.getSetNames());
return true;
}
@Override
protected Node createNodeForKey(String key) {
- return new HashsetHitsSetNode(key, hashSetHitsMap.get(key));
+ return new HashsetNameNode(key);
+ }
+
+ @Override
+ public void update(Observable o, Object arg) {
+ refresh(true);
}
}
- public class HashsetHitsSetNode extends DisplayableItemNode {
-
- public HashsetHitsSetNode(String name, Set children) {
- super(Children.create(new HashsetHitsSetChildren(children), true), Lookups.singleton(name));
- super.setName(name);
- super.setDisplayName(name + " (" + children.size() + ")");
+ /**
+ * Node for a hash set name
+ */
+ public class HashsetNameNode extends DisplayableItemNode implements Observer {
+ private final String hashSetName;
+ public HashsetNameNode(String hashSetName) {
+ super(Children.create(new HitFactory(hashSetName), true), Lookups.singleton(hashSetName));
+ super.setName(hashSetName);
+ this.hashSetName = hashSetName;
+ updateDisplayName();
this.setIconBaseWithExtension("org/sleuthkit/autopsy/images/hashset_hits.png"); //NON-NLS
+ hashsetResults.addObserver(this);
+ }
+
+ /**
+ * Update the count in the display name
+ */
+ private void updateDisplayName() {
+ super.setDisplayName(hashSetName + " (" + hashsetResults.getArtifactIds(hashSetName).size() + ")");
}
@Override
@@ -186,33 +288,58 @@ public class HashsetHits implements AutopsyVisitableItem {
public T accept(DisplayableItemNodeVisitor v) {
return v.visit(this);
}
+
+ @Override
+ public void update(Observable o, Object arg) {
+ updateDisplayName();
+ }
}
- private class HashsetHitsSetChildren extends ChildFactory {
-
- private Set children;
-
- private HashsetHitsSetChildren(Set children) {
+ /**
+ * Creates the nodes for the hits in a given set.
+ */
+ private class HitFactory extends ChildFactory.Detachable implements Observer {
+ private String hashsetName;
+
+ private HitFactory(String hashsetName) {
super();
- this.children = children;
+ this.hashsetName = hashsetName;
+ }
+
+ @Override
+ protected void addNotify() {
+ hashsetResults.addObserver(this);
}
@Override
- protected boolean createKeys(List list) {
- for (long l : children) {
- try {
- //TODO: bulk artifact gettings
- list.add(skCase.getBlackboardArtifact(l));
- } catch (TskException ex) {
- logger.log(Level.WARNING, "TSK Exception occurred", ex); //NON-NLS
- }
- }
+ protected void removeNotify() {
+ hashsetResults.deleteObserver(this);
+ }
+
+ @Override
+ protected boolean createKeys(List list) {
+ list.addAll(hashsetResults.getArtifactIds(hashsetName));
return true;
}
@Override
- protected Node createNodeForKey(BlackboardArtifact artifact) {
- return new BlackboardArtifactNode(artifact);
+ protected Node createNodeForKey(Long id) {
+ if (skCase == null) {
+ return null;
+ }
+
+ try {
+ BlackboardArtifact art = skCase.getBlackboardArtifact(id);
+ return new BlackboardArtifactNode(art);
+ } catch (TskException ex) {
+ logger.log(Level.WARNING, "TSK Exception occurred", ex); //NON-NLS
+ }
+ return null;
+ }
+
+ @Override
+ public void update(Observable o, Object arg) {
+ refresh(true);
}
}
-}
+}
\ No newline at end of file
diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/InterestingHits.java b/Core/src/org/sleuthkit/autopsy/datamodel/InterestingHits.java
index f084188ef7..6338698dc2 100644
--- a/Core/src/org/sleuthkit/autopsy/datamodel/InterestingHits.java
+++ b/Core/src/org/sleuthkit/autopsy/datamodel/InterestingHits.java
@@ -19,12 +19,18 @@
package org.sleuthkit.autopsy.datamodel;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
import java.sql.ResultSet;
import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.Collections;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
+import java.util.Observable;
+import java.util.Observer;
import java.util.Set;
import java.util.logging.Level;
@@ -34,11 +40,15 @@ import org.openide.nodes.ChildFactory;
import org.openide.nodes.Children;
import org.openide.nodes.Node;
import org.openide.nodes.Sheet;
+import org.openide.util.Exceptions;
import org.openide.util.lookup.Lookups;
+import org.sleuthkit.autopsy.casemodule.Case;
+import org.sleuthkit.autopsy.ingest.IngestManager;
+import org.sleuthkit.autopsy.ingest.ModuleDataEvent;
import org.sleuthkit.datamodel.BlackboardArtifact;
import org.sleuthkit.datamodel.BlackboardAttribute;
import org.sleuthkit.datamodel.SleuthkitCase;
-import org.sleuthkit.datamodel.TskException;
+import org.sleuthkit.datamodel.TskCoreException;
public class InterestingHits implements AutopsyVisitableItem {
@@ -48,51 +58,70 @@ public class InterestingHits implements AutopsyVisitableItem {
private static final String DISPLAY_NAME = NbBundle.getMessage(InterestingHits.class, "InterestingHits.displayName.text");
private static final Logger logger = Logger.getLogger(InterestingHits.class.getName());
private SleuthkitCase skCase;
- private Map> interestingItemsMap;
-
+ private final InterestingResults interestingResults = new InterestingResults();
+
public InterestingHits(SleuthkitCase skCase) {
this.skCase = skCase;
- interestingItemsMap = new LinkedHashMap<>();
+ interestingResults.update();
}
- @SuppressWarnings("deprecation")
- private void initArtifacts() {
- interestingItemsMap.clear();
- loadArtifacts(BlackboardArtifact.ARTIFACT_TYPE.TSK_INTERESTING_FILE_HIT);
- loadArtifacts(BlackboardArtifact.ARTIFACT_TYPE.TSK_INTERESTING_ARTIFACT_HIT);
- }
+ private class InterestingResults extends Observable {
+ private final Map> interestingItemsMap = new LinkedHashMap<>();
- /*
- * Reads the artifacts of specified type, grouped by Set, and loads into the interestingItemsMap
- */
- private void loadArtifacts(BlackboardArtifact.ARTIFACT_TYPE artType) {
- ResultSet rs = null;
- try {
- int setNameId = BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SET_NAME.getTypeID();
- int artId = artType.getTypeID();
- String query = "SELECT value_text,blackboard_attributes.artifact_id,attribute_type_id " //NON-NLS
- + "FROM blackboard_attributes,blackboard_artifacts WHERE " //NON-NLS
- + "attribute_type_id=" + setNameId //NON-NLS
- + " AND blackboard_attributes.artifact_id=blackboard_artifacts.artifact_id" //NON-NLS
- + " AND blackboard_artifacts.artifact_type_id=" + artId; //NON-NLS
- rs = skCase.runQuery(query);
- while (rs.next()) {
- String value = rs.getString("value_text"); //NON-NLS
- long artifactId = rs.getLong("artifact_id"); //NON-NLS
- if (!interestingItemsMap.containsKey(value)) {
- interestingItemsMap.put(value, new HashSet());
- }
- interestingItemsMap.get(value).add(artifactId);
- }
- } catch (SQLException ex) {
- logger.log(Level.WARNING, "SQL Exception occurred: ", ex); //NON-NLS
+ public List getSetNames() {
+ List setNames = new ArrayList<>(interestingItemsMap.keySet());
+ Collections.sort(setNames);
+ return setNames;
}
- finally {
- if (rs != null) {
- try {
- skCase.closeRunQuery(rs);
- } catch (SQLException ex) {
- logger.log(Level.WARNING, "Error closing result set after getting artifacts", ex); //NON-NLS
+
+ public Set getArtifactIds(String setName) {
+ return interestingItemsMap.get(setName);
+ }
+
+ public void update() {
+ interestingItemsMap.clear();
+ loadArtifacts(BlackboardArtifact.ARTIFACT_TYPE.TSK_INTERESTING_FILE_HIT);
+ loadArtifacts(BlackboardArtifact.ARTIFACT_TYPE.TSK_INTERESTING_ARTIFACT_HIT);
+ setChanged();
+ notifyObservers();
+ }
+
+ /*
+ * Reads the artifacts of specified type, grouped by Set, and loads into the interestingItemsMap
+ */
+ private void loadArtifacts(BlackboardArtifact.ARTIFACT_TYPE artType) {
+ if (skCase == null) {
+ return;
+ }
+
+ ResultSet rs = null;
+ try {
+ int setNameId = BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SET_NAME.getTypeID();
+ int artId = artType.getTypeID();
+ String query = "SELECT value_text,blackboard_attributes.artifact_id,attribute_type_id " //NON-NLS
+ + "FROM blackboard_attributes,blackboard_artifacts WHERE " //NON-NLS
+ + "attribute_type_id=" + setNameId //NON-NLS
+ + " AND blackboard_attributes.artifact_id=blackboard_artifacts.artifact_id" //NON-NLS
+ + " AND blackboard_artifacts.artifact_type_id=" + artId; //NON-NLS
+ rs = skCase.runQuery(query);
+ while (rs.next()) {
+ String value = rs.getString("value_text"); //NON-NLS
+ long artifactId = rs.getLong("artifact_id"); //NON-NLS
+ if (!interestingItemsMap.containsKey(value)) {
+ interestingItemsMap.put(value, new HashSet());
+ }
+ interestingItemsMap.get(value).add(artifactId);
+ }
+ } catch (SQLException ex) {
+ logger.log(Level.WARNING, "SQL Exception occurred: ", ex); //NON-NLS
+ }
+ finally {
+ if (rs != null) {
+ try {
+ skCase.closeRunQuery(rs);
+ } catch (SQLException ex) {
+ logger.log(Level.WARNING, "Error closing result set after getting artifacts", ex); //NON-NLS
+ }
}
}
}
@@ -106,14 +135,13 @@ public class InterestingHits implements AutopsyVisitableItem {
/**
* Node for the interesting items
*/
- public class InterestingHitsRootNode extends DisplayableItemNode {
+ public class RootNode extends DisplayableItemNode {
- public InterestingHitsRootNode() {
- super(Children.create(new InterestingHitsRootChildren(), true), Lookups.singleton(DISPLAY_NAME));
+ public RootNode() {
+ super(Children.create(new SetNameFactory(), true), Lookups.singleton(DISPLAY_NAME));
super.setName(INTERESTING_ITEMS);
super.setDisplayName(DISPLAY_NAME);
this.setIconBaseWithExtension("org/sleuthkit/autopsy/images/interesting_item.png"); //NON-NLS
- initArtifacts();
}
@Override
@@ -144,27 +172,84 @@ public class InterestingHits implements AutopsyVisitableItem {
}
}
- private class InterestingHitsRootChildren extends ChildFactory {
+ private class SetNameFactory extends ChildFactory.Detachable implements Observer {
+
+ /* This should probably be in the top-level class, but the factory has nice methods
+ * for its startup and shutdown, so it seemed like a cleaner place to register the
+ * property change listener.
+ */
+ private final PropertyChangeListener pcl = new PropertyChangeListener() {
+ @Override
+ public void propertyChange(PropertyChangeEvent evt) {
+ String eventType = evt.getPropertyName();
+
+ if (eventType.equals(IngestManager.IngestModuleEvent.DATA_ADDED.toString())) {
+ if ((((ModuleDataEvent) evt.getOldValue()).getArtifactType() == BlackboardArtifact.ARTIFACT_TYPE.TSK_INTERESTING_ARTIFACT_HIT) ||
+ (((ModuleDataEvent) evt.getOldValue()).getArtifactType() == BlackboardArtifact.ARTIFACT_TYPE.TSK_INTERESTING_FILE_HIT)) {
+ interestingResults.update();
+ }
+ }
+ else if (eventType.equals(IngestManager.IngestJobEvent.COMPLETED.toString())
+ || eventType.equals(IngestManager.IngestJobEvent.CANCELLED.toString())) {
+ interestingResults.update();
+ }
+ else if (eventType.equals(Case.Events.CURRENT_CASE.toString())) {
+ // case was closed. Remove listeners so that we don't get called with a stale case handle
+ if (evt.getNewValue() == null) {
+ removeNotify();
+ skCase = null;
+ }
+ }
+ }
+ };
+ @Override
+ protected void addNotify() {
+ IngestManager.getInstance().addIngestJobEventListener(pcl);
+ IngestManager.getInstance().addIngestModuleEventListener(pcl);
+ Case.addPropertyChangeListener(pcl);
+ interestingResults.update();
+ interestingResults.addObserver(this);
+ }
+
+ @Override
+ protected void removeNotify() {
+ IngestManager.getInstance().removeIngestJobEventListener(pcl);
+ IngestManager.getInstance().removeIngestModuleEventListener(pcl);
+ Case.removePropertyChangeListener(pcl);
+ interestingResults.deleteObserver(this);
+ }
+
@Override
protected boolean createKeys(List list) {
- list.addAll(interestingItemsMap.keySet());
+ list.addAll(interestingResults.getSetNames());
return true;
}
@Override
protected Node createNodeForKey(String key) {
- return new InterestingHitsSetNode(key, interestingItemsMap.get(key));
+ return new SetNameNode(key);
+ }
+
+ @Override
+ public void update(Observable o, Object arg) {
+ refresh(true);
}
}
- public class InterestingHitsSetNode extends DisplayableItemNode {
-
- public InterestingHitsSetNode(String name, Set children) {
- super(Children.create(new InterestingHitsSetChildren(children), true), Lookups.singleton(name));
- super.setName(name);
- super.setDisplayName(name + " (" + children.size() + ")");
+ public class SetNameNode extends DisplayableItemNode implements Observer {
+ private String setName;
+ public SetNameNode(String setName) {//, Set children) {
+ super(Children.create(new HitFactory(setName), true), Lookups.singleton(setName));
+ this.setName = setName;
+ super.setName(setName);
+ updateDisplayName();
this.setIconBaseWithExtension("org/sleuthkit/autopsy/images/interesting_item.png"); //NON-NLS
+ interestingResults.addObserver(this);
+ }
+
+ private void updateDisplayName() {
+ super.setDisplayName(setName + " (" + interestingResults.getArtifactIds(setName).size() + ")");
}
@Override
@@ -193,32 +278,46 @@ public class InterestingHits implements AutopsyVisitableItem {
public T accept(DisplayableItemNodeVisitor v) {
return v.visit(this);
}
+
+ @Override
+ public void update(Observable o, Object arg) {
+ updateDisplayName();
+ }
}
- private class InterestingHitsSetChildren extends ChildFactory {
+ private class HitFactory extends ChildFactory implements Observer {
+ private String setName;
- private Set children;
-
- private InterestingHitsSetChildren(Set children) {
+ private HitFactory(String setName) {
super();
- this.children = children;
+ this.setName = setName;
+ interestingResults.addObserver(this);
}
@Override
- protected boolean createKeys(List list) {
- for (long l : children) {
- try {
- list.add(skCase.getBlackboardArtifact(l));
- } catch (TskException ex) {
- logger.log(Level.WARNING, "TSK Exception occurred", ex); //NON-NLS
- }
+ protected boolean createKeys(List list) {
+ for (long l : interestingResults.getArtifactIds(setName)) {
+ list.add(l);
}
return true;
}
@Override
- protected Node createNodeForKey(BlackboardArtifact artifact) {
- return new BlackboardArtifactNode(artifact);
+ protected Node createNodeForKey(Long l) {
+ if (skCase == null) {
+ return null;
+ }
+ try {
+ return new BlackboardArtifactNode(skCase.getBlackboardArtifact(l));
+ } catch (TskCoreException ex) {
+ Exceptions.printStackTrace(ex);
+ return null;
+ }
+ }
+
+ @Override
+ public void update(Observable o, Object arg) {
+ refresh(true);
}
}
}
diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/KeywordHits.java b/Core/src/org/sleuthkit/autopsy/datamodel/KeywordHits.java
index e031fe4fc7..d2dcadc733 100644
--- a/Core/src/org/sleuthkit/autopsy/datamodel/KeywordHits.java
+++ b/Core/src/org/sleuthkit/autopsy/datamodel/KeywordHits.java
@@ -18,13 +18,18 @@
*/
package org.sleuthkit.autopsy.datamodel;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
+import java.util.Observable;
+import java.util.Observer;
import java.util.Set;
import java.util.logging.Level;
import org.openide.util.NbBundle;
@@ -34,6 +39,9 @@ import org.openide.nodes.Children;
import org.openide.nodes.Node;
import org.openide.nodes.Sheet;
import org.openide.util.lookup.Lookups;
+import org.sleuthkit.autopsy.casemodule.Case;
+import org.sleuthkit.autopsy.ingest.IngestManager;
+import org.sleuthkit.autopsy.ingest.ModuleDataEvent;
import org.sleuthkit.datamodel.BlackboardArtifact;
import org.sleuthkit.datamodel.BlackboardAttribute;
import org.sleuthkit.datamodel.SleuthkitCase;
@@ -54,101 +62,132 @@ public class KeywordHits implements AutopsyVisitableItem {
.getMessage(KeywordHits.class, "KeywordHits.simpleLiteralSearch.text");
public static final String SIMPLE_REGEX_SEARCH = NbBundle
.getMessage(KeywordHits.class, "KeywordHits.singleRegexSearch.text");
- // Map from String (list name) to Map from string (keyword) to set (artifact ids)
- private Map>> topLevelMap;
- private Map>> listsMap;
- // Map from String (literal keyword) to set (artifact ids)
- private Map> literalMap;
- // Map from String (regex keyword) to set (artifact ids);
- private Map> regexMap;
- Map> artifacts;
+ private final KeywordResults keywordResults;
public KeywordHits(SleuthkitCase skCase) {
this.skCase = skCase;
- artifacts = new LinkedHashMap<>();
- listsMap = new LinkedHashMap<>();
- literalMap = new LinkedHashMap<>();
- regexMap = new LinkedHashMap<>();
- topLevelMap = new LinkedHashMap<>();
+ keywordResults = new KeywordResults();
}
-
- private void initMaps() {
- topLevelMap.clear();
- topLevelMap.put(SIMPLE_LITERAL_SEARCH, literalMap);
- topLevelMap.put(SIMPLE_REGEX_SEARCH, regexMap);
- listsMap.clear();
- regexMap.clear();
- literalMap.clear();
- for (Map.Entry> art : artifacts.entrySet()) {
- long id = art.getKey();
- Map attributes = art.getValue();
- // I think we can use attributes.remove(...) here?
- String listName = attributes.get(Long.valueOf(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SET_NAME.getTypeID()));
- String word = attributes.get(Long.valueOf(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_KEYWORD.getTypeID()));
- String reg = attributes.get(Long.valueOf(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_KEYWORD_REGEXP.getTypeID()));
- if (listName != null) {
- if (!listsMap.containsKey(listName)) {
- listsMap.put(listName, new LinkedHashMap>());
- }
- if (!listsMap.get(listName).containsKey(word)) {
- listsMap.get(listName).put(word, new HashSet());
- }
- listsMap.get(listName).get(word).add(id);
- } else if (reg != null) {
- if (!regexMap.containsKey(reg)) {
- regexMap.put(reg, new HashSet());
- }
- regexMap.get(reg).add(id);
- } else {
- if (!literalMap.containsKey(word)) {
- literalMap.put(word, new HashSet());
- }
- literalMap.get(word).add(id);
- }
- topLevelMap.putAll(listsMap);
+
+ private final class KeywordResults extends Observable {
+ // Map from listName/Type to Map of keyword to set of artifact Ids
+ private final Map>> topLevelMap;
+
+ KeywordResults() {
+ topLevelMap = new LinkedHashMap<>();
+ update();
+ }
+
+ List getListNames() {
+ List names = new ArrayList<>(topLevelMap.keySet());
+ // this causes the "Single ..." terms to be in the middle of the results,
+ // which is wierd. Make a custom comparator or do something else to maek them on top
+ //Collections.sort(names);
+ return names;
+ }
+
+ List getKeywords(String listName) {
+ List keywords = new ArrayList<>(topLevelMap.get(listName).keySet());
+ Collections.sort(keywords);
+ return keywords;
+ }
+
+ Set getArtifactIds(String listName, String keyword) {
+ return topLevelMap.get(listName).get(keyword);
}
- }
- @SuppressWarnings("deprecation")
- private void initArtifacts() {
- artifacts.clear();
- ResultSet rs = null;
- try {
- int setId = BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SET_NAME.getTypeID();
- int wordId = BlackboardAttribute.ATTRIBUTE_TYPE.TSK_KEYWORD.getTypeID();
- int regexId = BlackboardAttribute.ATTRIBUTE_TYPE.TSK_KEYWORD_REGEXP.getTypeID();
- int artId = BlackboardArtifact.ARTIFACT_TYPE.TSK_KEYWORD_HIT.getTypeID();
- String query = "SELECT blackboard_attributes.value_text,blackboard_attributes.artifact_id," //NON-NLS
- + "blackboard_attributes.attribute_type_id FROM blackboard_attributes,blackboard_artifacts WHERE " //NON-NLS
- + "(blackboard_attributes.artifact_id=blackboard_artifacts.artifact_id AND " //NON-NLS
- + "blackboard_artifacts.artifact_type_id=" + artId //NON-NLS
- + ") AND (attribute_type_id=" + setId + " OR " //NON-NLS
- + "attribute_type_id=" + wordId + " OR " //NON-NLS
- + "attribute_type_id=" + regexId + ")"; //NON-NLS
- rs = skCase.runQuery(query);
- while (rs.next()) {
- String value = rs.getString("value_text"); //NON-NLS
- long artifactId = rs.getLong("artifact_id"); //NON-NLS
- long typeId = rs.getLong("attribute_type_id"); //NON-NLS
- if (!artifacts.containsKey(artifactId)) {
- artifacts.put(artifactId, new LinkedHashMap());
+ // populate maps based on artifactIds
+ void populateMaps(Map> artifactIds) {
+ topLevelMap.clear();
+
+ Map>> listsMap = new LinkedHashMap<>();
+ // Map from String (literal keyword) to set (artifact ids)
+ Map> literalMap = new LinkedHashMap<>();
+ // Map from String (regex keyword) to set (artifact ids);
+ Map> regexMap = new LinkedHashMap<>();
+
+ // top-level nodes
+ topLevelMap.put(SIMPLE_LITERAL_SEARCH, literalMap);
+ topLevelMap.put(SIMPLE_REGEX_SEARCH, regexMap);
+
+ for (Map.Entry> art : artifactIds.entrySet()) {
+ long id = art.getKey();
+ Map attributes = art.getValue();
+
+ // I think we can use attributes.remove(...) here?
+ String listName = attributes.get(Long.valueOf(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SET_NAME.getTypeID()));
+ String word = attributes.get(Long.valueOf(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_KEYWORD.getTypeID()));
+ String reg = attributes.get(Long.valueOf(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_KEYWORD_REGEXP.getTypeID()));
+ if (listName != null) {
+ if (!listsMap.containsKey(listName)) {
+ listsMap.put(listName, new LinkedHashMap>());
+ }
+ if (!listsMap.get(listName).containsKey(word)) {
+ listsMap.get(listName).put(word, new HashSet());
+ }
+ listsMap.get(listName).get(word).add(id);
+ } else if (reg != null) {
+ if (!regexMap.containsKey(reg)) {
+ regexMap.put(reg, new HashSet());
+ }
+ regexMap.get(reg).add(id);
+ } else {
+ if (!literalMap.containsKey(word)) {
+ literalMap.put(word, new HashSet());
+ }
+ literalMap.get(word).add(id);
}
- if (!value.equals("")) {
- artifacts.get(artifactId).put(typeId, value);
- }
-
+ topLevelMap.putAll(listsMap);
}
-
- } catch (SQLException ex) {
- logger.log(Level.WARNING, "SQL Exception occurred: ", ex); //NON-NLS
- } finally {
- if (rs != null) {
- try {
- skCase.closeRunQuery(rs);
- } catch (SQLException ex) {
- logger.log(Level.WARNING, "Error closing result set after getting keyword hits", ex); //NON-NLS
+
+ setChanged();
+ notifyObservers();
+ }
+
+ public void update() {
+ Map> artifactIds = new LinkedHashMap<>();
+
+ if (skCase == null) {
+ return;
+ }
+
+ ResultSet rs = null;
+ try {
+ int setId = BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SET_NAME.getTypeID();
+ int wordId = BlackboardAttribute.ATTRIBUTE_TYPE.TSK_KEYWORD.getTypeID();
+ int regexId = BlackboardAttribute.ATTRIBUTE_TYPE.TSK_KEYWORD_REGEXP.getTypeID();
+ int artId = BlackboardArtifact.ARTIFACT_TYPE.TSK_KEYWORD_HIT.getTypeID();
+ String query = "SELECT blackboard_attributes.value_text,blackboard_attributes.artifact_id," //NON-NLS
+ + "blackboard_attributes.attribute_type_id FROM blackboard_attributes,blackboard_artifacts WHERE " //NON-NLS
+ + "(blackboard_attributes.artifact_id=blackboard_artifacts.artifact_id AND " //NON-NLS
+ + "blackboard_artifacts.artifact_type_id=" + artId //NON-NLS
+ + ") AND (attribute_type_id=" + setId + " OR " //NON-NLS
+ + "attribute_type_id=" + wordId + " OR " //NON-NLS
+ + "attribute_type_id=" + regexId + ")"; //NON-NLS
+ rs = skCase.runQuery(query);
+ while (rs.next()) {
+ String value = rs.getString("value_text"); //NON-NLS
+ long artifactId = rs.getLong("artifact_id"); //NON-NLS
+ long typeId = rs.getLong("attribute_type_id"); //NON-NLS
+ if (!artifactIds.containsKey(artifactId)) {
+ artifactIds.put(artifactId, new LinkedHashMap());
+ }
+ if (!value.equals("")) {
+ artifactIds.get(artifactId).put(typeId, value);
+ }
+ }
+ } catch (SQLException ex) {
+ logger.log(Level.WARNING, "SQL Exception occurred: ", ex); //NON-NLS
+ } finally {
+ if (rs != null) {
+ try {
+ skCase.closeRunQuery(rs);
+ } catch (SQLException ex) {
+ logger.log(Level.WARNING, "Error closing result set after getting keyword hits", ex); //NON-NLS
+ }
}
}
+ populateMaps(artifactIds);
}
}
@@ -157,15 +196,14 @@ public class KeywordHits implements AutopsyVisitableItem {
return v.visit(this);
}
- public class KeywordHitsRootNode extends DisplayableItemNode {
+ // Created by CreateAutopsyNodeVisitor
+ public class RootNode extends DisplayableItemNode {
- public KeywordHitsRootNode() {
- super(Children.create(new KeywordHitsRootChildren(), true), Lookups.singleton(KEYWORD_HITS));
+ public RootNode() {
+ super(Children.create(new ListFactory(), true), Lookups.singleton(KEYWORD_HITS));
super.setName(NAME);
super.setDisplayName(KEYWORD_HITS);
this.setIconBaseWithExtension("org/sleuthkit/autopsy/images/keyword_hits.png"); //NON-NLS
- initArtifacts();
- initMaps();
}
@Override
@@ -196,36 +234,85 @@ public class KeywordHits implements AutopsyVisitableItem {
}
}
- private class KeywordHitsRootChildren extends ChildFactory {
+ private class ListFactory extends ChildFactory.Detachable implements Observer {
+
+ private final PropertyChangeListener pcl = new PropertyChangeListener() {
+ @Override
+ public void propertyChange(PropertyChangeEvent evt) {
+ String eventType = evt.getPropertyName();
+
+ if (eventType.equals(IngestManager.IngestModuleEvent.DATA_ADDED.toString())) {
+ if (((ModuleDataEvent) evt.getOldValue()).getArtifactType() == BlackboardArtifact.ARTIFACT_TYPE.TSK_KEYWORD_HIT) {
+ keywordResults.update();
+ }
+ }
+ else if (eventType.equals(IngestManager.IngestJobEvent.COMPLETED.toString())
+ || eventType.equals(IngestManager.IngestJobEvent.CANCELLED.toString())) {
+ keywordResults.update();
+ }
+ else if (eventType.equals(Case.Events.CURRENT_CASE.toString())) {
+ // case was closed. Remove listeners so that we don't get called with a stale case handle
+ if (evt.getNewValue() == null) {
+ removeNotify();
+ skCase = null;
+ }
+ }
+ }
+ };
+
+ @Override
+ protected void addNotify() {
+ IngestManager.getInstance().addIngestJobEventListener(pcl);
+ IngestManager.getInstance().addIngestModuleEventListener(pcl);
+ Case.addPropertyChangeListener(pcl);
+ keywordResults.update();
+ keywordResults.addObserver(this);
+ }
+ @Override
+ protected void removeNotify() {
+ IngestManager.getInstance().removeIngestJobEventListener(pcl);
+ IngestManager.getInstance().removeIngestModuleEventListener(pcl);
+ Case.removePropertyChangeListener(pcl);
+ keywordResults.deleteObserver(this);
+ }
+
@Override
protected boolean createKeys(List list) {
- list.addAll(topLevelMap.keySet());
+ list.addAll(keywordResults.getListNames());
return true;
}
@Override
protected Node createNodeForKey(String key) {
- return new KeywordHitsListNode(key, topLevelMap.get(key));
+ return new ListNode(key);
+ }
+
+ @Override
+ public void update(Observable o, Object arg) {
+ refresh(true);
}
}
- public class KeywordHitsListNode extends DisplayableItemNode {
+ public class ListNode extends DisplayableItemNode implements Observer {
+ private String listName;
- private String name;
- private Map> children;
-
- public KeywordHitsListNode(String name, Map> children) {
- super(Children.create(new KeywordHitsListChildren(children), true), Lookups.singleton(name));
- super.setName(name);
- int totalDescendants = 0;
- for (Set grandChildren : children.values()) {
- totalDescendants += grandChildren.size();
- }
- super.setDisplayName(name + " (" + totalDescendants + ")");
+ public ListNode(String listName) {
+ super(Children.create(new TermFactory(listName), true), Lookups.singleton(listName));
+ super.setName(listName);
this.setIconBaseWithExtension("org/sleuthkit/autopsy/images/keyword_hits.png"); //NON-NLS
- this.name = name;
- this.children = children;
+ this.listName = listName;
+ updateDisplayName();
+ keywordResults.addObserver(this);
+ }
+
+ private void updateDisplayName() {
+ int totalDescendants = 0;
+ for (String word : keywordResults.getKeywords(listName)) {
+ Set ids = keywordResults.getArtifactIds(listName, word);
+ totalDescendants += ids.size();
+ }
+ super.setDisplayName(listName + " (" + totalDescendants + ")");
}
@Override
@@ -240,13 +327,13 @@ public class KeywordHits implements AutopsyVisitableItem {
ss.put(new NodeProperty<>(NbBundle.getMessage(this.getClass(), "KeywordHits.createSheet.listName.name"),
NbBundle.getMessage(this.getClass(), "KeywordHits.createSheet.listName.displayName"),
NbBundle.getMessage(this.getClass(), "KeywordHits.createSheet.listName.desc"),
- name));
+ listName));
ss.put(new NodeProperty<>(NbBundle.getMessage(this.getClass(), "KeywordHits.createSheet.numChildren.name"),
NbBundle.getMessage(this.getClass(), "KeywordHits.createSheet.numChildren.displayName"),
NbBundle.getMessage(this.getClass(), "KeywordHits.createSheet.numChildren.desc"),
- children.size()));
+ keywordResults.getKeywords(listName).size()));
return s;
}
@@ -260,39 +347,71 @@ public class KeywordHits implements AutopsyVisitableItem {
public T accept(DisplayableItemNodeVisitor v) {
return v.visit(this);
}
+
+ @Override
+ public void update(Observable o, Object arg) {
+ updateDisplayName();
+ }
}
- private class KeywordHitsListChildren extends ChildFactory {
-
- private Map> children;
-
- private KeywordHitsListChildren(Map> children) {
+ private class TermFactory extends ChildFactory.Detachable implements Observer {
+ private String setName;
+
+ private TermFactory(String setName) {
super();
- this.children = children;
+ this.setName = setName;
}
+ @Override
+ protected void addNotify() {
+ keywordResults.addObserver(this);
+ }
+
+ @Override
+ protected void removeNotify() {
+ keywordResults.deleteObserver(this);
+ }
+
@Override
protected boolean createKeys(List list) {
- list.addAll(children.keySet());
+ list.addAll(keywordResults.getKeywords(setName));
return true;
}
@Override
protected Node createNodeForKey(String key) {
- return new KeywordHitsKeywordNode(key, children.get(key));
+ return new TermNode(setName, key);
+ }
+
+ @Override
+ public void update(Observable o, Object arg) {
+ refresh(true);
}
}
- public class KeywordHitsKeywordNode extends DisplayableItemNode {
+ public class TermNode extends DisplayableItemNode implements Observer {
- private Set children;
+ private String setName;
+ private String keyword;
- public KeywordHitsKeywordNode(String name, Set children) {
- super(Children.create(new KeywordHitsKeywordChildren(children), true), Lookups.singleton(name));
- super.setName(name);
- super.setDisplayName(name + " (" + children.size() + ")");
+ public TermNode(String setName, String keyword) {
+ super(Children.create(new HitsFactory (setName, keyword), true), Lookups.singleton(keyword));
+ super.setName(keyword);
+ this.setName = setName;
+ this.keyword = keyword;
this.setIconBaseWithExtension("org/sleuthkit/autopsy/images/keyword_hits.png"); //NON-NLS
- this.children = children;
+ updateDisplayName();
+ keywordResults.addObserver(this);
+ }
+
+ private void updateDisplayName() {
+ super.setDisplayName(keyword + " (" + keywordResults.getArtifactIds(setName, keyword).size() + ")");
+ }
+
+
+ @Override
+ public void update(Observable o, Object arg) {
+ updateDisplayName();
}
@Override
@@ -322,70 +441,87 @@ public class KeywordHits implements AutopsyVisitableItem {
ss.put(new NodeProperty<>(NbBundle.getMessage(this.getClass(), "KeywordHits.createSheet.filesWithHits.name"),
NbBundle.getMessage(this.getClass(), "KeywordHits.createSheet.filesWithHits.displayName"),
NbBundle.getMessage(this.getClass(), "KeywordHits.createSheet.filesWithHits.desc"),
- children.size()));
+ keywordResults.getArtifactIds(setName, keyword).size()));
return s;
}
}
- private class KeywordHitsKeywordChildren extends ChildFactory {
-
- private Set children;
-
- private KeywordHitsKeywordChildren(Set children) {
+ public class HitsFactory extends ChildFactory.Detachable implements Observer {
+ private String keyword;
+ private String setName;
+
+ public HitsFactory(String setName, String keyword) {
super();
- this.children = children;
+ this.setName = setName;
+ this.keyword = keyword;
+ }
+
+ @Override
+ protected void addNotify() {
+ keywordResults.addObserver(this);
}
@Override
- protected boolean createKeys(List list) {
- List tempList = new ArrayList<>();
- for (long l : children) {
- try {
- //TODO: bulk artifact gettings
- tempList.add(skCase.getBlackboardArtifact(l));
- } catch (TskException ex) {
- logger.log(Level.WARNING, "TSK Exception occurred", ex); //NON-NLS
- }
- }
- list.addAll(tempList);
+ protected void removeNotify() {
+ keywordResults.deleteObserver(this);
+ }
+
+ @Override
+ protected boolean createKeys(List list) {
+ list.addAll(keywordResults.getArtifactIds(setName, keyword));
return true;
}
+
@Override
- protected Node createNodeForKey(BlackboardArtifact artifact) {
- BlackboardArtifactNode n = new BlackboardArtifactNode(artifact);
- AbstractFile file;
- try {
- file = artifact.getSleuthkitCase().getAbstractFileById(artifact.getObjectID());
- } catch (TskCoreException ex) {
- logger.log(Level.SEVERE, "TskCoreException while constructing BlackboardArtifact Node from KeywordHitsKeywordChildren"); //NON-NLS
- return n;
+ protected Node createNodeForKey(Long artifactId) {
+ if (skCase == null) {
+ return null;
}
+
+ try {
+ BlackboardArtifact art = skCase.getBlackboardArtifact(artifactId);
+ BlackboardArtifactNode n = new BlackboardArtifactNode(art);
+ AbstractFile file;
+ try {
+ file = skCase.getAbstractFileById(art.getObjectID());
+ } catch (TskCoreException ex) {
+ logger.log(Level.SEVERE, "TskCoreException while constructing BlackboardArtifact Node from KeywordHitsKeywordChildren"); //NON-NLS
+ return n;
+ }
- n.addNodeProperty(new NodeProperty<>(
- NbBundle.getMessage(this.getClass(), "KeywordHits.createNodeForKey.modTime.name"),
- NbBundle.getMessage(this.getClass(),
- "KeywordHits.createNodeForKey.modTime.displayName"),
- NbBundle.getMessage(this.getClass(),
- "KeywordHits.createNodeForKey.modTime.desc"),
- ContentUtils.getStringTime(file.getMtime(), file)));
- n.addNodeProperty(new NodeProperty<>(
- NbBundle.getMessage(this.getClass(), "KeywordHits.createNodeForKey.accessTime.name"),
- NbBundle.getMessage(this.getClass(),
- "KeywordHits.createNodeForKey.accessTime.displayName"),
- NbBundle.getMessage(this.getClass(),
- "KeywordHits.createNodeForKey.accessTime.desc"),
- ContentUtils.getStringTime(file.getAtime(), file)));
- n.addNodeProperty(new NodeProperty<>(
- NbBundle.getMessage(this.getClass(), "KeywordHits.createNodeForKey.chgTime.name"),
- NbBundle.getMessage(this.getClass(),
- "KeywordHits.createNodeForKey.chgTime.displayName"),
- NbBundle.getMessage(this.getClass(),
- "KeywordHits.createNodeForKey.chgTime.desc"),
- ContentUtils.getStringTime(file.getCtime(), file)));
+ n.addNodeProperty(new NodeProperty<>(
+ NbBundle.getMessage(this.getClass(), "KeywordHits.createNodeForKey.modTime.name"),
+ NbBundle.getMessage(this.getClass(),
+ "KeywordHits.createNodeForKey.modTime.displayName"),
+ NbBundle.getMessage(this.getClass(),
+ "KeywordHits.createNodeForKey.modTime.desc"),
+ ContentUtils.getStringTime(file.getMtime(), file)));
+ n.addNodeProperty(new NodeProperty<>(
+ NbBundle.getMessage(this.getClass(), "KeywordHits.createNodeForKey.accessTime.name"),
+ NbBundle.getMessage(this.getClass(),
+ "KeywordHits.createNodeForKey.accessTime.displayName"),
+ NbBundle.getMessage(this.getClass(),
+ "KeywordHits.createNodeForKey.accessTime.desc"),
+ ContentUtils.getStringTime(file.getAtime(), file)));
+ n.addNodeProperty(new NodeProperty<>(
+ NbBundle.getMessage(this.getClass(), "KeywordHits.createNodeForKey.chgTime.name"),
+ NbBundle.getMessage(this.getClass(),
+ "KeywordHits.createNodeForKey.chgTime.displayName"),
+ NbBundle.getMessage(this.getClass(),
+ "KeywordHits.createNodeForKey.chgTime.desc"),
+ ContentUtils.getStringTime(file.getCtime(), file)));
+ return n;
+ } catch (TskException ex) {
+ logger.log(Level.WARNING, "TSK Exception occurred", ex); //NON-NLS
+ }
+ return null;
+ }
- return n;
+ @Override
+ public void update(Observable o, Object arg) {
+ refresh(true);
}
}
}
diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/KnownFileFilterNode.java b/Core/src/org/sleuthkit/autopsy/datamodel/KnownFileFilterNode.java
index 8201fdd73d..5c63206874 100755
--- a/Core/src/org/sleuthkit/autopsy/datamodel/KnownFileFilterNode.java
+++ b/Core/src/org/sleuthkit/autopsy/datamodel/KnownFileFilterNode.java
@@ -1,7 +1,7 @@
/*
* Autopsy Forensic Browser
*
- * Copyright 2013 Basis Technology Corp.
+ * Copyright 2013-2014 Basis Technology Corp.
* Contact: carrier sleuthkit org
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -20,11 +20,10 @@ package org.sleuthkit.autopsy.datamodel;
import java.util.prefs.PreferenceChangeEvent;
import java.util.prefs.PreferenceChangeListener;
-import java.util.prefs.Preferences;
import org.openide.nodes.FilterNode;
import org.openide.nodes.Node;
import org.openide.util.NbBundle;
-import org.openide.util.NbPreferences;
+import org.sleuthkit.autopsy.core.UserPreferences;
import org.sleuthkit.datamodel.AbstractFile;
import org.sleuthkit.datamodel.TskData;
@@ -39,26 +38,28 @@ import org.sleuthkit.datamodel.TskData;
*/
public class KnownFileFilterNode extends FilterNode {
- /** Preference key values. */
- private static final String DS_HIDE_KNOWN = "dataSourcesHideKnown"; // Default false NON-NLS
- private static final String VIEWS_HIDE_KNOWN = "viewsHideKnown"; // Default true NON-NLS
+ private static boolean filterFromDataSources = UserPreferences.hideKnownFilesInDataSourcesTree();
+ private static boolean filterFromViews = UserPreferences.hideKnownFilesInViewsTree();
+
+ static {
+ UserPreferences.addChangeListener(new PreferenceChangeListener() {
+ @Override
+ public void preferenceChange(PreferenceChangeEvent evt) {
+ switch (evt.getKey()) {
+ case UserPreferences.HIDE_KNOWN_FILES_IN_DATA_SOURCES_TREE:
+ filterFromDataSources = UserPreferences.hideKnownFilesInDataSourcesTree();
+ break;
+ case UserPreferences.HIDE_KNOWN_FILES_IN_VIEWS_TREE:
+ filterFromViews = UserPreferences.hideKnownFilesInViewsTree();
+ break;
+ }
+ }
+ });
+ }
- /** True if Nodes selected from the Views Node should filter Known Files. */
- private static boolean filterFromViews = true;
-
- /** True if Nodes selected from the DataSources Node should filter Known Files. */
- private static boolean filterFromDataSources = false;
-
- /** True if a listener has not been added to the preferences. */
- private static boolean addListener = true;
-
- /**
- * Represents the top level category the Node this KnownFileFilterNode wraps
- * is a sub-node of. (i.e. Data Sources, Views, Results)
- */
public enum SelectionContext {
- DATA_SOURCES(NbBundle.getMessage(KnownFileFilterNode.class, "KnownFileFilterNode.selectionContext.dataSources")), // Subnode of DataSources
- VIEWS(NbBundle.getMessage(KnownFileFilterNode.class, "KnownFileFilterNode.selectionContext.views")), // Subnode of Views
+ DATA_SOURCES(NbBundle.getMessage(KnownFileFilterNode.class, "KnownFileFilterNode.selectionContext.dataSources")),
+ VIEWS(NbBundle.getMessage(KnownFileFilterNode.class, "KnownFileFilterNode.selectionContext.views")),
OTHER(""); // Subnode of another node.
private final String displayName;
@@ -67,13 +68,6 @@ public class KnownFileFilterNode extends FilterNode {
this.displayName = displayName;
}
- /**
- * Get the SelectionContext from the display name of a Node that is a
- * direct child of the root node.
- *
- * @param name
- * @return
- */
public static SelectionContext getContextFromName(String name) {
if (name.equals(DATA_SOURCES.getName())) {
return DATA_SOURCES;
@@ -97,12 +91,7 @@ public class KnownFileFilterNode extends FilterNode {
* @param context
*/
public KnownFileFilterNode(Node arg, SelectionContext context) {
- super(arg, new KnownFileFilterChildren(arg, context));
-
- if (addListener) {
- addPreferenceListener();
- addListener = false;
- }
+ super(arg, new KnownFileFilterChildren(arg, context));
}
private KnownFileFilterNode(Node arg, boolean filter) {
@@ -127,28 +116,6 @@ public class KnownFileFilterNode extends FilterNode {
}
}
- private void addPreferenceListener() {
- Preferences prefs = NbPreferences.root().node("/org/sleuthkit/autopsy/core"); //NON-NLS
- // Initialize with values stored in preferences
- filterFromViews = prefs.getBoolean(VIEWS_HIDE_KNOWN, filterFromViews);
- filterFromDataSources = prefs.getBoolean(DS_HIDE_KNOWN, filterFromDataSources);
-
- // Add listener
- prefs.addPreferenceChangeListener(new PreferenceChangeListener() {
- @Override
- public void preferenceChange(PreferenceChangeEvent evt) {
- switch (evt.getKey()) {
- case VIEWS_HIDE_KNOWN:
- filterFromViews = evt.getNode().getBoolean(VIEWS_HIDE_KNOWN, filterFromViews);
- break;
- case DS_HIDE_KNOWN:
- filterFromDataSources = evt.getNode().getBoolean(DS_HIDE_KNOWN, filterFromDataSources);
- break;
- }
- }
- });
- }
-
/**
* Complementary class to KnownFileFilterNode.
*
diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/ResultsNode.java b/Core/src/org/sleuthkit/autopsy/datamodel/ResultsNode.java
index 832d7c7b09..bc89511bc6 100644
--- a/Core/src/org/sleuthkit/autopsy/datamodel/ResultsNode.java
+++ b/Core/src/org/sleuthkit/autopsy/datamodel/ResultsNode.java
@@ -37,7 +37,7 @@ public class ResultsNode extends DisplayableItemNode {
new HashsetHits(sleuthkitCase),
new EmailExtracted(sleuthkitCase),
new InterestingHits(sleuthkitCase),
- new TagsNodeKey())), Lookups.singleton(NAME));
+ new Tags())), Lookups.singleton(NAME));
setName(NAME);
setDisplayName(NAME);
this.setIconBaseWithExtension("org/sleuthkit/autopsy/images/results.png"); //NON-NLS
diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/RootContentChildren.java b/Core/src/org/sleuthkit/autopsy/datamodel/RootContentChildren.java
index da6843c8d2..91a67f2d4f 100644
--- a/Core/src/org/sleuthkit/autopsy/datamodel/RootContentChildren.java
+++ b/Core/src/org/sleuthkit/autopsy/datamodel/RootContentChildren.java
@@ -60,56 +60,4 @@ public class RootContentChildren extends AbstractContentChildren