/*
* Autopsy Forensic Browser
*
* Copyright 2015 Basis Technology Corp.
* Contact: carrier <at> sleuthkit <dot> 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.experimental.configuration;
import java.awt.BorderLayout;
import java.io.File;
import java.nio.file.Files;
import java.util.List;
import javax.swing.JDialog;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.SwingWorker;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import org.openide.util.NbBundle;
import org.sleuthkit.autopsy.core.UserPreferences;
import org.sleuthkit.autopsy.ingest.IngestJobSettings;
import org.sleuthkit.autopsy.ingest.IngestJobSettingsPanel;
import java.awt.Dimension;
import java.nio.file.Paths;
import org.openide.util.ImageUtilities;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;
import org.sleuthkit.autopsy.coreutils.FileUtil;
import org.openide.windows.WindowManager;
import org.sleuthkit.autopsy.coreutils.Logger;
import org.sleuthkit.autopsy.experimental.autoingest.FileExporterSettingsPanel;
/**
*
*/
public class AutoIngestSettingsPanel extends javax.swing.JPanel {
private final AutoIngestSettingsPanelController controller;
private final JFileChooser fc = new JFileChooser();
private static final long serialVersionUID = 1L;
private static final Logger logger = Logger.getLogger(AutoIngestSettingsPanel.class.getName());
private Integer oldIngestThreads;
private static final String MULTI_USER_SETTINGS_MUST_BE_ENABLED = NbBundle.getMessage(AutoIngestSettingsPanel.class, "AutoIngestSettingsPanel.validationErrMsg.MUdisabled");
enum OptionsUiMode {
STANDALONE, AIM, REVIEW, DOWNLOADING_CONFIGURATION
};
/**
* Creates new form AutoIngestSettingsPanel
*
* @param theController Controller to notify of changes.
*/
public AutoIngestSettingsPanel(AutoIngestSettingsPanelController theController) {
controller = theController;
initComponents();
cbJoinAutoIngestCluster.setVisible(true);
load(true);
sharedSettingsTextField.getDocument().addDocumentListener(new MyDocumentListener());
inputPathTextField.getDocument().addDocumentListener(new MyDocumentListener());
outputPathTextField.getDocument().addDocumentListener(new MyDocumentListener());
jLabelInvalidImageFolder.setText("");
jLabelInvalidResultsFolder.setText("");
sharedSettingsErrorTextField.setText("");
jLabelTaskDescription.setText("");
configButtonErrorTextField.setText("");
pbTaskInProgress.setEnabled(false);
jLabelCurrentTask.setEnabled(false);
jLabelTaskDescription.setEnabled(false);
this.oldIngestThreads = UserPreferences.numberOfFileIngestThreads();
}
private class MyDocumentListener implements DocumentListener {
@Override
public void changedUpdate(DocumentEvent e) {
validateSettings();
controller.changed();
}
@Override
public void removeUpdate(DocumentEvent e) {
validateSettings();
controller.changed();
}
@Override
public void insertUpdate(DocumentEvent e) {
validateSettings();
controller.changed();
}
};
/**
* Load mode from persistent storage.
*
* @param inStartup True if we're doing the initial population of the UI
*/
final void load(boolean inStartup) {
// multi user mode must be enabled
if (!UserPreferences.getIsMultiUserModeEnabled()) {
tbOops.setText(MULTI_USER_SETTINGS_MUST_BE_ENABLED);
} else {
tbOops.setText("");
}
cbJoinAutoIngestCluster.setSelected(AutoIngestUserPreferences.getJoinAutoModeCluster());
cbJoinAutoIngestCluster.setEnabled(UserPreferences.getIsMultiUserModeEnabled());
if (inStartup) {
AutoIngestUserPreferences.SelectedMode storedMode = AutoIngestUserPreferences.getMode();
inputPathTextField.requestFocusInWindow();
if (null != storedMode) switch (storedMode) {
case REVIEW:
jRadioButtonReview.setSelected(true);
enableOptionsBasedOnMode(OptionsUiMode.REVIEW);
break;
case AUTOMATED:
jRadioButtonAutomated.setSelected(true);
enableOptionsBasedOnMode(OptionsUiMode.AIM);
break;
default:
cbJoinAutoIngestCluster.setSelected(false);
enableOptionsBasedOnMode(OptionsUiMode.STANDALONE);
break;
}
}
String images = AutoIngestUserPreferences.getAutoModeImageFolder();
if (images != null) {
inputPathTextField.setText(images);
} else {
inputPathTextField.setText("");
}
String results = AutoIngestUserPreferences.getAutoModeResultsFolder();
if (results != null) {
outputPathTextField.setText(results);
} else {
outputPathTextField.setText("");
}
if (inStartup) {
sharedConfigCheckbox.setSelected(AutoIngestUserPreferences.getSharedConfigEnabled());
String sharedSettingsFolder = AutoIngestUserPreferences.getSharedConfigFolder();
if (sharedSettingsFolder != null) {
sharedSettingsTextField.setText(sharedSettingsFolder);
} else {
String folder = getDefaultSharedFolder();
sharedSettingsTextField.setText(folder);
}
masterNodeCheckBox.setSelected(AutoIngestUserPreferences.getSharedConfigMaster());
setEnabledStateForSharedConfiguration();
}
validateSettings();
}
/**
* Get the default location for the shared configuration folder. Currently
* this is a subfolder of the shared images folder.
*
* @return The default subfolder name, or an empty string if the base folder
* is not set
*/
private String getDefaultSharedFolder() {
String images = inputPathTextField.getText().trim();
if (images == null || images.isEmpty()) {
return "";
}
File sharedFolder = new File(images, "sharedConfiguration");
if (!sharedFolder.exists()) {
try {
sharedFolder.mkdir();
return sharedFolder.getAbsolutePath();
} catch (Exception ex) {
sharedSettingsErrorTextField.setText(NbBundle.getMessage(AutoIngestSettingsPanel.class, "AutoIngestSettingsPanel.ErrorSettingDefaultFolder"));
return "";
}
}
return sharedFolder.getAbsolutePath();
}
/**
* Save mode to persistent storage.
*/
void store() {
boolean needsRestart = false;
AutoIngestUserPreferences.SelectedMode storedMode = AutoIngestUserPreferences.getMode();
if (AutoIngestUserPreferences.getJoinAutoModeCluster() != cbJoinAutoIngestCluster.isSelected()) {
needsRestart = true;
}
AutoIngestUserPreferences.setJoinAutoModeCluster(cbJoinAutoIngestCluster.isSelected());
if (!cbJoinAutoIngestCluster.isSelected()) {
AutoIngestUserPreferences.setMode(AutoIngestUserPreferences.SelectedMode.STANDALONE);
//before return popup the message
if (needsRestart) {
SwingUtilities.invokeLater(() -> {
JOptionPane.showMessageDialog(null,
NbBundle.getMessage(AutoIngestSettingsPanel.class, "AutoIngestSettingsPanel.MustRestart"),
NbBundle.getMessage(AutoIngestSettingsPanel.class, "AutoIngestSettingsPanel.restartRequiredLabel.text"),
JOptionPane.WARNING_MESSAGE);
});
}
return;
}
if (jRadioButtonAutomated.isSelected()) {
if (storedMode != AutoIngestUserPreferences.SelectedMode.AUTOMATED) {
needsRestart = true;
}
String thePath = AutoIngestUserPreferences.getAutoModeImageFolder();
if (thePath != null && 0 != inputPathTextField.getText().compareTo(thePath)) {
needsRestart = true;
}
thePath = AutoIngestUserPreferences.getAutoModeResultsFolder();
if (thePath != null && 0 != outputPathTextField.getText().compareTo(thePath)) {
needsRestart = true;
}
AutoIngestUserPreferences.setMode(AutoIngestUserPreferences.SelectedMode.AUTOMATED);
String imageFolderPath = getNormalizedFolderPath(inputPathTextField.getText().trim());
AutoIngestUserPreferences.setAutoModeImageFolder(imageFolderPath);
String resultsFolderPath = getNormalizedFolderPath(outputPathTextField.getText().trim());
AutoIngestUserPreferences.setAutoModeResultsFolder(resultsFolderPath);
AutoIngestUserPreferences.setSharedConfigEnabled(sharedConfigCheckbox.isSelected());
if (sharedConfigCheckbox.isSelected()) {
String globalSettingsPath = getNormalizedFolderPath(sharedSettingsTextField.getText().trim());
AutoIngestUserPreferences.setSharedConfigFolder(globalSettingsPath);
AutoIngestUserPreferences.setSharedConfigMaster(masterNodeCheckBox.isSelected());
}
} else if (jRadioButtonReview.isSelected()) {
if (storedMode != AutoIngestUserPreferences.SelectedMode.REVIEW) {
needsRestart = true;
}
String thePath = AutoIngestUserPreferences.getAutoModeResultsFolder();
if (thePath != null && 0 != outputPathTextField.getText().compareTo(thePath)) {
needsRestart = true;
}
AutoIngestUserPreferences.setMode(AutoIngestUserPreferences.SelectedMode.REVIEW);
String resultsFolderPath = getNormalizedFolderPath(outputPathTextField.getText().trim());
AutoIngestUserPreferences.setAutoModeResultsFolder(resultsFolderPath);
}
if (needsRestart) {
SwingUtilities.invokeLater(() -> {
JOptionPane.showMessageDialog(null,
NbBundle.getMessage(AutoIngestSettingsPanel.class, "AutoIngestSettingsPanel.MustRestart"),
NbBundle.getMessage(AutoIngestSettingsPanel.class, "AutoIngestSettingsPanel.restartRequiredLabel.text"),
JOptionPane.WARNING_MESSAGE);
});
}
}
void validateSettings() {
if (valid()) {
if (validSharedConfigSettings()) {
downloadButton.setEnabled(true);
if (masterNodeCheckBox.isEnabled() && masterNodeCheckBox.isSelected()) {
uploadButton.setEnabled(true);
} else {
uploadButton.setEnabled(false);
}
} else {
downloadButton.setEnabled(false);
uploadButton.setEnabled(false);
}
displaySharedConfigButtonText();
} else {
uploadButton.setEnabled(false);
if (validSharedConfigSettings()) {
downloadButton.setEnabled(true);
} else {
downloadButton.setEnabled(false);
}
displaySharedConfigButtonText();
}
}
/**
* Validate current panel settings.
*/
boolean valid() {
if (!cbJoinAutoIngestCluster.isSelected()) {
return true;
}
boolean isValidNodePanel = true;
switch (getModeFromRadioButtons()) {
case AIM:
if (!validateImagePath()) {
isValidNodePanel = false;
}
if (!validateResultsPath()) {
isValidNodePanel = false;
}
if (!validateSharedSettingsPath()) {
isValidNodePanel = false;
configButtonErrorTextField.setText("Shared configuration folder is invalid");
}
break;
case REVIEW:
if (!validateResultsPath()) {
isValidNodePanel = false;
}
break;
case STANDALONE:
break;
default:
break;
}
if (jRadioButtonAutomated.isSelected()) {
if (sharedConfigCheckbox.isEnabled() && sharedConfigCheckbox.isSelected() && !validSharedConfigSettings()) {
isValidNodePanel = false;
}
}
return isValidNodePanel;
}
/**
* Check everything that is needed to enable the upload or download config
* buttons is set (except the master node checkbox for upload).
*
* @return
*/
boolean validSharedConfigSettings() {
// Check for:
// - shared config checkbox enabled and checked
// - valid shared config folder entered
// - mulit-user settings enabled
return (sharedConfigCheckbox.isEnabled() && sharedConfigCheckbox.isSelected() && UserPreferences.getIsMultiUserModeEnabled());
}
/**
*
*/
void displaySharedConfigButtonText() {
if (sharedConfigCheckbox.isEnabled() && sharedConfigCheckbox.isSelected()) {
if (!UserPreferences.getIsMultiUserModeEnabled()) {
configButtonErrorTextField.setText("Multi-user cases must be enabled");
} else {
configButtonErrorTextField.setText("");
}
} else {
configButtonErrorTextField.setText("");
}
}
/**
* Determines whether settings requiring a restart have changed, and also
* updates the UI.
*
* @return true if something has changed that will require a reset, false
* otherwise
*/
boolean isResetNeeded() {
boolean resetNeeded = false;
// Save the current values from the UI
String oldInputPath = inputPathTextField.getText().trim();
String oldOutputPath = outputPathTextField.getText().trim();
// Refresh UI
load(false);
if (!oldInputPath.equals(inputPathTextField.getText().trim())) {
resetNeeded = true;
}
if (!oldOutputPath.equals(outputPathTextField.getText().trim())) {
resetNeeded = true;
}
if (!this.oldIngestThreads.equals(UserPreferences.numberOfFileIngestThreads())) {
resetNeeded = true;
}
return resetNeeded;
}
/**
* Normalizes a path to make sure there are no "space" characters at the end
*
* @param path Path to a directory
*
* @return Path without "space" characters at the end
*/
String normalizePath(String path) {
while (path.length() > 0) {
if (path.charAt(path.length() - 1) == ' ') {
path = path.substring(0, path.length() - 1);
} else {
break;
}
}
return path;
}
/**
* Validates that a path is valid and points to a folder.
*
* @param path A path to be validated
*
* @return boolean returns true if valid and points to a folder, false
* otherwise
*/
boolean isFolderPathValid(String path) {
try {
File file = new File(normalizePath(path));
// check if it's a symbolic link
if (Files.isSymbolicLink(file.toPath())) {
return true;
}
// local folder
if (file.exists() && file.isDirectory()) {
return true;
}
} catch (Exception ex) {
// Files.isSymbolicLink (and other "files" methods) throw exceptions on seemingly innocent inputs.
// For example, it will throw an exception when either " " is last character in path or
// a path starting with ":".
// We can just ignore these exceptions as they occur in process of user typing in the path.
return false;
}
return false;
}
/**
* Returns a path that was normalized by file system.
*
* @param path A path to be normalized. Normalization occurs inside a call
* to new File().
*
* @return String returns normalized OS path
*/
String getNormalizedFolderPath(String path) {
// removes "/", "\", and " " characters at the end of path string.
// normalizePath() removes spaces at the end of path and a call to "new File()"
// internally formats the path string to remove "/" and "\" characters at the end of path.
File file = new File(normalizePath(path));
return file.getPath();
}
/**
* Validate image path. Display warnings if invalid.
*/
boolean validateImagePath() {
String inputPath = inputPathTextField.getText().trim();
if (inputPath.isEmpty()) {
jLabelInvalidImageFolder.setVisible(true);
jLabelInvalidImageFolder.setText(NbBundle.getMessage(AutoIngestSettingsPanel.class, "AutoIngestSettingsPanel.ImageDirectoryUnspecified"));
return false;
}
if (!isFolderPathValid(inputPath)) {
jLabelInvalidImageFolder.setVisible(true);
jLabelInvalidImageFolder.setText(NbBundle.getMessage(AutoIngestSettingsPanel.class, "AutoIngestSettingsPanel.PathInvalid"));
return false;
}
if (false == permissionsAppropriate(inputPath)) {
jLabelInvalidImageFolder.setVisible(true);
jLabelInvalidImageFolder.setText(NbBundle.getMessage(AutoIngestSettingsPanel.class, "AutoIngestSettingsPanel.CannotAccess")
+ " " + inputPath + " "
+ NbBundle.getMessage(AutoIngestSettingsPanel.class, "AutoIngestSettingsPanel.CheckPermissions"));
return false;
}
jLabelInvalidImageFolder.setVisible(false);
return true;
}
/**
* Validate results path. Display warnings if invalid.
*/
boolean validateResultsPath() {
String outputPath = outputPathTextField.getText().trim();
if (outputPath.isEmpty()) {
jLabelInvalidResultsFolder.setVisible(true);
jLabelInvalidResultsFolder.setText(NbBundle.getMessage(AutoIngestSettingsPanel.class, "AutoIngestSettingsPanel.ResultsDirectoryUnspecified"));
return false;
}
if (!isFolderPathValid(outputPath)) {
jLabelInvalidResultsFolder.setVisible(true);
jLabelInvalidResultsFolder.setText(NbBundle.getMessage(AutoIngestSettingsPanel.class, "AutoIngestSettingsPanel.PathInvalid"));
return false;
}
if (false == permissionsAppropriate(outputPath)) {
jLabelInvalidResultsFolder.setVisible(true);
jLabelInvalidResultsFolder.setText(NbBundle.getMessage(AutoIngestSettingsPanel.class, "AutoIngestSettingsPanel.CannotAccess")
+ " " + outputPath + " "
+ NbBundle.getMessage(AutoIngestSettingsPanel.class, "AutoIngestSettingsPanel.CheckPermissions"));
return false;
}
jLabelInvalidResultsFolder.setVisible(false);
return true;
}
/**
* Validate shared settings path. Display warnings if invalid.
*/
boolean validateSharedSettingsPath() {
String sharedSettingsPath = sharedSettingsTextField.getText().trim();
// Automatically valid if shared settings aren't selected
if (!sharedConfigCheckbox.isSelected()) {
return true;
}
if (sharedSettingsPath.isEmpty()) {
sharedSettingsErrorTextField.setVisible(true);
sharedSettingsErrorTextField.setText(NbBundle.getMessage(AutoIngestSettingsPanel.class, "AutoIngestSettingsPanel.EmptySettingsDirectory"));
return false;
}
if (!isFolderPathValid(sharedSettingsPath)) {
sharedSettingsErrorTextField.setVisible(true);
sharedSettingsErrorTextField.setText(NbBundle.getMessage(AutoIngestSettingsPanel.class, "AutoIngestSettingsPanel.PathInvalid"));
return false;
}
if (false == permissionsAppropriate(sharedSettingsPath)) {
sharedSettingsErrorTextField.setVisible(true);
sharedSettingsErrorTextField.setText(NbBundle.getMessage(AutoIngestSettingsPanel.class, "AutoIngestSettingsPanel.CannotAccess")
+ " " + sharedSettingsPath + " "
+ NbBundle.getMessage(AutoIngestSettingsPanel.class, "AutoIngestSettingsPanel.CheckPermissions"));
return false;
}
sharedSettingsErrorTextField.setText("");
return true;
}
private void displayIngestJobSettingsPanel() {
IngestJobSettings ingestJobSettings = new IngestJobSettings(AutoIngestUserPreferences.getAutoModeIngestModuleContextString());
showWarnings(ingestJobSettings);
IngestJobSettingsPanel ingestJobSettingsPanel = new IngestJobSettingsPanel(ingestJobSettings);
add(ingestJobSettingsPanel, BorderLayout.PAGE_START);
if (JOptionPane.showConfirmDialog(null, ingestJobSettingsPanel, "Ingest Module Configuration", JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE) == JOptionPane.OK_OPTION) {
// store the updated settings
ingestJobSettings = ingestJobSettingsPanel.getSettings();
ingestJobSettings.save();
showWarnings(ingestJobSettings);
}
}
private static void showWarnings(IngestJobSettings ingestJobSettings) {
List<String> warnings = ingestJobSettings.getWarnings();
if (warnings.isEmpty() == false) {
StringBuilder warningMessage = new StringBuilder();
for (String warning : warnings) {
warningMessage.append(warning).append("\n");
}
JOptionPane.showMessageDialog(null, warningMessage.toString());
}
}
private void enableOptionsBasedOnMode(OptionsUiMode mode) {
if (mode != OptionsUiMode.DOWNLOADING_CONFIGURATION) {
jRadioButtonAutomated.setEnabled(cbJoinAutoIngestCluster.isSelected());
jRadioButtonReview.setEnabled(cbJoinAutoIngestCluster.isSelected());
jLabelSelectInputFolder.setEnabled(mode == OptionsUiMode.AIM);
inputPathTextField.setEnabled(mode == OptionsUiMode.AIM);
browseInputFolderButton.setEnabled(mode == OptionsUiMode.AIM);
jLabelSelectOutputFolder.setEnabled(mode == OptionsUiMode.AIM || mode == OptionsUiMode.REVIEW);
outputPathTextField.setEnabled(mode == OptionsUiMode.AIM || mode == OptionsUiMode.REVIEW);
browseOutputFolderButton.setEnabled(mode == OptionsUiMode.AIM || mode == OptionsUiMode.REVIEW);
jPanelSharedConfig.setEnabled(mode == OptionsUiMode.AIM);
jPanelIngestSettings.setEnabled(mode == OptionsUiMode.AIM);
bnEditIngestSettings.setEnabled(mode == OptionsUiMode.AIM);
bnAdvancedSettings.setEnabled(mode == OptionsUiMode.AIM);
bnLogging.setEnabled(mode == OptionsUiMode.AIM);
jPanelSharedConfig.setEnabled(mode == OptionsUiMode.AIM);
sharedConfigCheckbox.setEnabled(mode == OptionsUiMode.AIM);
masterNodeCheckBox.setEnabled(mode == OptionsUiMode.AIM && sharedConfigCheckbox.isSelected());
bnFileExport.setEnabled(mode == OptionsUiMode.AIM);
sharedSettingsTextField.setEnabled(mode == OptionsUiMode.AIM && sharedConfigCheckbox.isSelected());
downloadButton.setEnabled(mode == OptionsUiMode.AIM && sharedConfigCheckbox.isSelected());
browseSharedSettingsButton.setEnabled(mode == OptionsUiMode.AIM && sharedConfigCheckbox.isSelected());
uploadButton.setEnabled(mode == OptionsUiMode.AIM && sharedConfigCheckbox.isSelected() && masterNodeCheckBox.isSelected());
} else {
setEnabledState(false);
}
}
private OptionsUiMode getModeFromRadioButtons() {
if (!cbJoinAutoIngestCluster.isSelected()) {
return OptionsUiMode.STANDALONE;
}
if (jRadioButtonAutomated.isSelected()) {
return OptionsUiMode.AIM;
} else if (jRadioButtonReview.isSelected()) {
return OptionsUiMode.REVIEW;
} else {
return OptionsUiMode.STANDALONE;
}
}
/**
* 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")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
modeRadioButtons = new javax.swing.ButtonGroup();
nodePanel = new javax.swing.JPanel();
jPanelNodeType = new javax.swing.JPanel();
jLabelSelectMode = new javax.swing.JLabel();
restartRequiredNodeLabel = new javax.swing.JLabel();
jRadioButtonAutomated = new javax.swing.JRadioButton();
jRadioButtonReview = new javax.swing.JRadioButton();
jLabelSelectInputFolder = new javax.swing.JLabel();
inputPathTextField = new javax.swing.JTextField();
browseInputFolderButton = new javax.swing.JButton();
jLabelSelectOutputFolder = new javax.swing.JLabel();
outputPathTextField = new javax.swing.JTextField();
browseOutputFolderButton = new javax.swing.JButton();
jLabelInvalidImageFolder = new javax.swing.JLabel();
jLabelInvalidResultsFolder = new javax.swing.JLabel();
jLabel1 = new javax.swing.JLabel();
jPanelSharedConfig = new javax.swing.JPanel();
sharedConfigCheckbox = new javax.swing.JCheckBox();
sharedSettingsTextField = new javax.swing.JTextField();
browseSharedSettingsButton = new javax.swing.JButton();
sharedSettingsErrorTextField = new javax.swing.JTextField();
masterNodeCheckBox = new javax.swing.JCheckBox();
uploadButton = new javax.swing.JButton();
downloadButton = new javax.swing.JButton();
jLabelCurrentTask = new javax.swing.JLabel();
pbTaskInProgress = new javax.swing.JProgressBar();
jLabelTaskDescription = new javax.swing.JLabel();
configButtonErrorTextField = new javax.swing.JTextField();
jSeparator1 = new javax.swing.JSeparator();
jPanelIngestSettings = new javax.swing.JPanel();
bnEditIngestSettings = new javax.swing.JButton();
bnAdvancedSettings = new javax.swing.JButton();
bnFileExport = new javax.swing.JButton();
bnLogging = new javax.swing.JButton();
cbJoinAutoIngestCluster = new javax.swing.JCheckBox();
tbOops = new javax.swing.JTextField();
jPanelNodeType.setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createEtchedBorder(), org.openide.util.NbBundle.getMessage(AutoIngestSettingsPanel.class, "AutoIngestSettingsPanel.jPanelNodeType.border.title"))); // NOI18N
jPanelNodeType.setMinimumSize(new java.awt.Dimension(50, 50));
org.openide.awt.Mnemonics.setLocalizedText(jLabelSelectMode, org.openide.util.NbBundle.getMessage(AutoIngestSettingsPanel.class, "AutoIngestSettingsPanel.jLabelSelectMode.text")); // NOI18N
restartRequiredNodeLabel.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/experimental/images/warning16.png"))); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(restartRequiredNodeLabel, org.openide.util.NbBundle.getMessage(AutoIngestSettingsPanel.class, "AutoIngestSettingsPanel.restartRequiredNodeLabel.text")); // NOI18N
modeRadioButtons.add(jRadioButtonAutomated);
jRadioButtonAutomated.setSelected(true);
org.openide.awt.Mnemonics.setLocalizedText(jRadioButtonAutomated, org.openide.util.NbBundle.getMessage(AutoIngestSettingsPanel.class, "AutoIngestSettingsPanel.jRadioButtonAutomated.text")); // NOI18N
jRadioButtonAutomated.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestSettingsPanel.class, "AutoIngestSettingsPanel.jRadioButtonAutomated.toolTipText")); // NOI18N
jRadioButtonAutomated.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jRadioButtonAutomatedActionPerformed(evt);
}
});
modeRadioButtons.add(jRadioButtonReview);
org.openide.awt.Mnemonics.setLocalizedText(jRadioButtonReview, org.openide.util.NbBundle.getMessage(AutoIngestSettingsPanel.class, "AutoIngestSettingsPanel.jRadioButtonReview.text")); // NOI18N
jRadioButtonReview.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestSettingsPanel.class, "AutoIngestSettingsPanel.jRadioButtonReview.toolTipText")); // NOI18N
jRadioButtonReview.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jRadioButtonReviewActionPerformed(evt);
}
});
org.openide.awt.Mnemonics.setLocalizedText(jLabelSelectInputFolder, org.openide.util.NbBundle.getMessage(AutoIngestSettingsPanel.class, "AutoIngestSettingsPanel.jLabelSelectInputFolder.text")); // NOI18N
jLabelSelectInputFolder.setVerticalAlignment(javax.swing.SwingConstants.BOTTOM);
inputPathTextField.setText(org.openide.util.NbBundle.getMessage(AutoIngestSettingsPanel.class, "AutoIngestSettingsPanel.inputPathTextField.text")); // NOI18N
inputPathTextField.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestSettingsPanel.class, "AutoIngestSettingsPanel.inputPathTextField.toolTipText")); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(browseInputFolderButton, org.openide.util.NbBundle.getMessage(AutoIngestSettingsPanel.class, "AutoIngestSettingsPanel.browseInputFolderButton.text")); // NOI18N
browseInputFolderButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
browseInputFolderButtonActionPerformed(evt);
}
});
org.openide.awt.Mnemonics.setLocalizedText(jLabelSelectOutputFolder, org.openide.util.NbBundle.getMessage(AutoIngestSettingsPanel.class, "AutoIngestSettingsPanel.jLabelSelectOutputFolder.text")); // NOI18N
jLabelSelectOutputFolder.setVerticalAlignment(javax.swing.SwingConstants.BOTTOM);
outputPathTextField.setText(org.openide.util.NbBundle.getMessage(AutoIngestSettingsPanel.class, "AutoIngestSettingsPanel.outputPathTextField.text")); // NOI18N
outputPathTextField.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestSettingsPanel.class, "AutoIngestSettingsPanel.outputPathTextField.toolTipText")); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(browseOutputFolderButton, org.openide.util.NbBundle.getMessage(AutoIngestSettingsPanel.class, "AutoIngestSettingsPanel.browseOutputFolderButton.text")); // NOI18N
browseOutputFolderButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
browseOutputFolderButtonActionPerformed(evt);
}
});
jLabelInvalidImageFolder.setForeground(new java.awt.Color(255, 0, 0));
org.openide.awt.Mnemonics.setLocalizedText(jLabelInvalidImageFolder, org.openide.util.NbBundle.getMessage(AutoIngestSettingsPanel.class, "AutoIngestSettingsPanel.jLabelInvalidImageFolder.text")); // NOI18N
jLabelInvalidResultsFolder.setForeground(new java.awt.Color(255, 0, 0));
org.openide.awt.Mnemonics.setLocalizedText(jLabelInvalidResultsFolder, org.openide.util.NbBundle.getMessage(AutoIngestSettingsPanel.class, "AutoIngestSettingsPanel.jLabelInvalidResultsFolder.text")); // NOI18N
jLabel1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/experimental/images/AIM.png"))); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(jLabel1, org.openide.util.NbBundle.getMessage(AutoIngestSettingsPanel.class, "AutoIngestSettingsPanel.jLabel1.text")); // NOI18N
javax.swing.GroupLayout jPanelNodeTypeLayout = new javax.swing.GroupLayout(jPanelNodeType);
jPanelNodeType.setLayout(jPanelNodeTypeLayout);
jPanelNodeTypeLayout.setHorizontalGroup(
jPanelNodeTypeLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanelNodeTypeLayout.createSequentialGroup()
.addContainerGap()
.addGroup(jPanelNodeTypeLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanelNodeTypeLayout.createSequentialGroup()
.addGroup(jPanelNodeTypeLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
.addComponent(outputPathTextField, javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(inputPathTextField, javax.swing.GroupLayout.Alignment.LEADING))
.addGap(10, 10, 10)
.addGroup(jPanelNodeTypeLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(browseInputFolderButton, javax.swing.GroupLayout.Alignment.TRAILING)
.addComponent(browseOutputFolderButton, javax.swing.GroupLayout.Alignment.TRAILING)))
.addGroup(jPanelNodeTypeLayout.createSequentialGroup()
.addGroup(jPanelNodeTypeLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanelNodeTypeLayout.createSequentialGroup()
.addComponent(jLabelSelectMode)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(restartRequiredNodeLabel))
.addComponent(jRadioButtonReview)
.addComponent(jRadioButtonAutomated))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(jLabel1))
.addGroup(jPanelNodeTypeLayout.createSequentialGroup()
.addComponent(jLabelSelectInputFolder)
.addGap(18, 18, 18)
.addComponent(jLabelInvalidImageFolder, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addGroup(jPanelNodeTypeLayout.createSequentialGroup()
.addComponent(jLabelSelectOutputFolder)
.addGap(18, 18, 18)
.addComponent(jLabelInvalidResultsFolder, javax.swing.GroupLayout.PREFERRED_SIZE, 544, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(0, 0, Short.MAX_VALUE)))
.addContainerGap())
);
jPanelNodeTypeLayout.setVerticalGroup(
jPanelNodeTypeLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanelNodeTypeLayout.createSequentialGroup()
.addGroup(jPanelNodeTypeLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanelNodeTypeLayout.createSequentialGroup()
.addContainerGap()
.addGroup(jPanelNodeTypeLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabelSelectMode)
.addComponent(restartRequiredNodeLabel))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(jRadioButtonAutomated)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jRadioButtonReview))
.addComponent(jLabel1))
.addGap(1, 1, 1)
.addGroup(jPanelNodeTypeLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabelSelectInputFolder)
.addComponent(jLabelInvalidImageFolder))
.addGap(1, 1, 1)
.addGroup(jPanelNodeTypeLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(inputPathTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(browseInputFolderButton))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(jPanelNodeTypeLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabelSelectOutputFolder, javax.swing.GroupLayout.PREFERRED_SIZE, 21, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jLabelInvalidResultsFolder))
.addGap(1, 1, 1)
.addGroup(jPanelNodeTypeLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(browseOutputFolderButton)
.addComponent(outputPathTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGap(0, 0, Short.MAX_VALUE))
);
jPanelSharedConfig.setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createEtchedBorder(), org.openide.util.NbBundle.getMessage(AutoIngestSettingsPanel.class, "AutoIngestSettingsPanel.jPanelSharedConfig.border.title"))); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(sharedConfigCheckbox, org.openide.util.NbBundle.getMessage(AutoIngestSettingsPanel.class, "AutoIngestSettingsPanel.sharedConfigCheckbox.text")); // NOI18N
sharedConfigCheckbox.setMaximumSize(new java.awt.Dimension(191, 14));
sharedConfigCheckbox.setMinimumSize(new java.awt.Dimension(191, 14));
sharedConfigCheckbox.setPreferredSize(new java.awt.Dimension(191, 14));
sharedConfigCheckbox.addItemListener(new java.awt.event.ItemListener() {
public void itemStateChanged(java.awt.event.ItemEvent evt) {
sharedConfigCheckboxItemStateChanged(evt);
}
});
sharedSettingsTextField.setText(org.openide.util.NbBundle.getMessage(AutoIngestSettingsPanel.class, "AutoIngestSettingsPanel.sharedSettingsTextField.text")); // NOI18N
sharedSettingsTextField.setEnabled(false);
org.openide.awt.Mnemonics.setLocalizedText(browseSharedSettingsButton, org.openide.util.NbBundle.getMessage(AutoIngestSettingsPanel.class, "AutoIngestSettingsPanel.browseSharedSettingsButton.text")); // NOI18N
browseSharedSettingsButton.setEnabled(false);
browseSharedSettingsButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
browseSharedSettingsButtonActionPerformed(evt);
}
});
sharedSettingsErrorTextField.setEditable(false);
sharedSettingsErrorTextField.setForeground(new java.awt.Color(255, 0, 0));
sharedSettingsErrorTextField.setText(org.openide.util.NbBundle.getMessage(AutoIngestSettingsPanel.class, "AutoIngestSettingsPanel.sharedSettingsErrorTextField.text")); // NOI18N
sharedSettingsErrorTextField.setBorder(null);
org.openide.awt.Mnemonics.setLocalizedText(masterNodeCheckBox, org.openide.util.NbBundle.getMessage(AutoIngestSettingsPanel.class, "AutoIngestSettingsPanel.masterNodeCheckBox.text")); // NOI18N
masterNodeCheckBox.setEnabled(false);
masterNodeCheckBox.addItemListener(new java.awt.event.ItemListener() {
public void itemStateChanged(java.awt.event.ItemEvent evt) {
masterNodeCheckBoxItemStateChanged(evt);
}
});
org.openide.awt.Mnemonics.setLocalizedText(uploadButton, org.openide.util.NbBundle.getMessage(AutoIngestSettingsPanel.class, "AutoIngestSettingsPanel.uploadButton.text")); // NOI18N
uploadButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
uploadButtonActionPerformed(evt);
}
});
org.openide.awt.Mnemonics.setLocalizedText(downloadButton, org.openide.util.NbBundle.getMessage(AutoIngestSettingsPanel.class, "AutoIngestSettingsPanel.downloadButton.text")); // NOI18N
downloadButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
downloadButtonActionPerformed(evt);
}
});
org.openide.awt.Mnemonics.setLocalizedText(jLabelCurrentTask, org.openide.util.NbBundle.getMessage(AutoIngestSettingsPanel.class, "AutoIngestSettingsPanel.jLabelCurrentTask.text")); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(jLabelTaskDescription, org.openide.util.NbBundle.getMessage(AutoIngestSettingsPanel.class, "AutoIngestSettingsPanel.jLabelTaskDescription.text")); // NOI18N
configButtonErrorTextField.setEditable(false);
configButtonErrorTextField.setForeground(new java.awt.Color(255, 0, 0));
configButtonErrorTextField.setText(org.openide.util.NbBundle.getMessage(AutoIngestSettingsPanel.class, "AutoIngestSettingsPanel.configButtonErrorTextField.text")); // NOI18N
configButtonErrorTextField.setBorder(null);
javax.swing.GroupLayout jPanelSharedConfigLayout = new javax.swing.GroupLayout(jPanelSharedConfig);
jPanelSharedConfig.setLayout(jPanelSharedConfigLayout);
jPanelSharedConfigLayout.setHorizontalGroup(
jPanelSharedConfigLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanelSharedConfigLayout.createSequentialGroup()
.addGap(10, 10, 10)
.addComponent(jLabelCurrentTask)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(jLabelTaskDescription, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addContainerGap())
.addGroup(jPanelSharedConfigLayout.createSequentialGroup()
.addContainerGap()
.addGroup(jPanelSharedConfigLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanelSharedConfigLayout.createSequentialGroup()
.addComponent(sharedSettingsTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 400, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(browseSharedSettingsButton, javax.swing.GroupLayout.PREFERRED_SIZE, 143, javax.swing.GroupLayout.PREFERRED_SIZE))
.addComponent(uploadButton, javax.swing.GroupLayout.PREFERRED_SIZE, 143, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGroup(jPanelSharedConfigLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
.addGroup(javax.swing.GroupLayout.Alignment.LEADING, jPanelSharedConfigLayout.createSequentialGroup()
.addComponent(downloadButton, javax.swing.GroupLayout.PREFERRED_SIZE, 143, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(configButtonErrorTextField))
.addGroup(javax.swing.GroupLayout.Alignment.LEADING, jPanelSharedConfigLayout.createSequentialGroup()
.addComponent(sharedConfigCheckbox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(sharedSettingsErrorTextField))
.addComponent(jSeparator1, javax.swing.GroupLayout.PREFERRED_SIZE, 692, javax.swing.GroupLayout.PREFERRED_SIZE))
.addComponent(pbTaskInProgress, javax.swing.GroupLayout.PREFERRED_SIZE, 695, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(masterNodeCheckBox))
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
jPanelSharedConfigLayout.setVerticalGroup(
jPanelSharedConfigLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanelSharedConfigLayout.createSequentialGroup()
.addContainerGap()
.addGroup(jPanelSharedConfigLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(sharedConfigCheckbox, javax.swing.GroupLayout.PREFERRED_SIZE, 21, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(sharedSettingsErrorTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 21, javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(jPanelSharedConfigLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(sharedSettingsTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(browseSharedSettingsButton))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addGroup(jPanelSharedConfigLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(downloadButton)
.addComponent(configButtonErrorTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 21, javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(jSeparator1, javax.swing.GroupLayout.PREFERRED_SIZE, 10, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(1, 1, 1)
.addComponent(masterNodeCheckBox, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(uploadButton)
.addGap(8, 8, 8)
.addGroup(jPanelSharedConfigLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabelCurrentTask)
.addComponent(jLabelTaskDescription))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(pbTaskInProgress, javax.swing.GroupLayout.PREFERRED_SIZE, 22, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
jPanelIngestSettings.setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createEtchedBorder(), org.openide.util.NbBundle.getMessage(AutoIngestSettingsPanel.class, "AutoIngestSettingsPanel.jPanelIngestSettings.border.title"))); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(bnEditIngestSettings, org.openide.util.NbBundle.getMessage(AutoIngestSettingsPanel.class, "AutoIngestSettingsPanel.bnEditIngestSettings.text")); // NOI18N
bnEditIngestSettings.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestSettingsPanel.class, "AutoIngestSettingsPanel.bnEditIngestSettings.toolTipText")); // NOI18N
bnEditIngestSettings.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
bnEditIngestSettingsActionPerformed(evt);
}
});
org.openide.awt.Mnemonics.setLocalizedText(bnAdvancedSettings, org.openide.util.NbBundle.getMessage(AutoIngestSettingsPanel.class, "AutoIngestSettingsPanel.bnAdvancedSettings.text")); // NOI18N
bnAdvancedSettings.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
bnAdvancedSettingsActionPerformed(evt);
}
});
org.openide.awt.Mnemonics.setLocalizedText(bnFileExport, org.openide.util.NbBundle.getMessage(AutoIngestSettingsPanel.class, "AutoIngestSettingsPanel.bnFileExport.text")); // NOI18N
bnFileExport.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
bnFileExportActionPerformed(evt);
}
});
org.openide.awt.Mnemonics.setLocalizedText(bnLogging, org.openide.util.NbBundle.getMessage(AutoIngestSettingsPanel.class, "AutoIngestSettingsPanel.bnLogging.text")); // NOI18N
bnLogging.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
bnLoggingActionPerformed(evt);
}
});
javax.swing.GroupLayout jPanelIngestSettingsLayout = new javax.swing.GroupLayout(jPanelIngestSettings);
jPanelIngestSettings.setLayout(jPanelIngestSettingsLayout);
jPanelIngestSettingsLayout.setHorizontalGroup(
jPanelIngestSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanelIngestSettingsLayout.createSequentialGroup()
.addContainerGap()
.addComponent(bnEditIngestSettings, javax.swing.GroupLayout.PREFERRED_SIZE, 155, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(bnAdvancedSettings, javax.swing.GroupLayout.PREFERRED_SIZE, 155, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(bnFileExport, javax.swing.GroupLayout.PREFERRED_SIZE, 155, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(bnLogging, javax.swing.GroupLayout.PREFERRED_SIZE, 155, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
jPanelIngestSettingsLayout.setVerticalGroup(
jPanelIngestSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanelIngestSettingsLayout.createSequentialGroup()
.addContainerGap()
.addGroup(jPanelIngestSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(bnEditIngestSettings)
.addComponent(bnFileExport)
.addComponent(bnAdvancedSettings)
.addComponent(bnLogging))
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
cbJoinAutoIngestCluster.setFont(cbJoinAutoIngestCluster.getFont().deriveFont(cbJoinAutoIngestCluster.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
org.openide.awt.Mnemonics.setLocalizedText(cbJoinAutoIngestCluster, org.openide.util.NbBundle.getMessage(AutoIngestSettingsPanel.class, "AutoIngestSettingsPanel.cbJoinAutoIngestCluster.text")); // NOI18N
cbJoinAutoIngestCluster.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
cbJoinAutoIngestClusterActionPerformed(evt);
}
});
tbOops.setEditable(false);
tbOops.setFont(tbOops.getFont().deriveFont(tbOops.getFont().getStyle() | java.awt.Font.BOLD, 12));
tbOops.setForeground(new java.awt.Color(255, 0, 0));
tbOops.setText(org.openide.util.NbBundle.getMessage(AutoIngestSettingsPanel.class, "AutoIngestSettingsPanel.tbOops.text")); // NOI18N
tbOops.setBorder(null);
tbOops.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
tbOopsActionPerformed(evt);
}
});
javax.swing.GroupLayout nodePanelLayout = new javax.swing.GroupLayout(nodePanel);
nodePanel.setLayout(nodePanelLayout);
nodePanelLayout.setHorizontalGroup(
nodePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(nodePanelLayout.createSequentialGroup()
.addContainerGap()
.addGroup(nodePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(nodePanelLayout.createSequentialGroup()
.addComponent(cbJoinAutoIngestCluster, javax.swing.GroupLayout.PREFERRED_SIZE, 171, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(18, 18, 18)
.addComponent(tbOops, javax.swing.GroupLayout.PREFERRED_SIZE, 465, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGroup(nodePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
.addComponent(jPanelNodeType, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(jPanelSharedConfig, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(jPanelIngestSettings, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
nodePanelLayout.setVerticalGroup(
nodePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(nodePanelLayout.createSequentialGroup()
.addContainerGap()
.addGroup(nodePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(cbJoinAutoIngestCluster)
.addComponent(tbOops, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGap(3, 3, 3)
.addComponent(jPanelNodeType, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jPanelIngestSettings, javax.swing.GroupLayout.PREFERRED_SIZE, 62, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jPanelSharedConfig, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, 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(nodePanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(nodePanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
);
}// </editor-fold>//GEN-END:initComponents
private void browseSharedSettingsButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_browseSharedSettingsButtonActionPerformed
String oldText = sharedSettingsTextField.getText().trim();
// set the current directory of the FileChooser if the oldText is valid
File currentDir = new File(oldText);
if (currentDir.exists()) {
fc.setCurrentDirectory(currentDir);
}
fc.setDialogTitle("Select shared configuration folder:");
fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
int retval = fc.showOpenDialog(this);
if (retval == JFileChooser.APPROVE_OPTION) {
String path = fc.getSelectedFile().getPath();
sharedSettingsTextField.setText(path);
validateSettings();
controller.changed();
}
}//GEN-LAST:event_browseSharedSettingsButtonActionPerformed
boolean permissionsAppropriate(String path) {
return FileUtil.hasReadWriteAccess(Paths.get(path));
}
private void downloadButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_downloadButtonActionPerformed
// First save the shared config folder and solr settings to the properties
String globalSettingsPath = getNormalizedFolderPath(sharedSettingsTextField.getText().trim());
AutoIngestUserPreferences.setSharedConfigFolder(globalSettingsPath);
enableUI(false);
jLabelCurrentTask.setEnabled(true);
jLabelTaskDescription.setEnabled(true);
pbTaskInProgress.setEnabled(true);
pbTaskInProgress.setIndeterminate(true);
UpdateConfigSwingWorker worker = new UpdateConfigSwingWorker(ConfigTaskType.DOWNLOAD);
try {
worker.execute();
} catch (Exception ex) {
jLabelTaskDescription.setText(ex.getLocalizedMessage());
}
}//GEN-LAST:event_downloadButtonActionPerformed
private void uploadButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_uploadButtonActionPerformed
store();
enableUI(false);
jLabelCurrentTask.setEnabled(true);
jLabelTaskDescription.setEnabled(true);
pbTaskInProgress.setEnabled(true);
pbTaskInProgress.setIndeterminate(true);
UpdateConfigSwingWorker worker = new UpdateConfigSwingWorker(ConfigTaskType.UPLOAD);
try {
worker.execute();
} catch (Exception ex) {
jLabelTaskDescription.setText(ex.getLocalizedMessage());
}
}//GEN-LAST:event_uploadButtonActionPerformed
private void sharedConfigCheckboxItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_sharedConfigCheckboxItemStateChanged
// Enable the global settings text box and browse button iff the checkbox is checked and enabled
setSharedConfigEnable();
}//GEN-LAST:event_sharedConfigCheckboxItemStateChanged
private void setSharedConfigEnable() {
setEnabledStateForSharedConfiguration();
if (sharedConfigCheckbox.isEnabled() && sharedConfigCheckbox.isSelected() && jRadioButtonAutomated.isSelected()) {
sharedSettingsTextField.setEnabled(true);
browseSharedSettingsButton.setEnabled(true);
masterNodeCheckBox.setEnabled(true);
downloadButton.setEnabled(true);
validateSettings();
controller.changed();
} else {
sharedSettingsTextField.setEnabled(false);
browseSharedSettingsButton.setEnabled(false);
masterNodeCheckBox.setEnabled(false);
downloadButton.setEnabled(false);
sharedSettingsErrorTextField.setText("");
validateSettings();
controller.changed();
}
}
private void masterNodeCheckBoxItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_masterNodeCheckBoxItemStateChanged
// Enable the global settings text box and browse button iff the checkbox is checked and enabled
setEnabledStateForSharedConfiguration();
if (masterNodeCheckBox.isEnabled() && masterNodeCheckBox.isSelected()) {
uploadButton.setEnabled(true);
validateSettings(); // This will disable the upload/save button if the settings aren't currently valid
controller.changed();
} else {
uploadButton.setEnabled(false);
}
if (sharedConfigCheckbox.isEnabled()) {
jRadioButtonAutomated.setEnabled(false);
jRadioButtonReview.setEnabled(false);
}
}//GEN-LAST:event_masterNodeCheckBoxItemStateChanged
private void cbJoinAutoIngestClusterActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cbJoinAutoIngestClusterActionPerformed
enableOptionsBasedOnMode(getModeFromRadioButtons());
controller.changed();
}//GEN-LAST:event_cbJoinAutoIngestClusterActionPerformed
private void tbOopsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_tbOopsActionPerformed
// TODO add your handling code here:
}//GEN-LAST:event_tbOopsActionPerformed
private void browseOutputFolderButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_browseOutputFolderButtonActionPerformed
String oldText = outputPathTextField.getText().trim();
// set the current directory of the FileChooser if the oldText is valid
File currentDir = new File(oldText);
if (currentDir.exists()) {
fc.setCurrentDirectory(currentDir);
}
fc.setDialogTitle("Select case output folder:");
fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
int retval = fc.showOpenDialog(this);
if (retval == JFileChooser.APPROVE_OPTION) {
String path = fc.getSelectedFile().getPath();
outputPathTextField.setText(path);
validateSettings();
controller.changed();
}
}//GEN-LAST:event_browseOutputFolderButtonActionPerformed
private void browseInputFolderButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_browseInputFolderButtonActionPerformed
String oldText = inputPathTextField.getText().trim();
// set the current directory of the FileChooser if the oldText is valid
File currentDir = new File(oldText);
if (currentDir.exists()) {
fc.setCurrentDirectory(currentDir);
}
fc.setDialogTitle("Select case input folder:");
fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
int retval = fc.showOpenDialog(this);
if (retval == JFileChooser.APPROVE_OPTION) {
String path = fc.getSelectedFile().getPath();
inputPathTextField.setText(path);
validateSettings();
controller.changed();
}
}//GEN-LAST:event_browseInputFolderButtonActionPerformed
private void jRadioButtonReviewActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jRadioButtonReviewActionPerformed
if (cbJoinAutoIngestCluster.isSelected()) {
enableOptionsBasedOnMode(OptionsUiMode.REVIEW);
setSharedConfigEnable();
validateSettings();
controller.changed();
}
}//GEN-LAST:event_jRadioButtonReviewActionPerformed
private void jRadioButtonAutomatedActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jRadioButtonAutomatedActionPerformed
if (cbJoinAutoIngestCluster.isSelected()) {
enableOptionsBasedOnMode(OptionsUiMode.AIM);
setSharedConfigEnable();
validateSettings();
controller.changed();
}
}//GEN-LAST:event_jRadioButtonAutomatedActionPerformed
private void bnLoggingActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnLoggingActionPerformed
JDialog jDialog = new JDialog();
NodeStatusLogPanel loggingPanel = new NodeStatusLogPanel(jDialog);
JScrollPane jScrollPane = new JScrollPane(loggingPanel);
jScrollPane.setVerticalScrollBarPolicy(javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
jScrollPane.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
jScrollPane.setMinimumSize(new Dimension(100, 100));
jDialog.add(jScrollPane);
jDialog.setTitle(NbBundle.getMessage(AutoIngestSettingsPanel.class, "AutoIngestSettingsPanel.NodeStatusLogging.text"));
jDialog.setIconImage(ImageUtilities.loadImage("org/sleuthkit/autopsy/experimental/images/frame32.gif"));
jDialog.setModalityType(java.awt.Dialog.ModalityType.APPLICATION_MODAL);
jDialog.pack();
jDialog.setLocationRelativeTo(this);
jDialog.setVisible(true);
}//GEN-LAST:event_bnLoggingActionPerformed
private void bnFileExportActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnFileExportActionPerformed
JDialog jDialog = new JDialog();
FileExporterSettingsPanel fileExporterSettingsPanel = new FileExporterSettingsPanel(jDialog);
jDialog.addWindowListener(new java.awt.event.WindowAdapter() {
@Override
public void windowClosing(java.awt.event.WindowEvent windowEvent) {
fileExporterSettingsPanel.store();
}
});
JScrollPane jScrollPane = new JScrollPane(fileExporterSettingsPanel);
jScrollPane.setVerticalScrollBarPolicy(javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
jScrollPane.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
jScrollPane.setMinimumSize(new Dimension(100, 100));
jDialog.add(jScrollPane);
jDialog.setTitle(NbBundle.getMessage(AutoIngestSettingsPanel.class, "AutoIngestSettingsPanel.FileExportRules.text"));
jDialog.setIconImage(ImageUtilities.loadImage("org/sleuthkit/autopsy/experimental/images/frame32.gif"));
jDialog.setModalityType(java.awt.Dialog.ModalityType.APPLICATION_MODAL);
jDialog.pack();
jDialog.setLocationRelativeTo(this);
jDialog.setVisible(true);
}//GEN-LAST:event_bnFileExportActionPerformed
private void bnAdvancedSettingsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnAdvancedSettingsActionPerformed
AdvancedAutoIngestSettingsPanel advancedAutoIngestSettingsPanel = new AdvancedAutoIngestSettingsPanel(getModeFromRadioButtons());
if (JOptionPane.showConfirmDialog(null, advancedAutoIngestSettingsPanel,
NbBundle.getMessage(AutoIngestSettingsPanel.class, "AutoIngestSettingsPanel.AdvancedAutoIngestSettingsPanel.Title"),
JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE) == JOptionPane.OK_OPTION) {
advancedAutoIngestSettingsPanel.store();
}
}//GEN-LAST:event_bnAdvancedSettingsActionPerformed
private void bnEditIngestSettingsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnEditIngestSettingsActionPerformed
displayIngestJobSettingsPanel();
}//GEN-LAST:event_bnEditIngestSettingsActionPerformed
private void enableUI(boolean state) {
enableOptionsBasedOnMode(OptionsUiMode.DOWNLOADING_CONFIGURATION);
downloadButton.setEnabled(state);
uploadButton.setEnabled(state);
browseSharedSettingsButton.setEnabled(state);
sharedConfigCheckbox.setEnabled(state);
masterNodeCheckBox.setEnabled(state);
sharedSettingsTextField.setEnabled(state);
}
private void resetUI() {
load(true);
controller.changed();
}
public enum ConfigTaskType {
DOWNLOAD, UPLOAD
}
/**
* Handles running the upload configuration task. There's some added
* complexity here in order to re-enable the update button after the update
* completes.
*
*/
public class UpdateConfigSwingWorker extends SwingWorker<Void, String> {
private String errorMessage = null;
private SharedConfiguration.SharedConfigResult uploadResult = SharedConfiguration.SharedConfigResult.SUCCESS;
private final SharedConfiguration sharedConfig = new SharedConfiguration(this);
private final ConfigTaskType task;
protected UpdateConfigSwingWorker(ConfigTaskType task) {
this.task = task;
}
@Override
protected Void doInBackground() throws InterruptedException {
try {
if (task == ConfigTaskType.UPLOAD) {
uploadResult = sharedConfig.uploadConfiguration();
} else {
uploadResult = sharedConfig.downloadConfiguration();
}
} catch (Exception ex) {
if (ex instanceof InterruptedException) {
throw (InterruptedException) ex;
}
errorMessage = ex.getLocalizedMessage();
}
return null;
}
public void publishStatus(String status) {
publish(status);
}
@Override
protected void process(List<String> messages) {
for (String status : messages) {
jLabelTaskDescription.setText(status);
}
}
@Override
protected void done() {
// It would be nicer to hide the progress bar, but that seems to shrink the whole panel
pbTaskInProgress.setIndeterminate(false);
if (uploadResult == SharedConfiguration.SharedConfigResult.LOCKED) {
jLabelTaskDescription.setText("Transfer of shared configuration incomplete");
JOptionPane.showMessageDialog(null, "Shared configuration folder is currently locked by another node - try again in a few minutes", "Error", JOptionPane.ERROR_MESSAGE);
} else if (errorMessage != null) {
//MessageNotifyUtil.Message.info(errorMessage);
jLabelTaskDescription.setText("Transfer of shared configuration incomplete");
JOptionPane.showMessageDialog(WindowManager.getDefault().getMainWindow(), errorMessage, "Error copying configuration", JOptionPane.ERROR_MESSAGE);
} else {
jLabelTaskDescription.setText("Shared configuration copied successfully");
}
// Check if anything requiring a reset has changed and update the UI
if (isResetNeeded()) {
JOptionPane.showMessageDialog(null,
NbBundle.getMessage(AutoIngestSettingsPanel.class, "AutoIngestSettingsPanel.MustRestart"),
NbBundle.getMessage(AutoIngestSettingsPanel.class, "AutoIngestSettingsPanel.restartRequiredLabel.text"),
JOptionPane.WARNING_MESSAGE);
}
// Re-enable everything here
resetUI();
setEnabledStateForSharedConfiguration();
pbTaskInProgress.setEnabled(false);
}
}
void setEnabledStateForSharedConfiguration() {
if (jRadioButtonAutomated.isSelected() && cbJoinAutoIngestCluster.isSelected()) {
if (sharedConfigCheckbox.isEnabled() && sharedConfigCheckbox.isSelected()) {
setEnabledState(masterNodeCheckBox.isSelected());
} else {
// If we are in AIM mode and shared config is not enabled, allow this
setEnabledState(true);
}
}
}
void setEnabledState(boolean enabled) {
bnAdvancedSettings.setEnabled(enabled);
bnEditIngestSettings.setEnabled(enabled);
bnFileExport.setEnabled(enabled);
bnLogging.setEnabled(enabled);
browseInputFolderButton.setEnabled(enabled);
browseOutputFolderButton.setEnabled(enabled);
browseSharedSettingsButton.setEnabled(sharedConfigCheckbox.isSelected() && jRadioButtonAutomated.isSelected());
configButtonErrorTextField.setEnabled(enabled);
inputPathTextField.setEnabled(enabled);
jLabelInvalidImageFolder.setEnabled(enabled);
jLabelInvalidResultsFolder.setEnabled(enabled);
jLabelSelectInputFolder.setEnabled(enabled);
jLabelSelectMode.setEnabled(enabled);
jLabelSelectOutputFolder.setEnabled(enabled);
jPanelIngestSettings.setEnabled(enabled);
jPanelNodeType.setEnabled(enabled);
jPanelSharedConfig.setEnabled(enabled);
jRadioButtonAutomated.setEnabled(enabled);
jRadioButtonReview.setEnabled(enabled);
outputPathTextField.setEnabled(enabled);
restartRequiredNodeLabel.setEnabled(enabled);
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton bnAdvancedSettings;
private javax.swing.JButton bnEditIngestSettings;
private javax.swing.JButton bnFileExport;
private javax.swing.JButton bnLogging;
private javax.swing.JButton browseInputFolderButton;
private javax.swing.JButton browseOutputFolderButton;
private javax.swing.JButton browseSharedSettingsButton;
private javax.swing.JCheckBox cbJoinAutoIngestCluster;
private javax.swing.JTextField configButtonErrorTextField;
private javax.swing.JButton downloadButton;
private javax.swing.JTextField inputPathTextField;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabelCurrentTask;
private javax.swing.JLabel jLabelInvalidImageFolder;
private javax.swing.JLabel jLabelInvalidResultsFolder;
private javax.swing.JLabel jLabelSelectInputFolder;
private javax.swing.JLabel jLabelSelectMode;
private javax.swing.JLabel jLabelSelectOutputFolder;
private javax.swing.JLabel jLabelTaskDescription;
private javax.swing.JPanel jPanelIngestSettings;
private javax.swing.JPanel jPanelNodeType;
private javax.swing.JPanel jPanelSharedConfig;
private javax.swing.JRadioButton jRadioButtonAutomated;
private javax.swing.JRadioButton jRadioButtonReview;
private javax.swing.JSeparator jSeparator1;
private javax.swing.JCheckBox masterNodeCheckBox;
private javax.swing.ButtonGroup modeRadioButtons;
private javax.swing.JPanel nodePanel;
private javax.swing.JTextField outputPathTextField;
private javax.swing.JProgressBar pbTaskInProgress;
private javax.swing.JLabel restartRequiredNodeLabel;
private javax.swing.JCheckBox sharedConfigCheckbox;
private javax.swing.JTextField sharedSettingsErrorTextField;
private javax.swing.JTextField sharedSettingsTextField;
private javax.swing.JTextField tbOops;
private javax.swing.JButton uploadButton;
// End of variables declaration//GEN-END:variables
}