diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties b/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties
index f0a42c0fd6..229ffe5cdb 100644
--- a/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties
+++ b/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties
@@ -236,10 +236,6 @@ CasePropertiesForm.imagesTable.columnModel.title1=Remove
CasePropertiesForm.imagesTable.columnModel.title0=Path
LocalFilesPanel.jButton1.text=Change
LocalFilesPanel.displayNameLabel.text=Logical File Set Display Name: Default
-CaseInformationPanel.jPanel1.TabConstraints.tabTitle=tab1
-CasePropertiesForm.caseNumberField.text=
-CasePropertiesForm.examinerField.text=
-CasePropertiesForm.crDateField.text=
-CasePropertiesForm.caseDirField.text=
-CasePropertiesForm.caseTypeField.text=
-CasePropertiesForm.dbNameField.text=
+IngestJobInfoPanel.jLabel1.text=Ingest Modules
+IngestJobInfoPanel.jLabel2.text=Ingest Jobs
+CaseInformationPanel.closeButton.text=Close
diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/CaseInformationPanel.form b/Core/src/org/sleuthkit/autopsy/casemodule/CaseInformationPanel.form
index 755d1dca70..74892fe40d 100755
--- a/Core/src/org/sleuthkit/autopsy/casemodule/CaseInformationPanel.form
+++ b/Core/src/org/sleuthkit/autopsy/casemodule/CaseInformationPanel.form
@@ -25,7 +25,7 @@
-
+
@@ -35,14 +35,21 @@
-
+
+
+
+
+
+
-
-
-
+
+
+
+
+
@@ -57,6 +64,16 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/CaseInformationPanel.java b/Core/src/org/sleuthkit/autopsy/casemodule/CaseInformationPanel.java
index 2e7711d8de..15370e5d45 100755
--- a/Core/src/org/sleuthkit/autopsy/casemodule/CaseInformationPanel.java
+++ b/Core/src/org/sleuthkit/autopsy/casemodule/CaseInformationPanel.java
@@ -1,45 +1,75 @@
/*
- * To change this license header, choose License Headers in Project Properties.
- * To change this template file, choose Tools | Templates
- * and open the template in the editor.
+ * Autopsy Forensic Browser
+ *
+ * Copyright 2011-2016 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.casemodule;
+import java.awt.event.ActionListener;
import java.util.Map;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import javax.swing.JOptionPane;
+import javax.swing.event.ChangeEvent;
import org.openide.util.NbBundle.Messages;
/**
- *
- * @author oliver
+ * Panel for displaying the case information, including both case details and
+ * ingest job history.
*/
-public class CaseInformationPanel extends javax.swing.JPanel {
+class CaseInformationPanel extends javax.swing.JPanel {
+
+ private static final Logger logger = Logger.getLogger(CaseInformationPanel.class.getName());
/**
* Creates new form CaseInformationPanel
*/
- public CaseInformationPanel() {
+ CaseInformationPanel() {
initComponents();
customizeComponents();
}
-
- @Messages({"CaseInformationPanel.caseDetails.header=Case Details"})
+
+ @Messages({"CaseInformationPanel.caseDetails.header=Case Details",
+ "CaseInformationPanel.ingestJobInfo.header=Ingest History",
+ "CaseInformationPanel.loadMetadataFail.message=Failed to load case metadata.",
+ "CaseInformationPanel.loadMetadataFail.title=Metadata load failure",})
private void customizeComponents() {
try {
Case currentCase = Case.getCurrentCase();
String crDate = currentCase.getCreatedDate();
String caseDir = currentCase.getCaseDirectory();
-
+
// put the image paths information into hashmap
Map imgPaths = Case.getImagePaths(currentCase.getSleuthkitCase());
CasePropertiesForm cpf = new CasePropertiesForm(currentCase, crDate, caseDir, imgPaths);
cpf.setSize(cpf.getPreferredSize());
this.tabbedPane.addTab(Bundle.CaseInformationPanel_caseDetails_header(), cpf);
+ this.tabbedPane.addTab(Bundle.CaseInformationPanel_ingestJobInfo_header(), new IngestJobInfoPanel());
+ this.tabbedPane.addChangeListener((ChangeEvent e) -> {
+ tabbedPane.getSelectedComponent().setSize(tabbedPane.getSelectedComponent().getPreferredSize());
+ });
} catch (CaseMetadata.CaseMetadataException ex) {
- //TOLOG
+ logger.log(Level.SEVERE, "Failed to load case metadata.", ex);
+ JOptionPane.showMessageDialog(null, Bundle.IngestJobInfoPanel_loadIngestJob_error_text(), Bundle.IngestJobInfoPanel_loadIngestJob_error_title(), JOptionPane.ERROR_MESSAGE);
}
}
-
+ void addCloseButtonAction(ActionListener action) {
+ this.closeButton.addActionListener(action);
+ }
/**
* This method is called from within the constructor to initialize the form.
* WARNING: Do NOT modify this code. The content of this method is always
@@ -51,20 +81,34 @@ public class CaseInformationPanel extends javax.swing.JPanel {
jPanel1 = new javax.swing.JPanel();
tabbedPane = new javax.swing.JTabbedPane();
+ closeButton = new javax.swing.JButton();
tabbedPane.setPreferredSize(new java.awt.Dimension(420, 200));
+ org.openide.awt.Mnemonics.setLocalizedText(closeButton, org.openide.util.NbBundle.getMessage(CaseInformationPanel.class, "CaseInformationPanel.closeButton.text")); // NOI18N
+ closeButton.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ closeButtonActionPerformed(evt);
+ }
+ });
+
javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
jPanel1.setLayout(jPanel1Layout);
jPanel1Layout.setHorizontalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addComponent(tabbedPane, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+ .addComponent(tabbedPane, javax.swing.GroupLayout.DEFAULT_SIZE, 709, Short.MAX_VALUE)
+ .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()
+ .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+ .addComponent(closeButton)
+ .addGap(5, 5, 5))
);
jPanel1Layout.setVerticalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()
- .addComponent(tabbedPane, javax.swing.GroupLayout.DEFAULT_SIZE, 228, Short.MAX_VALUE)
- .addGap(0, 0, 0))
+ .addGroup(jPanel1Layout.createSequentialGroup()
+ .addComponent(tabbedPane, javax.swing.GroupLayout.DEFAULT_SIZE, 223, Short.MAX_VALUE)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
+ .addComponent(closeButton)
+ .addGap(5, 5, 5))
);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
@@ -78,12 +122,17 @@ public class CaseInformationPanel extends javax.swing.JPanel {
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
);
}// //GEN-END:initComponents
+ private void closeButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_closeButtonActionPerformed
+ // TODO add your handling code here:
+ }//GEN-LAST:event_closeButtonActionPerformed
+
// Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JButton closeButton;
private javax.swing.JPanel jPanel1;
private javax.swing.JTabbedPane tabbedPane;
// End of variables declaration//GEN-END:variables
diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesAction.java b/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesAction.java
index b54d342a44..462a60d96a 100644
--- a/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesAction.java
+++ b/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesAction.java
@@ -20,6 +20,9 @@ package org.sleuthkit.autopsy.casemodule;
import java.awt.Dimension;
import java.awt.Toolkit;
+import java.awt.event.ActionEvent;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
import java.util.logging.Level;
import javax.swing.Action;
import javax.swing.JDialog;
@@ -27,6 +30,7 @@ import javax.swing.JFrame;
import org.openide.util.HelpCtx;
import org.openide.util.NbBundle;
import org.openide.util.actions.CallableSystemAction;
+import org.openide.windows.WindowManager;
import org.sleuthkit.autopsy.coreutils.Logger;
/**
@@ -46,6 +50,12 @@ final class CasePropertiesAction extends CallableSystemAction {
CasePropertiesAction() {
putValue(Action.NAME, NbBundle.getMessage(CasePropertiesAction.class, "CTL_CasePropertiesAction")); // put the action Name
this.setEnabled(false);
+ Case.addEventSubscriber(Case.Events.CURRENT_CASE.toString(), new PropertyChangeListener() {
+ @Override
+ public void propertyChange(PropertyChangeEvent evt) {
+ popUpWindow = null;
+ }
+ });
}
/**
@@ -54,31 +64,34 @@ final class CasePropertiesAction extends CallableSystemAction {
*/
@Override
public void performAction() {
- try {
+ if (popUpWindow == null) {
// create the popUp window for it
String title = NbBundle.getMessage(this.getClass(), "CasePropertiesAction.window.title");
- final JFrame frame = new JFrame(title);
- popUpWindow = new JDialog(frame, title, false); // to make the popUp Window to be modal
+ popUpWindow = new JDialog((JFrame) WindowManager.getDefault().getMainWindow(), title, false);
+ try {
- // create the case properties form
- CaseInformationPanel caseInformationPanel = new CaseInformationPanel();
+ CaseInformationPanel caseInformationPanel = new CaseInformationPanel();
+ caseInformationPanel.addCloseButtonAction((ActionEvent e) -> {
+ popUpWindow.dispose();
+ });
- // add the case properties form / panel to the popup window
- popUpWindow.add(caseInformationPanel);
- popUpWindow.setResizable(true);
- popUpWindow.pack();
-
+ popUpWindow.add(caseInformationPanel);
+ popUpWindow.setResizable(true);
+ popUpWindow.pack();
- // set the location of the popUp Window on the center of the screen
- Dimension screenDimension = Toolkit.getDefaultToolkit().getScreenSize();
- double w = popUpWindow.getSize().getWidth();
- double h = popUpWindow.getSize().getHeight();
- popUpWindow.setLocation((int) ((screenDimension.getWidth() - w) / 2), (int) ((screenDimension.getHeight() - h) / 2));
+ // set the location of the popUp Window on the center of the screen
+ Dimension screenDimension = Toolkit.getDefaultToolkit().getScreenSize();
+ double w = popUpWindow.getSize().getWidth();
+ double h = popUpWindow.getSize().getHeight();
+ popUpWindow.setLocation((int) ((screenDimension.getWidth() - w) / 2), (int) ((screenDimension.getHeight() - h) / 2));
- popUpWindow.setVisible(true);
- } catch (Exception ex) {
- Logger.getLogger(CasePropertiesAction.class.getName()).log(Level.WARNING, "Error displaying Case Properties window.", ex); //NON-NLS
+ popUpWindow.setVisible(true);
+ } catch (Exception ex) {
+ Logger.getLogger(CasePropertiesAction.class.getName()).log(Level.WARNING, "Error displaying Case Properties window.", ex); //NON-NLS
+ }
}
+ popUpWindow.setVisible(true);
+ popUpWindow.toFront();
}
/**
diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesForm.form b/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesForm.form
index 9ceccdad62..e2b4940105 100644
--- a/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesForm.form
+++ b/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesForm.form
@@ -126,9 +126,9 @@
-
+
-
+
@@ -283,31 +283,13 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -315,9 +297,6 @@
-
-
-
@@ -325,9 +304,6 @@
-
-
-
diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesForm.java b/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesForm.java
index 80605bc8c1..f4cc9cb24e 100644
--- a/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesForm.java
+++ b/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesForm.java
@@ -196,19 +196,10 @@ class CasePropertiesForm extends javax.swing.JPanel {
lbDbName.setFont(lbDbName.getFont().deriveFont(lbDbName.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
lbDbName.setText(org.openide.util.NbBundle.getMessage(CasePropertiesForm.class, "CasePropertiesForm.lbDbName.text")); // NOI18N
- caseNumberField.setText(org.openide.util.NbBundle.getMessage(CasePropertiesForm.class, "CasePropertiesForm.caseNumberField.text")); // NOI18N
-
- examinerField.setText(org.openide.util.NbBundle.getMessage(CasePropertiesForm.class, "CasePropertiesForm.examinerField.text")); // NOI18N
-
- crDateField.setText(org.openide.util.NbBundle.getMessage(CasePropertiesForm.class, "CasePropertiesForm.crDateField.text")); // NOI18N
-
- caseDirField.setText(org.openide.util.NbBundle.getMessage(CasePropertiesForm.class, "CasePropertiesForm.caseDirField.text")); // NOI18N
caseDirField.setMinimumSize(new java.awt.Dimension(25, 14));
- dbNameField.setText(org.openide.util.NbBundle.getMessage(CasePropertiesForm.class, "CasePropertiesForm.dbNameField.text")); // NOI18N
dbNameField.setMinimumSize(new java.awt.Dimension(25, 14));
- caseTypeField.setText(org.openide.util.NbBundle.getMessage(CasePropertiesForm.class, "CasePropertiesForm.caseTypeField.text")); // NOI18N
caseTypeField.setMaximumSize(new java.awt.Dimension(1, 0));
javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
@@ -276,7 +267,7 @@ class CasePropertiesForm extends javax.swing.JPanel {
.addComponent(caseDirLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(caseDirField, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
- .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+ .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(caseTypeField, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(lbDbType))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/IngestJobInfoPanel.form b/Core/src/org/sleuthkit/autopsy/casemodule/IngestJobInfoPanel.form
new file mode 100755
index 0000000000..a67b768492
--- /dev/null
+++ b/Core/src/org/sleuthkit/autopsy/casemodule/IngestJobInfoPanel.form
@@ -0,0 +1,117 @@
+
+
+
diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/IngestJobInfoPanel.java b/Core/src/org/sleuthkit/autopsy/casemodule/IngestJobInfoPanel.java
new file mode 100755
index 0000000000..ac9e55b277
--- /dev/null
+++ b/Core/src/org/sleuthkit/autopsy/casemodule/IngestJobInfoPanel.java
@@ -0,0 +1,261 @@
+/*
+ * Autopsy Forensic Browser
+ *
+ * Copyright 2011-2016 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.casemodule;
+
+import java.beans.PropertyChangeEvent;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import javax.swing.JOptionPane;
+import javax.swing.event.ListSelectionEvent;
+import javax.swing.table.AbstractTableModel;
+import org.openide.util.NbBundle.Messages;
+import org.sleuthkit.autopsy.ingest.IngestManager;
+import org.sleuthkit.datamodel.IngestJobInfo;
+import org.sleuthkit.datamodel.IngestModuleInfo;
+import org.sleuthkit.datamodel.SleuthkitCase;
+import org.sleuthkit.datamodel.TskCoreException;
+
+/**
+ * Panel for displaying ingest job history.
+ */
+public final class IngestJobInfoPanel extends javax.swing.JPanel {
+
+ private static final Logger logger = Logger.getLogger(IngestJobInfoPanel.class.getName());
+ private List ingestJobs;
+ private IngestJobTableModel ingestJobTableModel = new IngestJobTableModel();
+ private IngestModuleTableModel ingestModuleTableModel = new IngestModuleTableModel(null);
+ private final DateFormat datetimeFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
+
+ /**
+ * Creates new form IngestJobInfoPanel
+ */
+ public IngestJobInfoPanel() {
+ initComponents();
+ customizeComponents();
+ }
+
+ @Messages({"IngestJobInfoPanel.loadIngestJob.error.text=Failed to load ingest jobs.",
+ "IngestJobInfoPanel.loadIngestJob.error.title=Load Failure"})
+ private void customizeComponents() {
+ refresh();
+ this.ingestJobTable.getSelectionModel().addListSelectionListener((ListSelectionEvent e) -> {
+ this.ingestModuleTableModel = new IngestModuleTableModel(this.ingestJobs.get(ingestJobTable.getSelectedRow()));
+ this.ingestModuleTable.setModel(this.ingestModuleTableModel);
+ });
+
+ IngestManager.getInstance().addIngestJobEventListener((PropertyChangeEvent evt) -> {
+ if (evt.getPropertyName().equals(IngestManager.IngestJobEvent.STARTED.toString())
+ || evt.getPropertyName().equals(IngestManager.IngestJobEvent.CANCELLED.toString())
+ || evt.getPropertyName().equals(IngestManager.IngestJobEvent.COMPLETED.toString())) {
+ refresh();
+ }
+ });
+ }
+
+ private void refresh() {
+ SleuthkitCase skCase = Case.getCurrentCase().getSleuthkitCase();
+ try {
+ List ingestJobs = skCase.getIngestJobs();
+ this.ingestJobs = ingestJobs;
+ this.repaint();
+ } catch (TskCoreException ex) {
+ logger.log(Level.SEVERE, "Failed to load ingest jobs.", ex);
+ JOptionPane.showMessageDialog(null, Bundle.IngestJobInfoPanel_loadIngestJob_error_text(), Bundle.IngestJobInfoPanel_loadIngestJob_error_title(), JOptionPane.ERROR_MESSAGE);
+ }
+ }
+
+ @Messages({"IngestJobInfoPanel.IngestJobTableModel.DataSource.header=Data Source",
+ "IngestJobInfoPanel.IngestJobTableModel.StartTime.header=Start Time",
+ "IngestJobInfoPanel.IngestJobTableModel.EndTime.header=End Time",
+ "IngestJobInfoPanel.IngestJobTableModel.IngestStatus.header=Ingest Status"})
+ private class IngestJobTableModel extends AbstractTableModel {
+
+ private List columnHeaders = new ArrayList<>();
+
+ IngestJobTableModel() {
+ columnHeaders.add(Bundle.IngestJobInfoPanel_IngestJobTableModel_DataSource_header());
+ columnHeaders.add(Bundle.IngestJobInfoPanel_IngestJobTableModel_StartTime_header());
+ columnHeaders.add(Bundle.IngestJobInfoPanel_IngestJobTableModel_EndTime_header());
+ columnHeaders.add(Bundle.IngestJobInfoPanel_IngestJobTableModel_IngestStatus_header());
+ }
+
+ @Override
+ public int getRowCount() {
+ return ingestJobs.size();
+ }
+
+ @Override
+ public int getColumnCount() {
+ return columnHeaders.size();
+ }
+
+ @Override
+ public Object getValueAt(int rowIndex, int columnIndex) {
+ IngestJobInfo currIngestJob = ingestJobs.get(rowIndex);
+ SleuthkitCase skCase = Case.getCurrentCase().getSleuthkitCase();
+ if (columnIndex == 0) {
+ try {
+ return skCase.getContentById(currIngestJob.getObjectId()).getName();
+ } catch (TskCoreException ex) {
+ logger.log(Level.SEVERE, "Failed to get content from db", ex);
+ return "";
+ }
+ } else if (columnIndex == 1) {
+ return datetimeFormat.format(currIngestJob.getStartDateTime());
+ } else if (columnIndex == 2) {
+ Date endDate = currIngestJob.getEndDateTime();
+ if (endDate.getTime() == 0) {
+ return "N/A";
+ }
+ return datetimeFormat.format(currIngestJob.getEndDateTime());
+ } else if (columnIndex == 3) {
+ return currIngestJob.getStatus().getDisplayName();
+ }
+ return null;
+ }
+
+ @Override
+ public String getColumnName(int column) {
+ return columnHeaders.get(column);
+ }
+
+ }
+
+ @Messages({"IngestJobInfoPanel.IngestModuleTableModel.ModuleName.header=Module Name",
+ "IngestJobInfoPanel.IngestModuleTableModel.ModuleVersion.header=Module Version"})
+ private class IngestModuleTableModel extends AbstractTableModel {
+
+ private List columnHeaders = new ArrayList<>();
+ private IngestJobInfo currJob;
+
+ IngestModuleTableModel(IngestJobInfo currJob) {
+ columnHeaders.add(Bundle.IngestJobInfoPanel_IngestModuleTableModel_ModuleName_header());
+ columnHeaders.add(Bundle.IngestJobInfoPanel_IngestModuleTableModel_ModuleVersion_header());
+ this.currJob = currJob;
+ }
+
+ @Override
+ public int getRowCount() {
+ if (currJob == null) {
+ return 0;
+ }
+ return currJob.getIngestModuleInfo().size();
+ }
+
+ @Override
+ public int getColumnCount() {
+ return columnHeaders.size();
+ }
+
+ @Override
+ public Object getValueAt(int rowIndex, int columnIndex) {
+ if (currJob != null) {
+ IngestModuleInfo currIngestModule = currJob.getIngestModuleInfo().get(rowIndex);
+ if (columnIndex == 0) {
+ return currIngestModule.getDisplayName();
+ } else if (columnIndex == 1) {
+ return currIngestModule.getVersion();
+ }
+ return null;
+ }
+ return null;
+ }
+
+ @Override
+ public String getColumnName(int column) {
+ return columnHeaders.get(column);
+ }
+
+ }
+
+ /**
+ * This method is called from within the constructor to initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is always
+ * regenerated by the Form Editor.
+ */
+ @SuppressWarnings("unchecked")
+ // //GEN-BEGIN:initComponents
+ private void initComponents() {
+
+ jScrollPane1 = new javax.swing.JScrollPane();
+ ingestJobTable = new javax.swing.JTable();
+ jLabel1 = new javax.swing.JLabel();
+ jLabel2 = new javax.swing.JLabel();
+ jScrollPane2 = new javax.swing.JScrollPane();
+ ingestModuleTable = new javax.swing.JTable();
+
+ jScrollPane1.setBorder(null);
+
+ ingestJobTable.setModel(ingestJobTableModel);
+ ingestJobTable.getTableHeader().setReorderingAllowed(false);
+ jScrollPane1.setViewportView(ingestJobTable);
+ ingestJobTable.getColumnModel().getSelectionModel().setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
+
+ org.openide.awt.Mnemonics.setLocalizedText(jLabel1, org.openide.util.NbBundle.getMessage(IngestJobInfoPanel.class, "IngestJobInfoPanel.jLabel1.text")); // NOI18N
+
+ org.openide.awt.Mnemonics.setLocalizedText(jLabel2, org.openide.util.NbBundle.getMessage(IngestJobInfoPanel.class, "IngestJobInfoPanel.jLabel2.text")); // NOI18N
+
+ ingestModuleTable.setModel(ingestModuleTableModel);
+ jScrollPane2.setViewportView(ingestModuleTable);
+
+ javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
+ this.setLayout(layout);
+ layout.setHorizontalGroup(
+ layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(layout.createSequentialGroup()
+ .addGap(15, 15, 15)
+ .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addComponent(jLabel2)
+ .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 485, Short.MAX_VALUE))
+ .addGap(8, 8, 8)
+ .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 254, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addComponent(jLabel1))
+ .addContainerGap())
+ );
+ layout.setVerticalGroup(
+ layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(layout.createSequentialGroup()
+ .addGap(8, 8, 8)
+ .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+ .addComponent(jLabel1)
+ .addComponent(jLabel2))
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 162, Short.MAX_VALUE)
+ .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE))
+ .addGap(10, 10, 10))
+ );
+ }// //GEN-END:initComponents
+
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JTable ingestJobTable;
+ private javax.swing.JTable ingestModuleTable;
+ private javax.swing.JLabel jLabel1;
+ private javax.swing.JLabel jLabel2;
+ private javax.swing.JScrollPane jScrollPane1;
+ private javax.swing.JScrollPane jScrollPane2;
+ // End of variables declaration//GEN-END:variables
+}
diff --git a/Core/src/org/sleuthkit/autopsy/images/information-frame.png b/Core/src/org/sleuthkit/autopsy/images/information-frame.png
new file mode 100755
index 0000000000..a7b53a7f62
Binary files /dev/null and b/Core/src/org/sleuthkit/autopsy/images/information-frame.png differ
diff --git a/Core/src/org/sleuthkit/autopsy/images/warning_triangle.png b/Core/src/org/sleuthkit/autopsy/images/warning_triangle.png
new file mode 100755
index 0000000000..b7024717af
Binary files /dev/null and b/Core/src/org/sleuthkit/autopsy/images/warning_triangle.png differ
diff --git a/Core/src/org/sleuthkit/autopsy/ingest/Bundle.properties b/Core/src/org/sleuthkit/autopsy/ingest/Bundle.properties
index 59f23b4239..f8c1816e85 100755
--- a/Core/src/org/sleuthkit/autopsy/ingest/Bundle.properties
+++ b/Core/src/org/sleuthkit/autopsy/ingest/Bundle.properties
@@ -114,3 +114,4 @@ IngestJobSettingsPanel.globalSettingsButton.text=Global Settings
gest
IngestJobSettingsPanel.globalSettingsButton.actionCommand=Advanced
IngestJobSettingsPanel.globalSettingsButton.text=Global Settings
+IngestJobSettingsPanel.pastJobsButton.text=View Ingest History
diff --git a/Core/src/org/sleuthkit/autopsy/ingest/IngestJobSettingsPanel.form b/Core/src/org/sleuthkit/autopsy/ingest/IngestJobSettingsPanel.form
index cb6eb5bf9d..8c98480783 100644
--- a/Core/src/org/sleuthkit/autopsy/ingest/IngestJobSettingsPanel.form
+++ b/Core/src/org/sleuthkit/autopsy/ingest/IngestJobSettingsPanel.form
@@ -34,44 +34,46 @@
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
-
+
-
-
+
+
+
-
+
-
+
-
+
-
+
+
+
-
+
@@ -135,8 +137,8 @@
-
-
+
+
@@ -244,5 +246,15 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/Core/src/org/sleuthkit/autopsy/ingest/IngestJobSettingsPanel.java b/Core/src/org/sleuthkit/autopsy/ingest/IngestJobSettingsPanel.java
index f80add0512..0a368a635e 100644
--- a/Core/src/org/sleuthkit/autopsy/ingest/IngestJobSettingsPanel.java
+++ b/Core/src/org/sleuthkit/autopsy/ingest/IngestJobSettingsPanel.java
@@ -19,22 +19,37 @@
package org.sleuthkit.autopsy.ingest;
import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;
import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import javax.swing.Icon;
+import javax.swing.ImageIcon;
+import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
+import javax.swing.SwingUtilities;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableColumn;
import org.openide.util.NbBundle.Messages;
+import org.sleuthkit.autopsy.casemodule.Case;
+import org.sleuthkit.autopsy.casemodule.IngestJobInfoPanel;
import org.sleuthkit.autopsy.corecomponents.AdvancedConfigurationDialog;
+import org.sleuthkit.datamodel.Content;
+import org.sleuthkit.datamodel.IngestJobInfo;
+import org.sleuthkit.datamodel.IngestModuleInfo;
+import org.sleuthkit.datamodel.SleuthkitCase;
+import org.sleuthkit.datamodel.TskCoreException;
/**
* User interface component to allow a user to make ingest job settings.
@@ -44,6 +59,10 @@ public final class IngestJobSettingsPanel extends javax.swing.JPanel {
private final IngestJobSettings settings;
private final List modules;
private IngestModuleModel selectedModule;
+ private IngestModulesTableModel tableModel = new IngestModulesTableModel();
+ private List ingestJobs;
+ private List dataSources;
+ private static final Logger logger = Logger.getLogger(IngestJobSettingsPanel.class.getName());
/**
* Construct a user interface component to allow a user to make ingest job
@@ -57,6 +76,39 @@ public final class IngestJobSettingsPanel extends javax.swing.JPanel {
for (IngestModuleTemplate moduleTemplate : settings.getIngestModuleTemplates()) {
this.modules.add(new IngestModuleModel(moduleTemplate));
}
+ SleuthkitCase skCase = Case.getCurrentCase().getSleuthkitCase();
+ try {
+ ingestJobs = skCase.getIngestJobs();
+ } catch (TskCoreException ex) {
+ logger.log(Level.SEVERE, "Failed to load ingest job information.", ex);
+ ingestJobs = new ArrayList<>();
+ }
+ this.dataSources = new ArrayList<>();
+ initComponents();
+ customizeComponents();
+ }
+
+ /**
+ * Construct a user interface component to allow a user to make ingest job
+ * settings.
+ *
+ * @param settings The initial settings for the ingest job.
+ * @param dataSources The data sources ingest is being run on.
+ */
+ IngestJobSettingsPanel(IngestJobSettings settings, List dataSources) {
+ this.settings = settings;
+ this.modules = new ArrayList<>();
+ for (IngestModuleTemplate moduleTemplate : settings.getIngestModuleTemplates()) {
+ this.modules.add(new IngestModuleModel(moduleTemplate));
+ }
+ SleuthkitCase skCase = Case.getCurrentCase().getSleuthkitCase();
+ try {
+ ingestJobs = skCase.getIngestJobs();
+ } catch (TskCoreException ex) {
+ logger.log(Level.SEVERE, "Failed to load ingest job information.", ex);
+ ingestJobs = new ArrayList<>();
+ }
+ this.dataSources = dataSources;
initComponents();
customizeComponents();
}
@@ -82,7 +134,7 @@ public final class IngestJobSettingsPanel extends javax.swing.JPanel {
@Messages({"IngestJobSettingsPanel.noPerRunSettings=The selected module has no per-run settings."})
private void customizeComponents() {
- modulesTable.setModel(new IngestModulesTableModel());
+ modulesTable.setModel(tableModel);
modulesTable.setTableHeader(null);
modulesTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
@@ -127,6 +179,10 @@ public final class IngestJobSettingsPanel extends javax.swing.JPanel {
});
modulesTable.setRowSelectionInterval(0, 0);
processUnallocCheckbox.setSelected(this.settings.getProcessUnallocatedSpace());
+ this.modulesTable.getColumnModel().getColumn(0).setMaxWidth(22);
+ this.modulesTable.getColumnModel().getColumn(1).setMaxWidth(20);
+ this.modulesTable.getColumnModel().getColumn(1).setMinWidth(20);
+ modulesTable.setRowHeight(20);
}
/**
@@ -150,6 +206,7 @@ public final class IngestJobSettingsPanel extends javax.swing.JPanel {
jButtonSelectAll = new javax.swing.JButton();
jButtonDeselectAll = new javax.swing.JButton();
processUnallocCheckbox = new javax.swing.JCheckBox();
+ pastJobsButton = new javax.swing.JButton();
setMaximumSize(new java.awt.Dimension(5750, 3000));
setMinimumSize(new java.awt.Dimension(0, 0));
@@ -201,8 +258,8 @@ public final class IngestJobSettingsPanel extends javax.swing.JPanel {
.addGroup(jPanel1Layout.createSequentialGroup()
.addContainerGap()
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addComponent(descriptionLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 302, Short.MAX_VALUE)
- .addComponent(jScrollPane1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+ .addComponent(descriptionLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)
+ .addComponent(jScrollPane1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 321, Short.MAX_VALUE)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()
.addGap(0, 0, Short.MAX_VALUE)
.addComponent(globalSettingsButton)))
@@ -244,6 +301,13 @@ public final class IngestJobSettingsPanel extends javax.swing.JPanel {
}
});
+ pastJobsButton.setText(org.openide.util.NbBundle.getMessage(IngestJobSettingsPanel.class, "IngestJobSettingsPanel.pastJobsButton.text")); // NOI18N
+ pastJobsButton.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ pastJobsButtonActionPerformed(evt);
+ }
+ });
+
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
@@ -251,19 +315,19 @@ public final class IngestJobSettingsPanel extends javax.swing.JPanel {
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addComponent(modulesScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 256, Short.MAX_VALUE)
.addGroup(layout.createSequentialGroup()
- .addComponent(modulesScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 271, Short.MAX_VALUE)
- .addGap(10, 10, 10))
- .addGroup(layout.createSequentialGroup()
- .addGap(24, 24, 24)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(processUnallocCheckbox)
.addGroup(layout.createSequentialGroup()
- .addComponent(jButtonSelectAll, javax.swing.GroupLayout.PREFERRED_SIZE, 86, javax.swing.GroupLayout.PREFERRED_SIZE)
- .addGap(18, 18, 18)
+ .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
+ .addComponent(jButtonSelectAll, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+ .addComponent(pastJobsButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
+ .addGap(5, 5, 5)
.addComponent(jButtonDeselectAll)))
- .addGap(32, 32, 32)))
- .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, 324, Short.MAX_VALUE)
+ .addGap(0, 0, Short.MAX_VALUE)))
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, 343, Short.MAX_VALUE)
.addContainerGap())
);
layout.setVerticalGroup(
@@ -275,11 +339,13 @@ public final class IngestJobSettingsPanel extends javax.swing.JPanel {
.addComponent(modulesScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
- .addComponent(jButtonDeselectAll)
- .addComponent(jButtonSelectAll))
+ .addComponent(jButtonSelectAll)
+ .addComponent(jButtonDeselectAll))
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(pastJobsButton)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(processUnallocCheckbox, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE))
- .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
+ .addGroup(layout.createSequentialGroup()
.addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, 428, Short.MAX_VALUE)
.addContainerGap())))
);
@@ -319,6 +385,20 @@ public final class IngestJobSettingsPanel extends javax.swing.JPanel {
private void processUnallocCheckboxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_processUnallocCheckboxActionPerformed
this.settings.setProcessUnallocatedSpace(processUnallocCheckbox.isSelected());
}//GEN-LAST:event_processUnallocCheckboxActionPerformed
+ @Messages({"IngestJobSettingsPanel.pastJobsButton.action.frame.title=Ingest History"})
+ private void pastJobsButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_pastJobsButtonActionPerformed
+ JDialog topFrame = (JDialog) SwingUtilities.getWindowAncestor(this);
+ JDialog dialog = new JDialog(topFrame, Bundle.IngestJobSettingsPanel_pastJobsButton_action_frame_title(), false);
+ IngestJobInfoPanel ingestInfo = new IngestJobInfoPanel();
+ dialog.add(ingestInfo);
+ Dimension screenDimension = Toolkit.getDefaultToolkit().getScreenSize();
+ double w = dialog.getSize().getWidth();
+ double h = dialog.getSize().getHeight();
+ dialog.setLocation((int) ((screenDimension.getWidth() - w) / 2), (int) ((screenDimension.getHeight() - h) / 2));
+ dialog.setResizable(true);
+ dialog.pack();
+ dialog.setVisible(true);
+ }//GEN-LAST:event_pastJobsButtonActionPerformed
private void SelectAllModules(boolean set) {
for (IngestModuleModel module : modules) {
@@ -338,6 +418,7 @@ public final class IngestJobSettingsPanel extends javax.swing.JPanel {
private javax.swing.JSeparator jSeparator2;
private javax.swing.JScrollPane modulesScrollPane;
private javax.swing.JTable modulesTable;
+ private javax.swing.JButton pastJobsButton;
private javax.swing.JCheckBox processUnallocCheckbox;
private javax.swing.ButtonGroup timeGroup;
// End of variables declaration//GEN-END:variables
@@ -410,6 +491,9 @@ public final class IngestJobSettingsPanel extends javax.swing.JPanel {
*/
private class IngestModulesTableModel extends AbstractTableModel {
+ ImageIcon warningIcon = new ImageIcon("Core\\src\\org\\sleuthkit\\autopsy\\images\\warning_triangle.png");
+ ImageIcon infoIcon = new ImageIcon("Core\\src\\org\\sleuthkit\\autopsy\\images\\information-frame.png");
+
@Override
public int getRowCount() {
return modules.size();
@@ -417,7 +501,7 @@ public final class IngestJobSettingsPanel extends javax.swing.JPanel {
@Override
public int getColumnCount() {
- return 2;
+ return 3;
}
@Override
@@ -425,6 +509,8 @@ public final class IngestJobSettingsPanel extends javax.swing.JPanel {
IngestModuleModel module = modules.get(rowIndex);
if (columnIndex == 0) {
return module.isEnabled();
+ } else if (columnIndex == 1) {
+ return getIcon(module);
} else {
return module.getName();
}
@@ -446,12 +532,68 @@ public final class IngestJobSettingsPanel extends javax.swing.JPanel {
public Class> getColumnClass(int c) {
return getValueAt(0, c).getClass();
}
+
+ private ImageIcon getIcon(IngestModuleModel module) {
+ if (dataSources.isEmpty()) {
+ return null;
+ }
+ boolean previousVersionRun = false;
+ for (IngestJobInfo ingestJob : ingestJobs) {
+ if (ingestJob.getStatus() != IngestJobInfo.IngestJobStatusType.COMPLETED) {
+ continue;
+ }
+ long objectId = ingestJob.getObjectId();
+ boolean isSameDataSource = false;
+ for (Content dataSource : dataSources) {
+ isSameDataSource = isSameDataSource || dataSource.getId() == objectId;
+ }
+ if (isSameDataSource) {
+ IngestModuleFactory factory = module.getIngestModuleTemplate().getModuleFactory();
+ if (factory.isDataSourceIngestModuleFactory()) {
+ String uniqueName = FactoryClassNameNormalizer.normalize(factory.getClass().getCanonicalName()) + "-"
+ + factory.getModuleDisplayName() + "-"
+ + IngestModuleInfo.IngestModuleType.DATA_SOURCE_LEVEL.toString() + "-"
+ + factory.getModuleVersionNumber();
+ for (IngestModuleInfo ingestModuleInfo : ingestJob.getIngestModuleInfo()) {
+ boolean sameModule = ingestModuleInfo.getUniqueName().equals(uniqueName);
+ if (sameModule) {
+ if (ingestModuleInfo.getVersion().equals(module.getIngestModuleTemplate().getModuleFactory().getModuleVersionNumber())) {
+ return warningIcon;
+ }
+ }
+ previousVersionRun = previousVersionRun || sameModule;
+ }
+ }
+ if (factory.isFileIngestModuleFactory()) {
+ String uniqueName = FactoryClassNameNormalizer.normalize(factory.getClass().getCanonicalName()) + "-"
+ + factory.getModuleDisplayName() + "-"
+ + IngestModuleInfo.IngestModuleType.FILE_LEVEL.toString() + "-"
+ + factory.getModuleVersionNumber();
+ for (IngestModuleInfo ingestModuleInfo : ingestJob.getIngestModuleInfo()) {
+ boolean sameModule = ingestModuleInfo.getUniqueName().equals(uniqueName);
+ if (sameModule) {
+ if (ingestModuleInfo.getVersion().equals(module.getIngestModuleTemplate().getModuleFactory().getModuleVersionNumber())) {
+ return warningIcon;
+ }
+ }
+ previousVersionRun = previousVersionRun || sameModule;
+ }
+ }
+ }
+ }
+ if (previousVersionRun) {
+ return infoIcon;
+ }
+ return null;
+ }
}
/**
* Custom cell renderer to create tool tips displaying ingest module
* descriptions.
*/
+ @Messages({"IngestJobSettingsPanel.IngestModulesTableRenderer.warning.message=This ingest module has been run before on this data source.",
+ "IngestJobSettingsPanel.IngestModulesTableRenderer.info.message=A previous version of this ingest module has been run before on this data source."})
private class IngestModulesTableRenderer extends DefaultTableCellRenderer {
List tooltips = new ArrayList<>();
@@ -465,8 +607,17 @@ public final class IngestJobSettingsPanel extends javax.swing.JPanel {
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
- if (1 == column) {
+ if (2 == column) {
+ setIcon(null);
setToolTipText(tooltips.get(row));
+ } else if (1 == column) {
+ setIcon((Icon) value);
+ setText("");
+ if (tableModel.warningIcon.equals(value)) {
+ setToolTipText(Bundle.IngestJobSettingsPanel_IngestModulesTableRenderer_warning_message());
+ } else if (tableModel.infoIcon.equals(value)) {
+ setToolTipText(Bundle.IngestJobSettingsPanel_IngestModulesTableRenderer_info_message());
+ }
}
return this;
}
diff --git a/Core/src/org/sleuthkit/autopsy/ingest/IngestMessagePanel.form b/Core/src/org/sleuthkit/autopsy/ingest/IngestMessagePanel.form
index 719e9d6ce7..932ef4c075 100644
--- a/Core/src/org/sleuthkit/autopsy/ingest/IngestMessagePanel.form
+++ b/Core/src/org/sleuthkit/autopsy/ingest/IngestMessagePanel.form
@@ -67,6 +67,9 @@
+
+
+
diff --git a/Core/src/org/sleuthkit/autopsy/ingest/IngestMessagePanel.java b/Core/src/org/sleuthkit/autopsy/ingest/IngestMessagePanel.java
index c06f91a497..b90844c538 100644
--- a/Core/src/org/sleuthkit/autopsy/ingest/IngestMessagePanel.java
+++ b/Core/src/org/sleuthkit/autopsy/ingest/IngestMessagePanel.java
@@ -35,10 +35,9 @@ import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.logging.Level;
import javax.swing.JLabel;
import javax.swing.JPanel;
-import org.openide.util.NbBundle;
-import org.sleuthkit.autopsy.coreutils.Logger;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.SwingConstants;
@@ -49,10 +48,12 @@ import javax.swing.event.TableModelListener;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellRenderer;
-import org.sleuthkit.autopsy.ingest.IngestMessage.*;
-import org.sleuthkit.datamodel.BlackboardArtifact;
+import org.openide.util.NbBundle;
+import org.sleuthkit.autopsy.coreutils.Logger;
import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil;
-import java.util.logging.Level;
+import org.sleuthkit.autopsy.ingest.IngestMessage.*;
+import org.sleuthkit.autopsy.ingest.IngestMessage.MessageType;
+import org.sleuthkit.datamodel.BlackboardArtifact;
/**
* Notification window showing messages from modules to user
diff --git a/Core/src/org/sleuthkit/autopsy/ingest/RunIngestModulesDialog.java b/Core/src/org/sleuthkit/autopsy/ingest/RunIngestModulesDialog.java
index 0cf8aac221..f2cab6ecd1 100644
--- a/Core/src/org/sleuthkit/autopsy/ingest/RunIngestModulesDialog.java
+++ b/Core/src/org/sleuthkit/autopsy/ingest/RunIngestModulesDialog.java
@@ -26,17 +26,14 @@ import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
-import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.List;
import javax.swing.BorderFactory;
-import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
-import javax.swing.border.EmptyBorder;
import org.openide.util.NbBundle;
import org.openide.windows.WindowManager;
import org.sleuthkit.autopsy.ingest.IngestJobSettings.IngestType;
@@ -110,7 +107,7 @@ public final class RunIngestModulesDialog extends JDialog {
*/
IngestJobSettings ingestJobSettings = new IngestJobSettings(RunIngestModulesDialog.class.getCanonicalName(), this.ingestType);
RunIngestModulesDialog.showWarnings(ingestJobSettings);
- this.ingestJobSettingsPanel = new IngestJobSettingsPanel(ingestJobSettings);
+ this.ingestJobSettingsPanel = new IngestJobSettingsPanel(ingestJobSettings, dataSources);
setPreferredSize(this.ingestJobSettingsPanel.getPreferredSize());
add(this.ingestJobSettingsPanel, BorderLayout.CENTER);
diff --git a/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/FileExtMismatchDetectorModuleFactory.java b/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/FileExtMismatchDetectorModuleFactory.java
index 0840f24296..9cb9fb9e55 100755
--- a/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/FileExtMismatchDetectorModuleFactory.java
+++ b/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/FileExtMismatchDetectorModuleFactory.java
@@ -21,12 +21,12 @@ package org.sleuthkit.autopsy.modules.fileextmismatch;
import org.openide.util.NbBundle;
import org.openide.util.lookup.ServiceProvider;
import org.sleuthkit.autopsy.coreutils.Version;
-import org.sleuthkit.autopsy.ingest.IngestModuleFactoryAdapter;
import org.sleuthkit.autopsy.ingest.FileIngestModule;
import org.sleuthkit.autopsy.ingest.IngestModuleFactory;
+import org.sleuthkit.autopsy.ingest.IngestModuleFactoryAdapter;
+import org.sleuthkit.autopsy.ingest.IngestModuleGlobalSettingsPanel;
import org.sleuthkit.autopsy.ingest.IngestModuleIngestJobSettings;
import org.sleuthkit.autopsy.ingest.IngestModuleIngestJobSettingsPanel;
-import org.sleuthkit.autopsy.ingest.IngestModuleGlobalSettingsPanel;
/**
* An factory that creates file ingest modules that detect mismatches between