diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/LocalDiskDSProcessor.java b/Core/src/org/sleuthkit/autopsy/casemodule/LocalDiskDSProcessor.java index d5b926d197..c09a89e489 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/LocalDiskDSProcessor.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/LocalDiskDSProcessor.java @@ -1,7 +1,7 @@ /* * Autopsy Forensic Browser * - * Copyright 2013-2016 Basis Technology Corp. + * Copyright 2013-2017 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -38,9 +38,9 @@ import org.sleuthkit.autopsy.framework.AutoIngestDataSourceProcessor; * wizard. It also provides a run method overload to allow it to be used * independently of the wizard. */ -@ServiceProviders(value={ - @ServiceProvider(service=DataSourceProcessor.class), - @ServiceProvider(service=AutoIngestDataSourceProcessor.class)} +@ServiceProviders(value = { + @ServiceProvider(service = DataSourceProcessor.class), + @ServiceProvider(service = AutoIngestDataSourceProcessor.class)} ) public class LocalDiskDSProcessor implements DataSourceProcessor, AutoIngestDataSourceProcessor { @@ -101,7 +101,7 @@ public class LocalDiskDSProcessor implements DataSourceProcessor, AutoIngestData */ @Override public JPanel getPanel() { - configPanel.select(); + configPanel.refreshTable(); return configPanel; } @@ -138,7 +138,7 @@ public class LocalDiskDSProcessor implements DataSourceProcessor, AutoIngestData drivePath = configPanel.getContentPaths(); timeZone = configPanel.getTimeZone(); ignoreFatOrphanFiles = configPanel.getNoFatOrphans(); - if(configPanel.getImageWriterEnabled()){ + if (configPanel.getImageWriterEnabled()) { imageWriterPath = configPanel.getImageWriterPath(); } } @@ -192,7 +192,6 @@ public class LocalDiskDSProcessor implements DataSourceProcessor, AutoIngestData */ @Override public void reset() { - configPanel.reset(); deviceId = null; drivePath = null; timeZone = null; @@ -202,22 +201,22 @@ public class LocalDiskDSProcessor implements DataSourceProcessor, AutoIngestData @Override public int canProcess(Path dataSourcePath) throws AutoIngestDataSourceProcessorException { - + // verify that the data source is not a file or a directory File file = dataSourcePath.toFile(); // ELTODO this needs to be tested more. should I keep isDirectory or just test for isFile? if (file.isFile() || file.isDirectory()) { return 0; } - + // check whether data source is an existing disk or partition // ELTODO this needs to be tested more. do these methods actually work correctly? // or should I use PlatformUtil.getPhysicalDrives() and PlatformUtil.getPartitions() instead? String path = dataSourcePath.toString(); - if ( (DriveUtils.isPhysicalDrive(path) || DriveUtils.isPartition(path)) && DriveUtils.driveExists(path) ) { + if ((DriveUtils.isPhysicalDrive(path) || DriveUtils.isPartition(path)) && DriveUtils.driveExists(path)) { return 90; } - + return 0; } @@ -227,7 +226,7 @@ public class LocalDiskDSProcessor implements DataSourceProcessor, AutoIngestData this.drivePath = dataSourcePath.toString(); this.timeZone = Calendar.getInstance().getTimeZone().getID(); this.ignoreFatOrphanFiles = false; - setDataSourceOptionsCalled = true; + setDataSourceOptionsCalled = true; run(deviceId, drivePath, timeZone, ignoreFatOrphanFiles, progressMonitor, callBack); } @@ -252,5 +251,5 @@ public class LocalDiskDSProcessor implements DataSourceProcessor, AutoIngestData this.ignoreFatOrphanFiles = ignoreFatOrphanFiles; setDataSourceOptionsCalled = true; } - + } diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/LocalDiskPanel.form b/Core/src/org/sleuthkit/autopsy/casemodule/LocalDiskPanel.form index 89835246a9..a51dc82ef8 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/LocalDiskPanel.form +++ b/Core/src/org/sleuthkit/autopsy/casemodule/LocalDiskPanel.form @@ -1,6 +1,6 @@ -
+ @@ -26,38 +26,40 @@ - - - - - - - - - - - - - + + + + + + + + + + + + + - - - + + + + + + + + + + + + + + - - - - - - - - - - + @@ -66,8 +68,8 @@ - - + + @@ -81,15 +83,15 @@ - - - + + + - + @@ -107,22 +109,6 @@ - - - - - - - - - - - - - - - - @@ -193,6 +179,22 @@ + + + + + + + + + + + + + + + + @@ -203,6 +205,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -218,33 +247,5 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/LocalDiskPanel.java b/Core/src/org/sleuthkit/autopsy/casemodule/LocalDiskPanel.java index 2572c0c61d..fb8bf43668 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/LocalDiskPanel.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/LocalDiskPanel.java @@ -1,7 +1,7 @@ /* * Autopsy Forensic Browser * - * Copyright 2011-2016 Basis Technology Corp. + * Copyright 2011-2017 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -18,10 +18,6 @@ */ package org.sleuthkit.autopsy.casemodule; -import java.awt.BorderLayout; -import java.awt.Color; -import java.awt.Component; -import java.awt.Font; import java.io.File; import java.nio.file.Paths; import java.util.ArrayList; @@ -31,16 +27,13 @@ import java.util.SimpleTimeZone; import java.util.TimeZone; import java.util.concurrent.CancellationException; import java.util.logging.Level; -import javax.swing.ComboBoxModel; import javax.swing.JFileChooser; -import javax.swing.JLabel; -import javax.swing.JList; import javax.swing.JPanel; -import javax.swing.JSeparator; -import javax.swing.ListCellRenderer; import javax.swing.SwingWorker; -import javax.swing.border.EmptyBorder; -import javax.swing.event.ListDataListener; +import javax.swing.event.ListSelectionEvent; +import javax.swing.event.ListSelectionListener; +import javax.swing.event.TableModelListener; +import javax.swing.table.TableModel; import org.openide.util.NbBundle; import org.sleuthkit.autopsy.corecomponentinterfaces.DataSourceProcessor; import org.sleuthkit.autopsy.coreutils.LocalDisk; @@ -58,25 +51,45 @@ final class LocalDiskPanel extends JPanel { private static LocalDiskPanel instance; private static final long serialVersionUID = 1L; private List disks; - private LocalDiskModel model; private boolean enableNext = false; + private final LocalDiskModel model; private final JFileChooser fc = new JFileChooser(); /** * Creates new form LocalDiskPanel */ - public LocalDiskPanel() { + LocalDiskPanel() { + this.model = new LocalDiskModel(); + this.disks = new ArrayList<>(); initComponents(); customInit(); - createTimeZoneList(); + refreshTable(); + diskTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() { + @Override + public void valueChanged(ListSelectionEvent e) { + if (diskTable.getSelectedRow() >= 0 && diskTable.getSelectedRow() < disks.size()) { + enableNext = true; + setPotentialImageWriterPath(disks.get(diskTable.getSelectedRow())); + try { + firePropertyChange(DataSourceProcessor.DSP_PANEL_EVENT.UPDATE_UI.toString(), false, true); + } catch (Exception ex) { + logger.log(Level.SEVERE, "LocalDiskPanel listener threw exception", e); //NON-NLS + MessageNotifyUtil.Notify.show(NbBundle.getMessage(this.getClass(), "LocalDiskPanel.moduleErr"), + NbBundle.getMessage(this.getClass(), "LocalDiskPanel.moduleErr.msg"), + MessageNotifyUtil.MessageType.ERROR); + } + + } + } + }); } /** * Get the default instance of this panel. */ - public static synchronized LocalDiskPanel getDefault() { + static synchronized LocalDiskPanel getDefault() { if (instance == null) { instance = new LocalDiskPanel(); } @@ -85,14 +98,10 @@ final class LocalDiskPanel extends JPanel { @SuppressWarnings("unchecked") private void customInit() { - model = new LocalDiskModel(); - diskComboBox.setModel(model); - diskComboBox.setRenderer(model); - errorLabel.setVisible(false); errorLabel.setText(""); - diskComboBox.setEnabled(false); - imageWriterErrorLabel.setOpaque(true); + diskTable.setEnabled(false); + imageWriterErrorLabel.setVisible(false); imageWriterErrorLabel.setText(""); pathTextField.setEnabled(copyImageCheckbox.isSelected()); browseButton.setEnabled(copyImageCheckbox.isSelected()); @@ -108,17 +117,18 @@ final class LocalDiskPanel extends JPanel { private void initComponents() { diskLabel = new javax.swing.JLabel(); - diskComboBox = new javax.swing.JComboBox<>(); errorLabel = new javax.swing.JLabel(); timeZoneLabel = new javax.swing.JLabel(); timeZoneComboBox = new javax.swing.JComboBox<>(); noFatOrphansCheckbox = new javax.swing.JCheckBox(); descLabel = new javax.swing.JLabel(); + jScrollPane1 = new javax.swing.JScrollPane(); + diskTable = new javax.swing.JTable(); copyImageCheckbox = new javax.swing.JCheckBox(); - imageWriterErrorLabel = new javax.swing.JLabel(); - jLabel1 = new javax.swing.JLabel(); pathTextField = new javax.swing.JTextField(); browseButton = new javax.swing.JButton(); + jLabel1 = new javax.swing.JLabel(); + imageWriterErrorLabel = new javax.swing.JLabel(); setMinimumSize(new java.awt.Dimension(0, 420)); setPreferredSize(new java.awt.Dimension(485, 410)); @@ -126,8 +136,6 @@ final class LocalDiskPanel extends JPanel { diskLabel.setFont(diskLabel.getFont().deriveFont(diskLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11)); org.openide.awt.Mnemonics.setLocalizedText(diskLabel, org.openide.util.NbBundle.getMessage(LocalDiskPanel.class, "LocalDiskPanel.diskLabel.text")); // NOI18N - diskComboBox.setFont(diskComboBox.getFont().deriveFont(diskComboBox.getFont().getStyle() & ~java.awt.Font.BOLD, 11)); - errorLabel.setFont(errorLabel.getFont().deriveFont(errorLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11)); errorLabel.setForeground(new java.awt.Color(255, 0, 0)); org.openide.awt.Mnemonics.setLocalizedText(errorLabel, org.openide.util.NbBundle.getMessage(LocalDiskPanel.class, "LocalDiskPanel.errorLabel.text")); // NOI18N @@ -145,6 +153,10 @@ final class LocalDiskPanel extends JPanel { descLabel.setFont(descLabel.getFont().deriveFont(descLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11)); org.openide.awt.Mnemonics.setLocalizedText(descLabel, org.openide.util.NbBundle.getMessage(LocalDiskPanel.class, "LocalDiskPanel.descLabel.text")); // NOI18N + diskTable.setModel(model); + diskTable.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION); + jScrollPane1.setViewportView(diskTable); + org.openide.awt.Mnemonics.setLocalizedText(copyImageCheckbox, org.openide.util.NbBundle.getMessage(LocalDiskPanel.class, "LocalDiskPanel.copyImageCheckbox.text")); // NOI18N copyImageCheckbox.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { @@ -152,20 +164,11 @@ final class LocalDiskPanel extends JPanel { } }); - imageWriterErrorLabel.setFont(imageWriterErrorLabel.getFont().deriveFont(imageWriterErrorLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11)); - imageWriterErrorLabel.setForeground(new java.awt.Color(255, 0, 0)); - org.openide.awt.Mnemonics.setLocalizedText(imageWriterErrorLabel, org.openide.util.NbBundle.getMessage(LocalDiskPanel.class, "LocalDiskPanel.imageWriterErrorLabel.text")); // NOI18N - - org.openide.awt.Mnemonics.setLocalizedText(jLabel1, org.openide.util.NbBundle.getMessage(LocalDiskPanel.class, "LocalDiskPanel.jLabel1.text")); // NOI18N - pathTextField.setText(org.openide.util.NbBundle.getMessage(LocalDiskPanel.class, "LocalDiskPanel.pathTextField.text")); // NOI18N pathTextField.addKeyListener(new java.awt.event.KeyAdapter() { public void keyReleased(java.awt.event.KeyEvent evt) { pathTextFieldKeyReleased(evt); } - public void keyTyped(java.awt.event.KeyEvent evt) { - pathTextFieldKeyTyped(evt); - } }); org.openide.awt.Mnemonics.setLocalizedText(browseButton, org.openide.util.NbBundle.getMessage(LocalDiskPanel.class, "LocalDiskPanel.browseButton.text")); // NOI18N @@ -175,44 +178,51 @@ final class LocalDiskPanel extends JPanel { } }); + org.openide.awt.Mnemonics.setLocalizedText(jLabel1, org.openide.util.NbBundle.getMessage(LocalDiskPanel.class, "LocalDiskPanel.jLabel1.text")); // NOI18N + + imageWriterErrorLabel.setFont(imageWriterErrorLabel.getFont().deriveFont(imageWriterErrorLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11)); + imageWriterErrorLabel.setForeground(new java.awt.Color(255, 0, 0)); + org.openide.awt.Mnemonics.setLocalizedText(imageWriterErrorLabel, org.openide.util.NbBundle.getMessage(LocalDiskPanel.class, "LocalDiskPanel.imageWriterErrorLabel.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() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(diskLabel) .addGroup(layout.createSequentialGroup() - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) - .addComponent(pathTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 362, javax.swing.GroupLayout.PREFERRED_SIZE) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(diskLabel) - .addComponent(diskComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, 345, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(errorLabel) - .addGroup(layout.createSequentialGroup() - .addComponent(timeZoneLabel) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addComponent(timeZoneComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, 215, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addComponent(noFatOrphansCheckbox) + .addContainerGap() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addComponent(errorLabel) + .addGroup(layout.createSequentialGroup() + .addComponent(timeZoneLabel) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(timeZoneComboBox, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addComponent(noFatOrphansCheckbox) + .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 461, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) .addComponent(copyImageCheckbox) - .addGroup(layout.createSequentialGroup() - .addGap(21, 21, 21) - .addComponent(descLabel)))) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(browseButton)) - .addGroup(layout.createSequentialGroup() - .addGap(21, 21, 21) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 423, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(imageWriterErrorLabel)))) - .addGap(0, 29, Short.MAX_VALUE)) + .addComponent(descLabel)) + .addGroup(layout.createSequentialGroup() + .addGap(21, 21, 21) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(imageWriterErrorLabel) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jLabel1) + .addGroup(layout.createSequentialGroup() + .addComponent(pathTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 342, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(browseButton, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)))))))) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addComponent(diskLabel) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(diskComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addGap(13, 13, 13) + .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(errorLabel) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) @@ -225,17 +235,27 @@ final class LocalDiskPanel extends JPanel { .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(copyImageCheckbox) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(pathTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(browseButton)) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addComponent(browseButton) + .addComponent(pathTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jLabel1) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(imageWriterErrorLabel) - .addContainerGap(170, Short.MAX_VALUE)) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); }// //GEN-END:initComponents + private void copyImageCheckboxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_copyImageCheckboxActionPerformed + pathTextField.setEnabled(copyImageCheckbox.isSelected()); + browseButton.setEnabled(copyImageCheckbox.isSelected()); + fireUpdateEvent(); + }//GEN-LAST:event_copyImageCheckboxActionPerformed + + private void pathTextFieldKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_pathTextFieldKeyReleased + fireUpdateEvent(); + }//GEN-LAST:event_pathTextFieldKeyReleased + private void browseButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_browseButtonActionPerformed String oldText = pathTextField.getText(); // set the current directory of the FileChooser if the ImagePath Field is valid @@ -248,40 +268,27 @@ final class LocalDiskPanel extends JPanel { if (retval == JFileChooser.APPROVE_OPTION) { String path = fc.getSelectedFile().getPath(); pathTextField.setText(path); - } - fireUpdateEvent(); + } + fireUpdateEvent(); }//GEN-LAST:event_browseButtonActionPerformed - private void copyImageCheckboxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_copyImageCheckboxActionPerformed - pathTextField.setEnabled(copyImageCheckbox.isSelected()); - browseButton.setEnabled(copyImageCheckbox.isSelected()); - fireUpdateEvent(); - }//GEN-LAST:event_copyImageCheckboxActionPerformed - - private void pathTextFieldKeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_pathTextFieldKeyTyped - - }//GEN-LAST:event_pathTextFieldKeyTyped - - private void pathTextFieldKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_pathTextFieldKeyReleased - fireUpdateEvent(); - }//GEN-LAST:event_pathTextFieldKeyReleased - // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton browseButton; private javax.swing.JCheckBox copyImageCheckbox; private javax.swing.JLabel descLabel; - private javax.swing.JComboBox diskComboBox; private javax.swing.JLabel diskLabel; + private javax.swing.JTable diskTable; private javax.swing.JLabel errorLabel; private javax.swing.JLabel imageWriterErrorLabel; private javax.swing.JLabel jLabel1; + private javax.swing.JScrollPane jScrollPane1; private javax.swing.JCheckBox noFatOrphansCheckbox; private javax.swing.JTextField pathTextField; private javax.swing.JComboBox timeZoneComboBox; private javax.swing.JLabel timeZoneLabel; // End of variables declaration//GEN-END:variables - private void fireUpdateEvent(){ + private void fireUpdateEvent() { try { firePropertyChange(DataSourceProcessor.DSP_PANEL_EVENT.UPDATE_UI.toString(), false, true); } catch (Exception e) { @@ -291,33 +298,23 @@ final class LocalDiskPanel extends JPanel { MessageNotifyUtil.MessageType.ERROR); } } - + /** * Return the currently selected disk path. * * @return String selected disk path */ - public String getContentPaths() { + String getContentPaths() { if (disks.size() > 0) { - LocalDisk selected = (LocalDisk) diskComboBox.getSelectedItem(); + int selectedRow = diskTable.getSelectedRow(); + LocalDisk selected = disks.get(selectedRow); return selected.getPath(); } else { return ""; } } - /** - * Set the selected disk. - */ - public void setContentPath(String s) { - for (int i = 0; i < disks.size(); i++) { - if (disks.get(i).getPath().equals(s)) { - diskComboBox.setSelectedIndex(i); - } - } - } - - public String getTimeZone() { + String getTimeZone() { String tz = timeZoneComboBox.getSelectedItem().toString(); return tz.substring(tz.indexOf(")") + 2).trim(); @@ -326,54 +323,58 @@ final class LocalDiskPanel extends JPanel { boolean getNoFatOrphans() { return noFatOrphansCheckbox.isSelected(); } - - private static String getDefaultImageWriterFolder(){ + + private static String getDefaultImageWriterFolder() { return Paths.get(Case.getCurrentCase().getModuleDirectory(), "Image Writer").toString(); } - - private void setPotentialImageWriterPath(LocalDisk disk){ - + + private void setPotentialImageWriterPath(LocalDisk disk) { + File subDirectory = Paths.get(getDefaultImageWriterFolder()).toFile(); if (!subDirectory.exists()) { subDirectory.mkdirs(); } - + String path = disk.getName().replaceAll("[:]", ""); path += " " + System.currentTimeMillis(); path += ".vhd"; pathTextField.setText(Paths.get(getDefaultImageWriterFolder(), path).toString()); } - - private boolean imageWriterPathIsValid(){ - if(pathTextField.getText().isEmpty()){ + + private boolean imageWriterPathIsValid() { + if (pathTextField.getText().isEmpty()) { + imageWriterErrorLabel.setVisible(true); imageWriterErrorLabel.setText(NbBundle.getMessage(this.getClass(), "LocalDiskPanel.imageWriterEmptyPathError.text")); return false; } - + File f = new File(pathTextField.getText()); - if(((f.getParentFile() != null) && (! f.getParentFile().exists())) || - (f.getParentFile() == null)) { + if (((f.getParentFile() != null) && (!f.getParentFile().exists())) + || (f.getParentFile() == null)) { + imageWriterErrorLabel.setVisible(true); imageWriterErrorLabel.setText(NbBundle.getMessage(this.getClass(), "LocalDiskPanel.imageWriterDirError.text")); return false; } - if(f.isDirectory()){ + if (f.isDirectory()) { + imageWriterErrorLabel.setVisible(true); imageWriterErrorLabel.setText(NbBundle.getMessage(this.getClass(), "LocalDiskPanel.imageWriterIsDirError.text")); return false; } - if(f.exists()){ + if (f.exists()) { + imageWriterErrorLabel.setVisible(true); imageWriterErrorLabel.setText(NbBundle.getMessage(this.getClass(), "LocalDiskPanel.imageWriterFileExistsError.text")); return false; } - + imageWriterErrorLabel.setVisible(false); imageWriterErrorLabel.setText(""); return true; } - - boolean getImageWriterEnabled(){ + + boolean getImageWriterEnabled() { return copyImageCheckbox.isSelected(); } - - String getImageWriterPath(){ + + String getImageWriterPath() { return pathTextField.getText(); } @@ -383,24 +384,18 @@ final class LocalDiskPanel extends JPanel { * * @return true if panel is valid */ - public boolean validatePanel() { - if(copyImageCheckbox.isSelected() && - ! imageWriterPathIsValid()){ + boolean validatePanel() { + if (copyImageCheckbox.isSelected() + && !imageWriterPathIsValid()) { return false; } - return enableNext; } - public void reset() { - //nothing to reset - } - /** - * Set the focus to the diskComboBox and refreshes the list of disks. + * Refreshes the list of disks in the table. */ - public void select() { - diskComboBox.requestFocusInWindow(); + public void refreshTable() { model.loadDisks(); } @@ -440,24 +435,21 @@ final class LocalDiskPanel extends JPanel { timeZoneComboBox.setSelectedItem(formatted); } - @SuppressWarnings("rawtypes") - private class LocalDiskModel implements ComboBoxModel, ListCellRenderer { - - private Object selected; + /** + * Table model for displaing information from LocalDisk Objects in a table. + */ + private class LocalDiskModel implements TableModel { + private List physicalDrives = new ArrayList<>(); + private List partitions = new ArrayList<>(); + private LocalDiskThread worker = null; private boolean ready = false; - private volatile boolean loadingDisks = false; - List physicalDrives = new ArrayList<>(); - List partitions = new ArrayList<>(); - //private String SELECT = "Select a local disk:"; private final String LOADING = NbBundle.getMessage(this.getClass(), "LocalDiskPanel.localDiskModel.loading.msg"); private final String NO_DRIVES = NbBundle.getMessage(this.getClass(), "LocalDiskPanel.localDiskModel.nodrives.msg"); - LocalDiskThread worker = null; - private void loadDisks() { // if there is a worker already building the lists, then cancel it first. @@ -467,105 +459,92 @@ final class LocalDiskPanel extends JPanel { // Clear the lists errorLabel.setText(""); - disks = new ArrayList<>(); - physicalDrives = new ArrayList<>(); - partitions = new ArrayList<>(); - diskComboBox.setEnabled(false); + diskTable.setEnabled(false); ready = false; enableNext = false; loadingDisks = true; - worker = new LocalDiskThread(); worker.execute(); - } @Override - public void setSelectedItem(Object anItem) { - if (ready) { - selected = (LocalDisk) anItem; - enableNext = true; - setPotentialImageWriterPath((LocalDisk) selected); - fireUpdateEvent(); + public int getRowCount() { + if (disks.isEmpty()) { + return 0; + } + return disks.size(); + } + + @Override + public int getColumnCount() { + return 2; + + } + + @NbBundle.Messages({"LocalDiskPanel.diskTable.column1.title=Disk Name", + "LocalDiskPanel.diskTable.column2.title=Disk Size" + }) + + @Override + public String getColumnName(int columnIndex) { + switch (columnIndex) { + case 0: + return NbBundle.getMessage(this.getClass(), "LocalDiskPanel.diskTable.column1.title"); + case 1: + return NbBundle.getMessage(this.getClass(), "LocalDiskPanel.diskTable.column2.title"); + default: + return "Unnamed"; //NON-NLS } } @Override - public Object getSelectedItem() { + public Class getColumnClass(int columnIndex) { + return String.class; + } + + @Override + public boolean isCellEditable(int rowIndex, int columnIndex) { + return false; + } + + @Override + public Object getValueAt(int rowIndex, int columnIndex) { if (ready) { if (disks.isEmpty()) { return NO_DRIVES; } - return selected; + switch (columnIndex) { + case 0: + return disks.get(rowIndex).getName(); + case 1: + return disks.get(rowIndex).getReadableSize(); + default: + return disks.get(rowIndex).getPath(); + } } else { return LOADING; } } @Override - public int getSize() { - if (ready) { - if (disks.isEmpty()) { - return 1; - } - return disks.size(); - } else { - return 1; - } + public void setValueAt(Object aValue, int rowIndex, int columnIndex) { + //setter does nothing they should not be able to modify table } @Override - public Object getElementAt(int index) { - if (ready) { - if (disks.isEmpty()) { - return NO_DRIVES; - } - return disks.get(index); - } else { - return LOADING; - } + public void addTableModelListener(TableModelListener l) { + } @Override - public void addListDataListener(ListDataListener l) { - } - - @Override - public void removeListDataListener(ListDataListener l) { - } - - @SuppressWarnings("rawtypes") - @Override - public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { - JPanel panel = new JPanel(new BorderLayout()); - JLabel label = new JLabel(); - if ((index == physicalDrives.size() - 1) && (physicalDrives.size() > 0)) { - panel.add(new JSeparator(JSeparator.HORIZONTAL), BorderLayout.SOUTH); - } - - if (isSelected) { - label.setBackground(list.getSelectionBackground()); - label.setForeground(list.getSelectionForeground()); - } else { - label.setBackground(list.getBackground()); - label.setForeground(list.getForeground()); - } - - if (value != null) { - String localDiskString = value.toString(); - label.setText(value.toString()); - if ((localDiskString.equals(LOADING)) || (localDiskString.equals(NO_DRIVES))) { - label.setFont(label.getFont().deriveFont(Font.ITALIC)); - label.setBackground(Color.GRAY); - } - } - label.setOpaque(true); - label.setBorder(new EmptyBorder(2, 2, 2, 2)); - - panel.add(label, BorderLayout.CENTER); - return panel; + public void removeTableModelListener(TableModelListener l) { + } + /** + * Gets the lists of physical drives and partitions and combines them + * into a list of disks. + */ class LocalDiskThread extends SwingWorker { private final Logger logger = Logger.getLogger(LocalDiskThread.class.getName()); @@ -573,12 +552,17 @@ final class LocalDiskPanel extends JPanel { @Override protected Object doInBackground() throws Exception { // Populate the lists + physicalDrives = new ArrayList<>(); + partitions = new ArrayList<>(); physicalDrives = PlatformUtil.getPhysicalDrives(); partitions = PlatformUtil.getPartitions(); - return null; } + /** + * Display any error messages that might of occurred when getting + * the lists of physical drives or partitions. + */ private void displayErrors() { if (physicalDrives.isEmpty() && partitions.isEmpty()) { if (PlatformUtil.isWindowsOS()) { @@ -592,7 +576,7 @@ final class LocalDiskPanel extends JPanel { errorLabel.setToolTipText(NbBundle.getMessage(this.getClass(), "LocalDiskPanel.errLabel.drivesNotDetected.toolTipText")); } - diskComboBox.setEnabled(false); + diskTable.setEnabled(false); } else if (physicalDrives.isEmpty()) { errorLabel.setText( NbBundle.getMessage(this.getClass(), "LocalDiskPanel.errLabel.someDisksNotDetected.text")); @@ -615,16 +599,14 @@ final class LocalDiskPanel extends JPanel { if (!this.isCancelled()) { enableNext = false; displayErrors(); - worker = null; loadingDisks = false; - + disks = new ArrayList<>(); disks.addAll(physicalDrives); disks.addAll(partitions); - if (disks.size() > 0) { - diskComboBox.setEnabled(true); - diskComboBox.setSelectedIndex(0); + diskTable.setEnabled(true); + diskTable.clearSelection(); } ready = true; } else { diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/Bundle.properties b/Core/src/org/sleuthkit/autopsy/datamodel/Bundle.properties index d178b73469..0fabf762e8 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/datamodel/Bundle.properties @@ -12,7 +12,7 @@ AbstractAbstractFileNode.modeColLbl=Mode AbstractAbstractFileNode.useridColLbl=UserID AbstractAbstractFileNode.groupidColLbl=GroupID AbstractAbstractFileNode.metaAddrColLbl=Meta Addr. -AbstractAbstractFileNode.attrAddrColLbl=Attr. Addr.ArtifactStringContent.getStr.err +AbstractAbstractFileNode.attrAddrColLbl=Attr. Addr. AbstractAbstractFileNode.typeDirColLbl=Type(Dir) AbstractAbstractFileNode.typeMetaColLbl=Type(Meta) AbstractAbstractFileNode.knownColLbl=Known diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/DataResultFilterNode.java b/Core/src/org/sleuthkit/autopsy/directorytree/DataResultFilterNode.java index 81820218ec..dd81434257 100755 --- a/Core/src/org/sleuthkit/autopsy/directorytree/DataResultFilterNode.java +++ b/Core/src/org/sleuthkit/autopsy/directorytree/DataResultFilterNode.java @@ -21,6 +21,7 @@ package org.sleuthkit.autopsy.directorytree; import java.awt.event.ActionEvent; import java.beans.PropertyVetoException; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.logging.Level; import java.util.prefs.PreferenceChangeEvent; @@ -29,6 +30,7 @@ import javax.swing.AbstractAction; import javax.swing.Action; import org.openide.explorer.ExplorerManager; import org.openide.nodes.AbstractNode; +import org.openide.nodes.ChildFactory; import org.openide.nodes.FilterNode; import org.openide.nodes.Node; import org.openide.nodes.Sheet; @@ -109,7 +111,7 @@ public class DataResultFilterNode extends FilterNode { * @param em ExplorerManager for component that is creating the node */ public DataResultFilterNode(Node node, ExplorerManager em) { - super(node, new DataResultFilterChildren(node, em)); + super(node, Children.create(new DataResultFilterChildren(node, em), true)); this.sourceEm = em; } @@ -119,8 +121,8 @@ public class DataResultFilterNode extends FilterNode { * @param node Root node to be passed to DataResult viewers * @param em ExplorerManager for component that is creating the node */ - private DataResultFilterNode(Node node, ExplorerManager em, boolean filterKnown, boolean filterSlack) { - super(node, new DataResultFilterChildren(node, em, filterKnown, filterSlack)); + private DataResultFilterNode(Node node, ExplorerManager em, boolean filterKnown, boolean filterSlack) { + super(node, Children.create(new DataResultFilterChildren(node, em, filterKnown, filterSlack), true)); this.sourceEm = em; } @@ -194,18 +196,20 @@ public class DataResultFilterNode extends FilterNode { * DataResultFilterNode that created in the DataResultFilterNode.java. * */ - private static class DataResultFilterChildren extends FilterNode.Children { + private static class DataResultFilterChildren extends ChildFactory { - private final ExplorerManager sourceEm; + private final ExplorerManager sourceEm; private boolean filterKnown; private boolean filterSlack; + private final Node parent; /** * the constructor */ - private DataResultFilterChildren(Node arg, ExplorerManager sourceEm) { - super(arg); + private DataResultFilterChildren(Node arg, ExplorerManager sourceEm) { + super(); + this.parent = arg; switch (SelectionContext.getSelectionContext(arg)) { case DATA_SOURCES: filterSlack = filterSlackFromDataSources; @@ -223,24 +227,33 @@ public class DataResultFilterNode extends FilterNode { this.sourceEm = sourceEm; } - private DataResultFilterChildren(Node arg, ExplorerManager sourceEm, boolean filterKnown, boolean filterSlack) { - super(arg); + private DataResultFilterChildren(Node arg, ExplorerManager sourceEm, boolean filterKnown, boolean filterSlack) { + super(); + this.parent = arg; this.filterKnown = filterKnown; this.filterSlack = filterSlack; this.sourceEm = sourceEm; } + @Override - protected Node[] createNodes(Node key) { + protected boolean createKeys(List list) { + list.addAll(Arrays.asList(parent.getChildren().getNodes())); + return true; + } + + + @Override + protected Node[] createNodesForKey(Node key) { AbstractFile file = key.getLookup().lookup(AbstractFile.class); if (file != null) { if (filterKnown && (file.getKnown() == TskData.FileKnown.KNOWN)) { // Filter out child nodes that represent known files - return new Node[]{}; + return null; } if (filterSlack && file.getType().equals(TskData.TSK_DB_FILES_TYPE_ENUM.SLACK)) { // Filter out child nodes that represent slack files - return new Node[]{}; + return null; } } return new Node[]{new DataResultFilterNode(key, sourceEm, filterKnown, filterSlack)}; @@ -338,8 +351,7 @@ public class DataResultFilterNode extends FilterNode { public List visit(FileTypesNode fileTypes) { return defaultVisit(fileTypes); } - - + @Override protected List defaultVisit(DisplayableItemNode ditem) { //preserve the default node's actions @@ -431,14 +443,12 @@ public class DataResultFilterNode extends FilterNode { protected AbstractAction defaultVisit(DisplayableItemNode c) { return openChild(c); } - + @Override public AbstractAction visit(FileTypesNode fileTypes) { return openChild(fileTypes); } - - /** * Tell the originating ExplorerManager to display the given * dataModelNode. diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeFilterNode.java b/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeFilterNode.java index 8c2595969a..0bea885cf5 100755 --- a/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeFilterNode.java +++ b/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeFilterNode.java @@ -28,6 +28,7 @@ import org.openide.nodes.Node; import org.openide.util.NbBundle; import org.openide.util.lookup.Lookups; import org.openide.util.lookup.ProxyLookup; +import org.sleuthkit.autopsy.core.UserPreferences; import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.datamodel.AbstractContentNode; import org.sleuthkit.autopsy.ingest.runIngestModuleWizard.RunIngestModulesAction; @@ -36,6 +37,7 @@ import org.sleuthkit.datamodel.Content; import org.sleuthkit.datamodel.Directory; import org.sleuthkit.datamodel.Image; import org.sleuthkit.datamodel.TskCoreException; +import org.sleuthkit.datamodel.TskData; import org.sleuthkit.datamodel.VirtualDirectory; /** @@ -77,13 +79,14 @@ class DirectoryTreeFilterNode extends FilterNode { AbstractFile file = getLookup().lookup(AbstractFile.class); if (file != null) { try { - final int numChildren = file.getChildrenCount(); + int numVisibleChildren = getVisibleChildCount(file); + /* * Left-to-right marks here are necessary to keep the count * and parens together for mixed right-to-left and * left-to-right names. */ - name = name + " \u200E(\u200E" + numChildren + ")\u200E"; //NON-NLS + name = name + " \u200E(\u200E" + numVisibleChildren + ")\u200E"; //NON-NLS } catch (TskCoreException ex) { logger.log(Level.SEVERE, "Error getting children count to display for file: " + file, ex); //NON-NLS @@ -92,6 +95,35 @@ class DirectoryTreeFilterNode extends FilterNode { } return name; } + + /** + * This method gets the number of visible children. Depending on the user + * preferences, slack files will either be included or purged in the count. + * + * @param file The AbstractFile object whose children will be counted. + * + * @return The number of visible children. + */ + private int getVisibleChildCount(AbstractFile file) throws TskCoreException { + int numVisibleChildren = 0; + List childList = file.getChildren(); + + if(UserPreferences.hideSlackFilesInDataSourcesTree()) { + // Purge slack files from the file count + for(int i=0; i < childList.size(); i++) { + AbstractFile childFile = (AbstractFile)childList.get(i); + if(childFile.getType() != TskData.TSK_DB_FILES_TYPE_ENUM.SLACK) { + numVisibleChildren++; + } + } + } + else { + // Include slack files in the file count + numVisibleChildren = file.getChildrenCount(); + } + + return numVisibleChildren; + } /** * Gets the context mneu (right click menu) actions for the node. diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/TikaTextExtractor.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/TikaTextExtractor.java index 09c94c017c..ad4f6b6ca1 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/TikaTextExtractor.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/TikaTextExtractor.java @@ -23,7 +23,6 @@ import java.io.IOException; import java.io.PushbackReader; import java.io.Reader; import java.util.List; -import java.util.MissingResourceException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; @@ -51,9 +50,9 @@ class TikaTextExtractor extends FileTextExtractor { private static final List TIKA_SUPPORTED_TYPES = new Tika().getParser().getSupportedTypes(new ParseContext()) - .stream() - .map(mt -> mt.getType() + "/" + mt.getSubtype()) - .collect(Collectors.toList()); + .stream() + .map(mt -> mt.getType() + "/" + mt.getSubtype()) + .collect(Collectors.toList()); @Override public void logWarning(final String msg, Exception ex) { @@ -62,7 +61,7 @@ class TikaTextExtractor extends FileTextExtractor { } @Override - public Reader getReader(AbstractFile sourceFile) throws TextExtractorException, MissingResourceException { + public Reader getReader(AbstractFile sourceFile) throws TextExtractorException { ReadContentInputStream stream = new ReadContentInputStream(sourceFile); Metadata metadata = new Metadata(); @@ -75,7 +74,7 @@ class TikaTextExtractor extends FileTextExtractor { PushbackReader pushbackReader = new PushbackReader(tikaReader); int read = pushbackReader.read(); if (read == -1) { - throw new TextExtractorException("Tika returned empty reader for " + sourceFile); + throw new TextExtractorException("Unable to extract text: Tika returned empty reader for " + sourceFile); } pushbackReader.unread(read); @@ -86,6 +85,8 @@ class TikaTextExtractor extends FileTextExtractor { final String msg = NbBundle.getMessage(this.getClass(), "AbstractFileTikaTextExtract.index.tikaParseTimeout.text", sourceFile.getId(), sourceFile.getName()); logWarning(msg, te); throw new TextExtractorException(msg, te); + } catch (TextExtractorException ex) { + throw ex; } catch (Exception ex) { KeywordSearch.getTikaLogger().log(Level.WARNING, "Exception: Unable to Tika parse the content" + sourceFile.getId() + ": " + sourceFile.getName(), ex.getCause()); //NON-NLS final String msg = NbBundle.getMessage(this.getClass(), "AbstractFileTikaTextExtract.index.exception.tikaParse.msg", sourceFile.getId(), sourceFile.getName()); @@ -107,10 +108,10 @@ class TikaTextExtractor extends FileTextExtractor { static private CharSource getMetaDataCharSource(Metadata metadata) { return CharSource.wrap( new StringBuilder("\n\n------------------------------METADATA------------------------------\n\n") - .append(Stream.of(metadata.names()).sorted() - .map(key -> key + ": " + metadata.get(key)) - .collect(Collectors.joining("\n")) - )); + .append(Stream.of(metadata.names()).sorted() + .map(key -> key + ": " + metadata.get(key)) + .collect(Collectors.joining("\n")) + )); } @Override @@ -124,8 +125,7 @@ class TikaTextExtractor extends FileTextExtractor { || FileTextExtractor.BLOB_MIME_TYPES.contains(detectedFormat) //any binary unstructured blobs (string extraction will be used) || FileTextExtractor.ARCHIVE_MIME_TYPES.contains(detectedFormat) || (detectedFormat.startsWith("video/") && !detectedFormat.equals("video/x-flv")) //skip video other than flv (tika supports flv only) //NON-NLS - || detectedFormat.equals("application/x-font-ttf")) { // Tika currently has a bug in the ttf parser in fontbox; It will throw an out of memory exception//NON-NLS - + ) { return false; } return TIKA_SUPPORTED_TYPES.contains(detectedFormat); @@ -167,7 +167,7 @@ class TikaTextExtractor extends FileTextExtractor { private final Reader reader; - public ReaderCharSource(Reader reader) { + ReaderCharSource(Reader reader) { this.reader = reader; } diff --git a/Testing/src/org/sleuthkit/autopsy/testing/AutopsyTestCases.java b/Testing/src/org/sleuthkit/autopsy/testing/AutopsyTestCases.java index d5d17136a6..67fa0495df 100755 --- a/Testing/src/org/sleuthkit/autopsy/testing/AutopsyTestCases.java +++ b/Testing/src/org/sleuthkit/autopsy/testing/AutopsyTestCases.java @@ -50,12 +50,14 @@ import org.netbeans.jemmy.operators.JListOperator; import org.netbeans.jemmy.operators.JTabbedPaneOperator; import org.netbeans.jemmy.operators.JTableOperator; import org.netbeans.jemmy.operators.JTextFieldOperator; +import org.netbeans.jemmy.operators.JToggleButtonOperator; import org.sleuthkit.autopsy.ingest.IngestManager; public class AutopsyTestCases { private static final Logger logger = Logger.getLogger(AutopsyTestCases.class.getName()); private long start; + /** * This method is used to escape file/directory path. Example: * \\NetworkLocation\foo\bar get escaped to \\\\NetworkLocation\foo\bar so @@ -79,7 +81,7 @@ public class AutopsyTestCases { public AutopsyTestCases () { start = 0; } - + public void testNewCaseWizardOpen(String title) { logger.info("New Case"); NbDialogOperator nbdo = new NbDialogOperator(title); @@ -102,15 +104,19 @@ public class AutopsyTestCases { start = System.currentTimeMillis(); wo.btFinish().clickMouse(); } - + public void testStartAddImageFileDataSource() { logger.info("Starting Add Image process"); WizardOperator wo = new WizardOperator("Add Data"); + //select the toggle button for Disk Image or VM File it will be the first button created and proceed to next panel + JToggleButtonOperator jtbo = new JToggleButtonOperator(wo, 0); + jtbo.clickMouse(); + wo.btNext().clickMouse(); JTextFieldOperator jtfo0 = new JTextFieldOperator(wo, 0); String img_path = getEscapedPath(System.getProperty("img_path")); String imageDir = img_path; ((JTextComponent) jtfo0.getSource()).setText(imageDir); - JComboBoxOperator comboBoxOperator = new JComboBoxOperator(wo, 1); + JComboBoxOperator comboBoxOperator = new JComboBoxOperator(wo, 0); comboBoxOperator.setSelectedItem("(GMT-5:00) America/New_York"); wo.btNext().clickMouse(); } @@ -118,9 +124,10 @@ public class AutopsyTestCases { public void testStartAddLogicalFilesDataSource() { logger.info("Starting Add Logical Files process"); WizardOperator wo = new WizardOperator("Add Data"); - JComboBoxOperator comboBoxOperator = new JComboBoxOperator(wo); - // select the item indexed 2 (Logical Files) from the drop-down list. - comboBoxOperator.selectItem(2); + //select the toggle button for Logical Files it will be the third button created and proceed to next panel + JToggleButtonOperator jtbo = new JToggleButtonOperator(wo, 2); + jtbo.clickMouse(); + wo.btNext().clickMouse(); JButtonOperator addButtonOperator = new JButtonOperator(wo, "Add"); addButtonOperator.pushNoBlock(); JFileChooserOperator fileChooserOperator = new JFileChooserOperator(); diff --git a/nbproject/platform.properties b/nbproject/platform.properties index 07a18d325c..9d47f558f0 100644 --- a/nbproject/platform.properties +++ b/nbproject/platform.properties @@ -15,6 +15,7 @@ cluster.path=\ disabled.modules=\ org.apache.tools.ant.module,\ org.netbeans.api.debugger.jpda,\ + org.netbeans.modules.debugger.jpda.jsui,\ org.netbeans.api.java,\ org.netbeans.api.maven,\ org.netbeans.lib.nbjavac,\