diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageDonePanel.form b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageDonePanel.form deleted file mode 100644 index 204b5a3c02..0000000000 --- a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageDonePanel.form +++ /dev/null @@ -1,66 +0,0 @@ - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageDonePanel.java b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageDonePanel.java deleted file mode 100644 index 45a511e6b6..0000000000 --- a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageDonePanel.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Autopsy Forensic Browser - * - * Copyright 2012 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; - -public class AddImageDonePanel extends javax.swing.JPanel { - - /** - * Creates new form AddImageDonePanel - */ - public AddImageDonePanel() { - initComponents(); - } - - /** - * 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() { - - statusLabel = new javax.swing.JLabel(); - crDbLabel = new javax.swing.JLabel(); - - org.openide.awt.Mnemonics.setLocalizedText(statusLabel, org.openide.util.NbBundle.getMessage(AddImageDonePanel.class, "AddImageDonePanel.statusLabel.text")); // NOI18N - - crDbLabel.setFont(new java.awt.Font("Tahoma", 1, 14)); // NOI18N - org.openide.awt.Mnemonics.setLocalizedText(crDbLabel, org.openide.util.NbBundle.getMessage(AddImageDonePanel.class, "AddImageDonePanel.crDbLabel.text")); // NOI18N - - javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); - this.setLayout(layout); - layout.setHorizontalGroup( - layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addContainerGap() - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addGap(10, 10, 10) - .addComponent(statusLabel, javax.swing.GroupLayout.DEFAULT_SIZE, 472, Short.MAX_VALUE)) - .addGroup(layout.createSequentialGroup() - .addComponent(crDbLabel) - .addGap(0, 0, Short.MAX_VALUE))) - .addContainerGap()) - ); - layout.setVerticalGroup( - layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addContainerGap() - .addComponent(crDbLabel) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addComponent(statusLabel) - .addContainerGap(67, Short.MAX_VALUE)) - ); - }// //GEN-END:initComponents - // Variables declaration - do not modify//GEN-BEGIN:variables - private javax.swing.JLabel crDbLabel; - private javax.swing.JLabel statusLabel; - // End of variables declaration//GEN-END:variables -} diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageErrorsDialog.form b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageErrorsDialog.form index 3af0b7554c..b0cd0483aa 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageErrorsDialog.form +++ b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageErrorsDialog.form @@ -15,6 +15,7 @@ + diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageErrorsDialog.java b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageErrorsDialog.java index cf6d30f504..2898f502d4 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageErrorsDialog.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageErrorsDialog.java @@ -107,7 +107,7 @@ public class AddImageErrorsDialog extends javax.swing.JDialog { }//GEN-LAST:event_closeButtonActionPerformed - void setErrors(String errors) { + public void setErrors(String errors) { errorsText.setText(errors); } diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageLoadingPanel.form b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageLoadingPanel.form deleted file mode 100644 index 806323e9e8..0000000000 --- a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageLoadingPanel.form +++ /dev/null @@ -1,144 +0,0 @@ - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageLoadingPanel.java b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageLoadingPanel.java deleted file mode 100644 index 0ba466f7bd..0000000000 --- a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageLoadingPanel.java +++ /dev/null @@ -1,230 +0,0 @@ -/* - * Autopsy Forensic Browser - * - * Copyright 2012 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.Color; -import java.awt.Dimension; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import javax.swing.Box; -import javax.swing.BoxLayout; -import javax.swing.JButton; -import javax.swing.JLabel; -import javax.swing.JProgressBar; - -public class AddImageLoadingPanel extends javax.swing.JPanel { - private JLabel progressLabel = null; - private JButton errorButton = null; - - /** - * Creates new form AddImageLoadingPanel - */ - public AddImageLoadingPanel() { - initComponents(); - customizeComponents(); - } - - private void customizeComponents() { - progressLabel = new JLabel(); - infoPanel.setLayout(new BoxLayout(infoPanel, BoxLayout.PAGE_AXIS)); - infoPanel.add(progressLabel); - infoPanel.add(Box.createRigidArea(new Dimension(10, 10))); //spacer - this.jScrollPane1.setBorder(null); - this.TextArea_CurrentDirectory.setBackground(this.getBackground()); - } - - void resetInfoPanel() { - if (errorButton != null) { - infoPanel.remove(errorButton); - errorButton = null; - } - progressLabel.setText(""); - } - - public JProgressBar getCrDbProgressBar() { - return this.crDbProgressBar; - } - - public JLabel getProgressLabel() { - return this.progressLabel; - } - - /** - * Changes the progress bar text and color. - * - * @param text the text to be shown - * @param value the current value of the progress bar - * @param color the color of the progress bar text - */ - public void changeProgressBarTextAndColor(String text, int value, Color color) { - progressLabel.setText(text); - progressLabel.setForeground(color); - crDbProgressBar.setValue(value); - } - - /** - * append progress text to progress label - * @param text - */ - public void appendProgressText(String text) { - progressLabel.setText(progressLabel.getText() + " " + text); - } - - /** - * Updates the currently processing directory - * @param dir the text to update with - */ - public void changeCurrentDir(String dir){ - this.TextArea_CurrentDirectory.setText(dir); - } - - - /** - * Sets the CurrentlyProcessing tag and text area to be invisible - */ - public void setProcessInvis(){ - this.Label_CurrentDirectory_Static.setVisible(false); - this.TextArea_CurrentDirectory.setText(""); - this.TextArea_CurrentDirectory.setVisible(false); - } - - void setErrors(final String errors, boolean critical) { - crDbProgressBar.setValue(100); //always invoked when process completed - if (critical) { - progressLabel.setText("*Failed to add image (critical errors encountered). Click below to view the log."); - } - else { - progressLabel.setText("*Data Source added (non-critical errors encountered). Click below to view the log."); - } - errorButton = new JButton(); - errorButton.setText("View Log"); - infoPanel.add(errorButton); - errorButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - //JOptionPane.showMessageDialog(null, errors, "Add image non-critical errors", JOptionPane.WARNING_MESSAGE); - AddImageErrorsDialog dialog = new AddImageErrorsDialog(null, true); - dialog.setErrors(errors); - dialog.setVisible(true); - } - }); - - } - - /** - * 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() { - - crDbLabel = new javax.swing.JLabel(); - jLabel1 = new javax.swing.JLabel(); - jLabel5 = new javax.swing.JLabel(); - crDbProgressBar = new javax.swing.JProgressBar(); - infoPanel = new javax.swing.JPanel(); - Label_CurrentDirectory_Static = new javax.swing.JLabel(); - jScrollPane1 = new javax.swing.JScrollPane(); - TextArea_CurrentDirectory = new javax.swing.JTextArea(); - - crDbLabel.setFont(new java.awt.Font("Tahoma", 1, 14)); // NOI18N - org.openide.awt.Mnemonics.setLocalizedText(crDbLabel, org.openide.util.NbBundle.getMessage(AddImageLoadingPanel.class, "AddImageLoadingPanel.crDbLabel.text")); // NOI18N - - org.openide.awt.Mnemonics.setLocalizedText(jLabel1, org.openide.util.NbBundle.getMessage(AddImageLoadingPanel.class, "AddImageLoadingPanel.jLabel1.text")); // NOI18N - - org.openide.awt.Mnemonics.setLocalizedText(jLabel5, org.openide.util.NbBundle.getMessage(AddImageLoadingPanel.class, "AddImageLoadingPanel.jLabel5.text")); // NOI18N - - javax.swing.GroupLayout infoPanelLayout = new javax.swing.GroupLayout(infoPanel); - infoPanel.setLayout(infoPanelLayout); - infoPanelLayout.setHorizontalGroup( - infoPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 707, Short.MAX_VALUE) - ); - infoPanelLayout.setVerticalGroup( - infoPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 15, Short.MAX_VALUE) - ); - - org.openide.awt.Mnemonics.setLocalizedText(Label_CurrentDirectory_Static, org.openide.util.NbBundle.getMessage(AddImageLoadingPanel.class, "AddImageLoadingPanel.Label_CurrentDirectory_Static.text")); // NOI18N - - jScrollPane1.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); - jScrollPane1.setVerticalScrollBarPolicy(javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER); - - TextArea_CurrentDirectory.setEditable(false); - TextArea_CurrentDirectory.setBackground(new java.awt.Color(240, 240, 240)); - TextArea_CurrentDirectory.setColumns(20); - TextArea_CurrentDirectory.setLineWrap(true); - TextArea_CurrentDirectory.setRows(5); - TextArea_CurrentDirectory.setWrapStyleWord(true); - TextArea_CurrentDirectory.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0)); - TextArea_CurrentDirectory.setCursor(new java.awt.Cursor(java.awt.Cursor.TEXT_CURSOR)); - jScrollPane1.setViewportView(TextArea_CurrentDirectory); - - javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); - this.setLayout(layout); - layout.setHorizontalGroup( - layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addContainerGap() - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(crDbProgressBar, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(jScrollPane1) - .addGroup(layout.createSequentialGroup() - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(crDbLabel) - .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 552, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(jLabel5) - .addComponent(Label_CurrentDirectory_Static)) - .addGap(0, 0, Short.MAX_VALUE)) - .addComponent(infoPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) - .addContainerGap()) - ); - layout.setVerticalGroup( - layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addContainerGap() - .addComponent(crDbLabel) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addComponent(jLabel1) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addComponent(jLabel5, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(crDbProgressBar, javax.swing.GroupLayout.PREFERRED_SIZE, 24, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addComponent(infoPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(Label_CurrentDirectory_Static) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 63, javax.swing.GroupLayout.PREFERRED_SIZE) - .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) - ); - }// //GEN-END:initComponents - // Variables declaration - do not modify//GEN-BEGIN:variables - private javax.swing.JLabel Label_CurrentDirectory_Static; - private javax.swing.JTextArea TextArea_CurrentDirectory; - private javax.swing.JLabel crDbLabel; - private javax.swing.JProgressBar crDbProgressBar; - private javax.swing.JPanel infoPanel; - private javax.swing.JLabel jLabel1; - private javax.swing.JLabel jLabel5; - private javax.swing.JScrollPane jScrollPane1; - // End of variables declaration//GEN-END:variables -} diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageVisualPanel2.form b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageVisualPanel2.form deleted file mode 100644 index c088959c9e..0000000000 --- a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageVisualPanel2.form +++ /dev/null @@ -1,45 +0,0 @@ - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageVisualPanel2.java b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageVisualPanel2.java deleted file mode 100644 index 3460f7bb39..0000000000 --- a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageVisualPanel2.java +++ /dev/null @@ -1,166 +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.casemodule; - -import java.awt.BorderLayout; -import java.awt.Color; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JProgressBar; - -/** - * The "Add Image" wizard panel 2. Provides checkbox to enable indexing, button - * to start process, and progress bar. - */ -final class AddImageVisualPanel2 extends JPanel { - - private AddImageLoadingPanel loadingPanel; - private AddImageDonePanel donePanel; - - /** - * Creates new form AddImageVisualPanel2 - */ - AddImageVisualPanel2() { - loadingPanel = new AddImageLoadingPanel(); - donePanel = new AddImageDonePanel(); - initComponents(); - customizeComponents(); - } - - private void customizeComponents() { - mainPanel.setLayout(new BorderLayout()); - mainPanel.removeAll(); - mainPanel.add(loadingPanel, BorderLayout.CENTER); - mainPanel.validate(); - mainPanel.repaint(); - } - - AddImageLoadingPanel getLoadingPanel() { - return loadingPanel; - } - - AddImageDonePanel getDonePanel() { - return donePanel; - } - - void done() { - mainPanel.removeAll(); - mainPanel.add(donePanel, BorderLayout.CENTER); - mainPanel.validate(); - mainPanel.repaint(); - } - - void resetInfoPanel() { - loadingPanel.resetInfoPanel(); - } - - /** - * Returns the name of the this panel. This name will be shown on the left - * panel of the "Add Image" wizard panel. - * - * @return name the name of this panel - */ - @Override - public String getName() { - return "Add Data Source"; - } - - public JProgressBar getCrDbProgressBar() { - return loadingPanel.getCrDbProgressBar(); - } - - public JLabel getProgressLabel() { - return loadingPanel.getProgressLabel(); - } - - /** - * Changes the progress bar text and color. - * - * @param text the text to be shown - * @param value the current value of the progress bar - * @param color the color of the progress bar text - */ - public void changeProgressBarTextAndColor(String text, int value, Color color) { - loadingPanel.changeProgressBarTextAndColor(text, value, color); - } - - /** - * append progress text to progress label - * @param text - */ - public void appendProgressText(String text) { - loadingPanel.appendProgressText(text); - } - - /** - * Updates the currently processing directory - * @param dir the text to update with - */ - public void changeCurrentDir(String dir){ - loadingPanel.changeCurrentDir(dir); - } - - /** - * Sets the CurrentlyProcessing tag and text area to be invisible - */ - public void setProcessInvis(){ - loadingPanel.setProcessInvis(); - } - - void setErrors(final String errors, boolean critical) { - loadingPanel.setErrors(errors, critical); - - } - - /** - * 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. - */ - // //GEN-BEGIN:initComponents - private void initComponents() { - - mainPanel = new javax.swing.JPanel(); - - javax.swing.GroupLayout mainPanelLayout = new javax.swing.GroupLayout(mainPanel); - mainPanel.setLayout(mainPanelLayout); - mainPanelLayout.setHorizontalGroup( - mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 334, Short.MAX_VALUE) - ); - mainPanelLayout.setVerticalGroup( - mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 277, Short.MAX_VALUE) - ); - - javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); - this.setLayout(layout); - layout.setHorizontalGroup( - layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(mainPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - ); - layout.setVerticalGroup( - layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(mainPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - ); - }// //GEN-END:initComponents - // Variables declaration - do not modify//GEN-BEGIN:variables - private javax.swing.JPanel mainPanel; - // End of variables declaration//GEN-END:variables -} diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardPanel2.java b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardAddingProgressPanel.java similarity index 70% rename from Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardPanel2.java rename to Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardAddingProgressPanel.java index dcd58dd201..78380082b7 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardPanel2.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardAddingProgressPanel.java @@ -29,17 +29,26 @@ import org.openide.util.HelpCtx; import org.openide.util.Lookup; /** - * The "Add Data Source" wizard panel2. Handles processing the image in a worker - * thread, and any errors that may occur during the add process. + * The final panel of the add image wizard. It displays a progress bar and + * status updates. + * + * All the real work is kicked off in the previous panel: + * {@link AddImageWizardIngestConfigPanel} (which is a bit weird if you ask m + * -jm) */ -class AddImageWizardPanel2 implements WizardDescriptor.Panel { +class AddImageWizardAddingProgressPanel implements WizardDescriptor.Panel { + + /** + * flag to indicate that the image adding process is finished and this panel + * is completed(valid) + */ private boolean imgAdded = false; - /** * The visual component that displays this panel. If you need to access the * component from this class, just use getComponent(). */ - private AddImageVisualPanel2 component; + private AddImageWizardAddingProgressVisual component; + private final Set listeners = new HashSet<>(1); // or can use ChangeSupport in NB 6.0 /** * Get the visual component for the panel. In this template, the component @@ -47,12 +56,14 @@ class AddImageWizardPanel2 implements WizardDescriptor.Panel { * but never displayed, or not all panels are displayed, it is better to * create only those which really need to be visible. * + * It also separates the view from the control - jm + * * @return component the UI component of this wizard panel */ @Override - public AddImageVisualPanel2 getComponent() { + public AddImageWizardAddingProgressVisual getComponent() { if (component == null) { - component = new AddImageVisualPanel2(); + component = new AddImageWizardAddingProgressVisual(); } return component; } @@ -89,8 +100,8 @@ class AddImageWizardPanel2 implements WizardDescriptor.Panel { * Updates the UI to display the add image process has begun. */ void setStateStarted() { - component.getCrDbProgressBar().setIndeterminate(true); - component.changeProgressBarTextAndColor("*This process take some time for large data sources.", 0, Color.black); + component.getProgressBar().setIndeterminate(true); + component.setProgressBarTextAndColor("*This process take some time for large data sources.", 0, Color.black); } /** @@ -98,9 +109,9 @@ class AddImageWizardPanel2 implements WizardDescriptor.Panel { */ void setStateFinished() { imgAdded = true; + getComponent().setStateFinished(); fireChangeEvent(); } - private final Set listeners = new HashSet(1); // or can use ChangeSupport in NB 6.0 /** * Adds a listener to changes of the panel's validity. @@ -149,22 +160,34 @@ class AddImageWizardPanel2 implements WizardDescriptor.Panel { */ @Override public void readSettings(WizardDescriptor settings) { - settings.setOptions(new Object[] {WizardDescriptor.PREVIOUS_OPTION, WizardDescriptor.NEXT_OPTION, WizardDescriptor.FINISH_OPTION, WizardDescriptor.CANCEL_OPTION}); - if(imgAdded) { - getComponent().done(); + settings.setOptions(new Object[]{WizardDescriptor.PREVIOUS_OPTION, WizardDescriptor.NEXT_OPTION, WizardDescriptor.FINISH_OPTION, WizardDescriptor.CANCEL_OPTION}); + if (imgAdded) { + getComponent().setStateFinished(); } } /** + * this doesn't appear to store anything? plus, there are no settings in + * this panel -jm * * @param settings the setting to be stored to */ @Override public void storeSettings(WizardDescriptor settings) { + //why do we do this? getComponent().resetInfoPanel(); } - - - + /** + * forward errors to visual component + * + * should this be modified to handle a list of errors? -jm + * + * + * @param errorString the error string to be displayed + * @param critical true if this is a critical error + */ + void setErrors(String errorString, boolean critical) { + getComponent().showErrors(errorString, critical); + } } diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardAddingProgressVisual.form b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardAddingProgressVisual.form new file mode 100644 index 0000000000..10bba8b3f7 --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardAddingProgressVisual.form @@ -0,0 +1,240 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardAddingProgressVisual.java b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardAddingProgressVisual.java new file mode 100644 index 0000000000..62e74693a5 --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardAddingProgressVisual.java @@ -0,0 +1,302 @@ +/* + * Autopsy Forensic Browser + * + * Copyright 2012 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.Color; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import javax.swing.JProgressBar; + +/** + * visual component to display progress bar and status updates while adding an + * image in the wizard + */ +public class AddImageWizardAddingProgressVisual extends javax.swing.JPanel { + + /** + * Returns the name of the this panel. This name will be shown on the left + * panel of the "Add Image" wizard panel. + * + * @return name the name of this panel + */ + @Override + public String getName() { + return "Add Data Source"; + } + + /** + * hide the progress components and show the "done" components + */ + void setStateFinished() { + loadingPanel.setVisible(false); + donePanel.setVisible(true); + //force repaint just in case + validate(); + repaint(); + } + + /** + * Creates new form AddImageLoadingPanel + */ + public AddImageWizardAddingProgressVisual() { + initComponents(); + customizeComponents(); + } + + private void customizeComponents() { + //done and log button are both hidden to start + donePanel.setVisible(false); + viewLogButton.setVisible(false); + //match visual background of panel + this.TextArea_CurrentDirectory.setBackground(this.getBackground()); + + } + + /** + * reset some of the visual components. + * + * is this ever invoked? + */ + void resetInfoPanel() { + viewLogButton.setVisible(false); + progressLabel.setText(""); + } + + public JProgressBar getProgressBar() { + return this.progressBar; + } + + /** + * update the progress bar and label text and color. + * + * @param text the text to be shown + * @param value the current value of the progress bar + * @param color the color of the progress bar text + */ + public void setProgressBarTextAndColor(String text, int value, Color color) { + progressLabel.setText(text); + progressLabel.setForeground(color); + progressBar.setValue(value); + } + + /** + * Updates the currently processing directory + * + * @param dir the text to update with + */ + public void setCurrentDirText(String dir) { + this.TextArea_CurrentDirectory.setText(dir); + } + + /** + * reconfigure the components to indicate error(s) and show "view log + * button" + * + * + * @param errors a string containing a description of the error(s) + * @param critical true to indicate the error(s) are critical + */ + void showErrors(final String errors, boolean critical) { + progressBar.setValue(100); //always invoked when process completed + if (critical) { + statusLabel.setText("*Failed to add image (critical errors encountered). Click below to view the log."); + } else { + statusLabel.setText("*Data Source added (non-critical errors encountered). Click below to view the log."); + } + + viewLogButton.setVisible(true); + + viewLogButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + //show error dialog + AddImageErrorsDialog dialog = new AddImageErrorsDialog(null, true); + dialog.setErrors(errors); + dialog.setVisible(true); + } + }); + + } + + /** + * 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() { + + donePanel = new javax.swing.JPanel(); + statusLabel = new javax.swing.JLabel(); + crDbLabel = new javax.swing.JLabel(); + viewLogButton = new javax.swing.JButton(); + loadingPanel = new javax.swing.JPanel(); + addingDataSourceLabel = new javax.swing.JLabel(); + progressLabel = new javax.swing.JLabel(); + jLabel1 = new javax.swing.JLabel(); + jLabel5 = new javax.swing.JLabel(); + progressBar = new javax.swing.JProgressBar(); + infoPanel = new javax.swing.JPanel(); + TextArea_CurrentDirectory = new javax.swing.JTextArea(); + + org.openide.awt.Mnemonics.setLocalizedText(statusLabel, org.openide.util.NbBundle.getMessage(AddImageWizardAddingProgressVisual.class, "AddImageWizardAddingProgressVisual.statusLabel.text")); // NOI18N + + crDbLabel.setFont(new java.awt.Font("Tahoma", 1, 14)); // NOI18N + org.openide.awt.Mnemonics.setLocalizedText(crDbLabel, org.openide.util.NbBundle.getMessage(AddImageWizardAddingProgressVisual.class, "AddImageWizardAddingProgressVisual.crDbLabel.text")); // NOI18N + + org.openide.awt.Mnemonics.setLocalizedText(viewLogButton, org.openide.util.NbBundle.getMessage(AddImageWizardAddingProgressVisual.class, "AddImageWizardAddingProgressVisual.viewLogButton.text")); // NOI18N + + javax.swing.GroupLayout donePanelLayout = new javax.swing.GroupLayout(donePanel); + donePanel.setLayout(donePanelLayout); + donePanelLayout.setHorizontalGroup( + donePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(donePanelLayout.createSequentialGroup() + .addContainerGap() + .addGroup(donePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(donePanelLayout.createSequentialGroup() + .addGap(0, 0, 0) + .addComponent(viewLogButton)) + .addComponent(crDbLabel) + .addComponent(statusLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 463, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + ); + donePanelLayout.setVerticalGroup( + donePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(donePanelLayout.createSequentialGroup() + .addContainerGap() + .addComponent(crDbLabel) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(statusLabel) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(viewLogButton) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + ); + + addingDataSourceLabel.setFont(new java.awt.Font("Tahoma", 1, 14)); // NOI18N + org.openide.awt.Mnemonics.setLocalizedText(addingDataSourceLabel, org.openide.util.NbBundle.getMessage(AddImageWizardAddingProgressVisual.class, "AddImageWizardAddingProgressVisual.addingDataSourceLabel.text")); // NOI18N + + org.openide.awt.Mnemonics.setLocalizedText(progressLabel, org.openide.util.NbBundle.getMessage(AddImageWizardAddingProgressVisual.class, "AddImageWizardAddingProgressVisual.progressLabel.text")); // NOI18N + progressLabel.setPreferredSize(null); + + org.openide.awt.Mnemonics.setLocalizedText(jLabel1, org.openide.util.NbBundle.getMessage(AddImageWizardAddingProgressVisual.class, "AddImageWizardAddingProgressVisual.jLabel1.text")); // NOI18N + + org.openide.awt.Mnemonics.setLocalizedText(jLabel5, org.openide.util.NbBundle.getMessage(AddImageWizardAddingProgressVisual.class, "AddImageWizardAddingProgressVisual.jLabel5.text")); // NOI18N + + javax.swing.GroupLayout infoPanelLayout = new javax.swing.GroupLayout(infoPanel); + infoPanel.setLayout(infoPanelLayout); + infoPanelLayout.setHorizontalGroup( + infoPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGap(0, 73, Short.MAX_VALUE) + ); + infoPanelLayout.setVerticalGroup( + infoPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGap(0, 25, Short.MAX_VALUE) + ); + + TextArea_CurrentDirectory.setEditable(false); + TextArea_CurrentDirectory.setBackground(new java.awt.Color(240, 240, 240)); + TextArea_CurrentDirectory.setLineWrap(true); + TextArea_CurrentDirectory.setRows(5); + TextArea_CurrentDirectory.setWrapStyleWord(true); + TextArea_CurrentDirectory.setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createEtchedBorder(), org.openide.util.NbBundle.getMessage(AddImageWizardAddingProgressVisual.class, "AddImageWizardAddingProgressVisual.TextArea_CurrentDirectory.border.title"))); // NOI18N + TextArea_CurrentDirectory.setCursor(new java.awt.Cursor(java.awt.Cursor.TEXT_CURSOR)); + TextArea_CurrentDirectory.setFocusable(false); + + javax.swing.GroupLayout loadingPanelLayout = new javax.swing.GroupLayout(loadingPanel); + loadingPanel.setLayout(loadingPanelLayout); + loadingPanelLayout.setHorizontalGroup( + loadingPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(loadingPanelLayout.createSequentialGroup() + .addContainerGap() + .addGroup(loadingPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, loadingPanelLayout.createSequentialGroup() + .addGap(0, 0, Short.MAX_VALUE) + .addGroup(loadingPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(addingDataSourceLabel) + .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 552, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(jLabel5) + .addComponent(progressBar, javax.swing.GroupLayout.PREFERRED_SIZE, 489, javax.swing.GroupLayout.PREFERRED_SIZE))) + .addGroup(loadingPanelLayout.createSequentialGroup() + .addGroup(loadingPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(loadingPanelLayout.createSequentialGroup() + .addComponent(progressLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(infoPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addComponent(TextArea_CurrentDirectory, javax.swing.GroupLayout.PREFERRED_SIZE, 487, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGap(0, 0, Short.MAX_VALUE)))) + ); + loadingPanelLayout.setVerticalGroup( + loadingPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(loadingPanelLayout.createSequentialGroup() + .addContainerGap() + .addComponent(addingDataSourceLabel) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(jLabel1) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(jLabel5, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(progressBar, javax.swing.GroupLayout.PREFERRED_SIZE, 24, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(TextArea_CurrentDirectory, javax.swing.GroupLayout.PREFERRED_SIZE, 91, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(loadingPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(loadingPanelLayout.createSequentialGroup() + .addComponent(infoPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(0, 0, Short.MAX_VALUE)) + .addComponent(progressLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addContainerGap()) + ); + + 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(0, 0, 0) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(loadingPanel, 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, 0, Short.MAX_VALUE)) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGap(0, 0, 0) + .addComponent(loadingPanel, 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) + .addContainerGap()) + ); + }// //GEN-END:initComponents + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JTextArea TextArea_CurrentDirectory; + private javax.swing.JLabel addingDataSourceLabel; + private javax.swing.JLabel crDbLabel; + private javax.swing.JPanel donePanel; + private javax.swing.JPanel infoPanel; + private javax.swing.JLabel jLabel1; + private javax.swing.JLabel jLabel5; + private javax.swing.JPanel loadingPanel; + private javax.swing.JProgressBar progressBar; + private javax.swing.JLabel progressLabel; + private javax.swing.JLabel statusLabel; + private javax.swing.JButton viewLogButton; + // End of variables declaration//GEN-END:variables +} diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardPanel1.java b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardChooseDataSourcePanel.java similarity index 96% rename from Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardPanel1.java rename to Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardChooseDataSourcePanel.java index f84861f650..39a00baacc 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardPanel1.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardChooseDataSourcePanel.java @@ -37,13 +37,13 @@ import org.sleuthkit.autopsy.coreutils.ModuleSettings; * The "Add Image" wizard panel1 handling the logic of selecting image file(s) * to add to Case, and pick the time zone. */ -class AddImageWizardPanel1 implements WizardDescriptor.Panel, PropertyChangeListener { +class AddImageWizardChooseDataSourcePanel implements WizardDescriptor.Panel, PropertyChangeListener { /** * The visual component that displays this panel. If you need to access the * component from this class, just use getComponent(). */ - private AddImageVisualPanel1 component; + private AddImageWizardChooseDataSourceVisual component; private boolean isNextEnable = false; private static final String PROP_LASTDATASOURCE_PATH = "LBL_LastDataSource_PATH"; private static final String PROP_LASTDATASOURCE_TYPE = "LBL_LastDataSource_TYPE"; @@ -59,9 +59,9 @@ class AddImageWizardPanel1 implements WizardDescriptor.Panel, * @return component the UI component of this wizard panel */ @Override - public AddImageVisualPanel1 getComponent() { + public AddImageWizardChooseDataSourceVisual getComponent() { if (component == null) { - component = new AddImageVisualPanel1(this); + component = new AddImageWizardChooseDataSourceVisual(this); } component.addPropertyChangeListener(this); return component; @@ -194,7 +194,7 @@ class AddImageWizardPanel1 implements WizardDescriptor.Panel, try { cleanupTask.cleanup(); } catch (Exception ex) { - Logger logger = Logger.getLogger(AddImageWizardPanel1.class.getName()); + Logger logger = Logger.getLogger(AddImageWizardChooseDataSourcePanel.class.getName()); logger.log(Level.WARNING, "Error cleaning up image task", ex); } finally { cleanupTask.disable(); diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageVisualPanel1.form b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardChooseDataSourceVisual.form similarity index 88% rename from Core/src/org/sleuthkit/autopsy/casemodule/AddImageVisualPanel1.form rename to Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardChooseDataSourceVisual.form index 1042b934b3..04ada814bf 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageVisualPanel1.form +++ b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardChooseDataSourceVisual.form @@ -7,7 +7,7 @@ - + @@ -85,14 +85,14 @@ - + - + @@ -110,17 +110,17 @@ - + - + - + @@ -170,7 +170,7 @@ - + @@ -215,7 +215,7 @@ - + diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageVisualPanel1.java b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardChooseDataSourceVisual.java similarity index 86% rename from Core/src/org/sleuthkit/autopsy/casemodule/AddImageVisualPanel1.java rename to Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardChooseDataSourceVisual.java index 498b6b9771..40323635da 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageVisualPanel1.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardChooseDataSourceVisual.java @@ -34,13 +34,16 @@ import javax.swing.event.ListDataListener; import org.sleuthkit.autopsy.casemodule.ContentTypePanel.ContentType; /** - * The "Add Image" wizard panel 1. This class is used to design the "form" of - * the panel 1 for "Add Image" wizard panel. + * visual component for the first panel of add image wizard. Allows user to pick + * data source and timezone. * */ -final class AddImageVisualPanel1 extends JPanel { - - enum EVENT {UPDATE_UI, FOCUS_NEXT}; +final class AddImageWizardChooseDataSourceVisual extends JPanel { + + enum EVENT { + + UPDATE_UI, FOCUS_NEXT + }; static final List rawExt = Arrays.asList(new String[]{".img", ".dd", ".001", ".aa", ".raw"}); static final String rawDesc = "Raw Images (*.img, *.dd, *.001, *.aa, *.raw)"; static GeneralFilter rawFilter = new GeneralFilter(rawExt, rawDesc); @@ -48,28 +51,29 @@ final class AddImageVisualPanel1 extends JPanel { static final String encaseDesc = "Encase Images (*.e01)"; static GeneralFilter encaseFilter = new GeneralFilter(encaseExt, encaseDesc); static final List allExt = new ArrayList(); + static { allExt.addAll(rawExt); allExt.addAll(encaseExt); } static final String allDesc = "All Supported Types"; static GeneralFilter allFilter = new GeneralFilter(allExt, allDesc); - private AddImageWizardPanel1 wizPanel; + private AddImageWizardChooseDataSourcePanel wizPanel; private ContentTypeModel model; - private ContentTypePanel currentPanel; /** * Creates new form AddImageVisualPanel1 + * * @param wizPanel corresponding WizardPanel to handle logic of wizard step */ - AddImageVisualPanel1(AddImageWizardPanel1 wizPanel) { + AddImageWizardChooseDataSourceVisual(AddImageWizardChooseDataSourcePanel wizPanel) { initComponents(); this.wizPanel = wizPanel; createTimeZoneList(); customInit(); } - + private void customInit() { model = new ContentTypeModel(); typeComboBox.setModel(model); @@ -77,9 +81,10 @@ final class AddImageVisualPanel1 extends JPanel { typePanel.setLayout(new BorderLayout()); updateCurrentPanel(ImageFilePanel.getDefault()); } - + /** * Changes the current panel to the given panel. + * * @param panel instance of ImageTypePanel to change to */ private void updateCurrentPanel(ContentTypePanel panel) { @@ -89,17 +94,15 @@ final class AddImageVisualPanel1 extends JPanel { typePanel.validate(); typePanel.repaint(); currentPanel.addPropertyChangeListener(new PropertyChangeListener() { - @Override public void propertyChange(PropertyChangeEvent evt) { - if(evt.getPropertyName().equals(AddImageVisualPanel1.EVENT.UPDATE_UI.toString())) { + if (evt.getPropertyName().equals(AddImageWizardChooseDataSourceVisual.EVENT.UPDATE_UI.toString())) { updateUI(null); } - if(evt.getPropertyName().equals(AddImageVisualPanel1.EVENT.FOCUS_NEXT.toString())) { + if (evt.getPropertyName().equals(AddImageWizardChooseDataSourceVisual.EVENT.FOCUS_NEXT.toString())) { wizPanel.moveFocusToNext(); } } - }); currentPanel.select(); if (currentPanel.getContentType().equals(ContentType.LOCAL)) { @@ -107,8 +110,7 @@ final class AddImageVisualPanel1 extends JPanel { noFatOrphansCheckbox.setEnabled(false); descLabel.setEnabled(false); timeZoneComboBox.setEnabled(false); - } - else { + } else { noFatOrphansCheckbox.setEnabled(true); descLabel.setEnabled(true); timeZoneComboBox.setEnabled(true); @@ -120,7 +122,7 @@ final class AddImageVisualPanel1 extends JPanel { * Returns the name of the this panel. This name will be shown on the left * panel of the "Add Image" wizard panel. * - * @return name the name of this panel + * @return name the name of this panel */ @Override public String getName() { @@ -135,8 +137,8 @@ final class AddImageVisualPanel1 extends JPanel { public String getContentPaths() { return currentPanel.getContentPaths(); } - - /** + + /** * Gets the data sources type selected * * @return data source selected @@ -144,24 +146,25 @@ final class AddImageVisualPanel1 extends JPanel { public ContentType getContentType() { return currentPanel.getContentType(); } - + /** * Reset the data sources panel selected */ public void reset() { currentPanel.reset(); } - + /** * Sets the image path of the current panel. + * * @param s the image path to set */ public void setContentPath(String s) { currentPanel.setContentPath(s); } - + /** - * + * * @return true if no fat orphans processing is selected */ boolean getNoFatOrphans() { @@ -171,7 +174,7 @@ final class AddImageVisualPanel1 extends JPanel { /** * Gets the time zone that selected on the drop down list. * - * @return timeZone the time zone that selected + * @return timeZone the time zone that selected */ public String getSelectedTimezone() { String tz = timeZoneComboBox.getSelectedItem().toString(); @@ -194,17 +197,13 @@ final class AddImageVisualPanel1 extends JPanel { String item = String.format("(GMT%+d:%02d) %s", hour, minutes, id); /* - DateFormat dfm = new SimpleDateFormat("z"); - dfm.setTimeZone(zone); - boolean hasDaylight = zone.useDaylightTime(); - String first = dfm.format(new Date(2010, 1, 1)); - String second = dfm.format(new Date(2011, 6, 6)); - int mid = hour * -1; - String result = first + Integer.toString(mid); - if(hasDaylight){ - result = result + second; - } - timeZoneComboBox.addItem(item + " (" + result + ")"); + * DateFormat dfm = new SimpleDateFormat("z"); + * dfm.setTimeZone(zone); boolean hasDaylight = + * zone.useDaylightTime(); String first = dfm.format(new Date(2010, + * 1, 1)); String second = dfm.format(new Date(2011, 6, 6)); int mid + * = hour * -1; String result = first + Integer.toString(mid); + * if(hasDaylight){ result = result + second; } + * timeZoneComboBox.addItem(item + " (" + result + ")"); */ timeZoneComboBox.addItem(item); } @@ -219,7 +218,7 @@ final class AddImageVisualPanel1 extends JPanel { timeZoneComboBox.setSelectedItem(formatted); } - /** + /** * 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. @@ -240,24 +239,24 @@ final class AddImageVisualPanel1 extends JPanel { typeComboBox = new javax.swing.JComboBox(); imgInfoLabel = new javax.swing.JLabel(); - org.openide.awt.Mnemonics.setLocalizedText(jLabel2, org.openide.util.NbBundle.getMessage(AddImageVisualPanel1.class, "AddImageVisualPanel1.jLabel2.text")); // NOI18N + org.openide.awt.Mnemonics.setLocalizedText(jLabel2, org.openide.util.NbBundle.getMessage(AddImageWizardChooseDataSourceVisual.class, "AddImageWizardChooseDataSourceVisual.jLabel2.text")); // NOI18N setPreferredSize(new java.awt.Dimension(588, 328)); - org.openide.awt.Mnemonics.setLocalizedText(nextLabel, org.openide.util.NbBundle.getMessage(AddImageVisualPanel1.class, "AddImageVisualPanel1.nextLabel.text")); // NOI18N + org.openide.awt.Mnemonics.setLocalizedText(nextLabel, org.openide.util.NbBundle.getMessage(AddImageWizardChooseDataSourceVisual.class, "AddImageWizardChooseDataSourceVisual.nextLabel.text")); // NOI18N - org.openide.awt.Mnemonics.setLocalizedText(timeZoneLabel, org.openide.util.NbBundle.getMessage(AddImageVisualPanel1.class, "AddImageVisualPanel1.timeZoneLabel.text")); // NOI18N + org.openide.awt.Mnemonics.setLocalizedText(timeZoneLabel, org.openide.util.NbBundle.getMessage(AddImageWizardChooseDataSourceVisual.class, "AddImageWizardChooseDataSourceVisual.timeZoneLabel.text")); // NOI18N timeZoneComboBox.setMaximumRowCount(30); - org.openide.awt.Mnemonics.setLocalizedText(noFatOrphansCheckbox, org.openide.util.NbBundle.getMessage(AddImageVisualPanel1.class, "AddImageVisualPanel1.noFatOrphansCheckbox.text")); // NOI18N - noFatOrphansCheckbox.setToolTipText(org.openide.util.NbBundle.getMessage(AddImageVisualPanel1.class, "AddImageVisualPanel1.noFatOrphansCheckbox.toolTipText")); // NOI18N + org.openide.awt.Mnemonics.setLocalizedText(noFatOrphansCheckbox, org.openide.util.NbBundle.getMessage(AddImageWizardChooseDataSourceVisual.class, "AddImageWizardChooseDataSourceVisual.noFatOrphansCheckbox.text")); // NOI18N + noFatOrphansCheckbox.setToolTipText(org.openide.util.NbBundle.getMessage(AddImageWizardChooseDataSourceVisual.class, "AddImageWizardChooseDataSourceVisual.noFatOrphansCheckbox.toolTipText")); // NOI18N - org.openide.awt.Mnemonics.setLocalizedText(descLabel, org.openide.util.NbBundle.getMessage(AddImageVisualPanel1.class, "AddImageVisualPanel1.descLabel.text")); // NOI18N + org.openide.awt.Mnemonics.setLocalizedText(descLabel, org.openide.util.NbBundle.getMessage(AddImageWizardChooseDataSourceVisual.class, "AddImageWizardChooseDataSourceVisual.descLabel.text")); // NOI18N inputPanel.setBorder(javax.swing.BorderFactory.createEtchedBorder()); - org.openide.awt.Mnemonics.setLocalizedText(typeTabel, org.openide.util.NbBundle.getMessage(AddImageVisualPanel1.class, "AddImageVisualPanel1.typeTabel.text")); // NOI18N + org.openide.awt.Mnemonics.setLocalizedText(typeTabel, org.openide.util.NbBundle.getMessage(AddImageWizardChooseDataSourceVisual.class, "AddImageWizardChooseDataSourceVisual.typeTabel.text")); // NOI18N typePanel.setMinimumSize(new java.awt.Dimension(0, 65)); typePanel.setPreferredSize(new java.awt.Dimension(521, 65)); @@ -301,7 +300,7 @@ final class AddImageVisualPanel1 extends JPanel { ); imgInfoLabel.setFont(new java.awt.Font("Tahoma", 1, 14)); // NOI18N - org.openide.awt.Mnemonics.setLocalizedText(imgInfoLabel, org.openide.util.NbBundle.getMessage(AddImageVisualPanel1.class, "AddImageVisualPanel1.imgInfoLabel.text")); // NOI18N + 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); @@ -346,7 +345,6 @@ final class AddImageVisualPanel1 extends JPanel { .addGap(0, 0, 0)) ); }// //GEN-END:initComponents - // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.ButtonGroup buttonGroup1; private javax.swing.JLabel descLabel; @@ -367,21 +365,21 @@ final class AddImageVisualPanel1 extends JPanel { * fields on this panel. This is also the method to check whether all the * fields on this panel are correctly filled and decides whether to enable * the "Next" button or not. - * - * @param e the document event + * + * @param e the document event */ public void updateUI(DocumentEvent e) { this.wizPanel.enableNextButton(currentPanel.enableNext()); } - + /** * ComboBoxModel to control typeComboBox and supply ImageTypePanels. */ private class ContentTypeModel implements ComboBoxModel { + private ContentTypePanel selected; private ContentTypePanel[] types = ContentTypePanel.getPanels(); - - + @Override public void setSelectedItem(Object anItem) { selected = (ContentTypePanel) anItem; @@ -410,6 +408,5 @@ final class AddImageVisualPanel1 extends JPanel { @Override public void removeListDataListener(ListDataListener l) { } - } } diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardPanel3.java b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardIngestConfigPanel.java similarity index 87% rename from Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardPanel3.java rename to Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardIngestConfigPanel.java index f8d2529fbf..4c7b0a8923 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardPanel3.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardIngestConfigPanel.java @@ -41,7 +41,6 @@ import org.sleuthkit.autopsy.casemodule.ContentTypePanel.ContentType; import org.sleuthkit.autopsy.casemodule.services.FileManager; import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.coreutils.PlatformUtil; -import org.sleuthkit.autopsy.ingest.IngestDialog; import org.sleuthkit.datamodel.AbstractFile; import org.sleuthkit.datamodel.Content; import org.sleuthkit.datamodel.Image; @@ -52,12 +51,14 @@ import org.sleuthkit.datamodel.TskDataException; import org.sleuthkit.datamodel.TskException; /** - * The "Add Image" wizard panel3. Presents the options to finish/cancel - * image-add and run ingest. + * second panel of add image wizard, allows user to configure ingest modules. + * + * TODO: review this for dead code. think about moving logic of adding image to + * 3rd panel( {@link AddImageWizardAddingProgressPanel}) separate class -jm */ -class AddImageWizardPanel3 implements WizardDescriptor.Panel { +class AddImageWizardIngestConfigPanel implements WizardDescriptor.Panel { - private static final Logger logger = Logger.getLogger(AddImageWizardPanel3.class.getName()); + private static final Logger logger = Logger.getLogger(AddImageWizardIngestConfigPanel.class.getName()); private IngestConfigurator ingestConfig; /** * The visual component that displays this panel. If you need to access the @@ -76,27 +77,25 @@ class AddImageWizardPanel3 implements WizardDescriptor.Panel { private boolean noFatOrphans; // task that will clean up the created database file if the wizard is cancelled before it finishes private AddImageAction.CleanupTask cleanupImage; // initialized to null in readSettings() - // flag to control the availiablity of next action - private boolean imgAdded; // initalized to false in readSettings() private CurrentDirectoryFetcher fetcher; private AddImageProcess process; private AddImageAction action; private AddImageTask addImageTask; private AddLocalFilesTask addLocalFilesTask; - private AddImageWizardPanel2 wizPanel; + private AddImageWizardAddingProgressPanel progressPanel; - AddImageWizardPanel3(AddImageAction action, AddImageWizardPanel2 wizPanel) { + AddImageWizardIngestConfigPanel(AddImageAction action, AddImageWizardAddingProgressPanel proPanel) { this.action = action; - this.wizPanel = wizPanel; + this.progressPanel = proPanel; ingestConfig = Lookup.getDefault().lookup(IngestConfigurator.class); - List messages = ingestConfig.setContext(AddImageWizardPanel3.class.getCanonicalName()); + List messages = ingestConfig.setContext(AddImageWizardIngestConfigPanel.class.getCanonicalName()); if (messages.isEmpty() == false) { StringBuilder warning = new StringBuilder(); for (String message : messages) { warning.append(message).append("\n"); } JOptionPane.showMessageDialog(null, warning.toString()); - } + } } /** @@ -110,7 +109,7 @@ class AddImageWizardPanel3 implements WizardDescriptor.Panel { @Override public Component getComponent() { if (component == null) { - component = new AddImageVisualPanel3(ingestConfig.getIngestConfigPanel()); + component = new AddImageWizardIngestConfigVisual(ingestConfig.getIngestConfigPanel()); } return component; } @@ -183,7 +182,7 @@ class AddImageWizardPanel3 implements WizardDescriptor.Panel { settings.setOptions(new Object[]{WizardDescriptor.PREVIOUS_OPTION, WizardDescriptor.NEXT_OPTION, WizardDescriptor.FINISH_OPTION, cancel}); cleanupImage = null; readyToIngest = false; - imgAdded = false; + newContents.clear(); dataSourcePath = (String) settings.getProperty(AddImageAction.DATASOURCEPATH_PROP); dataSourceType = (ContentType) settings.getProperty(AddImageAction.DATASOURCETYPE_PROP); @@ -228,7 +227,8 @@ class AddImageWizardPanel3 implements WizardDescriptor.Panel { ingested = true; ingestConfig.setContent(newContents); ingestConfig.start(); - wizPanel.getComponent().appendProgressText(" Ingest started."); + progressPanel.setStateFinished(); + } } @@ -240,10 +240,10 @@ class AddImageWizardPanel3 implements WizardDescriptor.Panel { AddImageTask task; JProgressBar prog; - AddImageVisualPanel2 wiz; + AddImageWizardAddingProgressVisual wiz; AddImageProcess proc; - CurrentDirectoryFetcher(JProgressBar prog, AddImageVisualPanel2 wiz, AddImageProcess proc) { + CurrentDirectoryFetcher(JProgressBar prog, AddImageWizardAddingProgressVisual wiz, AddImageProcess proc) { this.wiz = wiz; this.proc = proc; this.prog = prog; @@ -260,7 +260,7 @@ class AddImageWizardPanel3 implements WizardDescriptor.Panel { EventQueue.invokeLater(new Runnable() { @Override public void run() { - wiz.changeCurrentDir(proc.currentDirectory()); + wiz.setCurrentDirText(proc.currentDirectory()); } }); @@ -271,14 +271,6 @@ class AddImageWizardPanel3 implements WizardDescriptor.Panel { return -1; } } - - /** - * When done, set the Wizards processing tags to be invisible - */ - @Override - protected void done() { - wiz.setProcessInvis(); - } } /** @@ -301,7 +293,7 @@ class AddImageWizardPanel3 implements WizardDescriptor.Panel { private Logger logger = Logger.getLogger(AddLocalFilesTask.class.getName()); protected AddLocalFilesTask(WizardDescriptor settings) { - this.progressBar = wizPanel.getComponent().getCrDbProgressBar(); + this.progressBar = progressPanel.getComponent().getProgressBar(); currentCase = Case.getCurrentCase(); this.settings = settings; } @@ -310,6 +302,7 @@ class AddImageWizardPanel3 implements WizardDescriptor.Panel { * Starts the addImage process, but does not commit the results. * * @return + * * @throws Exception */ @Override @@ -326,10 +319,10 @@ class AddImageWizardPanel3 implements WizardDescriptor.Panel { }; cancelledWhileRunning.enable(); - final LocalFilesAddProgressUpdater progUpdater = new LocalFilesAddProgressUpdater(this.progressBar, wizPanel.getComponent()); + final LocalFilesAddProgressUpdater progUpdater = new LocalFilesAddProgressUpdater(this.progressBar, progressPanel.getComponent()); try { final FileManager fileManager = currentCase.getServices().getFileManager(); - wizPanel.setStateStarted(); + progressPanel.setStateStarted(); String[] paths = dataSourcePath.split(LocalFilesPanel.FILES_SEP); List absLocalPaths = new ArrayList(); for (String path : paths) { @@ -361,31 +354,33 @@ class AddImageWizardPanel3 implements WizardDescriptor.Panel { protected void postProcess() { progressBar.setIndeterminate(false); setProgress(100); - + //clear updates - wizPanel.getComponent().setProcessInvis(); + // progressPanel.getComponent().setProcessInvis(); if (interrupted || hasCritError) { logger.log(Level.INFO, "Handling errors or interruption that occured in logical files process"); if (hasCritError) { //core error - wizPanel.getComponent().setErrors(errorString, true); + progressPanel.getComponent().showErrors(errorString, true); } return; - } else if (errorString != null) { - //data error (non-critical) - logger.log(Level.INFO, "Handling non-critical errors that occured in logical files process"); - wizPanel.getComponent().setErrors(errorString, false); + } else { + if (errorString != null) { + //data error (non-critical) + logger.log(Level.INFO, "Handling non-critical errors that occured in logical files process"); + progressPanel.getComponent().showErrors(errorString, false); + } } try { // When everything happens without an error: if (errorString == null) { // complete progress bar - wizPanel.getComponent().changeProgressBarTextAndColor("*Logical Files added.", 100, Color.black); + progressPanel.getComponent().setProgressBarTextAndColor("*Logical Files added.", 100, Color.black); } // Get attention for the process finish java.awt.Toolkit.getDefaultToolkit().beep(); //BEEP! - AddImageVisualPanel2 panel = wizPanel.getComponent(); + AddImageWizardAddingProgressVisual panel = progressPanel.getComponent(); if (panel != null) { Window w = SwingUtilities.getWindowAncestor(panel); if (w != null) { @@ -393,7 +388,7 @@ class AddImageWizardPanel3 implements WizardDescriptor.Panel { } } - wizPanel.setStateFinished(); + progressPanel.setStateFinished(); //notify the case if (!newContents.isEmpty()) { @@ -406,7 +401,7 @@ class AddImageWizardPanel3 implements WizardDescriptor.Panel { } catch (Exception ex) { //handle unchecked exceptions logger.log(Level.WARNING, "Unexpected errors occurred while running post add image cleanup. ", ex); - wizPanel.getComponent().changeProgressBarTextAndColor("*Failed to add image.", 0, Color.black); // set error message + progressPanel.getComponent().setProgressBarTextAndColor("*Failed to add image.", 0, Color.black); // set error message logger.log(Level.SEVERE, "Error adding image to case", ex); } } @@ -418,9 +413,9 @@ class AddImageWizardPanel3 implements WizardDescriptor.Panel { private int count = 0; private JProgressBar prog; - private AddImageVisualPanel2 wiz; + private AddImageWizardAddingProgressVisual wiz; - LocalFilesAddProgressUpdater(JProgressBar prog, AddImageVisualPanel2 wiz) { + LocalFilesAddProgressUpdater(JProgressBar prog, AddImageWizardAddingProgressVisual wiz) { this.wiz = wiz; this.prog = prog; } @@ -431,7 +426,7 @@ class AddImageWizardPanel3 implements WizardDescriptor.Panel { EventQueue.invokeLater(new Runnable() { @Override public void run() { - wiz.changeCurrentDir(newFile.getParentPath() + "/" + newFile.getName()); + wiz.setCurrentDirText(newFile.getParentPath() + "/" + newFile.getName()); } }); @@ -452,25 +447,25 @@ class AddImageWizardPanel3 implements WizardDescriptor.Panel { private boolean interrupted = false; private boolean hasCritError = false; private String errorString = null; - private long start; - private WizardDescriptor settings; + private WizardDescriptor wizDescriptor; private Logger logger = Logger.getLogger(AddImageTask.class.getName()); protected AddImageTask(WizardDescriptor settings) { - this.progressBar = wizPanel.getComponent().getCrDbProgressBar(); + this.progressBar = progressPanel.getComponent().getProgressBar(); currentCase = Case.getCurrentCase(); - this.settings = settings; + this.wizDescriptor = settings; } /** * Starts the addImage process, but does not commit the results. * * @return + * * @throws Exception */ @Override protected Integer doInBackground() { - start = System.currentTimeMillis(); + this.setProgress(0); @@ -504,10 +499,10 @@ class AddImageWizardPanel3 implements WizardDescriptor.Panel { } process = currentCase.makeAddImageProcess(timeZone, true, noFatOrphans); - fetcher = new CurrentDirectoryFetcher(this.progressBar, wizPanel.getComponent(), process); + fetcher = new CurrentDirectoryFetcher(this.progressBar, progressPanel.getComponent(), process); cancelledWhileRunning.enable(); try { - wizPanel.setStateStarted(); + progressPanel.setStateStarted(); fetcher.execute(); process.run(new String[]{dataSourcePath}); } catch (TskCoreException ex) { @@ -540,7 +535,8 @@ class AddImageWizardPanel3 implements WizardDescriptor.Panel { * would have reverted it. * * @param settings property set to get AddImageProcess and CleanupTask - * from + * from + * * @throws Exception if commit or adding the image to the case failed */ private void commitImage(WizardDescriptor settings) throws Exception { @@ -591,13 +587,15 @@ class AddImageWizardPanel3 implements WizardDescriptor.Panel { revert(); if (hasCritError) { //core error - wizPanel.getComponent().setErrors(errorString, true); + progressPanel.getComponent().showErrors(errorString, true); } return; - } else if (errorString != null) { - //data error (non-critical) - logger.log(Level.INFO, "Handling non-critical errors that occured in add image process"); - wizPanel.getComponent().setErrors(errorString, false); + } else { + if (errorString != null) { + //data error (non-critical) + logger.log(Level.INFO, "Handling non-critical errors that occured in add image process"); + progressPanel.setErrors(errorString, false); + } } @@ -617,12 +615,12 @@ class AddImageWizardPanel3 implements WizardDescriptor.Panel { cleanupImage.enable(); if (errorString == null) { // complete progress bar - wizPanel.getComponent().changeProgressBarTextAndColor("*Data Source added.", 100, Color.black); + progressPanel.getComponent().setProgressBarTextAndColor("*Data Source added.", 100, Color.black); } // Get attention for the process finish java.awt.Toolkit.getDefaultToolkit().beep(); //BEEP! - AddImageVisualPanel2 panel = wizPanel.getComponent(); + AddImageWizardAddingProgressVisual panel = progressPanel.getComponent(); if (panel != null) { Window w = SwingUtilities.getWindowAncestor(panel); if (w != null) { @@ -631,7 +629,7 @@ class AddImageWizardPanel3 implements WizardDescriptor.Panel { } // Tell the panel we're done - wizPanel.setStateFinished(); + progressPanel.setStateFinished(); // Commit the image if (!newContents.isEmpty()) //already commited @@ -643,7 +641,7 @@ class AddImageWizardPanel3 implements WizardDescriptor.Panel { if (process != null) { // and if we're done configuring ingest // commit anything try { - commitImage(settings); + commitImage(wizDescriptor); } catch (Exception ex) { // Log error/display warning logger.log(Level.SEVERE, "Error adding image to case.", ex); @@ -660,7 +658,7 @@ class AddImageWizardPanel3 implements WizardDescriptor.Panel { logger.log(Level.WARNING, "Unexpected errors occurred while running post add image cleanup. ", ex); - wizPanel.getComponent().changeProgressBarTextAndColor("*Failed to add image.", 0, Color.black); // set error message + progressPanel.getComponent().setProgressBarTextAndColor("*Failed to add image.", 0, Color.black); // set error message // Log error/display warning diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageVisualPanel3.form b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardIngestConfigVisual.form similarity index 92% rename from Core/src/org/sleuthkit/autopsy/casemodule/AddImageVisualPanel3.form rename to Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardIngestConfigVisual.form index 2353d10f44..2ba2f5fbb7 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageVisualPanel3.form +++ b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardIngestConfigVisual.form @@ -53,14 +53,14 @@ - + - + diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageVisualPanel3.java b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardIngestConfigVisual.java similarity index 83% rename from Core/src/org/sleuthkit/autopsy/casemodule/AddImageVisualPanel3.java rename to Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardIngestConfigVisual.java index 678b1700d3..d112b6e24f 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageVisualPanel3.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardIngestConfigVisual.java @@ -16,46 +16,52 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package org.sleuthkit.autopsy.casemodule; import java.awt.BorderLayout; import javax.swing.JPanel; /** - * Data Source added, ingest configure wizard visual panel 3 + * visual component of 2nd panle in add image wizard. allows the user to + * configure ingest modules. delegates most details to ingestPanel attribute. + * + * */ -public class AddImageVisualPanel3 extends javax.swing.JPanel { +public class AddImageWizardIngestConfigVisual extends javax.swing.JPanel { + + //could this be something more specific than JPanel? - jm private JPanel ingestPanel = null; - /** Creates new form AddImageVisualPanel3 */ - public AddImageVisualPanel3(JPanel ingestPanel) { + /** + * Creates new form AddImageVisualPanel3 + */ + public AddImageWizardIngestConfigVisual(JPanel ingestPanel) { this.ingestPanel = ingestPanel; initComponents(); customizeComponents(); } - + private void customizeComponents() { configPanel.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0))); configPanel.setLayout(new BorderLayout()); configPanel.add(ingestPanel, BorderLayout.CENTER); } - - /** + + /** * Returns the name of the this panel. This name will be shown on the left * panel of the "Add Image" wizard panel. * - * @return name the name of this panel + * @return name the name of this panel */ @Override public String getName() { return "Configure Ingest Modules"; } - /** 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. + /** + * 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 @@ -68,9 +74,9 @@ public class AddImageVisualPanel3 extends javax.swing.JPanel { setPreferredSize(new java.awt.Dimension(569, 300)); titleLabel.setFont(new java.awt.Font("Tahoma", 1, 14)); // NOI18N - titleLabel.setText(org.openide.util.NbBundle.getMessage(AddImageVisualPanel3.class, "AddImageVisualPanel3.titleLabel.text")); // NOI18N + titleLabel.setText(org.openide.util.NbBundle.getMessage(AddImageWizardIngestConfigVisual.class, "AddImageWizardIngestConfigVisual.titleLabel.text")); // NOI18N - subtitleLabel.setText(org.openide.util.NbBundle.getMessage(AddImageVisualPanel3.class, "AddImageVisualPanel3.subtitleLabel.text")); // NOI18N + subtitleLabel.setText(org.openide.util.NbBundle.getMessage(AddImageWizardIngestConfigVisual.class, "AddImageWizardIngestConfigVisual.subtitleLabel.text")); // NOI18N configPanel.setPreferredSize(new java.awt.Dimension(569, 255)); diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardIterator.java b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardIterator.java index c2d5b6f73a..2528f0b582 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardIterator.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardIterator.java @@ -47,10 +47,10 @@ class AddImageWizardIterator implements WizardDescriptor.Iterator> getPanels() { if (panels == null) { - AddImageWizardPanel2 wizPanel = new AddImageWizardPanel2(); + AddImageWizardAddingProgressPanel wizPanel = new AddImageWizardAddingProgressPanel(); panels = new ArrayList>(); - panels.add(new AddImageWizardPanel1()); - panels.add(new AddImageWizardPanel3(action, wizPanel)); + panels.add(new AddImageWizardChooseDataSourcePanel()); + panels.add(new AddImageWizardIngestConfigPanel(action, wizPanel)); panels.add(wizPanel); String[] steps = new String[panels.size()]; diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties b/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties index 86d21c0baf..0fa81ada14 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties @@ -94,8 +94,6 @@ NewJPanel.jFormattedTextField1.text=jFormattedTextField1 NewJPanel.jButton1.text=Rename NewJPanel.jLabel4.text=Database: AddImageVisualPanel2.indexImageCheckBox.text=Index image for keyword search -AddImageVisualPanel3.titleLabel.text=Configure Ingest Modules -AddImageVisualPanel3.subtitleLabel.text=Configure the ingest modules you would like to run on this data source. CasePropertiesForm.caseNumberLabel.text=Case Number: CasePropertiesForm.examinerLabel.text=Examiner: CasePropertiesForm.caseNumberTextField.text= @@ -116,23 +114,11 @@ ImageFilePanel.pathLabel.text=Browse for an image file: ImageFilePanel.browseButton.text=Browse ImageFilePanel.pathTextField.text= LocalDiskPanel.diskLabel.text=Select a local disk: -AddImageVisualPanel1.nextLabel.text= Press 'Next' to analyze the input data, extract volume and file system data, and populate a local database. MissingImageDialog.selectButton.text=Select Image MissingImageDialog.typeTabel.text=Select input type to add: MissingImageDialog.titleLabel.text=Search for missing image -AddImageVisualPanel1.jLabel2.text=jLabel2 -AddImageVisualPanel1.descLabel.text=(faster results, although some data will not be searched) -AddImageVisualPanel1.timeZoneLabel.text=Please select the input timezone: -AddImageVisualPanel1.noFatOrphansCheckbox.toolTipText= -AddImageVisualPanel1.noFatOrphansCheckbox.text=Ignore orphan files in FAT file systems MissingImageDialog.cancelButton.text=Cancel LocalDiskPanel.errorLabel.text=Error Label -AddImageVisualPanel1.typeTabel.text=Select source type to add: -AddImageVisualPanel1.imgInfoLabel.text=Enter Data Source Information: -AddImageLoadingPanel.crDbLabel.text=Adding Data Source -AddImageLoadingPanel.Label_CurrentDirectory_Static.text=Currently Adding: -AddImageLoadingPanel.jLabel5.text=Processing Data Source and Adding to Database -AddImageLoadingPanel.jLabel1.text=File system information is being added to a local database. File analysis will start when this finishes. AddImageDonePanel.statusLabel.text=File system has been added to the local database. Files are being analyzed. AddImageDonePanel.crDbLabel.text=Adding Data Source - Complete LocalFilesPanel.infoLabel.text=Add local files and folders: @@ -145,3 +131,21 @@ LocalFilesPanel.selectedPaths.toolTipText= 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=File system has been added to the local database. Files are being analyzed. +AddImageWizardAddingProgressVisual.crDbLabel.text=Adding Data Source - Complete +AddImageWizardAddingProgressVisual.addingDataSourceLabel.text=Adding Data Source +AddImageWizardAddingProgressVisual.jLabel1.text=File system information is being added to a local database. File analysis will start when this finishes. +AddImageWizardAddingProgressVisual.jLabel5.text=Processing Data Source and Adding to Database +AddImageWizardChooseDataSourceVisual.noFatOrphansCheckbox.toolTipText= +AddImageWizardChooseDataSourceVisual.noFatOrphansCheckbox.text=Ignore orphan files in FAT file systems +AddImageWizardChooseDataSourceVisual.descLabel.text=(faster results, although some data will not be searched) +AddImageWizardChooseDataSourceVisual.typeTabel.text=Select source type to add: +AddImageWizardChooseDataSourceVisual.jLabel2.text=jLabel2 +AddImageWizardChooseDataSourceVisual.timeZoneLabel.text=Please select the input timezone: +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.TextArea_CurrentDirectory.border.title=Currently Adding: +AddImageWizardAddingProgressVisual.viewLogButton.text=View Log diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/ImageFilePanel.java b/Core/src/org/sleuthkit/autopsy/casemodule/ImageFilePanel.java index e25582a47d..a71ad31681 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/ImageFilePanel.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/ImageFilePanel.java @@ -43,9 +43,9 @@ public class ImageFilePanel extends ContentTypePanel implements DocumentListener fc.setDragEnabled(false); fc.setFileSelectionMode(JFileChooser.FILES_ONLY); fc.setMultiSelectionEnabled(false); - fc.addChoosableFileFilter(AddImageVisualPanel1.rawFilter); - fc.addChoosableFileFilter(AddImageVisualPanel1.encaseFilter); - fc.setFileFilter(AddImageVisualPanel1.allFilter); + fc.addChoosableFileFilter(AddImageWizardChooseDataSourceVisual.rawFilter); + fc.addChoosableFileFilter(AddImageWizardChooseDataSourceVisual.encaseFilter); + fc.setFileFilter(AddImageWizardChooseDataSourceVisual.allFilter); } /** @@ -131,7 +131,7 @@ public class ImageFilePanel extends ContentTypePanel implements DocumentListener String path = fc.getSelectedFile().getPath(); pathTextField.setText(path); } - pcs.firePropertyChange(AddImageVisualPanel1.EVENT.FOCUS_NEXT.toString(), false, true); + pcs.firePropertyChange(AddImageWizardChooseDataSourceVisual.EVENT.FOCUS_NEXT.toString(), false, true); }//GEN-LAST:event_browseButtonActionPerformed // Variables declaration - do not modify//GEN-BEGIN:variables @@ -194,17 +194,17 @@ public class ImageFilePanel extends ContentTypePanel implements DocumentListener */ @Override public void insertUpdate(DocumentEvent e) { - pcs.firePropertyChange(AddImageVisualPanel1.EVENT.UPDATE_UI.toString(), false, true); + pcs.firePropertyChange(AddImageWizardChooseDataSourceVisual.EVENT.UPDATE_UI.toString(), false, true); } @Override public void removeUpdate(DocumentEvent e) { - pcs.firePropertyChange(AddImageVisualPanel1.EVENT.UPDATE_UI.toString(), false, true); + pcs.firePropertyChange(AddImageWizardChooseDataSourceVisual.EVENT.UPDATE_UI.toString(), false, true); } @Override public void changedUpdate(DocumentEvent e) { - pcs.firePropertyChange(AddImageVisualPanel1.EVENT.UPDATE_UI.toString(), false, true); + pcs.firePropertyChange(AddImageWizardChooseDataSourceVisual.EVENT.UPDATE_UI.toString(), false, true); } /** diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/LocalDiskPanel.java b/Core/src/org/sleuthkit/autopsy/casemodule/LocalDiskPanel.java index 9c9c3f5fe6..6a51382940 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/LocalDiskPanel.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/LocalDiskPanel.java @@ -234,7 +234,7 @@ public class LocalDiskPanel extends ContentTypePanel { if(ready) { selected = anItem; enableNext = true; - pcs.firePropertyChange(AddImageVisualPanel1.EVENT.UPDATE_UI.toString(), false, true); + pcs.firePropertyChange(AddImageWizardChooseDataSourceVisual.EVENT.UPDATE_UI.toString(), false, true); } } diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/LocalFilesPanel.java b/Core/src/org/sleuthkit/autopsy/casemodule/LocalFilesPanel.java index 2357151d2b..7d07033ac1 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/LocalFilesPanel.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/LocalFilesPanel.java @@ -98,7 +98,7 @@ public class LocalFilesPanel extends ContentTypePanel { currentFiles.clear(); selectedPaths.setText(""); enableNext = false; - pcs.firePropertyChange(AddImageVisualPanel1.EVENT.UPDATE_UI.toString(), false, true); + pcs.firePropertyChange(AddImageWizardChooseDataSourceVisual.EVENT.UPDATE_UI.toString(), false, true); } @Override @@ -231,7 +231,7 @@ public class LocalFilesPanel extends ContentTypePanel { else { enableNext = false; } - pcs.firePropertyChange(AddImageVisualPanel1.EVENT.UPDATE_UI.toString(), false, true); + pcs.firePropertyChange(AddImageWizardChooseDataSourceVisual.EVENT.UPDATE_UI.toString(), false, true); }//GEN-LAST:event_selectButtonActionPerformed private void clearButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_clearButtonActionPerformed diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/MissingImageDialog.java b/Core/src/org/sleuthkit/autopsy/casemodule/MissingImageDialog.java index 86af8905d0..22d9f11a2f 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/MissingImageDialog.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/MissingImageDialog.java @@ -108,10 +108,10 @@ public class MissingImageDialog extends javax.swing.JDialog { @Override public void propertyChange(PropertyChangeEvent evt) { - if(evt.getPropertyName().equals(AddImageVisualPanel1.EVENT.UPDATE_UI.toString())) { + if(evt.getPropertyName().equals(AddImageWizardChooseDataSourceVisual.EVENT.UPDATE_UI.toString())) { updateSelectButton(); } - if(evt.getPropertyName().equals(AddImageVisualPanel1.EVENT.FOCUS_NEXT.toString())) { + if(evt.getPropertyName().equals(AddImageWizardChooseDataSourceVisual.EVENT.FOCUS_NEXT.toString())) { moveFocusToSelect(); } } diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/services/FileManager.java b/Core/src/org/sleuthkit/autopsy/casemodule/services/FileManager.java index 66d0089f6b..56ed85bf12 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/services/FileManager.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/services/FileManager.java @@ -38,6 +38,7 @@ import org.sleuthkit.datamodel.LocalFile; import org.sleuthkit.datamodel.VirtualDirectory; import org.sleuthkit.datamodel.LayoutFile; import org.sleuthkit.datamodel.SleuthkitCase; +import org.sleuthkit.datamodel.Transaction; import org.sleuthkit.datamodel.TskCoreException; import org.sleuthkit.datamodel.TskFileRange; @@ -77,13 +78,15 @@ public class FileManager implements Closeable { } /** - * Finds a set of files that meets the name criteria. - * @param dataSource Root data source to limit search results to (Image, - * VirtualDirectory, etc.). - * @param fileName Pattern of the name of the file or directory to match (case - * insensitive, used in LIKE SQL statement). + * Finds a set of files that meets the name criteria. + * + * @param dataSource Root data source to limit search results to (Image, + * VirtualDirectory, etc.). + * @param fileName Pattern of the name of the file or directory to match + * (case insensitive, used in LIKE SQL statement). + * * @return a list of AbstractFile for files/directories whose name matches - * the given fileName + * the given fileName */ public synchronized List findFiles(Content dataSource, String fileName) throws TskCoreException { if (tskCase == null) { @@ -92,17 +95,19 @@ public class FileManager implements Closeable { return tskCase.findFiles(dataSource, fileName); } - /** - * Finds a set of files that meets the name criteria. - * @param dataSource Root data source to limit search results to (Image, - * VirtualDirectory, etc.). - * @param fileName Pattern of the name of the file or directory to match (case - * insensitive, used in LIKE SQL statement). - * @param dirName Pattern of the name of the parent directory to use as the root - * of the search (case insensitive, used in LIKE SQL statement). + * Finds a set of files that meets the name criteria. + * + * @param dataSource Root data source to limit search results to (Image, + * VirtualDirectory, etc.). + * @param fileName Pattern of the name of the file or directory to match + * (case insensitive, used in LIKE SQL statement). + * @param dirName Pattern of the name of the parent directory to use as + * the root of the search (case insensitive, used in LIKE + * SQL statement). + * * @return a list of AbstractFile for files/directories whose name matches - * fileName and whose parent directory contains dirName. + * fileName and whose parent directory contains dirName. */ public synchronized List findFiles(Content dataSource, String fileName, String dirName) throws TskCoreException { if (tskCase == null) { @@ -112,14 +117,17 @@ public class FileManager implements Closeable { } /** - * Finds a set of files that meets the name criteria. - * @param dataSource Root data source to limit search results to (Image, - * VirtualDirectory, etc.). - * @param fileName Pattern of the name of the file or directory to match (case - * insensitive, used in LIKE SQL statement). - * @param parentFile Object of root/parent directory to restrict search to. + * Finds a set of files that meets the name criteria. + * + * @param dataSource Root data source to limit search results to (Image, + * VirtualDirectory, etc.). + * @param fileName Pattern of the name of the file or directory to match + * (case insensitive, used in LIKE SQL statement). + * @param parentFile Object of root/parent directory to restrict search to. + * * @return a list of AbstractFile for files/directories whose name matches - * fileName and that were inside a directory described by parentFsContent. + * fileName and that were inside a directory described by + * parentFsContent. */ public synchronized List findFiles(Content dataSource, String fileName, AbstractFile parentFile) throws TskCoreException { if (tskCase == null) { @@ -130,9 +138,10 @@ public class FileManager implements Closeable { /** * @param dataSource data source Content (Image, parent-less - * VirtualDirectory) where to find files - * @param filePath The full path to the file(s) of interest. This can - * optionally include the image and volume names. + * VirtualDirectory) where to find files + * @param filePath The full path to the file(s) of interest. This can + * optionally include the image and volume names. + * * @return a list of AbstractFile that have the given file path. */ public synchronized List openFiles(Content dataSource, String filePath) throws TskCoreException { @@ -145,26 +154,31 @@ public class FileManager implements Closeable { /** * Creates a derived file, adds it to the database and returns it. * - * @param fileName file name the derived file - * @param localPath local path of the derived file, including the file name. - * The path is relative to the database path. - * @param size size of the derived file in bytes + * @param fileName file name the derived file + * @param localPath local path of the derived file, including the file + * name. The path is relative to the database path. + * @param size size of the derived file in bytes * @param ctime * @param crtime * @param atime * @param mtime - * @param isFile whether a file or directory, true if a file - * @param parentFile the parent file object this the new file was derived - * from, either a fs file or parent derived file/dikr\\r + * @param isFile whether a file or directory, true if a file + * @param parentFile the parent file object this the new file was + * derived from, either a fs file or parent derived + * file/dikr\\r * @param rederiveDetails details needed to re-derive file (will be specific - * to the derivation method), currently unused - * @param toolName name of derivation method/tool, currently unused - * @param toolVersion version of derivation method/tool, currently unused - * @param otherDetails details of derivation method/tool, currently unused + * to the derivation method), currently unused + * @param toolName name of derivation method/tool, currently unused + * @param toolVersion version of derivation method/tool, currently + * unused + * @param otherDetails details of derivation method/tool, currently + * unused + * * @return newly created derived file object added to the database + * * @throws TskCoreException exception thrown if the object creation failed - * due to a critical system error or of the file manager has already been - * closed + * due to a critical system error or of the file + * manager has already been closed * */ public synchronized DerivedFile addDerivedFile(String fileName, String localPath, long size, @@ -186,13 +200,14 @@ public class FileManager implements Closeable { * or file system given by systemId. * * @param carvedFileName the name of the carved file (containing appropriate - * extension) + * extension) * @param carvedFileSize size of the carved file to add - * @param systemId the ID of the parent volume or file system - * @param sectors a list of SectorGroups giving this sectors that make up - * this carved file. + * @param systemId the ID of the parent volume or file system + * @param sectors a list of SectorGroups giving this sectors that + * make up this carved file. + * * @throws TskCoreException exception thrown when critical tsk error - * occurred and carved file could not be added + * occurred and carved file could not be added */ public synchronized LayoutFile addCarvedFile(String carvedFileName, long carvedFileSize, long systemId, List sectors) throws TskCoreException { @@ -221,15 +236,19 @@ public class FileManager implements Closeable { /** * Add a set of local/logical files and dirs. * - * @param localAbsPaths list of absolute paths to local files and dirs + * @param localAbsPaths list of absolute paths to local files and dirs * @param addProgressUpdater notifier to receive progress notifications on - * folders added, or null if not used + * folders added, or null if not used + * * @return file set root VirtualDirectory contained containing all - * AbstractFile objects added + * AbstractFile objects added + * * @throws TskCoreException exception thrown if the object creation failed - * due to a critical system error or of the file manager has already been - * closed. There is no "revert" logic if one of the additions fails. The - * addition stops with the first error encountered. + * due to a critical system error or of the file + * manager has already been closed. There is no + * "revert" logic if one of the additions fails. + * The addition stops with the first error + * encountered. */ public synchronized VirtualDirectory addLocalFilesDirs(List localAbsPaths, FileAddProgressUpdater addProgressUpdater) throws TskCoreException { final List rootsToAdd = new ArrayList<>(); @@ -244,25 +263,33 @@ public class FileManager implements Closeable { rootsToAdd.add(localFile); } + Transaction trans = tskCase.createTransaction(); // make a virtual top-level directory for this set of files/dirs - final VirtualDirectory fileSetRootDir = addLocalFileSetRootDir(); + final VirtualDirectory fileSetRootDir = addLocalFileSetRootDir(trans); - // recursively add each item in the set - for (java.io.File localRootToAdd : rootsToAdd) { - AbstractFile localFileAdded = addLocalDirInt(fileSetRootDir, localRootToAdd, addProgressUpdater); - - if (localFileAdded == null) { - String msg = "One of the local files/dirs could not be added: " + localRootToAdd.getAbsolutePath(); - logger.log(Level.SEVERE, msg); - throw new TskCoreException(msg); - } else { - //added.add(localFileAdded); - //send new content event - //for now reusing ingest events, in future this will be replaced by datamodel / observer sending out events - IngestServices.getDefault().fireModuleContentEvent(new ModuleContentEvent(localFileAdded)); + try { + // recursively add each item in the set + for (java.io.File localRootToAdd : rootsToAdd) { + AbstractFile localFileAdded = addLocalDirInt(trans, fileSetRootDir, localRootToAdd, addProgressUpdater); + + if (localFileAdded == null) { + String msg = "One of the local files/dirs could not be added: " + localRootToAdd.getAbsolutePath(); + logger.log(Level.SEVERE, msg); + throw new TskCoreException(msg); + } else { + //added.add(localFileAdded); + //send new content event + //for now reusing ingest events, in future this will be replaced by datamodel / observer sending out events + IngestServices.getDefault().fireModuleContentEvent(new ModuleContentEvent(localFileAdded)); + } } - } + trans.commit(); + } catch (TskCoreException ex) { + trans.rollback(); + } finally { + trans.close(); + } return fileSetRootDir; } @@ -271,9 +298,10 @@ public class FileManager implements Closeable { * consecutive sequence number characteristic to every add operation * * @return the virtual dir root container created + * * @throws TskCoreException */ - private VirtualDirectory addLocalFileSetRootDir() throws TskCoreException { + private VirtualDirectory addLocalFileSetRootDir(Transaction trans) throws TskCoreException { VirtualDirectory created = null; @@ -281,7 +309,7 @@ public class FileManager implements Closeable { final String fileSetName = VirtualDirectoryNode.LOGICAL_FILE_SET_PREFIX + newFileSetCount; try { - created = tskCase.addVirtualDirectory(0, fileSetName); + created = tskCase.addVirtualDirectory(0, fileSetName, trans); curNumFileSets = newFileSetCount; } catch (TskCoreException ex) { String msg = "Error creating local file set dir: " + fileSetName; @@ -293,17 +321,19 @@ public class FileManager implements Closeable { } /** - * Helper (internal) method to recursively add contents of a folder. Node passed in can be a file or directory. - * Children of directories are added. + * Helper (internal) method to recursively add contents of a folder. Node + * passed in can be a file or directory. Children of directories are added. * - * @param parentVd Dir that is the parent of localFile - * @param localFile File/Dir that we are adding + * @param parentVd Dir that is the parent of localFile + * @param localFile File/Dir that we are adding * @param addProgressUpdater notifier to receive progress notifications on - * folders added, or null if not used - * @returns File object of file added or new virtualdirectory for the directory. + * folders added, or null if not used + * + * @returns File object of file added or new virtualdirectory for the + * directory. * @throws TskCoreException */ - private AbstractFile addLocalDirInt(VirtualDirectory parentVd, + private AbstractFile addLocalDirInt(Transaction trans, VirtualDirectory parentVd, java.io.File localFile, FileAddProgressUpdater addProgressUpdater) throws TskCoreException { if (tskCase == null) { @@ -317,11 +347,11 @@ public class FileManager implements Closeable { if (!localFile.canRead()) { throw new TskCoreException("Attempted to add a local dir that is not readable: " + localFile.getAbsolutePath()); } - + if (localFile.isDirectory()) { //create virtual folder - final VirtualDirectory childVd = tskCase.addVirtualDirectory(parentVd.getId(), localFile.getName()); + final VirtualDirectory childVd = tskCase.addVirtualDirectory(parentVd.getId(), localFile.getName(), trans); if (childVd != null && addProgressUpdater != null) { addProgressUpdater.fileAdded(childVd); } @@ -329,30 +359,32 @@ public class FileManager implements Closeable { final java.io.File[] childrenFiles = localFile.listFiles(); if (childrenFiles != null) { for (java.io.File childFile : childrenFiles) { - addLocalDirInt(childVd, childFile, addProgressUpdater); + addLocalDirInt(trans, childVd, childFile, addProgressUpdater); } } return childVd; } else { //add leaf file, base case - return this.addLocalFileInt(parentVd, localFile); + return this.addLocalFileInt(parentVd, localFile, trans); } } /** - * Adds a single local/logical file to the case. Adds it to the database. - * Does not refresh the views of data. Assumes that the local file exists and - * can be read. This checking is done by addLocalDirInt(). + * Adds a single local/logical file to the case. Adds it to the database. + * Does not refresh the views of data. Assumes that the local file exists + * and can be read. This checking is done by addLocalDirInt(). * * @param parentFile parent file object container (such as virtual - * directory, another local file, or fscontent File), - * @param localFile File that we are adding + * directory, another local file, or fscontent File), + * @param localFile File that we are adding + * * @return newly created local file object added to the database + * * @throws TskCoreException exception thrown if the object creation failed - * due to a critical system error or of the file manager has already been - * closed + * due to a critical system error or of the file + * manager has already been closed */ - private synchronized LocalFile addLocalFileInt(AbstractFile parentFile, java.io.File localFile) throws TskCoreException { + private synchronized LocalFile addLocalFileInt(AbstractFile parentFile, java.io.File localFile, Transaction trans) throws TskCoreException { if (tskCase == null) { throw new TskCoreException("Attempted to use FileManager after it was closed."); @@ -370,7 +402,7 @@ public class FileManager implements Closeable { LocalFile lf = tskCase.addLocalFile(fileName, localFile.getAbsolutePath(), size, ctime, crtime, atime, mtime, - isFile, parentFile); + isFile, parentFile, trans); return lf; } diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/AbstractDataResultViewer.java b/Core/src/org/sleuthkit/autopsy/corecomponents/AbstractDataResultViewer.java index abd3643c68..48647023d9 100644 --- a/Core/src/org/sleuthkit/autopsy/corecomponents/AbstractDataResultViewer.java +++ b/Core/src/org/sleuthkit/autopsy/corecomponents/AbstractDataResultViewer.java @@ -19,42 +19,51 @@ package org.sleuthkit.autopsy.corecomponents; import java.awt.Component; -import java.awt.Cursor; -import java.beans.PropertyChangeEvent; -import java.beans.PropertyChangeListener; import java.beans.PropertyVetoException; -import java.io.IOException; import java.util.logging.Level; import javax.swing.JPanel; import org.openide.explorer.ExplorerManager; import org.openide.explorer.ExplorerManager.Provider; import org.openide.nodes.Node; import org.openide.util.Lookup; -import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.corecomponentinterfaces.DataContent; import org.sleuthkit.autopsy.corecomponentinterfaces.DataResultViewer; import org.sleuthkit.autopsy.coreutils.Logger; /** - * Holds commonalities between all DataResultViewers, such as: - * - Pushes selection to DataContentViewers + * This class provides a default implementation of selected methods of the + * DataResultViewer interface. Derived classes will be Swing JPanel objects. + * Additionally, the ExplorerManager.Provider interface is implemented to + * supply an ExplorerManager to derived classes and their child components. */ public abstract class AbstractDataResultViewer extends JPanel implements DataResultViewer, Provider { private static final Logger logger = Logger.getLogger(AbstractDataResultViewer.class.getName()); protected transient ExplorerManager em; - private PropertyChangeListener nodeSelListener; /** * Content viewer to respond to selection events Either the main one, or * custom one if set */ protected DataContent contentViewer; + /** + * This constructor is intended to allow an AbstractDataResultViewer to use + * an ExplorerManager provided by a TopComponent, allowing Node selections + * to be available to Actions via the action global context lookup when + * the TopComponent has focus. The ExplorerManager must be present when the + * object is constructed so that its child components can discover it using + * the ExplorerManager.find() method. + */ public AbstractDataResultViewer(ExplorerManager explorerManager) { this.em = explorerManager; initialize(); } + /** + * This constructor can be used by AbstractDataResultViewers that do not + * need to make Node selections available to Actions via the action global + * context lookup. + */ public AbstractDataResultViewer() { em = new ExplorerManager(); initialize(); @@ -63,73 +72,13 @@ public abstract class AbstractDataResultViewer extends JPanel implements DataRes private void initialize() { //DataContent is designed to return only the default viewer from lookup //use the default one unless set otherwise - contentViewer = Lookup.getDefault().lookup(DataContent.class); - - //property listener to send nodes to content viewer - nodeSelListener = new PropertyChangeListener() { - /** - * Propagates changes in the current select node from the - * DataResultViewer to the DataContentTopComponent - */ - @Override - public void propertyChange(PropertyChangeEvent evt) { - if (!Case.isCaseOpen()) { - //handle in-between condition when case is being closed - //and legacy selection events are pumped - return; - } - - String changed = evt.getPropertyName(); - - // change that should affect view - if (changed.equals(ExplorerManager.PROP_SELECTED_NODES)) { - //|| changed.equals(ExplorerManager.PROP_NODE_CHANGE) - //|| changed.equals(ExplorerManager.PROP_EXPLORED_CONTEXT) - //|| changed.equals(ExplorerManager.PROP_ROOT_CONTEXT)) { - - // change the cursor to "waiting cursor" for this operation - setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); - try { - Node[] selectedNodes = getExplorerManager().getSelectedNodes(); - if (selectedNodes.length == 1) { - nodeSelected(selectedNodes[0]); - - // there's a new/changed node to display - // push the node to default "DataContent" - //TODO only the active viewer should be calling setNode - //not all of them, otherwise it results in multiple setNode() invocations - //alternative is to use a single instance of the event listener - //, per top component and not the tab perhaps - contentViewer.setNode(selectedNodes[0]); - } else { - // clear the node viewer - contentViewer.setNode(null); - } - } finally { - setCursor(null); - } - } - - /* - else if (changed.equals(ExplorerManager.PROP_NODE_CHANGE) ) { - } - else if (changed.equals(ExplorerManager.PROP_EXPLORED_CONTEXT)) { - } - else if (changed.equals(ExplorerManager.PROP_ROOT_CONTEXT)) { - } - */ - } - }; - - em.addPropertyChangeListener(nodeSelListener); + contentViewer = Lookup.getDefault().lookup(DataContent.class); } @Override public void clearComponent() { - em.removePropertyChangeListener(nodeSelListener); } - @Deprecated public Node getSelectedNode() { Node result = null; Node[] selectedNodes = this.getExplorerManager().getSelectedNodes(); @@ -147,14 +96,6 @@ public abstract class AbstractDataResultViewer extends JPanel implements DataRes public void resetComponent() { } - /** - * Called when a new node has been selected in the result viewer Can update - * the viewer, etc. - * - * @param selectedNode the new node currently selected - */ - public abstract void nodeSelected(Node selectedNode); - @Override public Component getComponent() { return this; diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/DataContentPanel.java b/Core/src/org/sleuthkit/autopsy/corecomponents/DataContentPanel.java index d38b2e900c..4967d98fb5 100644 --- a/Core/src/org/sleuthkit/autopsy/corecomponents/DataContentPanel.java +++ b/Core/src/org/sleuthkit/autopsy/corecomponents/DataContentPanel.java @@ -18,7 +18,6 @@ import org.openide.nodes.Node; import org.openide.util.Lookup; import org.openide.util.NbBundle; import org.openide.util.NbPreferences; -import org.openide.windows.TopComponent; import org.sleuthkit.autopsy.corecomponentinterfaces.DataContent; import org.sleuthkit.autopsy.corecomponentinterfaces.DataContentViewer; import org.sleuthkit.autopsy.coreutils.Logger; @@ -31,11 +30,11 @@ import org.sleuthkit.datamodel.TskCoreException; public class DataContentPanel extends javax.swing.JPanel implements DataContent, ChangeListener { private static Logger logger = Logger.getLogger(DataContentPanel.class.getName()); - - private final List viewers = new ArrayList();; + private final List viewers = new ArrayList<>();; 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, @@ -69,8 +68,6 @@ public class DataContentPanel extends javax.swing.JPanel implements DataContent, for (int tab = 0; tab < numTabs; ++tab) { jTabbedPane1.setEnabledAt(tab, false); } - - jTabbedPane1.addChangeListener(this); } @@ -135,7 +132,7 @@ public class DataContentPanel extends javax.swing.JPanel implements DataContent, try { path = content.getUniquePath(); } catch (TskCoreException ex) { - logger.log(Level.SEVERE, "Exception while calling Content.getUniquePath() for " + content); + logger.log(Level.SEVERE, "Exception while calling Content.getUniquePath() for {0}", content); } setName(path); } else { @@ -158,7 +155,13 @@ public class DataContentPanel extends javax.swing.JPanel implements DataContent, * @param selectedNode the selected content Node */ public void setupTabs(Node selectedNode) { - + // Deferring becoming a listener to the tabbed pane until this point + // eliminates handling a superfluous stateChanged event during construction. + if (listeningToTabbedPane == false) { + jTabbedPane1.addChangeListener(this); + listeningToTabbedPane = true; + } + // get the preference for the preferred viewer Preferences pref = NbPreferences.forModule(GeneralPanel.class); boolean keepCurrentViewer = pref.getBoolean("keepPreferredViewer", false); diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/DataResultPanel.java b/Core/src/org/sleuthkit/autopsy/corecomponents/DataResultPanel.java index 5bff4db4a9..23ded6576d 100644 --- a/Core/src/org/sleuthkit/autopsy/corecomponents/DataResultPanel.java +++ b/Core/src/org/sleuthkit/autopsy/corecomponents/DataResultPanel.java @@ -66,6 +66,7 @@ public class DataResultPanel extends javax.swing.JPanel implements DataResult, C private final DummyNodeListener dummyNodeListener = new DummyNodeListener(); private static final Logger logger = Logger.getLogger(DataResultPanel.class.getName() ); + private boolean listeningToTabbedPane = false; /** * Creates new DataResultPanel @@ -80,8 +81,6 @@ public class DataResultPanel extends javax.swing.JPanel implements DataResult, C setName(title); this.title = ""; - - this.dataResultTabbedPanel.addChangeListener(this); } /** @@ -182,8 +181,22 @@ public class DataResultPanel extends javax.swing.JPanel implements DataResult, C * Do not use if used one of the factory methods to create and open the component. */ public void open() { - if (null == this.explorerManager) { - this.explorerManager = ExplorerManager.find(this); + if (null == explorerManager) { + // Get an ExplorerManager to pass to the child DataResultViewers. If the application + // components are put together as expected, this will be an ExplorerManager owned + // by an ancestor TopComponent. The TopComponent will have put this ExplorerManager + // in a Lookup that is set as the action global context when the TopComponent has + // focus. This makes Node selections available to Actions without coupling the + // actions to a particular Component. Note that getting the ExplorerManager in the + // constructor would be too soon, since the object has no ancestor TopComponent at + // that point. + explorerManager = ExplorerManager.find(this); + + // A DataResultPanel listens for Node selections in its DataResultViewers so it + // can push the selections both to its child DataResultViewers and to a DataContent object. + // The default DataContent object is a DataContentTopComponent in the data content mode (area), + // and is the parent of a DataContentPanel that hosts a set of DataContentViewers. + explorerManager.addPropertyChangeListener(new ExplorerManagerNodeSelectionListener()); } // Add all the DataContentViewer to the tabbed pannel. @@ -224,7 +237,48 @@ public class DataResultPanel extends javax.swing.JPanel implements DataResult, C this.setVisible(true); } + + private class ExplorerManagerNodeSelectionListener implements PropertyChangeListener { + @Override + public void propertyChange(PropertyChangeEvent evt) { + if (!Case.isCaseOpen()) { + // Handle the in-between condition when case is being closed + // and legacy selection events are pumped. + return; + } + if (evt.getPropertyName().equals(ExplorerManager.PROP_SELECTED_NODES)) { + setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + + // If a custom DataContent object has not been specified, get the default instance. + DataContent contentViewer = customContentViewer; + if (null == contentViewer) { + contentViewer = Lookup.getDefault().lookup(DataContent.class); + } + + try { + Node[] selectedNodes = explorerManager.getSelectedNodes(); + for (UpdateWrapper drv : viewers) { + drv.setSelectedNodes(selectedNodes); + } + + // Passing null signals that either multiple nodes are selected, or no nodes are selected. + // This is important to the DataContent object, since the content mode (area) of the app is designed + // to show only the content underlying a single Node. + if (selectedNodes.length == 1) { + contentViewer.setNode(selectedNodes[0]); + } + else { + contentViewer.setNode(null); + } + } + finally { + setCursor(null); + } + } + } + } + private void addDataResultViewer(DataResultViewer dataResultViewer) { UpdateWrapper viewerWrapper = new UpdateWrapper(dataResultViewer); if (null != this.customContentViewer) { @@ -294,6 +348,13 @@ public class DataResultPanel extends javax.swing.JPanel implements DataResult, C if (this.rootNode != null) { this.rootNode.removeNodeListener(dummyNodeListener); } + // Deferring becoming a listener to the tabbed pane until this point + // eliminates handling a superfluous stateChanged event during construction. + if (listeningToTabbedPane == false) { + dataResultTabbedPanel.addChangeListener(this); + listeningToTabbedPane = true; + } + this.rootNode = selectedNode; if (this.rootNode != null) { this.rootNode.addNodeListener(dummyNodeListener); diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/DataResultViewerTable.java b/Core/src/org/sleuthkit/autopsy/corecomponents/DataResultViewerTable.java index 6b1db611f0..ac29e7008e 100644 --- a/Core/src/org/sleuthkit/autopsy/corecomponents/DataResultViewerTable.java +++ b/Core/src/org/sleuthkit/autopsy/corecomponents/DataResultViewerTable.java @@ -108,10 +108,6 @@ public class DataResultViewerTable extends AbstractDataResultViewer { } } - @Override - public void nodeSelected(Node selectedNode) { - } - /** * 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 diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/DataResultViewerThumbnail.java b/Core/src/org/sleuthkit/autopsy/corecomponents/DataResultViewerThumbnail.java index a9a70152df..fca5bbed2c 100644 --- a/Core/src/org/sleuthkit/autopsy/corecomponents/DataResultViewerThumbnail.java +++ b/Core/src/org/sleuthkit/autopsy/corecomponents/DataResultViewerThumbnail.java @@ -22,6 +22,7 @@ import java.awt.Color; import java.awt.Cursor; import java.awt.EventQueue; import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; import java.util.Arrays; import java.util.logging.Level; import javax.swing.JOptionPane; @@ -86,6 +87,7 @@ public final class DataResultViewerThumbnail extends AbstractDataResultViewer { initComponents(); ((IconView) thumbnailScrollPanel).setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); + em.addPropertyChangeListener(new ExplorerManagerNodeSelectionListener()); curPage = -1; totalPages = 0; @@ -323,33 +325,7 @@ public final class DataResultViewerThumbnail extends AbstractDataResultViewer { this.setCursor(null); } } - - @Override - public void nodeSelected(Node selectedNode) { - if (selectedNode == null) { - filePathLabel.setText(""); - - } - else { - AbstractFile af = selectedNode.getLookup().lookup(AbstractFile.class); - if (af == null) { - filePathLabel.setText(""); - } - else { - try { - String uPath = af.getUniquePath(); - filePathLabel.setText(uPath); - filePathLabel.setToolTipText(uPath); - } - catch (TskCoreException e){ - logger.log(Level.WARNING, "Could not get unique path for content: " + af.getName()); - } - } - } - } - - @Override public String getTitle() { return "Thumbnail"; @@ -556,4 +532,38 @@ public final class DataResultViewerThumbnail extends AbstractDataResultViewer { public void nodeDestroyed(NodeEvent ne) { } } + + private class ExplorerManagerNodeSelectionListener implements PropertyChangeListener { + @Override + public void propertyChange(PropertyChangeEvent evt) { + if (evt.getPropertyName().equals(ExplorerManager.PROP_SELECTED_NODES)) { + setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + try { + Node[] selectedNodes = em.getSelectedNodes(); + if (selectedNodes.length == 1) { + AbstractFile af = selectedNodes[0].getLookup().lookup(AbstractFile.class); + if (af == null) { + filePathLabel.setText(""); + } + else { + try { + String uPath = af.getUniquePath(); + filePathLabel.setText(uPath); + filePathLabel.setToolTipText(uPath); + } + catch (TskCoreException e){ + logger.log(Level.WARNING, "Could not get unique path for content: {0}", af.getName()); + } + } + } + else { + filePathLabel.setText(""); + } + } + finally { + setCursor(null); + } + } + } + } } diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/FXVideoPanel.java b/Core/src/org/sleuthkit/autopsy/corecomponents/FXVideoPanel.java index fc228ee623..447eab4491 100644 --- a/Core/src/org/sleuthkit/autopsy/corecomponents/FXVideoPanel.java +++ b/Core/src/org/sleuthkit/autopsy/corecomponents/FXVideoPanel.java @@ -80,7 +80,7 @@ import org.sleuthkit.autopsy.core.Installer; }) public class FXVideoPanel extends MediaViewVideoPanel { - private static final String[] EXTENSIONS = new String[]{".swf", ".mov", ".m4v", ".flv", ".mp4", ".3gp", ".avi", ".mpg", ".mpeg", ".wmv"}; + private static final String[] EXTENSIONS = new String[]{".mov", ".m4v", ".flv", ".mp4", ".mpg", ".mpeg"}; private static final Logger logger = Logger.getLogger(MediaViewVideoPanel.class.getName()); private boolean fxInited = false; // FX Components @@ -400,8 +400,13 @@ public class FXVideoPanel extends MediaViewVideoPanel { * @param mediaUri the URI of the media */ public void prepareMedia(String mediaUri) { - mediaPlayer = createMediaPlayer(mediaUri); - mediaView.setMediaPlayer(mediaPlayer); + try { + mediaPlayer = createMediaPlayer(mediaUri); + mediaView.setMediaPlayer(mediaPlayer); + } catch (MediaException ex) { + this.setProgressLabelText(""); + this.setInfoLabelText("Unsupported Format."); + } } /** @@ -414,6 +419,7 @@ public class FXVideoPanel extends MediaViewVideoPanel { mediaPlayer.stop(); } mediaPlayer = null; + mediaView.setMediaPlayer(null); } resetProgress(); }