diff --git a/Core/src/org/sleuthkit/autopsy/actions/OpenLogFolderAction.java b/Core/src/org/sleuthkit/autopsy/actions/OpenLogFolderAction.java index 776bd4ea8d..66ec9c4edc 100755 --- a/Core/src/org/sleuthkit/autopsy/actions/OpenLogFolderAction.java +++ b/Core/src/org/sleuthkit/autopsy/actions/OpenLogFolderAction.java @@ -31,19 +31,15 @@ import org.openide.awt.ActionRegistration; import org.openide.modules.Places; import org.openide.util.Exceptions; import org.openide.util.NbBundle; -import org.openide.util.NbBundle.Messages; -@ActionID( - category = "Help", - id = "org.sleuthkit.autopsy.actions.OpenLogFolder") -@ActionRegistration( - displayName = "#CTL_OpenLogFolder") -@ActionReference(path = "Menu/Help", position = 1750) -// Move to Bundle for I18N -//@Messages("CTL_OpenLogFolder=Open Log Folder") + /** * Action in menu to open the folder containing the log files */ +@ActionRegistration( + displayName = "#CTL_OpenLogFolder", iconInMenu = true) +@ActionReference(path = "Menu/Help", position = 1750) +@ActionID(id = "org.sleuthkit.autopsy.actions.OpenLogFolderAction", category = "Help") public final class OpenLogFolderAction implements ActionListener { @Override diff --git a/Core/src/org/sleuthkit/autopsy/actions/TagAction.java b/Core/src/org/sleuthkit/autopsy/actions/TagAction.java index 376e52ce62..6b5615a812 100755 --- a/Core/src/org/sleuthkit/autopsy/actions/TagAction.java +++ b/Core/src/org/sleuthkit/autopsy/actions/TagAction.java @@ -20,7 +20,8 @@ package org.sleuthkit.autopsy.actions; import java.awt.event.ActionEvent; import javax.swing.AbstractAction; -import org.sleuthkit.autopsy.directorytree.DirectoryTreeTopComponent; +import org.sleuthkit.autopsy.ingest.IngestServices; +import org.sleuthkit.autopsy.ingest.ModuleDataEvent; import org.sleuthkit.datamodel.BlackboardArtifact; /** @@ -48,15 +49,11 @@ import org.sleuthkit.datamodel.BlackboardArtifact; * or deleted outside of an actionPerformed() call. */ protected void refreshDirectoryTree() { - // The way the "directory tree" currently works, a new tags sub-tree - // needs to be made to reflect the results of invoking tag Actions. The - // way to do this is to call DirectoryTreeTopComponent.refreshTree(), - // which calls RootContentChildren.refreshKeys(BlackboardArtifact.ARTIFACT_TYPE... types) - // for the RootContentChildren object that is the child factory for the - // ResultsNode that is the root of the tags sub-tree. There is a switch - // statement in RootContentChildren.refreshKeys() that maps both - // BlackboardArtifact.ARTIFACT_TYPE.TSK_TAG_FILE and BlackboardArtifact.ARTIFACT_TYPE.TSK_TAG_ARTIFACT - // to making a call to refreshKey(TagsNodeKey). - DirectoryTreeTopComponent.findInstance().refreshTree(BlackboardArtifact.ARTIFACT_TYPE.TSK_TAG_FILE); + + /* Note: this is a hack. In an ideal world, TagsManager would fire events so + * that the directory tree would refresh. But, we haven't had a chance to add + * that so, we fire these events and the tree refreshes based on them. + */ + IngestServices.getInstance().fireModuleDataEvent(new ModuleDataEvent("TagAction", BlackboardArtifact.ARTIFACT_TYPE.TSK_TAG_FILE)); //NON-NLS } } diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageAction.java b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageAction.java index f47d094110..363a7f8824 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageAction.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageAction.java @@ -106,8 +106,6 @@ public final class AddImageAction extends CallableSystemAction implements Presen */ @Override public void actionPerformed(ActionEvent e) { - Logger.noteAction(AddImageAction.class); - if (IngestManager.getInstance().isIngestRunning()) { final String msg = NbBundle.getMessage(this.getClass(), "AddImageAction.ingestConfig.ongoingIngest.msg"); if (JOptionPane.showConfirmDialog(null, msg, diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardAddingProgressVisual.form b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardAddingProgressVisual.form index e5e9937501..9579652e32 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardAddingProgressVisual.form +++ b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardAddingProgressVisual.form @@ -36,7 +36,6 @@ - @@ -47,9 +46,7 @@ - - - + @@ -115,19 +112,6 @@ - - - - - - - - - - - - - diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardAddingProgressVisual.java b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardAddingProgressVisual.java index 5c2b52f602..6015b6fb14 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardAddingProgressVisual.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardAddingProgressVisual.java @@ -52,7 +52,6 @@ import org.openide.util.NbBundle; */ protected void setStateFinished() { inProgressPanel.setVisible(false); - titleLabel.setText(ADDING_DATA_SOURCE_COMPLETE); donePanel.setVisible(true); //force repaint just in case validate(); @@ -142,7 +141,6 @@ import org.openide.util.NbBundle; donePanel = new javax.swing.JPanel(); statusLabel = new javax.swing.JLabel(); viewLogButton = new javax.swing.JButton(); - titleLabel = new javax.swing.JLabel(); inProgressPanel = new javax.swing.JPanel(); progressBar = new javax.swing.JProgressBar(); progressLabel = new javax.swing.JLabel(); @@ -190,9 +188,6 @@ import org.openide.util.NbBundle; .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); - titleLabel.setFont(new java.awt.Font("Tahoma", 1, 14)); // NOI18N NON-NLS - org.openide.awt.Mnemonics.setLocalizedText(titleLabel, org.openide.util.NbBundle.getMessage(AddImageWizardAddingProgressVisual.class, "AddImageWizardAddingProgressVisual.titleLabel.text")); // NOI18N - progressBar.setIndeterminate(true); org.openide.awt.Mnemonics.setLocalizedText(progressLabel, org.openide.util.NbBundle.getMessage(AddImageWizardAddingProgressVisual.class, "AddImageWizardAddingProgressVisual.progressLabel.text")); // NOI18N @@ -245,7 +240,6 @@ import org.openide.util.NbBundle; .addGroup(layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(titleLabel) .addComponent(inProgressPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(donePanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGap(0, 67, Short.MAX_VALUE)) @@ -253,9 +247,7 @@ import org.openide.util.NbBundle; layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() - .addContainerGap() - .addComponent(titleLabel) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGap(34, 34, 34) .addComponent(inProgressPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(donePanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) @@ -279,7 +271,6 @@ import org.openide.util.NbBundle; protected javax.swing.JTextArea progressTextArea; protected javax.swing.JLabel statusLabel; protected javax.swing.JLabel subTitle1Label; - protected javax.swing.JLabel titleLabel; protected javax.swing.JButton viewLogButton; // End of variables declaration//GEN-END:variables } diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardChooseDataSourceVisual.form b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardChooseDataSourceVisual.form index 9e42df3bfc..1bed535bdc 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardChooseDataSourceVisual.form +++ b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardChooseDataSourceVisual.form @@ -37,10 +37,7 @@ - - - - + @@ -51,9 +48,7 @@ - - - + @@ -155,15 +150,5 @@ - - - - - - - - - - diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardChooseDataSourceVisual.java b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardChooseDataSourceVisual.java index a96b2264c3..2a30de3f57 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardChooseDataSourceVisual.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardChooseDataSourceVisual.java @@ -197,7 +197,6 @@ final class AddImageWizardChooseDataSourceVisual extends JPanel { typeTabel = new javax.swing.JLabel(); typePanel = new javax.swing.JPanel(); typeComboBox = new javax.swing.JComboBox(); - imgInfoLabel = new javax.swing.JLabel(); org.openide.awt.Mnemonics.setLocalizedText(jLabel2, org.openide.util.NbBundle.getMessage(AddImageWizardChooseDataSourceVisual.class, "AddImageWizardChooseDataSourceVisual.jLabel2.text")); // NOI18N @@ -250,9 +249,6 @@ final class AddImageWizardChooseDataSourceVisual extends JPanel { .addContainerGap()) ); - imgInfoLabel.setFont(new java.awt.Font("Tahoma", 1, 14)); // NOI18N NON-NLS - org.openide.awt.Mnemonics.setLocalizedText(imgInfoLabel, org.openide.util.NbBundle.getMessage(AddImageWizardChooseDataSourceVisual.class, "AddImageWizardChooseDataSourceVisual.imgInfoLabel.text")); // NOI18N - javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup( @@ -262,18 +258,14 @@ final class AddImageWizardChooseDataSourceVisual extends JPanel { .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(inputPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addGroup(layout.createSequentialGroup() - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(nextLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(imgInfoLabel)) + .addComponent(nextLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(0, 54, Short.MAX_VALUE))) .addContainerGap()) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() - .addContainerGap() - .addComponent(imgInfoLabel) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addGap(39, 39, 39) .addComponent(inputPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 45, Short.MAX_VALUE) .addComponent(nextLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) @@ -282,7 +274,6 @@ final class AddImageWizardChooseDataSourceVisual extends JPanel { }// //GEN-END:initComponents // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.ButtonGroup buttonGroup1; - private javax.swing.JLabel imgInfoLabel; private javax.swing.JPanel inputPanel; private javax.swing.JLabel jLabel2; private javax.swing.JLabel nextLabel; diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardIngestConfigVisual.form b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardIngestConfigVisual.form index 2ba2f5fbb7..d6f2eb1302 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardIngestConfigVisual.form +++ b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardIngestConfigVisual.form @@ -22,13 +22,8 @@ - - - - - - - + + @@ -37,26 +32,16 @@ - - + - - + + + - - - - - - - - - - @@ -67,7 +52,7 @@ - + @@ -79,7 +64,7 @@ - + diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardIngestConfigVisual.java b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardIngestConfigVisual.java index d51878c350..db2c8d4d8e 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardIngestConfigVisual.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardIngestConfigVisual.java @@ -69,18 +69,14 @@ import javax.swing.JPanel; // //GEN-BEGIN:initComponents private void initComponents() { - titleLabel = new javax.swing.JLabel(); subtitleLabel = new javax.swing.JLabel(); configPanel = new javax.swing.JPanel(); setPreferredSize(new java.awt.Dimension(569, 300)); - titleLabel.setFont(new java.awt.Font("Tahoma", 1, 14)); // NOI18N NON-NLS - titleLabel.setText(org.openide.util.NbBundle.getMessage(AddImageWizardIngestConfigVisual.class, "AddImageWizardIngestConfigVisual.titleLabel.text")); // NOI18N - subtitleLabel.setText(org.openide.util.NbBundle.getMessage(AddImageWizardIngestConfigVisual.class, "AddImageWizardIngestConfigVisual.subtitleLabel.text")); // NOI18N - configPanel.setPreferredSize(new java.awt.Dimension(569, 255)); + configPanel.setPreferredSize(new java.awt.Dimension(569, 400)); javax.swing.GroupLayout configPanelLayout = new javax.swing.GroupLayout(configPanel); configPanel.setLayout(configPanelLayout); @@ -90,7 +86,7 @@ import javax.swing.JPanel; ); configPanelLayout.setVerticalGroup( configPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 246, Short.MAX_VALUE) + .addGap(0, 258, Short.MAX_VALUE) ); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); @@ -98,27 +94,23 @@ import javax.swing.JPanel; layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(titleLabel) - .addGroup(layout.createSequentialGroup() - .addContainerGap() - .addComponent(subtitleLabel))) + .addContainerGap() + .addComponent(subtitleLabel) .addContainerGap(218, Short.MAX_VALUE)) .addComponent(configPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() - .addComponent(titleLabel) - .addGap(5, 5, 5) + .addGap(6, 6, 6) .addComponent(subtitleLabel) - .addGap(18, 18, 18) - .addComponent(configPanel, javax.swing.GroupLayout.DEFAULT_SIZE, 246, Short.MAX_VALUE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(configPanel, javax.swing.GroupLayout.DEFAULT_SIZE, 258, Short.MAX_VALUE) + .addContainerGap()) ); }// //GEN-END:initComponents // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JPanel configPanel; private javax.swing.JLabel subtitleLabel; - private javax.swing.JLabel titleLabel; // End of variables declaration//GEN-END:variables } diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties b/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties index 2de52ff7ed..158cd119bc 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties @@ -70,15 +70,12 @@ LocalFilesPanel.localFileChooser.approveButtonText=Select LocalFilesPanel.localFileChooser.approveButtonToolTipText= LocalFilesPanel.selectButton.actionCommand=Add AddImageWizardIngestConfigVisual.subtitleLabel.text=Configure the ingest modules you would like to run on this data source. -AddImageWizardIngestConfigVisual.titleLabel.text=Configure Ingest Modules AddImageWizardAddingProgressVisual.statusLabel.text=Data source has been added to the local database. Files are being analyzed. AddImageWizardChooseDataSourceVisual.typeTabel.text=Select source type to add: AddImageWizardChooseDataSourceVisual.jLabel2.text=jLabel2 AddImageWizardChooseDataSourceVisual.nextLabel.text= Press 'Next' to analyze the input data, extract volume and file system data, and populate a local database. -AddImageWizardChooseDataSourceVisual.imgInfoLabel.text=Enter Data Source Information: AddImageWizardAddingProgressVisual.progressLabel.text= AddImageWizardAddingProgressVisual.viewLogButton.text=View Log -AddImageWizardAddingProgressVisual.titleLabel.text=Adding Data Source AddImageWizardAddingProgressVisual.subTitle1Label.text=Processing data source and adding it to a local database. File analysis will start when this finishes. ImageFilePanel.timeZoneLabel.text=Please select the input timezone: ImageFilePanel.noFatOrphansCheckbox.text=Ignore orphan files in FAT file systems @@ -230,4 +227,4 @@ XMLCaseManagement.open.msgDlg.notAutCase.msg=Error\: This is not an Autopsy conf Detail\: \ Cannot open a non-Autopsy config file (at {1}). XMLCaseManagement.open.msgDlg.notAutCase.title=Error -AddImageWizardIngestConfigPanel.CANCEL_BUTTON.text=Cancel +AddImageWizardIngestConfigPanel.CANCEL_BUTTON.text=Cancel \ No newline at end of file diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/casemodule/Bundle_ja.properties index 1df487ebca..e49e85aa5d 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/Bundle_ja.properties +++ b/Core/src/org/sleuthkit/autopsy/casemodule/Bundle_ja.properties @@ -1,229 +1,226 @@ -CTL_AddImage=\u30C7\u30FC\u30BF\u30BD\u30FC\u30B9\u8FFD\u52A0... -CTL_AddImageButton=\u30C7\u30FC\u30BF\u30BD\u30FC\u30B9\u8FFD\u52A0 -CTL_CaseCloseAct=\u30B1\u30FC\u30B9\u3092\u9589\u3058\u308B -CTL_CaseNewAction=\u65B0\u898F\u30B1\u30FC\u30B9\u2026 -CTL_CasePropertiesAction=\u30B1\u30FC\u30B9\u30D7\u30ED\u30D1\u30C6\u30A3\u2026 -CTL_OpenAction=\u30B1\u30FC\u30B9\u3092\u958B\u304F\u2026 -Menu/File/OpenRecentCase=\u6700\u8FD1\u958B\u3044\u305F\u30B1\u30FC\u30B9\u3092\u958B\u304F -CTL_CaseDeleteAction=\u30B1\u30FC\u30B9\u524A\u9664 -OpenIDE-Module-Name=\u30B1\u30FC\u30B9 -NewCaseVisualPanel1.jLabel1.text_1=\u65B0\u898F\u30B1\u30FC\u30B9\u60C5\u5831\u3092\u5165\u529B\uFF1A -NewCaseVisualPanel1.caseNameLabel.text_1=\u30B1\u30FC\u30B9\u540D\uFF1A -NewCaseVisualPanel1.caseDirLabel.text=\u30D9\u30FC\u30B9\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\uFF1A -NewCaseVisualPanel1.caseDirBrowseButton.text=\u95B2\u89A7 +CTL_AddImage=\u30c7\u30fc\u30bf\u30bd\u30fc\u30b9\u8ffd\u52a0... +CTL_AddImageButton=\u30c7\u30fc\u30bf\u30bd\u30fc\u30b9\u8ffd\u52a0 +CTL_CaseCloseAct=\u30b1\u30fc\u30b9\u3092\u9589\u3058\u308b +CTL_CaseNewAction=\u65b0\u898f\u30b1\u30fc\u30b9\u2026 +CTL_CasePropertiesAction=\u30b1\u30fc\u30b9\u30d7\u30ed\u30d1\u30c6\u30a3\u2026 +CTL_OpenAction=\u30b1\u30fc\u30b9\u3092\u958b\u304f\u2026 +Menu/File/OpenRecentCase=\u6700\u8fd1\u958b\u3044\u305f\u30b1\u30fc\u30b9\u3092\u958b\u304f +CTL_CaseDeleteAction=\u30b1\u30fc\u30b9\u524a\u9664 +OpenIDE-Module-Name=\u30b1\u30fc\u30b9 +NewCaseVisualPanel1.jLabel1.text_1=\u65b0\u898f\u30b1\u30fc\u30b9\u60c5\u5831\u3092\u5165\u529b\uff1a +NewCaseVisualPanel1.caseNameLabel.text_1=\u30b1\u30fc\u30b9\u540d\uff1a +NewCaseVisualPanel1.caseDirLabel.text=\u30d9\u30fc\u30b9\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\uff1a +NewCaseVisualPanel1.caseDirBrowseButton.text=\u95b2\u89a7 NewCaseVisualPanel1.caseNameTextField.text_1= -NewCaseVisualPanel1.jLabel2.text_1=\u30B1\u30FC\u30B9\u30C7\u30FC\u30BF\u306F\u4E0B\u8A18\u306E\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u306B\u4FDD\u5B58\u3055\u308C\u307E\u3059\uFF1A +NewCaseVisualPanel1.jLabel2.text_1=\u30b1\u30fc\u30b9\u30c7\u30fc\u30bf\u306f\u4e0b\u8a18\u306e\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306b\u4fdd\u5b58\u3055\u308c\u307e\u3059\uff1a NewCaseVisualPanel1.caseParentDirTextField.text= NewCaseVisualPanel1.caseDirTextField.text_1= -CasePropertiesForm.caseDirLabel.text=\u30B1\u30FC\u30B9\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\uFF1A -CasePropertiesForm.crDateLabel.text=\u4F5C\u6210\u65E5\uFF1A -CasePropertiesForm.caseNameLabel.text=\u30B1\u30FC\u30B9\u540D\uFF1A +CasePropertiesForm.caseDirLabel.text=\u30b1\u30fc\u30b9\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\uff1a +CasePropertiesForm.crDateLabel.text=\u4f5c\u6210\u65e5\uff1a +CasePropertiesForm.caseNameLabel.text=\u30b1\u30fc\u30b9\u540d\uff1a CasePropertiesForm.crDateTextField.text= CasePropertiesForm.caseNameTextField.text= -CasePropertiesForm.updateCaseNameButton.text=\u30A2\u30C3\u30D7\u30C7\u30FC\u30C8 -CasePropertiesForm.casePropLabel.text=\u30B1\u30FC\u30B9\u60C5\u5831 -CasePropertiesForm.genInfoLabel.text=\u4E00\u822C\u60C5\u5831 -CasePropertiesForm.imgInfoLabel.text=\u30A4\u30E1\u30FC\u30B8\u60C5\u5831 +CasePropertiesForm.updateCaseNameButton.text=\u30a2\u30c3\u30d7\u30c7\u30fc\u30c8 +CasePropertiesForm.casePropLabel.text=\u30b1\u30fc\u30b9\u60c5\u5831 +CasePropertiesForm.genInfoLabel.text=\u4e00\u822c\u60c5\u5831 +CasePropertiesForm.imgInfoLabel.text=\u30a4\u30e1\u30fc\u30b8\u60c5\u5831 CasePropertiesForm.OKButton.text=OK -CasePropertiesForm.deleteCaseButton.text=\u30B1\u30FC\u30B9\u524A\u9664 +CasePropertiesForm.deleteCaseButton.text=\u30b1\u30fc\u30b9\u524a\u9664 CueBannerPanel.autopsyLogo.text= -CueBannerPanel.createNewLabel.text=\u65B0\u898F\u30B1\u30FC\u30B9\u4F5C\u6210 -CueBannerPanel.openLabel.text=\u65E2\u5B58\u30B1\u30FC\u30B9\u3092\u958B\u304F -CueBannerPanel.closeButton.text=\u9589\u3058\u308B -CueBannerPanel.openRecentLabel.text=\u6700\u8FD1\u958B\u3044\u305F\u30B1\u30FC\u30B9\u3092\u958B\u304F +CueBannerPanel.createNewLabel.text=\u65b0\u898f\u30b1\u30fc\u30b9\u4f5c\u6210 +CueBannerPanel.openLabel.text=\u65e2\u5b58\u30b1\u30fc\u30b9\u3092\u958b\u304f +CueBannerPanel.closeButton.text=\u9589\u3058\u308b +CueBannerPanel.openRecentLabel.text=\u6700\u8fd1\u958b\u3044\u305f\u30b1\u30fc\u30b9\u3092\u958b\u304f CueBannerPanel.newCaseButton.text= CueBannerPanel.openCaseButton.text= CueBannerPanel.openRecentButton.text= -OpenRecentCasePanel.cancelButton.text=\u30AD\u30E3\u30F3\u30BB\u30EB -OpenRecentCasePanel.jLabel1.text=\u6700\u8FD1\u958B\u3044\u305F\u30D5\u30A1\u30A4\u30EB -CasePropertiesForm.caseNumberLabel.text=\u30B1\u30FC\u30B9\u756A\u53F7\uFF1A -CasePropertiesForm.examinerLabel.text=\u8ABF\u67FB\u62C5\u5F53\u8005\uFF1A +OpenRecentCasePanel.cancelButton.text=\u30ad\u30e3\u30f3\u30bb\u30eb +OpenRecentCasePanel.jLabel1.text=\u6700\u8fd1\u958b\u3044\u305f\u30d5\u30a1\u30a4\u30eb +CasePropertiesForm.caseNumberLabel.text=\u30b1\u30fc\u30b9\u756a\u53f7\uff1a +CasePropertiesForm.examinerLabel.text=\u8abf\u67fb\u62c5\u5f53\u8005\uff1a CasePropertiesForm.caseNumberTextField.text= CasePropertiesForm.examinerTextField.text= NewCaseVisualPanel2.caseNumberTextField.text= -NewCaseVisualPanel2.examinerLabel.text=\u8ABF\u67FB\u62C5\u5F53\u8005\uFF1A -NewCaseVisualPanel2.caseNumberLabel.text=\u30B1\u30FC\u30B9\u756A\u53F7\uFF1A +NewCaseVisualPanel2.examinerLabel.text=\u8abf\u67fb\u62c5\u5f53\u8005\uff1a +NewCaseVisualPanel2.caseNumberLabel.text=\u30b1\u30fc\u30b9\u756a\u53f7\uff1a NewCaseVisualPanel2.examinerTextField.text= -NewCaseVisualPanel2.optionalLabel.text=\u30AA\u30D7\u30B7\u30E7\u30CA\u30EB\uFF1A\u30B1\u30FC\u30B9\u756A\u53F7\u53CA\u3073\u8ABF\u67FB\u62C5\u5F53\u8005\u3092\u8A2D\u5B9A -AddImageErrorsDialog.title=\u30A4\u30E1\u30FC\u30B8\u30ED\u30B0\u3092\u8FFD\u52A0 -AddImageErrorsDialog.copyButton.toolTipText=\u30A8\u30E9\u30FC\u3092\u30AF\u30EA\u30C3\u30D7\u30DC\u30FC\u30C9\u306B\u30B3\u30D4\u30FC\u3057\u307E\u3059 -AddImageErrorsDialog.copyButton.text=\u30B3\u30D4\u30FC -AddImageErrorsDialog.closeButton.toolTipText=\u3053\u306E\u30A6\u30A3\u30F3\u30C9\u30A6\u3092\u9589\u3058\u307E\u3059 -AddImageErrorsDialog.closeButton.text=\u9589\u3058\u308B -OpenRecentCasePanel.openButton.text=\u958B\u304F -ImageFilePanel.pathLabel.text=\u30A4\u30E1\u30FC\u30B8\u30D5\u30A1\u30A4\u30EB\u3092\u95B2\u89A7\uFF1A -ImageFilePanel.browseButton.text=\u95B2\u89A7 +NewCaseVisualPanel2.optionalLabel.text=\u30aa\u30d7\u30b7\u30e7\u30ca\u30eb\uff1a\u30b1\u30fc\u30b9\u756a\u53f7\u53ca\u3073\u8abf\u67fb\u62c5\u5f53\u8005\u3092\u8a2d\u5b9a +AddImageErrorsDialog.title=\u30a4\u30e1\u30fc\u30b8\u30ed\u30b0\u3092\u8ffd\u52a0 +AddImageErrorsDialog.copyButton.toolTipText=\u30a8\u30e9\u30fc\u3092\u30af\u30ea\u30c3\u30d7\u30dc\u30fc\u30c9\u306b\u30b3\u30d4\u30fc\u3057\u307e\u3059 +AddImageErrorsDialog.copyButton.text=\u30b3\u30d4\u30fc +AddImageErrorsDialog.closeButton.toolTipText=\u3053\u306e\u30a6\u30a3\u30f3\u30c9\u30a6\u3092\u9589\u3058\u307e\u3059 +AddImageErrorsDialog.closeButton.text=\u9589\u3058\u308b +OpenRecentCasePanel.openButton.text=\u958b\u304f +ImageFilePanel.pathLabel.text=\u30a4\u30e1\u30fc\u30b8\u30d5\u30a1\u30a4\u30eb\u3092\u95b2\u89a7\uff1a +ImageFilePanel.browseButton.text=\u95b2\u89a7 ImageFilePanel.pathTextField.text= -LocalDiskPanel.diskLabel.text=\u30ED\u30FC\u30AB\u30EB\u30C7\u30A3\u30B9\u30AF\u3092\u9078\u629E\uFF1A -MissingImageDialog.selectButton.text=\u30A4\u30E1\u30FC\u30B8\u3092\u9078\u629E -MissingImageDialog.titleLabel.text=\u6B20\u843D\u3057\u305F\u30A4\u30E1\u30FC\u30B8\u306E\u691C\u7D22 -MissingImageDialog.cancelButton.text=\u30AD\u30E3\u30F3\u30BB\u30EB -LocalDiskPanel.errorLabel.text=\u30A8\u30E9\u30FC\u30E9\u30D9\u30EB -LocalFilesPanel.infoLabel.text=\u30ED\u30FC\u30AB\u30EB\u30D5\u30A1\u30A4\u30EB\u53CA\u3073\u30D5\u30A9\u30EB\u30C0\u3092\u8FFD\u52A0\uFF1A -LocalFilesPanel.selectButton.text=\u8FFD\u52A0 -LocalFilesPanel.localFileChooser.dialogTitle=\u30ED\u30FC\u30AB\u30EB\u30D5\u30A1\u30A4\u30EB\u53C8\u306F\u30D5\u30A9\u30EB\u30C0\u3092\u9078\u629E -LocalFilesPanel.selectButton.toolTipText=\u30ED\u30FC\u30AB\u30EB\u30D5\u30A1\u30A4\u30EB\u53CA\u3073\u30D5\u30A9\u30EB\u30C0\u3092\u30ED\u30B8\u30AB\u30EB\u30D5\u30A1\u30A4\u30EB\u3068\u3057\u3066\u8FFD\u52A0\u3057\u307E\u3059 -LocalFilesPanel.clearButton.text=\u30AF\u30EA\u30A2 -LocalFilesPanel.clearButton.toolTipText=\u73FE\u5728\u9078\u629E\u3055\u308C\u3066\u3044\u308B\u30ED\u30FC\u30AB\u30EB\u30D5\u30A1\u30A4\u30EB\u30D1\u30B9\u304C\u30AF\u30EA\u30A2\u3055\u308C\u307E\u3059 +LocalDiskPanel.diskLabel.text=\u30ed\u30fc\u30ab\u30eb\u30c7\u30a3\u30b9\u30af\u3092\u9078\u629e\uff1a +MissingImageDialog.selectButton.text=\u30a4\u30e1\u30fc\u30b8\u3092\u9078\u629e +MissingImageDialog.titleLabel.text=\u6b20\u843d\u3057\u305f\u30a4\u30e1\u30fc\u30b8\u306e\u691c\u7d22 +MissingImageDialog.cancelButton.text=\u30ad\u30e3\u30f3\u30bb\u30eb +LocalDiskPanel.errorLabel.text=\u30a8\u30e9\u30fc\u30e9\u30d9\u30eb +LocalFilesPanel.infoLabel.text=\u30ed\u30fc\u30ab\u30eb\u30d5\u30a1\u30a4\u30eb\u53ca\u3073\u30d5\u30a9\u30eb\u30c0\u3092\u8ffd\u52a0\uff1a +LocalFilesPanel.selectButton.text=\u8ffd\u52a0 +LocalFilesPanel.localFileChooser.dialogTitle=\u30ed\u30fc\u30ab\u30eb\u30d5\u30a1\u30a4\u30eb\u53c8\u306f\u30d5\u30a9\u30eb\u30c0\u3092\u9078\u629e +LocalFilesPanel.selectButton.toolTipText=\u30ed\u30fc\u30ab\u30eb\u30d5\u30a1\u30a4\u30eb\u53ca\u3073\u30d5\u30a9\u30eb\u30c0\u3092\u30ed\u30b8\u30ab\u30eb\u30d5\u30a1\u30a4\u30eb\u3068\u3057\u3066\u8ffd\u52a0\u3057\u307e\u3059 +LocalFilesPanel.clearButton.text=\u30af\u30ea\u30a2 +LocalFilesPanel.clearButton.toolTipText=\u73fe\u5728\u9078\u629e\u3055\u308c\u3066\u3044\u308b\u30ed\u30fc\u30ab\u30eb\u30d5\u30a1\u30a4\u30eb\u30d1\u30b9\u304c\u30af\u30ea\u30a2\u3055\u308c\u307e\u3059 LocalFilesPanel.selectedPaths.toolTipText= -LocalFilesPanel.localFileChooser.approveButtonText=\u9078\u629E +LocalFilesPanel.localFileChooser.approveButtonText=\u9078\u629e LocalFilesPanel.localFileChooser.approveButtonToolTipText= -LocalFilesPanel.selectButton.actionCommand=\u8FFD\u52A0 -AddImageWizardIngestConfigVisual.subtitleLabel.text=\u3053\u306E\u30C7\u30FC\u30BF\u30BD\u30FC\u30B9\u306B\u5BFE\u3057\u3066\u5B9F\u884C\u3057\u305F\u3044\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u30E2\u30B8\u30E5\u30FC\u30EB\u7FA4\u3092\u8A2D\u5B9A\u3057\u307E\u3059\u3002 -AddImageWizardIngestConfigVisual.titleLabel.text=\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u30E2\u30B8\u30E5\u30FC\u30EB\u3092\u8A2D\u5B9A -AddImageWizardAddingProgressVisual.statusLabel.text=\u30D5\u30A1\u30A4\u30EB\u30B7\u30B9\u30C6\u30E0\u304C\u30ED\u30FC\u30AB\u30EB\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u306B\u8FFD\u52A0\u3055\u308C\u307E\u3057\u305F\u3002\u30D5\u30A1\u30A4\u30EB\u3092\u89E3\u6790\u4E2D\u3067\u3059\u3002 -AddImageWizardChooseDataSourceVisual.typeTabel.text=\u8FFD\u52A0\u3059\u308B\u30BD\u30FC\u30B9\u30BF\u30A4\u30D7\u3092\u9078\u629E\uFF1A +LocalFilesPanel.selectButton.actionCommand=\u8ffd\u52a0 +AddImageWizardIngestConfigVisual.subtitleLabel.text=\u3053\u306e\u30c7\u30fc\u30bf\u30bd\u30fc\u30b9\u306b\u5bfe\u3057\u3066\u5b9f\u884c\u3057\u305f\u3044\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb\u7fa4\u3092\u8a2d\u5b9a\u3057\u307e\u3059\u3002 +AddImageWizardAddingProgressVisual.statusLabel.text=\u30d5\u30a1\u30a4\u30eb\u30b7\u30b9\u30c6\u30e0\u304c\u30ed\u30fc\u30ab\u30eb\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306b\u8ffd\u52a0\u3055\u308c\u307e\u3057\u305f\u3002\u30d5\u30a1\u30a4\u30eb\u3092\u89e3\u6790\u4e2d\u3067\u3059\u3002 +AddImageWizardChooseDataSourceVisual.typeTabel.text=\u8ffd\u52a0\u3059\u308b\u30bd\u30fc\u30b9\u30bf\u30a4\u30d7\u3092\u9078\u629e\uff1a AddImageWizardChooseDataSourceVisual.jLabel2.text=jLabel2 -AddImageWizardChooseDataSourceVisual.nextLabel.text= \u300C\u6B21\u3078\u300D\u3092\u30AF\u30EA\u30C3\u30AF\u3057\u3066\u3001\u30A4\u30F3\u30D7\u30C3\u30C8\u30C7\u30FC\u30BF\u3092\u89E3\u6790\u3001\u30DC\u30EA\u30E5\u30FC\u30E0\u53CA\u3073\u30D5\u30A1\u30A4\u30EB\u30B7\u30B9\u30C6\u30E0\u30C7\u30FC\u30BF\u3092\u62BD\u51FA\u3001\u30ED\u30FC\u30AB\u30EB\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u306B\u30C7\u30FC\u30BF\u3092\u6295\u5165\u3002 -AddImageWizardChooseDataSourceVisual.imgInfoLabel.text=\u30C7\u30FC\u30BF\u30BD\u30FC\u30B9\u60C5\u5831\u3092\u5165\u529B\uFF1A -AddImageWizardAddingProgressVisual.progressLabel.text=\uFF1C\u30D7\u30ED\u30B0\u30EC\u30B9\uFF1E -AddImageWizardAddingProgressVisual.viewLogButton.text=\u30ED\u30B0\u3092\u8868\u793A -AddImageWizardAddingProgressVisual.titleLabel.text=\u30C7\u30FC\u30BF\u30BD\u30FC\u30B9\u3092\u8FFD\u52A0\u4E2D -AddImageWizardAddingProgressVisual.subTitle1Label.text=\u30ED\u30FC\u30AB\u30EB\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u306B\u30D5\u30A1\u30A4\u30EB\u30B7\u30B9\u30C6\u30E0\u60C5\u5831\u3092\u8FFD\u52A0\u4E2D\u3067\u3059\u3002\u3053\u3061\u3089\u304C\u5B8C\u4E86\u6B21\u7B2C\u3001\u30D5\u30A1\u30A4\u30EB\u89E3\u6790\u304C\u59CB\u307E\u308A\u307E\u3059\u3002 -ImageFilePanel.timeZoneLabel.text=\u30A4\u30F3\u30D7\u30C3\u30C8\u30BF\u30A4\u30E0\u30BE\u30FC\u30F3\u3092\u9078\u629E\u3057\u3066\u4E0B\u3055\u3044\uFF1A -ImageFilePanel.descLabel.text=\uFF08\u3088\u308A\u901F\u3044\u7D50\u679C\u3001\u3057\u304B\u3057\u4E00\u90E8\u306E\u30C7\u30FC\u30BF\u306F\u691C\u7D22\u3055\u308C\u307E\u305B\u3093\uFF09 -LocalDiskPanel.timeZoneLabel.text=\u30A4\u30F3\u30D7\u30C3\u30C8\u30BF\u30A4\u30E0\u30BE\u30FC\u30F3\u3092\u9078\u629E\u3057\u3066\u4E0B\u3055\u3044\uFF1A -LocalDiskPanel.descLabel.text=\uFF08\u3088\u308A\u901F\u3044\u7D50\u679C\u3001\u3057\u304B\u3057\u4E00\u90E8\u306E\u30C7\u30FC\u30BF\u306F\u691C\u7D22\u3055\u308C\u307E\u305B\u3093\uFF09 -MissingImageDialog.browseButton.text=\u95B2\u89A7 -AddImageWizardAddingProgressVisual.progressTextArea.border.title=\u30B9\u30C6\u30FC\u30BF\u30B9 -AddImageAction.wizard.title=\u30C7\u30FC\u30BF\u30BD\u30FC\u30B9\u3092\u8FFD\u52A0 -AddImageAction.ingestConfig.ongoingIngest.msg=\u4ED6\u306E\u30C7\u30FC\u30BF\u30BD\u30FC\u30B9\u304C\u51E6\u7406\u4E2D\u3067\u3059\u3002\u65B0\u898F\u30BD\u30FC\u30B9\u3092\u4ECA\u8FFD\u52A0\u3059\u308B\u3068\u5B9F\u884C\u4E2D\u306E\u51E6\u7406\u304C\u9045\u304F\u306A\u308B\u304B\u3082\u3057\u308C\u307E\u305B\u3093\u3002
\u3053\u306E\u307E\u307E\u5B9F\u884C\u3057\u3001\u65B0\u898F\u30C7\u30FC\u30BF\u30BD\u30FC\u30B9\u3092\u8FFD\u52A0\u3057\u307E\u3059\u304B\uFF1F -AddImageAction.ingestConfig.ongoingIngest.title=\u51E6\u7406\u4E2D -AddImageTask.run.progress.adding=\u8FFD\u52A0\u4E2D\uFF1A{0} -AddImageTask.interrupt.exception.msg=\u30A4\u30E1\u30FC\u30B8\u8FFD\u52A0\u30D7\u30ED\u30BB\u30B9\u306E\u505C\u6B62\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002 -AddImageWizardAddingProgressPanel.isValid.focusNext=\u6B21 > -AddImageWizardAddingProgressPanel.stateStarted.progressBarText=*\u5927\u304D\u3044\u30C7\u30FC\u30BF\u30BD\u30FC\u30B9\u306E\u5834\u5408\u3001\u3053\u306E\u30D7\u30ED\u30BB\u30B9\u306F\u6642\u9593\u304C\u304B\u304B\u308B\u304B\u3082\u3057\u308C\u307E\u305B\u3093\u3002 -AddImageWizardAddingProgressVisual.addingDsComplete.text=\u30C7\u30FC\u30BF\u30BD\u30FC\u30B9\u3092\u8FFD\u52A0 - \u5B8C\u4E86 -AddImageWizardAddingProgressVisual.getName.text=\u30C7\u30FC\u30BF\u30BD\u30FC\u30B9\u3092\u8FFD\u52A0 -AddImageWizardAddingProgressVisual.showErrors.critText=*\u30C7\u30FC\u30BF\u30BD\u30FC\u30B9\u306E\u8FFD\u52A0\u306B\u5931\u6557\u3057\u307E\u3057\u305F\uFF08\u81F4\u547D\u7684\u306A\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\uFF09\u3002\u4E0B\u8A18\u3092\u30AF\u30EA\u30C3\u30AF\u3057\u3066\u30ED\u30B0\u3092\u78BA\u8A8D\u3057\u3066\u4E0B\u3055\u3044\u3002 -AddImageWizardAddingProgressVisual.showErrors.nonCritText=*\u30C7\u30FC\u30BF\u30BD\u30FC\u30B9\u306E\u8FFD\u52A0\u306B\u5931\u6557\u3057\u307E\u3057\u305F\uFF08\u91CD\u5927\u3067\u306F\u306A\u3044\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\uFF09\u3002\u4E0B\u8A18\u3092\u30AF\u30EA\u30C3\u30AF\u3057\u3066\u30ED\u30B0\u3092\u78BA\u8A8D\u3057\u3066\u4E0B\u3055\u3044\u3002 -AddImageWizardChooseDataSourcePanel.moveFocusNext=\u6B21 > -AddImageWizardChooseDataSourceVisual.getName.text=\u30C7\u30FC\u30BF\u30BD\u30FC\u30B9\u60C5\u5831\u3092\u5165\u529B -AddImageWizardIngestConfigPanel.dsProcDone.noErrs.text=*\u30C7\u30FC\u30BF\u30BD\u30FC\u30B9\u304C\u8FFD\u52A0\u3055\u308C\u307E\u3057\u305F\u3002 -AddImageWizardIngestConfigPanel.dsProcDone.errs.text=*\u30C7\u30FC\u30BF\u30BD\u30FC\u30B9\u306E\u8FFD\u52A0\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002 -AddImageWizardIngestConfigVisual.getName.text=\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u30E2\u30B8\u30E5\u30FC\u30EB\u3092\u8A2D\u5B9A -AddImageWizardIterator.stepXofN=\u30B9\u30C6\u30C3\u30D7{0}\uFF0F{1} -AddLocalFilesTask.localFileAdd.progress.text=\u8FFD\u52A0\u4E2D\uFF1A{0}/{1} -Case.getCurCase.exception.noneOpen=\u73FE\u5728\u306E\u30B1\u30FC\u30B9\u3092\u53D6\u5F97\u3067\u304D\u307E\u305B\u3093\uFF1B\u958B\u3044\u3066\u3044\u308B\u30B1\u30FC\u30B9\u304C\u3042\u308A\u307E\u305B\u3093\uFF01 -Case.moduleErr=\u30E2\u30B8\u30E5\u30FC\u30EB\u30A8\u30E9\u30FC -Case.changeCase.errListenToCaseUpdates.msg=\u30B1\u30FC\u30B9\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 -Case.create.exception.msg=\u30B1\u30FC\u30B9\u4F5C\u6210\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\uFF1A\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA{1}\u306E{0} -Case.open.exception.blankCase.msg=\u30B1\u30FC\u30B9\u540D\u304C\u7A7A\u767D\u3067\u3059\u3002 -Case.open.msgDlg.updated.msg=\u30B1\u30FC\u30B9\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u30B9\u30AD\u30FC\u30DE\u3092\u30A2\u30C3\u30D7\u30C7\u30FC\u30C8\u3057\u307E\u3057\u305F\u3002\ -\u4E0B\u8A18\u306E\u30D1\u30B9\u3092\u6301\u3064\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u306E\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7\u30B3\u30D4\u30FC\u304C\u4F5C\u6210\u3055\u308C\u307E\u3057\u305F\uFF1A\ +AddImageWizardChooseDataSourceVisual.nextLabel.text= \u300c\u6b21\u3078\u300d\u3092\u30af\u30ea\u30c3\u30af\u3057\u3066\u3001\u30a4\u30f3\u30d7\u30c3\u30c8\u30c7\u30fc\u30bf\u3092\u89e3\u6790\u3001\u30dc\u30ea\u30e5\u30fc\u30e0\u53ca\u3073\u30d5\u30a1\u30a4\u30eb\u30b7\u30b9\u30c6\u30e0\u30c7\u30fc\u30bf\u3092\u62bd\u51fa\u3001\u30ed\u30fc\u30ab\u30eb\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306b\u30c7\u30fc\u30bf\u3092\u6295\u5165\u3002 +AddImageWizardAddingProgressVisual.progressLabel.text=\uff1c\u30d7\u30ed\u30b0\u30ec\u30b9\uff1e +AddImageWizardAddingProgressVisual.viewLogButton.text=\u30ed\u30b0\u3092\u8868\u793a +AddImageWizardAddingProgressVisual.subTitle1Label.text=\u30ed\u30fc\u30ab\u30eb\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306b\u30d5\u30a1\u30a4\u30eb\u30b7\u30b9\u30c6\u30e0\u60c5\u5831\u3092\u8ffd\u52a0\u4e2d\u3067\u3059\u3002\u3053\u3061\u3089\u304c\u5b8c\u4e86\u6b21\u7b2c\u3001\u30d5\u30a1\u30a4\u30eb\u89e3\u6790\u304c\u59cb\u307e\u308a\u307e\u3059\u3002 +ImageFilePanel.timeZoneLabel.text=\u30a4\u30f3\u30d7\u30c3\u30c8\u30bf\u30a4\u30e0\u30be\u30fc\u30f3\u3092\u9078\u629e\u3057\u3066\u4e0b\u3055\u3044\uff1a +ImageFilePanel.descLabel.text=\uff08\u3088\u308a\u901f\u3044\u7d50\u679c\u3001\u3057\u304b\u3057\u4e00\u90e8\u306e\u30c7\u30fc\u30bf\u306f\u691c\u7d22\u3055\u308c\u307e\u305b\u3093\uff09 +LocalDiskPanel.timeZoneLabel.text=\u30a4\u30f3\u30d7\u30c3\u30c8\u30bf\u30a4\u30e0\u30be\u30fc\u30f3\u3092\u9078\u629e\u3057\u3066\u4e0b\u3055\u3044\uff1a +LocalDiskPanel.descLabel.text=\uff08\u3088\u308a\u901f\u3044\u7d50\u679c\u3001\u3057\u304b\u3057\u4e00\u90e8\u306e\u30c7\u30fc\u30bf\u306f\u691c\u7d22\u3055\u308c\u307e\u305b\u3093\uff09 +MissingImageDialog.browseButton.text=\u95b2\u89a7 +AddImageWizardAddingProgressVisual.progressTextArea.border.title=\u30b9\u30c6\u30fc\u30bf\u30b9 +AddImageAction.wizard.title=\u30c7\u30fc\u30bf\u30bd\u30fc\u30b9\u3092\u8ffd\u52a0 +AddImageAction.ingestConfig.ongoingIngest.msg=\u4ed6\u306e\u30c7\u30fc\u30bf\u30bd\u30fc\u30b9\u304c\u51e6\u7406\u4e2d\u3067\u3059\u3002\u65b0\u898f\u30bd\u30fc\u30b9\u3092\u4eca\u8ffd\u52a0\u3059\u308b\u3068\u5b9f\u884c\u4e2d\u306e\u51e6\u7406\u304c\u9045\u304f\u306a\u308b\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u3002
\u3053\u306e\u307e\u307e\u5b9f\u884c\u3057\u3001\u65b0\u898f\u30c7\u30fc\u30bf\u30bd\u30fc\u30b9\u3092\u8ffd\u52a0\u3057\u307e\u3059\u304b\uff1f +AddImageAction.ingestConfig.ongoingIngest.title=\u51e6\u7406\u4e2d +AddImageTask.run.progress.adding=\u8ffd\u52a0\u4e2d\uff1a{0} +AddImageTask.interrupt.exception.msg=\u30a4\u30e1\u30fc\u30b8\u8ffd\u52a0\u30d7\u30ed\u30bb\u30b9\u306e\u505c\u6b62\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002 +AddImageWizardAddingProgressPanel.isValid.focusNext=\u6b21 > +AddImageWizardAddingProgressPanel.stateStarted.progressBarText=*\u5927\u304d\u3044\u30c7\u30fc\u30bf\u30bd\u30fc\u30b9\u306e\u5834\u5408\u3001\u3053\u306e\u30d7\u30ed\u30bb\u30b9\u306f\u6642\u9593\u304c\u304b\u304b\u308b\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u3002 +AddImageWizardAddingProgressVisual.addingDsComplete.text=\u30c7\u30fc\u30bf\u30bd\u30fc\u30b9\u3092\u8ffd\u52a0 - \u5b8c\u4e86 +AddImageWizardAddingProgressVisual.getName.text=\u30c7\u30fc\u30bf\u30bd\u30fc\u30b9\u3092\u8ffd\u52a0 +AddImageWizardAddingProgressVisual.showErrors.critText=*\u30c7\u30fc\u30bf\u30bd\u30fc\u30b9\u306e\u8ffd\u52a0\u306b\u5931\u6557\u3057\u307e\u3057\u305f\uff08\u81f4\u547d\u7684\u306a\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\uff09\u3002\u4e0b\u8a18\u3092\u30af\u30ea\u30c3\u30af\u3057\u3066\u30ed\u30b0\u3092\u78ba\u8a8d\u3057\u3066\u4e0b\u3055\u3044\u3002 +AddImageWizardAddingProgressVisual.showErrors.nonCritText=*\u30c7\u30fc\u30bf\u30bd\u30fc\u30b9\u306e\u8ffd\u52a0\u306b\u5931\u6557\u3057\u307e\u3057\u305f\uff08\u91cd\u5927\u3067\u306f\u306a\u3044\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\uff09\u3002\u4e0b\u8a18\u3092\u30af\u30ea\u30c3\u30af\u3057\u3066\u30ed\u30b0\u3092\u78ba\u8a8d\u3057\u3066\u4e0b\u3055\u3044\u3002 +AddImageWizardChooseDataSourcePanel.moveFocusNext=\u6b21 > +AddImageWizardChooseDataSourceVisual.getName.text=\u30c7\u30fc\u30bf\u30bd\u30fc\u30b9\u60c5\u5831\u3092\u5165\u529b +AddImageWizardIngestConfigPanel.dsProcDone.noErrs.text=*\u30c7\u30fc\u30bf\u30bd\u30fc\u30b9\u304c\u8ffd\u52a0\u3055\u308c\u307e\u3057\u305f\u3002 +AddImageWizardIngestConfigPanel.dsProcDone.errs.text=*\u30c7\u30fc\u30bf\u30bd\u30fc\u30b9\u306e\u8ffd\u52a0\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002 +AddImageWizardIngestConfigVisual.getName.text=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb\u3092\u8a2d\u5b9a +AddImageWizardIterator.stepXofN=\u30b9\u30c6\u30c3\u30d7{0}\uff0f{1} +AddLocalFilesTask.localFileAdd.progress.text=\u8ffd\u52a0\u4e2d\uff1a{0}/{1} +Case.getCurCase.exception.noneOpen=\u73fe\u5728\u306e\u30b1\u30fc\u30b9\u3092\u53d6\u5f97\u3067\u304d\u307e\u305b\u3093\uff1b\u958b\u3044\u3066\u3044\u308b\u30b1\u30fc\u30b9\u304c\u3042\u308a\u307e\u305b\u3093\uff01 +Case.moduleErr=\u30e2\u30b8\u30e5\u30fc\u30eb\u30a8\u30e9\u30fc +Case.changeCase.errListenToCaseUpdates.msg=\u30b1\u30fc\u30b9\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 +Case.create.exception.msg=\u30b1\u30fc\u30b9\u4f5c\u6210\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\uff1a\u30c7\u30a3\u30ec\u30af\u30c8\u30ea{1}\u306e{0} +Case.open.exception.blankCase.msg=\u30b1\u30fc\u30b9\u540d\u304c\u7a7a\u767d\u3067\u3059\u3002 +Case.open.msgDlg.updated.msg=\u30b1\u30fc\u30b9\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30b9\u30ad\u30fc\u30de\u3092\u30a2\u30c3\u30d7\u30c7\u30fc\u30c8\u3057\u307e\u3057\u305f\u3002\ +\u4e0b\u8a18\u306e\u30d1\u30b9\u3092\u6301\u3064\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u30b3\u30d4\u30fc\u304c\u4f5c\u6210\u3055\u308c\u307e\u3057\u305f\uff1a\ {0} -Case.open.msgDlg.updated.title=\u30B1\u30FC\u30B9\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u30B9\u30AD\u30FC\u30DE\u30A2\u30C3\u30D7\u30C7\u30FC\u30C8 -Case.open.exception.checkFile.msg=\u6B63\u3057\u3044\u30B1\u30FC\u30B9\u30D5\u30A1\u30A4\u30EB\u3092\u9078\u629E\u3057\u305F\u304B\u78BA\u8A8D\u3057\u3066\u4E0B\u3055\u3044\uFF08\u901A\u5E38\u62E1\u5F35\u5B50{0}\u3092\u6301\u3064\uFF09 -Case.open.exception.gen.msg=\u30B1\u30FC\u30B9\u3092\u958B\u304F\u306E\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F -Case.checkImgExist.confDlg.doesntExist.msg={0} \u304C\u3053\u306E\u30B1\u30FC\u30B9\u306B\u95A2\u9023\u3059\u308B\u30A4\u30E1\u30FC\u30B8\u306E\uFF11\u500B\u304C\u6B20\u843D\u3057\u3066\u3044\u308B\u306E\u3092\u691C\u51FA\u3057\u307E\u3057\u305F\u3002\u305D\u308C\u3089\u3092\u4ECA\u304B\u3089\u691C\u7D22\u3057\u307E\u3059\u304B\uFF1F\ +Case.open.msgDlg.updated.title=\u30b1\u30fc\u30b9\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30b9\u30ad\u30fc\u30de\u30a2\u30c3\u30d7\u30c7\u30fc\u30c8 +Case.open.exception.checkFile.msg=\u6b63\u3057\u3044\u30b1\u30fc\u30b9\u30d5\u30a1\u30a4\u30eb\u3092\u9078\u629e\u3057\u305f\u304b\u78ba\u8a8d\u3057\u3066\u4e0b\u3055\u3044\uff08\u901a\u5e38\u62e1\u5f35\u5b50{0}\u3092\u6301\u3064\uff09 +Case.open.exception.gen.msg=\u30b1\u30fc\u30b9\u3092\u958b\u304f\u306e\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f +Case.checkImgExist.confDlg.doesntExist.msg={0} \u304c\u3053\u306e\u30b1\u30fc\u30b9\u306b\u95a2\u9023\u3059\u308b\u30a4\u30e1\u30fc\u30b8\u306e\uff11\u500b\u304c\u6b20\u843d\u3057\u3066\u3044\u308b\u306e\u3092\u691c\u51fa\u3057\u307e\u3057\u305f\u3002\u305d\u308c\u3089\u3092\u4eca\u304b\u3089\u691c\u7d22\u3057\u307e\u3059\u304b\uff1f\ \ -\u4EE5\u524D\u3001\u30A4\u30E1\u30FC\u30B8\u306F\u4E0B\u8A18\u306B\u3042\u308A\u307E\u3057\u305F\uFF1A\ +\u4ee5\u524d\u3001\u30a4\u30e1\u30fc\u30b8\u306f\u4e0b\u8a18\u306b\u3042\u308a\u307e\u3057\u305f\uff1a\ {1}\ -\u3044\u3044\u3048\u3092\u9078\u629E\u3057\u3066\u3082\u3001\u4ECA\u5F8C\u3082\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u3092\u95B2\u89A7\u3057\u3001\u30EC\u30DD\u30FC\u30C8\u751F\u6210\u304C\u3067\u304D\u307E\u3059\u304C\u3001\u30D5\u30A1\u30A4\u30EB\u30B3\u30F3\u30C6\u30F3\u30C4\u306E\u8868\u793A\u307E\u305F\u306F\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u30D7\u30ED\u30BB\u30B9\u306E\u5B9F\u884C\u304C\u3067\u304D\u306A\u304F\u306A\u308A\u307E\u3059\u3002 -Case.checkImgExist.confDlg.doesntExist.title=\u6B20\u843D\u30A4\u30E1\u30FC\u30B8 -Case.addImg.exception.msg=\u30B1\u30FC\u30B9\u306B\u30A4\u30E1\u30FC\u30B8\u3092\u8FFD\u52A0\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F -Case.closeCase.exception.msg=\u73FE\u5728\u306E\u30B1\u30FC\u30B9\u3092\u9589\u3058\u308B\u6700\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002 -Case.deleteCase.exception.msg=\u30B1\u30FC\u30B9\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u3092\u524A\u9664\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\uFF1A{0} -Case.deleteCase.exception.msg2=\u30B1\u30FC\u30B9\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u3092\u524A\u9664\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\uFF1A{0} -Case.updateCaseName.exception.msg=\u30B1\u30FC\u30B9\u540D\u3092\u30A2\u30C3\u30D7\u30C7\u30FC\u30C8\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002 -Case.updateExaminer.exception.msg=\u8ABF\u67FB\u62C5\u5F53\u8005\u3092\u30A2\u30C3\u30D7\u30C7\u30FC\u30BF\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002 -Case.updateCaseNum.exception.msg=\u30B1\u30FC\u30B9\u756A\u53F7\u3092\u30A2\u30C3\u30D7\u30C7\u30FC\u30BF\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002 -Case.exception.errGetRootObj=\u30EB\u30FC\u30C8\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u3092\u53D6\u5F97\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002 -Case.createCaseDir.exception.existNotDir=\u30B1\u30FC\u30B9\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u3092\u4F5C\u6210\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002\u65E2\u306B\u5B58\u5728\u3057\u3001\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u3067\u306F\u3042\u308A\u307E\u305B\u3093\uFF1A{0} -Case.createCaseDir.exception.existCantRW=\u30B1\u30FC\u30B9\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u3092\u4F5C\u6210\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002\u65E2\u306B\u5B58\u5728\u3057\u3001\u8AAD\u307F\u53D6\u308A\uFF0F\u66F8\u304D\u8FBC\u307F\u304C\u3067\u304D\u307E\u305B\u3093\uFF1A{0} -Case.createCaseDir.exception.cantCreate=\u30B1\u30FC\u30B9\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u3092\u4F5C\u6210\u3067\u304D\u307E\u305B\u3093\uFF1A {0} -Case.createCaseDir.exception.cantCreateCaseDir=\u30B1\u30FC\u30B9\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u3092\u4F5C\u6210\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\uFF1A {0} -Case.createCaseDir.exception.cantCreateModDir=\u30E2\u30B8\u30E5\u30FC\u30EB\u30A2\u30A6\u30C8\u30D7\u30C3\u30C8\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u3092\u4F5C\u6210\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\uFF1A{0} -Case.createCaseDir.exception.gen=\u30B1\u30FC\u30B9\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u3092\u4F5C\u6210\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\uFF1A{0} -CaseDeleteAction.closeConfMsg.text=\u3053\u306E\u30B1\u30FC\u30B9\u3092\u672C\u5F53\u306B\u9589\u3058\u3001\u524A\u9664\u3057\u307E\u3059\u304B\uFF1F\ - \u30B1\u30FC\u30B9\u540D\uFF1A {0}\ - \u30B1\u30FC\u30B9\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\: {1} -CaseDeleteAction.closeConfMsg.title=\u8B66\u544A\uFF1A\u73FE\u5728\u306E\u30B1\u30FC\u30B9\u3092\u9589\u3058\u307E\u3059 -CaseDeleteAction.msgDlg.fileInUse.msg=\u5225\u306E\u30D7\u30ED\u30B0\u30E9\u30E0\u3067\u30D5\u30A9\u30EB\u30C0\u307E\u305F\u306F\u30D5\u30A1\u30A4\u30EB\u3092\u958B\u3044\u3066\u3044\u308B\u306E\u3067\u3001\u524A\u9664\u3092\u5B8C\u4E86\u3067\u304D\u307E\u305B\u3093\u3002\ +\u3044\u3044\u3048\u3092\u9078\u629e\u3057\u3066\u3082\u3001\u4eca\u5f8c\u3082\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u3092\u95b2\u89a7\u3057\u3001\u30ec\u30dd\u30fc\u30c8\u751f\u6210\u304c\u3067\u304d\u307e\u3059\u304c\u3001\u30d5\u30a1\u30a4\u30eb\u30b3\u30f3\u30c6\u30f3\u30c4\u306e\u8868\u793a\u307e\u305f\u306f\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30d7\u30ed\u30bb\u30b9\u306e\u5b9f\u884c\u304c\u3067\u304d\u306a\u304f\u306a\u308a\u307e\u3059\u3002 +Case.checkImgExist.confDlg.doesntExist.title=\u6b20\u843d\u30a4\u30e1\u30fc\u30b8 +Case.addImg.exception.msg=\u30b1\u30fc\u30b9\u306b\u30a4\u30e1\u30fc\u30b8\u3092\u8ffd\u52a0\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f +Case.closeCase.exception.msg=\u73fe\u5728\u306e\u30b1\u30fc\u30b9\u3092\u9589\u3058\u308b\u6700\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002 +Case.deleteCase.exception.msg=\u30b1\u30fc\u30b9\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u3092\u524a\u9664\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\uff1a{0} +Case.deleteCase.exception.msg2=\u30b1\u30fc\u30b9\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u3092\u524a\u9664\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\uff1a{0} +Case.updateCaseName.exception.msg=\u30b1\u30fc\u30b9\u540d\u3092\u30a2\u30c3\u30d7\u30c7\u30fc\u30c8\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002 +Case.updateExaminer.exception.msg=\u8abf\u67fb\u62c5\u5f53\u8005\u3092\u30a2\u30c3\u30d7\u30c7\u30fc\u30bf\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002 +Case.updateCaseNum.exception.msg=\u30b1\u30fc\u30b9\u756a\u53f7\u3092\u30a2\u30c3\u30d7\u30c7\u30fc\u30bf\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002 +Case.exception.errGetRootObj=\u30eb\u30fc\u30c8\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092\u53d6\u5f97\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002 +Case.createCaseDir.exception.existNotDir=\u30b1\u30fc\u30b9\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u3092\u4f5c\u6210\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002\u65e2\u306b\u5b58\u5728\u3057\u3001\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u3067\u306f\u3042\u308a\u307e\u305b\u3093\uff1a{0} +Case.createCaseDir.exception.existCantRW=\u30b1\u30fc\u30b9\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u3092\u4f5c\u6210\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002\u65e2\u306b\u5b58\u5728\u3057\u3001\u8aad\u307f\u53d6\u308a\uff0f\u66f8\u304d\u8fbc\u307f\u304c\u3067\u304d\u307e\u305b\u3093\uff1a{0} +Case.createCaseDir.exception.cantCreate=\u30b1\u30fc\u30b9\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u3092\u4f5c\u6210\u3067\u304d\u307e\u305b\u3093\uff1a {0} +Case.createCaseDir.exception.cantCreateCaseDir=\u30b1\u30fc\u30b9\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u3092\u4f5c\u6210\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\uff1a {0} +Case.createCaseDir.exception.cantCreateModDir=\u30e2\u30b8\u30e5\u30fc\u30eb\u30a2\u30a6\u30c8\u30d7\u30c3\u30c8\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u3092\u4f5c\u6210\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\uff1a{0} +Case.createCaseDir.exception.gen=\u30b1\u30fc\u30b9\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u3092\u4f5c\u6210\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\uff1a{0} +CaseDeleteAction.closeConfMsg.text=\u3053\u306e\u30b1\u30fc\u30b9\u3092\u672c\u5f53\u306b\u9589\u3058\u3001\u524a\u9664\u3057\u307e\u3059\u304b\uff1f\ + \u30b1\u30fc\u30b9\u540d\uff1a {0}\ + \u30b1\u30fc\u30b9\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\: {1} +CaseDeleteAction.closeConfMsg.title=\u8b66\u544a\uff1a\u73fe\u5728\u306e\u30b1\u30fc\u30b9\u3092\u9589\u3058\u307e\u3059 +CaseDeleteAction.msgDlg.fileInUse.msg=\u5225\u306e\u30d7\u30ed\u30b0\u30e9\u30e0\u3067\u30d5\u30a9\u30eb\u30c0\u307e\u305f\u306f\u30d5\u30a1\u30a4\u30eb\u3092\u958b\u3044\u3066\u3044\u308b\u306e\u3067\u3001\u524a\u9664\u3092\u5b8c\u4e86\u3067\u304d\u307e\u305b\u3093\u3002\ \ -\u30D5\u30A9\u30EB\u30C0\u307E\u305F\u306F\u30D5\u30A1\u30A4\u30EB\u3092\u9589\u3058\u3066\u304B\u3089\u518D\u5B9F\u884C\u3059\u308B\u304B\u3001\u624B\u52D5\u3067\u30B1\u30FC\u30B9\u3092\u524A\u9664\u3057\u3066\u4E0B\u3055\u3044\u3002 -CaseDeleteAction.msgDlg.fileInUse.title=\u30A8\u30E9\u30FC\uFF1A\u30D5\u30A9\u30EB\u30C0\u304C\u4F7F\u7528\u4E2D -CaseDeleteAction.msgDlg.caseDelete.msg=\u30B1\u30FC\u30B9{0}\u306F\u524A\u9664\u3055\u308C\u307E\u3057\u305F\u3002 -CaseOpenAction.autFilter.title={0} \u30B1\u30FC\u30B9\u30D5\u30A1\u30A4\u30EB ( {1}) -CaseOpenAction.msgDlg.fileNotExist.msg=\u30A8\u30E9\u30FC\uFF1A\u30D5\u30A1\u30A4\u30EB\u304C\u5B58\u5728\u3057\u307E\u305B\u3093\u3002 -CaseOpenAction.msgDlg.fileNotExist.title=\u30A8\u30E9\u30FC -CaseOpenAction.msgDlg.cantOpenCase.msg=\u30A8\u30E9\u30FC\uFF1A\u30D5\u30A9\u30EB\u30C0{0}\: {1}\u306E\u30B1\u30FC\u30B9\u3092\u958B\u3051\u307E\u305B\u3093\u3067\u3057\u305F -CaseOpenAction.msgDlg.cantOpenCase.title=\u30A8\u30E9\u30FC -CasePropertiesAction.window.title=\u30B1\u30FC\u30B9\u30D7\u30ED\u30D1\u30C6\u30A3 -CasePropertiesForm.updateCaseName.msgDlg.empty.msg=\u30B1\u30FC\u30B9\u540D\u306F\u7A7A\u767D\u3067\u306F\u3044\u3051\u307E\u305B\u3093\u3002 -CasePropertiesForm.updateCaseName.msgDlg.empty.title=\u30A8\u30E9\u30FC -CasePropertiesForm.updateCaseName.msgDlg.invalidSymbols.msg=\u30B1\u30FC\u30B9\u540D\u306B\u306F\u4E0B\u8A18\u306E\u8A18\u53F7\u3092\u542B\u3081\u307E\u305B\u3093\uFF1A\\ / \: * ? " < > | -CasePropertiesForm.updateCaseName.msgDlg.invalidSymbols.title=\u30A8\u30E9\u30FC -CasePropertiesForm.updateCaseName.confMsg.msg=\u30B1\u30FC\u30B9\u540D\u3092"{0}"\u304B\u3089"{1}"\u306B\u672C\u5F53\u306B\u30A2\u30C3\u30D7\u30C7\u30FC\u30C8\u3057\u307E\u3059\u304B\uFF1F -CasePropertiesForm.updateCaseName.confMsg.title=\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u4F5C\u6210 -CueBannerPanel.title.text=\u6700\u8FD1\u958B\u3044\u305F\u30B1\u30FC\u30B9\u3092\u958B\u304F -GeneralFilter.rawImageDesc.text=\u30ED\u30FC\u30A4\u30E1\u30FC\u30B8(*.img, *.dd, *.001, *.aa, *.raw, *.bin) -GeneralFilter.encaseImageDesc.text=\u30A8\u30F3\u30B1\u30FC\u30B9\u30A4\u30E1\u30FC\u30B8(*.e01) -ImageDSProcessor.dsType.text=\u30A4\u30E1\u30FC\u30B8\u30D5\u30A1\u30A4\u30EB -ImageDSProcessor.allDesc.text=\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u3066\u3044\u308B\u5168\u30BF\u30A4\u30D7 -ImageFilePanel.moduleErr=\u30E2\u30B8\u30E5\u30FC\u30EB\u30A8\u30E9\u30FC -ImageFilePanel.moduleErr.msg=ImageFilePanel\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 -LocalDiskDSProcessor.dsType.text=\u30ED\u30FC\u30AB\u30EB\u30C7\u30A3\u30B9\u30AF -LocalDiskPanel.localDiskModel.loading.msg=\u30ED\u30FC\u30AB\u30EB\u30C7\u30A3\u30B9\u30AF\u3092\u30ED\u30FC\u30C9\u4E2D\u2026 -LocalDiskPanel.moduleErr=\u30E2\u30B8\u30E5\u30FC\u30EB\u30A8\u30E9\u30FC -LocalDiskPanel.moduleErr.msg=LocalDiskPanel\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 -LocalDiskPanel.errLabel.disksNotDetected.text=\u30C7\u30A3\u30B9\u30AF\u304C\u691C\u51FA\u3055\u308C\u307E\u305B\u3093\u3067\u3057\u305F\u3002\u4E00\u90E8\u306E\u30B7\u30B9\u30C6\u30E0\u3067\u306F\u7BA1\u7406\u8005\u6A29\u9650\u304C\u5FC5\u8981\u3067\u3059\uFF08\u3082\u3057\u304F\u306F\u300C\u7BA1\u7406\u8005\u3068\u3057\u3066\u5B9F\u884C\u3059\u308B\u300D\u304C\u5FC5\u8981\uFF09\u3002 -LocalDiskPanel.errLabel.disksNotDetected.toolTipText=\u30C7\u30A3\u30B9\u30AF\u304C\u691C\u51FA\u3055\u308C\u307E\u305B\u3093\u3067\u3057\u305F\u3002\u4E00\u90E8\u306E\u30B7\u30B9\u30C6\u30E0\u3067\u306F\u7BA1\u7406\u8005\u6A29\u9650\u304C\u5FC5\u8981\u3067\u3059\uFF08\u3082\u3057\u304F\u306F\u300C\u7BA1\u7406\u8005\u3068\u3057\u3066\u5B9F\u884C\u3059\u308B\u300D\u304C\u5FC5\u8981\uFF09\u3002 -LocalDiskPanel.errLabel.drivesNotDetected.text=\u30ED\u30FC\u30AB\u30EB\u30C9\u30E9\u30A4\u30D6\u304C\u691C\u51FA\u3055\u308C\u307E\u305B\u3093\u3067\u3057\u305F\u3002\u81EA\u52D5\u691C\u51FA\u306F\u3053\u306EOS\u3067\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u3066\u3044\u306A\u3044\u304B\u3001\u7BA1\u7406\u8005\u6A29\u9650\u304C\u5FC5\u8981\u3067\u3059\u3002 -LocalDiskPanel.errLabel.drivesNotDetected.toolTipText=\u30ED\u30FC\u30AB\u30EB\u30C9\u30E9\u30A4\u30D6\u304C\u691C\u51FA\u3055\u308C\u307E\u305B\u3093\u3067\u3057\u305F\u3002\u81EA\u52D5\u691C\u51FA\u306F\u3053\u306EOS\u3067\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u3066\u3044\u306A\u3044\u304B\u3001\u7BA1\u7406\u8005\u6A29\u9650\u304C\u5FC5\u8981\u3067\u3059\u3002 -LocalDiskPanel.errLabel.someDisksNotDetected.text=\u4E00\u90E8\u306E\u30C7\u30A3\u30B9\u30AF\u304C\u691C\u51FA\u3055\u308C\u307E\u305B\u3093\u3067\u3057\u305F\u3002\u4E00\u90E8\u306E\u30B7\u30B9\u30C6\u30E0\u3067\u306F\u7BA1\u7406\u8005\u6A29\u9650\u304C\u5FC5\u8981\u3067\u3059\uFF08\u3082\u3057\u304F\u306F\u300C\u7BA1\u7406\u8005\u3068\u3057\u3066\u5B9F\u884C\u3059\u308B\u300D\uFF09\u3002 -LocalDiskPanel.errLabel.someDisksNotDetected.toolTipText=\u4E00\u90E8\u306E\u30C7\u30A3\u30B9\u30AF\u304C\u691C\u51FA\u3055\u308C\u307E\u305B\u3093\u3067\u3057\u305F\u3002\u4E00\u90E8\u306E\u30B7\u30B9\u30C6\u30E0\u3067\u306F\u7BA1\u7406\u8005\u6A29\u9650\u304C\u5FC5\u8981\u3067\u3059\uFF08\u3082\u3057\u304F\u306F\u300C\u7BA1\u7406\u8005\u3068\u3057\u3066\u5B9F\u884C\u3059\u308B\u300D\uFF09\u3002 -LocalFilesDSProcessor.dsType=\u30ED\u30B8\u30AB\u30EB\u30D5\u30A1\u30A4\u30EB -LocalFilesDSProcessor.toString.text=\u30ED\u30B8\u30AB\u30EB\u30D5\u30A1\u30A4\u30EB -LocalFilesPanel.contentType.text=\u30ED\u30FC\u30AB\u30EB -LocalFilesPanel.moduleErr=\u30E2\u30B8\u30E5\u30FC\u30EB\u30A8\u30E9\u30FC -LocalFilesPanel.moduleErr.msg=LocalFilesPanel\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 -MissingImageDialog.allDesc.text=\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u3066\u3044\u308B\u5168\u3066\u306E\u30BF\u30A4\u30D7 -MissingImageDialog.display.title=\u6B20\u843D\u30A4\u30E1\u30FC\u30B8\u3092\u691C\u7D22 -MissingImageDialog.confDlg.noFileSel.msg=\u30A4\u30E1\u30FC\u30B8\u30D5\u30A1\u30A4\u30EB\u304C\u9078\u629E\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002\u30A4\u30E1\u30FC\u30B8\u3092\u898B\u3064\u3051\u308B\ -\u524D\u306B\u672C\u5F53\u306B\u7D42\u4E86\u3057\u307E\u3059\u304B\uFF1F -MissingImageDialog.confDlg.noFileSel.title=\u6B20\u843D\u30A4\u30E1\u30FC\u30B8 -NewCaseVisualPanel1.getName.text=\u30B1\u30FC\u30B9\u60C5\u5831 -NewCaseVisualPanel1.caseDirBrowse.selectButton.text=\u9078\u629E -NewCaseVisualPanel2.getName.text=\u4ED8\u52A0\u60C5\u5831 -NewCaseWizardAction.closeCurCase.confMsg.msg=\u3053\u306E\u30B1\u30FC\u30B9\u3092\u4FDD\u5B58\u3057\u3001\u9589\u3058\u3066\u3001\u65B0\u898F\u30B1\u30FC\u30B9\u4F5C\u6210\u3092\u5B9F\u884C\u3057\u307E\u3059\u304B\uFF1F -NewCaseWizardAction.closeCurCase.confMsg.title=\u8B66\u544A\uFF1A\u73FE\u5728\u306E\u30B1\u30FC\u30B9\u3092\u9589\u3058\u307E\u3059 -NewCaseWizardAction.newCase.windowTitle.text=\u65B0\u898F\u30B1\u30FC\u30B9\u60C5\u5831 -NewCaseWizardAction.getName.text=\u65B0\u898F\u30B1\u30FC\u30B9\u30A6\u30A3\u30B6\u30FC\u30C9 -NewCaseWizardPanel1.validate.errMsg.invalidSymbols=\u30B1\u30FC\u30B9\u540D\u306B\u306F\u4E0B\u8A18\u306E\u8A18\u53F7\u3092\u542B\u3081\u307E\u305B\u3093\uFF1A\\ / \: * ? " < > | -NewCaseWizardPanel1.validate.errMsg.dirExists=\u30B1\u30FC\u30B9\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA''{0}''\u306F\u65E2\u306B\u5B58\u5728\u3057\u307E\u3059\u3002 -NewCaseWizardPanel1.validate.confMsg.createDir.msg=\u30D9\u30FC\u30B9\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA''{0}''\u306F\u5B58\u5728\u3057\u307E\u305B\u3093\u3002\ +\u30d5\u30a9\u30eb\u30c0\u307e\u305f\u306f\u30d5\u30a1\u30a4\u30eb\u3092\u9589\u3058\u3066\u304b\u3089\u518d\u5b9f\u884c\u3059\u308b\u304b\u3001\u624b\u52d5\u3067\u30b1\u30fc\u30b9\u3092\u524a\u9664\u3057\u3066\u4e0b\u3055\u3044\u3002 +CaseDeleteAction.msgDlg.fileInUse.title=\u30a8\u30e9\u30fc\uff1a\u30d5\u30a9\u30eb\u30c0\u304c\u4f7f\u7528\u4e2d +CaseDeleteAction.msgDlg.caseDelete.msg=\u30b1\u30fc\u30b9{0}\u306f\u524a\u9664\u3055\u308c\u307e\u3057\u305f\u3002 +CaseOpenAction.autFilter.title={0} \u30b1\u30fc\u30b9\u30d5\u30a1\u30a4\u30eb ( {1}) +CaseOpenAction.msgDlg.fileNotExist.msg=\u30a8\u30e9\u30fc\uff1a\u30d5\u30a1\u30a4\u30eb\u304c\u5b58\u5728\u3057\u307e\u305b\u3093\u3002 +CaseOpenAction.msgDlg.fileNotExist.title=\u30a8\u30e9\u30fc +CaseOpenAction.msgDlg.cantOpenCase.msg=\u30a8\u30e9\u30fc\uff1a\u30d5\u30a9\u30eb\u30c0{0}\: {1}\u306e\u30b1\u30fc\u30b9\u3092\u958b\u3051\u307e\u305b\u3093\u3067\u3057\u305f +CaseOpenAction.msgDlg.cantOpenCase.title=\u30a8\u30e9\u30fc +CasePropertiesAction.window.title=\u30b1\u30fc\u30b9\u30d7\u30ed\u30d1\u30c6\u30a3 +CasePropertiesForm.updateCaseName.msgDlg.empty.msg=\u30b1\u30fc\u30b9\u540d\u306f\u7a7a\u767d\u3067\u306f\u3044\u3051\u307e\u305b\u3093\u3002 +CasePropertiesForm.updateCaseName.msgDlg.empty.title=\u30a8\u30e9\u30fc +CasePropertiesForm.updateCaseName.msgDlg.invalidSymbols.msg=\u30b1\u30fc\u30b9\u540d\u306b\u306f\u4e0b\u8a18\u306e\u8a18\u53f7\u3092\u542b\u3081\u307e\u305b\u3093\uff1a\\ / \: * ? " < > | +CasePropertiesForm.updateCaseName.msgDlg.invalidSymbols.title=\u30a8\u30e9\u30fc +CasePropertiesForm.updateCaseName.confMsg.msg=\u30b1\u30fc\u30b9\u540d\u3092"{0}"\u304b\u3089"{1}"\u306b\u672c\u5f53\u306b\u30a2\u30c3\u30d7\u30c7\u30fc\u30c8\u3057\u307e\u3059\u304b\uff1f +CasePropertiesForm.updateCaseName.confMsg.title=\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u4f5c\u6210 +CueBannerPanel.title.text=\u6700\u8fd1\u958b\u3044\u305f\u30b1\u30fc\u30b9\u3092\u958b\u304f +GeneralFilter.rawImageDesc.text=\u30ed\u30fc\u30a4\u30e1\u30fc\u30b8(*.img, *.dd, *.001, *.aa, *.raw, *.bin) +GeneralFilter.encaseImageDesc.text=\u30a8\u30f3\u30b1\u30fc\u30b9\u30a4\u30e1\u30fc\u30b8(*.e01) +ImageDSProcessor.dsType.text=\u30a4\u30e1\u30fc\u30b8\u30d5\u30a1\u30a4\u30eb +ImageDSProcessor.allDesc.text=\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u308b\u5168\u30bf\u30a4\u30d7 +ImageFilePanel.moduleErr=\u30e2\u30b8\u30e5\u30fc\u30eb\u30a8\u30e9\u30fc +ImageFilePanel.moduleErr.msg=ImageFilePanel\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 +LocalDiskDSProcessor.dsType.text=\u30ed\u30fc\u30ab\u30eb\u30c7\u30a3\u30b9\u30af +LocalDiskPanel.localDiskModel.loading.msg=\u30ed\u30fc\u30ab\u30eb\u30c7\u30a3\u30b9\u30af\u3092\u30ed\u30fc\u30c9\u4e2d\u2026 +LocalDiskPanel.moduleErr=\u30e2\u30b8\u30e5\u30fc\u30eb\u30a8\u30e9\u30fc +LocalDiskPanel.moduleErr.msg=LocalDiskPanel\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 +LocalDiskPanel.errLabel.disksNotDetected.text=\u30c7\u30a3\u30b9\u30af\u304c\u691c\u51fa\u3055\u308c\u307e\u305b\u3093\u3067\u3057\u305f\u3002\u4e00\u90e8\u306e\u30b7\u30b9\u30c6\u30e0\u3067\u306f\u7ba1\u7406\u8005\u6a29\u9650\u304c\u5fc5\u8981\u3067\u3059\uff08\u3082\u3057\u304f\u306f\u300c\u7ba1\u7406\u8005\u3068\u3057\u3066\u5b9f\u884c\u3059\u308b\u300d\u304c\u5fc5\u8981\uff09\u3002 +LocalDiskPanel.errLabel.disksNotDetected.toolTipText=\u30c7\u30a3\u30b9\u30af\u304c\u691c\u51fa\u3055\u308c\u307e\u305b\u3093\u3067\u3057\u305f\u3002\u4e00\u90e8\u306e\u30b7\u30b9\u30c6\u30e0\u3067\u306f\u7ba1\u7406\u8005\u6a29\u9650\u304c\u5fc5\u8981\u3067\u3059\uff08\u3082\u3057\u304f\u306f\u300c\u7ba1\u7406\u8005\u3068\u3057\u3066\u5b9f\u884c\u3059\u308b\u300d\u304c\u5fc5\u8981\uff09\u3002 +LocalDiskPanel.errLabel.drivesNotDetected.text=\u30ed\u30fc\u30ab\u30eb\u30c9\u30e9\u30a4\u30d6\u304c\u691c\u51fa\u3055\u308c\u307e\u305b\u3093\u3067\u3057\u305f\u3002\u81ea\u52d5\u691c\u51fa\u306f\u3053\u306eOS\u3067\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u306a\u3044\u304b\u3001\u7ba1\u7406\u8005\u6a29\u9650\u304c\u5fc5\u8981\u3067\u3059\u3002 +LocalDiskPanel.errLabel.drivesNotDetected.toolTipText=\u30ed\u30fc\u30ab\u30eb\u30c9\u30e9\u30a4\u30d6\u304c\u691c\u51fa\u3055\u308c\u307e\u305b\u3093\u3067\u3057\u305f\u3002\u81ea\u52d5\u691c\u51fa\u306f\u3053\u306eOS\u3067\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u306a\u3044\u304b\u3001\u7ba1\u7406\u8005\u6a29\u9650\u304c\u5fc5\u8981\u3067\u3059\u3002 +LocalDiskPanel.errLabel.someDisksNotDetected.text=\u4e00\u90e8\u306e\u30c7\u30a3\u30b9\u30af\u304c\u691c\u51fa\u3055\u308c\u307e\u305b\u3093\u3067\u3057\u305f\u3002\u4e00\u90e8\u306e\u30b7\u30b9\u30c6\u30e0\u3067\u306f\u7ba1\u7406\u8005\u6a29\u9650\u304c\u5fc5\u8981\u3067\u3059\uff08\u3082\u3057\u304f\u306f\u300c\u7ba1\u7406\u8005\u3068\u3057\u3066\u5b9f\u884c\u3059\u308b\u300d\uff09\u3002 +LocalDiskPanel.errLabel.someDisksNotDetected.toolTipText=\u4e00\u90e8\u306e\u30c7\u30a3\u30b9\u30af\u304c\u691c\u51fa\u3055\u308c\u307e\u305b\u3093\u3067\u3057\u305f\u3002\u4e00\u90e8\u306e\u30b7\u30b9\u30c6\u30e0\u3067\u306f\u7ba1\u7406\u8005\u6a29\u9650\u304c\u5fc5\u8981\u3067\u3059\uff08\u3082\u3057\u304f\u306f\u300c\u7ba1\u7406\u8005\u3068\u3057\u3066\u5b9f\u884c\u3059\u308b\u300d\uff09\u3002 +LocalFilesDSProcessor.dsType=\u30ed\u30b8\u30ab\u30eb\u30d5\u30a1\u30a4\u30eb +LocalFilesDSProcessor.toString.text=\u30ed\u30b8\u30ab\u30eb\u30d5\u30a1\u30a4\u30eb +LocalFilesPanel.contentType.text=\u30ed\u30fc\u30ab\u30eb +LocalFilesPanel.moduleErr=\u30e2\u30b8\u30e5\u30fc\u30eb\u30a8\u30e9\u30fc +LocalFilesPanel.moduleErr.msg=LocalFilesPanel\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 +MissingImageDialog.allDesc.text=\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u308b\u5168\u3066\u306e\u30bf\u30a4\u30d7 +MissingImageDialog.display.title=\u6b20\u843d\u30a4\u30e1\u30fc\u30b8\u3092\u691c\u7d22 +MissingImageDialog.confDlg.noFileSel.msg=\u30a4\u30e1\u30fc\u30b8\u30d5\u30a1\u30a4\u30eb\u304c\u9078\u629e\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002\u30a4\u30e1\u30fc\u30b8\u3092\u898b\u3064\u3051\u308b\ +\u524d\u306b\u672c\u5f53\u306b\u7d42\u4e86\u3057\u307e\u3059\u304b\uff1f +MissingImageDialog.confDlg.noFileSel.title=\u6b20\u843d\u30a4\u30e1\u30fc\u30b8 +NewCaseVisualPanel1.getName.text=\u30b1\u30fc\u30b9\u60c5\u5831 +NewCaseVisualPanel1.caseDirBrowse.selectButton.text=\u9078\u629e +NewCaseVisualPanel2.getName.text=\u4ed8\u52a0\u60c5\u5831 +NewCaseWizardAction.closeCurCase.confMsg.msg=\u3053\u306e\u30b1\u30fc\u30b9\u3092\u4fdd\u5b58\u3057\u3001\u9589\u3058\u3066\u3001\u65b0\u898f\u30b1\u30fc\u30b9\u4f5c\u6210\u3092\u5b9f\u884c\u3057\u307e\u3059\u304b\uff1f +NewCaseWizardAction.closeCurCase.confMsg.title=\u8b66\u544a\uff1a\u73fe\u5728\u306e\u30b1\u30fc\u30b9\u3092\u9589\u3058\u307e\u3059 +NewCaseWizardAction.newCase.windowTitle.text=\u65b0\u898f\u30b1\u30fc\u30b9\u60c5\u5831 +NewCaseWizardAction.getName.text=\u65b0\u898f\u30b1\u30fc\u30b9\u30a6\u30a3\u30b6\u30fc\u30c9 +NewCaseWizardPanel1.validate.errMsg.invalidSymbols=\u30b1\u30fc\u30b9\u540d\u306b\u306f\u4e0b\u8a18\u306e\u8a18\u53f7\u3092\u542b\u3081\u307e\u305b\u3093\uff1a\\ / \: * ? " < > | +NewCaseWizardPanel1.validate.errMsg.dirExists=\u30b1\u30fc\u30b9\u30c7\u30a3\u30ec\u30af\u30c8\u30ea''{0}''\u306f\u65e2\u306b\u5b58\u5728\u3057\u307e\u3059\u3002 +NewCaseWizardPanel1.validate.confMsg.createDir.msg=\u30d9\u30fc\u30b9\u30c7\u30a3\u30ec\u30af\u30c8\u30ea''{0}''\u306f\u5b58\u5728\u3057\u307e\u305b\u3093\u3002\ \ -\u3053\u306E\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u3092\u4F5C\u6210\u3057\u307E\u3059\u304B\uFF1F -NewCaseWizardPanel1.validate.confMsg.createDir.title=\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u4F5C\u6210 -NewCaseWizardPanel1.validate.errMsg.cantCreateParDir.msg=\u30A8\u30E9\u30FC\uFF1A\u30B1\u30FC\u30B9\u30DA\u30A2\u30EC\u30F3\u30C8\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA{0}\u3092\u4F5C\u6210\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F -NewCaseWizardPanel1.validate.errMsg.prevCreateBaseDir.msg=\u30D9\u30FC\u30B9\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA{0}\u306E\u4F5C\u6210\u3092\u9632\u6B62\u3055\u308C\u307E\u3057\u305F -NewCaseWizardPanel1.validate.errMsg.cantCreateDir=\u30A8\u30E9\u30FC\uFF1A\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u3092\u4F5C\u6210\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002 -NewCaseWizardPanel1.validate.errMsg.invalidBaseDir.msg=\u30A8\u30E9\u30FC\uFF1A\u5165\u529B\u3057\u305F\u30D9\u30FC\u30B9\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u306F\u6709\u52B9\u3067\u306F\u3042\u308A\u307E\u305B\u3093\u3002\ -\u6709\u52B9\u306A\u30D9\u30FC\u30B9\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u3092\u5165\u529B\u3057\u3066\u4E0B\u3055\u3044\u3002 -NewCaseWizardPanel1.createDir.errMsg.cantCreateDir.msg=\u30A8\u30E9\u30FC\uFF1A\u30B1\u30FC\u30B9\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u3092\u4F5C\u6210\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002\ -\u6709\u52B9\u306A\u30B1\u30FC\u30B9\u540D\u304A\u3088\u3073\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u3092\u5165\u529B\u3057\u3066\u4E0B\u3055\u3044\u3002 -NewCaseWizardPanel2.validate.errCreateCase.msg=\u30B1\u30FC\u30B9\u4F5C\u6210\u30A8\u30E9\u30FC -OpenRecentCasePanel.openCase.msgDlg.caseDoesntExist.msg=\u30A8\u30E9\u30FC\uFF1A\u30B1\u30FC\u30B9{0}\u306F\u5B58\u5728\u3057\u307E\u305B\u3093\u3002 -OpenRecentCasePanel.openCase.msgDlg.err=\u30A8\u30E9\u30FC -OpenRecentCasePanel.colName.caseName=\u30B1\u30FC\u30B9\u540D -OpenRecentCasePanel.colName.path=\u30D1\u30B9 -RecentCases.exception.caseIdxOutOfRange.msg=\u6700\u8FD1\u306E\u30B1\u30FC\u30B9\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9{0}\u306F\u7BC4\u56F2\u5916\u3067\u3059\u3002 -RecentCases.getName.text=\u6700\u8FD1\u958B\u3044\u305F\u30B1\u30FC\u30B9\u3092\u30AF\u30EA\u30A2 -RecentItems.openRecentCase.msgDlg.text=\u30A8\u30E9\u30FC\uFF1A\u30B1\u30FC\u30B9{0}\u306F\u5B58\u5728\u3057\u307E\u305B\u3093\u3002 -RecentItems.openRecentCase.msgDlg.err=\u30A8\u30E9\u30FC -StartupWindow.title.text=\u3088\u3046\u3053\u305D -UpdateRecentCases.menuItem.clearRecentCases.text=\u6700\u8FD1\u958B\u3044\u305F\u30B1\u30FC\u30B9\u3092\u30AF\u30EA\u30A2 -UpdateRecentCases.menuItem.empty=-\u7A7A\u767D- -XMLCaseManagement.create.exception.msg=\u30B1\u30FC\u30B9XML\u30D5\u30A1\u30A4\u30EB\u306E\u8A2D\u5B9A\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3001 -XMLCaseManagement.writeFile.exception.noCase.msg=\u30DE\u30CD\u30B8\u30E1\u30F3\u30C8\u30D5\u30A1\u30A4\u30EB\u3092\u66F8\u304F\u5FC5\u8981\u304C\u3042\u308B\u30B1\u30FC\u30B9\u304C\u3042\u308A\u307E\u305B\u3093\u3002 -XMLCaseManagement.writeFile.exception.errWriteToFile.msg=\u30B1\u30FC\u30B9\u30D5\u30A1\u30A4\u30EB\u3078\u306E\u66F8\u304D\u8FBC\u307F\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F -XMLCaseManagement.open.exception.errReadXMLFile.msg=\u30B1\u30FC\u30B9XML\u30D5\u30A1\u30A4\u30EB\u306E\u8AAD\u307F\u53D6\u308A\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\uFF1A{0} -XMLCaseManagement.open.msgDlg.notAutCase.msg=\u30A8\u30E9\u30FC\uFF1AAutopsy\u8A2D\u5B9A\u30D5\u30A1\u30A4\u30EB("{0}")\u3067\u306F\u3042\u308A\u307E\u305B\u3093\u3002\ +\u3053\u306e\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u3092\u4f5c\u6210\u3057\u307e\u3059\u304b\uff1f +NewCaseWizardPanel1.validate.confMsg.createDir.title=\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u4f5c\u6210 +NewCaseWizardPanel1.validate.errMsg.cantCreateParDir.msg=\u30a8\u30e9\u30fc\uff1a\u30b1\u30fc\u30b9\u30da\u30a2\u30ec\u30f3\u30c8\u30c7\u30a3\u30ec\u30af\u30c8\u30ea{0}\u3092\u4f5c\u6210\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f +NewCaseWizardPanel1.validate.errMsg.prevCreateBaseDir.msg=\u30d9\u30fc\u30b9\u30c7\u30a3\u30ec\u30af\u30c8\u30ea{0}\u306e\u4f5c\u6210\u3092\u9632\u6b62\u3055\u308c\u307e\u3057\u305f +NewCaseWizardPanel1.validate.errMsg.cantCreateDir=\u30a8\u30e9\u30fc\uff1a\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u3092\u4f5c\u6210\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 +NewCaseWizardPanel1.validate.errMsg.invalidBaseDir.msg=\u30a8\u30e9\u30fc\uff1a\u5165\u529b\u3057\u305f\u30d9\u30fc\u30b9\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306f\u6709\u52b9\u3067\u306f\u3042\u308a\u307e\u305b\u3093\u3002\ +\u6709\u52b9\u306a\u30d9\u30fc\u30b9\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u3092\u5165\u529b\u3057\u3066\u4e0b\u3055\u3044\u3002 +NewCaseWizardPanel1.createDir.errMsg.cantCreateDir.msg=\u30a8\u30e9\u30fc\uff1a\u30b1\u30fc\u30b9\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u3092\u4f5c\u6210\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002\ +\u6709\u52b9\u306a\u30b1\u30fc\u30b9\u540d\u304a\u3088\u3073\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u3092\u5165\u529b\u3057\u3066\u4e0b\u3055\u3044\u3002 +NewCaseWizardPanel2.validate.errCreateCase.msg=\u30b1\u30fc\u30b9\u4f5c\u6210\u30a8\u30e9\u30fc +OpenRecentCasePanel.openCase.msgDlg.caseDoesntExist.msg=\u30a8\u30e9\u30fc\uff1a\u30b1\u30fc\u30b9{0}\u306f\u5b58\u5728\u3057\u307e\u305b\u3093\u3002 +OpenRecentCasePanel.openCase.msgDlg.err=\u30a8\u30e9\u30fc +OpenRecentCasePanel.colName.caseName=\u30b1\u30fc\u30b9\u540d +OpenRecentCasePanel.colName.path=\u30d1\u30b9 +RecentCases.exception.caseIdxOutOfRange.msg=\u6700\u8fd1\u306e\u30b1\u30fc\u30b9\u30a4\u30f3\u30c7\u30c3\u30af\u30b9{0}\u306f\u7bc4\u56f2\u5916\u3067\u3059\u3002 +RecentCases.getName.text=\u6700\u8fd1\u958b\u3044\u305f\u30b1\u30fc\u30b9\u3092\u30af\u30ea\u30a2 +RecentItems.openRecentCase.msgDlg.text=\u30a8\u30e9\u30fc\uff1a\u30b1\u30fc\u30b9{0}\u306f\u5b58\u5728\u3057\u307e\u305b\u3093\u3002 +RecentItems.openRecentCase.msgDlg.err=\u30a8\u30e9\u30fc +StartupWindow.title.text=\u3088\u3046\u3053\u305d +UpdateRecentCases.menuItem.clearRecentCases.text=\u6700\u8fd1\u958b\u3044\u305f\u30b1\u30fc\u30b9\u3092\u30af\u30ea\u30a2 +UpdateRecentCases.menuItem.empty=-\u7a7a\u767d- +XMLCaseManagement.create.exception.msg=\u30b1\u30fc\u30b9XML\u30d5\u30a1\u30a4\u30eb\u306e\u8a2d\u5b9a\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3001 +XMLCaseManagement.writeFile.exception.noCase.msg=\u30de\u30cd\u30b8\u30e1\u30f3\u30c8\u30d5\u30a1\u30a4\u30eb\u3092\u66f8\u304f\u5fc5\u8981\u304c\u3042\u308b\u30b1\u30fc\u30b9\u304c\u3042\u308a\u307e\u305b\u3093\u3002 +XMLCaseManagement.writeFile.exception.errWriteToFile.msg=\u30b1\u30fc\u30b9\u30d5\u30a1\u30a4\u30eb\u3078\u306e\u66f8\u304d\u8fbc\u307f\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f +XMLCaseManagement.open.exception.errReadXMLFile.msg=\u30b1\u30fc\u30b9XML\u30d5\u30a1\u30a4\u30eb\u306e\u8aad\u307f\u53d6\u308a\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\uff1a{0} +XMLCaseManagement.open.msgDlg.notAutCase.msg=\u30a8\u30e9\u30fc\uff1aAutopsy\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb("{0}")\u3067\u306f\u3042\u308a\u307e\u305b\u3093\u3002\ \ -\u8A73\u7D30\uFF1A\ -Autopsy\u8A2D\u5B9A\u30D5\u30A1\u30A4\u30EB\u4EE5\u5916(at {1})\u306F\u958B\u3051\u307E\u305B\u3093\u3002 -XMLCaseManagement.open.msgDlg.notAutCase.title=\u30A8\u30E9\u30FC -ImageFilePanel.noFatOrphansCheckbox.text=FAT\u30D5\u30A1\u30A4\u30EB\u30B7\u30B9\u30C6\u30E0\u306E\u30AA\u30FC\u30D5\u30A1\u30F3\u30D5\u30A1\u30A4\u30EB\u306F\u7121\u8996 -LocalDiskPanel.noFatOrphansCheckbox.text=FAT\u30D5\u30A1\u30A4\u30EB\u30B7\u30B9\u30C6\u30E0\u306E\u30AA\u30FC\u30D5\u30A1\u30F3\u30D5\u30A1\u30A4\u30EB\u306F\u7121\u8996 -AddImageWizardIngestConfigPanel.CANCEL_BUTTON.text=\u30AD\u30E3\u30F3\u30BB\u30EB +\u8a73\u7d30\uff1a\ +Autopsy\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u4ee5\u5916(at {1})\u306f\u958b\u3051\u307e\u305b\u3093\u3002 +XMLCaseManagement.open.msgDlg.notAutCase.title=\u30a8\u30e9\u30fc +ImageFilePanel.noFatOrphansCheckbox.text=FAT\u30d5\u30a1\u30a4\u30eb\u30b7\u30b9\u30c6\u30e0\u306e\u30aa\u30fc\u30d5\u30a1\u30f3\u30d5\u30a1\u30a4\u30eb\u306f\u7121\u8996 +LocalDiskPanel.noFatOrphansCheckbox.text=FAT\u30d5\u30a1\u30a4\u30eb\u30b7\u30b9\u30c6\u30e0\u306e\u30aa\u30fc\u30d5\u30a1\u30f3\u30d5\u30a1\u30a4\u30eb\u306f\u7121\u8996 +AddImageWizardIngestConfigPanel.CANCEL_BUTTON.text=\u30ad\u30e3\u30f3\u30bb\u30eb diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/CaseCloseAction.java b/Core/src/org/sleuthkit/autopsy/casemodule/CaseCloseAction.java index e19666d209..900a355bf0 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/CaseCloseAction.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/CaseCloseAction.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"); @@ -23,7 +23,16 @@ import java.awt.Component; import java.awt.EventQueue; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import java.util.logging.Level;; +import java.util.logging.Level;import org.sleuthkit.autopsy.coreutils.Logger; +import javax.swing.Action; +import javax.swing.ImageIcon; +import javax.swing.JButton; +import org.openide.util.HelpCtx; +import org.openide.util.NbBundle; +import org.openide.util.actions.CallableSystemAction; +import org.openide.util.actions.Presenter; +; +import org.sleuthkit.autopsy.coreutils.Logger; import javax.swing.Action; import javax.swing.ImageIcon; import javax.swing.JButton; @@ -40,7 +49,6 @@ import org.openide.util.NbBundle; import org.openide.util.actions.CallableSystemAction; import org.openide.util.actions.Presenter; - /** * The action to close the current Case. This class should be disabled on * creation and it will be enabled on new case creation or case opened. @@ -75,8 +83,6 @@ import org.openide.util.actions.Presenter; */ @Override public void actionPerformed(ActionEvent e) { - Logger.noteAction(this.getClass()); - if (Case.existsCurrentCase() == false) return; diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/CaseDeleteAction.java b/Core/src/org/sleuthkit/autopsy/casemodule/CaseDeleteAction.java index 4b7291971d..cff30efed0 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/CaseDeleteAction.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/CaseDeleteAction.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"); @@ -21,7 +21,7 @@ package org.sleuthkit.autopsy.casemodule; import java.awt.event.ActionEvent; import java.io.File; -import java.util.logging.Level;; +import java.util.logging.Level;import org.sleuthkit.autopsy.coreutils.Logger; import javax.swing.Action; import javax.swing.JOptionPane; import javax.swing.JPanel; @@ -31,6 +31,7 @@ import org.openide.NotifyDescriptor; import org.openide.util.HelpCtx; import org.openide.util.NbBundle; import org.openide.util.actions.CallableSystemAction; +; import org.sleuthkit.autopsy.coreutils.Logger; import javax.swing.Action; import javax.swing.JOptionPane; @@ -38,16 +39,6 @@ import javax.swing.JPanel; import org.openide.DialogDescriptor; import org.openide.DialogDisplayer; import org.openide.NotifyDescriptor; -import org.openide.util.Exceptions; -import org.openide.util.HelpCtx; -import org.openide.util.NbBundle; -import org.openide.util.actions.CallableSystemAction; -import javax.swing.Action; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import org.openide.DialogDescriptor; -import org.openide.DialogDisplayer; -import org.openide.NotifyDescriptor; import org.openide.util.HelpCtx; import org.openide.util.NbBundle; import org.openide.util.actions.CallableSystemAction; @@ -86,8 +77,6 @@ import org.openide.util.actions.CallableSystemAction; */ @Override public void actionPerformed(ActionEvent e) { - Logger.noteAction(this.getClass()); - Case currentCase = Case.getCurrentCase(); File configFile = new File(currentCase.getConfigFilePath()); File caseFolder = new File(configFile.getParent()); diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/CaseNewAction.java b/Core/src/org/sleuthkit/autopsy/casemodule/CaseNewAction.java index 066cd10149..3be5ec7c57 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/CaseNewAction.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/CaseNewAction.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"); @@ -20,10 +20,8 @@ package org.sleuthkit.autopsy.casemodule; import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; import org.openide.util.actions.SystemAction; import org.openide.util.lookup.ServiceProvider; -import org.sleuthkit.autopsy.coreutils.Logger; /** * The action to create a new case. This action class is always enabled. @@ -41,8 +39,6 @@ public final class CaseNewAction implements CaseNewActionInterface { */ @Override public void actionPerformed(ActionEvent e) { - Logger.noteAction(this.getClass()); - wizard.performAction(); } } diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/CaseOpenAction.java b/Core/src/org/sleuthkit/autopsy/casemodule/CaseOpenAction.java index 5944613d54..8bf7392026 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/CaseOpenAction.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/CaseOpenAction.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"); @@ -27,7 +27,6 @@ import javax.swing.JFileChooser; import javax.swing.JOptionPane; import javax.swing.filechooser.FileFilter; import javax.swing.filechooser.FileNameExtensionFilter; - import org.openide.util.NbBundle; import org.openide.util.lookup.ServiceProvider; import org.sleuthkit.autopsy.coreutils.ModuleSettings; @@ -72,9 +71,6 @@ public final class CaseOpenAction implements ActionListener { */ @Override public void actionPerformed(ActionEvent e) { - Logger.noteAction(this.getClass()); - - int retval = fc.showOpenDialog((Component) e.getSource()); if (retval == JFileChooser.APPROVE_OPTION) { diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesAction.java b/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesAction.java index 5ef4c42347..a6a9e4f645 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesAction.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesAction.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"); @@ -58,8 +58,6 @@ import org.sleuthkit.autopsy.coreutils.Logger; */ @Override public void performAction() { - Logger.noteAction(this.getClass()); - try { // create the popUp window for it String title = NbBundle.getMessage(this.getClass(), "CasePropertiesAction.window.title"); diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardAction.java b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardAction.java index 6fded53a73..6008a0e5be 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardAction.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardAction.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"); @@ -21,7 +21,6 @@ package org.sleuthkit.autopsy.casemodule; import java.awt.Component; import java.awt.Dialog; -import java.awt.event.ActionListener; import java.io.File; import java.text.MessageFormat; import java.util.logging.Level; @@ -47,9 +46,6 @@ import org.sleuthkit.autopsy.coreutils.Logger; @Override public void performAction() { - Logger.noteAction(this.getClass()); - - // there's a case open if (Case.existsCurrentCase()) { // show the confirmation first to close the current case and open the "New Case" wizard panel diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/RecentCases.java b/Core/src/org/sleuthkit/autopsy/casemodule/RecentCases.java index 843950d56b..641d7d75eb 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/RecentCases.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/RecentCases.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"); @@ -35,7 +35,6 @@ import org.openide.util.NbBundle; import org.openide.util.actions.CallableSystemAction; import org.openide.util.actions.Presenter; import org.openide.filesystems.FileUtil; -import org.openide.util.Exceptions; import org.sleuthkit.autopsy.coreutils.ModuleSettings; import org.sleuthkit.autopsy.coreutils.Logger; @@ -253,8 +252,6 @@ import org.sleuthkit.autopsy.coreutils.Logger; */ @Override public void actionPerformed(ActionEvent e) { - Logger.noteAction(this.getClass()); - UpdateRecentCases.hasRecentCase = false; recentCases.clear(); diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/RecentItems.java b/Core/src/org/sleuthkit/autopsy/casemodule/RecentItems.java index 59cb40f9fd..f27facd68a 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/RecentItems.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/RecentItems.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"); @@ -26,7 +26,6 @@ import java.io.File; import java.util.logging.Level; import javax.swing.JOptionPane; import javax.swing.JPanel; - import org.openide.util.NbBundle; import org.sleuthkit.autopsy.coreutils.Logger; @@ -53,8 +52,6 @@ class RecentItems implements ActionListener { */ @Override public void actionPerformed(ActionEvent e) { - Logger.noteAction(this.getClass()); - // check if the file exists if(caseName.equals("") || casePath.equals("") || (!new File(casePath).exists())){ // throw an error here diff --git a/Core/src/org/sleuthkit/autopsy/core/UserPreferences.java b/Core/src/org/sleuthkit/autopsy/core/UserPreferences.java new file mode 100755 index 0000000000..aee3bc5217 --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/core/UserPreferences.java @@ -0,0 +1,89 @@ +/* + * Autopsy Forensic Browser + * + * Copyright 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.core; + +import java.util.prefs.PreferenceChangeListener; +import java.util.prefs.Preferences; +import org.openide.util.NbPreferences; + +/** + * Provides convenient access to a Preferences node for user preferences with + * default values. + */ +public final class UserPreferences { + + private static final Preferences preferences = NbPreferences.forModule(UserPreferences.class); + public static final String KEEP_PREFERRED_VIEWER = "KeepPreferredViewer"; // NON-NLS + public static final String HIDE_KNOWN_FILES_IN_DATA_SOURCES_TREE = "HideKnownFilesInDataSourcesTree"; //NON-NLS + public static final String HIDE_KNOWN_FILES_IN_VIEWS_TREE = "HideKnownFilesInViewsTree"; //NON-NLS + public static final String DISPLAY_TIMES_IN_LOCAL_TIME = "DisplayTimesInLocalTime"; //NON-NLS + public static final String NUMBER_OF_FILE_INGEST_THREADS = "NumberOfFileIngestThreads"; //NON-NLS + + // Prevent instantiation. + private UserPreferences() { + } + + public static void addChangeListener(PreferenceChangeListener listener) { + preferences.addPreferenceChangeListener(listener); + } + + public static void removeChangeListener(PreferenceChangeListener listener) { + preferences.removePreferenceChangeListener(listener); + } + + public static boolean keepPreferredContentViewer() { + return preferences.getBoolean(KEEP_PREFERRED_VIEWER, false); + } + + public static void setKeepPreferredContentViewer(boolean value) { + preferences.putBoolean(KEEP_PREFERRED_VIEWER, value); + } + + public static boolean hideKnownFilesInDataSourcesTree() { + return preferences.getBoolean(HIDE_KNOWN_FILES_IN_DATA_SOURCES_TREE, false); + } + + public static void setHideKnownFilesInDataSourcesTree(boolean value) { + preferences.putBoolean(HIDE_KNOWN_FILES_IN_DATA_SOURCES_TREE, value); + } + + public static boolean hideKnownFilesInViewsTree() { + return preferences.getBoolean(HIDE_KNOWN_FILES_IN_VIEWS_TREE, true); + } + + public static void setHideKnownFilesInViewsTree(boolean value) { + preferences.putBoolean(HIDE_KNOWN_FILES_IN_VIEWS_TREE, value); + } + + public static boolean displayTimesInLocalTime() { + return preferences.getBoolean(DISPLAY_TIMES_IN_LOCAL_TIME, true); + } + + public static void setDisplayTimesInLocalTime(boolean value) { + preferences.putBoolean(DISPLAY_TIMES_IN_LOCAL_TIME, value); + } + + public static int numberOfFileIngestThreads() { + return preferences.getInt(NUMBER_OF_FILE_INGEST_THREADS, 2); + } + + public static void setNumberOfFileIngestThreads(int value) { + preferences.putInt(NUMBER_OF_FILE_INGEST_THREADS, value); + } +} diff --git a/Core/src/org/sleuthkit/autopsy/core/layer.xml b/Core/src/org/sleuthkit/autopsy/core/layer.xml index 0a0d481991..60d4183118 100644 --- a/Core/src/org/sleuthkit/autopsy/core/layer.xml +++ b/Core/src/org/sleuthkit/autopsy/core/layer.xml @@ -18,6 +18,13 @@ + + + + + + + @@ -123,16 +130,6 @@ - - - - - - - - - - @@ -264,10 +261,6 @@ - - - - diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/AboutWindowAction.java b/Core/src/org/sleuthkit/autopsy/corecomponents/AboutWindowAction.java index 1ecea43720..1bd6a742ac 100644 --- a/Core/src/org/sleuthkit/autopsy/corecomponents/AboutWindowAction.java +++ b/Core/src/org/sleuthkit/autopsy/corecomponents/AboutWindowAction.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"); @@ -23,17 +23,20 @@ import org.openide.util.NbBundle; import org.netbeans.core.actions.AboutAction; import org.openide.DialogDescriptor; import org.openide.DialogDisplayer; -import org.sleuthkit.autopsy.coreutils.Logger; +import org.openide.awt.ActionID; +import org.openide.awt.ActionReference; +import org.openide.awt.ActionRegistration; /** * Action to open custom implementation of the "About" window from the Help menu. */ - class AboutWindowAction extends AboutAction { +@ActionID(id = "org.sleuthkit.autopsy.corecomponents.AboutWindowAction", category = "Help") +@ActionRegistration(displayName = "#CTL_CustomAboutAction", iconInMenu = true) +@ActionReference(path = "Menu/Help", name = "org-sleuthkit-autopsy-corecomponents-CustomAboutAction", position = 3000) +public class AboutWindowAction extends AboutAction { @Override public void performAction() { - Logger.noteAction(this.getClass()); - AboutWindowPanel pip = new AboutWindowPanel(); DialogDescriptor descriptor = new DialogDescriptor( pip, diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/GeneralPanel.form b/Core/src/org/sleuthkit/autopsy/corecomponents/AutopsyOptionsPanel.form similarity index 72% rename from Core/src/org/sleuthkit/autopsy/corecomponents/GeneralPanel.form rename to Core/src/org/sleuthkit/autopsy/corecomponents/AutopsyOptionsPanel.form index 2c0bbd1ee6..30d3020d10 100644 --- a/Core/src/org/sleuthkit/autopsy/corecomponents/GeneralPanel.form +++ b/Core/src/org/sleuthkit/autopsy/corecomponents/AutopsyOptionsPanel.form @@ -25,6 +25,22 @@ + + + + + + + + + + + + + + + + @@ -35,27 +51,11 @@ + + - - - - - - - - - - - - - - - - - -
@@ -83,7 +83,10 @@ - + + + + @@ -96,15 +99,12 @@ - + - + - - - @@ -112,24 +112,24 @@ - + - + - + - + @@ -140,7 +140,7 @@ - + @@ -150,38 +150,35 @@ - + - - - - + - + - + - + @@ -195,5 +192,15 @@ + + + + + + + + + + diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/GeneralPanel.java b/Core/src/org/sleuthkit/autopsy/corecomponents/AutopsyOptionsPanel.java similarity index 59% rename from Core/src/org/sleuthkit/autopsy/corecomponents/GeneralPanel.java rename to Core/src/org/sleuthkit/autopsy/corecomponents/AutopsyOptionsPanel.java index d34a49b16a..a8393e42bf 100644 --- a/Core/src/org/sleuthkit/autopsy/corecomponents/GeneralPanel.java +++ b/Core/src/org/sleuthkit/autopsy/corecomponents/AutopsyOptionsPanel.java @@ -18,45 +18,38 @@ */ package org.sleuthkit.autopsy.corecomponents; -import java.util.prefs.Preferences; import javax.swing.DefaultComboBoxModel; -import org.openide.util.NbPreferences; -import org.sleuthkit.autopsy.datamodel.ContentUtils; -import org.sleuthkit.autopsy.ingest.IngestManager; +import org.sleuthkit.autopsy.core.UserPreferences; -final class GeneralPanel extends javax.swing.JPanel { +/** + * Options panel that allow users to set application preferences. + */ +final class AutopsyOptionsPanel extends javax.swing.JPanel { - private static final String KEEP_PREFERRED_VIEWER = "keepPreferredViewer"; //NON-NLS - private static final String USE_LOCAL_TIME = "useLocalTime"; //NON-NLS - 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 final Preferences prefs = NbPreferences.forModule(this.getClass()); - - GeneralPanel(GeneralOptionsPanelController controller) { + AutopsyOptionsPanel(AutopsyOptionsPanelController controller) { initComponents(); numberOfFileIngestThreadsComboBox.setModel(new DefaultComboBoxModel<>(new Integer[]{1, 2, 4, 8, 16})); - ContentUtils.setDisplayInLocalTime(useLocalTimeRB.isSelected()); // TODO listen to changes in form fields and call controller.changed() } void load() { - boolean keepPreferredViewer = prefs.getBoolean(KEEP_PREFERRED_VIEWER, false); + boolean keepPreferredViewer = UserPreferences.keepPreferredContentViewer(); keepCurrentViewerRB.setSelected(keepPreferredViewer); useBestViewerRB.setSelected(!keepPreferredViewer); - boolean useLocalTime = prefs.getBoolean(USE_LOCAL_TIME, true); + dataSourcesHideKnownCB.setSelected(UserPreferences.hideKnownFilesInDataSourcesTree()); + viewsHideKnownCB.setSelected(UserPreferences.hideKnownFilesInViewsTree()); + boolean useLocalTime = UserPreferences.displayTimesInLocalTime(); useLocalTimeRB.setSelected(useLocalTime); useGMTTimeRB.setSelected(!useLocalTime); - dataSourcesHideKnownCB.setSelected(prefs.getBoolean(DS_HIDE_KNOWN, false)); - viewsHideKnownCB.setSelected(prefs.getBoolean(VIEWS_HIDE_KNOWN, true)); - numberOfFileIngestThreadsComboBox.setSelectedItem(IngestManager.getNumberOfFileIngestThreads()); + numberOfFileIngestThreadsComboBox.setSelectedItem(UserPreferences.numberOfFileIngestThreads()); } void store() { - prefs.putBoolean(KEEP_PREFERRED_VIEWER, keepCurrentViewerRB.isSelected()); - prefs.putBoolean(USE_LOCAL_TIME, useLocalTimeRB.isSelected()); - prefs.putBoolean(DS_HIDE_KNOWN, dataSourcesHideKnownCB.isSelected()); - prefs.putBoolean(VIEWS_HIDE_KNOWN, viewsHideKnownCB.isSelected()); - IngestManager.setNumberOfFileIngestThreads((Integer) numberOfFileIngestThreadsComboBox.getSelectedItem()); + UserPreferences.setKeepPreferredContentViewer(keepCurrentViewerRB.isSelected()); + UserPreferences.setHideKnownFilesInDataSourcesTree(dataSourcesHideKnownCB.isSelected()); + UserPreferences.setHideKnownFilesInViewsTree(viewsHideKnownCB.isSelected()); + UserPreferences.setDisplayTimesInLocalTime(useLocalTimeRB.isSelected()); + UserPreferences.setNumberOfFileIngestThreads((Integer) numberOfFileIngestThreadsComboBox.getSelectedItem()); } boolean valid() { @@ -84,44 +77,38 @@ final class GeneralPanel extends javax.swing.JPanel { viewsHideKnownCB = new javax.swing.JCheckBox(); jLabel4 = new javax.swing.JLabel(); numberOfFileIngestThreadsComboBox = new javax.swing.JComboBox(); + restartRequiredLabel = new javax.swing.JLabel(); buttonGroup1.add(useBestViewerRB); useBestViewerRB.setSelected(true); - org.openide.awt.Mnemonics.setLocalizedText(useBestViewerRB, org.openide.util.NbBundle.getMessage(GeneralPanel.class, "GeneralPanel.useBestViewerRB.text")); // NOI18N - useBestViewerRB.setToolTipText(org.openide.util.NbBundle.getMessage(GeneralPanel.class, "GeneralPanel.useBestViewerRB.toolTipText")); // NOI18N - useBestViewerRB.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - useBestViewerRBActionPerformed(evt); - } - }); + org.openide.awt.Mnemonics.setLocalizedText(useBestViewerRB, org.openide.util.NbBundle.getMessage(AutopsyOptionsPanel.class, "AutopsyOptionsPanel.useBestViewerRB.text")); // NOI18N + useBestViewerRB.setToolTipText(org.openide.util.NbBundle.getMessage(AutopsyOptionsPanel.class, "AutopsyOptionsPanel.useBestViewerRB.toolTipText")); // NOI18N buttonGroup1.add(keepCurrentViewerRB); - org.openide.awt.Mnemonics.setLocalizedText(keepCurrentViewerRB, org.openide.util.NbBundle.getMessage(GeneralPanel.class, "GeneralPanel.keepCurrentViewerRB.text")); // NOI18N - keepCurrentViewerRB.setToolTipText(org.openide.util.NbBundle.getMessage(GeneralPanel.class, "GeneralPanel.keepCurrentViewerRB.toolTipText")); // NOI18N + org.openide.awt.Mnemonics.setLocalizedText(keepCurrentViewerRB, org.openide.util.NbBundle.getMessage(AutopsyOptionsPanel.class, "AutopsyOptionsPanel.keepCurrentViewerRB.text")); // NOI18N + keepCurrentViewerRB.setToolTipText(org.openide.util.NbBundle.getMessage(AutopsyOptionsPanel.class, "AutopsyOptionsPanel.keepCurrentViewerRB.toolTipText")); // NOI18N - org.openide.awt.Mnemonics.setLocalizedText(jLabel1, org.openide.util.NbBundle.getMessage(GeneralPanel.class, "GeneralPanel.jLabel1.text")); // NOI18N + org.openide.awt.Mnemonics.setLocalizedText(jLabel1, org.openide.util.NbBundle.getMessage(AutopsyOptionsPanel.class, "AutopsyOptionsPanel.jLabel1.text")); // NOI18N - org.openide.awt.Mnemonics.setLocalizedText(jLabel2, org.openide.util.NbBundle.getMessage(GeneralPanel.class, "GeneralPanel.jLabel2.text")); // NOI18N + org.openide.awt.Mnemonics.setLocalizedText(jLabel2, org.openide.util.NbBundle.getMessage(AutopsyOptionsPanel.class, "AutopsyOptionsPanel.jLabel2.text")); // NOI18N buttonGroup3.add(useLocalTimeRB); useLocalTimeRB.setSelected(true); - org.openide.awt.Mnemonics.setLocalizedText(useLocalTimeRB, org.openide.util.NbBundle.getMessage(GeneralPanel.class, "GeneralPanel.useLocalTimeRB.text")); // NOI18N + org.openide.awt.Mnemonics.setLocalizedText(useLocalTimeRB, org.openide.util.NbBundle.getMessage(AutopsyOptionsPanel.class, "AutopsyOptionsPanel.useLocalTimeRB.text")); // NOI18N buttonGroup3.add(useGMTTimeRB); - org.openide.awt.Mnemonics.setLocalizedText(useGMTTimeRB, org.openide.util.NbBundle.getMessage(GeneralPanel.class, "GeneralPanel.useGMTTimeRB.text")); // NOI18N - useGMTTimeRB.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - useGMTTimeRBActionPerformed(evt); - } - }); + org.openide.awt.Mnemonics.setLocalizedText(useGMTTimeRB, org.openide.util.NbBundle.getMessage(AutopsyOptionsPanel.class, "AutopsyOptionsPanel.useGMTTimeRB.text")); // NOI18N - org.openide.awt.Mnemonics.setLocalizedText(jLabel3, org.openide.util.NbBundle.getMessage(GeneralPanel.class, "GeneralPanel.jLabel3.text")); // NOI18N + org.openide.awt.Mnemonics.setLocalizedText(jLabel3, org.openide.util.NbBundle.getMessage(AutopsyOptionsPanel.class, "AutopsyOptionsPanel.jLabel3.text")); // NOI18N - org.openide.awt.Mnemonics.setLocalizedText(dataSourcesHideKnownCB, org.openide.util.NbBundle.getMessage(GeneralPanel.class, "GeneralPanel.dataSourcesHideKnownCB.text")); // NOI18N + org.openide.awt.Mnemonics.setLocalizedText(dataSourcesHideKnownCB, org.openide.util.NbBundle.getMessage(AutopsyOptionsPanel.class, "AutopsyOptionsPanel.dataSourcesHideKnownCB.text")); // NOI18N - org.openide.awt.Mnemonics.setLocalizedText(viewsHideKnownCB, org.openide.util.NbBundle.getMessage(GeneralPanel.class, "GeneralPanel.viewsHideKnownCB.text")); // NOI18N + org.openide.awt.Mnemonics.setLocalizedText(viewsHideKnownCB, org.openide.util.NbBundle.getMessage(AutopsyOptionsPanel.class, "AutopsyOptionsPanel.viewsHideKnownCB.text")); // NOI18N - org.openide.awt.Mnemonics.setLocalizedText(jLabel4, org.openide.util.NbBundle.getMessage(GeneralPanel.class, "GeneralPanel.jLabel4.text")); // NOI18N + org.openide.awt.Mnemonics.setLocalizedText(jLabel4, org.openide.util.NbBundle.getMessage(AutopsyOptionsPanel.class, "AutopsyOptionsPanel.jLabel4.text")); // NOI18N + + restartRequiredLabel.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/corecomponents/warning16.png"))); // NOI18N NON-NLS + org.openide.awt.Mnemonics.setLocalizedText(restartRequiredLabel, org.openide.util.NbBundle.getMessage(AutopsyOptionsPanel.class, "AutopsyOptionsPanel.restartRequiredLabel.text")); // NOI18N javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); @@ -130,6 +117,19 @@ final class GeneralPanel extends javax.swing.JPanel { .addGroup(layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jLabel3) + .addGroup(layout.createSequentialGroup() + .addGap(10, 10, 10) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(keepCurrentViewerRB) + .addComponent(useBestViewerRB) + .addComponent(dataSourcesHideKnownCB) + .addComponent(viewsHideKnownCB) + .addGroup(layout.createSequentialGroup() + .addComponent(numberOfFileIngestThreadsComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(18, 18, 18) + .addComponent(restartRequiredLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addContainerGap()))) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jLabel2) @@ -137,22 +137,10 @@ final class GeneralPanel extends javax.swing.JPanel { .addGap(10, 10, 10) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(useLocalTimeRB) - .addComponent(useGMTTimeRB)))) - .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) - .addGroup(layout.createSequentialGroup() - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(useGMTTimeRB))) .addComponent(jLabel1) - .addComponent(jLabel3) - .addComponent(jLabel4) - .addGroup(layout.createSequentialGroup() - .addGap(10, 10, 10) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(keepCurrentViewerRB) - .addComponent(useBestViewerRB) - .addComponent(dataSourcesHideKnownCB) - .addComponent(viewsHideKnownCB) - .addComponent(numberOfFileIngestThreadsComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))) - .addGap(0, 0, Short.MAX_VALUE)))) + .addComponent(jLabel4)) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) @@ -177,17 +165,11 @@ final class GeneralPanel extends javax.swing.JPanel { .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(jLabel4) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(numberOfFileIngestThreadsComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(numberOfFileIngestThreadsComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(restartRequiredLabel))) ); }// //GEN-END:initComponents - - private void useBestViewerRBActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_useBestViewerRBActionPerformed - // TODO add your handling code here: - }//GEN-LAST:event_useBestViewerRBActionPerformed - - private void useGMTTimeRBActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_useGMTTimeRBActionPerformed - ContentUtils.setDisplayInLocalTime(useLocalTimeRB.isSelected()); - }//GEN-LAST:event_useGMTTimeRBActionPerformed // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.ButtonGroup buttonGroup1; private javax.swing.ButtonGroup buttonGroup3; @@ -198,6 +180,7 @@ final class GeneralPanel extends javax.swing.JPanel { private javax.swing.JLabel jLabel4; private javax.swing.JRadioButton keepCurrentViewerRB; private javax.swing.JComboBox 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 { refreshKey(key); } } - - //TODO use visitor - //TODO this will be removed, Children should be listening for interesting - //events from datamodel and calling refresh / refreshKey() themselves - public void refreshKeys(BlackboardArtifact.ARTIFACT_TYPE... types) { - for (Object o : contentKeys) { - for (BlackboardArtifact.ARTIFACT_TYPE type : types) { - switch (type) { - case TSK_HASHSET_HIT: - if (o instanceof HashsetHits) - this.refreshKey(o); - break; - case TSK_KEYWORD_HIT: - if (o instanceof KeywordHits) - this.refreshKey(o); - break; - case TSK_EMAIL_MSG: - if (o instanceof EmailExtracted) - this.refreshKey(o); - break; - case TSK_TAG_FILE: - case TSK_TAG_ARTIFACT: - if (o instanceof TagsNodeKey) - this.refreshKey(o); - break; - case TSK_INTERESTING_FILE_HIT: - case TSK_INTERESTING_ARTIFACT_HIT: - if (o instanceof InterestingHits) - this.refreshKey(o); - break; - default: - if (o instanceof ExtractedContent) - this.refreshKey(o); - break; - } - } - if (types.length == 0) { - if (o instanceof HashsetHits) - this.refreshKey(o); - else if (o instanceof KeywordHits) - this.refreshKey(o); - else if (o instanceof TagsNodeKey) - this.refreshKey(o); - else if (o instanceof EmailExtracted) - this.refreshKey(o); - else if (o instanceof InterestingHits) - this.refreshKey(o); - else if (o instanceof ExtractedContent) - this.refreshKey(o); - } - } - } } diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/TagNameNode.java b/Core/src/org/sleuthkit/autopsy/datamodel/TagNameNode.java deleted file mode 100755 index 1ccf5a8465..0000000000 --- a/Core/src/org/sleuthkit/autopsy/datamodel/TagNameNode.java +++ /dev/null @@ -1,138 +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.autopsy.directorytree.BlackboardArtifactTagTypeNode; -import org.sleuthkit.datamodel.TagName; -import org.sleuthkit.datamodel.TskCoreException; - -/** - * Instances of this class are elements of Node hierarchies consisting of - * content and blackboard artifact tags, grouped first by tag type, then by tag - * name. - */ -public class TagNameNode extends DisplayableItemNode { - - private static final String ICON_PATH = "org/sleuthkit/autopsy/images/tag-folder-blue-icon-16.png"; //NON-NLS - private static final String BOOKMARK_TAG_ICON_PATH = "org/sleuthkit/autopsy/images/star-bookmark-icon-16.png"; //NON-NLS - private final TagName tagName; - private static final String CONTENT_TAG_TYPE_NODE_KEY = NbBundle.getMessage(TagNameNode.class, - "TagNameNode.contentTagTypeNodeKey.text"); - private static final String BLACKBOARD_ARTIFACT_TAG_TYPE_NODE_KEY = NbBundle.getMessage(TagNameNode.class, - "TagNameNode.bbArtTagTypeNodeKey.text"); - - public TagNameNode(TagName tagName) { - super(Children.create(new TagTypeNodeFactory(tagName), true), Lookups.singleton( - NbBundle.getMessage(TagNameNode.class, "TagNameNode.namePlusTags.text", tagName.getDisplayName()))); - this.tagName = tagName; - - long tagsCount = 0; - try { - tagsCount = Case.getCurrentCase().getServices().getTagsManager().getContentTagsCountByTagName(tagName); - tagsCount += Case.getCurrentCase().getServices().getTagsManager().getBlackboardArtifactTagsCountByTagName(tagName); - } catch (TskCoreException ex) { - Logger.getLogger(TagNameNode.class.getName()).log(Level.SEVERE, "Failed to get tags count for " + tagName.getDisplayName() + " tag name", ex); //NON-NLS - } - - super.setName(tagName.getDisplayName()); - super.setDisplayName(tagName.getDisplayName() + " (" + tagsCount + ")"); - if (tagName.getDisplayName().equals(NbBundle.getMessage(this.getClass(), "TagNameNode.bookmark.text"))) { - setIconBaseWithExtension(BOOKMARK_TAG_ICON_PATH); - } else { - 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(), "TagNameNode.createSheet.name.name"), - NbBundle.getMessage(this.getClass(), "TagNameNode.createSheet.name.displayName"), - tagName.getDescription(), - getName())); - - return propertySheet; - } - - @Override - public T accept(DisplayableItemNodeVisitor v) { - // See classes derived from DisplayableItemNodeVisitor - // for behavior added using the Visitor pattern. - return v.visit(this); - } - - @Override - public boolean isLeafTypeNode() { - return false; - } - - private static class TagTypeNodeFactory extends ChildFactory { - - private final TagName tagName; - - TagTypeNodeFactory(TagName tagName) { - this.tagName = tagName; - } - - @Override - protected boolean createKeys(List keys) { - keys.add(CONTENT_TAG_TYPE_NODE_KEY); - keys.add(BLACKBOARD_ARTIFACT_TAG_TYPE_NODE_KEY); - return true; - } - - @Override - protected Node createNodeForKey(String key) { -// switch (key) { -// case CONTENT_TAG_TYPE_NODE_KEY: -// return new ContentTagTypeNode(tagName); -// case BLACKBOARD_ARTIFACT_TAG_TYPE_NODE_KEY: -// return new BlackboardArtifactTagTypeNode(tagName); -// default: -// Logger.getLogger(TagNameNode.class.getName()).log(Level.SEVERE, "{0} not a recognized key", key); -// return null; -// } - // converted switch to if/else due to non-constant strings in case key - if (CONTENT_TAG_TYPE_NODE_KEY.equals(key)) { - return new ContentTagTypeNode(tagName); - } else if (BLACKBOARD_ARTIFACT_TAG_TYPE_NODE_KEY.equals(key)) { - return new BlackboardArtifactTagTypeNode(tagName); - } else { - Logger.getLogger(TagNameNode.class.getName()).log(Level.SEVERE, "{0} not a recognized key", key); //NON-NLS - return null; - } - } - } -} diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/Tags.java b/Core/src/org/sleuthkit/autopsy/datamodel/Tags.java new file mode 100755 index 0000000000..0d6f972475 --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/datamodel/Tags.java @@ -0,0 +1,456 @@ +/* + * 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.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.util.Collections; +import java.util.List; +import java.util.Observable; +import java.util.Observer; +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.casemodule.services.TagsManager; +import org.sleuthkit.autopsy.coreutils.Logger; +import org.sleuthkit.autopsy.ingest.IngestManager; +import org.sleuthkit.autopsy.ingest.ModuleDataEvent; +import org.sleuthkit.datamodel.BlackboardArtifact; +import org.sleuthkit.datamodel.BlackboardArtifactTag; +import org.sleuthkit.datamodel.ContentTag; +import org.sleuthkit.datamodel.TagName; +import org.sleuthkit.datamodel.TskCoreException; + +/** + * Instances of this class act as keys for use by instances of the + * RootContentChildren class. RootContentChildren is a NetBeans child node + * factory built on top of the NetBeans Children.Keys class. + */ +public class Tags implements AutopsyVisitableItem { + // Creation of a RootNode object corresponding to a Tags object is done + // by a CreateAutopsyNodeVisitor dispatched from the AbstractContentChildren + // override of Children.Keys.createNodes(). + + private final TagResults tagResults = new TagResults(); + private final String DISPLAY_NAME = NbBundle.getMessage(RootNode.class, "TagsNode.displayName.text"); + private final String ICON_PATH = "org/sleuthkit/autopsy/images/tag-folder-blue-icon-16.png"; //NON-NLS + + + @Override + public T accept(AutopsyItemVisitor v) { + return v.visit(this); + } + + + + + /** + * This class largely does nothing except act as a top-level object that + * the other nodes can listen to. This mimics what other nodes have (keword search, etc.), + * but theirs stores data. + */ + private class TagResults extends Observable { + public void update() { + setChanged(); + notifyObservers(); + } + } + + /** + * Instances of this class are the root nodes of tree that is a sub-tree of + * the Autopsy presentation of the SleuthKit data model. The sub-tree + * consists of content and blackboard artifact tags, grouped first by tag + * type, then by tag name. + */ + public class RootNode extends DisplayableItemNode { + + public RootNode() { + super(Children.create(new TagNameNodeFactory(), true), Lookups.singleton(DISPLAY_NAME)); + super.setName(DISPLAY_NAME); + super.setDisplayName(DISPLAY_NAME); + this.setIconBaseWithExtension(ICON_PATH); + } + + @Override + public boolean isLeafTypeNode() { + return false; + } + + @Override + public T accept(DisplayableItemNodeVisitor v) { + return v.visit(this); + } + + @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(), "TagsNode.createSheet.name.name"), NbBundle.getMessage(this.getClass(), "TagsNode.createSheet.name.displayName"), "", getName())); + return propertySheet; + } + } + + private class TagNameNodeFactory 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_TAG_ARTIFACT) || ((ModuleDataEvent) evt.getOldValue()).getArtifactType() == BlackboardArtifact.ARTIFACT_TYPE.TSK_TAG_FILE) { + refresh(true); + tagResults.update(); + } + } else if (eventType.equals(IngestManager.IngestJobEvent.COMPLETED.toString()) || eventType.equals(IngestManager.IngestJobEvent.CANCELLED.toString())) { + refresh(true); + tagResults.update(); + } + else if (eventType.equals(Case.Events.CURRENT_CASE.toString())) { + // case was closed. Remove listeners so that this can be garbage collected + if (evt.getNewValue() == null) { + removeNotify(); + } + } + } + }; + + @Override + protected void addNotify() { + IngestManager.getInstance().addIngestJobEventListener(pcl); + IngestManager.getInstance().addIngestModuleEventListener(pcl); + Case.addPropertyChangeListener(pcl); + tagResults.update(); + tagResults.addObserver(this); + } + + @Override + protected void removeNotify() { + IngestManager.getInstance().removeIngestJobEventListener(pcl); + IngestManager.getInstance().removeIngestModuleEventListener(pcl); + Case.removePropertyChangeListener(pcl); + tagResults.deleteObserver(this); + } + + @Override + protected boolean createKeys(List keys) { + try { + List tagNamesInUse = Case.getCurrentCase().getServices().getTagsManager().getTagNamesInUse(); + Collections.sort(tagNamesInUse); + keys.addAll(tagNamesInUse); + } catch (TskCoreException ex) { + Logger.getLogger(TagNameNodeFactory.class.getName()).log(Level.SEVERE, "Failed to get tag names", ex); //NON-NLS + } + return true; + } + + @Override + protected Node createNodeForKey(TagName key) { + return new TagNameNode(key); + } + + @Override + public void update(Observable o, Object arg) { + refresh(true); + } + } + + /** + * Instances of this class are elements of Node hierarchies consisting of + * content and blackboard artifact tags, grouped first by tag type, then by tag + * name. + */ + public class TagNameNode extends DisplayableItemNode implements Observer { + + private final String ICON_PATH = "org/sleuthkit/autopsy/images/tag-folder-blue-icon-16.png"; //NON-NLS + private final String BOOKMARK_TAG_ICON_PATH = "org/sleuthkit/autopsy/images/star-bookmark-icon-16.png"; //NON-NLS + private final TagName tagName; + + public TagNameNode(TagName tagName) { + super(Children.create(new TagTypeNodeFactory(tagName), true), Lookups.singleton(NbBundle.getMessage(TagNameNode.class, "TagNameNode.namePlusTags.text", tagName.getDisplayName()))); + this.tagName = tagName; + setName(tagName.getDisplayName()); + updateDisplayName(); + if (tagName.getDisplayName().equals(NbBundle.getMessage(this.getClass(), "TagNameNode.bookmark.text"))) { + setIconBaseWithExtension(BOOKMARK_TAG_ICON_PATH); + } else { + setIconBaseWithExtension(ICON_PATH); + } + tagResults.addObserver(this); + } + + private void updateDisplayName() { + long tagsCount = 0; + try { + TagsManager tm = Case.getCurrentCase().getServices().getTagsManager(); + tagsCount = tm.getContentTagsCountByTagName(tagName); + tagsCount += tm.getBlackboardArtifactTagsCountByTagName(tagName); + } catch (TskCoreException ex) { + Logger.getLogger(TagNameNode.class.getName()).log(Level.SEVERE, "Failed to get tags count for " + tagName.getDisplayName() + " tag name", ex); //NON-NLS + } + setDisplayName(tagName.getDisplayName() + " (" + tagsCount + ")"); + } + + @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(), "TagNameNode.createSheet.name.name"), NbBundle.getMessage(this.getClass(), "TagNameNode.createSheet.name.displayName"), tagName.getDescription(), getName())); + return propertySheet; + } + + @Override + public T accept(DisplayableItemNodeVisitor v) { + // See classes derived from DisplayableItemNodeVisitor + // for behavior added using the Visitor pattern. + return v.visit(this); + } + + @Override + public boolean isLeafTypeNode() { + return false; + } + + @Override + public void update(Observable o, Object arg) { + updateDisplayName(); + } + } + + /** + * Creates nodes for the two types of tags: file and artifact. + * Does not need observer / messages since it always has the same children + */ + private class TagTypeNodeFactory extends ChildFactory { + private final TagName tagName; + private final String CONTENT_TAG_TYPE_NODE_KEY = NbBundle.getMessage(TagNameNode.class, "TagNameNode.contentTagTypeNodeKey.text"); + private final String BLACKBOARD_ARTIFACT_TAG_TYPE_NODE_KEY = NbBundle.getMessage(TagNameNode.class, "TagNameNode.bbArtTagTypeNodeKey.text"); + + TagTypeNodeFactory(TagName tagName) { + super(); + this.tagName = tagName; + } + + @Override + protected boolean createKeys(List keys) { + keys.add(CONTENT_TAG_TYPE_NODE_KEY); + keys.add(BLACKBOARD_ARTIFACT_TAG_TYPE_NODE_KEY); + return true; + } + + @Override + protected Node createNodeForKey(String key) { + if (CONTENT_TAG_TYPE_NODE_KEY.equals(key)) { + return new ContentTagTypeNode(tagName); + } else if (BLACKBOARD_ARTIFACT_TAG_TYPE_NODE_KEY.equals(key)) { + return new BlackboardArtifactTagTypeNode(tagName); + } else { + Logger.getLogger(TagNameNode.class.getName()).log(Level.SEVERE, "{0} not a recognized key", key); //NON-NLS + return null; + } + } + } + + private final String CONTENT_DISPLAY_NAME = NbBundle.getMessage(ContentTagTypeNode.class, "ContentTagTypeNode.displayName.text"); + + /** + * Node for the content tags. Children are specific tags. + * 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 implements Observer { + + private final String ICON_PATH = "org/sleuthkit/autopsy/images/tag-folder-blue-icon-16.png"; //NON-NLS + private TagName tagName; + public ContentTagTypeNode(TagName tagName) { + super(Children.create(new ContentTagNodeFactory(tagName), true), Lookups.singleton(tagName.getDisplayName() + " " + CONTENT_DISPLAY_NAME)); + this.tagName = tagName; + super.setName(CONTENT_DISPLAY_NAME); + updateDisplayName(); + this.setIconBaseWithExtension(ICON_PATH); + tagResults.addObserver(this); + } + + private void updateDisplayName() { + 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.setDisplayName(CONTENT_DISPLAY_NAME + " (" + tagsCount + ")"); + } + + @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; + } + + @Override + public void update(Observable o, Object arg) { + updateDisplayName(); + } + } + + private class ContentTagNodeFactory extends ChildFactory implements Observer { + private final TagName tagName; + + ContentTagNodeFactory(TagName tagName) { + super(); + this.tagName = tagName; + tagResults.addObserver(this); + } + + @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(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); + } + + @Override + public void update(Observable o, Object arg) { + refresh(true); + } + } + + private final String ARTIFACT_DISPLAY_NAME = NbBundle.getMessage(BlackboardArtifactTagTypeNode.class, "BlackboardArtifactTagTypeNode.displayName.text"); + + /** + * Instances of this class are elements in a sub-tree of the Autopsy + * presentation of the SleuthKit data model. The sub-tree consists of content + * and blackboard artifact tags, grouped first by tag type, then by tag name. + */ + public class BlackboardArtifactTagTypeNode extends DisplayableItemNode implements Observer { + private TagName tagName; + private final String ICON_PATH = "org/sleuthkit/autopsy/images/tag-folder-blue-icon-16.png"; //NON-NLS + + public BlackboardArtifactTagTypeNode(TagName tagName) { + super(Children.create(new BlackboardArtifactTagNodeFactory(tagName), true), Lookups.singleton(tagName.getDisplayName() + " " + ARTIFACT_DISPLAY_NAME)); + this.tagName = tagName; + super.setName(ARTIFACT_DISPLAY_NAME); + this.setIconBaseWithExtension(ICON_PATH); + updateDisplayName(); + tagResults.addObserver(this); + } + + private void updateDisplayName() { + long tagsCount = 0; + try { + tagsCount = Case.getCurrentCase().getServices().getTagsManager().getBlackboardArtifactTagsCountByTagName(tagName); + } catch (TskCoreException ex) { + Logger.getLogger(BlackboardArtifactTagTypeNode.class.getName()).log(Level.SEVERE, "Failed to get blackboard artifact tags count for " + tagName.getDisplayName() + " tag name", ex); //NON-NLS + } + super.setDisplayName(ARTIFACT_DISPLAY_NAME + " (" + tagsCount + ")"); + } + + @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(), "BlackboardArtifactTagTypeNode.createSheet.name.name"), NbBundle.getMessage(this.getClass(), "BlackboardArtifactTagTypeNode.createSheet.name.displayName"), "", getName())); + return propertySheet; + } + + @Override + public T accept(DisplayableItemNodeVisitor v) { + return v.visit(this); + } + + @Override + public boolean isLeafTypeNode() { + return true; + } + + @Override + public void update(Observable o, Object arg) { + updateDisplayName(); + } + } + + private class BlackboardArtifactTagNodeFactory extends ChildFactory { + private final TagName tagName; + + BlackboardArtifactTagNodeFactory(TagName tagName) { + super(); + this.tagName = tagName; + } + + @Override + protected boolean createKeys(List keys) { + try { + // Use the blackboard artifact tags bearing the specified tag name as the keys. + keys.addAll(Case.getCurrentCase().getServices().getTagsManager().getBlackboardArtifactTagsByTagName(tagName)); + } catch (TskCoreException ex) { + Logger.getLogger(BlackboardArtifactTagNodeFactory.class.getName()).log(Level.SEVERE, "Failed to get tag names", ex); //NON-NLS + } + return true; + } + + @Override + protected Node createNodeForKey(BlackboardArtifactTag key) { + // The blackboard artifact tags to be wrapped are used as the keys. + return new BlackboardArtifactTagNode(key); + } + } +} diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/TagsNode.java b/Core/src/org/sleuthkit/autopsy/datamodel/TagsNode.java deleted file mode 100755 index 81b5c53c8b..0000000000 --- a/Core/src/org/sleuthkit/autopsy/datamodel/TagsNode.java +++ /dev/null @@ -1,96 +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.TagName; -import org.sleuthkit.datamodel.TskCoreException; - -/** - * Instances of this class are the root nodes of tree that is a sub-tree of the - * Autopsy presentation of the SleuthKit data model. The sub-tree consists of - * content and blackboard artifact tags, grouped first by tag type, then by tag - * name. - */ -class TagsNode extends DisplayableItemNode { - - private static final String DISPLAY_NAME = NbBundle.getMessage(TagsNode.class, "TagsNode.displayName.text"); - private static final String ICON_PATH = "org/sleuthkit/autopsy/images/tag-folder-blue-icon-16.png"; //NON-NLS - - public TagsNode() { - super(Children.create(new TagNameNodeFactory(), true), Lookups.singleton(DISPLAY_NAME)); - super.setName(DISPLAY_NAME); - super.setDisplayName(DISPLAY_NAME); - this.setIconBaseWithExtension(ICON_PATH); - } - - @Override - public boolean isLeafTypeNode() { - return false; - } - - @Override - public T accept(DisplayableItemNodeVisitor v) { - return v.visit(this); - } - - @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(), "TagsNode.createSheet.name.name"), - NbBundle.getMessage(this.getClass(), "TagsNode.createSheet.name.displayName"), - "", - getName())); - - return propertySheet; - } - - private static class TagNameNodeFactory extends ChildFactory { - - @Override - protected boolean createKeys(List keys) { - try { - keys.addAll(Case.getCurrentCase().getServices().getTagsManager().getTagNamesInUse()); - } catch (TskCoreException ex) { - Logger.getLogger(TagNameNodeFactory.class.getName()).log(Level.SEVERE, "Failed to get tag names", ex); //NON-NLS - } - return true; - } - - @Override - protected Node createNodeForKey(TagName key) { - return new TagNameNode(key); - } - } -} diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/TagsNodeKey.java b/Core/src/org/sleuthkit/autopsy/datamodel/TagsNodeKey.java deleted file mode 100755 index dad36cfa34..0000000000 --- a/Core/src/org/sleuthkit/autopsy/datamodel/TagsNodeKey.java +++ /dev/null @@ -1,34 +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; - -/** - * Instances of this class act as keys for use by instances of the - * RootContentChildren class. RootContentChildren is a NetBeans child node - * factory built on top of the NetBeans Children.Keys class. - */ - class TagsNodeKey implements AutopsyVisitableItem { - // Creation of a TagsNode object corresponding to a TagsNodeKey object is done - // by a CreateAutopsyNodeVisitor dispatched from the AbstractContentChildren - // override of Children.Keys.createNodes(). - @Override - public T accept(AutopsyItemVisitor v) { - return v.visit(this); - } -} diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/BlackboardArtifactTagTypeNode.java b/Core/src/org/sleuthkit/autopsy/directorytree/BlackboardArtifactTagTypeNode.java deleted file mode 100755 index efc7cadca9..0000000000 --- a/Core/src/org/sleuthkit/autopsy/directorytree/BlackboardArtifactTagTypeNode.java +++ /dev/null @@ -1,119 +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.directorytree; - -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.datamodel.BlackboardArtifactTagNode; -import org.sleuthkit.autopsy.datamodel.ContentTagTypeNode; -import org.sleuthkit.autopsy.datamodel.DisplayableItemNode; -import org.sleuthkit.autopsy.datamodel.DisplayableItemNodeVisitor; -import org.sleuthkit.autopsy.datamodel.NodeProperty; -import org.sleuthkit.datamodel.BlackboardArtifactTag; -import org.sleuthkit.datamodel.TagName; -import org.sleuthkit.datamodel.TskCoreException; - -/** - * Instances of this class are elements in a sub-tree of the Autopsy - * presentation of the SleuthKit data model. The sub-tree consists of content - * and blackboard artifact tags, grouped first by tag type, then by tag name. - */ -public class BlackboardArtifactTagTypeNode extends DisplayableItemNode { - private static final String DISPLAY_NAME = NbBundle.getMessage(BlackboardArtifactTagTypeNode.class, - "BlackboardArtifactTagTypeNode.displayName.text"); - private static final String ICON_PATH = "org/sleuthkit/autopsy/images/tag-folder-blue-icon-16.png"; //NON-NLS - - public BlackboardArtifactTagTypeNode(TagName tagName) { - super(Children.create(new BlackboardArtifactTagNodeFactory(tagName), true), Lookups.singleton(tagName.getDisplayName() + " " + DISPLAY_NAME)); - - long tagsCount = 0; - try { - tagsCount = Case.getCurrentCase().getServices().getTagsManager().getBlackboardArtifactTagsCountByTagName(tagName); - } - catch (TskCoreException ex) { - Logger.getLogger(BlackboardArtifactTagTypeNode.class.getName()).log(Level.SEVERE, "Failed to get blackboard artifact 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(), "BlackboardArtifactTagTypeNode.createSheet.name.name"), - NbBundle.getMessage(this.getClass(), "BlackboardArtifactTagTypeNode.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 BlackboardArtifactTagNodeFactory extends ChildFactory { - private final TagName tagName; - - BlackboardArtifactTagNodeFactory(TagName tagName) { - this.tagName = tagName; - } - - @Override - protected boolean createKeys(List keys) { - try { - // Use the blackboard artifact tags bearing the specified tag name as the keys. - keys.addAll(Case.getCurrentCase().getServices().getTagsManager().getBlackboardArtifactTagsByTagName(tagName)); - } - catch (TskCoreException ex) { - Logger.getLogger(BlackboardArtifactTagTypeNode.BlackboardArtifactTagNodeFactory.class.getName()).log(Level.SEVERE, "Failed to get tag names", ex); //NON-NLS - } - return true; - } - - @Override - protected Node createNodeForKey(BlackboardArtifactTag key) { - // The blackboard artifact tags to be wrapped are used as the keys. - return new BlackboardArtifactTagNode(key); - } - } -} \ No newline at end of file diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/Bundle.properties b/Core/src/org/sleuthkit/autopsy/directorytree/Bundle.properties index 015449821b..941cdbc7dd 100644 --- a/Core/src/org/sleuthkit/autopsy/directorytree/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/directorytree/Bundle.properties @@ -50,9 +50,6 @@ ImageDetailsPanel.imgTotalSizeValue.text=... ImageDetailsPanel.imgTotalSizeLabel.text=Total Size: ImageDetailsPanel.imgHashValue.text=... ImageDetailsPanel.imgHashLabel.text=Hash Value: -BlackboardArtifactTagTypeNode.displayName.text=Result Tags -BlackboardArtifactTagTypeNode.createSheet.name.name=Name -BlackboardArtifactTagTypeNode.createSheet.name.displayName=Name ChangeViewAction.menuItem.view=View ChangeViewAction.menuItem.view.hex=Hex ChangeViewAction.menuItem.view.string=String diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/directorytree/Bundle_ja.properties index 009c7356ff..620bb06ae3 100644 --- a/Core/src/org/sleuthkit/autopsy/directorytree/Bundle_ja.properties +++ b/Core/src/org/sleuthkit/autopsy/directorytree/Bundle_ja.properties @@ -1,11 +1,11 @@ -CTL_DirectoryTreeTopComponent=\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u30C4\u30EA\u30FC -HINT_DirectoryTreeTopComponent=\u3053\u308C\u306F\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u30C4\u30EA\u30FC\u306E\u30A6\u30A3\u30F3\u30C9\u30A6\u3067\u3059 -OpenIDE-Module-Name=\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u30C4\u30EA\u30FC -FileSystemDetailsPanel.imgOffsetLabel.text=\u30A4\u30E1\u30FC\u30B8\u30AA\u30D5\u30BB\u30C3\u30C8\uFF1A -FileSystemDetailsPanel.fsTypeLabel.text=\u30D5\u30A1\u30A4\u30EB\u30B7\u30B9\u30C6\u30E0\u30BF\u30A4\u30D7\uFF1A -FileSystemDetailsPanel.genInfoLabel.text=\u30D5\u30A1\u30A4\u30EB\u4E00\u822C\u60C5\u5831 -FileSystemDetailsPanel.jLabel2.text=\u30D0\u30A4\u30C8 -FileSystemDetailsPanel.jLabel3.text=\u30D0\u30A4\u30C8 +CTL_DirectoryTreeTopComponent=\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u30c4\u30ea\u30fc +HINT_DirectoryTreeTopComponent=\u3053\u308c\u306f\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u30c4\u30ea\u30fc\u306e\u30a6\u30a3\u30f3\u30c9\u30a6\u3067\u3059 +OpenIDE-Module-Name=\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u30c4\u30ea\u30fc +FileSystemDetailsPanel.imgOffsetLabel.text=\u30a4\u30e1\u30fc\u30b8\u30aa\u30d5\u30bb\u30c3\u30c8\uff1a +FileSystemDetailsPanel.fsTypeLabel.text=\u30d5\u30a1\u30a4\u30eb\u30b7\u30b9\u30c6\u30e0\u30bf\u30a4\u30d7\uff1a +FileSystemDetailsPanel.genInfoLabel.text=\u30d5\u30a1\u30a4\u30eb\u4e00\u822c\u60c5\u5831 +FileSystemDetailsPanel.jLabel2.text=\u30d0\u30a4\u30c8 +FileSystemDetailsPanel.jLabel3.text=\u30d0\u30a4\u30c8 FileSystemDetailsPanel.fsTypeValue.text=... FileSystemDetailsPanel.imgOffsetValue.text=... FileSystemDetailsPanel.volumeIDValue.text=... @@ -14,86 +14,83 @@ FileSystemDetailsPanel.blockCountValue.text=... FileSystemDetailsPanel.rootInumValue.text=... FileSystemDetailsPanel.firstInumValue.text=... FileSystemDetailsPanel.lastInumValue.text=... -FileSystemDetailsPanel.jLabel1.text=\u30D5\u30A1\u30A4\u30EB\u8A73\u7D30\u60C5\u5831 -FileSystemDetailsPanel.volumeIDLabel.text=\u30DC\u30EA\u30E5\u30FC\u30E0ID\uFF1A -FileSystemDetailsPanel.blockSizeLabel.text=\u30D6\u30ED\u30C3\u30AF\u30B5\u30A4\u30BA\uFF1A -FileSystemDetailsPanel.blockCountLabel.text=\u30D6\u30ED\u30C3\u30AF\u6570\uFF1A -FileSystemDetailsPanel.rootInumLabel.text=\u30EB\u30FC\u30C8\u30E1\u30BF\u30C7\u30FC\u30BF\u30A8\u30F3\u30C8\u30EA\u30FC\uFF1A -FileSystemDetailsPanel.firstInumLabel.text=\u6700\u521D\u306E\u30E1\u30BF\u30C7\u30FC\u30BF\u30A8\u30F3\u30C8\u30EA\u30FC\uFF1A -FileSystemDetailsPanel.lastInumLabel.text=\u6700\u5F8C\u306E\u30E1\u30BF\u30C7\u30FC\u30BF\u30A8\u30F3\u30C8\u30EA\u30FC\uFF1A +FileSystemDetailsPanel.jLabel1.text=\u30d5\u30a1\u30a4\u30eb\u8a73\u7d30\u60c5\u5831 +FileSystemDetailsPanel.volumeIDLabel.text=\u30dc\u30ea\u30e5\u30fc\u30e0ID\uff1a +FileSystemDetailsPanel.blockSizeLabel.text=\u30d6\u30ed\u30c3\u30af\u30b5\u30a4\u30ba\uff1a +FileSystemDetailsPanel.blockCountLabel.text=\u30d6\u30ed\u30c3\u30af\u6570\uff1a +FileSystemDetailsPanel.rootInumLabel.text=\u30eb\u30fc\u30c8\u30e1\u30bf\u30c7\u30fc\u30bf\u30a8\u30f3\u30c8\u30ea\u30fc\uff1a +FileSystemDetailsPanel.firstInumLabel.text=\u6700\u521d\u306e\u30e1\u30bf\u30c7\u30fc\u30bf\u30a8\u30f3\u30c8\u30ea\u30fc\uff1a +FileSystemDetailsPanel.lastInumLabel.text=\u6700\u5f8c\u306e\u30e1\u30bf\u30c7\u30fc\u30bf\u30a8\u30f3\u30c8\u30ea\u30fc\uff1a FileSystemDetailsPanel.OKButton.text=OK -VolumeDetailsPanel.volumeIDLabel.text=\u30DC\u30EA\u30E5\u30FC\u30E0ID\uFF1A +VolumeDetailsPanel.volumeIDLabel.text=\u30dc\u30ea\u30e5\u30fc\u30e0ID\uff1a VolumeDetailsPanel.volumeIDValue.text=... VolumeDetailsPanel.startValue.text=... VolumeDetailsPanel.lengthValue.text=... VolumeDetailsPanel.descValue.text=... VolumeDetailsPanel.flagsValue.text=... -VolumeDetailsPanel.startLabel.text=\u6700\u521D\u306E\u30BB\u30AF\u30BF\u30FC\uFF1A -VolumeDetailsPanel.lengthLabel.text=\u30BB\u30AF\u30BF\u30FC\u306E\u9577\u3055\uFF1A -VolumeDetailsPanel.descLabel.text=\u8AAC\u660E\uFF1A -VolumeDetailsPanel.flagsLabel.text=\u30D5\u30E9\u30B0\uFF1A -VolumeDetailsPanel.jLabel1.text=\u30DC\u30EA\u30E5\u30FC\u30E0\u4E00\u822C\u60C5\u5831 +VolumeDetailsPanel.startLabel.text=\u6700\u521d\u306e\u30bb\u30af\u30bf\u30fc\uff1a +VolumeDetailsPanel.lengthLabel.text=\u30bb\u30af\u30bf\u30fc\u306e\u9577\u3055\uff1a +VolumeDetailsPanel.descLabel.text=\u8aac\u660e\uff1a +VolumeDetailsPanel.flagsLabel.text=\u30d5\u30e9\u30b0\uff1a +VolumeDetailsPanel.jLabel1.text=\u30dc\u30ea\u30e5\u30fc\u30e0\u4e00\u822c\u60c5\u5831 VolumeDetailsPanel.OKButton.text=OK -ImageDetailsPanel.imageInfoLabel.text=\u30A4\u30E1\u30FC\u30B8\u60C5\u5831 -ImageDetailsPanel.imgNameLabel.text=\u540D\u524D\uFF1A +ImageDetailsPanel.imageInfoLabel.text=\u30a4\u30e1\u30fc\u30b8\u60c5\u5831 +ImageDetailsPanel.imgNameLabel.text=\u540d\u524d\uff1a ImageDetailsPanel.imgNameValue.text=... -ImageDetailsPanel.imgTypeLabel.text=\u30BF\u30A4\u30D7\uFF1A +ImageDetailsPanel.imgTypeLabel.text=\u30bf\u30a4\u30d7\uff1a ImageDetailsPanel.imgTypeValue.text=... ImageDetailsPanel.OKButton.text=OK -ImageDetailsPanel.imgSectorSizeLabel.text=\u30BB\u30AF\u30BF\u30FC\u30B5\u30A4\u30BA\uFF1A +ImageDetailsPanel.imgSectorSizeLabel.text=\u30bb\u30af\u30bf\u30fc\u30b5\u30a4\u30ba\uff1a ImageDetailsPanel.imgSectorSizeValue.text=... ImageDetailsPanel.imgTotalSizeValue.text=... -ImageDetailsPanel.imgTotalSizeLabel.text=\u5408\u8A08\u30B5\u30A4\u30BA\uFF1A +ImageDetailsPanel.imgTotalSizeLabel.text=\u5408\u8a08\u30b5\u30a4\u30ba\uff1a ImageDetailsPanel.imgHashValue.text=... -ImageDetailsPanel.imgHashLabel.text=\u30CF\u30C3\u30B7\u30E5\u5024\uFF1A -BlackboardArtifactTagTypeNode.displayName.text=\u7D50\u679C\u30BF\u30B0 -BlackboardArtifactTagTypeNode.createSheet.name.name=\u540D\u524D -BlackboardArtifactTagTypeNode.createSheet.name.displayName=\u540D\u524D -ChangeViewAction.menuItem.view=\u30D3\u30E5\u30FC +ImageDetailsPanel.imgHashLabel.text=\u30cf\u30c3\u30b7\u30e5\u5024\uff1a +ChangeViewAction.menuItem.view=\u30d3\u30e5\u30fc ChangeViewAction.menuItem.view.hex=HEX -ChangeViewAction.menuItem.view.string=\u30B9\u30C8\u30EA\u30F3\u30B0 -DataResultFilterNode.action.viewFileInDir.text=\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u5185\u306E\u30D5\u30A1\u30A4\u30EB\u3092\u8868\u793A -DataResultFilterNode.action.viewSrcFileInDir.text=\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u5185\u306E\u30BD\u30FC\u30B9\u30D5\u30A1\u30A4\u30EB\u3092\u8868\u793A -DataResultFilterNode.action.viewInNewWin.text=\u65B0\u898F\u30A6\u30A3\u30F3\u30C9\u30A6\u306B\u8868\u793A -DataResultFilterNode.action.openInExtViewer.text=\u5916\u90E8\u30D3\u30E5\u30FC\u30A2\u3067\u958B\u304F -DataResultFilterNode.action.searchFilesSameMd5.text=\u540C\u3058MD5\u30CF\u30C3\u30B7\u30E5\u3092\u6301\u3064\u30D5\u30A1\u30A4\u30EB\u3092\u691C\u7D22 -DataResultFilterNode.action.viewInDir.text=\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u30FC\u306B\u8868\u793A -DirectoryTreeFilterNode.action.openFileSrcByAttr.text=\u5C5E\u6027\u306B\u3088\u308B\u30D5\u30A1\u30A4\u30EB\u691C\u7D22\u3092\u958B\u304F -DirectoryTreeFilterNode.action.runIngestMods.text=\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u30E2\u30B8\u30E5\u30FC\u30EB\u3092\u5B9F\u884C -DirectoryTreeTopComponent.title.text=\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u30EA\u30B9\u30C6\u30A3\u30F3\u30B0 -DirectoryTreeTopComponent.action.viewArtContent.text=\u30A2\u30FC\u30C6\u30A3\u30D5\u30A1\u30AF\u30C8\u30B3\u30F3\u30C6\u30F3\u30C4\u3092\u8868\u793A -DirectoryTreeTopComponent.moduleErr=\u30E2\u30B8\u30E5\u30FC\u30EB\u30A8\u30E9\u30FC -DirectoryTreeTopComponent.moduleErr.msg=DirectoryTreeTopComponent\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 -ExplorerNodeActionVisitor.action.imgDetails.title=\u30A4\u30E1\u30FC\u30B8\u8A73\u7D30 -ExplorerNodeActionVisitor.action.extUnallocToSingleFiles=\u672A\u5272\u308A\u5F53\u3066\u9818\u57DF\u5185\u306E\u30C7\u30FC\u30BF\u3092\u8907\u6570\u306E\u30B7\u30F3\u30B0\u30EB\u30D5\u30A1\u30A4\u30EB\u306B\u62BD\u51FA -ExplorerNodeActionVisitor.action.fileSystemDetails.title=\u30D5\u30A1\u30A4\u30EB\u30B7\u30B9\u30C6\u30E0\u8A73\u7D30 -ExplorerNodeActionVisitor.action.volumeDetails.title=\u30DC\u30EA\u30E5\u30FC\u30E0\u8A73\u7D30 -ExplorerNodeActionVisitor.action.extUnallocToSingleFile=\u672A\u5272\u308A\u5F53\u3066\u9818\u57DF\u5185\u306E\u30C7\u30FC\u30BF\u3092\u4E00\u3064\u306E\u30B7\u30F3\u30B0\u30EB\u30D5\u30A1\u30A4\u30EB\u306B\u62BD\u51FA -ExplorerNodeActionVisitor.volDetail.noVolMatchErr=\u30A8\u30E9\u30FC\uFF1A\u4E00\u81F4\u3059\u308B\u30DC\u30EA\u30E5\u30FC\u30E0\u304C\u3042\u308A\u307E\u305B\u3093\u3002 -ExplorerNodeActionVisitor.imgDetail.noVolMatchesErr=\u30A8\u30E9\u30FC\uFF1A\u4E00\u81F4\u3059\u308B\u30DC\u30EA\u30E5\u30FC\u30E0\u304C\u3042\u308A\u307E\u305B\u3093\u3002 -ExplorerNodeActionVisitor.exception.probGetParent.text={0}\: {1}\u304B\u3089\u30DA\u30A2\u30EC\u30F3\u30C8\u3092\u53D6\u5F97\u3059\u308B\u969B\u306B\u554F\u984C\u304C\u767A\u751F\u3057\u307E\u3057\u305F -ExtractAction.title.extractFiles.text=\u30D5\u30A1\u30A4\u30EB\u3092\u62BD\u51FA -ExtractAction.extractFiles.cantCreateFolderErr.msg=\u6307\u5B9A\u3055\u308C\u305F\u30D5\u30A9\u30EB\u30C0\u3092\u4F5C\u6210\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002 -ExtractAction.confDlg.destFileExist.msg=\u4FDD\u5B58\u5148\u306E\u30D5\u30A1\u30A4\u30EB{0}\u306F\u65E2\u306B\u5B58\u5728\u3057\u307E\u3059\u3001\u4E0A\u66F8\u304D\u3057\u307E\u3059\u304B\uFF1F -ExtractAction.confDlg.destFileExist.title=\u30D5\u30A1\u30A4\u30EB\u304C\u5B58\u5728\u3057\u307E\u3059 -ExtractAction.msgDlg.cantOverwriteFile.msg=\u65E2\u5B58\u30D5\u30A1\u30A4\u30EB{0}\u3092\u4E0A\u66F8\u304D\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F -ExtractAction.notifyDlg.noFileToExtr.msg=\u62BD\u51FA\u3067\u304D\u308B\u30D5\u30A1\u30A4\u30EB\u304C\u3042\u308A\u307E\u305B\u3093\u3002 -ExtractAction.progress.extracting=\u62BD\u51FA\u4E2D -ExtractAction.progress.cancellingExtraction={0}\uFF08\u30AD\u30E3\u30F3\u30BB\u30EB\u4E2D\u2026\uFF09 -ExtractAction.done.notifyMsg.fileExtr.text=\u30D5\u30A1\u30A4\u30EB\u304C\u62BD\u51FA\u3055\u308C\u307E\u3057\u305F\u3002 -ExtractUnallocAction.notifyMsg.unallocAlreadyBeingExtr.msg=\u3053\u306E\u30A4\u30E1\u30FC\u30B8\u306E\u672A\u5272\u308A\u5F53\u3066\u9818\u57DF\u306E\u30C7\u30FC\u30BF\u306F\u65E2\u306B\u62BD\u51FA\u4E2D\u3067\u3059\u3002\u5225\u306E\u30A4\u30E1\u30FC\u30B8\u3092\u9078\u629E\u3057\u3066\u4E0B\u3055\u3044\u3002 -ExtractUnallocAction.msgDlg.folderDoesntExist.msg=\u30D5\u30A9\u30EB\u30C0\u306F\u5B58\u5728\u3057\u307E\u305B\u3093\u3002\u7D9A\u884C\u3059\u308B\u524D\u306B\u6709\u52B9\u306A\u30D5\u30A9\u30EB\u30C0\u3092\u9078\u629E\u3057\u3066\u4E0B\u3055\u3044\u3002 -ExtractUnallocAction.dlgTitle.selectDirToSaveTo.msg=\u4FDD\u5B58\u5148\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u3092\u9078\u629E\u3057\u3066\u4E0B\u3055\u3044 -ExtractUnallocAction.confDlg.unallocFileAlreadyExist.msg=\u3053\u306E\u30DC\u30EA\u30E5\u30FC\u30E0\u306E\u672A\u5272\u308A\u5F53\u3066\u9818\u57DF\u306E\u30D5\u30A1\u30A4\u30EB{0}\u306F\u65E2\u306B\u5B58\u5728\u3057\u307E\u3059\u3002\u65E2\u5B58\u306E\u30D5\u30A1\u30A4\u30EB\u3092\u7F6E\u304D\u63DB\u3048\u307E\u3059\u304B\uFF1F -ExtractUnallocAction.progress.extractUnalloc.title=\u672A\u5272\u308A\u5F53\u3066\u9818\u57DF\u306E\u30C7\u30FC\u30BF\u3092\u62BD\u51FA\u4E2D -ExtractUnallocAction.progress.displayName.cancelling.text=\u672A\u5272\u308A\u5F53\u3066\u9818\u57DF\u306E\u30C7\u30FC\u30BF\u3092\u62BD\u51FA\u4E2D\uFF08\u30AD\u30E3\u30F3\u30BB\u30EB\u4E2D\u2026\uFF09 -ExtractUnallocAction.processing.counter.msg=\u51E6\u7406\u4E2D\u3000{0}\uFF0F{1} MBs -ExtractUnallocAction.done.notifyMsg.completedExtract.title=\u672A\u5272\u308A\u5F53\u3066\u9818\u57DF\u306E\u62BD\u51FA\u304C\u5B8C\u4E86\u3057\u307E\u3057\u305F\u3002 -ExtractUnallocAction.done.notifyMsg.completedExtract.msg=\u30D5\u30A1\u30A4\u30EB\u306F{0}\u3078\u62BD\u51FA\u3055\u308C\u307E\u3057\u305F -ResultDeleteAction.actionPerf.confDlg.delAllResults.msg={0}\u306E\u7D50\u679C\u5168\u3066\u3092\u672C\u5F53\u306B\u524A\u9664\u3057\u307E\u3059\u304B\uFF1F -ResultDeleteAction.actoinPerf.confDlg.delAllresults.details={0}\u7D50\u679C\u524A\u9664 -ResultDeleteAction.exception.invalidAction.msg=\u7121\u52B9\u306A\u30A2\u30AF\u30B7\u30E7\u30F3\u30BF\u30A4\u30D7\uFF1A{0} -ExtractUnallocAction.done.errMsg.title=\u62BD\u51FA\u30A8\u30E9\u30FC -ExtractUnallocAction.done.errMsg.msg=\u672A\u5272\u308A\u5F53\u3066\u9818\u57DF\u306E\u62BD\u51FA\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\uFF1A{0} -DirectoryTreeFilterNode.action.collapseAll.text=\u3059\u3079\u3066\u30B3\u30E9\u30D7\u30B9 -ExtractAction.done.notifyMsg.extractErr=\u4E0B\u8A18\u306E\u30D5\u30A1\u30A4\u30EB\u306E\u62BD\u51FA\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\uFF1A {0} \ No newline at end of file +ChangeViewAction.menuItem.view.string=\u30b9\u30c8\u30ea\u30f3\u30b0 +DataResultFilterNode.action.viewFileInDir.text=\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u5185\u306e\u30d5\u30a1\u30a4\u30eb\u3092\u8868\u793a +DataResultFilterNode.action.viewSrcFileInDir.text=\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u5185\u306e\u30bd\u30fc\u30b9\u30d5\u30a1\u30a4\u30eb\u3092\u8868\u793a +DataResultFilterNode.action.viewInNewWin.text=\u65b0\u898f\u30a6\u30a3\u30f3\u30c9\u30a6\u306b\u8868\u793a +DataResultFilterNode.action.openInExtViewer.text=\u5916\u90e8\u30d3\u30e5\u30fc\u30a2\u3067\u958b\u304f +DataResultFilterNode.action.searchFilesSameMd5.text=\u540c\u3058MD5\u30cf\u30c3\u30b7\u30e5\u3092\u6301\u3064\u30d5\u30a1\u30a4\u30eb\u3092\u691c\u7d22 +DataResultFilterNode.action.viewInDir.text=\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u30fc\u306b\u8868\u793a +DirectoryTreeFilterNode.action.openFileSrcByAttr.text=\u5c5e\u6027\u306b\u3088\u308b\u30d5\u30a1\u30a4\u30eb\u691c\u7d22\u3092\u958b\u304f +DirectoryTreeFilterNode.action.runIngestMods.text=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb\u3092\u5b9f\u884c +DirectoryTreeTopComponent.title.text=\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u30ea\u30b9\u30c6\u30a3\u30f3\u30b0 +DirectoryTreeTopComponent.action.viewArtContent.text=\u30a2\u30fc\u30c6\u30a3\u30d5\u30a1\u30af\u30c8\u30b3\u30f3\u30c6\u30f3\u30c4\u3092\u8868\u793a +DirectoryTreeTopComponent.moduleErr=\u30e2\u30b8\u30e5\u30fc\u30eb\u30a8\u30e9\u30fc +DirectoryTreeTopComponent.moduleErr.msg=DirectoryTreeTopComponent\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 +ExplorerNodeActionVisitor.action.imgDetails.title=\u30a4\u30e1\u30fc\u30b8\u8a73\u7d30 +ExplorerNodeActionVisitor.action.extUnallocToSingleFiles=\u672a\u5272\u308a\u5f53\u3066\u9818\u57df\u5185\u306e\u30c7\u30fc\u30bf\u3092\u8907\u6570\u306e\u30b7\u30f3\u30b0\u30eb\u30d5\u30a1\u30a4\u30eb\u306b\u62bd\u51fa +ExplorerNodeActionVisitor.action.fileSystemDetails.title=\u30d5\u30a1\u30a4\u30eb\u30b7\u30b9\u30c6\u30e0\u8a73\u7d30 +ExplorerNodeActionVisitor.action.volumeDetails.title=\u30dc\u30ea\u30e5\u30fc\u30e0\u8a73\u7d30 +ExplorerNodeActionVisitor.action.extUnallocToSingleFile=\u672a\u5272\u308a\u5f53\u3066\u9818\u57df\u5185\u306e\u30c7\u30fc\u30bf\u3092\u4e00\u3064\u306e\u30b7\u30f3\u30b0\u30eb\u30d5\u30a1\u30a4\u30eb\u306b\u62bd\u51fa +ExplorerNodeActionVisitor.volDetail.noVolMatchErr=\u30a8\u30e9\u30fc\uff1a\u4e00\u81f4\u3059\u308b\u30dc\u30ea\u30e5\u30fc\u30e0\u304c\u3042\u308a\u307e\u305b\u3093\u3002 +ExplorerNodeActionVisitor.imgDetail.noVolMatchesErr=\u30a8\u30e9\u30fc\uff1a\u4e00\u81f4\u3059\u308b\u30dc\u30ea\u30e5\u30fc\u30e0\u304c\u3042\u308a\u307e\u305b\u3093\u3002 +ExplorerNodeActionVisitor.exception.probGetParent.text={0}\: {1}\u304b\u3089\u30da\u30a2\u30ec\u30f3\u30c8\u3092\u53d6\u5f97\u3059\u308b\u969b\u306b\u554f\u984c\u304c\u767a\u751f\u3057\u307e\u3057\u305f +ExtractAction.title.extractFiles.text=\u30d5\u30a1\u30a4\u30eb\u3092\u62bd\u51fa +ExtractAction.extractFiles.cantCreateFolderErr.msg=\u6307\u5b9a\u3055\u308c\u305f\u30d5\u30a9\u30eb\u30c0\u3092\u4f5c\u6210\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 +ExtractAction.confDlg.destFileExist.msg=\u4fdd\u5b58\u5148\u306e\u30d5\u30a1\u30a4\u30eb{0}\u306f\u65e2\u306b\u5b58\u5728\u3057\u307e\u3059\u3001\u4e0a\u66f8\u304d\u3057\u307e\u3059\u304b\uff1f +ExtractAction.confDlg.destFileExist.title=\u30d5\u30a1\u30a4\u30eb\u304c\u5b58\u5728\u3057\u307e\u3059 +ExtractAction.msgDlg.cantOverwriteFile.msg=\u65e2\u5b58\u30d5\u30a1\u30a4\u30eb{0}\u3092\u4e0a\u66f8\u304d\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f +ExtractAction.notifyDlg.noFileToExtr.msg=\u62bd\u51fa\u3067\u304d\u308b\u30d5\u30a1\u30a4\u30eb\u304c\u3042\u308a\u307e\u305b\u3093\u3002 +ExtractAction.progress.extracting=\u62bd\u51fa\u4e2d +ExtractAction.progress.cancellingExtraction={0}\uff08\u30ad\u30e3\u30f3\u30bb\u30eb\u4e2d\u2026\uff09 +ExtractAction.done.notifyMsg.fileExtr.text=\u30d5\u30a1\u30a4\u30eb\u304c\u62bd\u51fa\u3055\u308c\u307e\u3057\u305f\u3002 +ExtractUnallocAction.notifyMsg.unallocAlreadyBeingExtr.msg=\u3053\u306e\u30a4\u30e1\u30fc\u30b8\u306e\u672a\u5272\u308a\u5f53\u3066\u9818\u57df\u306e\u30c7\u30fc\u30bf\u306f\u65e2\u306b\u62bd\u51fa\u4e2d\u3067\u3059\u3002\u5225\u306e\u30a4\u30e1\u30fc\u30b8\u3092\u9078\u629e\u3057\u3066\u4e0b\u3055\u3044\u3002 +ExtractUnallocAction.msgDlg.folderDoesntExist.msg=\u30d5\u30a9\u30eb\u30c0\u306f\u5b58\u5728\u3057\u307e\u305b\u3093\u3002\u7d9a\u884c\u3059\u308b\u524d\u306b\u6709\u52b9\u306a\u30d5\u30a9\u30eb\u30c0\u3092\u9078\u629e\u3057\u3066\u4e0b\u3055\u3044\u3002 +ExtractUnallocAction.dlgTitle.selectDirToSaveTo.msg=\u4fdd\u5b58\u5148\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u3092\u9078\u629e\u3057\u3066\u4e0b\u3055\u3044 +ExtractUnallocAction.confDlg.unallocFileAlreadyExist.msg=\u3053\u306e\u30dc\u30ea\u30e5\u30fc\u30e0\u306e\u672a\u5272\u308a\u5f53\u3066\u9818\u57df\u306e\u30d5\u30a1\u30a4\u30eb{0}\u306f\u65e2\u306b\u5b58\u5728\u3057\u307e\u3059\u3002\u65e2\u5b58\u306e\u30d5\u30a1\u30a4\u30eb\u3092\u7f6e\u304d\u63db\u3048\u307e\u3059\u304b\uff1f +ExtractUnallocAction.progress.extractUnalloc.title=\u672a\u5272\u308a\u5f53\u3066\u9818\u57df\u306e\u30c7\u30fc\u30bf\u3092\u62bd\u51fa\u4e2d +ExtractUnallocAction.progress.displayName.cancelling.text=\u672a\u5272\u308a\u5f53\u3066\u9818\u57df\u306e\u30c7\u30fc\u30bf\u3092\u62bd\u51fa\u4e2d\uff08\u30ad\u30e3\u30f3\u30bb\u30eb\u4e2d\u2026\uff09 +ExtractUnallocAction.processing.counter.msg=\u51e6\u7406\u4e2d\u3000{0}\uff0f{1} MBs +ExtractUnallocAction.done.notifyMsg.completedExtract.title=\u672a\u5272\u308a\u5f53\u3066\u9818\u57df\u306e\u62bd\u51fa\u304c\u5b8c\u4e86\u3057\u307e\u3057\u305f\u3002 +ExtractUnallocAction.done.notifyMsg.completedExtract.msg=\u30d5\u30a1\u30a4\u30eb\u306f{0}\u3078\u62bd\u51fa\u3055\u308c\u307e\u3057\u305f +ResultDeleteAction.actionPerf.confDlg.delAllResults.msg={0}\u306e\u7d50\u679c\u5168\u3066\u3092\u672c\u5f53\u306b\u524a\u9664\u3057\u307e\u3059\u304b\uff1f +ResultDeleteAction.actoinPerf.confDlg.delAllresults.details={0}\u7d50\u679c\u524a\u9664 +ResultDeleteAction.exception.invalidAction.msg=\u7121\u52b9\u306a\u30a2\u30af\u30b7\u30e7\u30f3\u30bf\u30a4\u30d7\uff1a{0} +ExtractUnallocAction.done.errMsg.title=\u62bd\u51fa\u30a8\u30e9\u30fc +ExtractUnallocAction.done.errMsg.msg=\u672a\u5272\u308a\u5f53\u3066\u9818\u57df\u306e\u62bd\u51fa\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\uff1a{0} +DirectoryTreeFilterNode.action.collapseAll.text=\u3059\u3079\u3066\u30b3\u30e9\u30d7\u30b9 +ExtractAction.done.notifyMsg.extractErr=\u4e0b\u8a18\u306e\u30d5\u30a1\u30a4\u30eb\u306e\u62bd\u51fa\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\uff1a {0} \ No newline at end of file diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/ChangeViewAction.java b/Core/src/org/sleuthkit/autopsy/directorytree/ChangeViewAction.java index 751948690f..59730b9133 100644 --- a/Core/src/org/sleuthkit/autopsy/directorytree/ChangeViewAction.java +++ b/Core/src/org/sleuthkit/autopsy/directorytree/ChangeViewAction.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"); @@ -28,7 +28,6 @@ import org.openide.util.actions.Presenter; import org.sleuthkit.autopsy.corecomponents.DataContentTopComponent; import org.sleuthkit.autopsy.corecomponents.DataContentViewerHex; import org.sleuthkit.autopsy.corecomponents.DataContentViewerString; -import org.sleuthkit.autopsy.coreutils.Logger; /** * The actions to change between the "Hex View" and "String View". @@ -57,8 +56,6 @@ import org.sleuthkit.autopsy.coreutils.Logger; */ @Override public void actionPerformed(ActionEvent e) { - Logger.noteAction(this.getClass()); - DataContentTopComponent dctc = DataContentTopComponent.findInstance(); int totalTabs = dctc.getTabPanels().getTabCount(); diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/CollapseAction.java b/Core/src/org/sleuthkit/autopsy/directorytree/CollapseAction.java index 9d27a8a20d..87bad119d2 100644 --- a/Core/src/org/sleuthkit/autopsy/directorytree/CollapseAction.java +++ b/Core/src/org/sleuthkit/autopsy/directorytree/CollapseAction.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,7 +24,6 @@ import org.openide.explorer.ExplorerManager; import org.openide.explorer.view.BeanTreeView; import org.openide.nodes.Children; import org.openide.nodes.Node; -import org.sleuthkit.autopsy.coreutils.Logger; /** * @@ -38,8 +37,6 @@ class CollapseAction extends AbstractAction { @Override public void actionPerformed(ActionEvent e) { - Logger.noteAction(this.getClass()); - ExplorerManager em = DirectoryTreeTopComponent.findInstance().getExplorerManager(); Node[] selectedNode = em.getSelectedNodes(); diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/DataResultFilterNode.java b/Core/src/org/sleuthkit/autopsy/directorytree/DataResultFilterNode.java index 4facc9603a..c564a73502 100755 --- a/Core/src/org/sleuthkit/autopsy/directorytree/DataResultFilterNode.java +++ b/Core/src/org/sleuthkit/autopsy/directorytree/DataResultFilterNode.java @@ -33,43 +33,40 @@ import javax.swing.AbstractAction; import javax.swing.Action; import org.openide.explorer.ExplorerManager; import org.openide.nodes.AbstractNode; -import org.openide.nodes.ChildFactory; import org.openide.nodes.FilterNode; import org.openide.nodes.Node; import org.openide.nodes.Sheet; import org.sleuthkit.autopsy.coreutils.ContextMenuExtensionPoint; import org.sleuthkit.autopsy.datamodel.AbstractAbstractFileNode.AbstractFilePropertyType; import org.sleuthkit.autopsy.datamodel.AbstractFsContentNode; -import org.sleuthkit.autopsy.datamodel.ArtifactTypeNode; import org.sleuthkit.autopsy.datamodel.BlackboardArtifactNode; -import org.sleuthkit.autopsy.datamodel.ContentTagTypeNode; import org.sleuthkit.autopsy.datamodel.LocalFileNode; import org.sleuthkit.autopsy.datamodel.DeletedContent.DeletedContentsChildren.DeletedContentNode; import org.sleuthkit.autopsy.datamodel.DeletedContent.DeletedContentsNode; import org.sleuthkit.autopsy.datamodel.DisplayableItemNode; import org.sleuthkit.autopsy.datamodel.DisplayableItemNodeVisitor; -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.ExtractedContentNode; +import org.sleuthkit.autopsy.datamodel.EmailExtracted.AccountNode; +import org.sleuthkit.autopsy.datamodel.EmailExtracted.FolderNode; +import org.sleuthkit.autopsy.datamodel.EmailExtracted; +import org.sleuthkit.autopsy.datamodel.ExtractedContent.TypeNode; +import org.sleuthkit.autopsy.datamodel.ExtractedContent; import org.sleuthkit.autopsy.datamodel.FileNode; import org.sleuthkit.autopsy.datamodel.FileTypeNode; 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.HashsetHits; +import org.sleuthkit.autopsy.datamodel.HashsetHits.HashsetNameNode; import org.sleuthkit.autopsy.datamodel.ImageNode; -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.datamodel.InterestingHits; +import org.sleuthkit.autopsy.datamodel.KeywordHits.TermNode; +import org.sleuthkit.autopsy.datamodel.KeywordHits.ListNode; import org.sleuthkit.autopsy.datamodel.VirtualDirectoryNode; import org.sleuthkit.autopsy.datamodel.LayoutFileNode; import org.sleuthkit.autopsy.datamodel.RecentFilesFilterNode; import org.sleuthkit.autopsy.datamodel.RecentFilesNode; import org.sleuthkit.autopsy.datamodel.FileTypesNode; -import org.sleuthkit.autopsy.datamodel.TagNameNode; +import org.sleuthkit.autopsy.datamodel.KeywordHits; +import org.sleuthkit.autopsy.datamodel.Tags; import org.sleuthkit.datamodel.AbstractFile; import org.sleuthkit.datamodel.BlackboardArtifact; import org.sleuthkit.datamodel.BlackboardAttribute; @@ -367,47 +364,47 @@ public class DataResultFilterNode extends FilterNode { } @Override - public AbstractAction visit(ExtractedContentNode ecn) { + public AbstractAction visit(ExtractedContent.RootNode ecn) { return openChild(ecn); } @Override - public AbstractAction visit(KeywordHitsRootNode khrn) { + public AbstractAction visit(KeywordHits.RootNode khrn) { return openChild(khrn); } @Override - public AbstractAction visit(HashsetHitsRootNode hhrn) { + public AbstractAction visit(HashsetHits.RootNode hhrn) { return openChild(hhrn); } @Override - public AbstractAction visit(HashsetHitsSetNode hhsn) { + public AbstractAction visit(HashsetNameNode hhsn) { return openChild(hhsn); } @Override - public AbstractAction visit(InterestingHitsRootNode iarn) { + public AbstractAction visit(InterestingHits.RootNode iarn) { return openChild(iarn); } @Override - public AbstractAction visit(InterestingHitsSetNode iasn) { + public AbstractAction visit(InterestingHits.SetNameNode iasn) { return openChild(iasn); } @Override - public AbstractAction visit(EmailExtractedRootNode eern) { + public AbstractAction visit(EmailExtracted.RootNode eern) { return openChild(eern); } @Override - public AbstractAction visit(EmailExtractedAccountNode eean) { + public AbstractAction visit(AccountNode eean) { return openChild(eean); } @Override - public AbstractAction visit(EmailExtractedFolderNode eefn) { + public AbstractAction visit(FolderNode eefn) { return openChild(eefn); } @@ -443,22 +440,22 @@ public class DataResultFilterNode extends FilterNode { } @Override - public AbstractAction visit(ArtifactTypeNode atn) { + public AbstractAction visit(TypeNode atn) { return openChild(atn); } @Override - public AbstractAction visit(TagNameNode node) { + public AbstractAction visit(Tags.TagNameNode node) { return openChild(node); } @Override - public AbstractAction visit(ContentTagTypeNode node) { + public AbstractAction visit(Tags.ContentTagTypeNode node) { return openChild(node); } @Override - public AbstractAction visit(BlackboardArtifactTagTypeNode node) { + public AbstractAction visit(Tags.BlackboardArtifactTagTypeNode node) { return openChild(node); } @@ -516,12 +513,12 @@ public class DataResultFilterNode extends FilterNode { } @Override - public AbstractAction visit(KeywordHitsListNode khsn) { + public AbstractAction visit(ListNode khsn) { return openChild(khsn); } @Override - public AbstractAction visit(KeywordHitsKeywordNode khmln) { + public AbstractAction visit(TermNode khmln) { return openChild(khmln); } diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeTopComponent.java b/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeTopComponent.java index f7067adf6e..d9e0d8eb3f 100644 --- a/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeTopComponent.java +++ b/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeTopComponent.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"); @@ -31,6 +31,8 @@ import java.util.Arrays; import java.util.LinkedList; import java.util.List; import java.util.logging.Level; +import java.util.prefs.PreferenceChangeEvent; +import java.util.prefs.PreferenceChangeListener; import org.sleuthkit.autopsy.coreutils.Logger; import javax.swing.Action; import javax.swing.JPanel; @@ -49,11 +51,11 @@ import org.openide.nodes.Node; import org.openide.nodes.NodeNotFoundException; import org.openide.nodes.NodeOp; import org.sleuthkit.autopsy.casemodule.Case; +import org.sleuthkit.autopsy.core.UserPreferences; import org.sleuthkit.autopsy.corecomponentinterfaces.BlackboardResultViewer; import org.sleuthkit.autopsy.corecomponents.DataResultTopComponent; import org.sleuthkit.autopsy.corecomponents.TableFilterNode; import org.sleuthkit.autopsy.datamodel.BlackboardArtifactNode; -import org.sleuthkit.autopsy.datamodel.ExtractedContentNode; import org.sleuthkit.autopsy.datamodel.DataSources; import org.sleuthkit.autopsy.datamodel.DataSourcesNode; import org.sleuthkit.autopsy.datamodel.KeywordHits; @@ -64,8 +66,6 @@ import org.sleuthkit.autopsy.datamodel.RootContentChildren; import org.sleuthkit.autopsy.datamodel.Views; import org.sleuthkit.autopsy.datamodel.ViewsNode; import org.sleuthkit.autopsy.ingest.IngestManager; -import org.sleuthkit.autopsy.ingest.IngestManager.IngestEvent; -import org.sleuthkit.autopsy.ingest.ModuleDataEvent; import org.sleuthkit.datamodel.BlackboardArtifact; import org.sleuthkit.datamodel.BlackboardAttribute; import org.sleuthkit.datamodel.Content; @@ -73,6 +73,7 @@ import org.sleuthkit.datamodel.SleuthkitCase; import org.sleuthkit.datamodel.TskCoreException; import org.sleuthkit.datamodel.TskException; import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil; +import org.sleuthkit.autopsy.datamodel.ExtractedContent; /** * Top component which displays something. @@ -111,25 +112,37 @@ public final class DirectoryTreeTopComponent extends TopComponent implements Dat setName(NbBundle.getMessage(DirectoryTreeTopComponent.class, "CTL_DirectoryTreeTopComponent")); setToolTipText(NbBundle.getMessage(DirectoryTreeTopComponent.class, "HINT_DirectoryTreeTopComponent")); - setListener(); + subscribeToChangeEvents(); associateLookup(ExplorerUtils.createLookup(em, getActionMap())); this.pcs = new PropertyChangeSupport(this); // set the back & forward list and also disable the back & forward button - this.backList = new LinkedList(); - this.forwardList = new LinkedList(); + this.backList = new LinkedList<>(); + this.forwardList = new LinkedList<>(); backButton.setEnabled(false); forwardButton.setEnabled(false); } /** - * Set the FileBrowserTopComponent as the listener to any property changes - * in the Case.java class + * Make this TopComponent a listener to various change events. */ - private void setListener() { - Case.addPropertyChangeListener(this);// add this class to listen to any changes in the Case.java class + private void subscribeToChangeEvents() { + UserPreferences.addChangeListener(new PreferenceChangeListener() { + @Override + public void preferenceChange(PreferenceChangeEvent evt) { + switch (evt.getKey()) { + case UserPreferences.HIDE_KNOWN_FILES_IN_DATA_SOURCES_TREE: + refreshContentTreeSafe(); + break; + case UserPreferences.HIDE_KNOWN_FILES_IN_VIEWS_TREE: + // TODO: Need a way to refresh the Views subtree + break; + } + } + }); + Case.addPropertyChangeListener(this); this.em.addPropertyChangeListener(this); IngestManager.getInstance().addIngestJobEventListener(this); IngestManager.getInstance().addIngestModuleEventListener(this); @@ -388,7 +401,7 @@ public final class DirectoryTreeTopComponent extends TopComponent implements Dat Children resultsChilds = results.getChildren(); tree.expandNode(resultsChilds.findChild(KeywordHits.NAME)); - tree.expandNode(resultsChilds.findChild(ExtractedContentNode.NAME)); + tree.expandNode(resultsChilds.findChild(ExtractedContent.NAME)); Node views = childNodes.findChild(ViewsNode.NAME); @@ -557,62 +570,27 @@ public final class DirectoryTreeTopComponent extends TopComponent implements Dat } // if the image is added to the case else if (changed.equals(Case.Events.DATA_SOURCE_ADDED.toString())) { componentOpened(); -// Image img = (Image)newValue; -// -// int[] imageIDs = Case.getCurrentCase().getImageIDs(); -// -// // add the first image -// if(imageIDs.length == 1){ -// -// } -// else{ -// // add the additional images -// ImageNode newNode = new ImageNode(img); -// ((ImageChildren)getOriginalRootContent().getChildren()).addNode(newNode); -// -// // expand the new added node -// int count = em.getRootContext().getChildren().getNodesCount(); -// em.setExploredContext(em.getRootContext().getChildren().getNodeAt(count - 1)); -// } - } // not supporting deleting images for now - // // if the image is removed from the case - // if(changed.equals(Case.CASE_DEL_IMAGE)){ - // if(Case.getCurrentCase().getImageIDs().length > 0){ - // // just remove the given image from the directory tree - // Image img = (Image)newValue; - // int ID = Integer.parseInt(oldValue.toString()); - // ImageNode tempNode = new ImageNode(img); - // ((ImageChildren)getOriginalRootContent().getChildren()).removeNode(tempNode); - // } - // } + } // change in node selection else if (changed.equals(ExplorerManager.PROP_SELECTED_NODES)) { respondSelection((Node[]) oldValue, (Node[]) newValue); - } else if (changed.equals(IngestEvent.DATA.toString())) { - final ModuleDataEvent event = (ModuleDataEvent) oldValue; - if (event.getArtifactType() == BlackboardArtifact.ARTIFACT_TYPE.TSK_GEN_INFO) { - return; - } + } + else if (changed.equals(IngestManager.IngestModuleEvent.DATA_ADDED.toString())) { + // nothing to do here. + // all nodes should be listening for these events and update accordingly. + } else if (changed.equals(IngestManager.IngestJobEvent.COMPLETED.toString()) + || changed.equals(IngestManager.IngestJobEvent.CANCELLED.toString())) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { - refreshTree(event.getArtifactType()); + refreshDataSourceTree(); } }); - } else if (changed.equals(IngestEvent.INGEST_JOB_COMPLETED.toString()) - || changed.equals(IngestEvent.INGEST_JOB_CANCELLED.toString())) { + } else if (changed.equals(IngestManager.IngestModuleEvent.CONTENT_CHANGED.toString())) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { - refreshContentTree(); - refreshTree(); - } - }); - } else if (changed.equals(IngestEvent.CONTENT_CHANGED.toString())) { - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - refreshContentTree(); + refreshDataSourceTree(); } }); } @@ -769,7 +747,7 @@ public final class DirectoryTreeTopComponent extends TopComponent implements Dat SwingUtilities.invokeLater(new Runnable() { @Override public void run() { - refreshContentTree(); + refreshDataSourceTree(); } }); } @@ -777,7 +755,7 @@ public final class DirectoryTreeTopComponent extends TopComponent implements Dat /** * Refreshes changed content nodes */ - void refreshContentTree() { + private void refreshDataSourceTree() { Node selectedNode = getSelectedNode(); final String[] selectedPath = NodeOp.createPath(selectedNode, em.getRootContext()); @@ -810,56 +788,52 @@ public final class DirectoryTreeTopComponent extends TopComponent implements Dat * Refreshes the nodes in the tree to reflect updates in the database should * be called in the gui thread */ - public void refreshTree(final BlackboardArtifact.ARTIFACT_TYPE... types) { - //save current selection - Node selectedNode = getSelectedNode(); - final String[] selectedPath = NodeOp.createPath(selectedNode, em.getRootContext()); - - //TODO: instead, we should choose a specific key to refresh? Maybe? - //contentChildren.refreshKeys(); - - Children dirChilds = em.getRootContext().getChildren(); - - Node results = dirChilds.findChild(ResultsNode.NAME); - - if (results == null) { - logger.log(Level.SEVERE, "Cannot find Results filter node, won't refresh the bb tree"); //NON-NLS - return; - } - OriginalNode original = results.getLookup().lookup(OriginalNode.class); - ResultsNode resultsNode = (ResultsNode) original.getNode(); - RootContentChildren resultsNodeChilds = (RootContentChildren) resultsNode.getChildren(); - resultsNodeChilds.refreshKeys(types); - - final TreeView tree = getTree(); - - tree.expandNode(results); - - Children resultsChilds = results.getChildren(); - - if (resultsChilds == null) //intermediate state check - { - return; - } - - Node childNode = resultsChilds.findChild(KeywordHits.NAME); - if (childNode == null) //intermediate state check - { - return; - } - tree.expandNode(childNode); - - childNode = resultsChilds.findChild(ExtractedContentNode.NAME); - if (childNode == null) //intermediate state check - { - return; - } - tree.expandNode(childNode); - - //restores selection if it was under the Results node - setSelectedNode(selectedPath, ResultsNode.NAME); - - } +// public void refreshResultsTree(final BlackboardArtifact.ARTIFACT_TYPE... types) { +// //save current selection +// Node selectedNode = getSelectedNode(); +// final String[] selectedPath = NodeOp.createPath(selectedNode, em.getRootContext()); +// +// //TODO: instead, we should choose a specific key to refresh? Maybe? +// //contentChildren.refreshKeys(); +// +// Children dirChilds = em.getRootContext().getChildren(); +// +// Node results = dirChilds.findChild(ResultsNode.NAME); +// if (results == null) { +// logger.log(Level.SEVERE, "Cannot find Results filter node, won't refresh the bb tree"); //NON-NLS +// return; +// } +// +// OriginalNode original = results.getLookup().lookup(OriginalNode.class); +// ResultsNode resultsNode = (ResultsNode) original.getNode(); +// RootContentChildren resultsNodeChilds = (RootContentChildren) resultsNode.getChildren(); +// resultsNodeChilds.refreshKeys(types); +// +// +// final TreeView tree = getTree(); +// // @@@ tree.expandNode(results); +// +// Children resultsChilds = results.getChildren(); +// if (resultsChilds == null) { +// return; +// } +// +// Node childNode = resultsChilds.findChild(KeywordHits.NAME); +// if (childNode == null) { +// return; +// } +// // @@@tree.expandNode(childNode); +// +// childNode = resultsChilds.findChild(ExtractedContent.NAME); +// if (childNode == null) { +// return; +// } +// tree.expandNode(childNode); +// +// //restores selection if it was under the Results node +// //@@@ setSelectedNode(selectedPath, ResultsNode.NAME); +// +// } /** * Set the selected node using a path to a previously selected node. @@ -984,7 +958,7 @@ public final class DirectoryTreeTopComponent extends TopComponent implements Dat logger.log(Level.WARNING, "Error retrieving attributes", ex); //NON-NLS } } else { - Node extractedContent = resultsChilds.findChild(ExtractedContentNode.NAME); + Node extractedContent = resultsChilds.findChild(ExtractedContent.NAME); Children extractedChilds = extractedContent.getChildren(); treeNode = extractedChilds.findChild(type.getLabel()); } diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/ExplorerNodeActionVisitor.java b/Core/src/org/sleuthkit/autopsy/directorytree/ExplorerNodeActionVisitor.java index d4bdbc0425..e3ce4831ac 100755 --- a/Core/src/org/sleuthkit/autopsy/directorytree/ExplorerNodeActionVisitor.java +++ b/Core/src/org/sleuthkit/autopsy/directorytree/ExplorerNodeActionVisitor.java @@ -1,7 +1,7 @@ /* * Autopsy Forensic Browser * - * Copyright 2011 - 2013 Basis Technology Corp. + * Copyright 2011-2014 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -54,7 +54,7 @@ public class ExplorerNodeActionVisitor extends ContentVisitor.Default getActions(Content c) { - List actions = new ArrayList(); + List actions = new ArrayList<>(); actions.addAll(c.accept(instance)); //TODO: fix this @@ -81,7 +81,7 @@ public class ExplorerNodeActionVisitor extends ContentVisitor.Default visit(final Image img) { - List lst = new ArrayList(); + List lst = new ArrayList<>(); lst.add(new ImageDetails( NbBundle.getMessage(this.getClass(), "ExplorerNodeActionVisitor.action.imgDetails.title"), img)); //TODO lst.add(new ExtractAction("Extract Image", img)); @@ -98,7 +98,7 @@ public class ExplorerNodeActionVisitor extends ContentVisitor.Default visit(final Volume vol) { - List lst = new ArrayList(); + List lst = new ArrayList<>(); lst.add(new VolumeDetails( NbBundle.getMessage(this.getClass(), "ExplorerNodeActionVisitor.action.volumeDetails.title"), vol)); lst.add(new ExtractUnallocAction( @@ -171,12 +171,9 @@ public class ExplorerNodeActionVisitor extends ContentVisitor.Default sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -29,7 +29,6 @@ import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.datamodel.ContentUtils; - /** * Extracts a File object to a temporary file in the case directory, and then * tries to open it in the user's system with the default associated @@ -70,8 +69,6 @@ public class ExternalViewerAction extends AbstractAction { @Override public void actionPerformed(ActionEvent e) { - Logger.noteAction(this.getClass()); - // Get the temp folder path of the case String tempPath = Case.getCurrentCase().getTempDirectory(); tempPath = tempPath + File.separator + this.fileObject.getName(); diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/NewWindowViewAction.java b/Core/src/org/sleuthkit/autopsy/directorytree/NewWindowViewAction.java index 8a76e0a5e7..6bbcfb781a 100644 --- a/Core/src/org/sleuthkit/autopsy/directorytree/NewWindowViewAction.java +++ b/Core/src/org/sleuthkit/autopsy/directorytree/NewWindowViewAction.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"); @@ -47,8 +47,6 @@ public class NewWindowViewAction extends AbstractAction{ @Override public void actionPerformed(ActionEvent e) { - Logger.noteAction(this.getClass()); - String name = "DataContent"; //NON-NLS String s = contentNode.getLookup().lookup(String.class); if (s != null) { diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/ResultDeleteAction.java b/Core/src/org/sleuthkit/autopsy/directorytree/ResultDeleteAction.java deleted file mode 100644 index f11024990c..0000000000 --- a/Core/src/org/sleuthkit/autopsy/directorytree/ResultDeleteAction.java +++ /dev/null @@ -1,193 +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.directorytree; - -import java.awt.event.ActionEvent; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.List; -import java.util.logging.Level; - -import org.openide.util.NbBundle; -import org.sleuthkit.autopsy.coreutils.Logger; -import javax.swing.AbstractAction; -import javax.swing.JOptionPane; -import org.sleuthkit.autopsy.casemodule.Case; -import org.sleuthkit.datamodel.BlackboardArtifact; -import org.sleuthkit.datamodel.BlackboardAttribute; -import org.sleuthkit.datamodel.SleuthkitCase; - -/** - * Action that deletes blackboard artifacts requested and reloads the view - * @deprecated do not use, it is here in case we ever pick up on this work - */ -@Deprecated - class ResultDeleteAction extends AbstractAction { - - private enum ActionType { - - SINGLE_ARTIFACT ///< deletes individual artifacts and assoc. attributes - , - MULT_ARTIFACTS ///< deletes multiple artifacts and assoc. attributes - , - TYPE_ARTIFACTS ///< deletes all artifacts by type and assoc. attributes - } - private BlackboardArtifact art; - private BlackboardArtifact.ARTIFACT_TYPE artType; - private List arts; - private ActionType actionType; - private static final Logger logger = Logger.getLogger(ResultDeleteAction.class.getName()); - - ResultDeleteAction(String title) { - super(title); - } - - ResultDeleteAction(String title, BlackboardArtifact art) { - this(title); - this.art = art; - this.actionType = ActionType.SINGLE_ARTIFACT; - } - - ResultDeleteAction(String title, List arts) { - this(title); - this.arts = arts; - this.actionType = ActionType.MULT_ARTIFACTS; - } - - ResultDeleteAction(String title, BlackboardArtifact.ARTIFACT_TYPE artType) { - this(title); - this.artType = artType; - this.actionType = ActionType.TYPE_ARTIFACTS; - } - - @Override - public void actionPerformed(ActionEvent e) { - if (actionType == ActionType.SINGLE_ARTIFACT) { - deleteArtifact(art); - DirectoryTreeTopComponent viewer = DirectoryTreeTopComponent.findInstance(); - viewer.refreshTree(BlackboardArtifact.ARTIFACT_TYPE.fromID(art.getArtifactTypeID())); - } - if (actionType == ActionType.MULT_ARTIFACTS) { - for (BlackboardArtifact art : arts) { - deleteArtifact(art); - } - DirectoryTreeTopComponent viewer = DirectoryTreeTopComponent.findInstance(); - viewer.refreshTree(BlackboardArtifact.ARTIFACT_TYPE.fromID(art.getArtifactTypeID())); - } else if (this.actionType == ActionType.TYPE_ARTIFACTS) { - if (JOptionPane.showConfirmDialog(null, - NbBundle.getMessage(this.getClass(), - "ResultDeleteAction.actionPerf.confDlg.delAllResults.msg", - artType.getDisplayName()), - NbBundle.getMessage(this.getClass(), - "ResultDeleteAction.actoinPerf.confDlg.delAllresults.details", - artType.getDisplayName()), JOptionPane.YES_NO_OPTION, - JOptionPane.QUESTION_MESSAGE) == JOptionPane.YES_OPTION) { - deleteArtifacts(artType); - DirectoryTreeTopComponent viewer = DirectoryTreeTopComponent.findInstance(); - viewer.refreshTree(artType); - } - } else { - throw new IllegalArgumentException( - NbBundle.getMessage(this.getClass(), "ResultDeleteAction.exception.invalidAction.msg", - this.actionType)); - } - } - - //TODO should be moved to SleuthkitCase and BlackboardArtifact API - @SuppressWarnings("deprecation") - private static void deleteArtifact(BlackboardArtifact art) { - final SleuthkitCase skCase = Case.getCurrentCase().getSleuthkitCase(); - final long artId = art.getArtifactID(); - try { - ResultSet rs = skCase.runQuery("DELETE from blackboard_attributes where artifact_id = " + Long.toString(artId)); //NON-NLS - skCase.closeRunQuery(rs); - - rs = skCase.runQuery("DELETE from blackboard_artifacts where artifact_id = " + Long.toString(artId)); //NON-NLS - skCase.closeRunQuery(rs); - - } catch (SQLException ex) { - logger.log(Level.WARNING, "Could not delete artifact by id: " + artId, ex); //NON-NLS - } - - } - - - @SuppressWarnings("deprecation") - private static void deleteArtifactsByAttributeValue(BlackboardArtifact.ARTIFACT_TYPE artType, - BlackboardAttribute.ATTRIBUTE_TYPE attrType, String value) { - - final SleuthkitCase skCase = Case.getCurrentCase().getSleuthkitCase(); - ResultSet rs = null; - try { - //first to select to get artifact ids to delete - //then join delete attrs - //then delete arts by id - rs = skCase.runQuery("DELETE FROM blackboard_attributes WHERE artifact_id IN " //NON-NLS - + "(SELECT blackboard_artifacts.artifact_id FROM blackboard_artifacts " //NON-NLS - + "INNER JOIN blackboard_attributes ON (blackboard_attributes.artifact_id = blackboard_artifacts.artifact_id) " //NON-NLS - + "WHERE blackboard_artifacts.artifact_type_id = " //NON-NLS - + Integer.toString(artType.getTypeID()) - + " AND blackboard_attributes.attribute_type_id = " + Integer.toString(attrType.getTypeID()) //NON-NLS - + " AND blackboard_attributes.value_type = " + BlackboardAttribute.TSK_BLACKBOARD_ATTRIBUTE_VALUE_TYPE.STRING.getType() //NON-NLS - + " AND blackboard_attributes.value_text = '" + value + "'" //NON-NLS - + ")"); - - - //rs = skCase.runQuery("DELETE from blackboard_artifacts where artifact_type_id = " - // + Integer.toString(artType.getTypeID())); - //skCase.closeRunQuery(rs); - - } catch (SQLException ex) { - logger.log(Level.WARNING, "Could not delete artifacts by type id: " + artType.getTypeID(), ex); //NON-NLS - } - finally { - if (rs != null) { - try { - skCase.closeRunQuery(rs); - } catch (SQLException ex) { - logger.log(Level.WARNING, "Error closing result set after deleting", ex); //NON-NLS - } - } - } - - } - - //TODO should be moved to SleuthkitCase - @SuppressWarnings("deprecation") - private static void deleteArtifacts(BlackboardArtifact.ARTIFACT_TYPE artType) { - // SELECT * from blackboard_attributes INNER JOIN blackboard_artifacts ON blackboard_artifacts.artifact_id = blackboard_attributes.artifact_ID AND blackboard_artifacts.artifact_type_id = 9; - final SleuthkitCase skCase = Case.getCurrentCase().getSleuthkitCase(); - try { - ResultSet rs = skCase.runQuery("DELETE FROM blackboard_attributes WHERE artifact_id IN " //NON-NLS - + "(SELECT blackboard_artifacts.artifact_id FROM blackboard_artifacts " //NON-NLS - + "INNER JOIN blackboard_attributes ON (blackboard_attributes.artifact_id = blackboard_artifacts.artifact_id) " //NON-NLS - + "WHERE blackboard_artifacts.artifact_type_id = " //NON-NLS - + Integer.toString(artType.getTypeID()) - + ")"); - skCase.closeRunQuery(rs); - - rs = skCase.runQuery("DELETE from blackboard_artifacts where artifact_type_id = " //NON-NLS - + Integer.toString(artType.getTypeID())); - skCase.closeRunQuery(rs); - - } catch (SQLException ex) { - logger.log(Level.WARNING, "Could not delete artifacts by type id: " + artType.getTypeID(), ex); //NON-NLS - } - } -} diff --git a/Core/src/org/sleuthkit/autopsy/examples/SampleDataSourceIngestModule.java b/Core/src/org/sleuthkit/autopsy/examples/SampleDataSourceIngestModule.java index 79dc70ce11..f719012610 100755 --- a/Core/src/org/sleuthkit/autopsy/examples/SampleDataSourceIngestModule.java +++ b/Core/src/org/sleuthkit/autopsy/examples/SampleDataSourceIngestModule.java @@ -29,7 +29,6 @@ */ package org.sleuthkit.autopsy.examples; -import java.util.HashMap; import java.util.List; import java.util.logging.Level; import org.sleuthkit.autopsy.casemodule.Case; @@ -46,42 +45,38 @@ import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.ingest.DataSourceIngestModule; import org.sleuthkit.autopsy.ingest.IngestJobContext; import org.sleuthkit.autopsy.ingest.IngestMessage; -import org.sleuthkit.autopsy.ingest.IngestModuleAdapter; import org.sleuthkit.autopsy.ingest.IngestServices; -import org.sleuthkit.autopsy.ingest.IngestModuleReferenceCounter; import org.sleuthkit.datamodel.TskData; /** * Sample data source ingest module that doesn't do much. Demonstrates per - * ingest job module settings, use of a subset of the available ingest services - * and thread-safe sharing of per ingest job data. + * ingest job module settings, checking for job cancellation, updating the + * DataSourceIngestModuleProgress object, and use of a subset of the available + * ingest services. */ -class SampleDataSourceIngestModule extends IngestModuleAdapter implements DataSourceIngestModule { +class SampleDataSourceIngestModule implements DataSourceIngestModule { - private static final HashMap fileCountsForIngestJobs = new HashMap<>(); private final boolean skipKnownFiles; private IngestJobContext context = null; - private static final IngestModuleReferenceCounter refCounter = new IngestModuleReferenceCounter(); SampleDataSourceIngestModule(SampleModuleIngestJobSettings settings) { this.skipKnownFiles = settings.skipKnownFiles(); } - + @Override public void startUp(IngestJobContext context) throws IngestModuleException { this.context = context; - - // This method is thread-safe with per ingest job reference counted - // management of shared data. - initFileCount(context.getJobId()); } @Override public ProcessResult process(Content dataSource, DataSourceIngestModuleProgress progressBar) { - // There are two tasks to do. Set the the progress bar to determinate - // and set the remaining number of work units to be completed to two. + if (context.isJobCancelled()) { + return IngestModule.ProcessResult.OK; + } + + // There are two tasks to do. progressBar.switchToDeterminate(2); - + Case autopsyCase = Case.getCurrentCase(); SleuthkitCase sleuthkitCase = autopsyCase.getSleuthkitCase(); Services services = new Services(sleuthkitCase); @@ -93,11 +88,14 @@ class SampleDataSourceIngestModule extends IngestModuleAdapter implements DataSo for (AbstractFile docFile : docFiles) { if (!skipKnownFiles || docFile.getKnown() != TskData.FileKnown.KNOWN) { ++fileCount; - } + } } - progressBar.progress(1); - + + if (context.isJobCancelled()) { + return IngestModule.ProcessResult.OK; + } + // Get files by creation time. long currentTime = System.currentTimeMillis() / 1000; long minTime = currentTime - (14 * 24 * 60 * 60); // Go back two weeks. @@ -105,16 +103,24 @@ class SampleDataSourceIngestModule extends IngestModuleAdapter implements DataSo for (FsContent otherFile : otherFiles) { if (!skipKnownFiles || otherFile.getKnown() != TskData.FileKnown.KNOWN) { ++fileCount; - } + } } - - // This method is thread-safe with per ingest job reference counted - // management of shared data. - addToFileCount(context.getJobId(), fileCount); - progressBar.progress(1); - return IngestModule.ProcessResult.OK; - + + if (context.isJobCancelled()) { + return IngestModule.ProcessResult.OK; + } + + // Post a message to the ingest messages in box. + String msgText = String.format("Found %d files", fileCount); + IngestMessage message = IngestMessage.createMessage( + IngestMessage.MessageType.DATA, + SampleIngestModuleFactory.getModuleName(), + msgText); + IngestServices.getInstance().postMessage(message); + + return IngestModule.ProcessResult.OK; + } catch (TskCoreException ex) { IngestServices ingestServices = IngestServices.getInstance(); Logger logger = ingestServices.getLogger(SampleIngestModuleFactory.getModuleName()); @@ -122,38 +128,4 @@ class SampleDataSourceIngestModule extends IngestModuleAdapter implements DataSo return IngestModule.ProcessResult.ERROR; } } - - @Override - public void shutDown(boolean ingestJobCancelled) { - // This method is thread-safe with per ingest job reference counted - // management of shared data. - postFileCount(context.getJobId()); - } - - synchronized static void initFileCount(long ingestJobId) { - Long refCount = refCounter.incrementAndGet(ingestJobId); - if (refCount == 1) { - fileCountsForIngestJobs.put(ingestJobId, 0L); - } - } - - synchronized static void addToFileCount(long ingestJobId, long countToAdd) { - Long fileCount = fileCountsForIngestJobs.get(ingestJobId); - fileCount += countToAdd; - fileCountsForIngestJobs.put(ingestJobId, fileCount); - } - - synchronized static void postFileCount(long ingestJobId) { - Long refCount = refCounter.decrementAndGet(ingestJobId); - if (refCount == 0) { - Long filesCount = fileCountsForIngestJobs.remove(ingestJobId); - String msgText = String.format("Found %d files", filesCount); - IngestMessage message = IngestMessage.createMessage( - IngestMessage.MessageType.DATA, - SampleIngestModuleFactory.getModuleName(), - msgText); - IngestServices.getInstance().postMessage(message); - } - } - } diff --git a/Core/src/org/sleuthkit/autopsy/examples/SampleFileIngestModule.java b/Core/src/org/sleuthkit/autopsy/examples/SampleFileIngestModule.java index 8a95750924..150fe4c314 100755 --- a/Core/src/org/sleuthkit/autopsy/examples/SampleFileIngestModule.java +++ b/Core/src/org/sleuthkit/autopsy/examples/SampleFileIngestModule.java @@ -37,7 +37,6 @@ import org.sleuthkit.autopsy.ingest.FileIngestModule; import org.sleuthkit.autopsy.ingest.IngestModule; import org.sleuthkit.autopsy.ingest.IngestJobContext; import org.sleuthkit.autopsy.ingest.IngestMessage; -import org.sleuthkit.autopsy.ingest.IngestModuleAdapter; import org.sleuthkit.autopsy.ingest.IngestServices; import org.sleuthkit.autopsy.ingest.ModuleDataEvent; import org.sleuthkit.autopsy.ingest.IngestModuleReferenceCounter; @@ -54,7 +53,7 @@ import org.sleuthkit.datamodel.TskData; * module settings, use of a subset of the available ingest services and * thread-safe sharing of per ingest job data. */ -class SampleFileIngestModule extends IngestModuleAdapter implements FileIngestModule { +class SampleFileIngestModule implements FileIngestModule { private static final HashMap artifactCountsForIngestJobs = new HashMap<>(); private static int attrId = -1; @@ -159,21 +158,23 @@ class SampleFileIngestModule extends IngestModuleAdapter implements FileIngestMo } @Override - public void shutDown(boolean ingestJobCancelled) { - // This method is thread-safe with per ingest job reference counted - // management of shared data. - reportBlackboardPostCount(context.getJobId()); + public void shutDown() { + if (!context.isJobCancelled()) { + // This method is thread-safe with per ingest job reference counted + // management of shared data. + reportBlackboardPostCount(context.getJobId()); + } } synchronized static void addToBlackboardPostCount(long ingestJobId, long countToAdd) { Long fileCount = artifactCountsForIngestJobs.get(ingestJobId); - + // Ensures that this job has an entry if (fileCount == null) { fileCount = 0L; artifactCountsForIngestJobs.put(ingestJobId, fileCount); } - + fileCount += countToAdd; artifactCountsForIngestJobs.put(ingestJobId, fileCount); } @@ -189,5 +190,5 @@ class SampleFileIngestModule extends IngestModuleAdapter implements FileIngestMo msgText); IngestServices.getInstance().postMessage(message); } - } + } } diff --git a/Core/src/org/sleuthkit/autopsy/examples/SampleModuleIngestJobSettings.java b/Core/src/org/sleuthkit/autopsy/examples/SampleModuleIngestJobSettings.java index 83339dbc6f..7f415d3948 100755 --- a/Core/src/org/sleuthkit/autopsy/examples/SampleModuleIngestJobSettings.java +++ b/Core/src/org/sleuthkit/autopsy/examples/SampleModuleIngestJobSettings.java @@ -37,6 +37,7 @@ import org.sleuthkit.autopsy.ingest.IngestModuleIngestJobSettings; */ public class SampleModuleIngestJobSettings implements IngestModuleIngestJobSettings { + private static final long serialVersionUID = 1L; private boolean skipKnownFiles = true; SampleModuleIngestJobSettings() { @@ -47,8 +48,8 @@ public class SampleModuleIngestJobSettings implements IngestModuleIngestJobSetti } @Override - public String getVersionNumber() { - return "1.0"; //NON-NLS + public long getVersionNumber() { + return serialVersionUID; } void setSkipKnownFiles(boolean enabled) { diff --git a/Core/src/org/sleuthkit/autopsy/ingest/Bundle.properties b/Core/src/org/sleuthkit/autopsy/ingest/Bundle.properties old mode 100644 new mode 100755 index 253f4f390d..556487b1bb --- a/Core/src/org/sleuthkit/autopsy/ingest/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/ingest/Bundle.properties @@ -16,8 +16,9 @@ IngestMessagePanel.totalMessagesNameLabel.text=Total: IngestMessagePanel.totalMessagesNameVal.text=- IngestMessagePanel.totalUniqueMessagesNameLabel.text=Unique: IngestMessagePanel.totalUniqueMessagesNameVal.text=- -IngestJob.progress.dataSourceIngest.displayName=Data Source Ingest of {0} -IngestJob.progress.fileIngest.displayName=File Ingest of {0} +IngestJob.progress.dataSourceIngest.initialDisplayName=Analyzing {0} +IngestJob.progress.dataSourceIngest.displayName={0} for {1} +IngestJob.progress.fileIngest.displayName=Analyzing files from {0} IngestJob.progress.cancelling={0} (Cancelling...) IngestJobConfigurationPanel.processUnallocCheckbox.toolTipText=Processes unallocated space, such as deleted files. Produces more complete results, but it may take longer to process on large images. IngestJobConfigurationPanel.processUnallocCheckbox.text=Process Unallocated Space @@ -66,3 +67,10 @@ IngestManager.StartIngestJobsTask.run.startupErr.dlgErrorList=Errors\: \ \ {0} IngestManager.StartIngestJobsTask.run.startupErr.dlgTitle=Ingest Failure +IngestJobConfigurator.createModuleSettingsFolderForContext.exception.msg=Failed to create ingest module settings folder, cannot save settings. +IngestJobConfigurator.createModuleSettingsFolderForContext.exception.title=Ingest Job Initialization Failure +IngestJobConfigurator.loadJobSettings.usermsg.text=Failed to load saved ingest job settings for {0} module, using defaults. +IngestJobConfigurator.loadJobSettings.usermsg.title=Ingest Job Settings +IngestJobConfigurator.saveJobSettings.usermsg=Failed to save ingest job settings for {0} module. +IngestJobConfigurator.saveJobSettings.usermsg.title=Ingest Job Settings +IngestJobConfigurationPanel.descriptionLabel.text= diff --git a/Core/src/org/sleuthkit/autopsy/ingest/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/ingest/Bundle_ja.properties index c6a50ca915..da2cdc2783 100644 --- a/Core/src/org/sleuthkit/autopsy/ingest/Bundle_ja.properties +++ b/Core/src/org/sleuthkit/autopsy/ingest/Bundle_ja.properties @@ -1,64 +1,70 @@ -CTL_IngestMessageTopComponent=\u30e1\u30c3\u30bb\u30fc\u30b8 -HINT_IngestMessageTopComponent=\u30e1\u30c3\u30bb\u30fc\u30b8\u30a6\u30a3\u30f3\u30c9\u30a6 -IngestDialog.closeButton.title=\u9589\u3058\u308b -IngestDialog.startButton.title=\u30b9\u30bf\u30fc\u30c8 -IngestDialog.title.text=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb -IngestJob.progress.cancelling={0}\uff08\u30ad\u30e3\u30f3\u30bb\u30eb\u4e2d\u2026\uff09 -IngestJob.progress.dataSourceIngest.displayName={0}\u306e\u30c7\u30fc\u30bf\u30bd\u30fc\u30b9\u3092\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8 -IngestJob.progress.fileIngest.displayName={0}\u306e\u30d5\u30a1\u30a4\u30eb\u3092\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8 -IngestJobConfigurationPanel.advancedButton.actionCommand=\u30a2\u30c9\u30d0\u30f3\u30b9 -IngestJobConfigurationPanel.advancedButton.text=\u30a2\u30c9\u30d0\u30f3\u30b9 -IngestJobConfigurationPanel.processUnallocCheckbox.text=\u672a\u5272\u308a\u5f53\u3066\u9818\u57df\u306e\u51e6\u7406 -IngestJobConfigurationPanel.processUnallocCheckbox.toolTipText=\u524a\u9664\u3055\u308c\u305f\u30d5\u30a1\u30a4\u30eb\u7b49\u306e\u672a\u5272\u308a\u5f53\u3066\u9818\u57df\u3092\u51e6\u7406\u3002\u3088\u308a\u5b8c\u5168\u306a\u7d50\u679c\u304c\u51fa\u307e\u3059\u304c\u3001\u5927\u304d\u3044\u30a4\u30e1\u30fc\u30b8\u3067\u306f\u51e6\u7406\u6642\u9593\u304c\u9577\u304f\u306a\u308b\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u3002 -IngestManager.moduleErr=\u30e2\u30b8\u30e5\u30fc\u30eb\u30a8\u30e9\u30fc -IngestManager.moduleErr.errListenToUpdates.msg=Ingest Manager\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 -IngestManager.StartIngestJobsTask.run.cancelling={0}\uff08\u30ad\u30e3\u30f3\u30bb\u30eb\u4e2d\u2026\uff09 -IngestManager.StartIngestJobsTask.run.catchException.msg=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u306e\u958b\u59cb\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002\u7d50\u679c\u304c\u4e00\u90e8\u306e\u3082\u306e -IngestManager.StartIngestJobsTask.run.displayName=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30bf\u30b9\u30af\u3092\u30ad\u30e5\u30fc\u30a4\u30f3\u30b0 -IngestMessage.exception.srcSubjDetailsDataNotNull.msg=\u30bd\u30fc\u30b9\u3001\u30b5\u30d6\u30b8\u30a7\u30af\u30c8\u3001\u8a73\u7d30\u304a\u3088\u3073\u30c7\u30fc\u30bf\u306f\u30cc\u30eb\u3067\u3042\u3063\u3066\u306f\u3044\u3051\u307e\u305b\u3093 -IngestMessage.exception.srcSubjNotNull.msg=\u30bd\u30fc\u30b9\u304a\u3088\u3073\u30b5\u30d6\u30b8\u30a7\u30af\u30c8\u306f\u30cc\u30eb\u3067\u3042\u3063\u3066\u306f\u3044\u3051\u307e\u305b\u3093 -IngestMessage.exception.typeSrcSubjNotNull.msg=\u30e1\u30c3\u30bb\u30fc\u30b8\u30bf\u30a4\u30d7\u3001\u30bd\u30fc\u30b9\u304a\u3088\u3073\u30b5\u30d6\u30b8\u30a7\u30af\u30c8\u306f\u30cc\u30eb\u3067\u3042\u3063\u3066\u306f\u3044\u3051\u307e\u305b\u3093 -IngestMessage.toString.data.text=\ \u30c7\u30fc\u30bf\uff1a{0} -IngestMessage.toString.date.text=\ \u65e5\u4ed8\uff1a{0} -IngestMessage.toString.details.text=\ \u8a73\u7d30\uff1a{0} -IngestMessage.toString.subject.text=\ \u30b5\u30d6\u30b8\u30a7\u30af\u30c8\uff1a{0} -IngestMessage.toString.type.text=\u30bf\u30a4\u30d7\uff1a{0} -IngestMessageDetailsPanel.copyMenuItem.text=\u30b3\u30d4\u30fc -IngestMessageDetailsPanel.messageDetailsPane.contentType=\u30c6\u30ad\u30b9\u30c8\uff0fhtml -IngestMessageDetailsPanel.selectAllMenuItem.text=\u3059\u3079\u3066\u9078\u629e -IngestMessageDetailsPanel.viewArtifactButton.text=\u7d50\u679c\u3078\u79fb\u52d5 -IngestMessageDetailsPanel.viewContentButton.text=\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u3078\u79fb\u52d5 -IngestMessagePanel.BooleanRenderer.exception.nonBoolVal.msg=\u30d6\u30fc\u30eb\u5024\u3067\u306f\u306a\u3044\u3082\u306e\u306bBooleanRenderer\u3092\u4f7f\u7528\u3057\u3088\u3046\u3068\u3057\u307e\u3057\u305f -IngestMessagePanel.DateRenderer.exception.nonDateVal.text=\u65e5\u4ed8\u3067\u306f\u306a\u3044\u3082\u306e\u306bDateRenderer\u3092\u4f7f\u7528\u3057\u3088\u3046\u3068\u3057\u307e\u3057\u305f\u3002 -IngestMessagePanel.moduleErr=\u30e2\u30b8\u30e5\u30fc\u30eb\u30a8\u30e9\u30fc -IngestMessagePanel.moduleErr.errListenUpdates.text=IngestMessagePanel\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 -IngestMessagePanel.MsgTableMod.colNames.module=\u30e2\u30b8\u30e5\u30fc\u30eb -IngestMessagePanel.MsgTableMod.colNames.new=\u65b0\u898f\uff1f -IngestMessagePanel.MsgTableMod.colNames.num=\u756a\u53f7 -IngestMessagePanel.MsgTableMod.colNames.subject=\u30b5\u30d6\u30b8\u30a7\u30af\u30c8 -IngestMessagePanel.MsgTableMod.colNames.timestamp=\u30bf\u30a4\u30e0\u30b9\u30bf\u30f3\u30d7 -IngestMessagePanel.sortByComboBox.model.priority=\u512a\u5148\u5ea6 +CTL_IngestMessageTopComponent=\u30E1\u30C3\u30BB\u30FC\u30B8 +HINT_IngestMessageTopComponent=\u30E1\u30C3\u30BB\u30FC\u30B8\u30A6\u30A3\u30F3\u30C9\u30A6 +IngestDialog.closeButton.title=\u9589\u3058\u308B +IngestDialog.startButton.title=\u30B9\u30BF\u30FC\u30C8 +IngestDialog.title.text=\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u30E2\u30B8\u30E5\u30FC\u30EB +IngestJob.progress.cancelling={0}\uFF08\u30AD\u30E3\u30F3\u30BB\u30EB\u4E2D\u2026\uFF09 +IngestJob.progress.dataSourceIngest.displayName={0}\u306E\u30C7\u30FC\u30BF\u30BD\u30FC\u30B9\u3092\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8 +IngestJob.progress.fileIngest.displayName={0}\u306E\u30D5\u30A1\u30A4\u30EB\u3092\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8 +IngestJobConfigurationPanel.advancedButton.actionCommand=\u30A2\u30C9\u30D0\u30F3\u30B9 +IngestJobConfigurationPanel.advancedButton.text=\u30A2\u30C9\u30D0\u30F3\u30B9 +IngestJobConfigurationPanel.processUnallocCheckbox.text=\u672A\u5272\u308A\u5F53\u3066\u9818\u57DF\u306E\u51E6\u7406 +IngestJobConfigurationPanel.processUnallocCheckbox.toolTipText=\u524A\u9664\u3055\u308C\u305F\u30D5\u30A1\u30A4\u30EB\u7B49\u306E\u672A\u5272\u308A\u5F53\u3066\u9818\u57DF\u3092\u51E6\u7406\u3002\u3088\u308A\u5B8C\u5168\u306A\u7D50\u679C\u304C\u51FA\u307E\u3059\u304C\u3001\u5927\u304D\u3044\u30A4\u30E1\u30FC\u30B8\u3067\u306F\u51E6\u7406\u6642\u9593\u304C\u9577\u304F\u306A\u308B\u304B\u3082\u3057\u308C\u307E\u305B\u3093\u3002 +IngestManager.moduleErr=\u30E2\u30B8\u30E5\u30FC\u30EB\u30A8\u30E9\u30FC +IngestManager.moduleErr.errListenToUpdates.msg=Ingest Manager\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 +IngestManager.StartIngestJobsTask.run.cancelling={0}\uFF08\u30AD\u30E3\u30F3\u30BB\u30EB\u4E2D\u2026\uFF09 +IngestManager.StartIngestJobsTask.run.catchException.msg=\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u306E\u958B\u59CB\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002\u7D50\u679C\u304C\u4E00\u90E8\u306E\u3082\u306E +IngestManager.StartIngestJobsTask.run.displayName=\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u30BF\u30B9\u30AF\u3092\u30AD\u30E5\u30FC\u30A4\u30F3\u30B0 +IngestMessage.exception.srcSubjDetailsDataNotNull.msg=\u30BD\u30FC\u30B9\u3001\u30B5\u30D6\u30B8\u30A7\u30AF\u30C8\u3001\u8A73\u7D30\u304A\u3088\u3073\u30C7\u30FC\u30BF\u306F\u30CC\u30EB\u3067\u3042\u3063\u3066\u306F\u3044\u3051\u307E\u305B\u3093 +IngestMessage.exception.srcSubjNotNull.msg=\u30BD\u30FC\u30B9\u304A\u3088\u3073\u30B5\u30D6\u30B8\u30A7\u30AF\u30C8\u306F\u30CC\u30EB\u3067\u3042\u3063\u3066\u306F\u3044\u3051\u307E\u305B\u3093 +IngestMessage.exception.typeSrcSubjNotNull.msg=\u30E1\u30C3\u30BB\u30FC\u30B8\u30BF\u30A4\u30D7\u3001\u30BD\u30FC\u30B9\u304A\u3088\u3073\u30B5\u30D6\u30B8\u30A7\u30AF\u30C8\u306F\u30CC\u30EB\u3067\u3042\u3063\u3066\u306F\u3044\u3051\u307E\u305B\u3093 +IngestMessage.toString.data.text=\ \u30C7\u30FC\u30BF\uFF1A{0} +IngestMessage.toString.date.text=\ \u65E5\u4ED8\uFF1A{0} +IngestMessage.toString.details.text=\ \u8A73\u7D30\uFF1A{0} +IngestMessage.toString.subject.text=\ \u30B5\u30D6\u30B8\u30A7\u30AF\u30C8\uFF1A{0} +IngestMessage.toString.type.text=\u30BF\u30A4\u30D7\uFF1A{0} +IngestMessageDetailsPanel.copyMenuItem.text=\u30B3\u30D4\u30FC +IngestMessageDetailsPanel.messageDetailsPane.contentType=\u30C6\u30AD\u30B9\u30C8\uFF0Fhtml +IngestMessageDetailsPanel.selectAllMenuItem.text=\u3059\u3079\u3066\u9078\u629E +IngestMessageDetailsPanel.viewArtifactButton.text=\u7D50\u679C\u3078\u79FB\u52D5 +IngestMessageDetailsPanel.viewContentButton.text=\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u3078\u79FB\u52D5 +IngestMessagePanel.BooleanRenderer.exception.nonBoolVal.msg=\u30D6\u30FC\u30EB\u5024\u3067\u306F\u306A\u3044\u3082\u306E\u306BBooleanRenderer\u3092\u4F7F\u7528\u3057\u3088\u3046\u3068\u3057\u307E\u3057\u305F +IngestMessagePanel.DateRenderer.exception.nonDateVal.text=\u65E5\u4ED8\u3067\u306F\u306A\u3044\u3082\u306E\u306BDateRenderer\u3092\u4F7F\u7528\u3057\u3088\u3046\u3068\u3057\u307E\u3057\u305F\u3002 +IngestMessagePanel.moduleErr=\u30E2\u30B8\u30E5\u30FC\u30EB\u30A8\u30E9\u30FC +IngestMessagePanel.moduleErr.errListenUpdates.text=IngestMessagePanel\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 +IngestMessagePanel.MsgTableMod.colNames.module=\u30E2\u30B8\u30E5\u30FC\u30EB +IngestMessagePanel.MsgTableMod.colNames.new=\u65B0\u898F\uFF1F +IngestMessagePanel.MsgTableMod.colNames.num=\u756A\u53F7 +IngestMessagePanel.MsgTableMod.colNames.subject=\u30B5\u30D6\u30B8\u30A7\u30AF\u30C8 +IngestMessagePanel.MsgTableMod.colNames.timestamp=\u30BF\u30A4\u30E0\u30B9\u30BF\u30F3\u30D7 +IngestMessagePanel.sortByComboBox.model.priority=\u512A\u5148\u5EA6 IngestMessagePanel.sortByComboBox.model.time=\u6642\u9593 -IngestMessagePanel.sortByComboBox.toolTipText=\u6642\u9593\u9806\uff08\u6642\u7cfb\u5217\uff09\u307e\u305f\u306f\u30e1\u30c3\u30bb\u30fc\u30b8\u306e\u512a\u5148\u5ea6\u3067\u30bd\u30fc\u30c8 -IngestMessagePanel.sortByLabel.text=\u4e0b\u8a18\u3067\u30bd\u30fc\u30c8\uff1a -IngestMessagePanel.totalMessagesNameLabel.text=\u5408\u8a08\uff1a +IngestMessagePanel.sortByComboBox.toolTipText=\u6642\u9593\u9806\uFF08\u6642\u7CFB\u5217\uFF09\u307E\u305F\u306F\u30E1\u30C3\u30BB\u30FC\u30B8\u306E\u512A\u5148\u5EA6\u3067\u30BD\u30FC\u30C8 +IngestMessagePanel.sortByLabel.text=\u4E0B\u8A18\u3067\u30BD\u30FC\u30C8\uFF1A +IngestMessagePanel.totalMessagesNameLabel.text=\u5408\u8A08\uFF1A IngestMessagePanel.totalMessagesNameVal.text=- -IngestMessagePanel.totalUniqueMessagesNameLabel.text=\u30e6\u30cb\u30fc\u30af\uff1a +IngestMessagePanel.totalUniqueMessagesNameLabel.text=\u30E6\u30CB\u30FC\u30AF\uFF1A IngestMessagePanel.totalUniqueMessagesNameVal.text=- -IngestMessagesToolbar.customizeButton.toolTipText=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e1\u30c3\u30bb\u30fc\u30b8 -IngestMessageTopComponent.displayName=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30a4\u30f3\u30dc\u30c3\u30af\u30b9 -IngestMessageTopComponent.displayReport.option.GenRpt=\u30ec\u30dd\u30fc\u30c8\u751f\u6210 +IngestMessagesToolbar.customizeButton.toolTipText=\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u30E1\u30C3\u30BB\u30FC\u30B8 +IngestMessageTopComponent.displayName=\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u30A4\u30F3\u30DC\u30C3\u30AF\u30B9 +IngestMessageTopComponent.displayReport.option.GenRpt=\u30EC\u30DD\u30FC\u30C8\u751F\u6210 IngestMessageTopComponent.displayReport.option.OK=OK -IngestMessageTopComponent.initComponents.name=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30a4\u30f3\u30dc\u30c3\u30af\u30b9 -IngestMessageTopComponent.msgDlg.ingestRpt.text=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30ec\u30dd\u30fc\u30c8 -IngestMonitor.mgrErrMsg.lowDiskSpace.msg=\u30c7\u30a3\u30b9\u30af{0}\u306e\u30c7\u30a3\u30b9\u30af\u9818\u57df\u4e0d\u8db3\u306e\u305f\u3081\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u3092\u4e2d\u6b62\u3057\u307e\u3059\u3002\ -\u30b1\u30fc\u30b9\u30c9\u30e9\u30a4\u30d6\u306b\u6700\u4f4e1GB\u306e\u7a7a\u304d\u9818\u57df\u304c\u3042\u308b\u306e\u3092\u78ba\u8a8d\u3057\u3001\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u3092\u518d\u30b9\u30bf\u30fc\u30c8\u3057\u3066\u4e0b\u3055\u3044\u3002 -IngestMonitor.mgrErrMsg.lowDiskSpace.title=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u304c\u4e2d\u6b62\u3055\u308c\u307e\u3057\u305f\u30fc{0}\u306e\u30c7\u30a3\u30b9\u30af\u9818\u57df\u4e0d\u8db3 -IngestScheduler.DataSourceScheduler.toString.size=DataSourceQueue, \u30b5\u30a4\u30ba\uff1a -OpenIDE-Module-Name=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8 -IngestManager.StartIngestJobsTask.run.startupErr.dlgErrorList=\u30a8\u30e9\u30fc\uff1a\ +IngestMessageTopComponent.initComponents.name=\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u30A4\u30F3\u30DC\u30C3\u30AF\u30B9 +IngestMessageTopComponent.msgDlg.ingestRpt.text=\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u30EC\u30DD\u30FC\u30C8 +IngestMonitor.mgrErrMsg.lowDiskSpace.msg=\u30C7\u30A3\u30B9\u30AF{0}\u306E\u30C7\u30A3\u30B9\u30AF\u9818\u57DF\u4E0D\u8DB3\u306E\u305F\u3081\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u3092\u4E2D\u6B62\u3057\u307E\u3059\u3002\ +\u30B1\u30FC\u30B9\u30C9\u30E9\u30A4\u30D6\u306B\u6700\u4F4E1GB\u306E\u7A7A\u304D\u9818\u57DF\u304C\u3042\u308B\u306E\u3092\u78BA\u8A8D\u3057\u3001\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u3092\u518D\u30B9\u30BF\u30FC\u30C8\u3057\u3066\u4E0B\u3055\u3044\u3002 +IngestMonitor.mgrErrMsg.lowDiskSpace.title=\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u304C\u4E2D\u6B62\u3055\u308C\u307E\u3057\u305F\u30FC{0}\u306E\u30C7\u30A3\u30B9\u30AF\u9818\u57DF\u4E0D\u8DB3 +IngestScheduler.DataSourceScheduler.toString.size=DataSourceQueue, \u30B5\u30A4\u30BA\uFF1A +OpenIDE-Module-Name=\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8 +IngestManager.StartIngestJobsTask.run.startupErr.dlgErrorList=\u30A8\u30E9\u30FC\uFF1A\ \ {0} -IngestManager.StartIngestJobsTask.run.startupErr.dlgMsg=\uff11\u3064\u307e\u305f\u306f\u8907\u6570\u306e\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb\u3092\u30b9\u30bf\u30fc\u30c8\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30b8\u30e7\u30d6\u306f\u30ad\u30e3\u30f3\u30bb\u30eb\u3055\u308c\u307e\u3057\u305f\u3002 -IngestManager.StartIngestJobsTask.run.startupErr.dlgSolution=\u5931\u6557\u3057\u305f\u30e2\u30b8\u30e5\u30fc\u30eb\u3092\u7121\u52b9\u5316\u3059\u308b\u304b\u30a8\u30e9\u30fc\u3092\u89e3\u6c7a\u3057\u3001\u305d\u306e\u5f8c\u30c7\u30fc\u30bf\u30bd\u30fc\u30b9\u3092\u53f3\u30af\u30ea\u30c3\u30af\u3057\u3001\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb\u3092\u5b9f\u884c\u3092\u9078\u629e\u3057\u3066\u3001\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u3092\u30ea\u30b9\u30bf\u30fc\u30c8\u3057\u3066\u4e0b\u3055\u3044\u3002 -IngestManager.StartIngestJobsTask.run.startupErr.dlgTitle=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u5931\u6557 \ No newline at end of file +IngestManager.StartIngestJobsTask.run.startupErr.dlgMsg=\uFF11\u3064\u307E\u305F\u306F\u8907\u6570\u306E\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u30E2\u30B8\u30E5\u30FC\u30EB\u3092\u30B9\u30BF\u30FC\u30C8\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u30B8\u30E7\u30D6\u306F\u30AD\u30E3\u30F3\u30BB\u30EB\u3055\u308C\u307E\u3057\u305F\u3002 +IngestManager.StartIngestJobsTask.run.startupErr.dlgSolution=\u5931\u6557\u3057\u305F\u30E2\u30B8\u30E5\u30FC\u30EB\u3092\u7121\u52B9\u5316\u3059\u308B\u304B\u30A8\u30E9\u30FC\u3092\u89E3\u6C7A\u3057\u3001\u305D\u306E\u5F8C\u30C7\u30FC\u30BF\u30BD\u30FC\u30B9\u3092\u53F3\u30AF\u30EA\u30C3\u30AF\u3057\u3001\u300C\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u30E2\u30B8\u30E5\u30FC\u30EB\u5B9F\u884C\u300D\u3092\u9078\u629E\u3057\u3066\u3001\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u3092\u30EA\u30B9\u30BF\u30FC\u30C8\u3057\u3066\u4E0B\u3055\u3044\u3002 +IngestManager.StartIngestJobsTask.run.startupErr.dlgTitle=\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u5931\u6557 +IngestJobConfigurator.createModuleSettingsFolderForContext.exception.msg=\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u30E2\u30B8\u30E5\u30FC\u30EB\u8A2D\u5B9A\u30D5\u30A9\u30EB\u30C0\u306E\u4F5C\u6210\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002\u8A2D\u5B9A\u3092\u4FDD\u5B58\u3067\u304D\u307E\u305B\u3093\u3002 +IngestJobConfigurator.createModuleSettingsFolderForContext.exception.title=\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u30B8\u30E7\u30D6\u521D\u671F\u5316\u306E\u5931\u6557 +IngestJobConfigurator.loadJobSettings.usermsg.text={0}\u30E2\u30B8\u30E5\u30FC\u30EB\u306E\u4FDD\u5B58\u3055\u308C\u305F\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u30B8\u30E7\u30D6\u8A2D\u5B9A\u306E\u30ED\u30FC\u30C9\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002\u30C7\u30D5\u30A9\u30EB\u30C8\u8A2D\u5B9A\u3092\u4F7F\u7528\u3057\u307E\u3059\u3002 +IngestJobConfigurator.loadJobSettings.usermsg.title=\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u30B8\u30E7\u30D6\u8A2D\u5B9A +IngestJobConfigurator.saveJobSettings.usermsg={0}\u30E2\u30B8\u30E5\u30FC\u30EB\u306E\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u30B8\u30E7\u30D6\u8A2D\u5B9A\u306E\u4FDD\u5B58\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002 +IngestJobConfigurator.saveJobSettings.usermsg.title=\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u30B8\u30E7\u30D6\u8A2D\u5B9A \ No newline at end of file diff --git a/Core/src/org/sleuthkit/autopsy/ingest/DataSourceIngestModuleProgress.java b/Core/src/org/sleuthkit/autopsy/ingest/DataSourceIngestModuleProgress.java index db2c4b3e37..e68aa451c6 100644 --- a/Core/src/org/sleuthkit/autopsy/ingest/DataSourceIngestModuleProgress.java +++ b/Core/src/org/sleuthkit/autopsy/ingest/DataSourceIngestModuleProgress.java @@ -26,11 +26,9 @@ import org.netbeans.api.progress.ProgressHandle; public class DataSourceIngestModuleProgress { private final ProgressHandle progress; - private final String moduleDisplayName; - DataSourceIngestModuleProgress(ProgressHandle progress, String moduleDisplayName) { + DataSourceIngestModuleProgress(ProgressHandle progress) { this.progress = progress; - this.moduleDisplayName = moduleDisplayName; } /** @@ -60,6 +58,6 @@ public class DataSourceIngestModuleProgress { * @param workUnits Number of work units performed so far by the module. */ public void progress(int workUnits) { - progress.progress(this.moduleDisplayName, workUnits); + progress.progress("", workUnits); } } \ No newline at end of file diff --git a/Core/src/org/sleuthkit/autopsy/ingest/DataSourceIngestPipeline.java b/Core/src/org/sleuthkit/autopsy/ingest/DataSourceIngestPipeline.java index 86d001f1f8..c3411f88da 100755 --- a/Core/src/org/sleuthkit/autopsy/ingest/DataSourceIngestPipeline.java +++ b/Core/src/org/sleuthkit/autopsy/ingest/DataSourceIngestPipeline.java @@ -23,6 +23,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import org.netbeans.api.progress.ProgressHandle; +import org.openide.util.NbBundle; import org.sleuthkit.datamodel.Content; /** @@ -79,7 +80,10 @@ final class DataSourceIngestPipeline { List errors = new ArrayList<>(); for (DataSourceIngestModuleDecorator module : this.modules) { try { - module.process(dataSource, new DataSourceIngestModuleProgress(progress, module.getDisplayName())); + progress.setDisplayName(NbBundle.getMessage(this.getClass(), + "IngestJob.progress.dataSourceIngest.displayName", + module.getDisplayName(), dataSource.getName())); + module.process(dataSource, new DataSourceIngestModuleProgress(progress)); } catch (Exception ex) { errors.add(new IngestModuleError(module.getDisplayName(), ex)); } @@ -90,18 +94,6 @@ final class DataSourceIngestPipeline { return errors; } - List shutDown() { - List errors = new ArrayList<>(); - for (DataSourceIngestModuleDecorator module : this.modules) { - try { - module.shutDown(context.isJobCancelled()); - } catch (Exception ex) { - errors.add(new IngestModuleError(module.getDisplayName(), ex)); - } - } - return errors; - } - private static class DataSourceIngestModuleDecorator implements DataSourceIngestModule { private final DataSourceIngestModule module; @@ -129,10 +121,5 @@ final class DataSourceIngestPipeline { public IngestModule.ProcessResult process(Content dataSource, DataSourceIngestModuleProgress statusHelper) { return module.process(dataSource, statusHelper); } - - @Override - public void shutDown(boolean ingestJobWasCancelled) { - module.shutDown(ingestJobWasCancelled); - } } } diff --git a/Core/src/org/sleuthkit/autopsy/ingest/DataSourceIngestTask.java b/Core/src/org/sleuthkit/autopsy/ingest/DataSourceIngestTask.java index 5598033397..3caaba22bc 100755 --- a/Core/src/org/sleuthkit/autopsy/ingest/DataSourceIngestTask.java +++ b/Core/src/org/sleuthkit/autopsy/ingest/DataSourceIngestTask.java @@ -35,6 +35,6 @@ final class DataSourceIngestTask extends IngestTask { @Override void execute() throws InterruptedException { - getIngestJob().process(dataSource); + getIngestJob().process(this); } } diff --git a/Core/src/org/sleuthkit/autopsy/ingest/FileIngestModule.java b/Core/src/org/sleuthkit/autopsy/ingest/FileIngestModule.java index cb94a7c797..369e34925c 100755 --- a/Core/src/org/sleuthkit/autopsy/ingest/FileIngestModule.java +++ b/Core/src/org/sleuthkit/autopsy/ingest/FileIngestModule.java @@ -21,17 +21,27 @@ package org.sleuthkit.autopsy.ingest; import org.sleuthkit.datamodel.AbstractFile; /** - * Interface that must be implemented by all file ingest modules. - * See description of IngestModule for more details on interface behavior. + * Interface that must be implemented by all file ingest modules. See + * description of IngestModule for more details on interface behavior. */ public interface FileIngestModule extends IngestModule { /** - * Processes a file. Called between calls to startUp() and shutDown(). - * Will be called for each file in a data source. + * Processes a file. Called between calls to startUp() and shutDown(). Will + * be called for each file in a data source. * * @param file The file to analyze. * @return A result code indicating success or failure of the processing. */ ProcessResult process(AbstractFile file); + + /** + * Invoked by Autopsy when an ingest job is completed (either because the + * data has been analyzed or because the job was canceled - check + * IngestJobContext.isJobCancelled()), before the ingest module instance is + * discarded. The module should respond by doing things like releasing + * private resources, submitting final results, and posting a final ingest + * message. + */ + void shutDown(); } diff --git a/Core/src/org/sleuthkit/autopsy/ingest/FileIngestPipeline.java b/Core/src/org/sleuthkit/autopsy/ingest/FileIngestPipeline.java index 1b3743e616..f9715fdb3f 100755 --- a/Core/src/org/sleuthkit/autopsy/ingest/FileIngestPipeline.java +++ b/Core/src/org/sleuthkit/autopsy/ingest/FileIngestPipeline.java @@ -97,7 +97,7 @@ final class FileIngestPipeline { List errors = new ArrayList<>(); for (FileIngestModuleDecorator module : this.modules) { try { - module.shutDown(context.isJobCancelled()); + module.shutDown(); } catch (Exception ex) { errors.add(new IngestModuleError(module.getDisplayName(), ex)); } @@ -134,8 +134,8 @@ final class FileIngestPipeline { } @Override - public void shutDown(boolean ingestJobWasCancelled) { - module.shutDown(ingestJobWasCancelled); + public void shutDown() { + module.shutDown(); } } } diff --git a/Core/src/org/sleuthkit/autopsy/ingest/FileIngestTask.java b/Core/src/org/sleuthkit/autopsy/ingest/FileIngestTask.java index 3134b6deb6..6426323d26 100755 --- a/Core/src/org/sleuthkit/autopsy/ingest/FileIngestTask.java +++ b/Core/src/org/sleuthkit/autopsy/ingest/FileIngestTask.java @@ -36,7 +36,7 @@ final class FileIngestTask extends IngestTask { @Override void execute() throws InterruptedException { - getIngestJob().process(file); + getIngestJob().process(this); } @Override diff --git a/Core/src/org/sleuthkit/autopsy/ingest/IngestJob.java b/Core/src/org/sleuthkit/autopsy/ingest/IngestJob.java index 22d32b3638..616059a28d 100644 --- a/Core/src/org/sleuthkit/autopsy/ingest/IngestJob.java +++ b/Core/src/org/sleuthkit/autopsy/ingest/IngestJob.java @@ -20,7 +20,9 @@ package org.sleuthkit.autopsy.ingest; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.atomic.AtomicLong; import java.util.logging.Level; import org.netbeans.api.progress.ProgressHandle; import org.netbeans.api.progress.ProgressHandleFactory; @@ -33,21 +35,64 @@ import org.sleuthkit.datamodel.Content; final class IngestJob { private static final Logger logger = Logger.getLogger(IngestManager.class.getName()); + private static final AtomicLong nextIngestJobId = new AtomicLong(0L); + private static final ConcurrentHashMap ingestJobsById = new ConcurrentHashMap<>(); + private static final IngestScheduler taskScheduler = IngestScheduler.getInstance(); private final long id; - private final Content rootDataSource; + private final Content dataSource; private final List ingestModuleTemplates; private final boolean processUnallocatedSpace; - private final LinkedBlockingQueue dataSourceIngestPipelines = new LinkedBlockingQueue<>(); private final LinkedBlockingQueue fileIngestPipelines = new LinkedBlockingQueue<>(); private long estimatedFilesToProcess = 0L; // Guarded by this private long processedFiles = 0L; // Guarded by this - private ProgressHandle dataSourceTasksProgress; - private ProgressHandle fileTasksProgress; + private DataSourceIngestPipeline dataSourceIngestPipeline; + private ProgressHandle dataSourceIngestProgress; + private ProgressHandle fileIngestProgress; private volatile boolean cancelled = false; + /** + * Creates an ingest job for a data source. + * + * @param dataSource The data source to ingest. + * @param ingestModuleTemplates The ingest module templates to use to create + * the ingest pipelines for the job. + * @param processUnallocatedSpace Whether or not the job should include + * processing of unallocated space. + * @return A collection of ingest module start up errors, empty on success. + * @throws InterruptedException + */ + static List startIngestJob(Content dataSource, List ingestModuleTemplates, boolean processUnallocatedSpace) throws InterruptedException { + long jobId = nextIngestJobId.incrementAndGet(); + IngestJob job = new IngestJob(jobId, dataSource, ingestModuleTemplates, processUnallocatedSpace); + ingestJobsById.put(jobId, job); + List errors = job.start(); + if (errors.isEmpty()) { + IngestManager.getInstance().fireIngestJobStarted(jobId); + taskScheduler.addTasksForIngestJob(job, dataSource); + } else { + ingestJobsById.remove(jobId); + } + return errors; + } + + static boolean ingestJobsAreRunning() { + for (IngestJob job : ingestJobsById.values()) { + if (!job.isCancelled()) { + return true; + } + } + return false; + } + + static void cancelAllIngestJobs() { + for (IngestJob job : ingestJobsById.values()) { + job.cancel(); + } + } + IngestJob(long id, Content dataSource, List ingestModuleTemplates, boolean processUnallocatedSpace) { this.id = id; - this.rootDataSource = dataSource; + this.dataSource = dataSource; this.ingestModuleTemplates = ingestModuleTemplates; this.processUnallocatedSpace = processUnallocatedSpace; } @@ -60,7 +105,7 @@ final class IngestJob { return processUnallocatedSpace; } - List startUp() throws InterruptedException { + private List start() throws InterruptedException { List errors = startUpIngestPipelines(); if (errors.isEmpty()) { startFileIngestProgressBar(); @@ -71,21 +116,13 @@ final class IngestJob { private List startUpIngestPipelines() throws InterruptedException { IngestJobContext context = new IngestJobContext(this); + + dataSourceIngestPipeline = new DataSourceIngestPipeline(context, ingestModuleTemplates); List errors = new ArrayList<>(); + errors.addAll(dataSourceIngestPipeline.startUp()); - int maxNumberOfPipelines = IngestManager.getMaxNumberOfDataSourceIngestThreads(); - for (int i = 0; i < maxNumberOfPipelines; ++i) { - DataSourceIngestPipeline pipeline = new DataSourceIngestPipeline(context, ingestModuleTemplates); - errors.addAll(pipeline.startUp()); - dataSourceIngestPipelines.put(pipeline); - if (!errors.isEmpty()) { - // No need to accumulate presumably redundant errors. - break; - } - } - - maxNumberOfPipelines = IngestManager.getMaxNumberOfFileIngestThreads(); - for (int i = 0; i < maxNumberOfPipelines; ++i) { + int numberOfPipelines = IngestManager.getInstance().getNumberOfFileIngestThreads(); + for (int i = 0; i < numberOfPipelines; ++i) { FileIngestPipeline pipeline = new FileIngestPipeline(context, ingestModuleTemplates); errors.addAll(pipeline.startUp()); fileIngestPipelines.put(pipeline); @@ -96,18 +133,18 @@ final class IngestJob { } logIngestModuleErrors(errors); - return errors; // Returned so UI can report to user. + return errors; } private void startDataSourceIngestProgressBar() { final String displayName = NbBundle.getMessage(this.getClass(), - "IngestJob.progress.dataSourceIngest.displayName", - rootDataSource.getName()); - dataSourceTasksProgress = ProgressHandleFactory.createHandle(displayName, new Cancellable() { + "IngestJob.progress.dataSourceIngest.initialDisplayName", + dataSource.getName()); + dataSourceIngestProgress = ProgressHandleFactory.createHandle(displayName, new Cancellable() { @Override public boolean cancel() { - if (dataSourceTasksProgress != null) { - dataSourceTasksProgress.setDisplayName( + if (dataSourceIngestProgress != null) { + dataSourceIngestProgress.setDisplayName( NbBundle.getMessage(this.getClass(), "IngestJob.progress.cancelling", displayName)); @@ -116,19 +153,19 @@ final class IngestJob { return true; } }); - dataSourceTasksProgress.start(); - dataSourceTasksProgress.switchToIndeterminate(); + dataSourceIngestProgress.start(); + dataSourceIngestProgress.switchToIndeterminate(); } private void startFileIngestProgressBar() { final String displayName = NbBundle.getMessage(this.getClass(), "IngestJob.progress.fileIngest.displayName", - rootDataSource.getName()); - fileTasksProgress = ProgressHandleFactory.createHandle(displayName, new Cancellable() { + dataSource.getName()); + fileIngestProgress = ProgressHandleFactory.createHandle(displayName, new Cancellable() { @Override public boolean cancel() { - if (fileTasksProgress != null) { - fileTasksProgress.setDisplayName( + if (fileIngestProgress != null) { + fileIngestProgress.setDisplayName( NbBundle.getMessage(this.getClass(), "IngestJob.progress.cancelling", displayName)); } @@ -136,69 +173,89 @@ final class IngestJob { return true; } }); - estimatedFilesToProcess = rootDataSource.accept(new GetFilesCountVisitor()); - fileTasksProgress.start(); - fileTasksProgress.switchToDeterminate((int) estimatedFilesToProcess); + estimatedFilesToProcess = dataSource.accept(new GetFilesCountVisitor()); + fileIngestProgress.start(); + fileIngestProgress.switchToDeterminate((int) estimatedFilesToProcess); } - void process(Content dataSource) throws InterruptedException { - // If the job is not cancelled, complete the task, otherwise just flush - // it. In either case, the task counter needs to be decremented and the - // shut down check needs to occur. + void process(DataSourceIngestTask task) throws InterruptedException { if (!isCancelled()) { List errors = new ArrayList<>(); - DataSourceIngestPipeline pipeline = dataSourceIngestPipelines.take(); - errors.addAll(pipeline.process(dataSource, dataSourceTasksProgress)); + errors.addAll(dataSourceIngestPipeline.process(task.getDataSource(), dataSourceIngestProgress)); if (!errors.isEmpty()) { logIngestModuleErrors(errors); } - dataSourceIngestPipelines.put(pipeline); + } else { + taskScheduler.removeTasksForIngestJob(id); + } + taskScheduler.notifyDataSourceIngestTaskCompleted(task); + + if (!taskScheduler.hasDataSourceIngestTaskForIngestJob(this)) { + finishProgressBar(dataSourceIngestProgress); + if (!taskScheduler.hasFileIngestTaskForIngestJob(this)) { + finishProgressBar(fileIngestProgress); + finish(); + } } } - void process(AbstractFile file) throws InterruptedException { - // If the job is not cancelled, complete the task, otherwise just flush - // it. In either case, the task counter needs to be decremented and the - // shut down check needs to occur. + void process(FileIngestTask task) throws InterruptedException { if (!isCancelled()) { - List errors = new ArrayList<>(); + AbstractFile file = task.getFile(); synchronized (this) { ++processedFiles; if (processedFiles <= estimatedFilesToProcess) { - fileTasksProgress.progress(file.getName(), (int) processedFiles); + fileIngestProgress.progress(file.getName(), (int) processedFiles); } else { - fileTasksProgress.progress(file.getName(), (int) estimatedFilesToProcess); + fileIngestProgress.progress(file.getName(), (int) estimatedFilesToProcess); } } FileIngestPipeline pipeline = fileIngestPipelines.take(); + List errors = new ArrayList<>(); errors.addAll(pipeline.process(file)); fileIngestPipelines.put(pipeline); if (!errors.isEmpty()) { logIngestModuleErrors(errors); } + } else { + taskScheduler.removeTasksForIngestJob(id); + } + taskScheduler.notifyFileIngestTaskCompleted(task); + + if (!taskScheduler.hasFileIngestTaskForIngestJob(this)) { + finishProgressBar(fileIngestProgress); + if (!taskScheduler.hasDataSourceIngestTaskForIngestJob(this)) { + finishProgressBar(dataSourceIngestProgress); + finish(); + } } } - void shutDown() { - List errors = new ArrayList<>(); - while (!dataSourceIngestPipelines.isEmpty()) { - DataSourceIngestPipeline pipeline = dataSourceIngestPipelines.poll(); - errors.addAll(pipeline.shutDown()); + private synchronized void finishProgressBar(ProgressHandle progress) { + if (progress != null) { + progress.finish(); + progress = null; } + } + + private void finish() { + List errors = new ArrayList<>(); while (!fileIngestPipelines.isEmpty()) { FileIngestPipeline pipeline = fileIngestPipelines.poll(); errors.addAll(pipeline.shutDown()); } - fileTasksProgress.finish(); - dataSourceTasksProgress.finish(); if (!errors.isEmpty()) { logIngestModuleErrors(errors); } + ingestJobsById.remove(id); + if (!isCancelled()) { + IngestManager.getInstance().fireIngestJobCompleted(id); + } } private void logIngestModuleErrors(List errors) { for (IngestModuleError error : errors) { - logger.log(Level.SEVERE, error.getModuleDisplayName() + " experienced an error", error.getModuleError()); + logger.log(Level.SEVERE, error.getModuleDisplayName() + " experienced an error", error.getModuleError()); //NON-NLS } } @@ -206,10 +263,10 @@ final class IngestJob { return cancelled; } - void cancel() { + private void cancel() { cancelled = true; - fileTasksProgress.finish(); - dataSourceTasksProgress.finish(); + finishProgressBar(dataSourceIngestProgress); + finishProgressBar(fileIngestProgress); IngestManager.getInstance().fireIngestJobCancelled(id); } } diff --git a/Core/src/org/sleuthkit/autopsy/ingest/IngestJobConfigurationPanel.form b/Core/src/org/sleuthkit/autopsy/ingest/IngestJobConfigurationPanel.form index a0533766ff..caa8b334e6 100644 --- a/Core/src/org/sleuthkit/autopsy/ingest/IngestJobConfigurationPanel.form +++ b/Core/src/org/sleuthkit/autopsy/ingest/IngestJobConfigurationPanel.form @@ -13,7 +13,7 @@ - + @@ -34,8 +34,8 @@ + - @@ -48,14 +48,14 @@ - + - + @@ -108,38 +108,32 @@ - + - - - + + - + + - + - + + + + + - - - - - - - - - - - - + + @@ -163,6 +157,16 @@ + + + + + + + + + + @@ -183,40 +187,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -236,16 +206,16 @@ - + - - - + + + diff --git a/Core/src/org/sleuthkit/autopsy/ingest/IngestJobConfigurationPanel.java b/Core/src/org/sleuthkit/autopsy/ingest/IngestJobConfigurationPanel.java index 6ad1aa9d98..0727fba0be 100644 --- a/Core/src/org/sleuthkit/autopsy/ingest/IngestJobConfigurationPanel.java +++ b/Core/src/org/sleuthkit/autopsy/ingest/IngestJobConfigurationPanel.java @@ -108,6 +108,7 @@ class IngestJobConfigurationPanel extends javax.swing.JPanel { simplePanel.repaint(); advancedButton.setEnabled(null != selectedModule.getGlobalSettingsPanel()); descriptionLabel.setText(selectedModule.getDescription()); + descriptionLabel.setToolTipText(selectedModule.getDescription()); } } }); @@ -130,16 +131,15 @@ class IngestJobConfigurationPanel extends javax.swing.JPanel { jPanel1 = new javax.swing.JPanel(); advancedButton = new javax.swing.JButton(); jSeparator2 = new javax.swing.JSeparator(); + descriptionLabel = new javax.swing.JLabel(); jScrollPane1 = new javax.swing.JScrollPane(); simplePanel = new javax.swing.JPanel(); - scrollpane = new javax.swing.JScrollPane(); - descriptionLabel = new javax.swing.JTextArea(); processUnallocPanel = new javax.swing.JPanel(); processUnallocCheckbox = new javax.swing.JCheckBox(); setMaximumSize(new java.awt.Dimension(5750, 3000)); setMinimumSize(new java.awt.Dimension(522, 257)); - setPreferredSize(new java.awt.Dimension(575, 400)); + setPreferredSize(new java.awt.Dimension(575, 300)); modulesScrollPane.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(160, 160, 160))); modulesScrollPane.setPreferredSize(new java.awt.Dimension(160, 160)); @@ -169,26 +169,14 @@ class IngestJobConfigurationPanel extends javax.swing.JPanel { } }); + descriptionLabel.setText(org.openide.util.NbBundle.getMessage(IngestJobConfigurationPanel.class, "IngestJobConfigurationPanel.descriptionLabel.text")); // NOI18N + jScrollPane1.setBorder(null); jScrollPane1.setPreferredSize(new java.awt.Dimension(250, 180)); simplePanel.setLayout(new javax.swing.BoxLayout(simplePanel, javax.swing.BoxLayout.PAGE_AXIS)); jScrollPane1.setViewportView(simplePanel); - scrollpane.setBorder(null); - scrollpane.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); - scrollpane.setVerticalScrollBarPolicy(javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER); - - descriptionLabel.setEditable(false); - descriptionLabel.setBackground(new java.awt.Color(240, 240, 240)); - descriptionLabel.setColumns(20); - descriptionLabel.setFont(new java.awt.Font("Tahoma", 0, 11)); // NOI18N NON-NLS - descriptionLabel.setLineWrap(true); - descriptionLabel.setRows(5); - descriptionLabel.setWrapStyleWord(true); - descriptionLabel.setBorder(null); - scrollpane.setViewportView(descriptionLabel); - javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1); jPanel1.setLayout(jPanel1Layout); jPanel1Layout.setHorizontalGroup( @@ -196,31 +184,30 @@ class IngestJobConfigurationPanel extends javax.swing.JPanel { .addGroup(jPanel1Layout.createSequentialGroup() .addContainerGap() .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 316, Short.MAX_VALUE) .addGroup(jPanel1Layout.createSequentialGroup() - .addComponent(scrollpane) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(advancedButton) - .addGap(14, 14, 14)))) - .addComponent(jSeparator2) + .addComponent(descriptionLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 203, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 22, Short.MAX_VALUE) + .addComponent(advancedButton)) + .addComponent(jScrollPane1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addContainerGap()) + .addComponent(jSeparator2, javax.swing.GroupLayout.Alignment.TRAILING) ); jPanel1Layout.setVerticalGroup( jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup() - .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 242, Short.MAX_VALUE) + .addContainerGap() + .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 211, Short.MAX_VALUE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(jSeparator2, javax.swing.GroupLayout.PREFERRED_SIZE, 2, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(jPanel1Layout.createSequentialGroup() - .addGap(22, 22, 22) - .addComponent(scrollpane, javax.swing.GroupLayout.PREFERRED_SIZE, 65, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addGroup(jPanel1Layout.createSequentialGroup() - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addComponent(jSeparator2, javax.swing.GroupLayout.PREFERRED_SIZE, 10, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addGroup(jPanel1Layout.createSequentialGroup() - .addGap(18, 18, 18) - .addComponent(advancedButton))) + .addComponent(descriptionLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 24, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(advancedButton)) .addContainerGap()) ); + descriptionLabel.getAccessibleContext().setAccessibleName(""); // NOI18N + processUnallocPanel.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(160, 160, 160))); processUnallocCheckbox.setText(org.openide.util.NbBundle.getMessage(IngestJobConfigurationPanel.class, "IngestJobConfigurationPanel.processUnallocCheckbox.text")); // NOI18N @@ -238,14 +225,14 @@ class IngestJobConfigurationPanel extends javax.swing.JPanel { .addGroup(processUnallocPanelLayout.createSequentialGroup() .addContainerGap() .addComponent(processUnallocCheckbox) - .addContainerGap(108, Short.MAX_VALUE)) + .addContainerGap(60, Short.MAX_VALUE)) ); processUnallocPanelLayout.setVerticalGroup( processUnallocPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, processUnallocPanelLayout.createSequentialGroup() - .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGroup(processUnallocPanelLayout.createSequentialGroup() + .addContainerGap() .addComponent(processUnallocCheckbox) - .addContainerGap()) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); @@ -255,8 +242,8 @@ class IngestJobConfigurationPanel extends javax.swing.JPanel { .addGroup(layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(modulesScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(processUnallocPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addComponent(processUnallocPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(modulesScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, 328, javax.swing.GroupLayout.PREFERRED_SIZE) .addContainerGap()) @@ -266,7 +253,7 @@ class IngestJobConfigurationPanel extends javax.swing.JPanel { .addGroup(layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, 342, Short.MAX_VALUE) + .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, 278, Short.MAX_VALUE) .addGroup(layout.createSequentialGroup() .addComponent(modulesScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) @@ -304,7 +291,7 @@ class IngestJobConfigurationPanel extends javax.swing.JPanel { // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton advancedButton; - private javax.swing.JTextArea descriptionLabel; + private javax.swing.JLabel descriptionLabel; private javax.swing.JPanel jPanel1; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JSeparator jSeparator2; @@ -312,7 +299,6 @@ class IngestJobConfigurationPanel extends javax.swing.JPanel { private javax.swing.JTable modulesTable; private javax.swing.JCheckBox processUnallocCheckbox; private javax.swing.JPanel processUnallocPanel; - private javax.swing.JScrollPane scrollpane; private javax.swing.JPanel simplePanel; private javax.swing.ButtonGroup timeGroup; // End of variables declaration//GEN-END:variables diff --git a/Core/src/org/sleuthkit/autopsy/ingest/IngestJobConfigurator.java b/Core/src/org/sleuthkit/autopsy/ingest/IngestJobConfigurator.java index 519df49999..7b9bf1d447 100644 --- a/Core/src/org/sleuthkit/autopsy/ingest/IngestJobConfigurator.java +++ b/Core/src/org/sleuthkit/autopsy/ingest/IngestJobConfigurator.java @@ -29,6 +29,8 @@ import java.util.List; import java.util.logging.Level; import javax.swing.JOptionPane; import javax.swing.JPanel; + +import org.openide.util.NbBundle; import org.openide.util.io.NbObjectInputStream; import org.openide.util.io.NbObjectOutputStream; import org.sleuthkit.autopsy.coreutils.Logger; @@ -145,8 +147,13 @@ public final class IngestJobConfigurator { } moduleSettingsFolderForContext = folder.getAbsolutePath(); } catch (Exception ex) { - logger.log(Level.SEVERE, "Failed to create ingest module settings directory", ex); - JOptionPane.showMessageDialog(null, "Failed to create ingest module settings folder, cannot save settings.", "Ingest Job Initialization Failure", JOptionPane.ERROR_MESSAGE); + logger.log(Level.SEVERE, "Failed to create ingest module settings directory", ex); //NON-NLS + JOptionPane.showMessageDialog(null, + NbBundle.getMessage(this.getClass(), + "IngestJobConfigurator.createModuleSettingsFolderForContext.exception.msg"), + NbBundle.getMessage(this.getClass(), + "IngestJobConfigurator.createModuleSettingsFolderForContext.exception.title"), + JOptionPane.ERROR_MESSAGE); } } @@ -189,10 +196,8 @@ public final class IngestJobConfigurator { try (NbObjectInputStream in = new NbObjectInputStream(new FileInputStream(settingsFile.getAbsolutePath()))) { settings = (IngestModuleIngestJobSettings) in.readObject(); } catch (IOException | ClassNotFoundException ex) { - String logMessage = String.format("Error loading ingest job settings for %s module for %s context, using defaults", factory.getModuleDisplayName(), launcherContext); - logger.log(Level.SEVERE, logMessage, ex); - String userMessage = String.format("Failed to load saved ingest job settings for %s module, using defaults.", factory.getModuleDisplayName()); - JOptionPane.showMessageDialog(null, userMessage, "Ingest Job Settings", JOptionPane.WARNING_MESSAGE); + String logMessage = String.format("Error loading ingest job settings for %s module for %s context, using defaults", factory.getModuleDisplayName(), launcherContext); //NON-NLS + logger.log(Level.WARNING, logMessage, ex); } } if (settings == null) { @@ -207,10 +212,13 @@ public final class IngestJobConfigurator { out.writeObject(settings); } } catch (IOException ex) { - String logMessage = String.format("Error saving ingest job settings for %s module for %s context", factory.getModuleDisplayName(), launcherContext); + String logMessage = String.format("Error saving ingest job settings for %s module for %s context", factory.getModuleDisplayName(), launcherContext); //NON-NLS logger.log(Level.SEVERE, logMessage, ex); - String userMessage = String.format("Failed to save ingest job settings for %s module.", factory.getModuleDisplayName()); - JOptionPane.showMessageDialog(null, userMessage, "Ingest Job Settings", JOptionPane.WARNING_MESSAGE); + String userMessage = NbBundle.getMessage(this.getClass(), "IngestJobConfigurator.saveJobSettings.usermsg", factory.getModuleDisplayName()); + JOptionPane.showMessageDialog(null, userMessage, + NbBundle.getMessage(this.getClass(), + "IngestJobConfigurator.saveJobSettings.usermsg.title"), + JOptionPane.WARNING_MESSAGE); } } diff --git a/Core/src/org/sleuthkit/autopsy/ingest/IngestJobContext.java b/Core/src/org/sleuthkit/autopsy/ingest/IngestJobContext.java index 735f39bc28..030a878351 100755 --- a/Core/src/org/sleuthkit/autopsy/ingest/IngestJobContext.java +++ b/Core/src/org/sleuthkit/autopsy/ingest/IngestJobContext.java @@ -60,7 +60,7 @@ public final class IngestJobContext { */ public void addFiles(List files) { for (AbstractFile file : files) { - IngestScheduler.getInstance().addFileToIngestJob(ingestJob, file); + IngestScheduler.getInstance().addFileTaskToIngestJob(ingestJob, file); } } } diff --git a/Core/src/org/sleuthkit/autopsy/ingest/IngestManager.java b/Core/src/org/sleuthkit/autopsy/ingest/IngestManager.java index 3b566decd4..7284b6933f 100644 --- a/Core/src/org/sleuthkit/autopsy/ingest/IngestManager.java +++ b/Core/src/org/sleuthkit/autopsy/ingest/IngestManager.java @@ -34,24 +34,21 @@ import org.sleuthkit.autopsy.coreutils.Logger; import org.netbeans.api.progress.ProgressHandle; import org.netbeans.api.progress.ProgressHandleFactory; import org.openide.util.Cancellable; -import org.openide.util.NbPreferences; import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil; import org.sleuthkit.datamodel.Content; -import java.util.prefs.Preferences; import javax.swing.JOptionPane; +import org.sleuthkit.autopsy.core.UserPreferences; /** * Manages the execution of ingest jobs. */ public class IngestManager { - private static final int MAX_NUMBER_OF_DATA_SOURCE_INGEST_THREADS = 1; - private static final String NUMBER_OF_FILE_INGEST_THREADS_KEY = "NumberOfFileingestThreads"; //NON-NLS + private static final int DEFAULT_NUMBER_OF_DATA_SOURCE_INGEST_THREADS = 1; private static final int MIN_NUMBER_OF_FILE_INGEST_THREADS = 1; private static final int MAX_NUMBER_OF_FILE_INGEST_THREADS = 16; private static final int DEFAULT_NUMBER_OF_FILE_INGEST_THREADS = 2; private static final Logger logger = Logger.getLogger(IngestManager.class.getName()); - private static final Preferences userPreferences = NbPreferences.forModule(IngestManager.class); private static final IngestManager instance = new IngestManager(); private final PropertyChangeSupport ingestJobEventPublisher = new PropertyChangeSupport(IngestManager.class); private final PropertyChangeSupport ingestModuleEventPublisher = new PropertyChangeSupport(IngestManager.class); @@ -59,13 +56,14 @@ public class IngestManager { private final IngestMonitor ingestMonitor = new IngestMonitor(); private final ExecutorService startIngestJobsThreadPool = Executors.newSingleThreadExecutor(); private final ExecutorService dataSourceIngestThreadPool = Executors.newSingleThreadExecutor(); - private final ExecutorService fileIngestThreadPool = Executors.newFixedThreadPool(MAX_NUMBER_OF_FILE_INGEST_THREADS); + private final ExecutorService fileIngestThreadPool; private final ExecutorService fireIngestEventsThreadPool = Executors.newSingleThreadExecutor(); private final AtomicLong nextThreadId = new AtomicLong(0L); private final ConcurrentHashMap> startIngestJobThreads = new ConcurrentHashMap<>(); // Maps thread ids to cancellation handles. private final ConcurrentHashMap> dataSourceIngestThreads = new ConcurrentHashMap<>(); // Maps thread ids to cancellation handles. private final ConcurrentHashMap> fileIngestThreads = new ConcurrentHashMap<>(); // Maps thread ids to cancellation handles. private volatile IngestMessageTopComponent ingestMessageBox; + private int numberOfFileIngestThreads = DEFAULT_NUMBER_OF_FILE_INGEST_THREADS; /** * Gets the ingest manager. @@ -82,7 +80,13 @@ public class IngestManager { */ private IngestManager() { startDataSourceIngestThread(); - int numberOfFileIngestThreads = getNumberOfFileIngestThreads(); + + numberOfFileIngestThreads = UserPreferences.numberOfFileIngestThreads(); + if ((numberOfFileIngestThreads < MIN_NUMBER_OF_FILE_INGEST_THREADS) || (numberOfFileIngestThreads > MAX_NUMBER_OF_FILE_INGEST_THREADS)) { + numberOfFileIngestThreads = DEFAULT_NUMBER_OF_FILE_INGEST_THREADS; + UserPreferences.setNumberOfFileIngestThreads(numberOfFileIngestThreads); + } + fileIngestThreadPool = Executors.newFixedThreadPool(numberOfFileIngestThreads); for (int i = 0; i < numberOfFileIngestThreads; ++i) { startFileIngestThread(); } @@ -100,56 +104,19 @@ public class IngestManager { } /** - * Gets the maximum number of data source ingest threads the ingest manager - * will use. + * Gets the number of data source ingest threads the ingest manager will + * use. */ - public static int getMaxNumberOfDataSourceIngestThreads() { - return MAX_NUMBER_OF_DATA_SOURCE_INGEST_THREADS; + public int getNumberOfDataSourceIngestThreads() { + return DEFAULT_NUMBER_OF_DATA_SOURCE_INGEST_THREADS; } /** * Gets the maximum number of file ingest threads the ingest manager will * use. */ - public static int getMaxNumberOfFileIngestThreads() { - return MAX_NUMBER_OF_FILE_INGEST_THREADS; - } - - /** - * Gets the number of file ingest threads the ingest manager will use. - */ - public synchronized static int getNumberOfFileIngestThreads() { - return userPreferences.getInt(NUMBER_OF_FILE_INGEST_THREADS_KEY, DEFAULT_NUMBER_OF_FILE_INGEST_THREADS); - } - - /** - * Changes the number of file ingest threads the ingest manager will use to - * no more than MAX_NUMBER_OF_FILE_INGEST_THREADS and no less than - * MIN_NUMBER_OF_FILE_INGEST_THREADS. Out of range requests are converted to - * requests for DEFAULT_NUMBER_OF_FILE_INGEST_THREADS. - * - * @param numberOfThreads The desired number of file ingest threads. - */ - public synchronized static void setNumberOfFileIngestThreads(int numberOfThreads) { - if ((numberOfThreads < MIN_NUMBER_OF_FILE_INGEST_THREADS) || (numberOfThreads > MAX_NUMBER_OF_FILE_INGEST_THREADS)) { - numberOfThreads = DEFAULT_NUMBER_OF_FILE_INGEST_THREADS; - } - userPreferences.putInt(NUMBER_OF_FILE_INGEST_THREADS_KEY, numberOfThreads); - - if (instance.fileIngestThreads.size() != numberOfThreads) { - if (instance.fileIngestThreads.size() > numberOfThreads) { - Long[] threadIds = instance.fileIngestThreads.keySet().toArray(new Long[instance.fileIngestThreads.size()]); - int numberOfThreadsToCancel = instance.fileIngestThreads.size() - numberOfThreads; - for (int i = 0; i < numberOfThreadsToCancel; ++i) { - instance.cancelFileIngestThread(threadIds[i]); - } - } else if (instance.fileIngestThreads.size() < numberOfThreads) { - int numberOfThreadsToAdd = numberOfThreads - instance.fileIngestThreads.size(); - for (int i = 0; i < numberOfThreadsToAdd; ++i) { - instance.startFileIngestThread(); - } - } - } + public int getNumberOfFileIngestThreads() { + return numberOfFileIngestThreads; } /** @@ -200,7 +167,7 @@ public class IngestManager { * @return True if any ingest jobs are in progress, false otherwise. */ public boolean isIngestRunning() { - return scheduler.ingestJobsAreRunning(); + return IngestJob.ingestJobsAreRunning(); } public void cancelAllIngestJobs() { @@ -215,55 +182,64 @@ public class IngestManager { } catch (InterruptedException | ExecutionException ex) { // This should never happen, something is awry, but everything // should be o.k. anyway. - logger.log(Level.SEVERE, "Unexpected thread interrupt", ex); + logger.log(Level.SEVERE, "Unexpected thread interrupt", ex); //NON-NLS } } - // Cancel all the jobs already created. This will make the the ingest - // threads flush out any lingering ingest tasks without processing them. - scheduler.cancelAllIngestJobs(); + // Cancel all the jobs already created. + IngestJob.cancelAllIngestJobs(); } /** - * Ingest events. + * Ingest job events. */ - public enum IngestEvent { + public enum IngestJobEvent { /** * Property change event fired when an ingest job is started. The old * value of the PropertyChangeEvent object is set to the ingest job id, * and the new value is set to null. */ - INGEST_JOB_STARTED, + STARTED, /** * Property change event fired when an ingest job is completed. The old * value of the PropertyChangeEvent object is set to the ingest job id, * and the new value is set to null. */ - INGEST_JOB_COMPLETED, + COMPLETED, /** * Property change event fired when an ingest job is canceled. The old * value of the PropertyChangeEvent object is set to the ingest job id, * and the new value is set to null. */ - INGEST_JOB_CANCELLED, + CANCELLED, + }; + + /** + * Ingest module events. + */ + public enum IngestModuleEvent { + /** - * Event sent when an ingest module posts new data to blackboard or - * somewhere else. Second argument of the property change fired contains - * ModuleDataEvent object and third argument is null. The object can - * contain encapsulated new data created by the module. Listener can - * also query new data as needed. + * Property change event fired when an ingest module adds new data to a + * case, usually by posting to the blackboard. The old value of the + * PropertyChangeEvent is a ModuleDataEvent object, and the new value is + * set to null. */ - DATA, + DATA_ADDED, /** - * Event send when content changed, either its attributes changed, or - * new content children have been added. I.e. from ZIP files or Carved - * files + * Property change event fired when an ingest module adds new content to + * a case or changes a recorded attribute of existing content. For + * example, if a module adds an extracted or carved file to a case, the + * module should fire this event. The old value of the + * PropertyChangeEvent is a ModuleContentEvent object, and the new value + * is set to null. */ CONTENT_CHANGED, /** - * Event sent when a file has finished going through a pipeline of - * modules. Second argument is the object ID. Third argument is null + * Property change event fired when the ingest of a file is completed. + * The old value of the PropertyChangeEvent is the Autopsy object ID of + * the file, and the new value is set to null. */ FILE_DONE, }; @@ -305,9 +281,10 @@ public class IngestManager { } /** - * Add an ingest module event property change listener. + * Add an ingest job and ingest module event property change listener. * - * @deprecated + * @deprecated Use addIngestJobEventListener() and/or + * addIngestModuleEventListener(). * @param listener The PropertyChangeListener to register. */ public static void addPropertyChangeListener(final PropertyChangeListener listener) { @@ -316,9 +293,10 @@ public class IngestManager { } /** - * Remove an ingest module event property change listener. + * Remove an ingest job and ingest module event property change listener. * - * @deprecated + * @deprecated Use removeIngestJobEventListener() and/or + * removeIngestModuleEventListener(). * @param listener The PropertyChangeListener to unregister. */ public static void removePropertyChangeListener(final PropertyChangeListener listener) { @@ -332,7 +310,7 @@ public class IngestManager { * @param ingestJobId The ingest job id. */ void fireIngestJobStarted(long ingestJobId) { - fireIngestEventsThreadPool.submit(new FireIngestEventThread(ingestJobEventPublisher, IngestEvent.INGEST_JOB_STARTED, ingestJobId, null)); + fireIngestEventsThreadPool.submit(new FireIngestEventThread(ingestJobEventPublisher, IngestJobEvent.STARTED, ingestJobId, null)); } /** @@ -341,7 +319,7 @@ public class IngestManager { * @param ingestJobId The ingest job id. */ void fireIngestJobCompleted(long ingestJobId) { - fireIngestEventsThreadPool.submit(new FireIngestEventThread(ingestJobEventPublisher, IngestEvent.INGEST_JOB_COMPLETED, ingestJobId, null)); + fireIngestEventsThreadPool.submit(new FireIngestEventThread(ingestJobEventPublisher, IngestJobEvent.COMPLETED, ingestJobId, null)); } /** @@ -350,7 +328,7 @@ public class IngestManager { * @param ingestJobId The ingest job id. */ void fireIngestJobCancelled(long ingestJobId) { - fireIngestEventsThreadPool.submit(new FireIngestEventThread(ingestJobEventPublisher, IngestEvent.INGEST_JOB_CANCELLED, ingestJobId, null)); + fireIngestEventsThreadPool.submit(new FireIngestEventThread(ingestJobEventPublisher, IngestJobEvent.CANCELLED, ingestJobId, null)); } /** @@ -359,7 +337,7 @@ public class IngestManager { * @param fileId The object id of file. */ void fireFileIngestDone(long fileId) { - fireIngestEventsThreadPool.submit(new FireIngestEventThread(ingestModuleEventPublisher, IngestEvent.FILE_DONE, fileId, null)); + fireIngestEventsThreadPool.submit(new FireIngestEventThread(ingestModuleEventPublisher, IngestModuleEvent.FILE_DONE, fileId, null)); } /** @@ -368,7 +346,7 @@ public class IngestManager { * @param moduleDataEvent A ModuleDataEvent with the details of the posting. */ void fireIngestModuleDataEvent(ModuleDataEvent moduleDataEvent) { - fireIngestEventsThreadPool.submit(new FireIngestEventThread(ingestModuleEventPublisher, IngestEvent.DATA, moduleDataEvent, null)); + fireIngestEventsThreadPool.submit(new FireIngestEventThread(ingestModuleEventPublisher, IngestModuleEvent.DATA_ADDED, moduleDataEvent, null)); } /** @@ -379,7 +357,7 @@ public class IngestManager { * content. */ void fireIngestModuleContentEvent(ModuleContentEvent moduleContentEvent) { - fireIngestEventsThreadPool.submit(new FireIngestEventThread(ingestModuleEventPublisher, IngestEvent.CONTENT_CHANGED, moduleContentEvent, null)); + fireIngestEventsThreadPool.submit(new FireIngestEventThread(ingestModuleEventPublisher, IngestModuleEvent.CONTENT_CHANGED, moduleContentEvent, null)); } /** @@ -455,7 +433,7 @@ public class IngestManager { } // Start an ingest job for the data source. - List errors = scheduler.startIngestJob(dataSource, moduleTemplates, processUnallocatedSpace); + List errors = IngestJob.startIngestJob(dataSource, moduleTemplates, processUnallocatedSpace); if (!errors.isEmpty()) { // Report the errors to the user. They have already been logged. StringBuilder moduleStartUpErrors = new StringBuilder(); @@ -512,7 +490,6 @@ public class IngestManager { try { IngestTask task = tasks.getNextTask(); // Blocks. task.execute(); - scheduler.ingestTaskIsCompleted(task); } catch (InterruptedException ex) { break; } @@ -529,13 +506,23 @@ public class IngestManager { private static class FireIngestEventThread implements Runnable { private final PropertyChangeSupport publisher; - private final IngestEvent event; + private final IngestJobEvent jobEvent; + private final IngestModuleEvent moduleEvent; private final Object oldValue; private final Object newValue; - FireIngestEventThread(PropertyChangeSupport publisher, IngestEvent event, Object oldValue, Object newValue) { + FireIngestEventThread(PropertyChangeSupport publisher, IngestJobEvent event, Object oldValue, Object newValue) { this.publisher = publisher; - this.event = event; + this.jobEvent = event; + this.moduleEvent = null; + this.oldValue = oldValue; + this.newValue = newValue; + } + + FireIngestEventThread(PropertyChangeSupport publisher, IngestModuleEvent event, Object oldValue, Object newValue) { + this.publisher = publisher; + this.jobEvent = null; + this.moduleEvent = event; this.oldValue = oldValue; this.newValue = newValue; } @@ -543,7 +530,7 @@ public class IngestManager { @Override public void run() { try { - publisher.firePropertyChange(event.toString(), oldValue, newValue); + publisher.firePropertyChange((jobEvent != null ? jobEvent.toString() : moduleEvent.toString()), oldValue, newValue); } catch (Exception e) { logger.log(Level.SEVERE, "Ingest manager listener threw exception", e); //NON-NLS MessageNotifyUtil.Notify.show(NbBundle.getMessage(IngestManager.class, "IngestManager.moduleErr"), diff --git a/Core/src/org/sleuthkit/autopsy/ingest/IngestModule.java b/Core/src/org/sleuthkit/autopsy/ingest/IngestModule.java index 232d916c3b..17bd6a0dbf 100755 --- a/Core/src/org/sleuthkit/autopsy/ingest/IngestModule.java +++ b/Core/src/org/sleuthkit/autopsy/ingest/IngestModule.java @@ -20,25 +20,25 @@ package org.sleuthkit.autopsy.ingest; /** * The interface that must be implemented by all ingest modules. - * + * * Autopsy will generally use several instances of an ingest module for each - * ingest job it performs (one for each thread that it is using). - * - * Autopsy will call startUp() before any data is processed, will pass any - * data to be analyzed into the process() method (FileIngestModule.process() or DataSourceIngestModule.process()), - * and call shutDown() after - * either all data is analyzed or the has has cancelled the job. + * ingest job it performs (one for each thread that it is using). + * + * Autopsy will call startUp() before any data is processed, will pass any data + * to be analyzed into the process() method (FileIngestModule.process() or + * DataSourceIngestModule.process()), and call shutDown() after either all data + * is analyzed or the user has canceled the job. * * Autopsy may use multiple threads to complete an ingest job, but it is - * guaranteed that a module instance will always be called from a single thread. - * Therefore, you can easily have thread-safe code by not using any static + * guaranteed that a module instance will always be called from a single thread. + * Therefore, you can easily have thread-safe code by not using any static * member variables. * - * If the module instances must share resources, the modules are - * responsible for synchronizing access to the shared resources and doing - * reference counting as required to release those resources correctly. Also, - * more than one ingest job may be in progress at any given time. This must also - * be taken into consideration when sharing resources between module instances. + * If the module instances must share resources, the modules are responsible for + * synchronizing access to the shared resources and doing reference counting as + * required to release those resources correctly. Also, more than one ingest job + * may be in progress at any given time. This must also be taken into + * consideration when sharing resources between module instances. * * TIP: An ingest module that does not require initialization or clean up may * extend the abstract IngestModuleAdapter class to get a default "do nothing" @@ -71,29 +71,14 @@ public interface IngestModule { /** * Invoked by Autopsy to allow an ingest module instance to set up any * internal data structures and acquire any private resources it will need - * during an ingest job. - * - * If the module depends on loading any resources, it should do so in this - * method so that it can throw an exception in the case of an error and - * alert the user. Exceptions that are thrown from process() and shutDown() - * are logged, but do not stop processing of the data source. - * - * On error, throw a IngestModuleException. + * during an ingest job. If the module depends on loading any resources, it + * should do so in this method so that it can throw an exception in the case + * of an error and alert the user. Exceptions that are thrown from process() + * and shutDown() are logged, but do not stop processing of the data source. * * @param context Provides data and services specific to the ingest job and * the ingest pipeline of which the module is a part. * @throws org.sleuthkit.autopsy.ingest.IngestModule.IngestModuleException */ void startUp(IngestJobContext context) throws IngestModuleException; - - /** - * Invoked by Autopsy when an ingest job is completed (either because the - * data has been analyzed or because the job was cancelled), before the ingest - * module instance is discarded. The module should respond by doing things - * like releasing private resources, submitting final results, and posting a - * final ingest message. - * @param ingestJobWasCancelled True if this is being called because the user - * cancelled the job. - */ - void shutDown(boolean ingestJobWasCancelled); } diff --git a/Core/src/org/sleuthkit/autopsy/ingest/IngestModuleAdapter.java b/Core/src/org/sleuthkit/autopsy/ingest/IngestModuleAdapter.java deleted file mode 100755 index 4187704bc1..0000000000 --- a/Core/src/org/sleuthkit/autopsy/ingest/IngestModuleAdapter.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Autopsy Forensic Browser - * - * Copyright 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.ingest; - -/** - * An adapter that provides a default implementation of the IngestModule - * interface. - */ -public abstract class IngestModuleAdapter implements IngestModule { - @Override - public void startUp(IngestJobContext context) throws IngestModuleException { - } - - @Override - public void shutDown(boolean ingestJobCancelled) { - } -} diff --git a/Core/src/org/sleuthkit/autopsy/ingest/IngestModuleFactoryLoader.java b/Core/src/org/sleuthkit/autopsy/ingest/IngestModuleFactoryLoader.java index 510e777091..c40f9e3e4f 100644 --- a/Core/src/org/sleuthkit/autopsy/ingest/IngestModuleFactoryLoader.java +++ b/Core/src/org/sleuthkit/autopsy/ingest/IngestModuleFactoryLoader.java @@ -44,7 +44,7 @@ final class IngestModuleFactoryLoader { } return instance; } - + synchronized List getIngestModuleFactories() { // Discover the ingest module factories, making sure that there are no // duplicate module display names. The duplicates requirement could be @@ -58,30 +58,31 @@ final class IngestModuleFactoryLoader { Collection factories = Lookup.getDefault().lookupAll(IngestModuleFactory.class); for (IngestModuleFactory factory : factories) { logger.log(Level.INFO, "Found ingest module factory: name = {0}, version = {1}", new Object[]{factory.getModuleDisplayName(), factory.getModuleVersionNumber()}); //NON-NLS + moduleFactoriesByClass.put(factory.getClass().getCanonicalName(), factory); + moduleDisplayNames.add(factory.getModuleDisplayName()); if (!moduleDisplayNames.contains(factory.getModuleDisplayName())) { - moduleFactoriesByClass.put(factory.getClass().getCanonicalName(), factory); - moduleDisplayNames.add(factory.getModuleDisplayName()); - } else { // Not popping up a message box to keep this class UI-indepdent. - logger.log(Level.SEVERE, "Found duplicate ingest module display name, discarding ingest module factory (name = {0}", new Object[]{factory.getModuleDisplayName(), factory.getModuleVersionNumber()}); //NON-NLS + logger.log(Level.SEVERE, "Found duplicate ingest module display name (name = {0})", factory.getModuleDisplayName()); //NON-NLS } } - + // Kick out the sample modules factory. moduleFactoriesByClass.remove("org.sleuthkit.autopsy.examples.SampleIngestModuleFactory"); - + // Do the core ingest module ordering hack described above. - ArrayList coreModuleOrdering = new ArrayList() {{ - add("org.sleuthkit.autopsy.recentactivity.RecentActivityExtracterModuleFactory"); - add("org.sleuthkit.autopsy.ewfverify.EwfVerifierModuleFactory"); - add("org.sleuthkit.autopsy.hashdatabase.HashLookupModuleFactory"); - add("org.sleuthkit.autopsy.modules.filetypeid.FileTypeIdModuleFactory"); - add("org.sleuthkit.autopsy.modules.sevenzip.ArchiveFileExtractorModuleFactory"); - add("org.sleuthkit.autopsy.modules.exif.ExifParserModuleFactory"); - add("org.sleuthkit.autopsy.keywordsearch.KeywordSearchModuleFactory"); - add("org.sleuthkit.autopsy.thunderbirdparser.EmailParserModuleFactory"); - add("org.sleuthkit.autopsy.modules.fileextmismatch.FileExtMismatchDetectorModuleFactory"); - }}; + ArrayList coreModuleOrdering = new ArrayList() { + { + add("org.sleuthkit.autopsy.recentactivity.RecentActivityExtracterModuleFactory"); + add("org.sleuthkit.autopsy.ewfverify.EwfVerifierModuleFactory"); + add("org.sleuthkit.autopsy.hashdatabase.HashLookupModuleFactory"); + add("org.sleuthkit.autopsy.modules.filetypeid.FileTypeIdModuleFactory"); + add("org.sleuthkit.autopsy.modules.sevenzip.ArchiveFileExtractorModuleFactory"); + add("org.sleuthkit.autopsy.modules.exif.ExifParserModuleFactory"); + add("org.sleuthkit.autopsy.keywordsearch.KeywordSearchModuleFactory"); + add("org.sleuthkit.autopsy.thunderbirdparser.EmailParserModuleFactory"); + add("org.sleuthkit.autopsy.modules.fileextmismatch.FileExtMismatchDetectorModuleFactory"); + } + }; List orderedModuleFactories = new ArrayList<>(); for (String className : coreModuleOrdering) { IngestModuleFactory coreFactory = moduleFactoriesByClass.remove(className); @@ -89,12 +90,12 @@ final class IngestModuleFactoryLoader { orderedModuleFactories.add(coreFactory); } } - + // Add in any non-core factories discovered. Order is not guaranteed! for (IngestModuleFactory nonCoreFactory : moduleFactoriesByClass.values()) { orderedModuleFactories.add(nonCoreFactory); } - + return orderedModuleFactories; } } \ No newline at end of file diff --git a/Core/src/org/sleuthkit/autopsy/ingest/IngestModuleIngestJobSettings.java b/Core/src/org/sleuthkit/autopsy/ingest/IngestModuleIngestJobSettings.java index b68186b17f..67d051d86a 100755 --- a/Core/src/org/sleuthkit/autopsy/ingest/IngestModuleIngestJobSettings.java +++ b/Core/src/org/sleuthkit/autopsy/ingest/IngestModuleIngestJobSettings.java @@ -28,9 +28,11 @@ import java.io.Serializable; public interface IngestModuleIngestJobSettings extends Serializable { /** - * Returns the version number of the settings object. + * Returns the version number of the settings object. The version number + * should be a private final static long per the documentation of the + * Serializable interface. * - * @return A version number string. + * @return A serialization version number. */ - String getVersionNumber(); + long getVersionNumber(); } diff --git a/Core/src/org/sleuthkit/autopsy/ingest/IngestPipelinesConfiguration.java b/Core/src/org/sleuthkit/autopsy/ingest/IngestPipelinesConfiguration.java index 5e9a7dce4c..d829a7e300 100755 --- a/Core/src/org/sleuthkit/autopsy/ingest/IngestPipelinesConfiguration.java +++ b/Core/src/org/sleuthkit/autopsy/ingest/IngestPipelinesConfiguration.java @@ -89,7 +89,7 @@ final class IngestPipelinesConfiguration { PlatformUtil.extractResourceToUserConfigDir(IngestPipelinesConfiguration.class, PIPELINES_CONFIG_FILE, overWrite); String configFilePath = PlatformUtil.getUserConfigDirectory() + File.separator + PIPELINES_CONFIG_FILE; - Document doc = XMLUtil.loadDoc(IngestPipelinesConfiguration.class, configFilePath, PIPELINES_CONFIG_FILE_XSD); + Document doc = XMLUtil.loadDoc(IngestPipelinesConfiguration.class, configFilePath); if (doc == null) { return; } diff --git a/Core/src/org/sleuthkit/autopsy/ingest/IngestScheduler.java b/Core/src/org/sleuthkit/autopsy/ingest/IngestScheduler.java index 6bad7b6ab7..2225efc617 100755 --- a/Core/src/org/sleuthkit/autopsy/ingest/IngestScheduler.java +++ b/Core/src/org/sleuthkit/autopsy/ingest/IngestScheduler.java @@ -21,11 +21,10 @@ package org.sleuthkit.autopsy.ingest; import java.util.ArrayList; import java.util.Collection; import java.util.Comparator; +import java.util.Iterator; import java.util.List; import java.util.TreeSet; -import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.atomic.AtomicLong; import java.util.logging.Level; import java.util.logging.Logger; import java.util.regex.Matcher; @@ -42,15 +41,14 @@ final class IngestScheduler { private static final IngestScheduler instance = new IngestScheduler(); private static final Logger logger = Logger.getLogger(IngestScheduler.class.getName()); private static final int FAT_NTFS_FLAGS = TskData.TSK_FS_TYPE_ENUM.TSK_FS_TYPE_FAT12.getValue() | TskData.TSK_FS_TYPE_ENUM.TSK_FS_TYPE_FAT16.getValue() | TskData.TSK_FS_TYPE_ENUM.TSK_FS_TYPE_FAT32.getValue() | TskData.TSK_FS_TYPE_ENUM.TSK_FS_TYPE_NTFS.getValue(); - private final ConcurrentHashMap ingestJobsById = new ConcurrentHashMap<>(); private final LinkedBlockingQueue dataSourceTasks = new LinkedBlockingQueue<>(); private final TreeSet rootDirectoryTasks = new TreeSet<>(new RootDirectoryTaskComparator()); // Guarded by this private final List directoryTasks = new ArrayList<>(); // Guarded by this private final LinkedBlockingQueue fileTasks = new LinkedBlockingQueue<>(); // Guarded by this - private final List tasksInProgress = new ArrayList<>(); // Guarded by this + private final List dataSourceTasksInProgress = new ArrayList<>(); // Guarded by this + private final List fileTasksInProgress = new ArrayList<>(); // Guarded by this private final DataSourceIngestTaskQueue dataSourceTaskDispenser = new DataSourceIngestTaskQueue(); private final FileIngestTaskQueue fileTaskDispenser = new FileIngestTaskQueue(); - private final AtomicLong nextIngestJobId = new AtomicLong(0L); static IngestScheduler getInstance() { return instance; @@ -59,57 +57,15 @@ final class IngestScheduler { private IngestScheduler() { } - /** - * Creates an ingest job for a data source. - * - * @param rootDataSource The data source to ingest. - * @param ingestModuleTemplates The ingest module templates to use to create - * the ingest pipelines for the job. - * @param processUnallocatedSpace Whether or not the job should include - * processing of unallocated space. - * @return A collection of ingest module start up errors, empty on success. - * @throws InterruptedException - */ - List startIngestJob(Content dataSource, List ingestModuleTemplates, boolean processUnallocatedSpace) throws InterruptedException { - long jobId = nextIngestJobId.incrementAndGet(); - IngestJob job = new IngestJob(jobId, dataSource, ingestModuleTemplates, processUnallocatedSpace); - ingestJobsById.put(jobId, job); - IngestManager.getInstance().fireIngestJobStarted(jobId); - List errors = job.startUp(); - if (errors.isEmpty()) { - addDataSourceToIngestJob(job, dataSource); - } else { - ingestJobsById.remove(jobId); - IngestManager.getInstance().fireIngestJobCancelled(jobId); - } - return errors; - } - - boolean ingestJobsAreRunning() { - for (IngestJob job : ingestJobsById.values()) { - if (!job.isCancelled()) { - return true; - } - } - return false; - } - - synchronized void addDataSourceToIngestJob(IngestJob job, Content dataSource) throws InterruptedException { - // Enqueue a data source ingest task for the data source. - // If the thread executing this code is interrupted, it is because the - // the number of ingest threads has been decreased while ingest jobs are - // running. The calling thread will exit in an orderly fashion, but the - // task still needs to be enqueued rather than lost, hence the loop. + synchronized void addTasksForIngestJob(IngestJob job, Content dataSource) throws InterruptedException { + // Enqueue a data source ingest task for the data source. DataSourceIngestTask task = new DataSourceIngestTask(job, dataSource); - while (true) { - try { - dataSourceTasks.put(task); - break; - } catch (InterruptedException ex) { - // Reset the interrupted status of the thread so the orderly - // exit can occur in the intended place. - Thread.currentThread().interrupt(); - } + try { + dataSourceTasks.put(task); + } catch (InterruptedException ex) { + Thread.currentThread().interrupt(); + logger.log(Level.FINE, "Task scheduling for ingest job interrupted", ex); //NON-NLS + return; } // Get the top level files of the data source. @@ -150,21 +106,50 @@ final class IngestScheduler { } } - updateFileTaskQueues(null); + updateFileTaskQueues(); } - void addFileToIngestJob(IngestJob job, AbstractFile file) { + void addFileTaskToIngestJob(IngestJob job, AbstractFile file) { FileIngestTask task = new FileIngestTask(job, file); if (shouldEnqueueFileTask(task)) { - addTaskToFileQueue(task); + try { + fileTasks.put(task); + } catch (InterruptedException ex) { + Thread.currentThread().interrupt(); + logger.log(Level.FINE, "Task scheduling for ingest job interrupted", ex); //NON-NLS + } } } - private synchronized void updateFileTaskQueues(FileIngestTask taskInProgress) throws InterruptedException { - if (taskInProgress != null) { - tasksInProgress.add(taskInProgress); + synchronized void removeTasksForIngestJob(long ingestJobId) { + // Remove all tasks for this ingest job that are not in progress. + Iterator fileTasksIterator = fileTasks.iterator(); + while (fileTasksIterator.hasNext()) { + if (fileTasksIterator.next().getIngestJob().getId() == ingestJobId) { + fileTasksIterator.remove(); + } } + Iterator directoryTasksIterator = directoryTasks.iterator(); + while (directoryTasksIterator.hasNext()) { + if (directoryTasksIterator.next().getIngestJob().getId() == ingestJobId) { + directoryTasksIterator.remove(); + } + } + Iterator rootDirectoryTasksIterator = rootDirectoryTasks.iterator(); + while (rootDirectoryTasksIterator.hasNext()) { + if (rootDirectoryTasksIterator.next().getIngestJob().getId() == ingestJobId) { + rootDirectoryTasksIterator.remove(); + } + } + Iterator dataSourceTasksIterator = dataSourceTasks.iterator(); + while (dataSourceTasksIterator.hasNext()) { + if (dataSourceTasksIterator.next().getIngestJob().getId() == ingestJobId) { + dataSourceTasksIterator.remove(); + } + } + } + private synchronized void updateFileTaskQueues() throws InterruptedException { // we loop because we could have a directory that has all files // that do not get enqueued while (true) { @@ -187,7 +172,13 @@ final class IngestScheduler { final AbstractFile parentFile = parentTask.getFile(); // add itself to the file list if (shouldEnqueueFileTask(parentTask)) { - addTaskToFileQueue(parentTask); + try { + fileTasks.put(parentTask); + } catch (InterruptedException ex) { + Thread.currentThread().interrupt(); + logger.log(Level.FINE, "Task scheduling for ingest job interrupted", ex); //NON-NLS + return; + } } // add its children to the file and directory lists try { @@ -199,29 +190,18 @@ final class IngestScheduler { if (childFile.hasChildren()) { directoryTasks.add(childTask); } else if (shouldEnqueueFileTask(childTask)) { - addTaskToFileQueue(childTask); + try { + fileTasks.put(childTask); + } catch (InterruptedException ex) { + Thread.currentThread().interrupt(); + logger.log(Level.FINE, "Task scheduling for ingest job interrupted", ex); //NON-NLS + return; + } } } } } catch (TskCoreException ex) { - logger.log(Level.SEVERE, "Could not get children of file and update file queues: " + parentFile.getName(), ex); - } - } - } - - private void addTaskToFileQueue(FileIngestTask task) { - // If the thread executing this code is interrupted, it is because the - // the number of ingest threads has been decreased while ingest jobs are - // running. The calling thread will exit in an orderly fashion, but the - // task still needs to be enqueued rather than lost. - while (true) { - try { - fileTasks.put(task); - break; - } catch (InterruptedException ex) { - // Reset the interrupted status of the thread so the orderly - // exit can occur in the intended place. - Thread.currentThread().interrupt(); + logger.log(Level.SEVERE, "Could not get children of file and update file queues: " + parentFile.getName(), ex); //NON-NLS } } } @@ -271,12 +251,6 @@ final class IngestScheduler { return true; } - void cancelAllIngestJobs() { - for (IngestJob job : ingestJobsById.values()) { - job.cancel(); - } - } - IngestTaskQueue getDataSourceIngestTaskQueue() { return dataSourceTaskDispenser; } @@ -285,45 +259,52 @@ final class IngestScheduler { return fileTaskDispenser; } - void ingestTaskIsCompleted(IngestTask completedTask) { - if (ingestJobIsCompleted(completedTask)) { - IngestJob job = completedTask.getIngestJob(); - job.shutDown(); - ingestJobsById.remove(job.getId()); - IngestManager.getInstance().fireIngestJobCompleted(job.getId()); - } + synchronized void notifyDataSourceIngestTaskCompleted(DataSourceIngestTask task) { + dataSourceTasksInProgress.remove(task); + } + + synchronized void notifyFileIngestTaskCompleted(FileIngestTask task) { + fileTasksInProgress.remove(task); } - private synchronized boolean ingestJobIsCompleted(IngestTask completedTask) { - tasksInProgress.remove(completedTask); - IngestJob job = completedTask.getIngestJob(); + synchronized boolean hasDataSourceIngestTaskForIngestJob(IngestJob job) { long jobId = job.getId(); - for (IngestTask task : tasksInProgress) { + for (IngestTask task : dataSourceTasksInProgress) { if (task.getIngestJob().getId() == jobId) { - return false; - } - } - for (FileIngestTask task : fileTasks) { - if (task.getIngestJob().getId() == jobId) { - return false; - } - } - for (FileIngestTask task : directoryTasks) { - if (task.getIngestJob().getId() == jobId) { - return false; - } - } - for (FileIngestTask task : rootDirectoryTasks) { - if (task.getIngestJob().getId() == jobId) { - return false; + return true; } } for (DataSourceIngestTask task : dataSourceTasks) { if (task.getIngestJob().getId() == jobId) { - return false; + return true; } } - return true; + return false; + } + + synchronized boolean hasFileIngestTaskForIngestJob(IngestJob job) { + long jobId = job.getId(); + for (IngestTask task : fileTasksInProgress) { + if (task.getIngestJob().getId() == jobId) { + return true; + } + } + for (FileIngestTask task : fileTasks) { + if (task.getIngestJob().getId() == jobId) { + return true; + } + } + for (FileIngestTask task : directoryTasks) { + if (task.getIngestJob().getId() == jobId) { + return true; + } + } + for (FileIngestTask task : rootDirectoryTasks) { + if (task.getIngestJob().getId() == jobId) { + return true; + } + } + return false; } private static class RootDirectoryTaskComparator implements Comparator { @@ -426,7 +407,11 @@ final class IngestScheduler { @Override public IngestTask getNextTask() throws InterruptedException { - return dataSourceTasks.take(); + DataSourceIngestTask task = dataSourceTasks.take(); + synchronized (this) { + dataSourceTasksInProgress.add(task); + } + return task; } } @@ -435,7 +420,10 @@ final class IngestScheduler { @Override public IngestTask getNextTask() throws InterruptedException { FileIngestTask task = fileTasks.take(); - updateFileTaskQueues(task); + synchronized (this) { + fileTasksInProgress.add(task); + } + updateFileTaskQueues(); return task; } } diff --git a/Core/src/org/sleuthkit/autopsy/ingest/NoIngestModuleIngestJobSettings.java b/Core/src/org/sleuthkit/autopsy/ingest/NoIngestModuleIngestJobSettings.java index 4c92cfc3ee..df850092f5 100755 --- a/Core/src/org/sleuthkit/autopsy/ingest/NoIngestModuleIngestJobSettings.java +++ b/Core/src/org/sleuthkit/autopsy/ingest/NoIngestModuleIngestJobSettings.java @@ -24,11 +24,12 @@ package org.sleuthkit.autopsy.ingest; */ public final class NoIngestModuleIngestJobSettings implements IngestModuleIngestJobSettings { + private static final long serialVersionUID = 1L; private final String setting = "None"; //NON-NLS @Override - public String getVersionNumber() { - return "1.0"; //NON-NLS + public long getVersionNumber() { + return serialVersionUID; } /** diff --git a/Core/src/org/sleuthkit/autopsy/modules/exif/ExifParserFileIngestModule.java b/Core/src/org/sleuthkit/autopsy/modules/exif/ExifParserFileIngestModule.java index 75d5582d45..d79db1277e 100644 --- a/Core/src/org/sleuthkit/autopsy/modules/exif/ExifParserFileIngestModule.java +++ b/Core/src/org/sleuthkit/autopsy/modules/exif/ExifParserFileIngestModule.java @@ -36,7 +36,6 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.logging.Level; import org.sleuthkit.autopsy.coreutils.ImageUtils; import org.sleuthkit.autopsy.coreutils.Logger; -import org.sleuthkit.autopsy.ingest.IngestModuleAdapter; import org.sleuthkit.autopsy.ingest.FileIngestModule; import org.sleuthkit.autopsy.ingest.IngestJobContext; import org.sleuthkit.autopsy.ingest.IngestServices; @@ -56,7 +55,7 @@ import org.sleuthkit.datamodel.TskData.TSK_DB_FILES_TYPE_ENUM; * files. Ingests an image file and, if available, adds it's date, latitude, * longitude, altitude, device model, and device make to a blackboard artifact. */ -public final class ExifParserFileIngestModule extends IngestModuleAdapter implements FileIngestModule { +public final class ExifParserFileIngestModule implements FileIngestModule { private static final Logger logger = Logger.getLogger(ExifParserFileIngestModule.class.getName()); private final IngestServices services = IngestServices.getInstance(); @@ -198,7 +197,7 @@ public final class ExifParserFileIngestModule extends IngestModuleAdapter implem } @Override - public void shutDown(boolean ingestJobCancelled) { + public void shutDown() { // We only need to check for this final event on the last module per job if (refCounter.decrementAndGet(jobId) == 0) { if (filesToFire) { diff --git a/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/FileExtMismatchDetectorModuleSettings.java b/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/FileExtMismatchDetectorModuleSettings.java index 7a88433067..a894fe60a6 100755 --- a/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/FileExtMismatchDetectorModuleSettings.java +++ b/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/FileExtMismatchDetectorModuleSettings.java @@ -25,6 +25,7 @@ import org.sleuthkit.autopsy.ingest.IngestModuleIngestJobSettings; */ final class FileExtMismatchDetectorModuleSettings implements IngestModuleIngestJobSettings { + private static final long serialVersionUID = 1L; private boolean skipFilesWithNoExtension = true; private boolean skipFilesWithTextPlainMimeType = false; @@ -37,8 +38,8 @@ final class FileExtMismatchDetectorModuleSettings implements IngestModuleIngestJ } @Override - public String getVersionNumber() { - return "1.0"; //NON-NLS + public long getVersionNumber() { + return serialVersionUID; } void setSkipFilesWithNoExtension(boolean enabled) { diff --git a/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/FileExtMismatchIngestModule.java b/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/FileExtMismatchIngestModule.java index 6c0928619c..e9b51a438e 100644 --- a/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/FileExtMismatchIngestModule.java +++ b/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/FileExtMismatchIngestModule.java @@ -26,7 +26,6 @@ import java.util.List; import java.util.logging.Level; import org.openide.util.NbBundle; import org.sleuthkit.autopsy.coreutils.Logger; -import org.sleuthkit.autopsy.ingest.IngestModuleAdapter; import org.sleuthkit.autopsy.ingest.FileIngestModule; import org.sleuthkit.autopsy.ingest.IngestJobContext; import org.sleuthkit.autopsy.ingest.IngestMessage; @@ -44,7 +43,7 @@ import org.sleuthkit.datamodel.TskException; /** * Flags mismatched filename extensions based on file signature. */ -public class FileExtMismatchIngestModule extends IngestModuleAdapter implements FileIngestModule { +public class FileExtMismatchIngestModule implements FileIngestModule { private static final Logger logger = Logger.getLogger(FileExtMismatchIngestModule.class.getName()); private final IngestServices services = IngestServices.getInstance(); @@ -173,7 +172,7 @@ public class FileExtMismatchIngestModule extends IngestModuleAdapter implements } @Override - public void shutDown(boolean ingestJobCancelled) { + public void shutDown() { // We only need to post the summary msg from the last module per job if (refCounter.decrementAndGet(jobId) == 0) { IngestJobTotals jobTotals; diff --git a/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/FileExtMismatchXML.java b/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/FileExtMismatchXML.java index 558e78990f..1a955a1872 100644 --- a/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/FileExtMismatchXML.java +++ b/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/FileExtMismatchXML.java @@ -1,7 +1,7 @@ /* * Autopsy Forensic Browser * - * Copyright 2011 - 2013 Basis Technology Corp. + * Copyright 2011-2014 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -89,7 +89,7 @@ class FileExtMismatchXML { try { - final Document doc = XMLUtil.loadDoc(FileExtMismatchXML.class, filePath, XSDFILE); + final Document doc = XMLUtil.loadDoc(FileExtMismatchXML.class, filePath); if (doc == null) { return null; } diff --git a/Core/src/org/sleuthkit/autopsy/modules/filetypeid/FileTypeIdIngestModule.java b/Core/src/org/sleuthkit/autopsy/modules/filetypeid/FileTypeIdIngestModule.java index 2e89724e86..10f75dff8d 100644 --- a/Core/src/org/sleuthkit/autopsy/modules/filetypeid/FileTypeIdIngestModule.java +++ b/Core/src/org/sleuthkit/autopsy/modules/filetypeid/FileTypeIdIngestModule.java @@ -34,14 +34,13 @@ import org.sleuthkit.datamodel.TskData; import org.sleuthkit.datamodel.TskData.FileKnown; import org.sleuthkit.datamodel.TskException; import org.sleuthkit.autopsy.ingest.IngestModule.ProcessResult; -import org.sleuthkit.autopsy.ingest.IngestModuleAdapter; import org.sleuthkit.autopsy.ingest.IngestModuleReferenceCounter; /** * Detects the type of a file based on signature (magic) values. Posts results * to the blackboard. */ -public class FileTypeIdIngestModule extends IngestModuleAdapter implements FileIngestModule { +public class FileTypeIdIngestModule implements FileIngestModule { private static final Logger logger = Logger.getLogger(FileTypeIdIngestModule.class.getName()); private static final long MIN_FILE_SIZE = 512; @@ -129,7 +128,7 @@ public class FileTypeIdIngestModule extends IngestModuleAdapter implements FileI } @Override - public void shutDown(boolean ingestJobCancelled) { + public void shutDown() { // We only need to post the summary msg from the last module per job if (refCounter.decrementAndGet(jobId) == 0) { IngestJobTotals jobTotals; diff --git a/Core/src/org/sleuthkit/autopsy/modules/filetypeid/FileTypeIdModuleSettings.java b/Core/src/org/sleuthkit/autopsy/modules/filetypeid/FileTypeIdModuleSettings.java index f62cab64dc..c472596be4 100755 --- a/Core/src/org/sleuthkit/autopsy/modules/filetypeid/FileTypeIdModuleSettings.java +++ b/Core/src/org/sleuthkit/autopsy/modules/filetypeid/FileTypeIdModuleSettings.java @@ -25,6 +25,7 @@ import org.sleuthkit.autopsy.ingest.IngestModuleIngestJobSettings; */ public class FileTypeIdModuleSettings implements IngestModuleIngestJobSettings { + private static final long serialVersionUID = 1L; private volatile boolean skipKnownFiles = true; FileTypeIdModuleSettings() { @@ -35,8 +36,8 @@ public class FileTypeIdModuleSettings implements IngestModuleIngestJobSettings { } @Override - public String getVersionNumber() { - return "1.0"; //NON-NLS + public long getVersionNumber() { + return serialVersionUID; } void setSkipKnownFiles(boolean enabled) { diff --git a/Core/src/org/sleuthkit/autopsy/modules/sevenzip/SevenZipIngestModule.java b/Core/src/org/sleuthkit/autopsy/modules/sevenzip/SevenZipIngestModule.java index 9d67f8185b..8d4491c458 100644 --- a/Core/src/org/sleuthkit/autopsy/modules/sevenzip/SevenZipIngestModule.java +++ b/Core/src/org/sleuthkit/autopsy/modules/sevenzip/SevenZipIngestModule.java @@ -46,7 +46,6 @@ import org.netbeans.api.progress.ProgressHandleFactory; import org.sleuthkit.autopsy.casemodule.services.FileManager; import org.sleuthkit.autopsy.ingest.FileIngestModule; import org.sleuthkit.autopsy.ingest.IngestMessage; -import org.sleuthkit.autopsy.ingest.IngestModuleAdapter; import org.sleuthkit.autopsy.ingest.IngestMonitor; import org.sleuthkit.autopsy.ingest.ModuleContentEvent; import org.sleuthkit.datamodel.BlackboardArtifact; @@ -66,7 +65,7 @@ import org.sleuthkit.autopsy.ingest.IngestModuleReferenceCounter; * 7Zip ingest module extracts supported archives, adds extracted DerivedFiles, * reschedules extracted DerivedFiles for ingest. */ -public final class SevenZipIngestModule extends IngestModuleAdapter implements FileIngestModule { +public final class SevenZipIngestModule implements FileIngestModule { private static final Logger logger = Logger.getLogger(SevenZipIngestModule.class.getName()); private IngestServices services = IngestServices.getInstance(); @@ -186,7 +185,7 @@ public final class SevenZipIngestModule extends IngestModuleAdapter implements F } @Override - public void shutDown(boolean ingestJobCancelled) { + public void shutDown() { // We don't need the value, but for cleanliness and consistency refCounter.decrementAndGet(jobId); } diff --git a/Core/src/org/sleuthkit/autopsy/timeline/Timeline.java b/Core/src/org/sleuthkit/autopsy/timeline/Timeline.java index 4607f809c5..fe9ad3dd65 100644 --- a/Core/src/org/sleuthkit/autopsy/timeline/Timeline.java +++ b/Core/src/org/sleuthkit/autopsy/timeline/Timeline.java @@ -961,7 +961,7 @@ public class Timeline extends CallableSystemAction implements Presenter.Toolbar, //conversion to GMT - if (!ContentUtils.getDisplayInLocalTime()) { + if (!ContentUtils.shouldDisplayTimesInLocalTime()) { calendar.setTimeZone(TimeZone.getTimeZone("GMT")); } else{ diff --git a/CoreLibs/build.xml b/CoreLibs/build.xml index 9b561a327d..6d40d0b8c6 100644 --- a/CoreLibs/build.xml +++ b/CoreLibs/build.xml @@ -49,24 +49,14 @@ uri="antlib:org.apache.ivy.ant" classpathref="ivy.lib.path"/> - - - - - - - - - - - + + - diff --git a/HashDatabase/src/org/sleuthkit/autopsy/hashdatabase/Bundle.properties b/HashDatabase/src/org/sleuthkit/autopsy/hashdatabase/Bundle.properties index 3701d4a7ff..9a3468fce3 100644 --- a/HashDatabase/src/org/sleuthkit/autopsy/hashdatabase/Bundle.properties +++ b/HashDatabase/src/org/sleuthkit/autopsy/hashdatabase/Bundle.properties @@ -91,7 +91,7 @@ HashDbImportDatabaseDialog.mustSelectHashDbFilePathMsg=A hash database file path HashDbImportDatabaseDialog.hashDbDoesNotExistMsg=The selected hash database does not exist. HashDbImportDatabaseDialog.errorMessage.failedToOpenHashDbMsg=Failed to open hash database at {0}. HashDbIngestModule.moduleName=Hash Lookup -HashDbIngestModule.moduleDescription=Identifies known and notables files using supplied hash databases, such as a standard NSRL database. +HashDbIngestModule.moduleDescription=Identifies known and notable files using supplied hash databases, such as a standard NSRL database. HashDbIngestModule.noKnownHashDbSetMsg=No known hash database set HashDbIngestModule.knownFileSearchWillNotExecuteWarn=Known file search will not be executed. HashDbIngestModule.noKnownBadHashDbSetMsg=No known bad hash database set diff --git a/HashDatabase/src/org/sleuthkit/autopsy/hashdatabase/HashDbIngestModule.java b/HashDatabase/src/org/sleuthkit/autopsy/hashdatabase/HashDbIngestModule.java index d8e67613dc..484f3a8b8c 100644 --- a/HashDatabase/src/org/sleuthkit/autopsy/hashdatabase/HashDbIngestModule.java +++ b/HashDatabase/src/org/sleuthkit/autopsy/hashdatabase/HashDbIngestModule.java @@ -42,12 +42,11 @@ import org.sleuthkit.datamodel.TskCoreException; import org.sleuthkit.datamodel.TskData; import org.sleuthkit.datamodel.TskException; import org.sleuthkit.autopsy.hashdatabase.HashDbManager.HashDb; -import org.sleuthkit.autopsy.ingest.IngestModuleAdapter; import org.sleuthkit.autopsy.ingest.FileIngestModule; import org.sleuthkit.autopsy.ingest.IngestModuleReferenceCounter; import org.sleuthkit.datamodel.HashInfo; -public class HashDbIngestModule extends IngestModuleAdapter implements FileIngestModule { +public class HashDbIngestModule implements FileIngestModule { private static final Logger logger = Logger.getLogger(HashDbIngestModule.class.getName()); private static final int MAX_COMMENT_SIZE = 500; private final IngestServices services = IngestServices.getInstance(); @@ -359,7 +358,7 @@ public class HashDbIngestModule extends IngestModuleAdapter implements FileInges } @Override - public void shutDown(boolean ingestJobCancelled) { + public void shutDown() { if (refCounter.decrementAndGet(jobId) == 0) { postSummary(); } diff --git a/HashDatabase/src/org/sleuthkit/autopsy/hashdatabase/HashDbManager.java b/HashDatabase/src/org/sleuthkit/autopsy/hashdatabase/HashDbManager.java index 19250cd4a3..7aa31414be 100755 --- a/HashDatabase/src/org/sleuthkit/autopsy/hashdatabase/HashDbManager.java +++ b/HashDatabase/src/org/sleuthkit/autopsy/hashdatabase/HashDbManager.java @@ -554,7 +554,7 @@ public class HashDbManager implements PropertyChangeListener { boolean updatedSchema = false; // Open the XML document that implements the configuration file. - final Document doc = XMLUtil.loadDoc(HashDbManager.class, configFilePath, XSD_FILE_NAME); + final Document doc = XMLUtil.loadDoc(HashDbManager.class, configFilePath); if (doc == null) { return false; } diff --git a/HashDatabase/src/org/sleuthkit/autopsy/hashdatabase/HashLookupModuleSettings.java b/HashDatabase/src/org/sleuthkit/autopsy/hashdatabase/HashLookupModuleSettings.java index 76edf6c184..bd2d0bc1d8 100755 --- a/HashDatabase/src/org/sleuthkit/autopsy/hashdatabase/HashLookupModuleSettings.java +++ b/HashDatabase/src/org/sleuthkit/autopsy/hashdatabase/HashLookupModuleSettings.java @@ -28,6 +28,7 @@ import org.sleuthkit.autopsy.ingest.IngestModuleIngestJobSettings; */ final class HashLookupModuleSettings implements IngestModuleIngestJobSettings { + private static final long serialVersionUID = 1L; private final HashSet namesOfEnabledKnownHashSets = new HashSet<>(); private final HashSet namesOfEnabledKnownBadHashSets = new HashSet<>(); private boolean shouldCalculateHashes = true; @@ -39,8 +40,8 @@ final class HashLookupModuleSettings implements IngestModuleIngestJobSettings { } @Override - public String getVersionNumber() { - return "1.0"; //NON-NLS + public long getVersionNumber() { + return serialVersionUID; } boolean shouldCalculateHashes() { diff --git a/HashDatabase/src/org/sleuthkit/autopsy/hashdatabase/HashLookupModuleSettingsPanel.form b/HashDatabase/src/org/sleuthkit/autopsy/hashdatabase/HashLookupModuleSettingsPanel.form index 54962006e2..d5cefac03a 100644 --- a/HashDatabase/src/org/sleuthkit/autopsy/hashdatabase/HashLookupModuleSettingsPanel.form +++ b/HashDatabase/src/org/sleuthkit/autopsy/hashdatabase/HashLookupModuleSettingsPanel.form @@ -1,6 +1,11 @@
+ + + + + @@ -19,19 +24,19 @@ - - - - - - - - + + + + + + + + @@ -40,14 +45,15 @@ + - - + + diff --git a/HashDatabase/src/org/sleuthkit/autopsy/hashdatabase/HashLookupModuleSettingsPanel.java b/HashDatabase/src/org/sleuthkit/autopsy/hashdatabase/HashLookupModuleSettingsPanel.java index 414d7a1cb3..e2937ed00f 100644 --- a/HashDatabase/src/org/sleuthkit/autopsy/hashdatabase/HashLookupModuleSettingsPanel.java +++ b/HashDatabase/src/org/sleuthkit/autopsy/hashdatabase/HashLookupModuleSettingsPanel.java @@ -268,6 +268,8 @@ public final class HashLookupModuleSettingsPanel extends IngestModuleIngestJobSe jScrollPane2 = new javax.swing.JScrollPane(); knownBadHashTable = new javax.swing.JTable(); + setPreferredSize(new java.awt.Dimension(292, 150)); + jScrollPane1.setBorder(javax.swing.BorderFactory.createEtchedBorder()); knownHashTable.setBackground(new java.awt.Color(240, 240, 240)); @@ -303,29 +305,30 @@ public final class HashLookupModuleSettingsPanel extends IngestModuleIngestJobSe .addGroup(layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(alwaysCalcHashesCheckbox, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 285, Short.MAX_VALUE) - .addGroup(layout.createSequentialGroup() - .addGap(10, 10, 10) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE) - .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE))) .addGroup(layout.createSequentialGroup() .addComponent(knownHashDbsLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 272, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(0, 0, Short.MAX_VALUE)) - .addComponent(knownBadHashDbsLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addComponent(knownBadHashDbsLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGroup(layout.createSequentialGroup() + .addGap(10, 10, 10) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE) + .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE))) + .addComponent(alwaysCalcHashesCheckbox, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addContainerGap()) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() + .addGap(2, 2, 2) .addComponent(knownHashDbsLabel) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 58, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(knownBadHashDbsLabel) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 85, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 58, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 53, Short.MAX_VALUE) .addComponent(alwaysCalcHashesCheckbox) .addContainerGap()) ); diff --git a/HashDatabase/src/org/sleuthkit/autopsy/hashdatabase/HashLookupSettingsPanel.java b/HashDatabase/src/org/sleuthkit/autopsy/hashdatabase/HashLookupSettingsPanel.java index c414731036..bdc77069d2 100644 --- a/HashDatabase/src/org/sleuthkit/autopsy/hashdatabase/HashLookupSettingsPanel.java +++ b/HashDatabase/src/org/sleuthkit/autopsy/hashdatabase/HashLookupSettingsPanel.java @@ -231,9 +231,9 @@ public final class HashLookupSettingsPanel extends IngestModuleGlobalSettingsPan } private boolean isIngestJobEvent(PropertyChangeEvent evt) { - return evt.getPropertyName().equals(IngestManager.IngestEvent.INGEST_JOB_STARTED.toString()) - || evt.getPropertyName().equals(IngestManager.IngestEvent.INGEST_JOB_COMPLETED.toString()) - || evt.getPropertyName().equals(IngestManager.IngestEvent.INGEST_JOB_CANCELLED.toString()); + return evt.getPropertyName().equals(IngestManager.IngestJobEvent.STARTED.toString()) + || evt.getPropertyName().equals(IngestManager.IngestJobEvent.COMPLETED.toString()) + || evt.getPropertyName().equals(IngestManager.IngestJobEvent.CANCELLED.toString()); } @Override diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/AbstractFileStringExtract.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/AbstractFileStringExtract.java index 65ef4c31a1..1f6614ba28 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/AbstractFileStringExtract.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/AbstractFileStringExtract.java @@ -44,12 +44,11 @@ class AbstractFileStringExtract implements AbstractFileExtract { private static final int BOM_LEN = 0; //disabled prepending of BOM private static final Charset INDEX_CHARSET = Server.DEFAULT_INDEXED_TEXT_CHARSET; private static final SCRIPT DEFAULT_SCRIPT = SCRIPT.LATIN_2; - private final byte[] stringChunkBuf = new byte[(int) MAX_STRING_CHUNK_SIZE]; private KeywordSearchIngestModule module; private AbstractFile sourceFile; private int numChunks = 0; - private final List