From 0aab93ac3422ef5dc75dd3af2885e663f1ee7504 Mon Sep 17 00:00:00 2001 From: "U-BASIS\\dgrove" Date: Thu, 10 Aug 2017 11:29:00 -0400 Subject: [PATCH 001/104] New AID implemented. --- Experimental/manifest.mf | 1 + Experimental/nbproject/project.xml | 9 + .../autoingest/AutoIngestDashboard.form | 40 +- .../autoingest/AutoIngestDashboard.java | 402 +--- .../AutoIngestDashboardOpenAction.java | 115 ++ .../AutoIngestDashboardTopComponent.form | 28 + .../AutoIngestDashboardTopComponent.java | 143 ++ .../autoingest/AutoIngestLegacyDashboard.form | 475 +++++ .../autoingest/AutoIngestLegacyDashboard.java | 1731 +++++++++++++++++ .../experimental/autoingest/Bundle.properties | 105 +- .../configuration/StartupWindow.java | 12 +- 11 files changed, 2588 insertions(+), 473 deletions(-) mode change 100644 => 100755 Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.form mode change 100644 => 100755 Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java create mode 100755 Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardOpenAction.java create mode 100755 Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardTopComponent.form create mode 100755 Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardTopComponent.java create mode 100644 Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestLegacyDashboard.form create mode 100644 Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestLegacyDashboard.java diff --git a/Experimental/manifest.mf b/Experimental/manifest.mf index cafb630948..a53adc8642 100644 --- a/Experimental/manifest.mf +++ b/Experimental/manifest.mf @@ -3,4 +3,5 @@ AutoUpdate-Show-In-Client: true OpenIDE-Module: org.sleuthkit.autopsy.experimental OpenIDE-Module-Layer: org/sleuthkit/autopsy/experimental/autoingest/layer.xml OpenIDE-Module-Localizing-Bundle: org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties +OpenIDE-Module-Requires: org.openide.windows.WindowManager OpenIDE-Module-Specification-Version: 1.0 diff --git a/Experimental/nbproject/project.xml b/Experimental/nbproject/project.xml index 280fbc431b..fe85da26ba 100644 --- a/Experimental/nbproject/project.xml +++ b/Experimental/nbproject/project.xml @@ -24,6 +24,15 @@ 1.44.1 + + org.netbeans.modules.settings + + + + 1 + 1.49.1 + + org.openide.awt diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.form b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.form old mode 100644 new mode 100755 index b1d90f4479..26e14e2176 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.form +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.form @@ -235,9 +235,6 @@ - - - @@ -248,9 +245,6 @@ - - - @@ -291,9 +285,6 @@ - - - @@ -304,9 +295,6 @@ - - - @@ -331,9 +319,6 @@ - - - @@ -344,9 +329,6 @@ - - - @@ -357,22 +339,16 @@ - - - - + - + - - - @@ -383,9 +359,6 @@ - - - @@ -423,9 +396,6 @@ - - - @@ -457,9 +427,6 @@ - - - @@ -467,9 +434,6 @@ - - - diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java old mode 100644 new mode 100755 index 157d371eed..875cf9d46f --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java @@ -1,7 +1,7 @@ /* * Autopsy Forensic Browser * - * Copyright 2015 Basis Technology Corp. + * Copyright 2015-2017 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -20,9 +20,7 @@ package org.sleuthkit.autopsy.experimental.autoingest; import com.google.common.util.concurrent.ThreadFactoryBuilder; import java.awt.Cursor; -import java.awt.Desktop; import java.awt.EventQueue; -import java.io.IOException; import java.nio.file.Path; import java.nio.file.Paths; import java.time.Instant; @@ -38,7 +36,6 @@ import java.util.logging.Level; import javax.swing.DefaultListSelectionModel; import java.awt.Color; import java.beans.PropertyChangeEvent; -import java.io.File; import java.util.Collections; import java.util.logging.Logger; import javax.swing.JOptionPane; @@ -49,25 +46,12 @@ import javax.swing.UIManager; import javax.swing.event.ListSelectionEvent; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableColumn; -import org.netbeans.api.options.OptionsDisplayer; -import org.openide.DialogDisplayer; import org.openide.LifecycleManager; -import org.openide.NotifyDescriptor; -import org.openide.filesystems.FileObject; -import org.openide.filesystems.FileUtil; import org.openide.util.NbBundle; -import org.openide.util.actions.CallableSystemAction; import org.openide.windows.WindowManager; -import org.sleuthkit.autopsy.casemodule.CaseNewAction; -import org.sleuthkit.autopsy.casemodule.CaseOpenAction; import org.sleuthkit.autopsy.core.ServicesMonitor; -import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil; import org.sleuthkit.autopsy.coreutils.NetworkUtils; -import org.sleuthkit.autopsy.coreutils.PlatformUtil; import org.sleuthkit.autopsy.ingest.IngestManager; -import org.sleuthkit.autopsy.ingest.IngestProgressSnapshotDialog; -import org.sleuthkit.autopsy.experimental.autoingest.AutoIngestManager.CaseDeletionResult; -import org.sleuthkit.autopsy.experimental.autoingest.AutoIngestManager.JobsSnapshot; /** * A panel for monitoring automated ingest by a cluster, and for controlling @@ -105,7 +89,6 @@ public final class AutoIngestDashboard extends JPanel implements Observer { private final DefaultTableModel pendingTableModel; private final DefaultTableModel runningTableModel; private final DefaultTableModel completedTableModel; - private AutoIngestManager manager; private ExecutorService updateExecutor; private boolean isPaused; private boolean autoIngestStarted; @@ -184,8 +167,6 @@ public final class AutoIngestDashboard extends JPanel implements Observer { private AutoIngestDashboard() { //Disable the main window so they can only use the dashboard (if we used setVisible the taskBar icon would go away) WindowManager.getDefault().getMainWindow().setEnabled(false); - - manager = AutoIngestManager.getInstance(); pendingTableModel = new DefaultTableModel(JobsTableModelColumns.headers, 0) { private static final long serialVersionUID = 1L; @@ -590,28 +571,7 @@ public final class AutoIngestDashboard extends JPanel implements Observer { */ private void startUp() { - /* - * Starts up the auto ingest manager (AIM). - */ - try { - manager.startUp(); - autoIngestStarted = true; - } catch (AutoIngestManager.AutoIngestManagerStartupException ex) { - SYS_LOGGER.log(Level.SEVERE, "Dashboard error starting up auto ingest", ex); - tbStatusMessage.setText(NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.AutoIngestStartupError")); - manager = null; - - JOptionPane.showMessageDialog(this, - NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.AutoIngestStartupFailed.Message"), - NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.AutoIngestStartupFailed.Title"), - JOptionPane.ERROR_MESSAGE); - bnOptions.setEnabled(true); - - /* - * If the AIM cannot be started, there is nothing more to do. - */ - return; - } + autoIngestStarted = true; /* * Subscribe to services monitor events. @@ -620,17 +580,11 @@ public final class AutoIngestDashboard extends JPanel implements Observer { setServicesStatusMessage(); }); - /* - * Register with the AIM as an observer. - */ - manager.addObserver(this); - /* * Populate the pending, running, and completed auto ingest job tables. */ updateExecutor = Executors.newSingleThreadExecutor(new ThreadFactoryBuilder().setNameFormat(UPDATE_TASKS_THREAD_NAME).build()); updateExecutor.submit(new UpdateAllJobsTablesTask()); - manager.scanInputDirsNow(); //bnPause.setEnabled(true); bnPause.setText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnPause.text")); @@ -659,7 +613,7 @@ public final class AutoIngestDashboard extends JPanel implements Observer { NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.Cancel")}; int reply = JOptionPane.OK_OPTION; - if (null != manager && IngestManager.getInstance().isIngestRunning()) { + if (IngestManager.getInstance().isIngestRunning()) { reply = JOptionPane.showOptionDialog(this, NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.ExitConsequences"), NbBundle.getMessage(AutoIngestDashboard.class, "ConfirmationDialog.ConfirmExitHeader"), @@ -684,13 +638,6 @@ public final class AutoIngestDashboard extends JPanel implements Observer { updateExecutor.shutdownNow(); } - /* - * Stop observing the auto ingest manager (AIM). - */ - if (null != manager) { - manager.deleteObserver(this); - } - /* * Shut down the AIM and close. */ @@ -698,9 +645,6 @@ public final class AutoIngestDashboard extends JPanel implements Observer { @Override protected Void doInBackground() throws Exception { - if (null != manager) { - manager.shutDown(); - } return null; } @@ -807,7 +751,6 @@ public final class AutoIngestDashboard extends JPanel implements Observer { * Ask the auto ingest manager to pause when it completes the * currently running job, if any. */ - manager.pause(); bnRefresh.setEnabled(false); } } @@ -835,11 +778,6 @@ public final class AutoIngestDashboard extends JPanel implements Observer { */ pendingTable.setBackground(pendingTableBackground); pendingTable.setForeground(pendingTablelForeground); - - /** - * Ask the auto ingest manager to resume processing. - */ - manager.resume(); } /** @@ -855,7 +793,6 @@ public final class AutoIngestDashboard extends JPanel implements Observer { @Override public void run() { List pendingJobs = new ArrayList<>(); - manager.getJobs(pendingJobs, null, null); EventQueue.invokeLater(new RefreshComponentsTask(pendingJobs, null, null)); } } @@ -873,7 +810,6 @@ public final class AutoIngestDashboard extends JPanel implements Observer { @Override public void run() { List runningJobs = new ArrayList<>(); - manager.getJobs(null, runningJobs, null); EventQueue.invokeLater(new RefreshComponentsTask(null, runningJobs, null)); } } @@ -897,7 +833,6 @@ public final class AutoIngestDashboard extends JPanel implements Observer { List pendingJobs = new ArrayList<>(); List runningJobs = new ArrayList<>(); List completedJobs = new ArrayList<>(); - manager.getJobs(pendingJobs, runningJobs, completedJobs); // Sort the completed jobs list by completed date Collections.sort(completedJobs, new AutoIngestJob.ReverseDateCompletedComparator()); EventQueue.invokeLater(new RefreshComponentsTask(pendingJobs, runningJobs, completedJobs)); @@ -1084,10 +1019,6 @@ public final class AutoIngestDashboard extends JPanel implements Observer { * Get the current lists of jobs and update the UI. */ private void refreshTables(){ - JobsSnapshot jobsSnapshot = manager.getCurrentJobsSnapshot(); - refreshTable(jobsSnapshot.getCompletedJobs(), completedTableModel, null); - refreshTable(jobsSnapshot.getPendingJobs(), pendingTableModel, null); - refreshTable(jobsSnapshot.getRunningJobs(), runningTableModel, null); } /** @@ -1182,19 +1113,9 @@ public final class AutoIngestDashboard extends JPanel implements Observer { org.openide.awt.Mnemonics.setLocalizedText(bnCancelJob, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnCancelJob.text")); // NOI18N bnCancelJob.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnCancelJob.toolTipText")); // NOI18N - bnCancelJob.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - bnCancelJobActionPerformed(evt); - } - }); org.openide.awt.Mnemonics.setLocalizedText(bnDeleteCase, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnDeleteCase.text")); // NOI18N bnDeleteCase.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnDeleteCase.toolTipText")); // NOI18N - bnDeleteCase.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - bnDeleteCaseActionPerformed(evt); - } - }); lbPending.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N org.openide.awt.Mnemonics.setLocalizedText(lbPending, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.lbPending.text")); // NOI18N @@ -1207,19 +1128,9 @@ public final class AutoIngestDashboard extends JPanel implements Observer { org.openide.awt.Mnemonics.setLocalizedText(bnRefresh, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnRefresh.text")); // NOI18N bnRefresh.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnRefresh.toolTipText")); // NOI18N - bnRefresh.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - bnRefreshActionPerformed(evt); - } - }); org.openide.awt.Mnemonics.setLocalizedText(bnCancelModule, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnCancelModule.text")); // NOI18N bnCancelModule.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnCancelModule.toolTipText")); // NOI18N - bnCancelModule.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - bnCancelModuleActionPerformed(evt); - } - }); org.openide.awt.Mnemonics.setLocalizedText(bnExit, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnExit.text")); // NOI18N bnExit.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnExit.toolTipText")); // NOI18N @@ -1232,43 +1143,18 @@ public final class AutoIngestDashboard extends JPanel implements Observer { org.openide.awt.Mnemonics.setLocalizedText(bnOptions, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnOptions.text")); // NOI18N bnOptions.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnOptions.toolTipText")); // NOI18N bnOptions.setEnabled(false); - bnOptions.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - bnOptionsActionPerformed(evt); - } - }); org.openide.awt.Mnemonics.setLocalizedText(bnShowProgress, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnShowProgress.text")); // NOI18N bnShowProgress.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnShowProgress.toolTipText")); // NOI18N - bnShowProgress.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - bnShowProgressActionPerformed(evt); - } - }); org.openide.awt.Mnemonics.setLocalizedText(bnPause, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnPause.text")); // NOI18N bnPause.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnPause.toolTipText")); // NOI18N - bnPause.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - bnPauseActionPerformed(evt); - } - }); - org.openide.awt.Mnemonics.setLocalizedText(bnPrioritizeCase, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnPrioritizeCase.text")); // NOI18N - bnPrioritizeCase.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnPrioritizeCase.toolTipText")); // NOI18N - bnPrioritizeCase.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - bnPrioritizeCaseActionPerformed(evt); - } - }); + org.openide.awt.Mnemonics.setLocalizedText(bnPrioritizeCase, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnPrioritizeCase.text_1")); // NOI18N + bnPrioritizeCase.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnPrioritizeCase.toolTipText_1")); // NOI18N org.openide.awt.Mnemonics.setLocalizedText(bnShowCaseLog, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnShowCaseLog.text")); // NOI18N bnShowCaseLog.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnShowCaseLog.toolTipText")); // NOI18N - bnShowCaseLog.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - bnShowCaseLogActionPerformed(evt); - } - }); tbStatusMessage.setEditable(false); tbStatusMessage.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N @@ -1281,11 +1167,6 @@ public final class AutoIngestDashboard extends JPanel implements Observer { org.openide.awt.Mnemonics.setLocalizedText(bnPrioritizeJob, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnPrioritizeJob.text")); // NOI18N bnPrioritizeJob.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnPrioritizeJob.toolTipText")); // NOI18N bnPrioritizeJob.setActionCommand(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnPrioritizeJob.actionCommand")); // NOI18N - bnPrioritizeJob.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - bnPrioritizeJobActionPerformed(evt); - } - }); lbServicesStatus.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N org.openide.awt.Mnemonics.setLocalizedText(lbServicesStatus, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.lbServicesStatus.text")); // NOI18N @@ -1296,18 +1177,8 @@ public final class AutoIngestDashboard extends JPanel implements Observer { tbServicesStatusMessage.setBorder(null); org.openide.awt.Mnemonics.setLocalizedText(bnOpenLogDir, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnOpenLogDir.text")); // NOI18N - bnOpenLogDir.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - bnOpenLogDirActionPerformed(evt); - } - }); org.openide.awt.Mnemonics.setLocalizedText(bnReprocessJob, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnReprocessJob.text")); // NOI18N - bnReprocessJob.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - bnReprocessJobActionPerformed(evt); - } - }); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); @@ -1427,179 +1298,6 @@ public final class AutoIngestDashboard extends JPanel implements Observer { }// //GEN-END:initComponents - /** - * Handles a click on the refresh button. Requests an immediate scan of the - * input folders for new jobs and queues a refresh of all three of the jobs - * tables. - * - * @param evt - The button click event. - */ - private void bnRefreshActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnRefreshActionPerformed - this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); - manager.scanInputDirsAndWait(); - refreshTables(); - this.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); - }//GEN-LAST:event_bnRefreshActionPerformed - - /** - * Handles a click on the delete case button. If an entry is selected that - * can be deleted, pops up a confirmation dialog. Upon confirmation, asks - * AutoIngestManager to delete the entry and asks for an updated view. - * - * @param evt The button click event. - */ - private void bnDeleteCaseActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnDeleteCaseActionPerformed - if (completedTableModel.getRowCount() < 0 || completedTable.getSelectedRow() < 0) { - return; - } - - String caseName = (String) completedTable.getValueAt(completedTable.getSelectedRow(), JobsTableModelColumns.CASE.ordinal()); - Object[] options = { - org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "ConfirmationDialog.Delete"), - org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "ConfirmationDialog.DoNotDelete") - }; - Object[] msgContent = {org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "ConfirmationDialog.DeleteAreYouSure") + "\"" + caseName + "\"?"}; - int reply = JOptionPane.showOptionDialog(this, - msgContent, - org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "ConfirmationDialog.ConfirmDeletionHeader"), - JOptionPane.DEFAULT_OPTION, - JOptionPane.WARNING_MESSAGE, - null, - options, - options[JOptionPane.NO_OPTION]); - if (reply == JOptionPane.YES_OPTION) { - bnDeleteCase.setEnabled(false); - bnShowCaseLog.setEnabled(false); - if (completedTableModel.getRowCount() > 0 && completedTable.getSelectedRow() >= 0) { - Path caseDirectoryPath = (Path) completedTableModel.getValueAt(completedTable.getSelectedRow(), JobsTableModelColumns.CASE_DIRECTORY_PATH.ordinal()); - completedTable.clearSelection(); - this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); - CaseDeletionResult result = manager.deleteCase(caseName, caseDirectoryPath); - refreshTables(); - this.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); - if (CaseDeletionResult.FAILED == result) { - JOptionPane.showMessageDialog(this, - String.format("Could not delete case %s. It may be in in use.", caseName), - org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.DeletionFailed"), - JOptionPane.INFORMATION_MESSAGE); - } else if (CaseDeletionResult.PARTIALLY_DELETED == result) { - JOptionPane.showMessageDialog(this, - String.format("Could not delete case %s. See system log for details.", caseName), - org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.DeletionFailed"), - JOptionPane.INFORMATION_MESSAGE); - } - } - } - }//GEN-LAST:event_bnDeleteCaseActionPerformed - - /** - * Handles a click on the cancel auto ingest job button. Cancels the - * selected job. - * - * @param evt The button click event. - */ - private void bnCancelJobActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnCancelJobActionPerformed - Object[] options = { - org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "ConfirmationDialog.CancelJob"), - org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "ConfirmationDialog.DoNotCancelJob")}; - int reply = JOptionPane.showOptionDialog(this, - NbBundle.getMessage(AutoIngestDashboard.class, "ConfirmationDialog.CancelJobAreYouSure"), - NbBundle.getMessage(AutoIngestDashboard.class, "ConfirmationDialog.ConfirmCancellationHeader"), - JOptionPane.DEFAULT_OPTION, - JOptionPane.WARNING_MESSAGE, - null, - options, - options[1]); - if (reply == 0) { - /* - * Call setCursor on this to ensure it appears (if there is time to - * see it). - */ - this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); - manager.cancelCurrentJob(); - refreshTables(); - this.setCursor(Cursor.getDefaultCursor()); - } - }//GEN-LAST:event_bnCancelJobActionPerformed - - /** - * Handles a click on the show auto ingest job progress button. Displays an - * ingest job progress panel. - * - * @param evt The button click event. - */ - private void bnShowProgressActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnShowProgressActionPerformed - IngestProgressSnapshotDialog dialog = new IngestProgressSnapshotDialog(this.getTopLevelAncestor(), true); - }//GEN-LAST:event_bnShowProgressActionPerformed - - /** - * Handles a click on the pause/resume auto ingest job button. Sends a - * pause/resume request to the auto ingest manager. - * - * @param evt The button click event. - */ - private void bnPauseActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnPauseActionPerformed - - if (!autoIngestStarted) { - //put up a wait cursor during the start up operation - this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); - - startUp(); - - this.setCursor(null); - //done for startup - return; - } - if (!isPaused) { - tbStatusMessage.setText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnPause.pausing")); - pause(true); - } else { - resume(); - } - isPaused = !isPaused; - }//GEN-LAST:event_bnPauseActionPerformed - - /** - * Handles a click on the options button. Displays the options window. - * - * @param evt The button click event. - */ - private void bnOptionsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnOptionsActionPerformed - setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); - OptionsDisplayer.getDefault().open(); - setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); - }//GEN-LAST:event_bnOptionsActionPerformed - - /** - * Handles a click on the cancel ingest module button. Cancels the currently - * running data source level ingest module for the selected job. - * - * @param evt The button click event. - */ - private void bnCancelModuleActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnCancelModuleActionPerformed - Object[] options = { - org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "ConfirmationDialog.CancelModule"), - org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "ConfirmationDialog.DoNotCancelModule")}; - int reply = JOptionPane.showOptionDialog(this, - NbBundle.getMessage(AutoIngestDashboard.class, "ConfirmationDialog.CancelModuleAreYouSure"), - NbBundle.getMessage(AutoIngestDashboard.class, "ConfirmationDialog.ConfirmCancellationHeader"), - JOptionPane.DEFAULT_OPTION, - JOptionPane.WARNING_MESSAGE, - null, - options, - options[1]); - if (reply == 0) { - /* - * Call setCursor on this to ensure it appears (if there is time to - * see it). - */ - this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); - manager.cancelCurrentDataSourceLevelIngestModule(); - refreshTables(); - this.setCursor(Cursor.getDefaultCursor()); - } - }//GEN-LAST:event_bnCancelModuleActionPerformed - /** * Handles a click on the exit button. Shuts down auto ingest. * @@ -1609,96 +1307,6 @@ public final class AutoIngestDashboard extends JPanel implements Observer { shutdown(); }//GEN-LAST:event_bnExitActionPerformed - /** - * Handle a click on the prioritize case button. Requests prioritization of - * all of the auto ingest jobs for a case. - * - * @param evt The button click event. - */ - private void bnPrioritizeCaseActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnPrioritizeCaseActionPerformed - if (pendingTableModel.getRowCount() > 0 && pendingTable.getSelectedRow() >= 0) { - this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); - String caseName = (pendingTableModel.getValueAt(pendingTable.getSelectedRow(), JobsTableModelColumns.CASE.ordinal())).toString(); - manager.prioritizeCase(caseName); - refreshTables(); - pendingTable.clearSelection(); - enablePendingTableButtons(false); - AutoIngestDashboard.this.setCursor(Cursor.getDefaultCursor()); - } - }//GEN-LAST:event_bnPrioritizeCaseActionPerformed - - /** - * Handles a click on the show log button. Displays the auto ingest job log - * for a case in NotePad. - * - * @param evt The button click event. - */ - private void bnShowCaseLogActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnShowCaseLogActionPerformed - try { - int selectedRow = completedTable.getSelectedRow(); - if (selectedRow != -1) { - Path caseDirectoryPath = (Path) completedTableModel.getValueAt(selectedRow, JobsTableModelColumns.CASE_DIRECTORY_PATH.ordinal()); - if (null != caseDirectoryPath) { - Path pathToLog = AutoIngestJobLogger.getLogPath(caseDirectoryPath); - if (pathToLog.toFile().exists()) { - Desktop.getDesktop().edit(pathToLog.toFile()); - } else { - JOptionPane.showMessageDialog(this, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.ShowLogFailed.Message"), - org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.ShowLogFailed.Title"), JOptionPane.ERROR_MESSAGE); - } - } else { - MessageNotifyUtil.Message.warn("The case directory for this job has been deleted."); - } - } - } catch (IOException ex) { - SYS_LOGGER.log(Level.SEVERE, "Dashboard error attempting to display case auto ingest log", ex); - Object[] options = {org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "DisplayLogDialog.okay")}; - JOptionPane.showOptionDialog(this, - org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "DisplayLogDialog.cannotFindLog"), - org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "DisplayLogDialog.unableToShowLogFile"), - JOptionPane.DEFAULT_OPTION, - JOptionPane.PLAIN_MESSAGE, - null, - options, - options[0]); - } - }//GEN-LAST:event_bnShowCaseLogActionPerformed - - private void bnPrioritizeJobActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnPrioritizeJobActionPerformed - if (pendingTableModel.getRowCount() > 0 && pendingTable.getSelectedRow() >= 0) { - this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); - Path manifestFilePath = (Path) (pendingTableModel.getValueAt(pendingTable.getSelectedRow(), JobsTableModelColumns.MANIFEST_FILE_PATH.ordinal())); - manager.prioritizeJob(manifestFilePath); - refreshTables(); - pendingTable.clearSelection(); - enablePendingTableButtons(false); - AutoIngestDashboard.this.setCursor(Cursor.getDefaultCursor()); - } - }//GEN-LAST:event_bnPrioritizeJobActionPerformed - - private void bnOpenLogDirActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnOpenLogDirActionPerformed - Path logDirPath = Paths.get(PlatformUtil.getUserDirectory().getAbsolutePath(), "var", "log"); - File logDir = logDirPath.toFile(); - try { - Desktop.getDesktop().open(logDir); - } catch (IOException ex) { - DialogDisplayer.getDefault().notify(new NotifyDescriptor.Message( - String.format("Unable to open log directory %s:\n%s", logDirPath, ex.getLocalizedMessage()), - NotifyDescriptor.ERROR_MESSAGE)); - } - }//GEN-LAST:event_bnOpenLogDirActionPerformed - - private void bnReprocessJobActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnReprocessJobActionPerformed - if (completedTableModel.getRowCount() < 0 || completedTable.getSelectedRow() < 0) { - return; - } - this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); - Path manifestPath = (Path) completedTableModel.getValueAt(completedTable.getSelectedRow(), JobsTableModelColumns.MANIFEST_FILE_PATH.ordinal()); - manager.reprocessJob(manifestPath); - refreshTables(); - AutoIngestDashboard.this.setCursor(Cursor.getDefaultCursor()); - }//GEN-LAST:event_bnReprocessJobActionPerformed - // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton bnCancelJob; private javax.swing.JButton bnCancelModule; diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardOpenAction.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardOpenAction.java new file mode 100755 index 0000000000..7142f3be01 --- /dev/null +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardOpenAction.java @@ -0,0 +1,115 @@ +/* +* Autopsy Forensic Browser +* +* Copyright 2017 Basis Technology Corp. +* Contact: carrier sleuthkit org +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +package org.sleuthkit.autopsy.experimental.autoingest; + +import java.awt.Component; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import javax.swing.ImageIcon; +import javax.swing.JButton; +import org.openide.awt.ActionID; +import org.openide.awt.ActionReference; +import org.openide.awt.ActionReferences; +import org.openide.awt.ActionRegistration; +import org.openide.util.HelpCtx; +import org.openide.util.NbBundle.Messages; +import org.openide.util.actions.CallableSystemAction; +import org.openide.util.actions.Presenter; +import org.sleuthkit.autopsy.casemodule.Case; +import org.sleuthkit.autopsy.core.RuntimeProperties; +import org.sleuthkit.autopsy.core.UserPreferences; +import static org.sleuthkit.autopsy.core.UserPreferences.SelectedMode.REVIEW; +import org.sleuthkit.autopsy.coreutils.Logger; + +@ActionID(category = "Tools", id = "org.sleuthkit.autopsy.experimental.autoingest.AutoIngestDashboardOpenAction") +@ActionReferences(value = { + @ActionReference(path = "Menu/Tools", position = 104), + @ActionReference(path = "Toolbars/Case", position = 104) +}) +@ActionRegistration(displayName = "#CTL_AutoIngestDashboardOpenAction", lazy = false) +@Messages({"CTL_AutoIngestDashboardOpenAction=Auto Ingest Dashboard"}) +public final class AutoIngestDashboardOpenAction extends CallableSystemAction implements Presenter.Toolbar { + + private static final Logger LOGGER = Logger.getLogger(AutoIngestDashboardOpenAction.class.getName()); + private static final String VIEW_IMAGES_VIDEOS = Bundle.CTL_AutoIngestDashboardOpenAction(); + + private final JButton toolbarButton = new JButton(); + private final PropertyChangeListener pcl; + + public AutoIngestDashboardOpenAction() { + super(); + toolbarButton.addActionListener(actionEvent -> performAction()); + pcl = (PropertyChangeEvent evt) -> { + if (evt.getPropertyName().equals(Case.Events.CURRENT_CASE.toString())) { + setEnabled(RuntimeProperties.runningWithGUI() && evt.getNewValue() != null); + } + }; + Case.addPropertyChangeListener(pcl); + this.setEnabled(false); + } + + @Override + public boolean isEnabled() { + UserPreferences.SelectedMode mode = UserPreferences.getMode(); + return (mode == REVIEW); + } + + /** Returns the toolbar component of this action + * + * @return component the toolbar button */ + @Override + public Component getToolbarPresenter() { + ImageIcon icon = new ImageIcon(getClass().getResource("btn_icon_image_gallery_26.png")); //NON-NLS + toolbarButton.setIcon(icon); + toolbarButton.setText(this.getName()); + return toolbarButton; + } + + /** + * Set this action to be enabled/disabled + * + * @param value whether to enable this action or not + */ + @Override + public void setEnabled(boolean value) { + super.setEnabled(value); + toolbarButton.setEnabled(value); + } + + @Override + @SuppressWarnings("fallthrough") + public void performAction() { + AutoIngestDashboardTopComponent.openTopComponent(); + } + + @Override + public String getName() { + return VIEW_IMAGES_VIDEOS; + } + + @Override + public HelpCtx getHelpCtx() { + return HelpCtx.DEFAULT_HELP; + } + + @Override + public boolean asynchronous() { + return false; // run on edt + } +} diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardTopComponent.form b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardTopComponent.form new file mode 100755 index 0000000000..5f3eab1a5f --- /dev/null +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardTopComponent.form @@ -0,0 +1,28 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardTopComponent.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardTopComponent.java new file mode 100755 index 0000000000..61b6cac0ac --- /dev/null +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardTopComponent.java @@ -0,0 +1,143 @@ +/* + * Autopsy Forensic Browser + * + * Copyright 2017 Basis Technology Corp. + * Contact: carrier sleuthkit org + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.sleuthkit.autopsy.experimental.autoingest; + +import java.util.logging.Level; +import org.netbeans.api.settings.ConvertAsProperties; +import org.openide.awt.ActionID; +import org.openide.awt.ActionReference; +import org.openide.windows.TopComponent; +import org.openide.util.NbBundle.Messages; +import org.openide.windows.Mode; +import org.openide.windows.WindowManager; +import org.sleuthkit.autopsy.coreutils.Logger; + +/** + * Top component which displays the Auto Ingest Dashboard interface. + */ +@ConvertAsProperties( + dtd = "-//org.sleuthkit.autopsy.experimental.autoingest//AutoIngestDashboard//EN", + autostore = false +) +@TopComponent.Description( + preferredID = "AutoIngestDashboardTopComponent", + //iconBase="SET/PATH/TO/ICON/HERE", + persistenceType = TopComponent.PERSISTENCE_NEVER +) +@TopComponent.Registration(mode = "dashboard", openAtStartup = false) +@ActionID(category = "Window", id = "org.sleuthkit.autopsy.experimental.autoingest.AutoIngestDashboardTopComponent") +@ActionReference(path = "Menu/Window" /* + * , position = 333 + */) +@TopComponent.OpenActionRegistration( + displayName = "#CTL_AutoIngestDashboardAction", + preferredID = "AutoIngestDashboardTopComponent" +) +@Messages({ + "CTL_AutoIngestDashboardAction=Auto Ingest Dashboard", + "CTL_AutoIngestDashboardTopComponent=Auto Ingest Dashboard", + "HINT_AutoIngestDashboardTopComponent=This is an Auto Ingest Dashboard window" +}) +public final class AutoIngestDashboardTopComponent extends TopComponent { + public final static String PREFERRED_ID = "AutoIngestDashboardTopComponent"; // NON-NLS + private static final Logger LOGGER = Logger.getLogger(AutoIngestDashboardTopComponent.class.getName()); + private static boolean topComponentInitialized = false; + + public static void openTopComponent() { + final AutoIngestDashboardTopComponent tc = (AutoIngestDashboardTopComponent) WindowManager.getDefault().findTopComponent(PREFERRED_ID); + if (tc != null) { + topComponentInitialized = true; + WindowManager.getDefault().isTopComponentFloating(tc); + Mode mode = WindowManager.getDefault().findMode("dashboard"); // NON-NLS + if (mode != null) { + mode.dockInto(tc); + } + + AutoIngestDashboard dashboard = AutoIngestDashboard.getInstance(); + tc.add(dashboard); + dashboard.setSize(dashboard.getPreferredSize()); + + tc.open(); + tc.requestActive(); + } + } + + public static void closeTopComponent() { + if (topComponentInitialized) { + final TopComponent etc = WindowManager.getDefault().findTopComponent(PREFERRED_ID); + if (etc != null) { + try { + etc.close(); + } catch (Exception e) { + LOGGER.log(Level.SEVERE, "failed to close " + PREFERRED_ID, e); // NON-NLS + } + } + } + } + + public AutoIngestDashboardTopComponent() { + initComponents(); + setName(Bundle.CTL_AutoIngestDashboardTopComponent()); + setToolTipText(Bundle.HINT_AutoIngestDashboardTopComponent()); + } + + /** + * This method is called from within the constructor to initialize the form. + * WARNING: Do NOT modify this code. The content of this method is always + * regenerated by the Form Editor. + */ + // //GEN-BEGIN:initComponents + private void initComponents() { + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); + this.setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGap(0, 400, Short.MAX_VALUE) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGap(0, 300, Short.MAX_VALUE) + ); + }// //GEN-END:initComponents + + // Variables declaration - do not modify//GEN-BEGIN:variables + // End of variables declaration//GEN-END:variables + @Override + public void componentOpened() { + // TODO add custom code on component opening + } + + @Override + public void componentClosed() { + // TODO add custom code on component closing + } + + void writeProperties(java.util.Properties p) { + // better to version settings since initial version as advocated at + // http://wiki.apidesign.org/wiki/PropertyFiles + p.setProperty("version", "1.0"); + // TODO store your settings + } + + void readProperties(java.util.Properties p) { + String version = p.getProperty("version"); + // TODO read your settings according to their version + } +} diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestLegacyDashboard.form b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestLegacyDashboard.form new file mode 100644 index 0000000000..9d28df9288 --- /dev/null +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestLegacyDashboard.form @@ -0,0 +1,475 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestLegacyDashboard.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestLegacyDashboard.java new file mode 100644 index 0000000000..b043d9c1fb --- /dev/null +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestLegacyDashboard.java @@ -0,0 +1,1731 @@ +/* + * Autopsy Forensic Browser + * + * Copyright 2015-2017 Basis Technology Corp. + * Contact: carrier sleuthkit org + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.sleuthkit.autopsy.experimental.autoingest; + +import com.google.common.util.concurrent.ThreadFactoryBuilder; +import java.awt.Cursor; +import java.awt.Desktop; +import java.awt.EventQueue; +import java.io.IOException; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.time.Instant; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.Date; +import java.util.List; +import java.util.Observable; +import java.util.Observer; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.logging.Level; +import javax.swing.DefaultListSelectionModel; +import java.awt.Color; +import java.beans.PropertyChangeEvent; +import java.io.File; +import java.util.Collections; +import java.util.logging.Logger; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JTable; +import javax.swing.SwingWorker; +import javax.swing.UIManager; +import javax.swing.event.ListSelectionEvent; +import javax.swing.table.DefaultTableModel; +import javax.swing.table.TableColumn; +import org.netbeans.api.options.OptionsDisplayer; +import org.openide.DialogDisplayer; +import org.openide.LifecycleManager; +import org.openide.NotifyDescriptor; +import org.openide.filesystems.FileObject; +import org.openide.filesystems.FileUtil; +import org.openide.util.NbBundle; +import org.openide.util.actions.CallableSystemAction; +import org.openide.windows.WindowManager; +import org.sleuthkit.autopsy.casemodule.CaseNewAction; +import org.sleuthkit.autopsy.casemodule.CaseOpenAction; +import org.sleuthkit.autopsy.core.ServicesMonitor; +import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil; +import org.sleuthkit.autopsy.coreutils.NetworkUtils; +import org.sleuthkit.autopsy.coreutils.PlatformUtil; +import org.sleuthkit.autopsy.ingest.IngestManager; +import org.sleuthkit.autopsy.ingest.IngestProgressSnapshotDialog; +import org.sleuthkit.autopsy.experimental.autoingest.AutoIngestManager.CaseDeletionResult; +import org.sleuthkit.autopsy.experimental.autoingest.AutoIngestManager.JobsSnapshot; + +/** + * A panel for monitoring automated ingest by a cluster, and for controlling + * automated ingest for a single node within the cluster. There can be at most + * one such panel per node. + */ +public final class AutoIngestLegacyDashboard extends JPanel implements Observer { + + private static final long serialVersionUID = 1L; + private static final int GENERIC_COL_MIN_WIDTH = 30; + private static final int GENERIC_COL_MAX_WIDTH = 2000; + private static final int PENDING_TABLE_COL_PREFERRED_WIDTH = 280; + private static final int RUNNING_TABLE_COL_PREFERRED_WIDTH = 175; + private static final int ACTIVITY_TIME_COL_MIN_WIDTH = 250; + private static final int ACTIVITY_TIME_COL_MAX_WIDTH = 450; + private static final int TIME_COL_MIN_WIDTH = 30; + private static final int TIME_COL_MAX_WIDTH = 250; + private static final int TIME_COL_PREFERRED_WIDTH = 140; + private static final int NAME_COL_MIN_WIDTH = 100; + private static final int NAME_COL_MAX_WIDTH = 250; + private static final int NAME_COL_PREFERRED_WIDTH = 140; + private static final int ACTIVITY_COL_MIN_WIDTH = 70; + private static final int ACTIVITY_COL_MAX_WIDTH = 2000; + private static final int ACTIVITY_COL_PREFERRED_WIDTH = 300; + private static final int STATUS_COL_MIN_WIDTH = 55; + private static final int STATUS_COL_MAX_WIDTH = 250; + private static final int STATUS_COL_PREFERRED_WIDTH = 55; + private static final int COMPLETED_TIME_COL_MIN_WIDTH = 30; + private static final int COMPLETED_TIME_COL_MAX_WIDTH = 2000; + private static final int COMPLETED_TIME_COL_PREFERRED_WIDTH = 280; + private static final String UPDATE_TASKS_THREAD_NAME = "AID-update-tasks-%d"; + private static final String LOCAL_HOST_NAME = NetworkUtils.getLocalHostName(); + private static final Logger SYS_LOGGER = AutoIngestSystemLogger.getLogger(); + private static AutoIngestLegacyDashboard instance; + private final DefaultTableModel pendingTableModel; + private final DefaultTableModel runningTableModel; + private final DefaultTableModel completedTableModel; + private AutoIngestManager manager; + private ExecutorService updateExecutor; + private boolean isPaused; + private boolean autoIngestStarted; + private Color pendingTableBackground; + private Color pendingTablelForeground; + + /* + * The enum is used in conjunction with the DefaultTableModel class to + * provide table models for the JTables used to display a view of the + * pending jobs queue, running jobs list, and completed jobs list. The enum + * allows the columns of the table model to be described by either an enum + * ordinal or a column header string. + */ + private enum JobsTableModelColumns { + + CASE(NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.Case")), + DATA_SOURCE(NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.ImageFolder")), + HOST_NAME(NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.HostName")), + CREATED_TIME(NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.CreatedTime")), + STARTED_TIME(NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.StartedTime")), + COMPLETED_TIME(NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.CompletedTime")), + STAGE(NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.Stage")), + STAGE_TIME(NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.StageTime")), + STATUS(NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.Status")), + CASE_DIRECTORY_PATH(NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.CaseFolder")), + IS_LOCAL_JOB(NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.LocalJob")), + MANIFEST_FILE_PATH(NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.ManifestFilePath")); + + private final String header; + + private JobsTableModelColumns(String header) { + this.header = header; + } + + private String getColumnHeader() { + return header; + } + + private static final String[] headers = { + CASE.getColumnHeader(), + DATA_SOURCE.getColumnHeader(), + HOST_NAME.getColumnHeader(), + CREATED_TIME.getColumnHeader(), + STARTED_TIME.getColumnHeader(), + COMPLETED_TIME.getColumnHeader(), + STAGE.getColumnHeader(), + STATUS.getColumnHeader(), + STAGE_TIME.getColumnHeader(), + CASE_DIRECTORY_PATH.getColumnHeader(), + IS_LOCAL_JOB.getColumnHeader(), + MANIFEST_FILE_PATH.getColumnHeader()}; + } + + /** + * Gets the singleton automated ingest control and monitoring panel for this + * cluster node. + * + * @return The panel. + */ + public static AutoIngestLegacyDashboard getInstance() { + if (null == instance) { + /* + * Two stage construction is used here to avoid publishing a + * reference to the panel to the Observable auto ingest manager + * before object construction is complete. + */ + instance = new AutoIngestLegacyDashboard(); + } + return instance; + } + + /** + * Constructs a panel for monitoring automated ingest by a cluster, and for + * controlling automated ingest for a single node within the cluster. + */ + private AutoIngestLegacyDashboard() { + //Disable the main window so they can only use the dashboard (if we used setVisible the taskBar icon would go away) + WindowManager.getDefault().getMainWindow().setEnabled(false); + + manager = AutoIngestManager.getInstance(); + + pendingTableModel = new DefaultTableModel(JobsTableModelColumns.headers, 0) { + private static final long serialVersionUID = 1L; + + @Override + public boolean isCellEditable(int row, int column) { + return false; + } + }; + + runningTableModel = new DefaultTableModel(JobsTableModelColumns.headers, 0) { + private static final long serialVersionUID = 1L; + + @Override + public boolean isCellEditable(int row, int column) { + return false; + } + }; + + completedTableModel = new DefaultTableModel(JobsTableModelColumns.headers, 0) { + private static final long serialVersionUID = 1L; + + @Override + public boolean isCellEditable(int row, int column) { + return false; + } + }; + + initComponents(); // Generated code. + setServicesStatusMessage(); + initPendingJobsTable(); + initRunningJobsTable(); + initCompletedJobsTable(); + initButtons(); + + /* + * Must set this flag, otherwise pop up menus don't close properly. + */ + UIManager.put("PopupMenu.consumeEventOnClose", false); + } + + /** + * Queries the services monitor and sets the text for the services status + * text box. + */ + private void setServicesStatusMessage() { + new SwingWorker() { + + String caseDatabaseServerStatus = ServicesMonitor.ServiceStatus.DOWN.toString(); + String keywordSearchServiceStatus = ServicesMonitor.ServiceStatus.DOWN.toString(); + String messagingStatus = ServicesMonitor.ServiceStatus.DOWN.toString(); + + @Override + protected Void doInBackground() throws Exception { + caseDatabaseServerStatus = getServiceStatus(ServicesMonitor.Service.REMOTE_CASE_DATABASE); + keywordSearchServiceStatus = getServiceStatus(ServicesMonitor.Service.REMOTE_KEYWORD_SEARCH); + messagingStatus = getServiceStatus(ServicesMonitor.Service.MESSAGING); + return null; + } + + /** + * Gets a status string for a given service. + * + * @param service The service to test. + * + * @return The status string. + */ + private String getServiceStatus(ServicesMonitor.Service service) { + String serviceStatus = NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.tbServicesStatusMessage.Message.Unknown"); + try { + ServicesMonitor servicesMonitor = ServicesMonitor.getInstance(); + serviceStatus = servicesMonitor.getServiceStatus(service.toString()); + if (serviceStatus.compareTo(ServicesMonitor.ServiceStatus.UP.toString()) == 0) { + serviceStatus = NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.tbServicesStatusMessage.Message.Up"); + } else { + serviceStatus = NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.tbServicesStatusMessage.Message.Down"); + } + } catch (ServicesMonitor.ServicesMonitorException ex) { + SYS_LOGGER.log(Level.SEVERE, String.format("Dashboard error getting service status for %s", service), ex); + } + return serviceStatus; + } + + @Override + protected void done() { + tbServicesStatusMessage.setText(NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.tbServicesStatusMessage.Message", caseDatabaseServerStatus, keywordSearchServiceStatus, keywordSearchServiceStatus, messagingStatus)); + String upStatus = NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.tbServicesStatusMessage.Message.Up"); + if (caseDatabaseServerStatus.compareTo(upStatus) != 0 + || keywordSearchServiceStatus.compareTo(upStatus) != 0 + || messagingStatus.compareTo(upStatus) != 0) { + tbServicesStatusMessage.setForeground(Color.RED); + } else { + tbServicesStatusMessage.setForeground(Color.BLACK); + } + } + + }.execute(); + } + + /** + * Sets up the JTable that presents a view of the system-wide pending jobs + * queue. + */ + private void initPendingJobsTable() { + /* + * Remove some of the jobs table model columns from the JTable. This + * does not remove the columns from the model, just from this table. + */ + pendingTable.removeColumn(pendingTable.getColumn(JobsTableModelColumns.HOST_NAME.getColumnHeader())); + pendingTable.removeColumn(pendingTable.getColumn(JobsTableModelColumns.STARTED_TIME.getColumnHeader())); + pendingTable.removeColumn(pendingTable.getColumn(JobsTableModelColumns.COMPLETED_TIME.getColumnHeader())); + pendingTable.removeColumn(pendingTable.getColumn(JobsTableModelColumns.STAGE.getColumnHeader())); + pendingTable.removeColumn(pendingTable.getColumn(JobsTableModelColumns.STAGE_TIME.getColumnHeader())); + pendingTable.removeColumn(pendingTable.getColumn(JobsTableModelColumns.CASE_DIRECTORY_PATH.getColumnHeader())); + pendingTable.removeColumn(pendingTable.getColumn(JobsTableModelColumns.IS_LOCAL_JOB.getColumnHeader())); + pendingTable.removeColumn(pendingTable.getColumn(JobsTableModelColumns.STATUS.getColumnHeader())); + pendingTable.removeColumn(pendingTable.getColumn(JobsTableModelColumns.MANIFEST_FILE_PATH.getColumnHeader())); + + /* + * Set up a column to display the cases associated with the jobs. + */ + TableColumn column; + column = pendingTable.getColumn(JobsTableModelColumns.CASE.getColumnHeader()); + column.setMinWidth(GENERIC_COL_MIN_WIDTH); + column.setMaxWidth(GENERIC_COL_MAX_WIDTH); + column.setPreferredWidth(PENDING_TABLE_COL_PREFERRED_WIDTH); + column.setWidth(PENDING_TABLE_COL_PREFERRED_WIDTH); + + /* + * Set up a column to display the image folders associated with the + * jobs. + */ + column = pendingTable.getColumn(JobsTableModelColumns.DATA_SOURCE.getColumnHeader()); + column.setMaxWidth(GENERIC_COL_MAX_WIDTH); + column.setPreferredWidth(PENDING_TABLE_COL_PREFERRED_WIDTH); + column.setWidth(PENDING_TABLE_COL_PREFERRED_WIDTH); + + /* + * Set up a column to display the create times of the jobs. + */ + column = pendingTable.getColumn(JobsTableModelColumns.CREATED_TIME.getColumnHeader()); + column.setCellRenderer(new LongDateCellRenderer()); + column.setMinWidth(TIME_COL_MIN_WIDTH); + column.setMaxWidth(TIME_COL_MAX_WIDTH); + column.setPreferredWidth(TIME_COL_PREFERRED_WIDTH); + column.setWidth(TIME_COL_PREFERRED_WIDTH); + + /** + * Prevent sorting when a column header is clicked. + */ + pendingTable.setAutoCreateRowSorter(false); + + /* + * Create a row selection listener to enable/disable the prioritize + * folder and prioritize case buttons. + */ + pendingTable.getSelectionModel().addListSelectionListener((ListSelectionEvent e) -> { + if (e.getValueIsAdjusting()) { + return; + } + int row = pendingTable.getSelectedRow(); + enablePendingTableButtons((row >= 0) && (row < pendingTable.getRowCount())); + }); + + /* + * Save the background color of the table so it can be restored on + * resume, after being grayed out on pause. Note the assumption that all + * of the tables use the same background color. + */ + pendingTableBackground = pendingTable.getBackground(); + pendingTablelForeground = pendingTable.getForeground(); + } + + /** + * Sets up the JTable that presents a view of the system-wide running jobs + * list. + */ + private void initRunningJobsTable() { + /* + * Remove some of the jobs table model columns from the JTable. This + * does not remove the columns from the model, just from this table. + */ + runningTable.removeColumn(runningTable.getColumn(JobsTableModelColumns.CREATED_TIME.getColumnHeader())); + runningTable.removeColumn(runningTable.getColumn(JobsTableModelColumns.STARTED_TIME.getColumnHeader())); + runningTable.removeColumn(runningTable.getColumn(JobsTableModelColumns.COMPLETED_TIME.getColumnHeader())); + runningTable.removeColumn(runningTable.getColumn(JobsTableModelColumns.STATUS.getColumnHeader())); + runningTable.removeColumn(runningTable.getColumn(JobsTableModelColumns.CASE_DIRECTORY_PATH.getColumnHeader())); + runningTable.removeColumn(runningTable.getColumn(JobsTableModelColumns.IS_LOCAL_JOB.getColumnHeader())); + runningTable.removeColumn(runningTable.getColumn(JobsTableModelColumns.MANIFEST_FILE_PATH.getColumnHeader())); + + /* + * Set up a column to display the cases associated with the jobs. + */ + TableColumn column; + column = runningTable.getColumn(JobsTableModelColumns.CASE.getColumnHeader()); + column.setMinWidth(GENERIC_COL_MIN_WIDTH); + column.setMaxWidth(GENERIC_COL_MAX_WIDTH); + column.setPreferredWidth(RUNNING_TABLE_COL_PREFERRED_WIDTH); + column.setWidth(RUNNING_TABLE_COL_PREFERRED_WIDTH); + + /* + * Set up a column to display the image folders associated with the + * jobs. + */ + column = runningTable.getColumn(JobsTableModelColumns.DATA_SOURCE.getColumnHeader()); + column.setMinWidth(GENERIC_COL_MIN_WIDTH); + column.setMaxWidth(GENERIC_COL_MAX_WIDTH); + column.setPreferredWidth(RUNNING_TABLE_COL_PREFERRED_WIDTH); + column.setWidth(RUNNING_TABLE_COL_PREFERRED_WIDTH); + + /* + * Set up a column to display the host names of the cluster nodes + * processing the jobs. + */ + column = runningTable.getColumn(JobsTableModelColumns.HOST_NAME.getColumnHeader()); + column.setMinWidth(NAME_COL_MIN_WIDTH); + column.setMaxWidth(NAME_COL_MAX_WIDTH); + column.setPreferredWidth(NAME_COL_PREFERRED_WIDTH); + column.setWidth(NAME_COL_PREFERRED_WIDTH); + + /* + * Set up a column to display the ingest activities associated with the + * jobs. + */ + column = runningTable.getColumn(JobsTableModelColumns.STAGE.getColumnHeader()); + column.setMinWidth(ACTIVITY_COL_MIN_WIDTH); + column.setMaxWidth(ACTIVITY_COL_MAX_WIDTH); + column.setPreferredWidth(ACTIVITY_COL_PREFERRED_WIDTH); + column.setWidth(ACTIVITY_COL_PREFERRED_WIDTH); + + /* + * Set up a column to display the ingest activity times associated with + * the jobs. + */ + column = runningTable.getColumn(JobsTableModelColumns.STAGE_TIME.getColumnHeader()); + column.setCellRenderer(new DurationCellRenderer()); + column.setMinWidth(GENERIC_COL_MIN_WIDTH); + column.setMaxWidth(ACTIVITY_TIME_COL_MAX_WIDTH); + column.setPreferredWidth(ACTIVITY_TIME_COL_MIN_WIDTH); + column.setWidth(ACTIVITY_TIME_COL_MIN_WIDTH); + + /* + * Prevent sorting when a column header is clicked. + */ + runningTable.setAutoCreateRowSorter(false); + + /* + * Create a row selection listener to enable/disable the cancel current + * job, cancel current module, and show progress buttons. + */ + runningTable.getSelectionModel().addListSelectionListener((ListSelectionEvent e) -> { + if (e.getValueIsAdjusting()) { + return; + } + updateRunningTableButtonsBasedOnSelectedRow(); + }); + } + + private void updateRunningTableButtonsBasedOnSelectedRow() { + int row = runningTable.getSelectedRow(); + if (row >= 0 && row < runningTable.getRowCount()) { + if ((boolean) runningTableModel.getValueAt(row, JobsTableModelColumns.IS_LOCAL_JOB.ordinal())) { + enableRunningTableButtons(true); + return; + } + } + enableRunningTableButtons(false); + } + + /** + * Sets up the JTable that presents a view of the system-wide competed jobs + * list. + */ + private void initCompletedJobsTable() { + /* + * Remove some of the jobs table model columns from the JTable. This + * does not remove the columns from the model, just from this table. + */ + completedTable.removeColumn(completedTable.getColumn(JobsTableModelColumns.STARTED_TIME.getColumnHeader())); + completedTable.removeColumn(completedTable.getColumn(JobsTableModelColumns.STAGE.getColumnHeader())); + completedTable.removeColumn(completedTable.getColumn(JobsTableModelColumns.STAGE_TIME.getColumnHeader())); + completedTable.removeColumn(completedTable.getColumn(JobsTableModelColumns.IS_LOCAL_JOB.getColumnHeader())); + completedTable.removeColumn(completedTable.getColumn(JobsTableModelColumns.HOST_NAME.getColumnHeader())); + completedTable.removeColumn(completedTable.getColumn(JobsTableModelColumns.CASE_DIRECTORY_PATH.getColumnHeader())); + completedTable.removeColumn(completedTable.getColumn(JobsTableModelColumns.MANIFEST_FILE_PATH.getColumnHeader())); + + /* + * Set up a column to display the cases associated with the jobs. + */ + TableColumn column; + column = completedTable.getColumn(JobsTableModelColumns.CASE.getColumnHeader()); + column.setMinWidth(COMPLETED_TIME_COL_MIN_WIDTH); + column.setMaxWidth(COMPLETED_TIME_COL_MAX_WIDTH); + column.setPreferredWidth(COMPLETED_TIME_COL_PREFERRED_WIDTH); + column.setWidth(COMPLETED_TIME_COL_PREFERRED_WIDTH); + + /* + * Set up a column to display the image folders associated with the + * jobs. + */ + column = completedTable.getColumn(JobsTableModelColumns.DATA_SOURCE.getColumnHeader()); + column.setMinWidth(COMPLETED_TIME_COL_MIN_WIDTH); + column.setMaxWidth(COMPLETED_TIME_COL_MAX_WIDTH); + column.setPreferredWidth(COMPLETED_TIME_COL_PREFERRED_WIDTH); + column.setWidth(COMPLETED_TIME_COL_PREFERRED_WIDTH); + + /* + * Set up a column to display the create times of the jobs. + */ + column = completedTable.getColumn(JobsTableModelColumns.CREATED_TIME.getColumnHeader()); + column.setCellRenderer(new LongDateCellRenderer()); + column.setMinWidth(TIME_COL_MIN_WIDTH); + column.setMaxWidth(TIME_COL_MAX_WIDTH); + column.setPreferredWidth(TIME_COL_PREFERRED_WIDTH); + column.setWidth(TIME_COL_PREFERRED_WIDTH); + + /* + * Set up a column to display the completed times of the jobs. + */ + column = completedTable.getColumn(JobsTableModelColumns.COMPLETED_TIME.getColumnHeader()); + column.setCellRenderer(new LongDateCellRenderer()); + column.setMinWidth(TIME_COL_MIN_WIDTH); + column.setMaxWidth(TIME_COL_MAX_WIDTH); + column.setPreferredWidth(TIME_COL_PREFERRED_WIDTH); + column.setWidth(TIME_COL_PREFERRED_WIDTH); + + /* + * Set up a column to display the statuses of the jobs, with a cell + * renderer that will choose an icon to represent the job status. + */ + column = completedTable.getColumn(JobsTableModelColumns.STATUS.getColumnHeader()); + column.setCellRenderer(new CaseStatusIconCellRenderer()); + column.setMinWidth(STATUS_COL_MIN_WIDTH); + column.setMaxWidth(STATUS_COL_MAX_WIDTH); + column.setPreferredWidth(STATUS_COL_PREFERRED_WIDTH); + column.setWidth(STATUS_COL_PREFERRED_WIDTH); + + /* + * Prevent sorting when a column header is clicked. + */ + completedTable.setAutoCreateRowSorter(false); + + /* + * Create a row selection listener to enable/disable the delete case and + * show log buttons. + */ + completedTable.getSelectionModel() + .addListSelectionListener((ListSelectionEvent e) -> { + if (e.getValueIsAdjusting()) { + return; + } + int row = completedTable.getSelectedRow(); + boolean enabled = row >= 0 && row < completedTable.getRowCount(); + bnDeleteCase.setEnabled(enabled); + bnShowCaseLog.setEnabled(enabled); + bnReprocessJob.setEnabled(enabled); + }); + } + + /** + * Sets the initial state of the buttons on the panel. + */ + private void initButtons() { + bnOptions.setEnabled(true); + bnDeleteCase.setEnabled(false); + enablePendingTableButtons(false); + bnShowCaseLog.setEnabled(false); + bnReprocessJob.setEnabled(false); + bnPause.setText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.bnStart.text")); + bnPause.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.bnStart.toolTipText")); + bnPause.setEnabled(true); //initial label for bnPause is 'Start' and it's enabled for user to start the process + bnRefresh.setEnabled(false); //at initial stage, nothing to refresh + enableRunningTableButtons(false); + tbStatusMessage.setText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.bnStart.startMessage")); + } + + /** + * Enables or disables buttons related to the running jobs table. + * + * @param enable Enable/disable the buttons. + */ + private void enableRunningTableButtons(Boolean enable) { + bnCancelJob.setEnabled(enable); + bnCancelModule.setEnabled(enable); + bnShowProgress.setEnabled(enable); + } + + /** + * Enables or disables buttons related to pending jobs table. + * + * @param enable Enable/disable the buttons. + */ + private void enablePendingTableButtons(Boolean enable) { + bnPrioritizeCase.setEnabled(enable); + bnPrioritizeJob.setEnabled(enable); + } + + /** + * Starts up the auto ingest manager and adds this panel as an observer, + * subscribes to services monitor events and starts a task to populate the + * auto ingest job tables. The Refresh and Pause buttons are enabled. + */ + private void startUp() { + + /* + * Starts up the auto ingest manager (AIM). + */ + try { + manager.startUp(); + autoIngestStarted = true; + } catch (AutoIngestManager.AutoIngestManagerStartupException ex) { + SYS_LOGGER.log(Level.SEVERE, "Dashboard error starting up auto ingest", ex); + tbStatusMessage.setText(NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.AutoIngestStartupError")); + manager = null; + + JOptionPane.showMessageDialog(this, + NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.AutoIngestStartupFailed.Message"), + NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.AutoIngestStartupFailed.Title"), + JOptionPane.ERROR_MESSAGE); + bnOptions.setEnabled(true); + + /* + * If the AIM cannot be started, there is nothing more to do. + */ + return; + } + + /* + * Subscribe to services monitor events. + */ + ServicesMonitor.getInstance().addSubscriber((PropertyChangeEvent evt) -> { + setServicesStatusMessage(); + }); + + /* + * Register with the AIM as an observer. + */ + manager.addObserver(this); + + /* + * Populate the pending, running, and completed auto ingest job tables. + */ + updateExecutor = Executors.newSingleThreadExecutor(new ThreadFactoryBuilder().setNameFormat(UPDATE_TASKS_THREAD_NAME).build()); + updateExecutor.submit(new UpdateAllJobsTablesTask()); + manager.scanInputDirsNow(); + + //bnPause.setEnabled(true); + bnPause.setText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.bnPause.text")); + bnPause.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.bnPause.toolTipText")); + bnRefresh.setEnabled(true); + bnOptions.setEnabled(false); + + tbStatusMessage.setText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.bnPause.running")); + } + + /** + * Shuts down auto ingest by shutting down the auto ingest manager and doing + * an application exit. + */ + public void shutdown() { + /* + * Confirm that the user wants to proceed, letting him or her no that if + * there is a currently running job it will be cancelled. TODO (RC): If + * a wait cursor is provided, this could perhaps be made conditional on + * a running job check again. Or the simple check in isLocalJobRunning + * could be used. Was this previously used and I removed it thinking it + * was grabbing the monitor? + */ + Object[] options = { + NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.OK"), + NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.Cancel")}; + int reply = JOptionPane.OK_OPTION; + + if (null != manager && IngestManager.getInstance().isIngestRunning()) { + reply = JOptionPane.showOptionDialog(this, + NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.ExitConsequences"), + NbBundle.getMessage(AutoIngestLegacyDashboard.class, "ConfirmationDialog.ConfirmExitHeader"), + JOptionPane.DEFAULT_OPTION, + JOptionPane.WARNING_MESSAGE, + null, + options, + options[JOptionPane.NO_OPTION]); + } + if (reply == JOptionPane.OK_OPTION) { + /* + * Provide user feedback. Call setCursor on this to ensure it + * appears (if there is time to see it). + */ + this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + tbStatusMessage.setText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.ExitingStatus")); + + /* + * Shut down the table refresh task executor. + */ + if (null != updateExecutor) { + updateExecutor.shutdownNow(); + } + + /* + * Stop observing the auto ingest manager (AIM). + */ + if (null != manager) { + manager.deleteObserver(this); + } + + /* + * Shut down the AIM and close. + */ + new SwingWorker() { + + @Override + protected Void doInBackground() throws Exception { + if (null != manager) { + manager.shutDown(); + } + return null; + } + + @Override + protected void done() { + AutoIngestLegacyDashboard.this.setCursor(Cursor.getDefaultCursor()); + LifecycleManager.getDefault().exit(); + } + }.execute(); + } + } + + /** + * @inheritDoc + */ + @NbBundle.Messages({ + "AutoIngestLegacyDashboard.bnPause.paused=Paused", + "AutoIngestLegacyDashboard.PauseDueToDatabaseServiceDown=Paused, unable to communicate with case database service.", + "AutoIngestLegacyDashboard.PauseDueToKeywordSearchServiceDown=Paused, unable to communicate with keyword search service.", + "AutoIngestLegacyDashboard.PauseDueToCoordinationServiceDown=Paused, unable to communicate with coordination service.", + "AutoIngestLegacyDashboard.PauseDueToWriteStateFilesFailure=Paused, unable to write to shared images or cases location.", + "AutoIngestLegacyDashboard.PauseDueToSharedConfigError=Paused, unable to update shared configuration.", + "AutoIngestLegacyDashboard.PauseDueToIngestJobStartFailure=Paused, unable to start ingest job processing.", + "AutoIngestLegacyDashboard.PauseDueToFileExporterError=Paused, unable to load File Exporter settings.", + "AutoIngestLegacyDashboard.bnPause.running=Running", + "AutoIngestLegacyDashboard.bnStart.startMessage=Waiting to start", + "AutoIngestLegacyDashboard.bnStart.text=Start", + "AutoIngestLegacyDashboard.bnStart.toolTipText=Start processing auto ingest jobs" + }) + @Override + public void update(Observable o, Object arg) { + + if (arg instanceof AutoIngestManager.Event) { + switch ((AutoIngestManager.Event) arg) { + case INPUT_SCAN_COMPLETED: + case JOB_STARTED: + case JOB_COMPLETED: + case CASE_DELETED: + updateExecutor.submit(new UpdateAllJobsTablesTask()); + break; + case PAUSED_BY_REQUEST: + EventQueue.invokeLater(() -> { + tbStatusMessage.setText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.bnPause.paused")); + bnOptions.setEnabled(true); + bnRefresh.setEnabled(false); + isPaused = true; + }); + break; + case PAUSED_FOR_SYSTEM_ERROR: + EventQueue.invokeLater(() -> { + tbStatusMessage.setText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.PauseDueToSystemError")); + bnOptions.setEnabled(true); + bnRefresh.setEnabled(false); + pause(false); + isPaused = true; + setServicesStatusMessage(); + }); + break; + case RESUMED: + EventQueue.invokeLater(() -> { + tbStatusMessage.setText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.bnPause.running")); + }); + break; + case CASE_PRIORITIZED: + updateExecutor.submit(new UpdatePendingJobsTableTask()); + break; + case JOB_STATUS_UPDATED: + updateExecutor.submit(new UpdateRunningJobsTablesTask()); + break; + default: + break; + } + } + } + + /** + * Requests a pause of auto ingest processing by the auto ingest manager and + * handles updates to the components that implement the pause and resume + * feature. Note that this feature is needed to get around restrictions on + * changing ingest module selections and settings while an ingest job is + * running, and that the auto ingest manager will not actually pause until + * the current auto ingest job completes. + * + * @param buttonClicked Is this pause request in response to a user gesture + * or a nofification from the auto ingest manager + * (AIM)? + */ + private void pause(boolean buttonClicked) { + /** + * Gray out the cells in the pending table to give a visual indicator of + * the pausing/paused state. + */ + pendingTable.setBackground(Color.LIGHT_GRAY); + pendingTable.setForeground(Color.DARK_GRAY); + + /** + * Change the pause button text and tool tip to make it a resume button. + */ + bnPause.setText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.bnResume.text")); + bnPause.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.bnPause.toolTipTextResume")); + + if (buttonClicked) { + /** + * Ask the auto ingest manager to pause when it completes the + * currently running job, if any. + */ + manager.pause(); + bnRefresh.setEnabled(false); + } + } + + /** + * Requests a resume of auto ingest processing by the auto ingest manager + * and handles updates to the components that implement the pause and resume + * feature. Note that this feature is needed to get around restrictions on + * changing ingest module selections and settings while an ingest job is + * running, and that the auto ingest manager will not actually pause until + * the current auto ingest job completes. + */ + private void resume() { + /** + * Change the resume button text and tool tip to make it a pause button. + */ + bnOptions.setEnabled(false); + bnPause.setText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.bnPause.text")); + bnPause.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.bnPause.toolTipText")); + tbStatusMessage.setText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.bnPause.running")); + bnRefresh.setEnabled(true); + + /** + * Remove the graying out of the pending table. + */ + pendingTable.setBackground(pendingTableBackground); + pendingTable.setForeground(pendingTablelForeground); + + /** + * Ask the auto ingest manager to resume processing. + */ + manager.resume(); + } + + /** + * A runnable task that gets the pending auto ingest jobs list from the auto + * ingest manager and queues a components refresh task for execution in the + * EDT. + */ + private class UpdatePendingJobsTableTask implements Runnable { + + /** + * @inheritDoc + */ + @Override + public void run() { + List pendingJobs = new ArrayList<>(); + manager.getJobs(pendingJobs, null, null); + EventQueue.invokeLater(new RefreshComponentsTask(pendingJobs, null, null)); + } + } + + /** + * A runnable task that gets the running auto ingest jobs list from the auto + * ingest manager and queues a components refresh task for execution in the + * EDT. + */ + private class UpdateRunningJobsTablesTask implements Runnable { + + /** + * @inheritDoc + */ + @Override + public void run() { + List runningJobs = new ArrayList<>(); + manager.getJobs(null, runningJobs, null); + EventQueue.invokeLater(new RefreshComponentsTask(null, runningJobs, null)); + } + } + + /** + * A runnable task that gets the pending, running and completed auto ingest + * jobs lists from the auto ingest manager and queues a components refresh + * task for execution in the EDT. Note that this task is frequently used + * when only the pending and updated lists definitely need to be updated. + * This is because the cost of updating the running jobs list is both very + * small and it is beneficial to keep running job status up to date if there + * is a running job. + */ + private class UpdateAllJobsTablesTask implements Runnable { + + /** + * @inheritDoc + */ + @Override + public void run() { + List pendingJobs = new ArrayList<>(); + List runningJobs = new ArrayList<>(); + List completedJobs = new ArrayList<>(); + manager.getJobs(pendingJobs, runningJobs, completedJobs); + // Sort the completed jobs list by completed date + Collections.sort(completedJobs, new AutoIngestJob.ReverseDateCompletedComparator()); + EventQueue.invokeLater(new RefreshComponentsTask(pendingJobs, runningJobs, completedJobs)); + } + } + + /** + * A runnable task that refreshes the components on this panel to reflect + * the current state of one or more auto ingest job lists obtained from the + * auto ingest manager. + */ + private class RefreshComponentsTask implements Runnable { + + private final List pendingJobs; + private final List runningJobs; + private final List completedJobs; + + /** + * Constructs a runnable task that refreshes the components on this + * panel to reflect the current state of the auto ingest jobs. + * + * @param pendingJobs A list of pending jobs, may be null if the + * pending jobs are unchanged. + * @param runningJobs A list of running jobs, may be null if the + * running jobs are unchanged. + * @param completedJobs A list of completed jobs, may be null if the + * completed jobs are unchanged. + */ + RefreshComponentsTask(List pendingJobs, List runningJobs, List completedJobs) { + this.pendingJobs = pendingJobs; + this.runningJobs = runningJobs; + this.completedJobs = completedJobs; + } + + /** + * @inheritDoc + */ + @Override + public void run() { + /* + * NOTE: There is a problem with our approach of preserving table + * row selections - what if the number of rows has changed as result + * of calling refreshTable(). Then it is possible for what used to + * be (for example) row 1 to now be in some other row or be removed + * from the table. This code will re-set the selection back to what + * it used to be before calling refreshTable(), i.e. row 1 + */ + + if (null != pendingJobs) { + Path currentRow = getSelectedEntry(pendingTable, pendingTableModel); + refreshTable(pendingJobs, pendingTableModel, null); + setSelectedEntry(pendingTable, pendingTableModel, currentRow); + } + + if (null != runningJobs) { + if (!isLocalJobRunning()) { + enableRunningTableButtons(false); + } else { + updateRunningTableButtonsBasedOnSelectedRow(); + } + Path currentRow = getSelectedEntry(runningTable, runningTableModel); + refreshTable(runningJobs, runningTableModel, null); + setSelectedEntry(runningTable, runningTableModel, currentRow); + } + + if (null != completedJobs) { + Path currentRow = getSelectedEntry(completedTable, completedTableModel); + refreshTable(completedJobs, completedTableModel, null); + setSelectedEntry(completedTable, completedTableModel, currentRow); + } + } + + /** + * Checks whether there is a job that is running on local AIN. + * + * @return true is local job is found, false otherwise. + */ + private boolean isLocalJobRunning() { + for (AutoIngestJob job : runningJobs) { + if (isLocalJob(job)) { + return true; + } + } + return false; + } + + /** + * Checks whether or not an automated ingest job is local to this node. + * + * @param job The job. + * + * @return True or fale. + */ + private boolean isLocalJob(AutoIngestJob job) { + return job.getNodeName().equals(LOCAL_HOST_NAME); + } + + /** + * Get a path representing the current selection on the table passed in. + * If there is no selection, return null. + * + * @param table The table to get + * @param tableModel The tableModel of the table to get + * + * @return a path representing the current selection + */ + Path getSelectedEntry(JTable table, DefaultTableModel tableModel) { + try { + int currentlySelectedRow = table.getSelectedRow(); + if (currentlySelectedRow >= 0 && currentlySelectedRow < table.getRowCount()) { + return Paths.get(tableModel.getValueAt(currentlySelectedRow, JobsTableModelColumns.CASE.ordinal()).toString(), + tableModel.getValueAt(currentlySelectedRow, JobsTableModelColumns.DATA_SOURCE.ordinal()).toString()); + } + } catch (Exception ignored) { + return null; + } + return null; + } + + /** + * Set the selection on the table to the passed-in path's item, if that + * item exists in the table. If it does not, clears the table selection. + * + * @param table The table to set + * @param tableModel The tableModel of the table to set + * @param path The path of the item to set + */ + void setSelectedEntry(JTable table, DefaultTableModel tableModel, Path path) { + if (path != null) { + try { + for (int row = 0; row < table.getRowCount(); ++row) { + Path temp = Paths.get(tableModel.getValueAt(row, JobsTableModelColumns.CASE.ordinal()).toString(), + tableModel.getValueAt(row, JobsTableModelColumns.DATA_SOURCE.ordinal()).toString()); + if (temp.compareTo(path) == 0) { // found it + table.setRowSelectionInterval(row, row); + return; + } + } + } catch (Exception ignored) { + table.clearSelection(); + } + } + table.clearSelection(); + } + } + + /** + * Reloads the table model for an auto ingest jobs table, refreshing the + * JTable that uses the model. + * + * @param jobs The list of auto ingest jobs. + * @param tableModel The table model. + * @param comparator An optional comparator (may be null) for sorting the + * table model. + */ + private void refreshTable(List jobs, DefaultTableModel tableModel, Comparator comparator) { + try { + if (comparator != null) { + jobs.sort(comparator); + } + tableModel.setRowCount(0); + for (AutoIngestJob job : jobs) { + AutoIngestJob.StageDetails status = job.getStageDetails(); + tableModel.addRow(new Object[]{ + job.getManifest().getCaseName(), // CASE + job.getManifest().getDataSourcePath().getFileName(), // DATA_SOURCE + job.getNodeName(), // HOST_NAME + job.getManifest().getDateFileCreated(), // CREATED_TIME + job.getStageStartDate(), // STARTED_TIME + job.getCompletedDate(), // COMPLETED_TIME + status.getDescription(), // ACTIVITY + job.hasErrors(), // STATUS + ((Date.from(Instant.now()).getTime()) - (status.getStartDate().getTime())), // ACTIVITY_TIME + job.getCaseDirectoryPath(), // CASE_DIRECTORY_PATH + job.getNodeName().equals(LOCAL_HOST_NAME), // IS_LOCAL_JOB + job.getManifest().getFilePath()}); // MANIFEST_FILE_PATH + } + } catch (Exception ex) { + SYS_LOGGER.log(Level.SEVERE, "Dashboard error refreshing table", ex); + } + } + + /** + * Get the current lists of jobs and update the UI. + */ + private void refreshTables(){ + JobsSnapshot jobsSnapshot = manager.getCurrentJobsSnapshot(); + refreshTable(jobsSnapshot.getCompletedJobs(), completedTableModel, null); + refreshTable(jobsSnapshot.getPendingJobs(), pendingTableModel, null); + refreshTable(jobsSnapshot.getRunningJobs(), runningTableModel, null); + } + + /** + * This method is called from within the constructor to initialize the form. + * WARNING: Do NOT modify this code. The content of this method is always + * regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + pendingScrollPane = new javax.swing.JScrollPane(); + pendingTable = new javax.swing.JTable(); + runningScrollPane = new javax.swing.JScrollPane(); + runningTable = new javax.swing.JTable(); + completedScrollPane = new javax.swing.JScrollPane(); + completedTable = new javax.swing.JTable(); + bnCancelJob = new javax.swing.JButton(); + bnDeleteCase = new javax.swing.JButton(); + lbPending = new javax.swing.JLabel(); + lbRunning = new javax.swing.JLabel(); + lbCompleted = new javax.swing.JLabel(); + bnRefresh = new javax.swing.JButton(); + bnCancelModule = new javax.swing.JButton(); + bnExit = new javax.swing.JButton(); + bnOptions = new javax.swing.JButton(); + bnShowProgress = new javax.swing.JButton(); + bnPause = new javax.swing.JButton(); + bnPrioritizeCase = new javax.swing.JButton(); + bnShowCaseLog = new javax.swing.JButton(); + tbStatusMessage = new javax.swing.JTextField(); + lbStatus = new javax.swing.JLabel(); + bnPrioritizeJob = new javax.swing.JButton(); + lbServicesStatus = new javax.swing.JLabel(); + tbServicesStatusMessage = new javax.swing.JTextField(); + bnOpenLogDir = new javax.swing.JButton(); + bnReprocessJob = new javax.swing.JButton(); + + pendingTable.setModel(pendingTableModel); + pendingTable.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.pendingTable.toolTipText")); // NOI18N + pendingTable.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_ALL_COLUMNS); + pendingTable.setRowHeight(20); + pendingTable.setSelectionModel(new DefaultListSelectionModel() { + private static final long serialVersionUID = 1L; + @Override + public void setSelectionInterval(int index0, int index1) { + if (index0 == pendingTable.getSelectedRow()) { + pendingTable.clearSelection(); + } else { + super.setSelectionInterval(index0, index1); + } + } + }); + pendingTable.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION); + pendingScrollPane.setViewportView(pendingTable); + + runningTable.setModel(runningTableModel); + runningTable.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.runningTable.toolTipText")); // NOI18N + runningTable.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_ALL_COLUMNS); + runningTable.setRowHeight(20); + runningTable.setSelectionModel(new DefaultListSelectionModel() { + private static final long serialVersionUID = 1L; + @Override + public void setSelectionInterval(int index0, int index1) { + if (index0 == runningTable.getSelectedRow()) { + runningTable.clearSelection(); + } else { + super.setSelectionInterval(index0, index1); + } + } + }); + runningTable.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION); + runningScrollPane.setViewportView(runningTable); + + completedTable.setModel(completedTableModel); + completedTable.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.completedTable.toolTipText")); // NOI18N + completedTable.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_ALL_COLUMNS); + completedTable.setRowHeight(20); + completedTable.setSelectionModel(new DefaultListSelectionModel() { + private static final long serialVersionUID = 1L; + @Override + public void setSelectionInterval(int index0, int index1) { + if (index0 == completedTable.getSelectedRow()) { + completedTable.clearSelection(); + } else { + super.setSelectionInterval(index0, index1); + } + } + }); + completedTable.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION); + completedScrollPane.setViewportView(completedTable); + + org.openide.awt.Mnemonics.setLocalizedText(bnCancelJob, org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.bnCancelJob.text")); // NOI18N + bnCancelJob.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.bnCancelJob.toolTipText")); // NOI18N + bnCancelJob.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + bnCancelJobActionPerformed(evt); + } + }); + + org.openide.awt.Mnemonics.setLocalizedText(bnDeleteCase, org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.bnDeleteCase.text")); // NOI18N + bnDeleteCase.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.bnDeleteCase.toolTipText")); // NOI18N + bnDeleteCase.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + bnDeleteCaseActionPerformed(evt); + } + }); + + lbPending.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N + org.openide.awt.Mnemonics.setLocalizedText(lbPending, org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.lbPending.text")); // NOI18N + + lbRunning.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N + org.openide.awt.Mnemonics.setLocalizedText(lbRunning, org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.lbRunning.text")); // NOI18N + + lbCompleted.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N + org.openide.awt.Mnemonics.setLocalizedText(lbCompleted, org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.lbCompleted.text")); // NOI18N + + org.openide.awt.Mnemonics.setLocalizedText(bnRefresh, org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.bnRefresh.text")); // NOI18N + bnRefresh.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.bnRefresh.toolTipText")); // NOI18N + bnRefresh.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + bnRefreshActionPerformed(evt); + } + }); + + org.openide.awt.Mnemonics.setLocalizedText(bnCancelModule, org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.bnCancelModule.text")); // NOI18N + bnCancelModule.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.bnCancelModule.toolTipText")); // NOI18N + bnCancelModule.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + bnCancelModuleActionPerformed(evt); + } + }); + + org.openide.awt.Mnemonics.setLocalizedText(bnExit, org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.bnExit.text")); // NOI18N + bnExit.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.bnExit.toolTipText")); // NOI18N + bnExit.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + bnExitActionPerformed(evt); + } + }); + + org.openide.awt.Mnemonics.setLocalizedText(bnOptions, org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.bnOptions.text")); // NOI18N + bnOptions.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.bnOptions.toolTipText")); // NOI18N + bnOptions.setEnabled(false); + bnOptions.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + bnOptionsActionPerformed(evt); + } + }); + + org.openide.awt.Mnemonics.setLocalizedText(bnShowProgress, org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.bnShowProgress.text")); // NOI18N + bnShowProgress.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.bnShowProgress.toolTipText")); // NOI18N + bnShowProgress.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + bnShowProgressActionPerformed(evt); + } + }); + + org.openide.awt.Mnemonics.setLocalizedText(bnPause, org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.bnPause.text")); // NOI18N + bnPause.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.bnPause.toolTipText")); // NOI18N + bnPause.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + bnPauseActionPerformed(evt); + } + }); + + org.openide.awt.Mnemonics.setLocalizedText(bnPrioritizeCase, org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.bnPrioritizeCase.text")); // NOI18N + bnPrioritizeCase.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.bnPrioritizeCase.toolTipText")); // NOI18N + bnPrioritizeCase.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + bnPrioritizeCaseActionPerformed(evt); + } + }); + + org.openide.awt.Mnemonics.setLocalizedText(bnShowCaseLog, org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.bnShowCaseLog.text")); // NOI18N + bnShowCaseLog.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.bnShowCaseLog.toolTipText")); // NOI18N + bnShowCaseLog.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + bnShowCaseLogActionPerformed(evt); + } + }); + + tbStatusMessage.setEditable(false); + tbStatusMessage.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N + tbStatusMessage.setText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.tbStatusMessage.text")); // NOI18N + tbStatusMessage.setBorder(null); + + lbStatus.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N + org.openide.awt.Mnemonics.setLocalizedText(lbStatus, org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.lbStatus.text")); // NOI18N + + org.openide.awt.Mnemonics.setLocalizedText(bnPrioritizeJob, org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.bnPrioritizeJob.text")); // NOI18N + bnPrioritizeJob.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.bnPrioritizeJob.toolTipText")); // NOI18N + bnPrioritizeJob.setActionCommand(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.bnPrioritizeJob.actionCommand")); // NOI18N + bnPrioritizeJob.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + bnPrioritizeJobActionPerformed(evt); + } + }); + + lbServicesStatus.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N + org.openide.awt.Mnemonics.setLocalizedText(lbServicesStatus, org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.lbServicesStatus.text")); // NOI18N + + tbServicesStatusMessage.setEditable(false); + tbServicesStatusMessage.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N + tbServicesStatusMessage.setText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.tbServicesStatusMessage.text")); // NOI18N + tbServicesStatusMessage.setBorder(null); + + org.openide.awt.Mnemonics.setLocalizedText(bnOpenLogDir, org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.bnOpenLogDir.text")); // NOI18N + bnOpenLogDir.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + bnOpenLogDirActionPerformed(evt); + } + }); + + org.openide.awt.Mnemonics.setLocalizedText(bnReprocessJob, org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.bnReprocessJob.text")); // NOI18N + bnReprocessJob.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + bnReprocessJobActionPerformed(evt); + } + }); + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); + this.setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addComponent(lbPending, javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(pendingScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 920, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(bnPrioritizeCase, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(bnPrioritizeJob, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) + .addGroup(layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addComponent(bnPause) + .addGap(18, 18, 18) + .addComponent(bnRefresh, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(18, 18, 18) + .addComponent(bnOptions) + .addGap(18, 18, 18) + .addComponent(bnOpenLogDir) + .addGap(18, 18, 18) + .addComponent(bnExit, javax.swing.GroupLayout.PREFERRED_SIZE, 94, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGroup(layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(runningScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 920, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(completedScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 920, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addComponent(bnCancelJob, javax.swing.GroupLayout.DEFAULT_SIZE, 117, Short.MAX_VALUE) + .addComponent(bnShowProgress, javax.swing.GroupLayout.DEFAULT_SIZE, 116, Short.MAX_VALUE) + .addComponent(bnCancelModule, javax.swing.GroupLayout.DEFAULT_SIZE, 117, Short.MAX_VALUE) + .addComponent(bnDeleteCase, javax.swing.GroupLayout.DEFAULT_SIZE, 117, Short.MAX_VALUE) + .addComponent(bnShowCaseLog, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(bnReprocessJob, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) + .addGroup(layout.createSequentialGroup() + .addComponent(lbStatus) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(tbStatusMessage, javax.swing.GroupLayout.PREFERRED_SIZE, 861, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addComponent(lbCompleted) + .addComponent(lbRunning) + .addGroup(layout.createSequentialGroup() + .addComponent(lbServicesStatus) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(tbServicesStatusMessage, javax.swing.GroupLayout.PREFERRED_SIZE, 861, javax.swing.GroupLayout.PREFERRED_SIZE))) + .addGap(0, 0, Short.MAX_VALUE))) + .addContainerGap()) + ); + + layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {bnCancelJob, bnCancelModule, bnDeleteCase, bnExit, bnOpenLogDir, bnOptions, bnPause, bnRefresh, bnShowProgress}); + + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(lbStatus, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(tbStatusMessage, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(lbServicesStatus, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(tbServicesStatusMessage, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(lbPending, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(pendingScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 215, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGroup(layout.createSequentialGroup() + .addGap(82, 82, 82) + .addComponent(bnPrioritizeCase) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(bnPrioritizeJob))) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(lbRunning) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGap(34, 34, 34) + .addComponent(bnShowProgress) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(bnCancelJob) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(bnCancelModule)) + .addGroup(layout.createSequentialGroup() + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(runningScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 133, javax.swing.GroupLayout.PREFERRED_SIZE))) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGap(68, 68, 68) + .addComponent(bnReprocessJob) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(bnDeleteCase) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(bnShowCaseLog)) + .addGroup(layout.createSequentialGroup() + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(lbCompleted) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(completedScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 179, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(bnExit) + .addComponent(bnOpenLogDir)) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(bnPause) + .addComponent(bnRefresh) + .addComponent(bnOptions))))) + .addContainerGap()) + ); + + layout.linkSize(javax.swing.SwingConstants.VERTICAL, new java.awt.Component[] {bnCancelJob, bnCancelModule, bnDeleteCase, bnExit, bnOpenLogDir, bnOptions, bnRefresh, bnShowProgress}); + + }// //GEN-END:initComponents + + /** + * Handles a click on the refresh button. Requests an immediate scan of the + * input folders for new jobs and queues a refresh of all three of the jobs + * tables. + * + * @param evt - The button click event. + */ + private void bnRefreshActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnRefreshActionPerformed + this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + manager.scanInputDirsAndWait(); + refreshTables(); + this.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); + }//GEN-LAST:event_bnRefreshActionPerformed + + /** + * Handles a click on the delete case button. If an entry is selected that + * can be deleted, pops up a confirmation dialog. Upon confirmation, asks + * AutoIngestManager to delete the entry and asks for an updated view. + * + * @param evt The button click event. + */ + private void bnDeleteCaseActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnDeleteCaseActionPerformed + if (completedTableModel.getRowCount() < 0 || completedTable.getSelectedRow() < 0) { + return; + } + + String caseName = (String) completedTable.getValueAt(completedTable.getSelectedRow(), JobsTableModelColumns.CASE.ordinal()); + Object[] options = { + org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "ConfirmationDialog.Delete"), + org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "ConfirmationDialog.DoNotDelete") + }; + Object[] msgContent = {org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "ConfirmationDialog.DeleteAreYouSure") + "\"" + caseName + "\"?"}; + int reply = JOptionPane.showOptionDialog(this, + msgContent, + org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "ConfirmationDialog.ConfirmDeletionHeader"), + JOptionPane.DEFAULT_OPTION, + JOptionPane.WARNING_MESSAGE, + null, + options, + options[JOptionPane.NO_OPTION]); + if (reply == JOptionPane.YES_OPTION) { + bnDeleteCase.setEnabled(false); + bnShowCaseLog.setEnabled(false); + if (completedTableModel.getRowCount() > 0 && completedTable.getSelectedRow() >= 0) { + Path caseDirectoryPath = (Path) completedTableModel.getValueAt(completedTable.getSelectedRow(), JobsTableModelColumns.CASE_DIRECTORY_PATH.ordinal()); + completedTable.clearSelection(); + this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + CaseDeletionResult result = manager.deleteCase(caseName, caseDirectoryPath); + refreshTables(); + this.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); + if (CaseDeletionResult.FAILED == result) { + JOptionPane.showMessageDialog(this, + String.format("Could not delete case %s. It may be in in use.", caseName), + org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.DeletionFailed"), + JOptionPane.INFORMATION_MESSAGE); + } else if (CaseDeletionResult.PARTIALLY_DELETED == result) { + JOptionPane.showMessageDialog(this, + String.format("Could not delete case %s. See system log for details.", caseName), + org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.DeletionFailed"), + JOptionPane.INFORMATION_MESSAGE); + } + } + } + }//GEN-LAST:event_bnDeleteCaseActionPerformed + + /** + * Handles a click on the cancel auto ingest job button. Cancels the + * selected job. + * + * @param evt The button click event. + */ + private void bnCancelJobActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnCancelJobActionPerformed + Object[] options = { + org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "ConfirmationDialog.CancelJob"), + org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "ConfirmationDialog.DoNotCancelJob")}; + int reply = JOptionPane.showOptionDialog(this, + NbBundle.getMessage(AutoIngestLegacyDashboard.class, "ConfirmationDialog.CancelJobAreYouSure"), + NbBundle.getMessage(AutoIngestLegacyDashboard.class, "ConfirmationDialog.ConfirmCancellationHeader"), + JOptionPane.DEFAULT_OPTION, + JOptionPane.WARNING_MESSAGE, + null, + options, + options[1]); + if (reply == 0) { + /* + * Call setCursor on this to ensure it appears (if there is time to + * see it). + */ + this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + manager.cancelCurrentJob(); + refreshTables(); + this.setCursor(Cursor.getDefaultCursor()); + } + }//GEN-LAST:event_bnCancelJobActionPerformed + + /** + * Handles a click on the show auto ingest job progress button. Displays an + * ingest job progress panel. + * + * @param evt The button click event. + */ + private void bnShowProgressActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnShowProgressActionPerformed + IngestProgressSnapshotDialog dialog = new IngestProgressSnapshotDialog(this.getTopLevelAncestor(), true); + }//GEN-LAST:event_bnShowProgressActionPerformed + + /** + * Handles a click on the pause/resume auto ingest job button. Sends a + * pause/resume request to the auto ingest manager. + * + * @param evt The button click event. + */ + private void bnPauseActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnPauseActionPerformed + + if (!autoIngestStarted) { + //put up a wait cursor during the start up operation + this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + + startUp(); + + this.setCursor(null); + //done for startup + return; + } + if (!isPaused) { + tbStatusMessage.setText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.bnPause.pausing")); + pause(true); + } else { + resume(); + } + isPaused = !isPaused; + }//GEN-LAST:event_bnPauseActionPerformed + + /** + * Handles a click on the options button. Displays the options window. + * + * @param evt The button click event. + */ + private void bnOptionsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnOptionsActionPerformed + setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + OptionsDisplayer.getDefault().open(); + setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); + }//GEN-LAST:event_bnOptionsActionPerformed + + /** + * Handles a click on the cancel ingest module button. Cancels the currently + * running data source level ingest module for the selected job. + * + * @param evt The button click event. + */ + private void bnCancelModuleActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnCancelModuleActionPerformed + Object[] options = { + org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "ConfirmationDialog.CancelModule"), + org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "ConfirmationDialog.DoNotCancelModule")}; + int reply = JOptionPane.showOptionDialog(this, + NbBundle.getMessage(AutoIngestLegacyDashboard.class, "ConfirmationDialog.CancelModuleAreYouSure"), + NbBundle.getMessage(AutoIngestLegacyDashboard.class, "ConfirmationDialog.ConfirmCancellationHeader"), + JOptionPane.DEFAULT_OPTION, + JOptionPane.WARNING_MESSAGE, + null, + options, + options[1]); + if (reply == 0) { + /* + * Call setCursor on this to ensure it appears (if there is time to + * see it). + */ + this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + manager.cancelCurrentDataSourceLevelIngestModule(); + refreshTables(); + this.setCursor(Cursor.getDefaultCursor()); + } + }//GEN-LAST:event_bnCancelModuleActionPerformed + + /** + * Handles a click on the exit button. Shuts down auto ingest. + * + * @param evt The button click event. + */ + private void bnExitActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnExitActionPerformed + shutdown(); + }//GEN-LAST:event_bnExitActionPerformed + + /** + * Handle a click on the prioritize case button. Requests prioritization of + * all of the auto ingest jobs for a case. + * + * @param evt The button click event. + */ + private void bnPrioritizeCaseActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnPrioritizeCaseActionPerformed + if (pendingTableModel.getRowCount() > 0 && pendingTable.getSelectedRow() >= 0) { + this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + String caseName = (pendingTableModel.getValueAt(pendingTable.getSelectedRow(), JobsTableModelColumns.CASE.ordinal())).toString(); + manager.prioritizeCase(caseName); + refreshTables(); + pendingTable.clearSelection(); + enablePendingTableButtons(false); + AutoIngestLegacyDashboard.this.setCursor(Cursor.getDefaultCursor()); + } + }//GEN-LAST:event_bnPrioritizeCaseActionPerformed + + /** + * Handles a click on the show log button. Displays the auto ingest job log + * for a case in NotePad. + * + * @param evt The button click event. + */ + private void bnShowCaseLogActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnShowCaseLogActionPerformed + try { + int selectedRow = completedTable.getSelectedRow(); + if (selectedRow != -1) { + Path caseDirectoryPath = (Path) completedTableModel.getValueAt(selectedRow, JobsTableModelColumns.CASE_DIRECTORY_PATH.ordinal()); + if (null != caseDirectoryPath) { + Path pathToLog = AutoIngestJobLogger.getLogPath(caseDirectoryPath); + if (pathToLog.toFile().exists()) { + Desktop.getDesktop().edit(pathToLog.toFile()); + } else { + JOptionPane.showMessageDialog(this, org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.ShowLogFailed.Message"), + org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.ShowLogFailed.Title"), JOptionPane.ERROR_MESSAGE); + } + } else { + MessageNotifyUtil.Message.warn("The case directory for this job has been deleted."); + } + } + } catch (IOException ex) { + SYS_LOGGER.log(Level.SEVERE, "Dashboard error attempting to display case auto ingest log", ex); + Object[] options = {org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "DisplayLogDialog.okay")}; + JOptionPane.showOptionDialog(this, + org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "DisplayLogDialog.cannotFindLog"), + org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "DisplayLogDialog.unableToShowLogFile"), + JOptionPane.DEFAULT_OPTION, + JOptionPane.PLAIN_MESSAGE, + null, + options, + options[0]); + } + }//GEN-LAST:event_bnShowCaseLogActionPerformed + + private void bnPrioritizeJobActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnPrioritizeJobActionPerformed + if (pendingTableModel.getRowCount() > 0 && pendingTable.getSelectedRow() >= 0) { + this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + Path manifestFilePath = (Path) (pendingTableModel.getValueAt(pendingTable.getSelectedRow(), JobsTableModelColumns.MANIFEST_FILE_PATH.ordinal())); + manager.prioritizeJob(manifestFilePath); + refreshTables(); + pendingTable.clearSelection(); + enablePendingTableButtons(false); + AutoIngestLegacyDashboard.this.setCursor(Cursor.getDefaultCursor()); + } + }//GEN-LAST:event_bnPrioritizeJobActionPerformed + + private void bnOpenLogDirActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnOpenLogDirActionPerformed + Path logDirPath = Paths.get(PlatformUtil.getUserDirectory().getAbsolutePath(), "var", "log"); + File logDir = logDirPath.toFile(); + try { + Desktop.getDesktop().open(logDir); + } catch (IOException ex) { + DialogDisplayer.getDefault().notify(new NotifyDescriptor.Message( + String.format("Unable to open log directory %s:\n%s", logDirPath, ex.getLocalizedMessage()), + NotifyDescriptor.ERROR_MESSAGE)); + } + }//GEN-LAST:event_bnOpenLogDirActionPerformed + + private void bnReprocessJobActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnReprocessJobActionPerformed + if (completedTableModel.getRowCount() < 0 || completedTable.getSelectedRow() < 0) { + return; + } + this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + Path manifestPath = (Path) completedTableModel.getValueAt(completedTable.getSelectedRow(), JobsTableModelColumns.MANIFEST_FILE_PATH.ordinal()); + manager.reprocessJob(manifestPath); + refreshTables(); + AutoIngestLegacyDashboard.this.setCursor(Cursor.getDefaultCursor()); + }//GEN-LAST:event_bnReprocessJobActionPerformed + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JButton bnCancelJob; + private javax.swing.JButton bnCancelModule; + private javax.swing.JButton bnDeleteCase; + private javax.swing.JButton bnExit; + private javax.swing.JButton bnOpenLogDir; + private javax.swing.JButton bnOptions; + private javax.swing.JButton bnPause; + private javax.swing.JButton bnPrioritizeCase; + private javax.swing.JButton bnPrioritizeJob; + private javax.swing.JButton bnRefresh; + private javax.swing.JButton bnReprocessJob; + private javax.swing.JButton bnShowCaseLog; + private javax.swing.JButton bnShowProgress; + private javax.swing.JScrollPane completedScrollPane; + private javax.swing.JTable completedTable; + private javax.swing.JLabel lbCompleted; + private javax.swing.JLabel lbPending; + private javax.swing.JLabel lbRunning; + private javax.swing.JLabel lbServicesStatus; + private javax.swing.JLabel lbStatus; + private javax.swing.JScrollPane pendingScrollPane; + private javax.swing.JTable pendingTable; + private javax.swing.JScrollPane runningScrollPane; + private javax.swing.JTable runningTable; + private javax.swing.JTextField tbServicesStatusMessage; + private javax.swing.JTextField tbStatusMessage; + // End of variables declaration//GEN-END:variables + +} diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties index cddf2ed860..5b755dfb01 100644 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties @@ -1,11 +1,4 @@ CTL_OpenAction=Open Case... -AutoIngestDashboard.bnRefresh.text=&Refresh -AutoIngestDashboard.lbCompleted.text=Completed Jobs -AutoIngestDashboard.lbRunning.text=Running Jobs -AutoIngestDashboard.lbPending.text=Pending Jobs -AutoIngestDashboard.bnCancelModule.text=Cancel &Module -AutoIngestDashboard.bnExit.text=&Exit -AutoIngestDashboard.bnOptions.text=&Options AutoIngestDashboard.JobsTableModel.ColumnHeader.Case=Case AutoIngestDashboard.JobsTableModel.ColumnHeader.ImageFolder=Data Source AutoIngestDashboard.JobsTableModel.ColumnHeader.HostName=Host Name @@ -15,23 +8,12 @@ AutoIngestDashboard.JobsTableModel.ColumnHeader.CompletedTime=Job Completed AutoIngestDashboard.JobsTableModel.ColumnHeader.Stage=Stage AutoIngestDashboard.JobsTableModel.ColumnHeader.Status=Status AutoIngestDashboard.JobsTableModel.ColumnHeader.ManifestFilePath= Manifest File Path -AutoIngestDashboard.bnShowProgress.text=Ingest Progress AutoIngestDashboard.bnResume.text=Resume -AutoIngestDashboard.bnPause.text=Pause AutoIngestDashboard.bnPause.confirmHeader=Are you sure you want to pause? AutoIngestDashboard.bnPause.warningText=Pause will occur after the current job completes processing. This could take a long time. Continue? -AutoIngestDashboard.bnPause.toolTipText=Suspend processing of Pending Jobs AutoIngestDashboard.bnPause.toolTipTextResume=Resume processing of Pending Jobs AutoIngestDashboard.bnPause.pausing=Pausing after current job completes... -AutoIngestDashboard.bnRefresh.toolTipText=Refresh displayed tables -AutoIngestDashboard.bnShowProgress.toolTipText=Show the progress of the currently running Job. This functionality is only available for jobs running on current AIM node. -AutoIngestDashboard.bnCancelModule.toolTipText=Cancel processing of the current module within the Job and move on to the next module within the Job. This functionality is only available for jobs running on current AIM node. -AutoIngestDashboard.bnExit.toolTipText=Exit Application AutoIngestDashboard.Cancelling=Cancelling... -AutoIngestDashboard.bnOptions.toolTipText=Display options panel. All processing must be paused to open the options panel. -AutoIngestDashboard.pendingTable.toolTipText=The Pending table displays the order upcoming Jobs will be processed with the top of the list first -AutoIngestDashboard.runningTable.toolTipText=The Running table displays the currently running Job and information about it -AutoIngestDashboard.completedTable.toolTipText=The Completed table shows all Jobs that have been processed already AutoIngestDashboard.JobsTableModel.ColumnHeader.StageTime=Time in Stage AutoIngestDashboard.JobsTableModel.ColumnHeader.CaseFolder=Case Folder AutoIngestDashboard.JobsTableModel.ColumnHeader.LocalJob= Local Job? @@ -163,20 +145,12 @@ CopyFilesPanel.ConfirmCopyAdd=exists. Do you really want to copy more files to t CopyFilesPanel.ConfirmCopyYes=Copy CopyFilesPanel.ConfirmCopyNo=Do not copy ConfirmationDialog.ConfirmUnlockHeader=Confirm Case Unlock -AutoIngestDashboard.bnPrioritizeCase.toolTipText=Move all images associated with a case to top of Pending queue. -AutoIngestDashboard.bnPrioritizeCase.text=Prioriti&ze Case -AutoIngestDashboard.bnShowCaseLog.toolTipText=Display case log file for selected case -AutoIngestDashboard.bnShowCaseLog.text=Show Case &Log CopyFilesPanel.bnCancelPendingJob.text=Ca&ncel CopyFilesPanel.tbDestinationCase.text= CopyFilesPanel.cbThrottleNetwork.text=&Throttle Network CopyFilesPanel.cbThrottleNetwork.toolTipText=Select this box if a low-bandwidth network connection is involved in this copy job.
\nSelecting this box will artificially limit the transfer speed by inserting strategic delays.
\nThis helps copy files across low-bandwidth networks where the transfer would
\notherwise fail. Only select this if you are having problems copying across the network. CopyFilesPanel.bnShowCurrentLog.text=Show &Log CopyFilesPanel.bnShowCurrentLog.text=Show &Log -AutoIngestDashboard.bnCancelJob.toolTipText=Cancel processing of the current Job and move on to the next Job. This functionality is only available for jobs running on current AIM node. -AutoIngestDashboard.bnCancelJob.text=&Cancel Job -AutoIngestDashboard.bnDeleteCase.toolTipText=Delete the selected Case in its entirety -AutoIngestDashboard.bnDeleteCase.text=&Delete Case CopyFilesPanel.lbCaseName.text=Case Name CaseStatusIconCellRenderer.tooltiptext.ok=Images processed successfully CaseStatusIconCellRenderer.tooltiptext.warning=An error occurred or processing was canceled for at least one image - please check the log @@ -199,7 +173,6 @@ CaseImportPanel.Error=Error CaseImportPanel.Complete=Complete CaseImportPanel.Blank= CaseImportPanel.DeleteWarning=Make sure no important files are in the case source directory -AutoIngestDashboard.lbStatus.text=Status: SingleUserCaseImporter.NonUniqueOutputFolder=Output folder not unique. Skipping SingleUserCaseImporter.WillImport=Will import: SingleUserCaseImporter.None=None @@ -222,9 +195,6 @@ ReviewModeCasePanel.StatusIconHeaderText=Status ReviewModeCasePanel.OutputFolderHeaderText=Output Folder ReviewModeCasePanel.LastAccessedTimeHeaderText=Last Accessed Time CopyFilesPanel.bnOptions.text=&Options -AutoIngestDashboard.lbServicesStatus.text=Services Status: -AutoIngestDashboard.tbServicesStatusMessage.text= -AutoIngestDashboard.tbStatusMessage.text= FileExporterSettingsPanel.ChooseRootDirectory=Choose a root directory for file output FileExporterSettingsPanel.ChooseReportDirectory=Choose a report directory FileExporterSettingsPanel.RuleName=Rule Name @@ -283,12 +253,7 @@ FileExporterSettingsPanel.BrowseReportTooltip_1=Browse for the Reports Folder FileExporterSettingsPanel.NewRuleTooltip_1=Clear the rule editor to begin a new rule FileExporterSettingsPanel.DeleteTooltip_1=Delete the selected rule FileExporterSettingsPanel.SaveTooltip_1=Save the current rule -AutoIngestDashboard.bnOpenLogDir.text=Open System Logs Directory -AutoIngestDashboard.bnPrioritizeJob.text=Prioritize Job -AutoIngestDashboard.bnPrioritizeJob.toolTipText=Move this folder to the top of the Pending queue. -AutoIngestDashboard.bnReprocessJob.text=Reprocess Job AutoIngestDashboard.bnPrioritizeFolder.label= -AutoIngestDashboard.bnPrioritizeJob.actionCommand= AutoIngestCasePanel.rbDays.text=Days AutoIngestCasePanel.rbWeeks.text=Weeks AutoIngestCasePanel.rbMonths.text=Months @@ -298,3 +263,73 @@ AutoIngestCasePanel.bnOpen.text=&Open AutoIngestCasePanel.bnShowLog.toolTipText=Display case log file for selected case AutoIngestCasePanel.bnShowLog.text=&Show Log AutoIngestCasePanel.rbGroupLabel.text=Show Last 10: +AutoIngestLegacyDashboard.tbStatusMessage.text= +AutoIngestLegacyDashboard.bnShowCaseLog.toolTipText=Display case log file for selected case +AutoIngestLegacyDashboard.bnShowCaseLog.text=Show Case &Log +AutoIngestLegacyDashboard.bnDeleteCase.toolTipText=Delete the selected Case in its entirety +AutoIngestLegacyDashboard.bnDeleteCase.text=&Delete Case +AutoIngestLegacyDashboard.bnCancelJob.toolTipText=Cancel processing of the current Job and move on to the next Job. This functionality is only available for jobs running on current AIM node. +AutoIngestLegacyDashboard.bnCancelJob.text=&Cancel Job +AutoIngestLegacyDashboard.completedTable.toolTipText=The Completed table shows all Jobs that have been processed already +AutoIngestLegacyDashboard.runningTable.toolTipText=The Running table displays the currently running Job and information about it +AutoIngestLegacyDashboard.pendingTable.toolTipText=The Pending table displays the order upcoming Jobs will be processed with the top of the list first +AutoIngestLegacyDashboard.bnPrioritizeCase.toolTipText=Move all images associated with a case to top of Pending queue. +AutoIngestLegacyDashboard.bnPrioritizeCase.text=Prioriti&ze Case +AutoIngestLegacyDashboard.bnPause.toolTipText=Suspend processing of Pending Jobs +AutoIngestLegacyDashboard.bnPause.text=Pause +AutoIngestLegacyDashboard.bnShowProgress.toolTipText=Show the progress of the currently running Job. This functionality is only available for jobs running on current AIM node. +AutoIngestLegacyDashboard.bnShowProgress.text=Ingest Progress +AutoIngestLegacyDashboard.bnOptions.toolTipText=Display options panel. All processing must be paused to open the options panel. +AutoIngestLegacyDashboard.bnOptions.text=&Options +AutoIngestLegacyDashboard.bnExit.toolTipText=Exit Application +AutoIngestLegacyDashboard.bnExit.text=&Exit +AutoIngestLegacyDashboard.bnCancelModule.toolTipText=Cancel processing of the current module within the Job and move on to the next module within the Job. This functionality is only available for jobs running on current AIM node. +AutoIngestLegacyDashboard.bnCancelModule.text=Cancel &Module +AutoIngestLegacyDashboard.bnRefresh.toolTipText=Refresh displayed tables +AutoIngestLegacyDashboard.bnRefresh.text=&Refresh +AutoIngestLegacyDashboard.lbCompleted.text=Completed Jobs +AutoIngestLegacyDashboard.lbRunning.text=Running Jobs +AutoIngestLegacyDashboard.lbPending.text=Pending Jobs +AutoIngestLegacyDashboard.bnReprocessJob.text=Reprocess Job +AutoIngestLegacyDashboard.bnOpenLogDir.text=Open System Logs Directory +AutoIngestLegacyDashboard.tbServicesStatusMessage.text= +AutoIngestLegacyDashboard.lbServicesStatus.text=Services Status: +AutoIngestLegacyDashboard.bnPrioritizeJob.actionCommand= +AutoIngestLegacyDashboard.bnPrioritizeJob.toolTipText=Move this folder to the top of the Pending queue. +AutoIngestLegacyDashboard.bnPrioritizeJob.text=Prioritize Job +AutoIngestLegacyDashboard.lbStatus.text=Status: +AutoIngestDashboard.bnRefresh.text=&Refresh +AutoIngestDashboard.lbCompleted.text=Completed Jobs +AutoIngestDashboard.lbRunning.text=Running Jobs +AutoIngestDashboard.lbPending.text=Pending Jobs +AutoIngestDashboard.bnDeleteCase.toolTipText=Delete the selected Case in its entirety +AutoIngestDashboard.bnDeleteCase.text=&Delete Case +AutoIngestDashboard.bnCancelJob.toolTipText=Cancel processing of the current Job and move on to the next Job. This functionality is only available for jobs running on current AIM node. +AutoIngestDashboard.bnCancelJob.text=&Cancel Job +AutoIngestDashboard.completedTable.toolTipText=The Completed table shows all Jobs that have been processed already +AutoIngestDashboard.bnReprocessJob.text=Reprocess Job +AutoIngestDashboard.bnOpenLogDir.text=Open System Logs Directory +AutoIngestDashboard.runningTable.toolTipText=The Running table displays the currently running Job and information about it +AutoIngestDashboard.tbServicesStatusMessage.text= +AutoIngestDashboard.pendingTable.toolTipText=The Pending table displays the order upcoming Jobs will be processed with the top of the list first +AutoIngestDashboard.lbServicesStatus.text=Services Status: +AutoIngestDashboard.bnPrioritizeJob.actionCommand= +AutoIngestDashboard.bnPrioritizeJob.toolTipText=Move this folder to the top of the Pending queue. +AutoIngestDashboard.bnPrioritizeJob.text=Prioritize Job +AutoIngestDashboard.lbStatus.text=Status: +AutoIngestDashboard.tbStatusMessage.text= +AutoIngestDashboard.bnShowCaseLog.toolTipText=Display case log file for selected case +AutoIngestDashboard.bnShowCaseLog.text=Show Case &Log +AutoIngestDashboard.bnPrioritizeCase.toolTipText_1=Move all images associated with a case to top of Pending queue. +AutoIngestDashboard.bnPrioritizeCase.text_1=Prioriti&ze Case +AutoIngestDashboard.bnPause.toolTipText=Suspend processing of Pending Jobs +AutoIngestDashboard.bnPause.text=Pause +AutoIngestDashboard.bnShowProgress.toolTipText=Show the progress of the currently running Job. This functionality is only available for jobs running on current AIM node. +AutoIngestDashboard.bnShowProgress.text=Ingest Progress +AutoIngestDashboard.bnOptions.toolTipText=Display options panel. All processing must be paused to open the options panel. +AutoIngestDashboard.bnOptions.text=&Options +AutoIngestDashboard.bnExit.toolTipText=Exit Application +AutoIngestDashboard.bnExit.text=&Exit +AutoIngestDashboard.bnCancelModule.toolTipText=Cancel processing of the current module within the Job and move on to the next module within the Job. This functionality is only available for jobs running on current AIM node. +AutoIngestDashboard.bnCancelModule.text=Cancel &Module +AutoIngestDashboard.bnRefresh.toolTipText=Refresh displayed tables diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/configuration/StartupWindow.java b/Experimental/src/org/sleuthkit/autopsy/experimental/configuration/StartupWindow.java index e0cae099c9..a9a6a0d269 100644 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/configuration/StartupWindow.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/configuration/StartupWindow.java @@ -26,17 +26,20 @@ import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.JDialog; +import javax.swing.SwingUtilities; import javax.swing.WindowConstants; import org.openide.util.ImageUtilities; import org.openide.util.NbBundle; +import org.openide.util.actions.CallableSystemAction; import org.openide.util.lookup.ServiceProvider; import org.openide.windows.WindowManager; import org.sleuthkit.autopsy.casemodule.CueBannerPanel; import org.sleuthkit.autopsy.casemodule.StartupWindowInterface; import org.sleuthkit.autopsy.core.UserPreferences; import org.sleuthkit.autopsy.coreutils.NetworkUtils; -import org.sleuthkit.autopsy.experimental.autoingest.AutoIngestDashboard; +import org.sleuthkit.autopsy.experimental.autoingest.AutoIngestLegacyDashboard; import org.sleuthkit.autopsy.experimental.autoingest.AutoIngestCasePanel; +import org.sleuthkit.autopsy.experimental.autoingest.AutoIngestDashboardOpenAction; /** * The default implementation of the Autopsy startup window @@ -113,17 +116,20 @@ public final class StartupWindow extends JDialog implements StartupWindowInterfa this.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { - AutoIngestDashboard.getInstance().shutdown(); + AutoIngestLegacyDashboard.getInstance().shutdown(); } }); setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); - add(AutoIngestDashboard.getInstance()); + add(AutoIngestLegacyDashboard.getInstance()); break; case REVIEW: this.setTitle(NbBundle.getMessage(StartupWindow.class, "StartupWindow.ReviewMode") + " (" + LOCAL_HOST_NAME + ")"); caseManagementPanel = new AutoIngestCasePanel(this); setIconImage(ImageUtilities.loadImage("org/sleuthkit/autopsy/experimental/images/frame.gif", false)); //NON-NLS add(caseManagementPanel); + SwingUtilities.invokeLater(() -> { + CallableSystemAction.get(AutoIngestDashboardOpenAction.class).setEnabled(true); + }); break; default: welcomeWindow = new CueBannerPanel(); From b3e5ecb0904b3f212d5077bff47967c330c9ce9b Mon Sep 17 00:00:00 2001 From: millmanorama Date: Fri, 11 Aug 2017 10:08:01 -0400 Subject: [PATCH 002/104] make hitsMultiMap local to performQuery() and remove unused getDocumentIds method. --- .../autopsy/keywordsearch/RegexQuery.java | 53 +++++-------------- 1 file changed, 14 insertions(+), 39 deletions(-) diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/RegexQuery.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/RegexQuery.java index 45205b0ca7..ec4ee957ac 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/RegexQuery.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/RegexQuery.java @@ -24,10 +24,8 @@ import com.google.common.collect.ListMultimap; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; -import java.util.HashSet; import java.util.List; import java.util.Map; -import java.util.Set; import java.util.logging.Level; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -52,11 +50,8 @@ import org.sleuthkit.datamodel.AbstractFile; import org.sleuthkit.datamodel.Account; import org.sleuthkit.datamodel.BlackboardArtifact; import org.sleuthkit.datamodel.BlackboardAttribute; -import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_CARD_NUMBER; -import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_EMAIL; import org.sleuthkit.datamodel.TskCoreException; import org.sleuthkit.datamodel.TskData; -import org.sleuthkit.datamodel.TskException; /** * The RegexQuery class supports issuing regular expression queries against a @@ -87,8 +82,6 @@ final class RegexQuery implements KeywordSearchQuery { private final int MIN_EMAIL_ADDR_LENGTH = 8; - private final ListMultimap hitsMultiMap = ArrayListMultimap.create(); - // Lucene regular expressions do not support the following Java predefined // and POSIX character classes. There are other valid Java character classes // that are not supported by Lucene but we do not check for all of them. @@ -191,9 +184,11 @@ final class RegexQuery implements KeywordSearchQuery { solrQuery.setSort(SortClause.asc(Server.Schema.ID.toString())); String cursorMark = CursorMarkParams.CURSOR_MARK_START; - SolrDocumentList resultList ; + SolrDocumentList resultList; boolean allResultsProcessed = false; + final ListMultimap hitsMultiMap = ArrayListMultimap.create(); + while (!allResultsProcessed) { try { solrQuery.set(CursorMarkParams.CURSOR_MARK_PARAM, cursorMark); @@ -206,7 +201,7 @@ final class RegexQuery implements KeywordSearchQuery { for (KeywordHit hit : keywordHits) { hitsMultiMap.put(new Keyword(hit.getHit(), true, true, originalKeyword.getListName(), originalKeyword.getOriginalTerm()), hit); } - } catch (TskCoreException ex) { + } catch (TskCoreException ex) { LOGGER.log(Level.SEVERE, "Error creating keyword hits", ex); //NON-NLS } } @@ -287,8 +282,8 @@ final class RegexQuery implements KeywordSearchQuery { } /* - * If searching for credit card account numbers, do a Luhn check - * on the term and discard it if it does not pass. + * If searching for credit card account numbers, do a Luhn + * check on the term and discard it if it does not pass. */ if (originalKeyword.getArtifactAttributeType() == BlackboardAttribute.ATTRIBUTE_TYPE.TSK_CARD_NUMBER) { Matcher ccnMatcher = CREDIT_CARD_NUM_PATTERN.matcher(hit); @@ -319,10 +314,14 @@ final class RegexQuery implements KeywordSearchQuery { } catch (TskCoreException ex) { throw ex; } catch (Throwable error) { - /* NOTE: Matcher.find() is known to throw StackOverflowError in rare cases (see JIRA-2700). - StackOverflowError is an error, not an exception, and therefore needs to be caught - as a Throwable. When this occurs we should re-throw the error as TskCoreException so that it is - logged by the calling method and move on to the next Solr document. */ + /* + * NOTE: Matcher.find() is known to throw StackOverflowError in rare + * cases (see JIRA-2700). StackOverflowError is an error, not an + * exception, and therefore needs to be caught as a Throwable. When + * this occurs we should re-throw the error as TskCoreException so + * that it is logged by the calling method and move on to the next + * Solr document. + */ throw new TskCoreException("Failed to create keyword hits for Solr document id " + docId + " due to " + error.getMessage()); } return hits; @@ -373,30 +372,6 @@ final class RegexQuery implements KeywordSearchQuery { return escapedQuery; } - /** - * Get a unique, comma separated list of document ids that match the given - * hit for the same object. - * - * @param keyword The keyword object that resulted in one or more hits. - * @param hit The specific hit for which we want to identify all other - * chunks that match the keyword - * - * @return A comma separated list of unique document ids. - */ - private String getDocumentIds(Keyword keyword, KeywordHit hit) { - Set documentIds = new HashSet<>(); - - for (KeywordHit h : hitsMultiMap.get(keyword)) { - // Add the document id only if it is for the same object as the - // given hit and we haven't already seen it. - if (h.getSolrObjectId() == hit.getSolrObjectId() && !documentIds.contains(h.getSolrDocumentId())) { - documentIds.add(h.getSolrDocumentId()); - } - } - - return StringUtils.join(documentIds, ","); - } - /** * Converts the keyword hits for a given search term into artifacts. * From 15eb3c28ba70e9499187c636e3e90d2365f55aa7 Mon Sep 17 00:00:00 2001 From: millmanorama Date: Mon, 14 Aug 2017 13:25:59 -0400 Subject: [PATCH 003/104] remove temporary hitsMultiMap altogether --- .../autopsy/keywordsearch/RegexQuery.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/RegexQuery.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/RegexQuery.java index ec4ee957ac..dca12ed5b4 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/RegexQuery.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/RegexQuery.java @@ -19,8 +19,6 @@ package org.sleuthkit.autopsy.keywordsearch; import com.google.common.base.CharMatcher; -import com.google.common.collect.ArrayListMultimap; -import com.google.common.collect.ListMultimap; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; @@ -186,8 +184,7 @@ final class RegexQuery implements KeywordSearchQuery { String cursorMark = CursorMarkParams.CURSOR_MARK_START; SolrDocumentList resultList; boolean allResultsProcessed = false; - - final ListMultimap hitsMultiMap = ArrayListMultimap.create(); + QueryResults results = new QueryResults(this); while (!allResultsProcessed) { try { @@ -199,7 +196,13 @@ final class RegexQuery implements KeywordSearchQuery { try { List keywordHits = createKeywordHits(resultDoc); for (KeywordHit hit : keywordHits) { - hitsMultiMap.put(new Keyword(hit.getHit(), true, true, originalKeyword.getListName(), originalKeyword.getOriginalTerm()), hit); + Keyword keywordInstance = new Keyword(hit.getHit(), true, true, originalKeyword.getListName(), originalKeyword.getOriginalTerm()); + List hitsForKeyword = results.getResults(keywordInstance); + if (hitsForKeyword == null) { + hitsForKeyword = new ArrayList<>(); + results.addResult(keywordInstance, hitsForKeyword); + } + hitsForKeyword.add(hit); } } catch (TskCoreException ex) { LOGGER.log(Level.SEVERE, "Error creating keyword hits", ex); //NON-NLS @@ -216,10 +219,7 @@ final class RegexQuery implements KeywordSearchQuery { MessageNotifyUtil.Notify.error(NbBundle.getMessage(Server.class, "Server.query.exception.msg", keywordString), ex.getCause().getMessage()); } } - QueryResults results = new QueryResults(this); - for (Keyword k : hitsMultiMap.keySet()) { - results.addResult(k, hitsMultiMap.get(k)); - } + return results; } From 27afb595f23fc12f1aae3370fcbc11498640c4d1 Mon Sep 17 00:00:00 2001 From: esaunders Date: Mon, 14 Aug 2017 14:49:45 -0400 Subject: [PATCH 004/104] Use new Java garbage collector with string deduplication. --- build-windows-installer.xml | 2 +- build.xml | 2 +- nbproject/project.properties | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/build-windows-installer.xml b/build-windows-installer.xml index 1e608b1326..e3f0401632 100644 --- a/build-windows-installer.xml +++ b/build-windows-installer.xml @@ -170,7 +170,7 @@ - + diff --git a/build.xml b/build.xml index b0d244b119..685f285fda 100755 --- a/build.xml +++ b/build.xml @@ -92,7 +92,7 @@ - + diff --git a/nbproject/project.properties b/nbproject/project.properties index 03d618afe6..50957852e4 100644 --- a/nbproject/project.properties +++ b/nbproject/project.properties @@ -17,7 +17,7 @@ update_versions=false #custom JVM options #Note: can be higher on 64 bit systems, should be in sync with build.xml # for Japanese version add: -J-Duser.language=ja -run.args.extra=-J-Xms24m -J-XX:MaxPermSize=128M -J-Xverify:none +run.args.extra=-J-Xms24m -J-XX:MaxPermSize=128M -J-Xverify:none -J-XX:+UseG1GC -J-XX:+UseStringDeduplication auxiliary.org-netbeans-modules-apisupport-installer.license-type=apache.v2 auxiliary.org-netbeans-modules-apisupport-installer.os-linux=false auxiliary.org-netbeans-modules-apisupport-installer.os-macosx=false From c7f8c32ca3fef23c6508ca22ed14a7f470323f50 Mon Sep 17 00:00:00 2001 From: millmanorama Date: Mon, 14 Aug 2017 15:27:55 -0400 Subject: [PATCH 005/104] first pass at removing stored content in KeywordHit --- .../keywordsearch/KeywordCachedArtifact.java | 6 +- .../autopsy/keywordsearch/KeywordHit.java | 20 +++-- .../keywordsearch/KeywordSearchQuery.java | 4 +- .../KeywordSearchResultFactory.java | 30 +++++--- .../autopsy/keywordsearch/LuceneQuery.java | 6 +- .../autopsy/keywordsearch/QueryResults.java | 25 +++++-- .../autopsy/keywordsearch/RegexQuery.java | 73 +++++++------------ .../keywordsearch/TermsComponentQuery.java | 16 ++-- 8 files changed, 91 insertions(+), 89 deletions(-) diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordCachedArtifact.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordCachedArtifact.java index 68f85dd29a..986a974caa 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordCachedArtifact.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordCachedArtifact.java @@ -31,12 +31,12 @@ import org.sleuthkit.datamodel.BlackboardAttribute; */ class KeywordCachedArtifact { - private BlackboardArtifact artifact; - private Map attributes; + private final BlackboardArtifact artifact; + private final Map attributes; KeywordCachedArtifact(BlackboardArtifact artifact) { this.artifact = artifact; - attributes = new HashMap(); + attributes = new HashMap<>(); } BlackboardArtifact getArtifact() { diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordHit.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordHit.java index f86b86b485..3a51c38488 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordHit.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordHit.java @@ -20,7 +20,6 @@ package org.sleuthkit.autopsy.keywordsearch; import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.datamodel.BlackboardArtifact; -import org.sleuthkit.datamodel.Content; import org.sleuthkit.datamodel.SleuthkitCase; import org.sleuthkit.datamodel.TskCoreException; @@ -36,7 +35,7 @@ class KeywordHit implements Comparable { private final long solrObjectId; private final int chunkId; private final String snippet; - private final Content content; + private final long contentID; private final BlackboardArtifact artifact; private final String hit; @@ -73,20 +72,19 @@ class KeywordHit implements Comparable { } /** - * Look up the file associated with the keyword hit. If the high order - * bit of the object id is set, the hit was for an artifact. In this - * case, look up the artifact as well. + * Look up the artifact associated with the keyword hit if there is onw. + * If the high order bit of the object id is set, the hit was for an + * artifact. */ SleuthkitCase caseDb = Case.getCurrentCase().getSleuthkitCase(); - long fileId; + if (this.solrObjectId < 0) { this.artifact = caseDb.getBlackboardArtifact(this.solrObjectId); - fileId = artifact.getObjectID(); + contentID = artifact.getObjectID(); } else { this.artifact = null; - fileId = this.solrObjectId; + contentID = this.solrObjectId; } - this.content = caseDb.getContentById(fileId); /** * Store the text snippet. @@ -119,8 +117,8 @@ class KeywordHit implements Comparable { return this.snippet; } - Content getContent() { - return this.content; + long getContentID() { + return this.contentID; } /** diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchQuery.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchQuery.java index cafd45b3e8..3ca2ab048a 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchQuery.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchQuery.java @@ -18,6 +18,8 @@ */ package org.sleuthkit.autopsy.keywordsearch; +import org.sleuthkit.datamodel.Content; + /** * Interface for kewyord search queries. */ @@ -97,6 +99,6 @@ interface KeywordSearchQuery { */ String getEscapedQueryString(); - KeywordCachedArtifact writeSingleFileHitsToBlackBoard(Keyword keyword, KeywordHit hit, String snippet, String listName); + KeywordCachedArtifact writeSingleFileHitsToBlackBoard(Content content, Keyword keyword, KeywordHit hit, String snippet, String listName); } diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchResultFactory.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchResultFactory.java index b82e7778e1..65f83551b0 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchResultFactory.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchResultFactory.java @@ -18,13 +18,10 @@ */ package org.sleuthkit.autopsy.keywordsearch; -import com.google.common.collect.SetMultimap; -import com.google.common.collect.TreeMultimap; import java.awt.EventQueue; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; -import java.util.Comparator; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; @@ -39,8 +36,10 @@ import org.netbeans.api.progress.ProgressHandle; import org.openide.nodes.ChildFactory; import org.openide.nodes.Children; import org.openide.nodes.Node; +import org.openide.util.Exceptions; import org.openide.util.NbBundle; import org.openide.util.lookup.Lookups; +import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil; import org.sleuthkit.autopsy.datamodel.AbstractAbstractFileNode; @@ -56,6 +55,8 @@ import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_KEY import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_KEYWORD_PREVIEW; import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_KEYWORD_REGEXP; import org.sleuthkit.datamodel.Content; +import org.sleuthkit.datamodel.SleuthkitCase; +import org.sleuthkit.datamodel.TskCoreException; /** * Node factory that performs the keyword search and creates children nodes for @@ -69,16 +70,16 @@ class KeywordSearchResultFactory extends ChildFactory { private static final Logger logger = Logger.getLogger(KeywordSearchResultFactory.class.getName()); //common properties (superset of all Node properties) to be displayed as columns - static final List COMMON_PROPERTIES - = Stream.concat( + static final List COMMON_PROPERTIES = + Stream.concat( Stream.of( TSK_KEYWORD, TSK_KEYWORD_REGEXP, TSK_KEYWORD_PREVIEW) - .map(BlackboardAttribute.ATTRIBUTE_TYPE::getDisplayName), + .map(BlackboardAttribute.ATTRIBUTE_TYPE::getDisplayName), Arrays.stream(AbstractAbstractFileNode.AbstractFilePropertyType.values()) - .map(Object::toString)) - .collect(Collectors.toList()); + .map(Object::toString)) + .collect(Collectors.toList()); private final Collection queryRequests; @@ -144,6 +145,11 @@ class KeywordSearchResultFactory extends ChildFactory { MessageNotifyUtil.Notify.error(Bundle.KeywordSearchResultFactory_query_exception_msg() + queryRequest.getQueryString(), ex.getCause().getMessage()); return false; } + SleuthkitCase tskCase = null; + try { + tskCase = Case.getCurrentCase().getSleuthkitCase(); + } catch (IllegalStateException ex) { + } int hitNumber = 0; List tempList = new ArrayList<>(); @@ -153,7 +159,12 @@ class KeywordSearchResultFactory extends ChildFactory { * Get file properties. */ Map properties = new LinkedHashMap<>(); - Content content = hit.getContent(); + Content content = null; + try { + content = tskCase.getContentById(hit.getContentID()); + } catch (TskCoreException ex) { + Exceptions.printStackTrace(ex); + } String contentName = content.getName(); if (content instanceof AbstractFile) { AbstractFsContentNode.fillPropertyMap(properties, (AbstractFile) content); @@ -244,6 +255,7 @@ class KeywordSearchResultFactory extends ChildFactory { * @param map Contains content metadata, snippets, etc. (property * map) * @param id User incremented ID + * @param solrObjectId * @param content File that had the hit. * @param query Query used in search * @param hits Full set of search results (for all files! @@@) diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/LuceneQuery.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/LuceneQuery.java index 9f8686898f..388b471fcd 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/LuceneQuery.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/LuceneQuery.java @@ -20,7 +20,6 @@ package org.sleuthkit.autopsy.keywordsearch; import java.util.ArrayList; import java.util.Collection; -import java.util.Comparator; import java.util.List; import java.util.Map; import java.util.logging.Level; @@ -40,6 +39,7 @@ import org.sleuthkit.datamodel.BlackboardArtifact; import org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE; import org.sleuthkit.datamodel.BlackboardAttribute; import org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE; +import org.sleuthkit.datamodel.Content; import org.sleuthkit.datamodel.TskCoreException; import org.sleuthkit.datamodel.TskException; @@ -192,14 +192,14 @@ class LuceneQuery implements KeywordSearchQuery { } @Override - public KeywordCachedArtifact writeSingleFileHitsToBlackBoard(Keyword foundKeyword, KeywordHit hit, String snippet, String listName) { + public KeywordCachedArtifact writeSingleFileHitsToBlackBoard(Content content, Keyword foundKeyword, KeywordHit hit, String snippet, String listName) { final String MODULE_NAME = KeywordSearchModuleFactory.getModuleName(); Collection attributes = new ArrayList<>(); BlackboardArtifact bba; KeywordCachedArtifact writeResult; try { - bba = hit.getContent().newArtifact(ARTIFACT_TYPE.TSK_KEYWORD_HIT); + bba = content.newArtifact(ARTIFACT_TYPE.TSK_KEYWORD_HIT); writeResult = new KeywordCachedArtifact(bba); } catch (TskCoreException e) { logger.log(Level.WARNING, "Error adding bb artifact for keyword hit", e); //NON-NLS diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/QueryResults.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/QueryResults.java index 410ec1a94c..e5562f9499 100755 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/QueryResults.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/QueryResults.java @@ -31,6 +31,7 @@ import org.apache.commons.lang.StringUtils; import org.netbeans.api.progress.ProgressHandle; import org.netbeans.api.progress.aggregate.ProgressContributor; import org.openide.util.NbBundle; +import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.coreutils.EscapeUtil; import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.ingest.IngestMessage; @@ -40,6 +41,8 @@ import org.sleuthkit.datamodel.AbstractFile; import org.sleuthkit.datamodel.BlackboardArtifact; import org.sleuthkit.datamodel.BlackboardAttribute; import org.sleuthkit.datamodel.Content; +import org.sleuthkit.datamodel.SleuthkitCase; +import org.sleuthkit.datamodel.TskCoreException; /** * Stores the results from running a Solr query (which could contain multiple @@ -60,8 +63,6 @@ class QueryResults { */ private final Map> results = new HashMap<>(); - - QueryResults(KeywordSearchQuery query) { this.keywordSearchQuery = query; } @@ -70,8 +71,6 @@ class QueryResults { results.put(keyword, hits); } - - KeywordSearchQuery getQuery() { return keywordSearchQuery; } @@ -145,14 +144,23 @@ class QueryResults { continue; } } - KeywordCachedArtifact writeResult = keywordSearchQuery.writeSingleFileHitsToBlackBoard(keyword, hit, snippet, keywordSearchQuery.getKeywordList().getName()); + Content content = null; + try { + SleuthkitCase tskCase = Case.getCurrentCase().getSleuthkitCase(); + content = tskCase.getContentById(hit.getContentID()); + } catch (TskCoreException tskCoreException) { + logger.log(Level.SEVERE, "Error adding artifact for keyword hit to blackboard", tskCoreException); //NON-NLS + return null; + } catch (IllegalStateException ex) { + } + KeywordCachedArtifact writeResult = keywordSearchQuery.writeSingleFileHitsToBlackBoard(content, keyword, hit, snippet, keywordSearchQuery.getKeywordList().getName()); if (writeResult != null) { newArtifacts.add(writeResult.getArtifact()); if (notifyInbox) { - writeSingleFileInboxMessage(writeResult, hit.getContent()); + writeSingleFileInboxMessage(writeResult, content); } } else { - logger.log(Level.WARNING, "BB artifact for keyword hit not written, file: {0}, hit: {1}", new Object[]{hit.getContent(), keyword.toString()}); //NON-NLS + logger.log(Level.WARNING, "BB artifact for keyword hit not written, file: {0}, hit: {1}", new Object[]{content, keyword.toString()}); //NON-NLS } } ++unitProgress; @@ -199,7 +207,7 @@ class QueryResults { * Generate an ingest inbox message for given keyword in given file * * @param written - * @param hitFile + * @param hitContent */ private void writeSingleFileInboxMessage(KeywordCachedArtifact written, Content hitContent) { StringBuilder subjectSb = new StringBuilder(); @@ -210,6 +218,7 @@ class QueryResults { } else { subjectSb.append(NbBundle.getMessage(this.getClass(), "KeywordSearchIngestModule.kwHitLbl")); } + String uniqueKey = null; BlackboardAttribute attr = written.getAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_KEYWORD.getTypeID()); if (attr != null) { diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/RegexQuery.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/RegexQuery.java index 45205b0ca7..b8875a9c23 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/RegexQuery.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/RegexQuery.java @@ -24,10 +24,8 @@ import com.google.common.collect.ListMultimap; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; -import java.util.HashSet; import java.util.List; import java.util.Map; -import java.util.Set; import java.util.logging.Level; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -52,11 +50,9 @@ import org.sleuthkit.datamodel.AbstractFile; import org.sleuthkit.datamodel.Account; import org.sleuthkit.datamodel.BlackboardArtifact; import org.sleuthkit.datamodel.BlackboardAttribute; -import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_CARD_NUMBER; -import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_EMAIL; +import org.sleuthkit.datamodel.Content; import org.sleuthkit.datamodel.TskCoreException; import org.sleuthkit.datamodel.TskData; -import org.sleuthkit.datamodel.TskException; /** * The RegexQuery class supports issuing regular expression queries against a @@ -191,7 +187,7 @@ final class RegexQuery implements KeywordSearchQuery { solrQuery.setSort(SortClause.asc(Server.Schema.ID.toString())); String cursorMark = CursorMarkParams.CURSOR_MARK_START; - SolrDocumentList resultList ; + SolrDocumentList resultList; boolean allResultsProcessed = false; while (!allResultsProcessed) { @@ -206,7 +202,7 @@ final class RegexQuery implements KeywordSearchQuery { for (KeywordHit hit : keywordHits) { hitsMultiMap.put(new Keyword(hit.getHit(), true, true, originalKeyword.getListName(), originalKeyword.getOriginalTerm()), hit); } - } catch (TskCoreException ex) { + } catch (TskCoreException ex) { LOGGER.log(Level.SEVERE, "Error creating keyword hits", ex); //NON-NLS } } @@ -287,8 +283,8 @@ final class RegexQuery implements KeywordSearchQuery { } /* - * If searching for credit card account numbers, do a Luhn check - * on the term and discard it if it does not pass. + * If searching for credit card account numbers, do a Luhn + * check on the term and discard it if it does not pass. */ if (originalKeyword.getArtifactAttributeType() == BlackboardAttribute.ATTRIBUTE_TYPE.TSK_CARD_NUMBER) { Matcher ccnMatcher = CREDIT_CARD_NUM_PATTERN.matcher(hit); @@ -319,10 +315,14 @@ final class RegexQuery implements KeywordSearchQuery { } catch (TskCoreException ex) { throw ex; } catch (Throwable error) { - /* NOTE: Matcher.find() is known to throw StackOverflowError in rare cases (see JIRA-2700). - StackOverflowError is an error, not an exception, and therefore needs to be caught - as a Throwable. When this occurs we should re-throw the error as TskCoreException so that it is - logged by the calling method and move on to the next Solr document. */ + /* + * NOTE: Matcher.find() is known to throw StackOverflowError in rare + * cases (see JIRA-2700). StackOverflowError is an error, not an + * exception, and therefore needs to be caught as a Throwable. When + * this occurs we should re-throw the error as TskCoreException so + * that it is logged by the calling method and move on to the next + * Solr document. + */ throw new TskCoreException("Failed to create keyword hits for Solr document id " + docId + " due to " + error.getMessage()); } return hits; @@ -373,33 +373,10 @@ final class RegexQuery implements KeywordSearchQuery { return escapedQuery; } - /** - * Get a unique, comma separated list of document ids that match the given - * hit for the same object. - * - * @param keyword The keyword object that resulted in one or more hits. - * @param hit The specific hit for which we want to identify all other - * chunks that match the keyword - * - * @return A comma separated list of unique document ids. - */ - private String getDocumentIds(Keyword keyword, KeywordHit hit) { - Set documentIds = new HashSet<>(); - - for (KeywordHit h : hitsMultiMap.get(keyword)) { - // Add the document id only if it is for the same object as the - // given hit and we haven't already seen it. - if (h.getSolrObjectId() == hit.getSolrObjectId() && !documentIds.contains(h.getSolrDocumentId())) { - documentIds.add(h.getSolrDocumentId()); - } - } - - return StringUtils.join(documentIds, ","); - } - /** * Converts the keyword hits for a given search term into artifacts. * + * @param content * @param foundKeyword The keyword that was found by the regex search. * @param hit The keyword hit. * @param snippet The document snippet that contains the hit @@ -411,12 +388,17 @@ final class RegexQuery implements KeywordSearchQuery { * @return An object that wraps an artifact and a mapping by id of its * attributes. */ - // TODO: Are we actually making meaningful use of the KeywordCachedArtifact - // class? @Override - public KeywordCachedArtifact writeSingleFileHitsToBlackBoard(Keyword foundKeyword, KeywordHit hit, String snippet, String listName) { + public KeywordCachedArtifact writeSingleFileHitsToBlackBoard( Content content,Keyword foundKeyword, KeywordHit hit, String snippet, String listName) { final String MODULE_NAME = KeywordSearchModuleFactory.getModuleName(); + + + if (content == null) { + LOGGER.log(Level.WARNING, "Error adding artifact for keyword hit to blackboard"); //NON-NLS + return null; + } + /* * Create either a "plain vanilla" keyword hit artifact with keyword and * regex attributes, or a credit card account artifact with attributes @@ -429,8 +411,7 @@ final class RegexQuery implements KeywordSearchQuery { attributes.add(new BlackboardAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_KEYWORD, MODULE_NAME, foundKeyword.getSearchTerm())); attributes.add(new BlackboardAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_KEYWORD_REGEXP, MODULE_NAME, getQueryString())); try { - newArtifact = hit.getContent().newArtifact(BlackboardArtifact.ARTIFACT_TYPE.TSK_KEYWORD_HIT); - + newArtifact = content.newArtifact(BlackboardArtifact.ARTIFACT_TYPE.TSK_KEYWORD_HIT); } catch (TskCoreException ex) { LOGGER.log(Level.SEVERE, "Error adding artifact for keyword hit to blackboard", ex); //NON-NLS return null; @@ -455,7 +436,7 @@ final class RegexQuery implements KeywordSearchQuery { if (hit.isArtifactHit()) { LOGGER.log(Level.SEVERE, String.format("Failed to parse credit card account number for artifact keyword hit: term = %s, snippet = '%s', artifact id = %d", foundKeyword.getSearchTerm(), hit.getSnippet(), hit.getArtifact().getArtifactID())); //NON-NLS } else { - LOGGER.log(Level.SEVERE, String.format("Failed to parse credit card account number for content keyword hit: term = %s, snippet = '%s', object id = %d", foundKeyword.getSearchTerm(), hit.getSnippet(), hit.getContent().getId())); //NON-NLS + LOGGER.log(Level.SEVERE, String.format("Failed to parse credit card account number for content keyword hit: term = %s, snippet = '%s', object id = %d", foundKeyword.getSearchTerm(), hit.getSnippet(), hit.getContentID())); //NON-NLS } return null; } @@ -491,8 +472,8 @@ final class RegexQuery implements KeywordSearchQuery { * document id to support showing just the chunk that contained the * hit. */ - if (hit.getContent() instanceof AbstractFile) { - AbstractFile file = (AbstractFile) hit.getContent(); + if (content instanceof AbstractFile) { + AbstractFile file = (AbstractFile) content; if (file.getType() == TskData.TSK_DB_FILES_TYPE_ENUM.UNUSED_BLOCKS || file.getType() == TskData.TSK_DB_FILES_TYPE_ENUM.UNALLOC_BLOCKS) { attributes.add(new BlackboardAttribute(KEYWORD_SEARCH_DOCUMENT_ID, MODULE_NAME, hit.getSolrDocumentId())); @@ -503,7 +484,7 @@ final class RegexQuery implements KeywordSearchQuery { * Create an account artifact. */ try { - newArtifact = hit.getContent().newArtifact(BlackboardArtifact.ARTIFACT_TYPE.TSK_ACCOUNT); + newArtifact = content.newArtifact(BlackboardArtifact.ARTIFACT_TYPE.TSK_ACCOUNT); } catch (TskCoreException ex) { LOGGER.log(Level.SEVERE, "Error adding artifact for account to blackboard", ex); //NON-NLS return null; diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/TermsComponentQuery.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/TermsComponentQuery.java index f4413e3f2a..210229c060 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/TermsComponentQuery.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/TermsComponentQuery.java @@ -42,6 +42,7 @@ import org.sleuthkit.datamodel.BlackboardArtifact; import org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE; import org.sleuthkit.datamodel.BlackboardAttribute; import org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE; +import org.sleuthkit.datamodel.Content; import org.sleuthkit.datamodel.TskCoreException; import org.sleuthkit.datamodel.TskData; @@ -332,10 +333,9 @@ final class TermsComponentQuery implements KeywordSearchQuery { * @return An object that wraps an artifact and a mapping by id of its * attributes. */ - // TODO: Are we actually making meaningful use of the KeywordCachedArtifact - // class? + @Override - public KeywordCachedArtifact writeSingleFileHitsToBlackBoard(Keyword foundKeyword, KeywordHit hit, String snippet, String listName) { + public KeywordCachedArtifact writeSingleFileHitsToBlackBoard(Content content, Keyword foundKeyword, KeywordHit hit, String snippet, String listName) { /* * Create either a "plain vanilla" keyword hit artifact with keyword and * regex attributes, or a credit card account artifact with attributes @@ -349,7 +349,7 @@ final class TermsComponentQuery implements KeywordSearchQuery { attributes.add(new BlackboardAttribute(ATTRIBUTE_TYPE.TSK_KEYWORD_REGEXP, MODULE_NAME, originalKeyword.getSearchTerm())); try { - newArtifact = hit.getContent().newArtifact(ARTIFACT_TYPE.TSK_KEYWORD_HIT); + newArtifact = content.newArtifact(ARTIFACT_TYPE.TSK_KEYWORD_HIT); } catch (TskCoreException ex) { LOGGER.log(Level.SEVERE, "Error adding artifact for keyword hit to blackboard", ex); //NON-NLS @@ -375,7 +375,7 @@ final class TermsComponentQuery implements KeywordSearchQuery { if (hit.isArtifactHit()) { LOGGER.log(Level.SEVERE, String.format("Failed to parse credit card account number for artifact keyword hit: term = %s, snippet = '%s', artifact id = %d", searchTerm, hit.getSnippet(), hit.getArtifact().getArtifactID())); //NON-NLS } else { - LOGGER.log(Level.SEVERE, String.format("Failed to parse credit card account number for content keyword hit: term = %s, snippet = '%s', object id = %d", searchTerm, hit.getSnippet(), hit.getContent().getId())); //NON-NLS + LOGGER.log(Level.SEVERE, String.format("Failed to parse credit card account number for content keyword hit: term = %s, snippet = '%s', object id = %d", searchTerm, hit.getSnippet(), hit.getContentID())); //NON-NLS } return null; } @@ -411,8 +411,8 @@ final class TermsComponentQuery implements KeywordSearchQuery { * document id to support showing just the chunk that contained the * hit. */ - if (hit.getContent() instanceof AbstractFile) { - AbstractFile file = (AbstractFile) hit.getContent(); + if (content instanceof AbstractFile) { + AbstractFile file = (AbstractFile)content; if (file.getType() == TskData.TSK_DB_FILES_TYPE_ENUM.UNUSED_BLOCKS || file.getType() == TskData.TSK_DB_FILES_TYPE_ENUM.UNALLOC_BLOCKS) { attributes.add(new BlackboardAttribute(KEYWORD_SEARCH_DOCUMENT_ID, MODULE_NAME, hit.getSolrDocumentId())); @@ -423,7 +423,7 @@ final class TermsComponentQuery implements KeywordSearchQuery { * Create an account artifact. */ try { - newArtifact = hit.getContent().newArtifact(ARTIFACT_TYPE.TSK_ACCOUNT); + newArtifact = content.newArtifact(ARTIFACT_TYPE.TSK_ACCOUNT); } catch (TskCoreException ex) { LOGGER.log(Level.SEVERE, "Error adding artifact for account to blackboard", ex); //NON-NLS return null; From 5fd3c4aa95acc075df4f003b0a1695a8cbee1d01 Mon Sep 17 00:00:00 2001 From: Ann Priestman Date: Tue, 15 Aug 2017 12:39:08 -0400 Subject: [PATCH 006/104] Use counts of files + message type artifacts to determine node counts/whether a node is a leaf node --- .../datamodel/AbstractContentNode.java | 23 ++++++++++++++++++- .../DirectoryTreeFilterChildren.java | 12 +++++----- .../DirectoryTreeFilterNode.java | 11 ++++++++- 3 files changed, 38 insertions(+), 8 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/AbstractContentNode.java b/Core/src/org/sleuthkit/autopsy/datamodel/AbstractContentNode.java index 82a8130c23..6d642e809b 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/AbstractContentNode.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/AbstractContentNode.java @@ -23,6 +23,7 @@ import java.util.logging.Level; import org.openide.util.lookup.Lookups; import org.openide.util.Lookup; +import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.datamodel.Content; import org.sleuthkit.datamodel.TskCoreException; @@ -84,6 +85,26 @@ public abstract class AbstractContentNode extends ContentNode return super.getName(); } + /** + * Return true if the underlying content object has children Useful for lazy + * loading. + * + * @return true if has children + */ + public boolean hasVisibleContentChildren() { + boolean hasChildren = false; + if (content != null) { + try { + if(0 < Case.getCurrentCase().getSleuthkitCase().getVisibleContentChildrenCount(content)){ + hasChildren = true; + } + } catch (TskCoreException ex) { + logger.log(Level.SEVERE, "Error checking if the node has children, for content: " + content, ex); //NON-NLS + } + } + return hasChildren; + } + /** * Return true if the underlying content object has children Useful for lazy * loading. @@ -103,7 +124,7 @@ public abstract class AbstractContentNode extends ContentNode return hasChildren; } - + /** * Return ids of children of the underlying content. The ids can be treated * as keys - useful for lazy loading. diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeFilterChildren.java b/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeFilterChildren.java index 9fbd6425dc..58f19e5d7a 100644 --- a/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeFilterChildren.java +++ b/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeFilterChildren.java @@ -25,6 +25,7 @@ import org.openide.nodes.Children; import org.sleuthkit.autopsy.datamodel.DirectoryNode; import org.openide.nodes.FilterNode; import org.openide.nodes.Node; +import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.datamodel.AbstractAbstractFileNode; import org.sleuthkit.autopsy.datamodel.BlackboardArtifactNode; import org.sleuthkit.autopsy.datamodel.DisplayableItemNode; @@ -120,7 +121,7 @@ class DirectoryTreeFilterChildren extends FilterNode.Children { && !((Directory) c).getName().equals(".."))) { ret = false; break; - } else if (c.hasChildren()) { + } else if (0 < Case.getCurrentCase().getSleuthkitCase().getVisibleContentChildrenCount(c)) { //fie has children, such as derived files ret = false; break; @@ -204,11 +205,11 @@ class DirectoryTreeFilterChildren extends FilterNode.Children { if ((childContent instanceof AbstractFile) && ((AbstractFile) childContent).isDir()) { return false; } else { - try { - if (childContent.hasChildren()) { + try{ + if(0 < Case.getCurrentCase().getSleuthkitCase().getVisibleContentChildrenCount(childContent)){ return false; } - } catch (TskCoreException e) { + } catch (TskCoreException e){ logger.log(Level.SEVERE, "Error checking if file node is leaf.", e); //NON-NLS } } @@ -244,7 +245,6 @@ class DirectoryTreeFilterChildren extends FilterNode.Children { @Override public Boolean visit(VirtualDirectoryNode vdn) { return visitDeep(vdn); - //return ! vdn.hasContentChildren(); } @Override @@ -286,7 +286,7 @@ class DirectoryTreeFilterChildren extends FilterNode.Children { @Override public Boolean visit(FileNode fn) { - return fn.hasContentChildren(); + return fn.hasVisibleContentChildren(); } @Override diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeFilterNode.java b/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeFilterNode.java index 81a704c57a..846ea1aa06 100755 --- a/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeFilterNode.java +++ b/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeFilterNode.java @@ -36,6 +36,7 @@ import org.sleuthkit.autopsy.datamodel.BlackboardArtifactNode; import org.sleuthkit.autopsy.ingest.runIngestModuleWizard.RunIngestModulesAction; import org.sleuthkit.datamodel.AbstractFile; import org.sleuthkit.datamodel.BlackboardArtifact; +import org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE; import org.sleuthkit.datamodel.Content; import org.sleuthkit.datamodel.Directory; import org.sleuthkit.datamodel.Image; @@ -120,7 +121,7 @@ class DirectoryTreeFilterNode extends FilterNode { private int getVisibleChildCount(AbstractFile file) throws TskCoreException { List childList = file.getChildren(); - int numVisibleChildren = file.getChildrenCount(); + int numVisibleChildren = childList.size(); boolean purgeKnownFiles = UserPreferences.hideKnownFilesInDataSourcesTree(); boolean purgeSlackFiles = UserPreferences.hideSlackFilesInDataSourcesTree(); @@ -134,6 +135,14 @@ class DirectoryTreeFilterNode extends FilterNode { || (purgeSlackFiles && childFile.getType() == TskData.TSK_DB_FILES_TYPE_ENUM.SLACK)) { numVisibleChildren--; } + } else if(child instanceof BlackboardArtifact){ + BlackboardArtifact bba = (BlackboardArtifact) child; + + // Only message type artifacts are displayed in the tree + if((bba.getArtifactTypeID() != ARTIFACT_TYPE.TSK_EMAIL_MSG.getTypeID()) + && (bba.getArtifactTypeID() != ARTIFACT_TYPE.TSK_MESSAGE.getTypeID())){ + numVisibleChildren--; + } } } } From 659d48f523b3438061c95a30d7a3d9bcb6c5b370 Mon Sep 17 00:00:00 2001 From: millmanorama Date: Tue, 15 Aug 2017 14:46:04 -0400 Subject: [PATCH 007/104] cleanup Javadoc --- .../autopsy/keywordsearch/RegexQuery.java | 22 +++++++++---------- 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/RegexQuery.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/RegexQuery.java index b8875a9c23..1d568f6afd 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/RegexQuery.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/RegexQuery.java @@ -389,11 +389,9 @@ final class RegexQuery implements KeywordSearchQuery { * attributes. */ @Override - public KeywordCachedArtifact writeSingleFileHitsToBlackBoard( Content content,Keyword foundKeyword, KeywordHit hit, String snippet, String listName) { + public KeywordCachedArtifact writeSingleFileHitsToBlackBoard(Content content, Keyword foundKeyword, KeywordHit hit, String snippet, String listName) { final String MODULE_NAME = KeywordSearchModuleFactory.getModuleName(); - - if (content == null) { LOGGER.log(Level.WARNING, "Error adding artifact for keyword hit to blackboard"); //NON-NLS return null; @@ -535,9 +533,9 @@ final class RegexQuery implements KeywordSearchQuery { * hit and turns them into artifact attributes. The track 1 data has the * same fields as the track two data, plus the account holder's name. * - * @param attributesMap A map of artifact attribute objects, used to avoid - * creating duplicate attributes. - * @param matcher A matcher for the snippet. + * @param attributeMap A map of artifact attribute objects, used to avoid + * creating duplicate attributes. + * @param matcher A matcher for the snippet. */ static private void parseTrack1Data(Map attributeMap, Matcher matcher) { parseTrack2Data(attributeMap, matcher); @@ -548,12 +546,12 @@ final class RegexQuery implements KeywordSearchQuery { * Creates an attribute of the the given type to the given artifact with a * value parsed from the snippet for a credit account number hit. * - * @param attributesMap A map of artifact attribute objects, used to avoid - * creating duplicate attributes. - * @param attrType The type of attribute to create. - * @param groupName The group name of the regular expression that was - * used to parse the attribute data. - * @param matcher A matcher for the snippet. + * @param attributeMap A map of artifact attribute objects, used to avoid + * creating duplicate attributes. + * @param attrType The type of attribute to create. + * @param groupName The group name of the regular expression that was + * used to parse the attribute data. + * @param matcher A matcher for the snippet. */ static private void addAttributeIfNotAlreadyCaptured(Map attributeMap, BlackboardAttribute.ATTRIBUTE_TYPE attrType, String groupName, Matcher matcher) { BlackboardAttribute.Type type = new BlackboardAttribute.Type(attrType); From 976952b52ea8670613b1e341b948ade968954c88 Mon Sep 17 00:00:00 2001 From: millmanorama Date: Wed, 16 Aug 2017 11:03:35 -0400 Subject: [PATCH 008/104] cleanup in KeywordHit --- .../autopsy/keywordsearch/KeywordHit.java | 59 +++++-------------- 1 file changed, 16 insertions(+), 43 deletions(-) diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordHit.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordHit.java index 3a51c38488..87ddac3d22 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordHit.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordHit.java @@ -18,6 +18,8 @@ */ package org.sleuthkit.autopsy.keywordsearch; +import java.util.Comparator; +import org.apache.commons.lang3.StringUtils; import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.datamodel.BlackboardArtifact; import org.sleuthkit.datamodel.SleuthkitCase; @@ -26,8 +28,8 @@ import org.sleuthkit.datamodel.TskCoreException; /** * Stores the fact that file or an artifact associated with a file had a keyword * hit. All instances make both the document id of the Solr document where the - * keyword was found and the file available to clients. Artifact keyword hits - * also make the artifact available to clients. + * keyword was found and the object Id available to clients. Artifact keyword + * hits also make the artifact available to clients. */ class KeywordHit implements Comparable { @@ -43,14 +45,9 @@ class KeywordHit implements Comparable { return hit; } - KeywordHit(String solrDocumentId, String snippet) throws TskCoreException { - this(solrDocumentId, snippet, null); - } - KeywordHit(String solrDocumentId, String snippet, String hit) throws TskCoreException { - /** - * Store the Solr document id. - */ + this.snippet = StringUtils.stripToEmpty(snippet); + this.hit = hit; this.solrDocumentId = solrDocumentId; /** @@ -71,26 +68,19 @@ class KeywordHit implements Comparable { this.chunkId = 0; } - /** - * Look up the artifact associated with the keyword hit if there is onw. - * If the high order bit of the object id is set, the hit was for an - * artifact. + /* + * If the high order bit of the object id is set (ie, it is negative), + * the hit was in an artifact, look up the artifact. */ - SleuthkitCase caseDb = Case.getCurrentCase().getSleuthkitCase(); - if (this.solrObjectId < 0) { + SleuthkitCase caseDb = Case.getCurrentCase().getSleuthkitCase(); this.artifact = caseDb.getBlackboardArtifact(this.solrObjectId); contentID = artifact.getObjectID(); } else { + //else the object id is for content. this.artifact = null; contentID = this.solrObjectId; } - - /** - * Store the text snippet. - */ - this.snippet = snippet; - this.hit = hit; } String getSolrDocumentId() { @@ -101,16 +91,12 @@ class KeywordHit implements Comparable { return this.solrObjectId; } - boolean hasChunkId() { - return this.chunkId != 0; - } - int getChunkId() { return this.chunkId; } boolean hasSnippet() { - return !this.snippet.isEmpty(); + return StringUtils.isNotBlank(this.snippet); } String getSnippet() { @@ -149,7 +135,7 @@ class KeywordHit implements Comparable { return false; } final KeywordHit other = (KeywordHit) obj; - return (this.solrObjectId == other.solrObjectId && this.chunkId == other.chunkId); + return this.compareTo(other) == 0; } @Override @@ -161,21 +147,8 @@ class KeywordHit implements Comparable { @Override public int compareTo(KeywordHit o) { - if (this.solrObjectId < o.solrObjectId) { - // Out object id is less than the other object id - return -1; - } else if (this.solrObjectId == o.solrObjectId) { - // Hits have same object id - if (this.chunkId < o.chunkId) { - // Our chunk id is lower than the other chunk id - return -1; - } else { - // Our chunk id is either greater than or equal to the other chunk id - return this.chunkId == o.chunkId ? 0 : 1; - } - } else { - // Our object id is greater than the other object id - return 1; - } + return Comparator.comparing(KeywordHit::getSolrObjectId) + .thenComparing(KeywordHit::getChunkId) + .compare(this, o); } } From 70339153e13e16e2992568c1e047b11869d04b26 Mon Sep 17 00:00:00 2001 From: "U-BASIS\\dgrove" Date: Wed, 16 Aug 2017 11:44:14 -0400 Subject: [PATCH 009/104] Sync --- .gitattributes | 0 .gitignore | 0 API-CHANGES.txt | 0 BUILDING.txt | 0 BootstrapIvy.xml | 0 .../Central Repository User Guide.pdf | Bin CentralRepository/ivy.xml | 0 CentralRepository/ivysettings.xml | 0 Core/autopsy-updates.xml | 0 Core/build.xml | 0 Core/ivy.xml | 0 Core/ivysettings.xml | 0 Core/manifest.mf | 0 Core/nbproject/build-impl.xml | 0 Core/nbproject/platform.properties | 0 Core/nbproject/project.properties | 0 Core/nbproject/project.xml | 0 Core/nbproject/suite.properties | 0 .../autopsy/actions/Bundle_ja.properties | 0 .../actions/GetTagNameAndCommentDialog.form | 0 .../actions/GetTagNameAndCommentDialog.java | 0 .../autopsy/actions/GetTagNameDialog.form | 0 .../autopsy/actions/GetTagNameDialog.java | 0 .../autopsy/actions/IngestRunningCheck.java | 0 .../actions/OpenOutputFolderAction.java | 0 .../autopsy/appservices/AutopsyService.java | 0 .../autopsy/casemodule/AddImageAction.java | 0 .../casemodule/AddImageErrorsDialog.form | 0 .../casemodule/AddImageErrorsDialog.java | 0 .../autopsy/casemodule/AddImageTask.java | 0 .../AddImageWizardAddingProgressPanel.java | 0 .../AddImageWizardAddingProgressVisual.form | 0 .../AddImageWizardAddingProgressVisual.java | 0 ...AddImageWizardDataSourceSettingsPanel.java | 0 ...ddImageWizardDataSourceSettingsVisual.form | 0 ...ddImageWizardDataSourceSettingsVisual.java | 0 .../AddImageWizardIngestConfigPanel.java | 0 .../AddImageWizardIngestConfigVisual.form | 0 .../AddImageWizardIngestConfigVisual.java | 0 .../casemodule/AddImageWizardIterator.java | 0 .../AddImageWizardSelectDspPanel.java | 0 .../AddImageWizardSelectDspVisual.form | 0 .../AddImageWizardSelectDspVisual.java | 0 .../autopsy/casemodule/AddLocalFilesTask.java | 0 .../autopsy/casemodule/Bundle.properties | 0 .../autopsy/casemodule/Bundle_ja.properties | 0 .../autopsy/casemodule/ButtonColumn.java | 0 .../sleuthkit/autopsy/casemodule/Case.java | 0 .../casemodule/CaseActionException.java | 0 .../autopsy/casemodule/CaseCloseAction.java | 0 .../autopsy/casemodule/CaseDeleteAction.java | 0 .../autopsy/casemodule/CaseMetadata.java | 0 .../autopsy/casemodule/CaseNewAction.java | 0 .../casemodule/CaseNewActionInterface.java | 0 .../autopsy/casemodule/CaseOpenAction.java | 0 .../casemodule/CasePropertiesAction.java | 0 .../casemodule/CasePropertiesPanel.form | 0 .../casemodule/CasePropertiesPanel.java | 0 .../casemodule/CollaborationMonitor.java | 0 .../autopsy/casemodule/CueBannerPanel.form | 0 .../autopsy/casemodule/CueBannerPanel.java | 0 .../autopsy/casemodule/GeneralFilter.java | 0 .../autopsy/casemodule/ImageDSProcessor.java | 0 .../autopsy/casemodule/ImageFilePanel.form | 0 .../autopsy/casemodule/ImageFilePanel.java | 0 .../casemodule/LocalDiskDSProcessor.java | 0 .../autopsy/casemodule/LocalDiskPanel.form | 0 .../autopsy/casemodule/LocalDiskPanel.java | 0 .../casemodule/LocalFilesDSProcessor.java | 0 .../autopsy/casemodule/LocalFilesPanel.form | 0 .../autopsy/casemodule/LocalFilesPanel.java | 0 .../casemodule/MissingImageDialog.form | 0 .../casemodule/MissingImageDialog.java | 0 .../casemodule/NewCaseVisualPanel1.form | 0 .../casemodule/NewCaseVisualPanel1.java | 0 .../casemodule/NewCaseVisualPanel2.form | 0 .../casemodule/NewCaseVisualPanel2.java | 0 .../casemodule/NewCaseWizardAction.java | 0 .../casemodule/NewCaseWizardPanel1.java | 0 .../casemodule/NewCaseWizardPanel2.java | 0 .../casemodule/OpenRecentCasePanel.form | 0 .../casemodule/OpenRecentCasePanel.java | 0 .../autopsy/casemodule/RecentCases.java | 0 .../autopsy/casemodule/RecentItems.java | 0 .../casemodule/SingleUserCaseConverter.java | 0 .../autopsy/casemodule/StartupWindow.java | 0 .../casemodule/StartupWindowInterface.java | 0 .../casemodule/StartupWindowProvider.java | 0 .../autopsy/casemodule/UpdateRecentCases.java | 0 .../autopsy/casemodule/addImage-icon.png | Bin .../autopsy/casemodule/btn_icon_add_image.png | Bin .../casemodule/btn_icon_close_case.png | Bin .../casemodule/btn_icon_create_new_case.png | Bin .../casemodule/btn_icon_open_existing.png | Bin .../casemodule/btn_icon_open_recent.png | Bin .../autopsy/casemodule/close-icon.png | Bin .../events/AddingDataSourceEvent.java | 0 .../events/AddingDataSourceFailedEvent.java | 0 .../BlackBoardArtifactTagAddedEvent.java | 0 .../BlackBoardArtifactTagDeletedEvent.java | 0 .../events/ContentTagAddedEvent.java | 0 .../events/ContentTagDeletedEvent.java | 0 .../events/DataSourceAddedEvent.java | 0 .../casemodule/events/ReportAddedEvent.java | 0 .../casemodule/events/TagAddedEvent.java | 0 .../casemodule/events/TagDeletedEvent.java | 0 .../sleuthkit/autopsy/casemodule/package.dox | 0 .../casemodule/services/Blackboard.java | 0 .../casemodule/services/Bundle.properties | 0 .../casemodule/services/Bundle_ja.properties | 0 .../casemodule/services/FileManager.java | 0 .../casemodule/services/TagNameDefiniton.java | 0 .../autopsy/casemodule/welcome_logo.png | Bin .../centralrepository/Bundle.properties | 0 .../README-POSTGRES-TESTING.md | 0 .../README_MONGODB_TESTING.md | 0 .../actions/Bundle.properties | 0 .../actions/EamCaseEditDetailsDialog.form | 0 .../actions/EamCaseEditDetailsDialog.java | 0 .../actions/EamEditCaseInfoAction.java | 0 .../contentviewer/Bundle.properties | 0 .../DataContentViewerOtherCases.form | 0 .../DataContentViewerOtherCases.java | 0 ...tentViewerOtherCasesTableCellRenderer.java | 0 ...DataContentViewerOtherCasesTableModel.java | 0 .../datamodel/AbstractSqlEamDb.java | 0 .../datamodel/EamArtifact.java | 0 .../datamodel/EamArtifactInstance.java | 0 .../datamodel/EamArtifactUtil.java | 0 .../centralrepository/datamodel/EamCase.java | 0 .../datamodel/EamDataSource.java | 0 .../centralrepository/datamodel/EamDb.java | 0 .../datamodel/EamDbException.java | 0 .../datamodel/EamDbPlatformEnum.java | 0 .../datamodel/EamDbUtil.java | 0 .../datamodel/EamGlobalFileInstance.java | 0 .../datamodel/EamGlobalSet.java | 0 .../datamodel/EamOrganization.java | 0 .../datamodel/PostgresEamDb.java | 0 .../datamodel/PostgresEamDbSettings.java | 0 .../datamodel/SqliteEamDb.java | 0 .../datamodel/SqliteEamDbSettings.java | 0 .../eventlisteners/BadFileTagRunner.java | 0 .../eventlisteners/CaseEventListener.java | 0 .../eventlisteners/IngestEventsListener.java | 0 .../eventlisteners/Installer.java | 0 .../eventlisteners/NewArtifactsRunner.java | 0 .../autopsy/centralrepository/images/bad.png | Bin .../autopsy/centralrepository/images/good.png | Bin .../centralrepository/images/import16.png | Bin .../centralrepository/images/options-icon.png | Bin .../ingestmodule/IngestModule.java | 0 .../ingestmodule/IngestModuleFactory.java | 0 .../license-centralrepository.txt | 0 .../AddNewOrganizationDialog.form | 0 .../AddNewOrganizationDialog.java | 0 .../optionspanel/Bundle.properties | 0 .../optionspanel/EamDbSettingsDialog.form | 0 .../optionspanel/EamDbSettingsDialog.java | 0 .../EamOptionsPanelController.java | 0 .../optionspanel/GlobalSettingsPanel.form | 0 .../optionspanel/GlobalSettingsPanel.java | 0 .../ImportHashDatabaseDialog.form | 0 .../ImportHashDatabaseDialog.java | 0 .../ManageCorrelationPropertiesDialog.form | 0 .../ManageCorrelationPropertiesDialog.java | 0 .../optionspanel/ManageTagsDialog.form | 0 .../optionspanel/ManageTagsDialog.java | 0 .../autopsy/contentviewers/Bundle.properties | 0 .../contentviewers/Bundle_ja.properties | 0 .../CoordinationService.java | 0 .../CoordinationServiceNamespace.java | 0 .../sleuthkit/autopsy/core/Bundle.properties | 0 .../autopsy/core/Bundle_ja.properties | 0 .../core/DataContentTopComponentSettings.xml | 0 .../core/DataContentTopComponentWstcref.xml | 0 .../DirectoryTreeTopComponentSettings.xml | 0 .../core/DirectoryTreeTopComponentWstcref.xml | 0 .../core/FileSearchTopComponentSettings.xml | 0 .../core/FileSearchTopComponentWstcref.xml | 0 .../IngestMessageTopComponentSettings.xml | 0 .../core/IngestMessageTopComponentWstcref.xml | 0 .../org/sleuthkit/autopsy/core/Installer.java | 0 .../autopsy/core/RuntimeProperties.java | 0 .../autopsy/core/ServicesMonitor.java | 0 .../core/UserPreferencesException.java | 0 .../autopsy/core/dockedBottomWsmode.xml | 0 .../autopsy/core/events/ServiceEvent.java | 0 .../sleuthkit/autopsy/core/explorerWsmode.xml | 0 .../autopsy/core/floatingLeftBottomWsmode.xml | 0 Core/src/org/sleuthkit/autopsy/core/layer.xml | 0 ...kit_autopsy_core_update_centerSettings.xml | 0 .../autopsy/core/outputFloatWsmode.xml | 0 .../BlackboardResultViewer.java | 0 .../corecomponentinterfaces/Bundle.properties | 0 .../Bundle_ja.properties | 0 .../CoreComponentControl.java | 0 .../corecomponentinterfaces/DataContent.java | 0 .../DataContentViewer.java | 0 .../corecomponentinterfaces/DataExplorer.java | 0 .../corecomponentinterfaces/DataResult.java | 0 .../DataResultViewer.java | 0 .../DataSourceProcessor.java | 0 .../DataSourceProcessorCallback.java | 0 .../DataSourceProcessorProgressMonitor.java | 0 .../corecomponentinterfaces/package.dox | 0 .../corecomponents/AboutWindowAction.java | 0 .../corecomponents/AboutWindowPanel.form | 0 .../corecomponents/AboutWindowPanel.java | 0 .../AbstractDataResultViewer.java | 0 .../AdvancedConfigurationCleanDialog.form | 0 .../AdvancedConfigurationCleanDialog.java | 0 .../AdvancedConfigurationDialog.form | 0 .../AdvancedConfigurationDialog.java | 0 .../corecomponents/AutopsyOptionsPanel.form | 0 .../corecomponents/AutopsyOptionsPanel.java | 0 .../AutopsyOptionsPanelController.java | 0 .../autopsy/corecomponents/Bundle.properties | 0 .../corecomponents/CriterionChooser.form | 0 .../corecomponents/CriterionChooser.java | 0 .../corecomponents/DataContentPanel.form | 0 .../corecomponents/DataContentPanel.java | 0 .../DataContentTopComponent.form | 0 .../DataContentTopComponent.java | 0 .../DataContentViewerArtifact.form | 0 .../DataContentViewerArtifact.java | 0 .../corecomponents/DataContentViewerHex.form | 0 .../corecomponents/DataContentViewerHex.java | 0 .../DataContentViewerMedia.form | 0 .../DataContentViewerMedia.java | 0 .../DataContentViewerString.form | 0 .../DataContentViewerString.java | 0 .../corecomponents/DataResultPanel.form | 0 .../corecomponents/DataResultPanel.java | 0 .../DataResultTopComponent.form | 0 .../DataResultTopComponent.java | 0 .../corecomponents/DataResultViewerTable.form | 0 .../corecomponents/DataResultViewerTable.java | 0 .../DataResultViewerThumbnail.form | 0 .../DataResultViewerThumbnail.java | 0 .../autopsy/corecomponents/FXVideoPanel.form | 0 .../autopsy/corecomponents/FXVideoPanel.java | 0 .../autopsy/corecomponents/FrameCapture.java | 0 .../autopsy/corecomponents/GstVideoPanel.form | 0 .../autopsy/corecomponents/GstVideoPanel.java | 0 .../autopsy/corecomponents/Installer.java | 0 .../corecomponents/MediaViewImagePanel.css | 0 .../corecomponents/MediaViewImagePanel.form | 0 .../corecomponents/MediaViewImagePanel.java | 0 .../corecomponents/MediaViewVideoPanel.java | 0 .../MultiUserSettingsPanel.form | 0 .../MultiUserSettingsPanel.java | 0 .../MultiUserSettingsPanelController.java | 0 .../corecomponents/NoTabsTabDisplayerUI.java | 0 .../corecomponents/OfflineHelpAction.java | 0 .../corecomponents/OnlineHelpAction.java | 0 .../autopsy/corecomponents/OptionsPanel.java | 0 .../ResultViewerPersistence.java | 0 .../autopsy/corecomponents/SortChooser.form | 0 .../autopsy/corecomponents/SortChooser.java | 0 .../corecomponents/TableFilterChildren.java | 0 .../corecomponents/TableFilterNode.java | 0 .../autopsy/corecomponents/TextPrompt.java | 0 .../corecomponents/ThumbnailViewChildren.java | 0 .../autopsy/corecomponents/VideoFrame.java | 0 .../autopsy/corecomponents/arrow_left.gif | Bin .../autopsy/corecomponents/arrow_right.gif | Bin .../autopsy/corecomponents/btn_step_back.png | Bin .../corecomponents/btn_step_back_disabled.png | Bin .../corecomponents/btn_step_back_hover.png | Bin .../corecomponents/btn_step_forward.png | Bin .../btn_step_forward_disabled.png | Bin .../corecomponents/btn_step_forward_hover.png | Bin .../autopsy/corecomponents/checkbox24.png | Bin .../autopsy/corecomponents/checkbox32.png | Bin .../corecomponents/general-options.png | Bin .../autopsy/corecomponents/package.dox | 0 .../coreutils/AutopsyExceptionHandler.java | 0 .../autopsy/coreutils/Bundle.properties | 0 .../autopsy/coreutils/Bundle_ja.properties | 0 .../autopsy/coreutils/ColorUtilities.java | 0 .../autopsy/coreutils/DataSourceUtils.java | 0 .../autopsy/coreutils/DriveUtils.java | 0 .../autopsy/coreutils/EscapeUtil.java | 0 .../sleuthkit/autopsy/coreutils/ExecUtil.java | 0 .../sleuthkit/autopsy/coreutils/FileUtil.java | 0 .../sleuthkit/autopsy/coreutils/History.java | 0 .../autopsy/coreutils/Installer.java | 0 .../org/sleuthkit/autopsy/coreutils/JLNK.java | 0 .../autopsy/coreutils/JLnkParser.java | 0 .../sleuthkit/autopsy/coreutils/LnkEnums.java | 0 .../autopsy/coreutils/LocalDisk.java | 0 .../sleuthkit/autopsy/coreutils/LogIcon.png | Bin .../autopsy/coreutils/LoggedTask.java | 0 .../sleuthkit/autopsy/coreutils/Logger.java | 0 .../autopsy/coreutils/MessageNotifyUtil.java | 0 .../autopsy/coreutils/ModuleSettings.java | 0 .../autopsy/coreutils/NetworkUtils.java | 0 .../autopsy/coreutils/PathValidator.java | 0 .../autopsy/coreutils/PlatformUtil.java | 0 .../autopsy/coreutils/SQLiteDBConnect.java | 0 .../autopsy/coreutils/StopWatch.java | 0 .../autopsy/coreutils/StringExtract.java | 0 .../coreutils/StringExtract.properties | 0 .../autopsy/coreutils/TestLogger.java | 0 .../autopsy/coreutils/TextConverter.java | 0 .../coreutils/TextConverterException.java | 0 .../sleuthkit/autopsy/coreutils/TextUtil.java | 0 .../autopsy/coreutils/ThreadConfined.java | 0 .../autopsy/coreutils/TimeZoneUtils.java | 0 .../autopsy/coreutils/UNCPathUtilities.java | 0 .../sleuthkit/autopsy/coreutils/Version.java | 0 .../autopsy/coreutils/VideoUtils.java | 0 .../autopsy/coreutils/Win32Process.java | 0 .../sleuthkit/autopsy/coreutils/XMLUtil.java | 0 .../datamodel/AbstractAbstractFileNode.java | 0 .../datamodel/AbstractContentChildren.java | 0 .../datamodel/AbstractContentNode.java | 0 .../datamodel/AbstractFsContentNode.java | 0 .../datamodel/ArtifactStringContent.java | 0 .../autopsy/datamodel/AutopsyItemVisitor.java | 0 .../datamodel/AutopsyVisitableItem.java | 0 .../datamodel/BlackboardArtifactNode.java | 0 .../autopsy/datamodel/Bundle.properties | 0 .../autopsy/datamodel/Bundle_ja.properties | 0 .../autopsy/datamodel/ContentChildren.java | 0 .../autopsy/datamodel/ContentNode.java | 0 .../autopsy/datamodel/ContentNodeVisitor.java | 0 .../autopsy/datamodel/ContentUtils.java | 0 .../autopsy/datamodel/CreditCards.java | 0 .../autopsy/datamodel/DataConversion.java | 0 .../datamodel/DataModelActionsFactory.java | 0 .../autopsy/datamodel/DataSources.java | 0 .../autopsy/datamodel/DataSourcesNode.java | 0 .../autopsy/datamodel/DeletedContent.java | 0 .../datamodel/DisplayableItemNode.java | 0 .../datamodel/DisplayableItemNodeVisitor.java | 0 .../autopsy/datamodel/EmailExtracted.java | 0 .../autopsy/datamodel/EmptyNode.java | 0 .../autopsy/datamodel/ExtractedContent.java | 0 .../sleuthkit/autopsy/datamodel/FileSize.java | 0 .../autopsy/datamodel/FileTypeExtensions.java | 0 .../autopsy/datamodel/FileTypes.java | 0 .../datamodel/FileTypesByExtension.java | 0 .../datamodel/FileTypesByMimeType.java | 0 .../autopsy/datamodel/FilterNodeLeaf.java | 0 .../autopsy/datamodel/HashsetHits.java | 0 .../autopsy/datamodel/ImageNode.java | 0 .../autopsy/datamodel/Installer.java | 0 .../autopsy/datamodel/InterestingHits.java | 0 .../sleuthkit/autopsy/datamodel/KeyValue.java | 0 .../autopsy/datamodel/KeyValueNode.java | 0 .../autopsy/datamodel/KeywordHits.java | 0 .../autopsy/datamodel/LayoutFileNode.java | 0 .../autopsy/datamodel/LocalDirectoryNode.java | 0 .../autopsy/datamodel/LocalFileNode.java | 0 .../autopsy/datamodel/NodeProperty.java | 0 .../autopsy/datamodel/RecentFiles.java | 0 .../datamodel/RecentFilesChildren.java | 0 .../datamodel/RecentFilesFilterChildren.java | 0 .../datamodel/RecentFilesFilterNode.java | 0 .../autopsy/datamodel/RecentFilesNode.java | 0 .../sleuthkit/autopsy/datamodel/Results.java | 0 .../autopsy/datamodel/ResultsNode.java | 0 .../datamodel/RootContentChildren.java | 0 .../autopsy/datamodel/SlackFileNode.java | 0 .../datamodel/SpecialDirectoryNode.java | 0 .../autopsy/datamodel/StringContent.java | 0 .../datamodel/ViewTaggedArtifactAction.java | 0 .../sleuthkit/autopsy/datamodel/Views.java | 0 .../autopsy/datamodel/ViewsNode.java | 0 .../datamodel/VirtualDirectoryNode.java | 0 .../autopsy/datamodel/VolumeNode.java | 0 .../autopsy/datamodel/accounts/Accounts.java | 0 .../autopsy/datamodel/accounts/BINRange.java | 0 .../sleuthkit/autopsy/datamodel/package.dox | 0 .../datasourceprocessors/AddRawImageTask.java | 0 .../AutoIngestDataSourceProcessor.java | 0 .../datasourceprocessors/RawDSProcessor.java | 0 .../autopsy/diagnostics/Bundle_ja.properties | 0 .../autopsy/directorytree/Bundle.properties | 0 .../directorytree/Bundle_ja.properties | 0 .../directorytree/ChangeViewAction.java | 0 .../autopsy/directorytree/CollapseAction.java | 0 .../DirectoryTreeFilterChildren.java | 0 .../DirectoryTreeTopComponent.form | 0 .../DirectoryTreeTopComponent.java | 0 .../directorytree/ExternalViewerAction.java | 0 .../autopsy/directorytree/ExtractAction.java | 0 .../directorytree/ExtractUnallocAction.java | 0 .../directorytree/FileSearchAction.java | 0 .../directorytree/FileSearchProvider.java | 0 .../directorytree/FileSystemDetailsPanel.form | 0 .../directorytree/FileSystemDetailsPanel.java | 0 .../directorytree/HashSearchAction.java | 0 .../directorytree/HashSearchProvider.java | 0 .../directorytree/ImageDetailsPanel.form | 0 .../directorytree/ImageDetailsPanel.java | 0 .../directorytree/NewWindowViewAction.java | 0 .../directorytree/SelectionContext.java | 0 .../ViewAssociatedContentAction.java | 0 .../directorytree/ViewContextAction.java | 0 .../ViewSourceArtifactAction.java | 0 .../directorytree/VolumeDetailsPanel.form | 0 .../directorytree/VolumeDetailsPanel.java | 0 .../autopsy/directorytree/arrow_left.gif | Bin .../autopsy/directorytree/arrow_right.gif | Bin .../autopsy/directorytree/back-button.png | Bin .../autopsy/directorytree/btn_step_back.png | Bin .../directorytree/btn_step_back_disabled.png | Bin .../directorytree/btn_step_back_hover.png | Bin .../directorytree/btn_step_forward.png | Bin .../btn_step_forward_disabled.png | Bin .../directorytree/btn_step_forward_hover.png | Bin .../autopsy/directorytree/forward-button.png | Bin .../autopsy/directorytree/package.dox | 0 .../autopsy/events/AutopsyEvent.java | 0 .../autopsy/events/AutopsyEventException.java | 0 .../autopsy/events/AutopsyEventPublisher.java | 0 .../autopsy/events/Bundle_ja.properties | 0 .../autopsy/events/LocalEventPublisher.java | 0 .../events/MessageServiceConnectionInfo.java | 0 .../autopsy/events/RemoteEventPublisher.java | 0 .../autopsy/externalresults/Bundle.properties | 0 .../externalresults/Bundle_ja.properties | 0 .../externalresults/ExternalResults.java | 0 .../ExternalResultsImporter.java | 0 .../ExternalResultsXMLParser.java | 0 .../autopsy_external_results.xsd | 0 .../filesearch/AbstractFileSearchFilter.java | 0 .../autopsy/filesearch/Bundle.properties | 0 .../autopsy/filesearch/Bundle_ja.properties | 0 .../autopsy/filesearch/DateSearchFilter.java | 0 .../autopsy/filesearch/DateSearchPanel.form | 0 .../autopsy/filesearch/DateSearchPanel.java | 0 .../autopsy/filesearch/FileSearchAction.java | 0 .../autopsy/filesearch/FileSearchDialog.form | 0 .../autopsy/filesearch/FileSearchDialog.java | 0 .../autopsy/filesearch/FileSearchFilter.java | 0 .../autopsy/filesearch/FileSearchPanel.form | 0 .../autopsy/filesearch/FileSearchPanel.java | 0 .../autopsy/filesearch/FilterArea.java | 0 .../filesearch/KnownStatusSearchFilter.java | 0 .../filesearch/KnownStatusSearchPanel.form | 0 .../filesearch/KnownStatusSearchPanel.java | 0 .../autopsy/filesearch/NameSearchFilter.java | 0 .../autopsy/filesearch/NameSearchPanel.form | 0 .../autopsy/filesearch/NameSearchPanel.java | 0 .../autopsy/filesearch/SearchChildren.java | 0 .../autopsy/filesearch/SearchNode.java | 0 .../autopsy/filesearch/SizeSearchFilter.java | 0 .../autopsy/filesearch/SizeSearchPanel.form | 0 .../autopsy/filesearch/SizeSearchPanel.java | 0 .../autopsy/filesearch/arrow_down.gif | Bin .../autopsy/filesearch/arrow_right.gif | Bin .../sleuthkit/autopsy/images/Bluetooth.png | Bin .../sleuthkit/autopsy/images/Folder-icon.png | Bin .../images/User-Group-icon-green32.png | Bin .../autopsy/images/account-icon-16.png | Bin .../org/sleuthkit/autopsy/images/accounts.png | Bin .../autopsy/images/addImage-icon.png | Bin .../sleuthkit/autopsy/images/archive-file.png | Bin .../autopsy/images/artifact-icon.png | Bin .../sleuthkit/autopsy/images/audio-file.png | Bin .../src/org/sleuthkit/autopsy/images/bank.png | Bin .../autopsy/images/blue-tag-icon-16.png | Bin .../sleuthkit/autopsy/images/bookmarks.png | Bin .../org/sleuthkit/autopsy/images/calendar.png | Bin .../org/sleuthkit/autopsy/images/calllog.png | Bin .../autopsy/images/camera-icon-16.png | Bin .../autopsy/images/carved-file-icon-16.png | Bin .../sleuthkit/autopsy/images/close-icon.png | Bin .../org/sleuthkit/autopsy/images/computer.png | Bin .../org/sleuthkit/autopsy/images/contact.png | Bin .../org/sleuthkit/autopsy/images/cookies.png | Bin .../autopsy/images/credit-card-green.png | Bin .../sleuthkit/autopsy/images/credit-card.png | Bin .../sleuthkit/autopsy/images/credit-cards.png | Bin .../sleuthkit/autopsy/images/cross-script.png | Bin .../org/sleuthkit/autopsy/images/doc-file.png | Bin .../sleuthkit/autopsy/images/downloads.png | Bin .../autopsy/images/error-icon-16.png | Bin .../org/sleuthkit/autopsy/images/exe-file.png | Bin .../org/sleuthkit/autopsy/images/export16.png | Bin .../org/sleuthkit/autopsy/images/external.png | Bin .../autopsy/images/extracted_content.png | Bin .../autopsy/images/file-filter-icon.png | Bin .../autopsy/images/file-icon-deleted.png | Bin .../sleuthkit/autopsy/images/file-icon.png | Bin .../sleuthkit/autopsy/images/file-size-16.png | Bin .../images/file_ingest_filter32x32.png | Bin .../sleuthkit/autopsy/images/file_types.png | Bin .../autopsy/images/fileset-icon-16.png | Bin .../autopsy/images/folder-icon-16.png | Bin .../autopsy/images/folder-icon-deleted.png | Bin .../autopsy/images/folder-icon-virtual.png | Bin .../autopsy/images/folder-local-icon-16.png | Bin .../autopsy/images/gps-lastlocation.png | Bin .../sleuthkit/autopsy/images/gps-search.png | Bin .../autopsy/images/gps-trackpoint.png | Bin .../org/sleuthkit/autopsy/images/gpsfav.png | Bin .../autopsy/images/green-tag-icon-16.png | Bin .../autopsy/images/hard-drive-icon.jpg | Bin .../sleuthkit/autopsy/images/hashset_hits.png | Bin .../org/sleuthkit/autopsy/images/history.png | Bin .../sleuthkit/autopsy/images/image-file.png | Bin .../org/sleuthkit/autopsy/images/image.png | Bin .../org/sleuthkit/autopsy/images/import16.png | Bin .../sleuthkit/autopsy/images/info-icon-16.png | Bin .../autopsy/images/interesting_item.png | Bin .../sleuthkit/autopsy/images/keyword_hits.png | Bin .../sleuthkit/autopsy/images/mail-icon-16.png | Bin .../org/sleuthkit/autopsy/images/message.png | Bin .../sleuthkit/autopsy/images/mismatch-16.png | Bin .../org/sleuthkit/autopsy/images/new-icon.png | Bin .../org/sleuthkit/autopsy/images/new16.png | Bin .../sleuthkit/autopsy/images/open-icon.png | Bin .../org/sleuthkit/autopsy/images/pdf-file.png | Bin .../org/sleuthkit/autopsy/images/programs.png | Bin .../sleuthkit/autopsy/images/recent_docs.png | Bin .../sleuthkit/autopsy/images/recent_files.png | Bin .../org/sleuthkit/autopsy/images/results.png | Bin .../sleuthkit/autopsy/images/save-icon.png | Bin .../sleuthkit/autopsy/images/searchquery.png | Bin .../autopsy/images/speeddialentry.png | Bin .../autopsy/images/star-bookmark-icon-16.png | Bin .../images/tag-folder-blue-icon-16.png | Bin .../sleuthkit/autopsy/images/text-file.png | Bin .../sleuthkit/autopsy/images/usb_devices.png | Bin .../sleuthkit/autopsy/images/video-file.png | Bin .../org/sleuthkit/autopsy/images/views.png | Bin .../org/sleuthkit/autopsy/images/vol-icon.png | Bin .../autopsy/images/warning-icon-16.png | Bin .../org/sleuthkit/autopsy/images/web-file.png | Bin .../autopsy/images/working_spinner.gif | Bin .../autopsy/imagewriter/Bundle.properties | 0 .../autopsy/imagewriter/ImageWriter.java | 0 .../imagewriter/ImageWriterService.java | 0 .../imagewriter/ImageWriterSettings.java | 0 .../autopsy/ingest/Bundle_ja.properties | 0 .../DataSourceIngestCancellationPanel.form | 0 .../DataSourceIngestCancellationPanel.java | 0 .../autopsy/ingest/DataSourceIngestJob.java | 0 ...taSourceIngestModuleProcessTerminator.java | 0 .../DataSourceIngestModuleProgress.java | 0 .../FileIngestModuleProcessTerminator.java | 0 .../ingest/GetFilesContentVisitor.java | 0 .../sleuthkit/autopsy/ingest/IngestJob.java | 0 .../autopsy/ingest/IngestJobConfigurator.java | 0 .../autopsy/ingest/IngestJobSettings.java | 0 .../ingest/IngestJobSettingsPanel.form | 0 .../ingest/IngestJobSettingsPanel.java | 0 .../autopsy/ingest/IngestManager.java | 0 .../autopsy/ingest/IngestMessage.java | 0 .../ingest/IngestMessageDetailsPanel.form | 0 .../ingest/IngestMessageDetailsPanel.java | 0 .../ingest/IngestMessageMainPanel.form | 0 .../ingest/IngestMessageMainPanel.java | 0 .../autopsy/ingest/IngestMessagePanel.form | 0 .../autopsy/ingest/IngestMessagePanel.java | 0 .../ingest/IngestMessageTopComponent.form | 0 .../ingest/IngestMessageTopComponent.java | 0 .../autopsy/ingest/IngestMessagesAction.java | 0 .../autopsy/ingest/IngestMessagesToolbar.form | 0 .../autopsy/ingest/IngestMessagesToolbar.java | 0 .../ingest/IngestModuleFactoryLoader.java | 0 .../ingest/IngestModuleReferenceCounter.java | 0 .../autopsy/ingest/IngestMonitor.java | 0 .../autopsy/ingest/IngestOptionsPanel.form | 0 .../autopsy/ingest/IngestOptionsPanel.java | 0 .../ingest/IngestOptionsPanelController.java | 0 .../autopsy/ingest/IngestProfiles.java | 0 .../autopsy/ingest/IngestServices.java | 0 .../autopsy/ingest/IngestSettingsPanel.form | 0 .../autopsy/ingest/IngestSettingsPanel.java | 0 .../sleuthkit/autopsy/ingest/Installer.java | 0 .../autopsy/ingest/ModuleContentEvent.java | 0 .../autopsy/ingest/ModuleDataEvent.java | 0 .../autopsy/ingest/PipelineConfig.xml | 0 .../autopsy/ingest/PipelineConfigSchema.xsd | 0 .../autopsy/ingest/ProcTerminationCode.java | 0 .../autopsy/ingest/ProfilePanel.form | 0 .../autopsy/ingest/ProfilePanel.java | 0 .../autopsy/ingest/ProfileSettingsPanel.form | 0 .../autopsy/ingest/ProfileSettingsPanel.java | 0 .../autopsy/ingest/btn_step_back.png | Bin .../autopsy/ingest/btn_step_back_hover.png | Bin .../ingest/events/BlackboardPostEvent.java | 0 .../ingest/events/ContentChangedEvent.java | 0 .../DataSourceAnalysisCompletedEvent.java | 0 .../events/DataSourceAnalysisEvent.java | 0 .../DataSourceAnalysisStartedEvent.java | 0 .../ingest/events/FileAnalyzedEvent.java | 0 .../autopsy/ingest/eye-bw-25-rollover.png | Bin .../sleuthkit/autopsy/ingest/eye-bw-25.png | Bin .../org/sleuthkit/autopsy/ingest/goto_dir.png | Bin .../org/sleuthkit/autopsy/ingest/goto_res.png | Bin .../org/sleuthkit/autopsy/ingest/package.dox | 0 .../runIngestModuleWizard/Bundle.properties | 0 .../Bundle_ja.properties | 0 .../IngestModulesConfigWizardPanel.java | 0 .../IngestProfileSelectionPanel.form | 0 .../IngestProfileSelectionPanel.java | 0 .../IngestProfileSelectionWizardPanel.java | 0 .../RunIngestModulesWizardIterator.java | 0 .../ShortcutWizardDescriptorPanel.java | 0 .../KeywordSearchService.java | 0 .../autopsy/menuactions/Bundle.properties | 0 .../autopsy/menuactions/Bundle_ja.properties | 0 .../menuactions/DataContentDynamicMenu.java | 0 .../autopsy/menuactions/DataContentMenu.java | 0 .../menuactions/DataExplorerDynamicMenu.java | 0 .../autopsy/menuactions/DataExplorerMenu.java | 0 .../autopsy/menuactions/DataResultMenu.java | 0 .../menuactions/OpenTopComponentAction.java | 0 .../autopsy/menuactions/SearchResultMenu.java | 0 .../autopsy/menuactions/SpacerPanel.java | 0 .../modules/e01verify/Bundle_ja.properties | 0 .../embeddedfileextractor/Bundle.properties | 0 .../Bundle_ja.properties | 0 .../EmbeddedFileExtractorIngestModule.java | 0 .../SevenZipContentReadStream.java | 0 .../SevenZipExtractor.java | 0 .../autopsy/modules/exif/Bundle.properties | 0 .../autopsy/modules/exif/Bundle_ja.properties | 0 .../exif/ExifParserFileIngestModule.java | 0 .../sleuthkit/autopsy/modules/exif/layer.xml | 0 .../AddFileExtensionAction.java | 0 .../modules/fileextmismatch/Bundle.properties | 0 .../fileextmismatch/Bundle_ja.properties | 0 ...ExtMismatchContextMenuActionsProvider.java | 0 .../FileExtMismatchIngestModule.java | 0 .../FileExtMismatchModuleSettingsPanel.form | 0 .../FileExtMismatchModuleSettingsPanel.java | 0 ...FileExtMismatchOptionsPanelController.java | 0 .../FileExtMismatchSettingsPanel.form | 0 .../FileExtMismatchSettingsPanel.java | 0 .../fileextmismatch/MismatchConfigSchema.xsd | 0 .../fileextmismatch/mismatch_config.xml | 0 .../modules/fileextmismatch/options-icon.png | Bin .../modules/fileextmismatch/save16.png | Bin .../modules/filetypeid/Bundle.properties | 0 .../modules/filetypeid/Bundle_ja.properties | 0 .../filetypeid/CustomFileTypesManager.java | 0 .../autopsy/modules/filetypeid/FileType.java | 0 .../modules/filetypeid/FileTypeDetector.java | 0 .../FileTypeIdGlobalSettingsPanel.form | 0 .../FileTypeIdGlobalSettingsPanel.java | 0 .../filetypeid/FileTypeIdIngestModule.java | 0 .../filetypeid/FileTypeIdModuleSettings.java | 0 .../FileTypeIdOptionsPanelController.java | 0 .../autopsy/modules/filetypeid/FileTypes.xsd | 0 .../filetypeid/TikaFileTypeDetector.java | 0 .../user-defined-file-types-settings.png | Bin .../autopsy/modules/filetypeid/warning16.png | Bin .../modules/hashdatabase/Bundle.properties | 0 .../modules/hashdatabase/Bundle_ja.properties | 0 .../HashDatabaseOptionsPanelController.java | 0 .../HashDbCreateDatabaseDialog.form | 0 .../HashDbCreateDatabaseDialog.java | 0 .../HashDbImportDatabaseDialog.form | 0 .../HashDbImportDatabaseDialog.java | 0 .../hashdatabase/HashDbIngestModule.java | 0 .../hashdatabase/HashDbPanelSearchAction.java | 0 .../hashdatabase/HashDbSearchAction.java | 0 .../hashdatabase/HashDbSearchManager.java | 0 .../hashdatabase/HashDbSearchPanel.form | 0 .../hashdatabase/HashDbSearchPanel.java | 0 .../HashDbSearchResultFactory.java | 0 .../hashdatabase/HashDbSearchThread.java | 0 .../modules/hashdatabase/HashDbSearcher.java | 0 .../HashLookupModuleSettingsPanel.form | 0 .../HashLookupModuleSettingsPanel.java | 0 .../hashdatabase/HashLookupSettingsPanel.form | 0 .../hashdatabase/HashLookupSettingsPanel.java | 0 .../modules/hashdatabase/ModalNoButtons.form | 0 .../modules/hashdatabase/ModalNoButtons.java | 0 .../hashdatabase/btn_icon_create_new_16.png | Bin .../autopsy/modules/hashdatabase/delete16.png | Bin .../autopsy/modules/hashdatabase/import16.png | Bin .../autopsy/modules/hashdatabase/layer.xml | 0 .../autopsy/modules/hashdatabase/new16.png | Bin .../modules/hashdatabase/options-icon.png | Bin .../modules/hashdatabase/options_icon.png | Bin .../modules/hashdatabase/warning16.png | Bin .../autopsy/modules/iOS/Bundle_ja.properties | 0 .../interestingitems/FileSetsDefinitions.java | 0 .../photoreccarver/Bundle_ja.properties | 0 .../autopsy/modules/stix/Bundle.properties | 0 .../autopsy/modules/stix/Bundle_ja.properties | 0 .../autopsy/modules/stix/EvalAccountObj.java | 0 .../autopsy/modules/stix/EvalAddressObj.java | 0 .../autopsy/modules/stix/EvalDomainObj.java | 0 .../autopsy/modules/stix/EvalEmailObj.java | 0 .../autopsy/modules/stix/EvalFileObj.java | 0 .../modules/stix/EvalNetworkShareObj.java | 0 .../autopsy/modules/stix/EvalRegistryObj.java | 0 .../autopsy/modules/stix/EvalSystemObj.java | 0 .../autopsy/modules/stix/EvalURIObj.java | 0 .../modules/stix/EvalURLHistoryObj.java | 0 .../modules/stix/EvaluatableObject.java | 0 .../modules/stix/ObservableResult.java | 0 .../modules/stix/STIXReportModule.java | 0 .../stix/STIXReportModuleConfigPanel.form | 0 .../stix/STIXReportModuleConfigPanel.java | 0 .../modules/stix/StixArtifactData.java | 0 .../modules/vmextractor/Bundle.properties | 0 .../modules/vmextractor/Bundle_ja.properties | 0 .../vmextractor/VMExtractorIngestModule.java | 0 .../VMExtractorIngestModuleFactory.java | 0 .../vmextractor/VirtualMachineFinder.java | 0 .../autopsy/progress/Bundle.properties | 0 .../progress/LoggingProgressIndicator.java | 0 .../ModalDialogProgressIndicator.java | 0 .../autopsy/progress/ProgressIndicator.java | 0 .../autopsy/progress/ProgressPanel.form | 0 .../autopsy/progress/ProgressPanel.java | 0 .../progress/SilentProgressIndicator.java | 0 .../autopsy/python/Bundle_ja.properties | 0 .../report/ArtifactSelectionDialog.form | 0 .../report/ArtifactSelectionDialog.java | 0 .../autopsy/report/Bundle.properties | 0 .../autopsy/report/Bundle_ja.properties | 0 .../DefaultReportConfigurationPanel.form | 0 .../DefaultReportConfigurationPanel.java | 0 .../autopsy/report/GeneralReportModule.java | 0 .../autopsy/report/ReportBodyFile.java | 0 .../autopsy/report/ReportBranding.java | 0 .../report/ReportBrandingProviderI.java | 0 .../sleuthkit/autopsy/report/ReportExcel.java | 0 .../autopsy/report/ReportGenerationPanel.form | 0 .../autopsy/report/ReportGenerationPanel.java | 0 .../autopsy/report/ReportGenerator.java | 0 .../sleuthkit/autopsy/report/ReportHTML.java | 0 .../autopsy/report/ReportModule.java | 0 .../autopsy/report/ReportProgressPanel.form | 0 .../autopsy/report/ReportProgressPanel.java | 0 .../autopsy/report/ReportVisualPanel1.form | 0 .../autopsy/report/ReportVisualPanel1.java | 0 .../autopsy/report/ReportVisualPanel2.form | 0 .../autopsy/report/ReportVisualPanel2.java | 0 .../autopsy/report/ReportWizardAction.java | 0 .../autopsy/report/ReportWizardIterator.java | 0 .../autopsy/report/ReportWizardPanel1.java | 0 .../autopsy/report/ReportWizardPanel2.java | 0 .../autopsy/report/TableReportModule.java | 0 .../autopsy/report/images/account-icon-16.png | Bin .../autopsy/report/images/accounts.png | Bin .../autopsy/report/images/bluetooth.png | Bin .../autopsy/report/images/bookmarks.png | Bin .../images/btn_icon_generate_report.png | Bin .../autopsy/report/images/calendar.png | Bin .../autopsy/report/images/calllog.png | Bin .../autopsy/report/images/computer.png | Bin .../autopsy/report/images/contact.png | Bin .../autopsy/report/images/cookies.png | Bin .../autopsy/report/images/credit-card.png | Bin .../report/images/default_generator_logo.png | Bin .../autopsy/report/images/devices.png | Bin .../autopsy/report/images/downloads.png | Bin .../autopsy/report/images/drive_network.png | Bin .../sleuthkit/autopsy/report/images/exif.png | Bin .../autopsy/report/images/favicon.ico | Bin .../report/images/gps-lastlocation.png | Bin .../autopsy/report/images/gps-search.png | Bin .../autopsy/report/images/gps_trackpoint.png | Bin .../autopsy/report/images/gpsfav.png | Bin .../sleuthkit/autopsy/report/images/hash.png | Bin .../autopsy/report/images/history.png | Bin .../autopsy/report/images/installed.png | Bin .../autopsy/report/images/keywords.png | Bin .../autopsy/report/images/message.png | Bin .../autopsy/report/images/recent.png | Bin .../autopsy/report/images/report_loading.png | Bin .../autopsy/report/images/search.png | Bin .../autopsy/report/images/speeddialentry.png | Bin .../sleuthkit/autopsy/report/images/star.png | Bin .../autopsy/report/images/summary.png | Bin .../autopsy/report/images/userbookmarks.png | Bin .../org/sleuthkit/autopsy/report/package.dox | 0 ...ustomArtifactsCreatorFileIngestModule.java | 0 ...omArtifactsCreatorIngestModuleFactory.java | 0 ...nterestingArtifactCreatorIngestModule.java | 0 ...ingArtifactCreatorIngestModuleFactory.java | 0 .../autopsy/test/TestAutopsyService.java | 0 .../autopsy/timeline/Bundle.properties | 0 .../autopsy/timeline/Bundle_ja.properties | 0 .../timeline/CancellationProgressTask.java | 0 .../autopsy/timeline/ChronoFieldListCell.java | 0 .../autopsy/timeline/FXMLConstructor.java | 0 .../autopsy/timeline/OpenTimelineAction.java | 0 .../timeline/PerCaseTimelineProperties.java | 0 .../autopsy/timeline/PromptDialogManager.java | 0 .../timeline/ShowInTimelineDialog.fxml | 0 .../timeline/ShowInTimelineDialog.java | 0 .../autopsy/timeline/TimeLineController.java | 0 .../autopsy/timeline/TimeLineException.java | 0 .../timeline/TimeLineTopComponent.form | 0 .../timeline/TimeLineTopComponent.java | 0 .../sleuthkit/autopsy/timeline/ViewMode.java | 0 .../autopsy/timeline/WrappingListCell.java | 0 .../autopsy/timeline/actions/Back.java | 0 .../timeline/actions/Bundle_ja.properties | 0 .../autopsy/timeline/actions/Forward.java | 0 .../timeline/actions/ResetFilters.java | 0 .../actions/SaveSnapshotAsReport.java | 0 .../autopsy/timeline/actions/UpdateDB.java | 0 .../actions/ViewArtifactInTimelineAction.java | 0 .../actions/ViewFileInTimelineAction.java | 0 .../autopsy/timeline/actions/ZoomIn.java | 0 .../autopsy/timeline/actions/ZoomOut.java | 0 .../timeline/actions/ZoomToEvents.java | 0 .../timeline/datamodel/CombinedEvent.java | 0 .../timeline/datamodel/EventCluster.java | 0 .../timeline/datamodel/EventStripe.java | 0 .../datamodel/FilteredEventsModel.java | 0 .../timeline/datamodel/MultiEvent.java | 0 .../timeline/datamodel/SingleEvent.java | 0 .../timeline/datamodel/TimeLineEvent.java | 0 .../eventtype/ArtifactEventType.java | 0 .../datamodel/eventtype/BaseTypes.java | 0 .../datamodel/eventtype/Bundle.properties | 0 .../datamodel/eventtype/Bundle_ja.properties | 0 .../datamodel/eventtype/EventType.java | 0 .../datamodel/eventtype/FileSystemTypes.java | 0 .../datamodel/eventtype/MiscTypes.java | 0 .../datamodel/eventtype/RootEventType.java | 0 .../datamodel/eventtype/WebTypes.java | 0 .../autopsy/timeline/db/Bundle_ja.properties | 0 .../autopsy/timeline/db/EventDB.java | 0 .../autopsy/timeline/db/EventsRepository.java | 0 .../db/MultipleTransactionException.java | 0 .../autopsy/timeline/db/SQLHelper.java | 0 .../timeline/events/DBUpdatedEvent.java | 0 .../events/RefreshRequestedEvent.java | 0 .../timeline/events/TagsAddedEvent.java | 0 .../timeline/events/TagsDeletedEvent.java | 0 .../timeline/events/TagsUpdatedEvent.java | 0 .../events/ViewInTimelineRequestedEvent.java | 0 .../explorernodes/Bundle_ja.properties | 0 .../timeline/explorernodes/EventNode.java | 0 .../timeline/explorernodes/EventRootNode.java | 0 .../timeline/filters/AbstractFilter.java | 0 .../timeline/filters/Bundle_ja.properties | 0 .../timeline/filters/CompoundFilter.java | 0 .../timeline/filters/DataSourceFilter.java | 0 .../timeline/filters/DataSourcesFilter.java | 0 .../timeline/filters/DescriptionFilter.java | 0 .../autopsy/timeline/filters/Filter.java | 0 .../timeline/filters/HashHitsFilter.java | 0 .../timeline/filters/HashSetFilter.java | 0 .../timeline/filters/HideKnownFilter.java | 0 .../timeline/filters/IntersectionFilter.java | 0 .../autopsy/timeline/filters/RootFilter.java | 0 .../timeline/filters/TagNameFilter.java | 0 .../autopsy/timeline/filters/TagsFilter.java | 0 .../autopsy/timeline/filters/TextFilter.java | 0 .../autopsy/timeline/filters/TypeFilter.java | 0 .../autopsy/timeline/filters/UnionFilter.java | 0 .../autopsy/timeline/images/arrow-090.png | Bin .../autopsy/timeline/images/arrow-180.png | Bin .../autopsy/timeline/images/arrow-270.png | Bin .../images/arrow-circle-double-135.png | Bin .../autopsy/timeline/images/arrow-in.png | Bin .../autopsy/timeline/images/arrow-out.png | Bin .../timeline/images/arrow-step-out.png | Bin .../autopsy/timeline/images/arrow-step.png | Bin .../autopsy/timeline/images/arrow.png | Bin .../autopsy/timeline/images/arrow_in.png | Bin .../autopsy/timeline/images/arrow_out.png | Bin .../autopsy/timeline/images/block.png | Bin .../images/blue-document-attribute-a.png | Bin .../images/blue-document-attribute-b.png | Bin .../images/blue-document-attribute-c.png | Bin .../images/blue-document-attribute-m.png | Bin .../autopsy/timeline/images/blue-document.png | Bin .../timeline/images/bookmark--plus.png | Bin .../autopsy/timeline/images/bookmarks.png | Bin .../timeline/images/btn_icon_timeline_32.png | Bin .../images/btn_icon_timeline_colorized_32.png | Bin .../autopsy/timeline/images/btn_step_back.png | Bin .../images/btn_step_back_disabled.png | Bin .../timeline/images/btn_step_back_hover.png | Bin .../timeline/images/btn_step_forward.png | Bin .../images/btn_step_forward_disabled.png | Bin .../images/btn_step_forward_hover.png | Bin .../autopsy/timeline/images/calllog.png | Bin .../timeline/images/camera-icon-16.png | Bin .../autopsy/timeline/images/chart_bar.png | Bin .../autopsy/timeline/images/checker64.jpg | Bin .../autopsy/timeline/images/checkerboard.png | Bin .../images/checkerboard_transparent.png | Bin .../autopsy/timeline/images/clock-history.png | Bin .../autopsy/timeline/images/cookies.png | Bin .../timeline/images/cross-circle (2).png | Bin .../autopsy/timeline/images/cross-circle.png | Bin .../autopsy/timeline/images/cross-script.png | Bin .../timeline/images/database_refresh.png | Bin .../autopsy/timeline/images/downloads.png | Bin .../autopsy/timeline/images/eye--minus.png | Bin .../autopsy/timeline/images/eye--plus.png | Bin .../autopsy/timeline/images/eye_close.png | Bin .../autopsy/timeline/images/funnel--minus.png | Bin .../autopsy/timeline/images/funnel.png | Bin .../autopsy/timeline/images/geolocation.png | Bin .../autopsy/timeline/images/gps-search.png | Bin .../timeline/images/gps-trackpoint.png | Bin .../autopsy/timeline/images/history.png | Bin .../autopsy/timeline/images/image.png | Bin .../autopsy/timeline/images/info-icon-16.png | Bin .../timeline/images/information-frame.png | Bin .../timeline/images/information-gray.png | Bin .../timeline/images/information-white.png | Bin .../autopsy/timeline/images/information.png | Bin .../timeline/images/magnifier-left.png | Bin .../images/magnifier-zoom-actual-equal.png | Bin .../timeline/images/magnifier-zoom-actual.png | Bin .../timeline/images/magnifier-zoom-fit.png | Bin .../images/magnifier-zoom-in-green.png | Bin .../timeline/images/magnifier-zoom-in.png | Bin .../images/magnifier-zoom-out-red.png | Bin .../timeline/images/magnifier-zoom-out.png | Bin .../timeline/images/magnifier-zoom.png | Bin .../autopsy/timeline/images/magnifier.png | Bin .../timeline/images/magnifier_zoom_in.png | Bin .../timeline/images/magnifier_zoom_out.png | Bin .../autopsy/timeline/images/mail-icon-16.png | Bin .../autopsy/timeline/images/marker--arrow.png | Bin .../timeline/images/marker--exclamation.png | Bin .../autopsy/timeline/images/marker--minus.png | Bin .../timeline/images/marker--pencil.png | Bin .../autopsy/timeline/images/marker--pin.png | Bin .../autopsy/timeline/images/marker--plus.png | Bin .../autopsy/timeline/images/marker.png | Bin .../autopsy/timeline/images/message.png | Bin .../autopsy/timeline/images/minus-button.png | Bin .../autopsy/timeline/images/plus-button.png | Bin .../autopsy/timeline/images/programs.png | Bin .../autopsy/timeline/images/prohibition.png | Bin .../timeline/images/question-frame.png | Bin .../autopsy/timeline/images/recent_docs.png | Bin .../timeline/images/resultset_first.png | Bin .../timeline/images/resultset_last.png | Bin .../timeline/images/resultset_next.png | Bin .../timeline/images/resultset_previous.png | Bin .../autopsy/timeline/images/searchquery.png | Bin .../autopsy/timeline/images/select.png | Bin .../autopsy/timeline/images/table.png | Bin .../autopsy/timeline/images/tick.png | Bin .../timeline/images/timeline_marker.png | Bin .../autopsy/timeline/images/usb_devices.png | Bin .../autopsy/timeline/images/warning.png | Bin .../timeline/images/warning_triangle.png | Bin .../images/warning_triangle_small.png | Bin .../autopsy/timeline/images/web-file.png | Bin .../autopsy/timeline/license-timeline.txt | 0 .../snapshot/SnapShotReportWriter.java | 0 .../autopsy/timeline/snapshot/index.css | 0 .../timeline/snapshot/index_template.html | 0 .../autopsy/timeline/snapshot/navigation.html | 0 .../timeline/snapshot/snapshot_template.html | 0 .../autopsy/timeline/snapshot/summary.css | 0 .../timeline/snapshot/summary_template.html | 0 .../timeline/ui/AbstractFXCellFactory.java | 0 .../timeline/ui/AbstractTimeLineView.java | 0 .../timeline/ui/AbstractTimelineChart.java | 0 .../autopsy/timeline/ui/Bundle.properties | 0 .../autopsy/timeline/ui/Bundle_ja.properties | 0 .../timeline/ui/ContextMenuProvider.java | 0 .../autopsy/timeline/ui/HistoryToolBar.fxml | 0 .../autopsy/timeline/ui/HistoryToolBar.java | 0 .../autopsy/timeline/ui/IntervalSelector.css | 0 .../autopsy/timeline/ui/IntervalSelector.fxml | 0 .../autopsy/timeline/ui/IntervalSelector.java | 0 .../autopsy/timeline/ui/NoEventsDialog.fxml | 0 .../autopsy/timeline/ui/StatusBar.fxml | 0 .../autopsy/timeline/ui/StatusBar.java | 0 .../autopsy/timeline/ui/TimeLineChart.java | 0 .../autopsy/timeline/ui/TimeZonePanel.fxml | 0 .../autopsy/timeline/ui/TimeZonePanel.java | 0 .../autopsy/timeline/ui/ViewFrame.fxml | 0 .../autopsy/timeline/ui/ViewFrame.java | 0 .../autopsy/timeline/ui/ZoomRanges.java | 0 .../ui/countsview/Bundle_ja.properties | 0 .../ui/countsview/CountsViewPane.java | 0 .../ui/countsview/CountsViewSettingsPane.fxml | 0 .../ui/countsview/EventCountsChart.java | 0 .../ui/detailview/Bundle_ja.properties | 0 .../timeline/ui/detailview/DateAxis.java | 0 .../ui/detailview/DescriptionVisibility.java | 0 .../ui/detailview/DetailViewPane.java | 0 .../ui/detailview/DetailViewSettingsPane.fxml | 0 .../timeline/ui/detailview/DetailsChart.java | 0 .../ui/detailview/DetailsChartLane.java | 0 .../DetailsChartLayoutSettings.java | 0 .../timeline/ui/detailview/EventAxis.java | 0 .../ui/detailview/EventClusterNode.java | 0 .../timeline/ui/detailview/EventNodeBase.java | 0 .../ui/detailview/EventStripeNode.java | 0 .../ui/detailview/EventsDetailsChart.css | 0 .../timeline/ui/detailview/GuideLine.java | 0 .../ui/detailview/HideDescriptionAction.java | 0 .../ui/detailview/MultiEventNodeBase.java | 0 .../ui/detailview/PinnedEventsChartLane.java | 0 .../detailview/PrimaryDetailsChartLane.java | 0 .../ui/detailview/ScrollingLaneWrapper.java | 0 .../ui/detailview/SingleEventNode.java | 0 .../ui/detailview/StripeFlattener.java | 0 .../detailview/UnhideDescriptionAction.java | 0 .../ui/detailview/tree/BaseTypeTreeItem.java | 0 .../ui/detailview/tree/Bundle_ja.properties | 0 .../detailview/tree/DescriptionTreeItem.java | 0 .../ui/detailview/tree/EventTypeTreeItem.java | 0 .../ui/detailview/tree/EventsTree.fxml | 0 .../ui/detailview/tree/EventsTree.java | 0 .../ui/detailview/tree/EventsTreeItem.java | 0 .../timeline/ui/detailview/tree/RootItem.java | 0 .../ui/detailview/tree/SubTypeTreeItem.java | 0 .../ui/detailview/tree/TreeComparator.java | 0 .../ui/filtering/Bundle_ja.properties | 0 .../filtering/FilterCheckBoxCellFactory.java | 0 .../timeline/ui/filtering/FilterSetPanel.fxml | 0 .../timeline/ui/filtering/FilterSetPanel.java | 0 .../timeline/ui/filtering/FilterTable.css | 0 .../timeline/ui/filtering/FilterTreeItem.java | 0 .../ui/filtering/FilterTreeTableRow.java | 0 .../timeline/ui/filtering/LegendCell.java | 0 .../timeline/ui/listvew/ListTimeline.fxml | 0 .../timeline/ui/listvew/ListTimeline.java | 0 .../timeline/ui/listvew/ListViewPane.java | 0 .../timeline/ui/listvew/SwingFXMenuUtils.java | 0 .../autopsy/timeline/utils/IntervalUtils.java | 0 .../autopsy/timeline/utils/MappedList.java | 0 .../timeline/utils/RangeDivisionInfo.java | 0 .../timeline/zooming/Bundle.properties | 0 .../timeline/zooming/Bundle_ja.properties | 0 .../timeline/zooming/DescriptionLoD.java | 0 .../timeline/zooming/DisplayNameProvider.java | 0 .../timeline/zooming/EventTypeZoomLevel.java | 0 .../autopsy/timeline/zooming/TimeUnits.java | 0 .../autopsy/timeline/zooming/ZoomParams.java | 0 .../timeline/zooming/ZoomSettingsPane.fxml | 0 .../timeline/zooming/ZoomSettingsPane.java | 0 Core/updates_ja.xml | 0 CoreLibs/build-mac.xml | 0 CoreLibs/build-unix.xml | 0 CoreLibs/build-windows.xml | 0 CoreLibs/build.xml | 0 CoreLibs/ivy.xml | 0 CoreLibs/ivysettings.xml | 0 CoreLibs/manifest.mf | 0 CoreLibs/nbproject/build-impl.xml | 0 CoreLibs/nbproject/project.properties | 0 CoreLibs/nbproject/project.xml | 0 CoreLibs/nbproject/suite.properties | 0 .../autopsy/corelibs/Bundle.properties | 0 .../autopsy/corelibs/Bundle_ja.properties | 0 .../autopsy/corelibs/ScalrWrapper.java | 0 .../autopsy/corelibs/SigarLoader.java | 0 Experimental/build.xml | 0 Experimental/ivy.xml | 0 Experimental/ivysettings.xml | 0 Experimental/manifest.mf | 1 - Experimental/nbproject/build-impl.xml | 0 Experimental/nbproject/project.properties | 0 Experimental/nbproject/project.xml | 9 - Experimental/nbproject/suite.properties | 0 .../experimental/autoingest/ArchiveUtil.java | 0 .../autoingest/AutoIngestAlertFile.java | 0 .../autoingest/AutoIngestCase.java | 0 .../AutoIngestCaseDeletedEvent.java | 0 .../autoingest/AutoIngestCaseManager.java | 0 .../autoingest/AutoIngestCaseOpenAction.java | 0 .../autoingest/AutoIngestCasePanel.form | 0 .../autoingest/AutoIngestCasePanel.java | 0 .../AutoIngestCasePrioritizedEvent.java | 0 .../autoingest/AutoIngestDashboard.form | 40 +- .../autoingest/AutoIngestDashboard.java | 402 +++- .../AutoIngestDashboardOpenAction.java | 115 -- .../AutoIngestDashboardTopComponent.form | 28 - .../AutoIngestDashboardTopComponent.java | 143 -- .../autoingest/AutoIngestJob.java | 0 .../AutoIngestJobCompletedEvent.java | 0 .../autoingest/AutoIngestJobEvent.java | 0 .../autoingest/AutoIngestJobLogger.java | 0 .../autoingest/AutoIngestJobStartedEvent.java | 0 .../autoingest/AutoIngestJobStatusEvent.java | 0 .../autoingest/AutoIngestLegacyDashboard.form | 475 ----- .../autoingest/AutoIngestLegacyDashboard.java | 1731 ----------------- .../autoingest/AutoIngestManager.java | 0 .../autoingest/AutoIngestSystemLogger.java | 0 .../autoingest/AutopsyManifestFileParser.java | 0 .../experimental/autoingest/Bundle.properties | 2 +- .../autoingest/CaseImportPanel.form | 0 .../autoingest/CaseImportPanel.java | 0 .../autoingest/CaseImportPanelController.java | 0 .../CaseStatusIconCellRenderer.java | 0 .../CenteredGrayableCellRenderer.java | 0 .../autoingest/DurationCellRenderer.java | 0 .../autoingest/FileExportRuleSet.java | 0 .../autoingest/FileExportSettings.java | 0 .../experimental/autoingest/FileExporter.java | 0 .../autoingest/FileExporterSettingsPanel.form | 0 .../autoingest/FileExporterSettingsPanel.java | 0 .../autoingest/GrayableCellRenderer.java | 0 .../autoingest/ImportDoneCallback.java | 0 .../autoingest/LongDateCellRenderer.java | 0 .../experimental/autoingest/Manifest.java | 0 .../autoingest/ManifestFileParser.java | 0 .../autoingest/ManifestNodeData.java | 0 .../experimental/autoingest/PathUtils.java | 0 .../autoingest/ShortDateCellRenderer.java | 0 .../autoingest/SingleUserCaseImporter.java | 0 .../autoingest/StatusDatabaseLogger.java | 0 .../autoingest/TimeStampUtils.java | 0 .../autopsy/experimental/autoingest/layer.xml | 0 .../AdvancedAutoIngestSettingsPanel.form | 0 .../AdvancedAutoIngestSettingsPanel.java | 0 .../AutoIngestSettingsPanel.form | 0 .../AutoIngestSettingsPanel.java | 0 .../AutoIngestSettingsPanelController.java | 0 .../AutoIngestUserPreferences.java | 0 .../configuration/Bundle.properties | 0 .../configuration/Bundle_ja.properties | 0 .../configuration/NodeStatusLogPanel.form | 0 .../configuration/NodeStatusLogPanel.java | 0 .../configuration/SharedConfiguration.java | 0 .../configuration/StartupWindow.java | 12 +- .../autopsy/experimental/images/AIM.png | Bin .../experimental/images/arrow-down-icon.png | Bin .../experimental/images/arrow-up-icon.png | Bin .../experimental/images/artifact-icon.png | Bin .../experimental/images/autoIngest32.png | Bin .../autopsy/experimental/images/bad.png | Bin .../experimental/images/extracted_content.png | Bin .../experimental/images/file-size-16.png | Bin .../autopsy/experimental/images/frame.gif | Bin .../autopsy/experimental/images/frame32.gif | Bin .../autopsy/experimental/images/good.png | Bin .../autopsy/experimental/images/import16.png | Bin .../autopsy/experimental/images/import32.png | Bin .../experimental/images/knownbad-icon.png | Bin .../images/left-arrow-16-icon.png | Bin .../autopsy/experimental/images/locked.png | Bin .../autopsy/experimental/images/mime-icon.png | Bin .../experimental/images/minus-icon.png | Bin .../experimental/images/options-icon.png | Bin .../autopsy/experimental/images/plus-icon.png | Bin .../experimental/images/ruleset-icon.png | Bin .../autopsy/experimental/images/save-icon.png | Bin .../autopsy/experimental/images/tick.png | Bin .../autopsy/experimental/images/warning16.png | Bin .../experimental/images/yield16-icon.png | Bin ImageGallery/.gitattributes | 0 ImageGallery/.gitignore | 0 ImageGallery/LICENSE-2.0.txt | 0 ImageGallery/build.xml | 0 ImageGallery/manifest.mf | 0 ImageGallery/nbproject/build-impl.xml | 0 ImageGallery/nbproject/genfiles.properties | 0 ImageGallery/nbproject/platform.properties | 0 ImageGallery/nbproject/project.properties | 0 ImageGallery/nbproject/project.xml | 0 ImageGallery/nbproject/suite.properties | 0 .../autopsy/imagegallery/Bundle.properties | 0 .../autopsy/imagegallery/Bundle_ja.properties | 0 .../autopsy/imagegallery/FXMLConstructor.java | 0 .../imagegallery/FileIDSelectionModel.java | 0 .../autopsy/imagegallery/FileTypeUtils.java | 0 .../imagegallery/ImageGalleryController.java | 0 .../imagegallery/ImageGalleryModule.java | 0 .../ImageGalleryOptionsPanel.form | 0 .../ImageGalleryOptionsPanel.java | 0 .../ImageGalleryOptionsPanelController.java | 0 .../imagegallery/ImageGalleryPreferences.java | 0 .../ImageGalleryTopComponent.form | 0 .../ImageGalleryTopComponent.java | 0 .../autopsy/imagegallery/OnStart.java | 0 .../imagegallery/PerCaseProperties.java | 0 .../autopsy/imagegallery/ThumbnailCache.java | 0 .../imagegallery/actions/AddTagAction.java | 0 .../autopsy/imagegallery/actions/Back.java | 0 .../imagegallery/actions/Bundle_ja.properties | 0 .../actions/CategorizeAction.java | 0 .../actions/CategorizeGroupAction.java | 0 .../CategorizeSelectedFilesAction.java | 0 .../actions/DeleteFollowUpTagAction.java | 0 .../autopsy/imagegallery/actions/Forward.java | 0 .../imagegallery/actions/NextUnseenGroup.java | 0 .../actions/OpenExternalViewerAction.java | 0 .../imagegallery/actions/OpenHelpAction.java | 0 .../imagegallery/actions/RedoAction.java | 0 .../actions/SwingMenuItemAdapter.java | 0 .../imagegallery/actions/TagGroupAction.java | 0 .../actions/TagSelectedFilesAction.java | 0 .../imagegallery/actions/UndoAction.java | 0 .../imagegallery/actions/UndoRedoManager.java | 0 .../datamodel/Bundle_ja.properties | 0 .../imagegallery/datamodel/Category.java | 0 .../datamodel/CategoryManager.java | 0 .../datamodel/DrawableAttribute.java | 0 .../imagegallery/datamodel/DrawableDB.java | 0 .../imagegallery/datamodel/DrawableFile.java | 0 .../datamodel/DrawableTagsManager.java | 0 .../datamodel/HashSetManager.java | 0 .../imagegallery/datamodel/ImageFile.java | 0 .../imagegallery/datamodel/VideoFile.java | 0 .../datamodel/grouping/Bundle_ja.properties | 0 .../datamodel/grouping/DrawableGroup.java | 0 .../datamodel/grouping/GroupKey.java | 0 .../datamodel/grouping/GroupManager.java | 0 .../datamodel/grouping/GroupSortBy.java | 0 .../datamodel/grouping/GroupViewMode.java | 0 .../datamodel/grouping/GroupViewState.java | 0 .../imagegallery/gui/AttributeListCell.java | 0 .../imagegallery/gui/Bundle_ja.properties | 0 .../autopsy/imagegallery/gui/GuiUtils.java | 0 .../imagegallery/gui/MediaControl.fxml | 0 .../imagegallery/gui/NoGroupsDialog.fxml | 0 .../imagegallery/gui/NoGroupsDialog.java | 0 .../imagegallery/gui/SortByListCell.java | 0 .../autopsy/imagegallery/gui/SortChooser.fxml | 0 .../autopsy/imagegallery/gui/SortChooser.java | 0 .../autopsy/imagegallery/gui/StatusBar.fxml | 0 .../autopsy/imagegallery/gui/StatusBar.java | 0 .../imagegallery/gui/SummaryTablePane.fxml | 0 .../imagegallery/gui/SummaryTablePane.java | 0 .../autopsy/imagegallery/gui/Toolbar.fxml | 0 .../autopsy/imagegallery/gui/Toolbar.java | 0 .../autopsy/imagegallery/gui/VideoPlayer.java | 0 .../gui/drawableviews/Bundle_ja.properties | 0 .../gui/drawableviews/DrawableTile.fxml | 0 .../gui/drawableviews/DrawableTile.java | 0 .../gui/drawableviews/DrawableTileBase.java | 0 .../gui/drawableviews/DrawableUIBase.java | 0 .../gui/drawableviews/DrawableView.java | 0 .../gui/drawableviews/GroupPane.fxml | 0 .../gui/drawableviews/GroupPane.java | 0 .../gui/drawableviews/MetaDataPane.fxml | 0 .../gui/drawableviews/MetaDataPane.java | 0 .../gui/drawableviews/SlideShowView.fxml | 0 .../gui/drawableviews/SlideShowView.java | 0 .../gui/navpanel/Bundle_ja.properties | 0 .../imagegallery/gui/navpanel/GroupCell.css | 0 .../gui/navpanel/GroupCellFactory.java | 0 .../gui/navpanel/GroupComparators.java | 0 .../imagegallery/gui/navpanel/GroupTree.java | 0 .../gui/navpanel/GroupTreeItem.java | 0 .../gui/navpanel/GroupTreeNode.java | 0 .../gui/navpanel/HashHitGroupList.java | 0 .../imagegallery/gui/navpanel/NavPanel.fxml | 0 .../imagegallery/gui/navpanel/NavPanel.java | 0 .../imagegallery/images/Clapperboard.png | Bin .../imagegallery/images/Folder-icon.png | Bin .../imagegallery/images/TriangleDown.png | Bin .../images/application_view_tile.png | Bin .../autopsy/imagegallery/images/arrow-090.png | Bin .../autopsy/imagegallery/images/arrow-180.png | Bin .../autopsy/imagegallery/images/arrow-270.png | Bin .../images/arrow-circle-double-135.png | Bin .../images/arrow-circle-double.png | Bin .../imagegallery/images/arrow-resize-090.png | Bin .../imagegallery/images/arrow-resize.png | Bin .../autopsy/imagegallery/images/arrow.png | Bin .../imagegallery/images/arrow_down.png | Bin .../autopsy/imagegallery/images/arrow_up.png | Bin .../images/border-bottom-double.png | Bin .../images/border-top-bottom-double.png | Bin .../images/btn_icon_image_gallery_32.png | Bin .../images/btn_icon_image_gallery_48.png | Bin .../imagegallery/images/bullet_arrow_down.png | Bin .../autopsy/imagegallery/images/camera.png | Bin .../imagegallery/images/category-icon.png | Bin .../imagegallery/images/clock--minus.png | Bin .../imagegallery/images/clock--pencil.png | Bin .../imagegallery/images/clock--plus.png | Bin .../images/control-double-000-small.png | Bin .../images/control-double-090-small.png | Bin .../images/control-double-090.png | Bin .../images/control-double-180-small.png | Bin .../images/control-double-180.png | Bin .../images/control-double-270-small.png | Bin .../images/control-double-270.png | Bin .../imagegallery/images/control-double.png | Bin .../images/control-stop-000-small.png | Bin .../imagegallery/images/control-stop.png | Bin .../autopsy/imagegallery/images/external.png | Bin .../autopsy/imagegallery/images/film.png | Bin .../autopsy/imagegallery/images/flag_gray.png | Bin .../autopsy/imagegallery/images/flag_red.png | Bin .../imagegallery/images/folder-open-image.png | Bin .../imagegallery/images/folder-rename.png | Bin .../imagegallery/images/folder-tree.png | Bin .../autopsy/imagegallery/images/folder.png | Bin .../imagegallery/images/folder_picture.png | Bin .../imagegallery/images/folders-path.png | Bin .../autopsy/imagegallery/images/funnel.png | Bin .../autopsy/imagegallery/images/group.png | Bin .../imagegallery/images/hashset_hits.png | Bin .../imagegallery/images/icon-hashtag.png | Bin .../imagegallery/images/info-icon-16.png | Bin .../imagegallery/images/information.png | Bin .../autopsy/imagegallery/images/lightbulb.png | Bin .../images/media_controls_first_small.png | Bin .../images/media_controls_forward_small.png | Bin .../images/media_controls_last_small.png | Bin .../images/media_controls_pause_small.png | Bin .../images/media_controls_play_small.png | Bin .../images/media_controls_rewind_small.png | Bin .../images/media_controls_stop_small.png | Bin .../imagegallery/images/mime_types.png | Bin .../imagegallery/images/page_white_stack.png | Bin .../imagegallery/images/polaroid_green_48.png | Bin .../images/polaroid_green_48_silhouette.png | Bin .../imagegallery/images/prohibition.png | Bin .../imagegallery/images/question-frame.png | Bin .../autopsy/imagegallery/images/redo.png | Bin .../imagegallery/images/right arrow.png | Bin .../imagegallery/images/right_arrow_128.png | Bin .../imagegallery/images/shape_group.png | Bin .../autopsy/imagegallery/images/slide.png | Bin .../imagegallery/images/sort_asc_az.png | Bin .../imagegallery/images/sort_ascending.png | Bin .../imagegallery/images/sort_desc_az.png | Bin .../imagegallery/images/sort_descending.png | Bin .../images/speaker-volume-control-mute.png | Bin .../images/speaker-volume-control-up.png | Bin .../images/speaker-volume-control.png | Bin .../images/speaker-volume-low.png | Bin .../images/speaker-volume-none.png | Bin .../imagegallery/images/speaker-volume.png | Bin .../autopsy/imagegallery/images/tag_red.png | Bin .../autopsy/imagegallery/images/undo.png | Bin .../imagegallery/images/video-file.png | Bin .../imagegallery/license-imagegallery.txt | 0 .../autopsy/imagegallery/utils/TaskUtils.java | 0 InternalPythonModules/README.txt | 0 .../android/browserlocation.py | 0 .../android/cachelocation.py | 0 InternalPythonModules/android/calllog.py | 0 InternalPythonModules/android/contact.py | 0 InternalPythonModules/android/general.py | 0 .../android/googlemaplocation.py | 0 InternalPythonModules/android/module.py | 0 InternalPythonModules/android/tangomessage.py | 0 InternalPythonModules/android/textmessage.py | 0 InternalPythonModules/android/wwfmessage.py | 0 KNOWN_ISSUES.txt | 0 KeywordSearch/build.xml | 0 KeywordSearch/ivy.xml | 0 KeywordSearch/ivysettings.xml | 0 KeywordSearch/manifest.mf | 0 KeywordSearch/nbproject/build-impl.xml | 0 KeywordSearch/nbproject/project.properties | 0 KeywordSearch/nbproject/project.xml | 0 KeywordSearch/nbproject/suite.properties | 0 .../solr/contexts/solr-jetty-context.xml | 0 KeywordSearch/solr/etc/jetty.xml | 0 KeywordSearch/solr/etc/webdefault.xml | 0 KeywordSearch/solr/resources/log4j.properties | 0 .../AutopsyConfig/conf/admin-extra.html | 0 .../configsets/AutopsyConfig/conf/elevate.xml | 0 .../conf/logging-development.properties | 0 .../conf/logging-release.properties | 0 .../conf/mapping-FoldToASCII.txt | 0 .../conf/mapping-ISOLatin1Accent.txt | 0 .../AutopsyConfig/conf/protwords.txt | 0 .../configsets/AutopsyConfig/conf/schema.xml | 0 .../AutopsyConfig/conf/scripts.conf | 0 .../AutopsyConfig/conf/solrconfig.xml | 0 .../AutopsyConfig/conf/spellings.txt | 0 .../AutopsyConfig/conf/stopwords.txt | 0 .../AutopsyConfig/conf/stopwords_en.txt | 0 .../AutopsyConfig/conf/synonyms.txt | 0 KeywordSearch/solr/solr/solr.xml | 0 KeywordSearch/solr/solr/zoo.cfg | 0 .../autopsy/keywordsearch/AccountsText.java | 0 .../keywordsearch/AddKeywordsDialog.form | 0 .../keywordsearch/AddKeywordsDialog.java | 0 .../keywordsearch/ArtifactTextExtractor.java | 0 .../autopsy/keywordsearch/Bundle.properties | 0 .../keywordsearch/Bundle_ja.properties | 0 .../autopsy/keywordsearch/Chunker.java | 0 .../DropdownListSearchPanel.form | 0 .../DropdownListSearchPanel.java | 0 .../DropdownSingleTermSearchPanel.form | 0 .../DropdownSingleTermSearchPanel.java | 0 .../keywordsearch/DropdownToolbar.form | 0 .../keywordsearch/DropdownToolbar.java | 0 .../EnCaseKeywordSearchList.java | 0 .../keywordsearch/ExtractedContentPanel.form | 0 .../keywordsearch/ExtractedContentPanel.java | 0 .../keywordsearch/ExtractedContentViewer.java | 0 .../keywordsearch/FileTextExtractor.java | 0 .../keywordsearch/GlobalEditListPanel.form | 0 .../keywordsearch/GlobalEditListPanel.java | 0 .../GlobalListSettingsPanel.form | 0 .../GlobalListSettingsPanel.java | 0 .../GlobalListsManagementPanel.form | 0 .../GlobalListsManagementPanel.java | 0 .../keywordsearch/HighlightedText.java | 0 .../keywordsearch/HtmlTextExtractor.java | 0 .../autopsy/keywordsearch/Index.java | 0 .../autopsy/keywordsearch/IndexFinder.java | 0 .../autopsy/keywordsearch/IndexMetadata.java | 0 .../autopsy/keywordsearch/IndexedText.java | 0 .../autopsy/keywordsearch/Ingester.java | 0 .../autopsy/keywordsearch/Installer.java | 0 .../keywordsearch/JerichoParserWrapper.java | 0 .../autopsy/keywordsearch/Keyword.java | 0 .../keywordsearch/KeywordCachedArtifact.java | 0 .../autopsy/keywordsearch/KeywordHit.java | 0 .../keywordsearch/KeywordListsManager.java | 0 .../keywordsearch/KeywordQueryFilter.java | 0 .../autopsy/keywordsearch/KeywordSearch.java | 0 .../keywordsearch/KeywordSearchAction.java | 0 .../KeywordSearchConfigurationAction.java | 0 .../KeywordSearchFilterNode.java | 0 ...wordSearchGlobalLanguageSettingsPanel.form | 0 ...wordSearchGlobalLanguageSettingsPanel.java | 0 ...eywordSearchGlobalSearchSettingsPanel.form | 0 ...eywordSearchGlobalSearchSettingsPanel.java | 0 .../KeywordSearchGlobalSettingsPanel.form | 0 .../KeywordSearchGlobalSettingsPanel.java | 0 .../KeywordSearchIngestModule.java | 0 .../KeywordSearchJobSettingsPanel.form | 0 .../KeywordSearchJobSettingsPanel.java | 0 .../KeywordSearchModuleException.java | 0 .../KeywordSearchOptionsPanel.form | 0 .../KeywordSearchOptionsPanelController.java | 0 .../keywordsearch/KeywordSearchPanel.java | 0 .../keywordsearch/KeywordSearchQuery.java | 0 .../KeywordSearchQueryDelegator.java | 0 .../KeywordSearchResultFactory.java | 0 .../keywordsearch/KeywordSearchSettings.java | 0 .../keywordsearch/KeywordSearchUtil.java | 0 .../autopsy/keywordsearch/KeywordsSchema.xsd | 0 .../autopsy/keywordsearch/LuceneQuery.java | 0 .../keywordsearch/NoOpenCoreException.java | 0 .../autopsy/keywordsearch/RegexQuery.java | 0 .../autopsy/keywordsearch/SearchRunner.java | 0 .../autopsy/keywordsearch/Server.java | 0 .../keywordsearch/SolrSearchService.java | 0 .../keywordsearch/StringsTextExtractor.java | 0 .../keywordsearch/TermsComponentQuery.java | 0 .../autopsy/keywordsearch/TextExtractor.java | 0 .../keywordsearch/TikaTextExtractor.java | 0 .../keywordsearch/XmlKeywordSearchList.java | 0 .../sleuthkit/autopsy/keywordsearch/add16.png | Bin .../autopsy/keywordsearch/arrow_left.gif | Bin .../autopsy/keywordsearch/arrow_right.gif | Bin .../autopsy/keywordsearch/btn_step_back.png | Bin .../keywordsearch/btn_step_back_disabled.png | Bin .../keywordsearch/btn_step_back_hover.png | Bin .../keywordsearch/btn_step_forward.png | Bin .../btn_step_forward_disabled.png | Bin .../keywordsearch/btn_step_forward_hover.png | Bin .../autopsy/keywordsearch/delete16.png | Bin .../keywordsearch/dropdown-icon-pressed.png | Bin .../keywordsearch/dropdown-icon-rollover.png | Bin .../autopsy/keywordsearch/dropdown-icon.png | Bin .../autopsy/keywordsearch/edit16.png | Bin .../autopsy/keywordsearch/export16.png | Bin .../autopsy/keywordsearch/filter-icon.png | Bin .../autopsy/keywordsearch/import16.png | Bin .../sleuthkit/autopsy/keywordsearch/layer.xml | 0 .../sleuthkit/autopsy/keywordsearch/new16.png | Bin .../autopsy/keywordsearch/options-icon.png | Bin .../autopsy/keywordsearch/save16.png | Bin .../autopsy/keywordsearch/search-icon.png | Bin .../searchbutton-icon-pressed.png | Bin .../searchbutton-icon-rollover.png | Bin .../keywordsearch/searchbutton-icon.png | Bin .../watchbutton-icon-pressed.png | Bin .../watchbutton-icon-rollover.png | Bin .../keywordsearch/watchbutton-icon.png | Bin LICENSE-2.0.txt | 0 NEWS.txt | 0 README.txt | 0 README_LINUX_OSX.md | 0 RecentActivity/build.xml | 0 RecentActivity/ivy.xml | 0 RecentActivity/ivysettings.xml | 0 RecentActivity/manifest.mf | 0 RecentActivity/nbproject/build-impl.xml | 0 RecentActivity/nbproject/platform.properties | 0 RecentActivity/nbproject/project.properties | 0 RecentActivity/nbproject/project.xml | 0 RecentActivity/nbproject/suite.properties | 0 .../autopsy/recentactivity/Bundle.properties | 0 .../recentactivity/Bundle_ja.properties | 0 .../autopsy/recentactivity/Chrome.java | 0 .../autopsy/recentactivity/Extract.java | 0 .../autopsy/recentactivity/ExtractIE.java | 0 .../recentactivity/ExtractRegistry.java | 0 .../autopsy/recentactivity/Firefox.java | 0 .../recentactivity/RAImageIngestModule.java | 0 .../recentactivity/RecentDocumentsByLnk.java | 0 .../autopsy/recentactivity/SEUQAMappings.xml | 0 .../recentactivity/SearchEngineSchema.xsd | 0 .../SearchEngineURLQueryAnalyzer.java | 0 .../autopsy/recentactivity/USB_DATA.txt | 0 .../recentactivity/UsbDeviceIdMapper.java | 0 .../autopsy/recentactivity/Util.java | 0 .../autopsy/recentactivity/layer.xml | 0 ScalpelCarver/.gitignore | 0 ScalpelCarver/build.xml | 0 ScalpelCarver/manifest.mf | 0 ScalpelCarver/nbproject/build-impl.xml | 0 ScalpelCarver/nbproject/project.properties | 0 ScalpelCarver/nbproject/project.xml | 0 .../autopsy/scalpel/Bundle.properties | 0 .../autopsy/scalpel/Bundle_ja.properties | 0 .../scalpel/ScalpelCarverIngestModule.java | 0 .../autopsy/scalpel/jni/Bundle.properties | 0 .../autopsy/scalpel/jni/Bundle_ja.properties | 0 .../autopsy/scalpel/jni/ScalpelCarver.java | 0 .../autopsy/scalpel/jni/ScalpelException.java | 0 .../scalpel/jni/ScalpelOutputParser.java | 0 .../sleuthkit/autopsy/scalpel/scalpel.conf | 0 Testing/README.txt | 0 Testing/build.xml | 0 Testing/manifest.mf | 0 Testing/nbproject/build-impl.xml | 0 Testing/nbproject/project.properties | 0 Testing/nbproject/project.xml | 0 Testing/nbproject/suite.properties | 0 .../autopsy/testing/Bundle.properties | 0 .../netbeans/core/startup/Bundle.properties | 0 .../org/netbeans/core/startup/frame.gif | Bin .../org/netbeans/core/startup/frame32.gif | Bin .../org/netbeans/core/startup/frame48.gif | Bin .../org/netbeans/core/startup/splash.gif | Bin .../core/windows/view/ui/Bundle.properties | 0 build-unix.xml | 0 build-windows-installer.xml | 0 build-windows.xml | 0 .../netbeans_ide_java_formatting_settings.zip | Bin docs/doxygen-user/adHocKeywordSearch.dox | 0 docs/doxygen-user/filetype.dox | 0 docs/doxygen-user/image_gallery.dox | 0 docs/doxygen-user/images/apachebadmessage.PNG | Bin docs/doxygen-user/images/case-newcase.PNG | Bin docs/doxygen-user/images/dzkrun.PNG | Bin .../images/ingest-file-filters.PNG | Bin .../images/ingest-profile-create.PNG | Bin docs/doxygen-user/images/ingest-profiles.PNG | Bin docs/doxygen-user/images/ingest_pipeline.PNG | Bin docs/doxygen-user/images/javaproperties.PNG | Bin .../images/keyword-search-ad-hoc.PNG | Bin ...word-search-configuration-new-keywords.PNG | Bin .../images/keyword-search-inbox.PNG | Bin docs/doxygen-user/images/keyword_results.PNG | Bin .../images/local-disk-data-source.PNG | Bin .../images/maxinactivityduration.PNG | Bin docs/doxygen-user/images/messagebubbles.PNG | Bin .../images/messagebubblesbigger.PNG | Bin docs/doxygen-user/images/mime-type-tree.PNG | Bin .../images/othernodeingesting.PNG | Bin .../images/postgresqlinstall1.PNG | Bin .../images/postgresqlinstall3.PNG | Bin .../images/postgresqlinstall4.PNG | Bin .../images/postgresqlinstall5.PNG | Bin .../images/postgresqlinstall6.PNG | Bin .../images/postgresqlinstall7.PNG | Bin .../images/profile-data-source-panel.PNG | Bin docs/doxygen-user/images/serviceinstall.PNG | Bin docs/doxygen-user/images/solrinstall1.PNG | Bin docs/doxygen-user/images/solrinstall2.PNG | Bin docs/doxygen-user/images/solrinstall3.PNG | Bin docs/doxygen-user/images/symlinkjava.PNG | Bin docs/doxygen-user/images/tagging-5.PNG | Bin docs/doxygen-user/images/transientcache.PNG | Bin .../images/unallocated_space_options.PNG | Bin docs/doxygen-user/images/updatedSolr_cmd.PNG | Bin docs/doxygen-user/images/wherejava.PNG | Bin docs/doxygen-user/images/zooDir.PNG | Bin docs/doxygen-user/images/zooPurge.PNG | Bin docs/doxygen-user/ingest.dox | 0 docs/doxygen-user/ingest_template.xod | 0 docs/doxygen-user/installMultiUser.dox | 0 docs/doxygen-user/keyword_search.dox | 0 docs/doxygen-user/main.dox | 0 docs/doxygen-user/module_install.dox | 0 docs/doxygen-user/multiuser-security.dox | 0 docs/doxygen-user/multiuser.dox | 0 docs/doxygen-user/performance.dox | 0 docs/doxygen-user/result_viewers.dox | 0 docs/doxygen-user/uilayout.dox | 0 docs/doxygen-user/workflow.dox | 0 docs/doxygen/debugTsk.dox | 0 docs/doxygen/doxygen_docs/.gitignore | 0 docs/doxygen/doxygen_docs/api-docs/.gitignore | 0 git-daemon-export-okay | 0 icons/icon.icns | Bin icons/icon.ico | Bin nbproject/build-impl.xml | 0 nbproject/genfiles.properties | 0 nbproject/platform.properties | 0 nbproject/platform.xml | 0 nbproject/project.properties | 0 nbproject/project.xml | 0 .../bigRoundFile.dat | Bin .../notRoundFile.dat | Bin test/README.txt | 0 test/input/NSRL.txt-md5.idx | 0 test/input/notablehashes.txt-md5.idx | 0 test/input/notablekeywords.xml | 0 test/script/Emailer.py | 0 test/script/config.xml | 0 test/script/getcounts.py | 0 thirdparty/LICENSE-2.0.txt | 0 thirdparty/ant-contrib/1.0b3/ant-contrib.jar | Bin thirdparty/ant-contrib/1.0b3/docs/LICENSE.txt | 0 .../1.0b3/docs/api/allclasses-frame.html | 0 .../1.0b3/docs/api/allclasses-noframe.html | 0 .../1.0b3/docs/api/constant-values.html | 0 .../1.0b3/docs/api/deprecated-list.html | 0 .../ant-contrib/1.0b3/docs/api/help-doc.html | 0 .../ant-contrib/1.0b3/docs/api/index-all.html | 0 .../ant-contrib/1.0b3/docs/api/index.html | 0 .../net/sf/antcontrib/AntContribVersion.html | 0 .../antcontrib/antclipse/ClassPathParser.html | 0 .../antcontrib/antclipse/ClassPathTask.html | 0 .../antcontrib/antclipse/package-frame.html | 0 .../antcontrib/antclipse/package-summary.html | 0 .../sf/antcontrib/antclipse/package-tree.html | 0 .../net/sf/antcontrib/antserver/Command.html | 0 .../net/sf/antcontrib/antserver/Response.html | 0 .../api/net/sf/antcontrib/antserver/Util.html | 0 .../antcontrib/antserver/client/Client.html | 0 .../antserver/client/ClientTask.html | 0 .../antserver/client/package-frame.html | 0 .../antserver/client/package-summary.html | 0 .../antserver/client/package-tree.html | 0 .../antserver/commands/AbstractCommand.html | 0 .../antserver/commands/DisconnectCommand.html | 0 .../antserver/commands/HelloWorldCommand.html | 0 .../antserver/commands/PropertyContainer.html | 0 .../commands/ReferenceContainer.html | 0 .../antserver/commands/RunAntCommand.html | 0 .../antserver/commands/RunTargetCommand.html | 0 .../antserver/commands/SendFileCommand.html | 0 .../antserver/commands/ShutdownCommand.html | 0 .../antserver/commands/package-frame.html | 0 .../antserver/commands/package-summary.html | 0 .../antserver/commands/package-tree.html | 0 .../antcontrib/antserver/package-frame.html | 0 .../antcontrib/antserver/package-summary.html | 0 .../sf/antcontrib/antserver/package-tree.html | 0 .../server/ConnectionBuildListener.html | 0 .../antserver/server/ConnectionHandler.html | 0 .../antcontrib/antserver/server/Server.html | 0 .../antserver/server/ServerTask.html | 0 .../antserver/server/package-frame.html | 0 .../antserver/server/package-summary.html | 0 .../antserver/server/package-tree.html | 0 .../api/net/sf/antcontrib/design/Depends.html | 0 .../api/net/sf/antcontrib/design/Design.html | 0 .../antcontrib/design/InstructionVisitor.html | 0 .../api/net/sf/antcontrib/design/Log.html | 0 .../api/net/sf/antcontrib/design/Package.html | 0 .../sf/antcontrib/design/VerifyDesign.html | 0 .../design/VerifyDesignDelegate.html | 0 .../sf/antcontrib/design/package-frame.html | 0 .../sf/antcontrib/design/package-summary.html | 0 .../sf/antcontrib/design/package-tree.html | 0 .../net/sf/antcontrib/inifile/IniFile.html | 0 .../inifile/IniFileTask.Exists.html | 0 .../antcontrib/inifile/IniFileTask.Get.html | 0 .../inifile/IniFileTask.IniOperation.html | 0 .../IniFileTask.IniOperationConditional.html | 0 ...niFileTask.IniOperationPropertySetter.html | 0 .../inifile/IniFileTask.Remove.html | 0 .../antcontrib/inifile/IniFileTask.Set.html | 0 .../sf/antcontrib/inifile/IniFileTask.html | 0 .../net/sf/antcontrib/inifile/IniPart.html | 0 .../sf/antcontrib/inifile/IniProperty.html | 0 .../net/sf/antcontrib/inifile/IniSection.html | 0 .../sf/antcontrib/inifile/package-frame.html | 0 .../antcontrib/inifile/package-summary.html | 0 .../sf/antcontrib/inifile/package-tree.html | 0 .../sf/antcontrib/input/GUIInputHandler.html | 0 .../sf/antcontrib/input/package-frame.html | 0 .../sf/antcontrib/input/package-summary.html | 0 .../net/sf/antcontrib/input/package-tree.html | 0 .../net/sf/antcontrib/logic/AntCallBack.html | 0 .../api/net/sf/antcontrib/logic/AntFetch.html | 0 .../api/net/sf/antcontrib/logic/Assert.html | 0 .../api/net/sf/antcontrib/logic/ForEach.html | 0 .../api/net/sf/antcontrib/logic/ForTask.html | 0 .../sf/antcontrib/logic/IfTask.ElseIf.html | 0 .../api/net/sf/antcontrib/logic/IfTask.html | 0 .../logic/OutOfDate.CollectionEnum.html | 0 .../logic/OutOfDate.DeleteTargets.html | 0 .../antcontrib/logic/OutOfDate.MyMapper.html | 0 .../net/sf/antcontrib/logic/OutOfDate.html | 0 .../sf/antcontrib/logic/ProjectDelegate.html | 0 .../net/sf/antcontrib/logic/Relentless.html | 0 .../sf/antcontrib/logic/RunTargetTask.html | 0 .../net/sf/antcontrib/logic/Switch.Case.html | 0 .../api/net/sf/antcontrib/logic/Switch.html | 0 .../api/net/sf/antcontrib/logic/Throw.html | 0 .../antcontrib/logic/TimestampSelector.html | 0 .../logic/TryCatchTask.CatchBlock.html | 0 .../net/sf/antcontrib/logic/TryCatchTask.html | 0 .../logic/condition/BooleanConditionBase.html | 0 .../logic/condition/IsGreaterThan.html | 0 .../logic/condition/IsLessThan.html | 0 .../logic/condition/IsPropertyFalse.html | 0 .../logic/condition/IsPropertyTrue.html | 0 .../logic/condition/package-frame.html | 0 .../logic/condition/package-summary.html | 0 .../logic/condition/package-tree.html | 0 .../sf/antcontrib/logic/package-frame.html | 0 .../sf/antcontrib/logic/package-summary.html | 0 .../net/sf/antcontrib/logic/package-tree.html | 0 .../net/sf/antcontrib/math/Evaluateable.html | 0 .../docs/api/net/sf/antcontrib/math/Math.html | 0 .../api/net/sf/antcontrib/math/MathTask.html | 0 .../api/net/sf/antcontrib/math/Numeric.html | 0 .../api/net/sf/antcontrib/math/Operation.html | 0 .../net/sf/antcontrib/math/package-frame.html | 0 .../sf/antcontrib/math/package-summary.html | 0 .../net/sf/antcontrib/math/package-tree.html | 0 .../sf/antcontrib/net/PostTask.Cookie.html | 0 .../api/net/sf/antcontrib/net/PostTask.html | 0 .../docs/api/net/sf/antcontrib/net/Prop.html | 0 .../net/sf/antcontrib/net/URLImportTask.html | 0 .../httpclient/AbstractHttpStateTypeTask.html | 0 .../AbstractMethodTask.ResponseHeader.html | 0 .../net/httpclient/AbstractMethodTask.html | 0 .../net/httpclient/AddCookieTask.html | 0 .../net/httpclient/AddCredentialsTask.html | 0 .../net/httpclient/ClearCookiesTask.html | 0 .../net/httpclient/ClearCredentialsTask.html | 0 .../net/httpclient/ClientParams.html | 0 .../net/httpclient/Credentials.html | 0 .../net/httpclient/GetCookieTask.html | 0 .../net/httpclient/GetMethodTask.html | 0 .../net/httpclient/HeadMethodTask.html | 0 .../antcontrib/net/httpclient/HostConfig.html | 0 .../antcontrib/net/httpclient/HostParams.html | 0 .../net/httpclient/HttpClientType.html | 0 .../net/httpclient/HttpStateType.html | 0 .../net/httpclient/MethodParams.html | 0 .../net/httpclient/Params.BooleanParam.html | 0 .../net/httpclient/Params.DoubleParam.html | 0 .../net/httpclient/Params.IntParam.html | 0 .../net/httpclient/Params.LongParam.html | 0 .../net/httpclient/Params.Param.html | 0 .../net/httpclient/Params.StringParam.html | 0 .../sf/antcontrib/net/httpclient/Params.html | 0 .../PostMethodTask.FilePartType.html | 0 .../PostMethodTask.TextPartType.html | 0 .../net/httpclient/PostMethodTask.html | 0 .../httpclient/PurgeExpiredCookiesTask.html | 0 .../net/httpclient/package-frame.html | 0 .../net/httpclient/package-summary.html | 0 .../net/httpclient/package-tree.html | 0 .../net/sf/antcontrib/net/package-frame.html | 0 .../sf/antcontrib/net/package-summary.html | 0 .../net/sf/antcontrib/net/package-tree.html | 0 .../api/net/sf/antcontrib/package-frame.html | 0 .../net/sf/antcontrib/package-summary.html | 0 .../api/net/sf/antcontrib/package-tree.html | 0 .../AntPerformanceListener.StopWatch.html | 0 ...rformanceListener.StopWatchComparator.html | 0 .../perf/AntPerformanceListener.html | 0 .../api/net/sf/antcontrib/perf/StopWatch.html | 0 .../net/sf/antcontrib/perf/StopWatchTask.html | 0 .../net/sf/antcontrib/perf/package-frame.html | 0 .../sf/antcontrib/perf/package-summary.html | 0 .../net/sf/antcontrib/perf/package-tree.html | 0 .../net/sf/antcontrib/platform/OsFamily.html | 0 .../net/sf/antcontrib/platform/Platform.html | 0 .../antcontrib/platform/ShellScriptTask.html | 0 .../sf/antcontrib/platform/package-frame.html | 0 .../antcontrib/platform/package-summary.html | 0 .../sf/antcontrib/platform/package-tree.html | 0 .../net/sf/antcontrib/process/ForgetTask.html | 0 .../sf/antcontrib/process/Limit.TimeUnit.html | 0 .../api/net/sf/antcontrib/process/Limit.html | 0 .../sf/antcontrib/process/package-frame.html | 0 .../antcontrib/process/package-summary.html | 0 .../sf/antcontrib/process/package-tree.html | 0 .../property/AbstractPropertySetterTask.html | 0 .../antcontrib/property/PathFilterTask.html | 0 .../sf/antcontrib/property/PathToFileSet.html | 0 .../sf/antcontrib/property/PropertyCopy.html | 0 .../antcontrib/property/PropertySelector.html | 0 .../net/sf/antcontrib/property/RegexTask.html | 0 .../net/sf/antcontrib/property/RegexUtil.html | 0 .../net/sf/antcontrib/property/SortList.html | 0 .../sf/antcontrib/property/URLEncodeTask.html | 0 .../net/sf/antcontrib/property/Variable.html | 0 .../sf/antcontrib/property/package-frame.html | 0 .../antcontrib/property/package-summary.html | 0 .../sf/antcontrib/property/package-tree.html | 0 .../api/net/sf/antcontrib/util/Reflector.html | 0 .../net/sf/antcontrib/util/ThreadPool.html | 0 .../sf/antcontrib/util/ThreadPoolThread.html | 0 .../net/sf/antcontrib/util/package-frame.html | 0 .../sf/antcontrib/util/package-summary.html | 0 .../net/sf/antcontrib/util/package-tree.html | 0 .../sf/antcontrib/walls/CompileWithWalls.html | 0 .../api/net/sf/antcontrib/walls/Package.html | 0 .../net/sf/antcontrib/walls/SilentCopy.html | 0 .../net/sf/antcontrib/walls/SilentMove.html | 0 .../api/net/sf/antcontrib/walls/Walls.html | 0 .../sf/antcontrib/walls/package-frame.html | 0 .../sf/antcontrib/walls/package-summary.html | 0 .../net/sf/antcontrib/walls/package-tree.html | 0 .../1.0b3/docs/api/overview-frame.html | 0 .../1.0b3/docs/api/overview-summary.html | 0 .../1.0b3/docs/api/overview-tree.html | 0 .../ant-contrib/1.0b3/docs/api/package-list | 0 .../1.0b3/docs/api/resources/inherit.gif | Bin .../1.0b3/docs/api/serialized-form.html | 0 .../ant-contrib/1.0b3/docs/api/stylesheet.css | 0 .../ant-contrib/1.0b3/docs/manual/index.html | 0 .../docs/manual/tasks/antcallback_task.html | 0 .../docs/manual/tasks/antclipse_task.html | 0 .../docs/manual/tasks/antfetch_task.html | 0 .../1.0b3/docs/manual/tasks/assert_task.html | 0 .../docs/manual/tasks/compilewithwalls.html | 0 .../1.0b3/docs/manual/tasks/for.html | 0 .../1.0b3/docs/manual/tasks/foreach.html | 0 .../1.0b3/docs/manual/tasks/forget.html | 0 .../docs/manual/tasks/get-cookie_task.html | 0 .../docs/manual/tasks/get-method_task.html | 0 .../docs/manual/tasks/head-method_task.html | 0 .../docs/manual/tasks/http-client_type.html | 0 .../docs/manual/tasks/http-state_type.html | 0 .../1.0b3/docs/manual/tasks/if.html | 0 .../1.0b3/docs/manual/tasks/importurl.html | 0 .../1.0b3/docs/manual/tasks/index.html | 0 .../1.0b3/docs/manual/tasks/inifile.html | 0 .../1.0b3/docs/manual/tasks/limit_task.html | 0 .../1.0b3/docs/manual/tasks/math_task.html | 0 .../docs/manual/tasks/method_task_common.html | 0 .../docs/manual/tasks/more_conditions.html | 0 .../1.0b3/docs/manual/tasks/osfamily.html | 0 .../1.0b3/docs/manual/tasks/outofdate.html | 0 .../docs/manual/tasks/pathtofileset.html | 0 .../manual/tasks/performance_monitor.html | 0 .../docs/manual/tasks/post-method_task.html | 0 .../1.0b3/docs/manual/tasks/post_task.html | 0 .../1.0b3/docs/manual/tasks/propertycopy.html | 0 .../docs/manual/tasks/propertyregex.html | 0 .../docs/manual/tasks/propertyselector.html | 0 .../1.0b3/docs/manual/tasks/relentless.html | 0 .../1.0b3/docs/manual/tasks/runtarget.html | 0 .../1.0b3/docs/manual/tasks/server_tasks.html | 0 .../1.0b3/docs/manual/tasks/shellscript.html | 0 .../1.0b3/docs/manual/tasks/sortlist.html | 0 .../docs/manual/tasks/stopwatch_task.html | 0 .../1.0b3/docs/manual/tasks/switch.html | 0 .../1.0b3/docs/manual/tasks/throw.html | 0 .../docs/manual/tasks/timestampselector.html | 0 .../1.0b3/docs/manual/tasks/toc.html | 0 .../1.0b3/docs/manual/tasks/trycatch.html | 0 .../1.0b3/docs/manual/tasks/urlencode.html | 0 .../docs/manual/tasks/variable_task.html | 0 .../1.0b3/docs/manual/tasks/verifydesign.html | 0 .../manual/tasks/verifylegacytutorial.html | 0 .../manual/tasks/verifynewprojtutorial.html | 0 thirdparty/ant-contrib/1.0b3/lib/bcel-5.1.jar | Bin .../1.0b3/lib/commons-httpclient-3.0.1.jar | Bin .../1.0b3/lib/commons-logging-1.0.4.jar | Bin .../ant-contrib/1.0b3/lib/ivy-1.3.1.jar | Bin .../apache-mime4j-core-0.8.0-SNAPSHOT.jar | Bin .../apache-mime4j-dom-0.8.0-SNAPSHOT.jar | Bin ...he-mime4j-mbox-iterator-0.8.0-SNAPSHOT.jar | Bin .../windows/i386/0.10.7/gstreamer.zip | Bin .../java-libpst/java-libpst-1.0-SNAPSHOT.jar | Bin thirdparty/jdiff/v-custom/.cvsignore | 0 thirdparty/jdiff/v-custom/LICENSE.txt | 0 thirdparty/jdiff/v-custom/README.txt | 0 thirdparty/jdiff/v-custom/doc/CHANGES.txt | 0 .../jdiff/v-custom/doc/JDiffArticle.pdf | Bin .../jdiff/v-custom/doc/KNOWN_LIMITATIONS.txt | 0 thirdparty/jdiff/v-custom/doc/TODO | 0 thirdparty/jdiff/v-custom/doc/dev_notes.txt | 0 thirdparty/jdiff/v-custom/doc/index.html | 0 thirdparty/jdiff/v-custom/doc/jdiff.html | 0 thirdparty/jdiff/v-custom/doc/stylesheet.css | 0 thirdparty/jdiff/v-custom/index.xhtml | 0 thirdparty/jdiff/v-custom/jdiff.jar | Bin .../jdiff/v-custom/lib/2000/10/XMLSchema | 0 .../v-custom/lib/2000/10/XMLSchema-instance | 0 thirdparty/jdiff/v-custom/lib/2001/XMLSchema | 0 .../v-custom/lib/2001/XMLSchema-instance | 0 thirdparty/jdiff/v-custom/lib/Null.java | 0 thirdparty/jdiff/v-custom/lib/background.gif | Bin thirdparty/jdiff/v-custom/lib/black.gif | Bin thirdparty/jdiff/v-custom/lib/classdoc.jar | Bin thirdparty/jdiff/v-custom/lib/jdiff_logo.gif | Bin thirdparty/jdiff/v-custom/lib/new.gif | Bin thirdparty/jdiff/v-custom/lib/xerces.jar | Bin thirdparty/jdiff/v-custom/src/api.xsd | 0 thirdparty/jdiff/v-custom/src/comments.xsd | 0 .../jdiff/v-custom/src/jdiff/.cvsignore | 0 thirdparty/jdiff/v-custom/src/jdiff/API.java | 0 .../v-custom/src/jdiff/APIComparator.java | 0 .../jdiff/v-custom/src/jdiff/APIDiff.java | 0 .../jdiff/v-custom/src/jdiff/APIHandler.java | 0 .../jdiff/v-custom/src/jdiff/ClassAPI.java | 0 .../jdiff/v-custom/src/jdiff/ClassDiff.java | 0 .../jdiff/v-custom/src/jdiff/Comments.java | 0 .../v-custom/src/jdiff/CommentsHandler.java | 0 .../src/jdiff/CompareClassPdiffs.java | 0 .../v-custom/src/jdiff/ComparePkgPdiffs.java | 0 .../v-custom/src/jdiff/ConstructorAPI.java | 0 thirdparty/jdiff/v-custom/src/jdiff/Diff.java | 0 .../jdiff/v-custom/src/jdiff/DiffMyers.java | 0 .../jdiff/v-custom/src/jdiff/DiffOutput.java | 0 .../jdiff/v-custom/src/jdiff/FieldAPI.java | 0 .../jdiff/v-custom/src/jdiff/HTMLFiles.java | 0 .../jdiff/v-custom/src/jdiff/HTMLIndexes.java | 0 .../src/jdiff/HTMLReportGenerator.java | 0 .../v-custom/src/jdiff/HTMLStatistics.java | 0 .../jdiff/v-custom/src/jdiff/JDiff.java | 0 .../v-custom/src/jdiff/JDiffAntTask.java | 0 .../jdiff/v-custom/src/jdiff/MemberDiff.java | 0 .../v-custom/src/jdiff/MergeChanges.java | 0 .../jdiff/v-custom/src/jdiff/MethodAPI.java | 0 .../jdiff/v-custom/src/jdiff/Modifiers.java | 0 .../jdiff/v-custom/src/jdiff/Options.java | 0 .../jdiff/v-custom/src/jdiff/PackageAPI.java | 0 .../jdiff/v-custom/src/jdiff/PackageDiff.java | 0 .../jdiff/v-custom/src/jdiff/ParamAPI.java | 0 .../v-custom/src/jdiff/RootDocToXML.java | 0 .../v-custom/src/jdiff/ScriptReport.java | 0 .../v-custom/src/jdiff/SingleComment.java | 0 .../v-custom/src/jdiff/StreamReader.java | 0 .../jdiff/v-custom/src/jdiff/XMLToAPI.java | 0 thirdparty/jdom/jdom-2.0.5-contrib.jar | Bin thirdparty/jdom/jdom-2.0.5.jar | Bin thirdparty/jfxrt/1.7.11/jfxrt.jar | Bin thirdparty/jfxrt/1.7.13/jfxrt.jar | Bin thirdparty/jfxrt/1.7.21/jfxrt.jar | Bin thirdparty/junit/7.3.1/junit.zip | Bin thirdparty/junit/7.3/junit.zip | Bin thirdparty/junit/8.2/junit.zip | Bin .../libscalpel_jni/current/libscalpel_jni.zip | Bin thirdparty/opencv/ext/opencv-248.jar | Bin .../amd64/api-ms-win-core-console-l1-1-0.dll | Bin .../amd64/api-ms-win-core-datetime-l1-1-0.dll | Bin .../amd64/api-ms-win-core-debug-l1-1-0.dll | Bin .../api-ms-win-core-errorhandling-l1-1-0.dll | Bin .../lib/amd64/api-ms-win-core-file-l1-1-0.dll | Bin .../lib/amd64/api-ms-win-core-file-l1-2-0.dll | Bin .../lib/amd64/api-ms-win-core-file-l2-1-0.dll | Bin .../amd64/api-ms-win-core-handle-l1-1-0.dll | Bin .../lib/amd64/api-ms-win-core-heap-l1-1-0.dll | Bin .../api-ms-win-core-interlocked-l1-1-0.dll | Bin .../api-ms-win-core-libraryloader-l1-1-0.dll | Bin .../api-ms-win-core-localization-l1-2-0.dll | Bin .../amd64/api-ms-win-core-memory-l1-1-0.dll | Bin .../api-ms-win-core-namedpipe-l1-1-0.dll | Bin ...-ms-win-core-processenvironment-l1-1-0.dll | Bin .../api-ms-win-core-processthreads-l1-1-0.dll | Bin .../api-ms-win-core-processthreads-l1-1-1.dll | Bin .../amd64/api-ms-win-core-profile-l1-1-0.dll | Bin .../api-ms-win-core-rtlsupport-l1-1-0.dll | Bin .../amd64/api-ms-win-core-string-l1-1-0.dll | Bin .../amd64/api-ms-win-core-synch-l1-1-0.dll | Bin .../amd64/api-ms-win-core-synch-l1-2-0.dll | Bin .../amd64/api-ms-win-core-sysinfo-l1-1-0.dll | Bin .../amd64/api-ms-win-core-timezone-l1-1-0.dll | Bin .../lib/amd64/api-ms-win-core-util-l1-1-0.dll | Bin .../lib/amd64/api-ms-win-crt-conio-l1-1-0.dll | Bin .../amd64/api-ms-win-crt-convert-l1-1-0.dll | Bin .../api-ms-win-crt-environment-l1-1-0.dll | Bin .../api-ms-win-crt-filesystem-l1-1-0.dll | Bin .../lib/amd64/api-ms-win-crt-heap-l1-1-0.dll | Bin .../amd64/api-ms-win-crt-locale-l1-1-0.dll | Bin .../lib/amd64/api-ms-win-crt-math-l1-1-0.dll | Bin .../amd64/api-ms-win-crt-multibyte-l1-1-0.dll | Bin .../amd64/api-ms-win-crt-private-l1-1-0.dll | Bin .../amd64/api-ms-win-crt-process-l1-1-0.dll | Bin .../amd64/api-ms-win-crt-runtime-l1-1-0.dll | Bin .../lib/amd64/api-ms-win-crt-stdio-l1-1-0.dll | Bin .../amd64/api-ms-win-crt-string-l1-1-0.dll | Bin .../lib/amd64/api-ms-win-crt-time-l1-1-0.dll | Bin .../amd64/api-ms-win-crt-utility-l1-1-0.dll | Bin thirdparty/opencv/lib/amd64/concrt140.dll | Bin thirdparty/opencv/lib/amd64/libeay32.dll | Bin thirdparty/opencv/lib/amd64/libewf.dll | Bin thirdparty/opencv/lib/amd64/libiconv-2.dll | Bin thirdparty/opencv/lib/amd64/libintl-8.dll | Bin thirdparty/opencv/lib/amd64/libpq.dll | Bin thirdparty/opencv/lib/amd64/libvhdi.dll | Bin thirdparty/opencv/lib/amd64/libvmdk.dll | Bin thirdparty/opencv/lib/amd64/msvcp140.dll | Bin thirdparty/opencv/lib/amd64/msvcr120.dll | Bin .../opencv/lib/amd64/opencv_ffmpeg248_64.dll | Bin .../opencv/lib/amd64/opencv_java248.dll | Bin thirdparty/opencv/lib/amd64/ssleay32.dll | Bin thirdparty/opencv/lib/amd64/ucrtbase.dll | Bin thirdparty/opencv/lib/amd64/vccorlib140.dll | Bin thirdparty/opencv/lib/amd64/vcruntime140.dll | Bin thirdparty/opencv/lib/amd64/zlib.dll | Bin .../opencv/lib/i386/opencv_ffmpeg248.dll | Bin thirdparty/opencv/lib/i386/opencv_java248.dll | Bin .../opencv/lib/i586/opencv_ffmpeg248_64.dll | Bin thirdparty/opencv/lib/i586/opencv_java248.dll | Bin .../opencv/lib/i686/opencv_ffmpeg248_64.dll | Bin thirdparty/opencv/lib/i686/opencv_java248.dll | Bin .../opencv/lib/x86/opencv_ffmpeg248.dll | Bin thirdparty/opencv/lib/x86/opencv_java248.dll | Bin .../x86_64/api-ms-win-core-console-l1-1-0.dll | Bin .../api-ms-win-core-datetime-l1-1-0.dll | Bin .../x86_64/api-ms-win-core-debug-l1-1-0.dll | Bin .../api-ms-win-core-errorhandling-l1-1-0.dll | Bin .../x86_64/api-ms-win-core-file-l1-1-0.dll | Bin .../x86_64/api-ms-win-core-file-l1-2-0.dll | Bin .../x86_64/api-ms-win-core-file-l2-1-0.dll | Bin .../x86_64/api-ms-win-core-handle-l1-1-0.dll | Bin .../x86_64/api-ms-win-core-heap-l1-1-0.dll | Bin .../api-ms-win-core-interlocked-l1-1-0.dll | Bin .../api-ms-win-core-libraryloader-l1-1-0.dll | Bin .../api-ms-win-core-localization-l1-2-0.dll | Bin .../x86_64/api-ms-win-core-memory-l1-1-0.dll | Bin .../api-ms-win-core-namedpipe-l1-1-0.dll | Bin ...-ms-win-core-processenvironment-l1-1-0.dll | Bin .../api-ms-win-core-processthreads-l1-1-0.dll | Bin .../api-ms-win-core-processthreads-l1-1-1.dll | Bin .../x86_64/api-ms-win-core-profile-l1-1-0.dll | Bin .../api-ms-win-core-rtlsupport-l1-1-0.dll | Bin .../x86_64/api-ms-win-core-string-l1-1-0.dll | Bin .../x86_64/api-ms-win-core-synch-l1-1-0.dll | Bin .../x86_64/api-ms-win-core-synch-l1-2-0.dll | Bin .../x86_64/api-ms-win-core-sysinfo-l1-1-0.dll | Bin .../api-ms-win-core-timezone-l1-1-0.dll | Bin .../x86_64/api-ms-win-core-util-l1-1-0.dll | Bin .../x86_64/api-ms-win-crt-conio-l1-1-0.dll | Bin .../x86_64/api-ms-win-crt-convert-l1-1-0.dll | Bin .../api-ms-win-crt-environment-l1-1-0.dll | Bin .../api-ms-win-crt-filesystem-l1-1-0.dll | Bin .../lib/x86_64/api-ms-win-crt-heap-l1-1-0.dll | Bin .../x86_64/api-ms-win-crt-locale-l1-1-0.dll | Bin .../lib/x86_64/api-ms-win-crt-math-l1-1-0.dll | Bin .../api-ms-win-crt-multibyte-l1-1-0.dll | Bin .../x86_64/api-ms-win-crt-private-l1-1-0.dll | Bin .../x86_64/api-ms-win-crt-process-l1-1-0.dll | Bin .../x86_64/api-ms-win-crt-runtime-l1-1-0.dll | Bin .../x86_64/api-ms-win-crt-stdio-l1-1-0.dll | Bin .../x86_64/api-ms-win-crt-string-l1-1-0.dll | Bin .../lib/x86_64/api-ms-win-crt-time-l1-1-0.dll | Bin .../x86_64/api-ms-win-crt-utility-l1-1-0.dll | Bin thirdparty/opencv/lib/x86_64/concrt140.dll | Bin thirdparty/opencv/lib/x86_64/libeay32.dll | Bin thirdparty/opencv/lib/x86_64/libewf.dll | Bin thirdparty/opencv/lib/x86_64/libiconv-2.dll | Bin thirdparty/opencv/lib/x86_64/libintl-8.dll | Bin thirdparty/opencv/lib/x86_64/libpq.dll | Bin thirdparty/opencv/lib/x86_64/libvhdi.dll | Bin thirdparty/opencv/lib/x86_64/libvmdk.dll | Bin thirdparty/opencv/lib/x86_64/msvcp140.dll | Bin thirdparty/opencv/lib/x86_64/msvcr120.dll | Bin .../opencv/lib/x86_64/opencv_ffmpeg248_64.dll | Bin .../opencv/lib/x86_64/opencv_java248.dll | Bin thirdparty/opencv/lib/x86_64/ssleay32.dll | Bin thirdparty/opencv/lib/x86_64/ucrtbase.dll | Bin thirdparty/opencv/lib/x86_64/vccorlib140.dll | Bin thirdparty/opencv/lib/x86_64/vcruntime140.dll | Bin thirdparty/opencv/lib/x86_64/zlib.dll | Bin thirdparty/pasco2/.classpath | 0 thirdparty/pasco2/.project | 0 .../.settings/org.eclipse.jdt.core.prefs | 0 .../pasco2/.settings/org.eclipse.jdt.ui.prefs | 0 thirdparty/pasco2/build.xml | 0 thirdparty/pasco2/lib/commons-cli-1.0.jar | Bin .../pasco2/lib/commons-collections-3.1.jar | Bin thirdparty/pasco2/lib/ctypes4j.dll | Bin thirdparty/pasco2/lib/ctypes4j.jar | Bin thirdparty/pasco2/lib/ctypes4j.zip | Bin thirdparty/pasco2/lib/pasco2.jar | Bin thirdparty/pasco2/lib/trove-1.0.2.jar | Bin thirdparty/pasco2/lib/trove-3.0.2.jar | Bin thirdparty/pasco2/results/pasco2Result0.txt | 0 thirdparty/pasco2/src/isi/pasco2/Main.java | 0 thirdparty/pasco2/src/isi/pasco2/Poller.java | 0 .../handler/AbstractPrinterHandler.java | 0 .../pasco2/handler/CacheAccessHandler.java | 0 .../pasco2/handler/CountingCacheHandler.java | 0 .../isi/pasco2/handler/DefaultHandler.java | 0 .../pasco2/handler/HistoryAccessHandler.java | 0 .../pasco2/handler/Pasco2CacheHandler.java | 0 .../pasco2/handler/Pasco2HistoryHandler.java | 0 .../pasco2/io/EnhancedRandomAccessFile.java | 0 .../src/isi/pasco2/io/FastReadIndexFile.java | 0 .../pasco2/src/isi/pasco2/io/IndexFile.java | 0 .../src/isi/pasco2/model/REDRRecord.java | 0 .../isi/pasco2/model/RecognisedRecord.java | 0 .../pasco2/src/isi/pasco2/model/Record.java | 0 .../src/isi/pasco2/model/URLLEAKRecord.java | 0 .../src/isi/pasco2/model/UnknownRecord.java | 0 .../parser/AbstractValidRecordIterator.java | 0 .../isi/pasco2/parser/AllRecordIterator.java | 0 .../src/isi/pasco2/parser/Allocator.java | 0 .../src/isi/pasco2/parser/DateTime.java | 0 .../src/isi/pasco2/parser/HashBlock.java | 0 .../isi/pasco2/parser/HashBlockIterator.java | 0 .../src/isi/pasco2/parser/HashRecord.java | 0 .../isi/pasco2/parser/HashRecordIterator.java | 0 .../isi/pasco2/parser/IECacheFileParser.java | 0 .../pasco2/parser/IEHistoryFileParser.java | 0 .../isi/pasco2/parser/IEIndexFileParser.java | 0 .../src/isi/pasco2/parser/RecordIterator.java | 0 .../pasco2/parser/ValidRecordIterator.java | 0 .../src/isi/pasco2/parser/time/DOSTime.java | 0 .../src/isi/pasco2/parser/time/FileTime.java | 0 .../isi/pasco2/poller/DifferenceHandler.java | 0 .../src/isi/pasco2/util/HexFormatter.java | 0 .../src/isi/pasco2/util/StructConverter.java | 0 .../test/isi/pasco2/TestAllocationLayer.java | 0 .../pasco2/test/isi/pasco2/TestDOSTime.java | 0 .../pasco2/test/isi/pasco2/TestFileTime.java | 0 .../pasco2/test/isi/pasco2/TestPackage.java | 0 .../pasco2/test/isi/pasco2/TestPlatform.java | 0 .../test/isi/pasco2/TestReadFunctions.java | 0 .../test/isi/pasco2/TestRecordLayer.java | 0 .../test/isi/pasco2/empty.cache.index.dat | Bin .../test/isi/pasco2/empty.history.index.dat | Bin .../test/isi/pasco2/first.cache.index.dat | Bin .../test/isi/pasco2/first.history.index.dat | Bin .../test/isi/pasco2/platform/FILETIME.java | 0 .../test/isi/pasco2/platform/SYSTEMTIME.java | 0 thirdparty/photorec_exec/63/cygwin | Bin thirdparty/photorec_exec/AUTHORS.txt | 0 thirdparty/photorec_exec/COPYING.txt | 0 thirdparty/photorec_exec/INFO | 0 thirdparty/photorec_exec/NEWS.txt | 0 thirdparty/photorec_exec/QtCore4.dll | Bin thirdparty/photorec_exec/QtGui4.dll | Bin thirdparty/photorec_exec/THANKS.txt | 0 thirdparty/photorec_exec/VERSION.txt | 0 thirdparty/photorec_exec/cyggcc_s-1.dll | Bin thirdparty/photorec_exec/cygiconv-2.dll | Bin thirdparty/photorec_exec/cygjpeg-8.dll | Bin thirdparty/photorec_exec/cygncursesw-10.dll | Bin thirdparty/photorec_exec/cygssp-0.dll | Bin thirdparty/photorec_exec/cygwin1.dll | Bin thirdparty/photorec_exec/cygz.dll | Bin thirdparty/photorec_exec/documentation.html | 0 thirdparty/photorec_exec/fidentify_win.exe | Bin thirdparty/photorec_exec/iconv.dll | Bin thirdparty/photorec_exec/libgcc_s_sjlj-1.dll | Bin thirdparty/photorec_exec/libjpeg-62.dll | Bin thirdparty/photorec_exec/libpng16-16.dll | Bin thirdparty/photorec_exec/libssp-0.dll | Bin thirdparty/photorec_exec/libstdc++-6.dll | Bin thirdparty/photorec_exec/libwinpthread-1.dll | Bin thirdparty/photorec_exec/photorec_win.exe | Bin .../plugins/BartPE/Get_Files.cmd | 0 .../photorec_exec/plugins/BartPE/Help.htm | 0 .../photorec_exec/plugins/BartPE/RESET.cmd | 0 .../photorec_exec/plugins/BartPE/ReadMe.txt | 0 .../plugins/BartPE/SCRIPTS/Start_INF.dat | 0 .../plugins/BartPE/SCRIPTS/StaticINF.dat | 0 .../photorec_exec/plugins/BartPE/start.inf | 0 .../plugins/BartPE/testdisk_nu2menu.xml | 0 .../photorec_exec/plugins/WinBuilder/Help.htm | 0 .../plugins/WinBuilder/ReadMe.txt | 0 .../plugins/WinBuilder/TestDisk.script | 0 thirdparty/photorec_exec/qphotorec_win.exe | Bin thirdparty/photorec_exec/readme.txt | 0 thirdparty/photorec_exec/testdisk_win.exe | Bin thirdparty/photorec_exec/zlib1.dll | Bin thirdparty/rejistry/Rejistry-1.0-SNAPSHOT.jar | Bin thirdparty/rr-full/license.txt | 0 thirdparty/rr-full/p2x5124.dll | Bin thirdparty/rr-full/plugins/acmru.pl | 0 thirdparty/rr-full/plugins/adoberdr.pl | 0 thirdparty/rr-full/plugins/ahaha.pl | 0 thirdparty/rr-full/plugins/aim.pl | 0 thirdparty/rr-full/plugins/all | 0 thirdparty/rr-full/plugins/amcache.pl | 0 thirdparty/rr-full/plugins/aports.pl | 0 thirdparty/rr-full/plugins/appcertdlls.pl | 0 thirdparty/rr-full/plugins/appcompatcache.pl | 0 .../rr-full/plugins/appcompatcache_tln.pl | 0 thirdparty/rr-full/plugins/appcompatflags.pl | 0 thirdparty/rr-full/plugins/appinitdlls.pl | 0 thirdparty/rr-full/plugins/applets.pl | 0 thirdparty/rr-full/plugins/applets_tln.pl | 0 thirdparty/rr-full/plugins/apppaths.pl | 0 thirdparty/rr-full/plugins/apppaths_tln.pl | 0 thirdparty/rr-full/plugins/appspecific.pl | 0 thirdparty/rr-full/plugins/ares.pl | 0 thirdparty/rr-full/plugins/arpcache.pl | 0 thirdparty/rr-full/plugins/assoc.pl | 0 thirdparty/rr-full/plugins/at.pl | 0 thirdparty/rr-full/plugins/at_tln.pl | 0 thirdparty/rr-full/plugins/attachmgr.pl | 0 thirdparty/rr-full/plugins/attachmgr_tln.pl | 0 thirdparty/rr-full/plugins/audiodev.pl | 0 thirdparty/rr-full/plugins/auditfail.pl | 0 thirdparty/rr-full/plugins/auditpol.pl | 0 thirdparty/rr-full/plugins/autoendtasks.pl | 0 thirdparty/rr-full/plugins/autorun.pl | 0 thirdparty/rr-full/plugins/backuprestore.pl | 0 thirdparty/rr-full/plugins/banner.pl | 0 thirdparty/rr-full/plugins/baseline.pl | 0 thirdparty/rr-full/plugins/bho.pl | 0 thirdparty/rr-full/plugins/bitbucket.pl | 0 thirdparty/rr-full/plugins/bitbucket_user.pl | 0 thirdparty/rr-full/plugins/brisv.pl | 0 thirdparty/rr-full/plugins/btconfig.pl | 0 thirdparty/rr-full/plugins/bthport.pl | 0 thirdparty/rr-full/plugins/cain.pl | 0 thirdparty/rr-full/plugins/ccleaner.pl | 0 thirdparty/rr-full/plugins/cdstaginginfo.pl | 0 thirdparty/rr-full/plugins/clampi.pl | 0 thirdparty/rr-full/plugins/clampitm.pl | 0 thirdparty/rr-full/plugins/clsid.pl | 0 thirdparty/rr-full/plugins/cmd_shell.pl | 0 thirdparty/rr-full/plugins/cmd_shell_tln.pl | 0 thirdparty/rr-full/plugins/cmd_shell_u.pl | 0 thirdparty/rr-full/plugins/cmdproc.pl | 0 thirdparty/rr-full/plugins/cmdproc_tln.pl | 0 thirdparty/rr-full/plugins/codeid.pl | 0 thirdparty/rr-full/plugins/comdlg32.pl | 0 thirdparty/rr-full/plugins/comfoo.pl | 0 thirdparty/rr-full/plugins/compdesc.pl | 0 thirdparty/rr-full/plugins/compname.pl | 0 thirdparty/rr-full/plugins/controlpanel.pl | 0 thirdparty/rr-full/plugins/cpldontload.pl | 0 thirdparty/rr-full/plugins/crashcontrol.pl | 0 thirdparty/rr-full/plugins/ctrlpnl.pl | 0 thirdparty/rr-full/plugins/ddm.pl | 0 thirdparty/rr-full/plugins/ddo.pl | 0 thirdparty/rr-full/plugins/decaf.pl | 0 thirdparty/rr-full/plugins/defbrowser.pl | 0 thirdparty/rr-full/plugins/del.pl | 0 thirdparty/rr-full/plugins/del_tln.pl | 0 .../rr-full/plugins/dependency_walker.pl | 0 thirdparty/rr-full/plugins/devclass.pl | 0 thirdparty/rr-full/plugins/dfrg.pl | 0 thirdparty/rr-full/plugins/diag_sr.pl | 0 thirdparty/rr-full/plugins/direct.pl | 0 thirdparty/rr-full/plugins/direct_tln.pl | 0 .../rr-full/plugins/disablelastaccess.pl | 0 thirdparty/rr-full/plugins/disablesr.pl | 0 thirdparty/rr-full/plugins/dllsearch.pl | 0 thirdparty/rr-full/plugins/dnschanger.pl | 0 thirdparty/rr-full/plugins/domains.pl | 0 thirdparty/rr-full/plugins/drivers32.pl | 0 thirdparty/rr-full/plugins/drwatson.pl | 0 thirdparty/rr-full/plugins/emdmgmt.pl | 0 thirdparty/rr-full/plugins/environment.pl | 0 thirdparty/rr-full/plugins/esent.pl | 0 thirdparty/rr-full/plugins/eventlog.pl | 0 thirdparty/rr-full/plugins/eventlogs.pl | 0 thirdparty/rr-full/plugins/fileexts.pl | 0 thirdparty/rr-full/plugins/filehistory.pl | 0 thirdparty/rr-full/plugins/findexes.pl | 0 thirdparty/rr-full/plugins/fw_config.pl | 0 thirdparty/rr-full/plugins/gauss.pl | 0 thirdparty/rr-full/plugins/gthist.pl | 0 thirdparty/rr-full/plugins/gtwhitelist.pl | 0 .../rr-full/plugins/haven_and_hearth.pl | 0 thirdparty/rr-full/plugins/hibernate.pl | 0 thirdparty/rr-full/plugins/ide.pl | 0 thirdparty/rr-full/plugins/ie_main.pl | 0 thirdparty/rr-full/plugins/ie_settings.pl | 0 thirdparty/rr-full/plugins/ie_version.pl | 0 thirdparty/rr-full/plugins/ie_zones.pl | 0 thirdparty/rr-full/plugins/iejava.pl | 0 thirdparty/rr-full/plugins/imagedev.pl | 0 thirdparty/rr-full/plugins/imagefile.pl | 0 thirdparty/rr-full/plugins/init_dlls.pl | 0 thirdparty/rr-full/plugins/inprocserver.pl | 0 thirdparty/rr-full/plugins/installedcomp.pl | 0 thirdparty/rr-full/plugins/installer.pl | 0 .../rr-full/plugins/internet_explorer_cu.pl | 0 .../rr-full/plugins/internet_settings_cu.pl | 0 thirdparty/rr-full/plugins/itempos.pl | 0 thirdparty/rr-full/plugins/javafx.pl | 0 thirdparty/rr-full/plugins/javasoft.pl | 0 thirdparty/rr-full/plugins/kankan.pl | 0 thirdparty/rr-full/plugins/kb950582.pl | 0 thirdparty/rr-full/plugins/kbdcrash.pl | 0 thirdparty/rr-full/plugins/knowndev.pl | 0 thirdparty/rr-full/plugins/landesk.pl | 0 thirdparty/rr-full/plugins/landesk_tln.pl | 0 thirdparty/rr-full/plugins/lazyshell.pl | 0 thirdparty/rr-full/plugins/legacy.pl | 0 thirdparty/rr-full/plugins/legacy_tln.pl | 0 thirdparty/rr-full/plugins/licenses.pl | 0 thirdparty/rr-full/plugins/listsoft.pl | 0 .../rr-full/plugins/liveContactsGUID.pl | 0 thirdparty/rr-full/plugins/load.pl | 0 thirdparty/rr-full/plugins/logonusername.pl | 0 thirdparty/rr-full/plugins/lsa_packages.pl | 0 thirdparty/rr-full/plugins/lsasecrets.pl | 0 thirdparty/rr-full/plugins/macaddr.pl | 0 thirdparty/rr-full/plugins/menuorder.pl | 0 thirdparty/rr-full/plugins/mixer.pl | 0 thirdparty/rr-full/plugins/mixer_tln.pl | 0 thirdparty/rr-full/plugins/mmc.pl | 0 thirdparty/rr-full/plugins/mmc_tln.pl | 0 thirdparty/rr-full/plugins/mmo.pl | 0 thirdparty/rr-full/plugins/mndmru.pl | 0 thirdparty/rr-full/plugins/mndmru_tln.pl | 0 thirdparty/rr-full/plugins/mountdev.pl | 0 thirdparty/rr-full/plugins/mountdev2.pl | 0 thirdparty/rr-full/plugins/mountdev2.pl.old | 0 thirdparty/rr-full/plugins/mp2.pl | 0 thirdparty/rr-full/plugins/mp3.pl | 0 thirdparty/rr-full/plugins/mpmru.pl | 0 thirdparty/rr-full/plugins/mrt.pl | 0 thirdparty/rr-full/plugins/msis.pl | 0 thirdparty/rr-full/plugins/mspaper.pl | 0 thirdparty/rr-full/plugins/muicache.pl | 0 thirdparty/rr-full/plugins/muicache_tln.pl | 0 thirdparty/rr-full/plugins/nero.pl | 0 thirdparty/rr-full/plugins/netassist.pl | 0 thirdparty/rr-full/plugins/netsvcs.pl | 0 thirdparty/rr-full/plugins/network.pl | 0 thirdparty/rr-full/plugins/networkcards.pl | 0 thirdparty/rr-full/plugins/networklist.pl | 0 thirdparty/rr-full/plugins/networklist_tln.pl | 0 thirdparty/rr-full/plugins/networkuid.pl | 0 thirdparty/rr-full/plugins/nic.pl | 0 thirdparty/rr-full/plugins/nic2.pl | 0 thirdparty/rr-full/plugins/nic_mst2.pl | 0 thirdparty/rr-full/plugins/nolmhash.pl | 0 thirdparty/rr-full/plugins/ntuser | 0 thirdparty/rr-full/plugins/ntusernetwork.pl | 0 thirdparty/rr-full/plugins/odysseus.pl | 0 thirdparty/rr-full/plugins/officedocs.pl | 0 thirdparty/rr-full/plugins/officedocs2010.pl | 0 .../rr-full/plugins/officedocs2010_tln.pl | 0 thirdparty/rr-full/plugins/oisc.pl | 0 thirdparty/rr-full/plugins/olsearch.pl | 0 thirdparty/rr-full/plugins/opencandy.pl | 0 thirdparty/rr-full/plugins/osversion.pl | 0 thirdparty/rr-full/plugins/osversion_tln.pl | 0 thirdparty/rr-full/plugins/outlook.pl | 0 thirdparty/rr-full/plugins/outlook2.pl | 0 thirdparty/rr-full/plugins/pagefile.pl | 0 thirdparty/rr-full/plugins/pending.pl | 0 thirdparty/rr-full/plugins/phdet.pl | 0 thirdparty/rr-full/plugins/photos.pl | 0 thirdparty/rr-full/plugins/polacdms.pl | 0 thirdparty/rr-full/plugins/policies_u.pl | 0 thirdparty/rr-full/plugins/port_dev.pl | 0 thirdparty/rr-full/plugins/prefetch.pl | 0 thirdparty/rr-full/plugins/printermru.pl | 0 thirdparty/rr-full/plugins/printers.pl | 0 thirdparty/rr-full/plugins/privoxy.pl | 0 .../rr-full/plugins/processor_architecture.pl | 0 thirdparty/rr-full/plugins/product.pl | 0 thirdparty/rr-full/plugins/productpolicy.pl | 0 thirdparty/rr-full/plugins/producttype.pl | 0 thirdparty/rr-full/plugins/profilelist.pl | 0 thirdparty/rr-full/plugins/profiler.pl | 0 thirdparty/rr-full/plugins/proxysettings.pl | 0 .../rr-full/plugins/publishingwizard.pl | 0 thirdparty/rr-full/plugins/putty.pl | 0 thirdparty/rr-full/plugins/rdphint.pl | 0 thirdparty/rr-full/plugins/rdpport.pl | 0 .../rr-full/plugins/reading_locations.pl | 0 .../rr-full/plugins/real_profilelist.pl | 0 thirdparty/rr-full/plugins/realplayer6.pl | 0 thirdparty/rr-full/plugins/realvnc.pl | 0 thirdparty/rr-full/plugins/recentdocs.pl | 0 thirdparty/rr-full/plugins/recentdocs_tln.pl | 0 thirdparty/rr-full/plugins/regback.pl | 0 thirdparty/rr-full/plugins/regtime.pl | 0 thirdparty/rr-full/plugins/regtime_tln.pl | 0 thirdparty/rr-full/plugins/removdev.pl | 0 thirdparty/rr-full/plugins/renocide.pl | 0 thirdparty/rr-full/plugins/reveton.pl | 0 thirdparty/rr-full/plugins/rlo.pl | 0 .../rr-full/plugins/rootkit_revealer.pl | 0 thirdparty/rr-full/plugins/routes.pl | 0 thirdparty/rr-full/plugins/runmru.pl | 0 thirdparty/rr-full/plugins/runmru_tln.pl | 0 thirdparty/rr-full/plugins/safeboot.pl | 0 thirdparty/rr-full/plugins/sam | 0 thirdparty/rr-full/plugins/samparse.pl | 0 thirdparty/rr-full/plugins/samparse_tln.pl | 0 thirdparty/rr-full/plugins/schedagent.pl | 0 thirdparty/rr-full/plugins/secctr.pl | 0 thirdparty/rr-full/plugins/secrets.pl | 0 thirdparty/rr-full/plugins/secrets_tln.pl | 0 thirdparty/rr-full/plugins/security | 0 .../rr-full/plugins/securityproviders.pl | 0 thirdparty/rr-full/plugins/services.pl | 0 thirdparty/rr-full/plugins/sevenzip.pl | 0 thirdparty/rr-full/plugins/sfc.pl | 0 thirdparty/rr-full/plugins/shares.pl | 0 thirdparty/rr-full/plugins/shc.pl | 0 thirdparty/rr-full/plugins/shellbags.pl | 0 thirdparty/rr-full/plugins/shellbags_test.pl | 0 thirdparty/rr-full/plugins/shellbags_tln.pl | 0 thirdparty/rr-full/plugins/shellbags_xp.pl | 0 thirdparty/rr-full/plugins/shellexec.pl | 0 thirdparty/rr-full/plugins/shellext.pl | 0 thirdparty/rr-full/plugins/shellfolders.pl | 0 thirdparty/rr-full/plugins/shelloverlay.pl | 0 thirdparty/rr-full/plugins/shutdown.pl | 0 thirdparty/rr-full/plugins/shutdowncount.pl | 0 thirdparty/rr-full/plugins/skype.pl | 0 thirdparty/rr-full/plugins/snapshot.pl | 0 thirdparty/rr-full/plugins/snapshot_viewer.pl | 0 thirdparty/rr-full/plugins/soft_run.pl | 0 thirdparty/rr-full/plugins/software | 0 thirdparty/rr-full/plugins/spp_clients.pl | 0 thirdparty/rr-full/plugins/sql_lastconnect.pl | 0 thirdparty/rr-full/plugins/srun_tln.pl | 0 thirdparty/rr-full/plugins/ssh_host_keys.pl | 0 thirdparty/rr-full/plugins/ssid.pl | 0 .../plugins/startmenuinternetapps_cu.pl | 0 .../plugins/startmenuinternetapps_lm.pl | 0 thirdparty/rr-full/plugins/startpage.pl | 0 thirdparty/rr-full/plugins/startup.pl | 0 thirdparty/rr-full/plugins/stillimage.pl | 0 thirdparty/rr-full/plugins/susclient.pl | 0 thirdparty/rr-full/plugins/svc.pl | 0 thirdparty/rr-full/plugins/svc_plus.pl | 0 thirdparty/rr-full/plugins/svc_tln.pl | 0 thirdparty/rr-full/plugins/svcdll.pl | 0 thirdparty/rr-full/plugins/svchost.pl | 0 thirdparty/rr-full/plugins/sysinternals.pl | 0 .../rr-full/plugins/sysinternals_tln.pl | 0 thirdparty/rr-full/plugins/system | 0 thirdparty/rr-full/plugins/systemindex.pl | 0 thirdparty/rr-full/plugins/termcert.pl | 0 thirdparty/rr-full/plugins/termserv.pl | 0 thirdparty/rr-full/plugins/timezone.pl | 0 thirdparty/rr-full/plugins/tracing.pl | 0 thirdparty/rr-full/plugins/tracing_tln.pl | 0 thirdparty/rr-full/plugins/trappoll.pl | 0 thirdparty/rr-full/plugins/trustrecords.pl | 0 .../rr-full/plugins/trustrecords_tln.pl | 0 thirdparty/rr-full/plugins/tsclient.pl | 0 thirdparty/rr-full/plugins/tsclient_tln.pl | 0 thirdparty/rr-full/plugins/typedpaths.pl | 0 thirdparty/rr-full/plugins/typedpaths_tln.pl | 0 thirdparty/rr-full/plugins/typedurls.pl | 0 thirdparty/rr-full/plugins/typedurls_tln.pl | 0 thirdparty/rr-full/plugins/typedurlstime.pl | 0 .../rr-full/plugins/typedurlstime_tln.pl | 0 thirdparty/rr-full/plugins/uac.pl | 0 thirdparty/rr-full/plugins/uninstall.pl | 0 thirdparty/rr-full/plugins/uninstall_tln.pl | 0 thirdparty/rr-full/plugins/unreadmail.pl | 0 thirdparty/rr-full/plugins/urlzone.pl | 0 thirdparty/rr-full/plugins/urun_tln.pl | 0 thirdparty/rr-full/plugins/usb.pl | 0 thirdparty/rr-full/plugins/usbdevices.pl | 0 thirdparty/rr-full/plugins/usbstor.pl | 0 thirdparty/rr-full/plugins/usbstor2.pl | 0 thirdparty/rr-full/plugins/usbstor3.pl | 0 thirdparty/rr-full/plugins/user_run.pl | 0 thirdparty/rr-full/plugins/user_win.pl | 0 thirdparty/rr-full/plugins/userassist.pl | 0 thirdparty/rr-full/plugins/userassist_tln.pl | 0 thirdparty/rr-full/plugins/userinfo.pl | 0 thirdparty/rr-full/plugins/userlocsvc.pl | 0 thirdparty/rr-full/plugins/usrclass | 0 thirdparty/rr-full/plugins/vawtrak.pl | 0 thirdparty/rr-full/plugins/virut.pl | 0 thirdparty/rr-full/plugins/vista_bitbucket.pl | 0 thirdparty/rr-full/plugins/vmplayer.pl | 0 .../rr-full/plugins/vmware_vsphere_client.pl | 0 .../plugins/vnchooksapplicationprefs.pl | 0 thirdparty/rr-full/plugins/vncviewer.pl | 0 thirdparty/rr-full/plugins/volinfocache.pl | 0 thirdparty/rr-full/plugins/wallpaper.pl | 0 thirdparty/rr-full/plugins/warcraft3.pl | 0 thirdparty/rr-full/plugins/wbem.pl | 0 thirdparty/rr-full/plugins/win_cv.pl | 0 thirdparty/rr-full/plugins/winbackup.pl | 0 thirdparty/rr-full/plugins/winevt.pl | 0 thirdparty/rr-full/plugins/winlogon.pl | 0 thirdparty/rr-full/plugins/winlogon_tln.pl | 0 thirdparty/rr-full/plugins/winlogon_u.pl | 0 thirdparty/rr-full/plugins/winnt_cv.pl | 0 thirdparty/rr-full/plugins/winrar.pl | 0 thirdparty/rr-full/plugins/winrar_tln.pl | 0 thirdparty/rr-full/plugins/winscp.pl | 0 thirdparty/rr-full/plugins/winscp_sessions.pl | 0 thirdparty/rr-full/plugins/winver.pl | 0 thirdparty/rr-full/plugins/winvnc.pl | 0 thirdparty/rr-full/plugins/winzip.pl | 0 thirdparty/rr-full/plugins/wordwheelquery.pl | 0 thirdparty/rr-full/plugins/wpdbusenum.pl | 0 thirdparty/rr-full/plugins/xpedition.pl | 0 thirdparty/rr-full/plugins/yahoo_cu.pl | 0 thirdparty/rr-full/plugins/yahoo_lm.pl | 0 thirdparty/rr-full/regripper.pdf | Bin thirdparty/rr-full/rip.exe | Bin thirdparty/rr-full/rip.pl | 0 thirdparty/rr-full/rr.exe | Bin thirdparty/rr-full/rr.pl | 0 thirdparty/rr/p2x5124.dll | Bin thirdparty/rr/plugins/arunmru.pl | 0 thirdparty/rr/plugins/autopsycompname.pl | 0 thirdparty/rr/plugins/autopsylogin.pl | 0 thirdparty/rr/plugins/autopsyntuser | 0 thirdparty/rr/plugins/autopsyntusernetwork.pl | 0 .../rr/plugins/autopsyprocarchitecture.pl | 0 thirdparty/rr/plugins/autopsyprofilelist.pl | 0 thirdparty/rr/plugins/autopsyprofiler.pl | 0 thirdparty/rr/plugins/autopsyrecentdocs.pl | 0 thirdparty/rr/plugins/autopsyshellfolders.pl | 0 thirdparty/rr/plugins/autopsysoftware | 0 thirdparty/rr/plugins/autopsysystem | 0 thirdparty/rr/plugins/autopsyuninstall.pl | 0 thirdparty/rr/plugins/autopsyusb.pl | 0 thirdparty/rr/plugins/autopsyusbdevices.pl | 0 thirdparty/rr/plugins/autopsywinver.pl | 0 thirdparty/rr/plugins/officedocs.pl | 0 thirdparty/rr/plugins/officedocs2010.pl | 0 thirdparty/rr/rip.exe | Bin thirdparty/rr/rip.pl | 0 thirdparty/rr/rr.exe | Bin thirdparty/rr/rr.pl | 0 .../sevenzipjbinding-AllPlatforms.jar | Bin thirdparty/sevenzip/sevenzipjbinding.jar | Bin thirdparty/sigar/1.6.4/sigar-native.zip | Bin .../sqlite-jdbc-3.7.8-SNAPSHOT.jar | Bin thirdparty/stix/StixLib.jar | Bin thunderbirdparser/build.xml | 0 thunderbirdparser/ivy.xml | 0 thunderbirdparser/ivysettings.xml | 0 thunderbirdparser/manifest.mf | 0 thunderbirdparser/nbproject/build-impl.xml | 0 .../nbproject/project.properties | 0 thunderbirdparser/nbproject/project.xml | 0 thunderbirdparser/nbproject/suite.properties | 0 .../thunderbirdparser/Bundle.properties | 0 .../thunderbirdparser/Bundle_ja.properties | 0 .../ThunderbirdMboxFileIngestModule.java | 0 .../autopsy/thunderbirdparser/layer.xml | 0 2542 files changed, 439 insertions(+), 2519 deletions(-) mode change 100644 => 100755 .gitattributes mode change 100644 => 100755 .gitignore mode change 100644 => 100755 API-CHANGES.txt mode change 100644 => 100755 BUILDING.txt mode change 100644 => 100755 BootstrapIvy.xml mode change 100644 => 100755 CentralRepository/Central Repository User Guide.pdf mode change 100644 => 100755 CentralRepository/ivy.xml mode change 100644 => 100755 CentralRepository/ivysettings.xml mode change 100644 => 100755 Core/autopsy-updates.xml mode change 100644 => 100755 Core/build.xml mode change 100644 => 100755 Core/ivy.xml mode change 100644 => 100755 Core/ivysettings.xml mode change 100644 => 100755 Core/manifest.mf mode change 100644 => 100755 Core/nbproject/build-impl.xml mode change 100644 => 100755 Core/nbproject/platform.properties mode change 100644 => 100755 Core/nbproject/project.properties mode change 100644 => 100755 Core/nbproject/project.xml mode change 100644 => 100755 Core/nbproject/suite.properties mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/actions/Bundle_ja.properties mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/actions/GetTagNameAndCommentDialog.form mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/actions/GetTagNameAndCommentDialog.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/actions/GetTagNameDialog.form mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/actions/GetTagNameDialog.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/actions/IngestRunningCheck.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/actions/OpenOutputFolderAction.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/appservices/AutopsyService.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/AddImageAction.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/AddImageErrorsDialog.form mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/AddImageErrorsDialog.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/AddImageTask.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardAddingProgressPanel.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardAddingProgressVisual.form mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardAddingProgressVisual.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardDataSourceSettingsPanel.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardDataSourceSettingsVisual.form mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardDataSourceSettingsVisual.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardIngestConfigPanel.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardIngestConfigVisual.form mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardIngestConfigVisual.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardIterator.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardSelectDspPanel.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardSelectDspVisual.form mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardSelectDspVisual.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/AddLocalFilesTask.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/Bundle_ja.properties mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/ButtonColumn.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/Case.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/CaseActionException.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/CaseCloseAction.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/CaseDeleteAction.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/CaseMetadata.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/CaseNewAction.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/CaseNewActionInterface.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/CaseOpenAction.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesAction.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesPanel.form mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesPanel.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/CollaborationMonitor.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/CueBannerPanel.form mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/CueBannerPanel.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/GeneralFilter.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/ImageDSProcessor.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/ImageFilePanel.form mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/ImageFilePanel.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/LocalDiskDSProcessor.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/LocalDiskPanel.form mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/LocalDiskPanel.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/LocalFilesDSProcessor.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/LocalFilesPanel.form mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/LocalFilesPanel.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/MissingImageDialog.form mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/MissingImageDialog.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel1.form mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel1.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel2.form mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel2.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardAction.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardPanel1.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardPanel2.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/OpenRecentCasePanel.form mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/OpenRecentCasePanel.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/RecentCases.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/RecentItems.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/SingleUserCaseConverter.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/StartupWindow.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/StartupWindowInterface.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/StartupWindowProvider.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/UpdateRecentCases.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/addImage-icon.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/btn_icon_add_image.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/btn_icon_close_case.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/btn_icon_create_new_case.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/btn_icon_open_existing.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/btn_icon_open_recent.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/close-icon.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/events/AddingDataSourceEvent.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/events/AddingDataSourceFailedEvent.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/events/BlackBoardArtifactTagAddedEvent.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/events/BlackBoardArtifactTagDeletedEvent.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/events/ContentTagAddedEvent.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/events/ContentTagDeletedEvent.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/events/DataSourceAddedEvent.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/events/ReportAddedEvent.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/events/TagAddedEvent.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/events/TagDeletedEvent.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/package.dox mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/services/Blackboard.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/services/Bundle.properties mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/services/Bundle_ja.properties mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/services/FileManager.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/services/TagNameDefiniton.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/welcome_logo.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/centralrepository/Bundle.properties mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/centralrepository/README-POSTGRES-TESTING.md mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/centralrepository/README_MONGODB_TESTING.md mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/centralrepository/actions/Bundle.properties mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/centralrepository/actions/EamCaseEditDetailsDialog.form mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/centralrepository/actions/EamCaseEditDetailsDialog.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/centralrepository/actions/EamEditCaseInfoAction.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/centralrepository/contentviewer/Bundle.properties mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/centralrepository/contentviewer/DataContentViewerOtherCases.form mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/centralrepository/contentviewer/DataContentViewerOtherCases.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/centralrepository/contentviewer/DataContentViewerOtherCasesTableCellRenderer.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/centralrepository/contentviewer/DataContentViewerOtherCasesTableModel.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/AbstractSqlEamDb.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamArtifact.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamArtifactInstance.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamArtifactUtil.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamCase.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamDataSource.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamDb.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamDbException.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamDbPlatformEnum.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamDbUtil.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamGlobalFileInstance.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamGlobalSet.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamOrganization.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/PostgresEamDb.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/PostgresEamDbSettings.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/SqliteEamDb.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/SqliteEamDbSettings.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/BadFileTagRunner.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/CaseEventListener.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/IngestEventsListener.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/Installer.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/NewArtifactsRunner.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/centralrepository/images/bad.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/centralrepository/images/good.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/centralrepository/images/import16.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/centralrepository/images/options-icon.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/centralrepository/ingestmodule/IngestModule.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/centralrepository/ingestmodule/IngestModuleFactory.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/centralrepository/license-centralrepository.txt mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/AddNewOrganizationDialog.form mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/AddNewOrganizationDialog.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/Bundle.properties mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/EamDbSettingsDialog.form mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/EamDbSettingsDialog.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/EamOptionsPanelController.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/GlobalSettingsPanel.form mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/GlobalSettingsPanel.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ImportHashDatabaseDialog.form mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ImportHashDatabaseDialog.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ManageCorrelationPropertiesDialog.form mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ManageCorrelationPropertiesDialog.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ManageTagsDialog.form mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ManageTagsDialog.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/contentviewers/Bundle.properties mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/contentviewers/Bundle_ja.properties mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/coordinationservice/CoordinationService.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/coordinationservice/CoordinationServiceNamespace.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/core/Bundle.properties mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/core/Bundle_ja.properties mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/core/DataContentTopComponentSettings.xml mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/core/DataContentTopComponentWstcref.xml mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/core/DirectoryTreeTopComponentSettings.xml mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/core/DirectoryTreeTopComponentWstcref.xml mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/core/FileSearchTopComponentSettings.xml mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/core/FileSearchTopComponentWstcref.xml mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/core/IngestMessageTopComponentSettings.xml mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/core/IngestMessageTopComponentWstcref.xml mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/core/Installer.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/core/RuntimeProperties.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/core/ServicesMonitor.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/core/UserPreferencesException.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/core/dockedBottomWsmode.xml mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/core/events/ServiceEvent.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/core/explorerWsmode.xml mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/core/floatingLeftBottomWsmode.xml mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/core/layer.xml mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/core/org_sleuthkit_autopsy_core_update_centerSettings.xml mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/core/outputFloatWsmode.xml mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/corecomponentinterfaces/BlackboardResultViewer.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/corecomponentinterfaces/Bundle.properties mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/corecomponentinterfaces/Bundle_ja.properties mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/corecomponentinterfaces/CoreComponentControl.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/corecomponentinterfaces/DataContent.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/corecomponentinterfaces/DataContentViewer.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/corecomponentinterfaces/DataExplorer.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/corecomponentinterfaces/DataResult.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/corecomponentinterfaces/DataResultViewer.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/corecomponentinterfaces/DataSourceProcessor.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/corecomponentinterfaces/DataSourceProcessorCallback.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/corecomponentinterfaces/DataSourceProcessorProgressMonitor.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/corecomponentinterfaces/package.dox mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/corecomponents/AboutWindowAction.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/corecomponents/AboutWindowPanel.form mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/corecomponents/AboutWindowPanel.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/corecomponents/AbstractDataResultViewer.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/corecomponents/AdvancedConfigurationCleanDialog.form mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/corecomponents/AdvancedConfigurationCleanDialog.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/corecomponents/AdvancedConfigurationDialog.form mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/corecomponents/AdvancedConfigurationDialog.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/corecomponents/AutopsyOptionsPanel.form mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/corecomponents/AutopsyOptionsPanel.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/corecomponents/AutopsyOptionsPanelController.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/corecomponents/Bundle.properties mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/corecomponents/CriterionChooser.form mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/corecomponents/CriterionChooser.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/corecomponents/DataContentPanel.form mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/corecomponents/DataContentPanel.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/corecomponents/DataContentTopComponent.form mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/corecomponents/DataContentTopComponent.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/corecomponents/DataContentViewerArtifact.form mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/corecomponents/DataContentViewerArtifact.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/corecomponents/DataContentViewerHex.form mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/corecomponents/DataContentViewerHex.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/corecomponents/DataContentViewerMedia.form mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/corecomponents/DataContentViewerMedia.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/corecomponents/DataContentViewerString.form mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/corecomponents/DataContentViewerString.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/corecomponents/DataResultPanel.form mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/corecomponents/DataResultPanel.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/corecomponents/DataResultTopComponent.form mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/corecomponents/DataResultTopComponent.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/corecomponents/DataResultViewerTable.form mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/corecomponents/DataResultViewerTable.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/corecomponents/DataResultViewerThumbnail.form mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/corecomponents/DataResultViewerThumbnail.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/corecomponents/FXVideoPanel.form mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/corecomponents/FXVideoPanel.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/corecomponents/FrameCapture.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/corecomponents/GstVideoPanel.form mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/corecomponents/GstVideoPanel.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/corecomponents/Installer.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/corecomponents/MediaViewImagePanel.css mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/corecomponents/MediaViewImagePanel.form mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/corecomponents/MediaViewImagePanel.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/corecomponents/MediaViewVideoPanel.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/corecomponents/MultiUserSettingsPanel.form mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/corecomponents/MultiUserSettingsPanel.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/corecomponents/MultiUserSettingsPanelController.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/corecomponents/NoTabsTabDisplayerUI.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/corecomponents/OfflineHelpAction.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/corecomponents/OnlineHelpAction.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/corecomponents/OptionsPanel.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/corecomponents/ResultViewerPersistence.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/corecomponents/SortChooser.form mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/corecomponents/SortChooser.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/corecomponents/TableFilterChildren.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/corecomponents/TableFilterNode.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/corecomponents/TextPrompt.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/corecomponents/ThumbnailViewChildren.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/corecomponents/VideoFrame.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/corecomponents/arrow_left.gif mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/corecomponents/arrow_right.gif mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/corecomponents/btn_step_back.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/corecomponents/btn_step_back_disabled.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/corecomponents/btn_step_back_hover.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/corecomponents/btn_step_forward.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/corecomponents/btn_step_forward_disabled.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/corecomponents/btn_step_forward_hover.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/corecomponents/checkbox24.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/corecomponents/checkbox32.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/corecomponents/general-options.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/corecomponents/package.dox mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/coreutils/AutopsyExceptionHandler.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/coreutils/Bundle.properties mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/coreutils/Bundle_ja.properties mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/coreutils/ColorUtilities.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/coreutils/DataSourceUtils.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/coreutils/DriveUtils.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/coreutils/EscapeUtil.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/coreutils/ExecUtil.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/coreutils/FileUtil.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/coreutils/History.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/coreutils/Installer.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/coreutils/JLNK.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/coreutils/JLnkParser.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/coreutils/LnkEnums.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/coreutils/LocalDisk.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/coreutils/LogIcon.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/coreutils/LoggedTask.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/coreutils/Logger.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/coreutils/MessageNotifyUtil.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/coreutils/ModuleSettings.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/coreutils/NetworkUtils.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/coreutils/PathValidator.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/coreutils/PlatformUtil.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/coreutils/SQLiteDBConnect.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/coreutils/StopWatch.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/coreutils/StringExtract.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/coreutils/StringExtract.properties mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/coreutils/TestLogger.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/coreutils/TextConverter.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/coreutils/TextConverterException.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/coreutils/TextUtil.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/coreutils/ThreadConfined.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/coreutils/TimeZoneUtils.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/coreutils/UNCPathUtilities.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/coreutils/Version.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/coreutils/VideoUtils.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/coreutils/Win32Process.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/coreutils/XMLUtil.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/datamodel/AbstractAbstractFileNode.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/datamodel/AbstractContentChildren.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/datamodel/AbstractContentNode.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/datamodel/AbstractFsContentNode.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/datamodel/ArtifactStringContent.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/datamodel/AutopsyItemVisitor.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/datamodel/AutopsyVisitableItem.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/datamodel/BlackboardArtifactNode.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/datamodel/Bundle.properties mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/datamodel/Bundle_ja.properties mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/datamodel/ContentChildren.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/datamodel/ContentNode.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/datamodel/ContentNodeVisitor.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/datamodel/ContentUtils.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/datamodel/CreditCards.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/datamodel/DataConversion.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/datamodel/DataModelActionsFactory.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/datamodel/DataSources.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/datamodel/DataSourcesNode.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/datamodel/DeletedContent.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/datamodel/DisplayableItemNode.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/datamodel/DisplayableItemNodeVisitor.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/datamodel/EmailExtracted.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/datamodel/EmptyNode.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/datamodel/ExtractedContent.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/datamodel/FileSize.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/datamodel/FileTypeExtensions.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/datamodel/FileTypes.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/datamodel/FileTypesByExtension.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/datamodel/FileTypesByMimeType.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/datamodel/FilterNodeLeaf.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/datamodel/HashsetHits.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/datamodel/ImageNode.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/datamodel/Installer.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/datamodel/InterestingHits.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/datamodel/KeyValue.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/datamodel/KeyValueNode.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/datamodel/KeywordHits.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/datamodel/LayoutFileNode.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/datamodel/LocalDirectoryNode.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/datamodel/LocalFileNode.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/datamodel/NodeProperty.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/datamodel/RecentFiles.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/datamodel/RecentFilesChildren.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/datamodel/RecentFilesFilterChildren.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/datamodel/RecentFilesFilterNode.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/datamodel/RecentFilesNode.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/datamodel/Results.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/datamodel/ResultsNode.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/datamodel/RootContentChildren.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/datamodel/SlackFileNode.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/datamodel/SpecialDirectoryNode.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/datamodel/StringContent.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/datamodel/ViewTaggedArtifactAction.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/datamodel/Views.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/datamodel/ViewsNode.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/datamodel/VirtualDirectoryNode.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/datamodel/VolumeNode.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/datamodel/accounts/Accounts.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/datamodel/accounts/BINRange.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/datamodel/package.dox mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/datasourceprocessors/AddRawImageTask.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/datasourceprocessors/AutoIngestDataSourceProcessor.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/datasourceprocessors/RawDSProcessor.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/diagnostics/Bundle_ja.properties mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/directorytree/Bundle.properties mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/directorytree/Bundle_ja.properties mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/directorytree/ChangeViewAction.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/directorytree/CollapseAction.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeFilterChildren.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeTopComponent.form mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeTopComponent.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/directorytree/ExternalViewerAction.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/directorytree/ExtractAction.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/directorytree/ExtractUnallocAction.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/directorytree/FileSearchAction.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/directorytree/FileSearchProvider.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/directorytree/FileSystemDetailsPanel.form mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/directorytree/FileSystemDetailsPanel.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/directorytree/HashSearchAction.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/directorytree/HashSearchProvider.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/directorytree/ImageDetailsPanel.form mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/directorytree/ImageDetailsPanel.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/directorytree/NewWindowViewAction.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/directorytree/SelectionContext.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/directorytree/ViewAssociatedContentAction.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/directorytree/ViewContextAction.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/directorytree/ViewSourceArtifactAction.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/directorytree/VolumeDetailsPanel.form mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/directorytree/VolumeDetailsPanel.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/directorytree/arrow_left.gif mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/directorytree/arrow_right.gif mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/directorytree/back-button.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/directorytree/btn_step_back.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/directorytree/btn_step_back_disabled.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/directorytree/btn_step_back_hover.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/directorytree/btn_step_forward.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/directorytree/btn_step_forward_disabled.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/directorytree/btn_step_forward_hover.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/directorytree/forward-button.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/directorytree/package.dox mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/events/AutopsyEvent.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/events/AutopsyEventException.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/events/AutopsyEventPublisher.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/events/Bundle_ja.properties mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/events/LocalEventPublisher.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/events/MessageServiceConnectionInfo.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/events/RemoteEventPublisher.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/externalresults/Bundle.properties mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/externalresults/Bundle_ja.properties mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/externalresults/ExternalResults.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/externalresults/ExternalResultsImporter.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/externalresults/ExternalResultsXMLParser.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/externalresults/autopsy_external_results.xsd mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/filesearch/AbstractFileSearchFilter.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/filesearch/Bundle.properties mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/filesearch/Bundle_ja.properties mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/filesearch/DateSearchFilter.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/filesearch/DateSearchPanel.form mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/filesearch/DateSearchPanel.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/filesearch/FileSearchAction.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/filesearch/FileSearchDialog.form mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/filesearch/FileSearchDialog.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/filesearch/FileSearchFilter.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/filesearch/FileSearchPanel.form mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/filesearch/FileSearchPanel.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/filesearch/FilterArea.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/filesearch/KnownStatusSearchFilter.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/filesearch/KnownStatusSearchPanel.form mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/filesearch/KnownStatusSearchPanel.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/filesearch/NameSearchFilter.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/filesearch/NameSearchPanel.form mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/filesearch/NameSearchPanel.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/filesearch/SearchChildren.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/filesearch/SearchNode.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/filesearch/SizeSearchFilter.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/filesearch/SizeSearchPanel.form mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/filesearch/SizeSearchPanel.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/filesearch/arrow_down.gif mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/filesearch/arrow_right.gif mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/images/Bluetooth.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/images/Folder-icon.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/images/User-Group-icon-green32.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/images/account-icon-16.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/images/accounts.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/images/addImage-icon.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/images/archive-file.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/images/artifact-icon.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/images/audio-file.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/images/bank.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/images/blue-tag-icon-16.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/images/bookmarks.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/images/calendar.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/images/calllog.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/images/camera-icon-16.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/images/carved-file-icon-16.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/images/close-icon.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/images/computer.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/images/contact.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/images/cookies.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/images/credit-card-green.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/images/credit-card.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/images/credit-cards.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/images/cross-script.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/images/doc-file.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/images/downloads.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/images/error-icon-16.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/images/exe-file.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/images/export16.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/images/external.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/images/extracted_content.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/images/file-filter-icon.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/images/file-icon-deleted.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/images/file-icon.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/images/file-size-16.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/images/file_ingest_filter32x32.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/images/file_types.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/images/fileset-icon-16.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/images/folder-icon-16.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/images/folder-icon-deleted.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/images/folder-icon-virtual.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/images/folder-local-icon-16.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/images/gps-lastlocation.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/images/gps-search.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/images/gps-trackpoint.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/images/gpsfav.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/images/green-tag-icon-16.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/images/hard-drive-icon.jpg mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/images/hashset_hits.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/images/history.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/images/image-file.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/images/image.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/images/import16.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/images/info-icon-16.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/images/interesting_item.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/images/keyword_hits.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/images/mail-icon-16.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/images/message.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/images/mismatch-16.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/images/new-icon.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/images/new16.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/images/open-icon.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/images/pdf-file.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/images/programs.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/images/recent_docs.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/images/recent_files.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/images/results.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/images/save-icon.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/images/searchquery.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/images/speeddialentry.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/images/star-bookmark-icon-16.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/images/tag-folder-blue-icon-16.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/images/text-file.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/images/usb_devices.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/images/video-file.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/images/views.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/images/vol-icon.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/images/warning-icon-16.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/images/web-file.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/images/working_spinner.gif mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/imagewriter/Bundle.properties mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/imagewriter/ImageWriter.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/imagewriter/ImageWriterService.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/imagewriter/ImageWriterSettings.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/ingest/Bundle_ja.properties mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/ingest/DataSourceIngestCancellationPanel.form mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/ingest/DataSourceIngestCancellationPanel.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/ingest/DataSourceIngestJob.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/ingest/DataSourceIngestModuleProcessTerminator.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/ingest/DataSourceIngestModuleProgress.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/ingest/FileIngestModuleProcessTerminator.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/ingest/GetFilesContentVisitor.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/ingest/IngestJob.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/ingest/IngestJobConfigurator.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/ingest/IngestJobSettings.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/ingest/IngestJobSettingsPanel.form mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/ingest/IngestJobSettingsPanel.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/ingest/IngestManager.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/ingest/IngestMessage.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/ingest/IngestMessageDetailsPanel.form mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/ingest/IngestMessageDetailsPanel.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/ingest/IngestMessageMainPanel.form mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/ingest/IngestMessageMainPanel.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/ingest/IngestMessagePanel.form mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/ingest/IngestMessagePanel.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/ingest/IngestMessageTopComponent.form mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/ingest/IngestMessageTopComponent.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/ingest/IngestMessagesAction.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/ingest/IngestMessagesToolbar.form mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/ingest/IngestMessagesToolbar.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/ingest/IngestModuleFactoryLoader.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/ingest/IngestModuleReferenceCounter.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/ingest/IngestMonitor.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/ingest/IngestOptionsPanel.form mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/ingest/IngestOptionsPanel.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/ingest/IngestOptionsPanelController.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/ingest/IngestProfiles.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/ingest/IngestServices.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/ingest/IngestSettingsPanel.form mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/ingest/IngestSettingsPanel.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/ingest/Installer.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/ingest/ModuleContentEvent.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/ingest/ModuleDataEvent.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/ingest/PipelineConfig.xml mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/ingest/PipelineConfigSchema.xsd mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/ingest/ProcTerminationCode.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/ingest/ProfilePanel.form mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/ingest/ProfilePanel.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/ingest/ProfileSettingsPanel.form mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/ingest/ProfileSettingsPanel.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/ingest/btn_step_back.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/ingest/btn_step_back_hover.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/ingest/events/BlackboardPostEvent.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/ingest/events/ContentChangedEvent.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/ingest/events/DataSourceAnalysisCompletedEvent.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/ingest/events/DataSourceAnalysisEvent.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/ingest/events/DataSourceAnalysisStartedEvent.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/ingest/events/FileAnalyzedEvent.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/ingest/eye-bw-25-rollover.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/ingest/eye-bw-25.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/ingest/goto_dir.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/ingest/goto_res.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/ingest/package.dox mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/ingest/runIngestModuleWizard/Bundle.properties mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/ingest/runIngestModuleWizard/Bundle_ja.properties mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/ingest/runIngestModuleWizard/IngestModulesConfigWizardPanel.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/ingest/runIngestModuleWizard/IngestProfileSelectionPanel.form mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/ingest/runIngestModuleWizard/IngestProfileSelectionPanel.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/ingest/runIngestModuleWizard/IngestProfileSelectionWizardPanel.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/ingest/runIngestModuleWizard/RunIngestModulesWizardIterator.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/ingest/runIngestModuleWizard/ShortcutWizardDescriptorPanel.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/keywordsearchservice/KeywordSearchService.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/menuactions/Bundle.properties mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/menuactions/Bundle_ja.properties mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/menuactions/DataContentDynamicMenu.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/menuactions/DataContentMenu.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/menuactions/DataExplorerDynamicMenu.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/menuactions/DataExplorerMenu.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/menuactions/DataResultMenu.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/menuactions/OpenTopComponentAction.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/menuactions/SearchResultMenu.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/menuactions/SpacerPanel.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/e01verify/Bundle_ja.properties mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/embeddedfileextractor/Bundle.properties mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/embeddedfileextractor/Bundle_ja.properties mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/embeddedfileextractor/EmbeddedFileExtractorIngestModule.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/embeddedfileextractor/SevenZipContentReadStream.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/embeddedfileextractor/SevenZipExtractor.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/exif/Bundle.properties mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/exif/Bundle_ja.properties mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/exif/ExifParserFileIngestModule.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/exif/layer.xml mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/AddFileExtensionAction.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/Bundle.properties mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/Bundle_ja.properties mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/FileExtMismatchContextMenuActionsProvider.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/FileExtMismatchIngestModule.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/FileExtMismatchModuleSettingsPanel.form mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/FileExtMismatchModuleSettingsPanel.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/FileExtMismatchOptionsPanelController.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/FileExtMismatchSettingsPanel.form mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/FileExtMismatchSettingsPanel.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/MismatchConfigSchema.xsd mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/mismatch_config.xml mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/options-icon.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/save16.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/filetypeid/Bundle.properties mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/filetypeid/Bundle_ja.properties mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/filetypeid/CustomFileTypesManager.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/filetypeid/FileType.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/filetypeid/FileTypeDetector.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/filetypeid/FileTypeIdGlobalSettingsPanel.form mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/filetypeid/FileTypeIdGlobalSettingsPanel.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/filetypeid/FileTypeIdIngestModule.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/filetypeid/FileTypeIdModuleSettings.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/filetypeid/FileTypeIdOptionsPanelController.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/filetypeid/FileTypes.xsd mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/filetypeid/TikaFileTypeDetector.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/filetypeid/user-defined-file-types-settings.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/filetypeid/warning16.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/hashdatabase/Bundle.properties mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/hashdatabase/Bundle_ja.properties mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashDatabaseOptionsPanelController.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashDbCreateDatabaseDialog.form mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashDbCreateDatabaseDialog.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashDbImportDatabaseDialog.form mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashDbImportDatabaseDialog.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashDbIngestModule.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashDbPanelSearchAction.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashDbSearchAction.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashDbSearchManager.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashDbSearchPanel.form mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashDbSearchPanel.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashDbSearchResultFactory.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashDbSearchThread.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashDbSearcher.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashLookupModuleSettingsPanel.form mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashLookupModuleSettingsPanel.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashLookupSettingsPanel.form mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashLookupSettingsPanel.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/hashdatabase/ModalNoButtons.form mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/hashdatabase/ModalNoButtons.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/hashdatabase/btn_icon_create_new_16.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/hashdatabase/delete16.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/hashdatabase/import16.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/hashdatabase/layer.xml mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/hashdatabase/new16.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/hashdatabase/options-icon.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/hashdatabase/options_icon.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/hashdatabase/warning16.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/iOS/Bundle_ja.properties mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/interestingitems/FileSetsDefinitions.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/photoreccarver/Bundle_ja.properties mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/stix/Bundle.properties mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/stix/Bundle_ja.properties mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/stix/EvalAccountObj.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/stix/EvalAddressObj.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/stix/EvalDomainObj.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/stix/EvalEmailObj.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/stix/EvalFileObj.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/stix/EvalNetworkShareObj.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/stix/EvalRegistryObj.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/stix/EvalSystemObj.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/stix/EvalURIObj.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/stix/EvalURLHistoryObj.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/stix/EvaluatableObject.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/stix/ObservableResult.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/stix/STIXReportModule.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/stix/STIXReportModuleConfigPanel.form mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/stix/STIXReportModuleConfigPanel.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/stix/StixArtifactData.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/vmextractor/Bundle.properties mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/vmextractor/Bundle_ja.properties mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/vmextractor/VMExtractorIngestModule.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/vmextractor/VMExtractorIngestModuleFactory.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/modules/vmextractor/VirtualMachineFinder.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/progress/Bundle.properties mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/progress/LoggingProgressIndicator.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/progress/ModalDialogProgressIndicator.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/progress/ProgressIndicator.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/progress/ProgressPanel.form mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/progress/ProgressPanel.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/progress/SilentProgressIndicator.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/python/Bundle_ja.properties mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/report/ArtifactSelectionDialog.form mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/report/ArtifactSelectionDialog.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/report/Bundle.properties mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/report/Bundle_ja.properties mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/report/DefaultReportConfigurationPanel.form mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/report/DefaultReportConfigurationPanel.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/report/GeneralReportModule.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/report/ReportBodyFile.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/report/ReportBranding.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/report/ReportBrandingProviderI.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/report/ReportExcel.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/report/ReportGenerationPanel.form mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/report/ReportGenerationPanel.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/report/ReportGenerator.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/report/ReportHTML.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/report/ReportModule.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/report/ReportProgressPanel.form mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/report/ReportProgressPanel.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/report/ReportVisualPanel1.form mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/report/ReportVisualPanel1.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/report/ReportVisualPanel2.form mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/report/ReportVisualPanel2.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/report/ReportWizardAction.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/report/ReportWizardIterator.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/report/ReportWizardPanel1.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/report/ReportWizardPanel2.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/report/TableReportModule.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/report/images/account-icon-16.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/report/images/accounts.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/report/images/bluetooth.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/report/images/bookmarks.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/report/images/btn_icon_generate_report.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/report/images/calendar.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/report/images/calllog.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/report/images/computer.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/report/images/contact.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/report/images/cookies.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/report/images/credit-card.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/report/images/default_generator_logo.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/report/images/devices.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/report/images/downloads.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/report/images/drive_network.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/report/images/exif.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/report/images/favicon.ico mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/report/images/gps-lastlocation.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/report/images/gps-search.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/report/images/gps_trackpoint.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/report/images/gpsfav.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/report/images/hash.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/report/images/history.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/report/images/installed.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/report/images/keywords.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/report/images/message.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/report/images/recent.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/report/images/report_loading.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/report/images/search.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/report/images/speeddialentry.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/report/images/star.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/report/images/summary.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/report/images/userbookmarks.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/report/package.dox mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/test/CustomArtifactsCreatorFileIngestModule.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/test/CustomArtifactsCreatorIngestModuleFactory.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/test/InterestingArtifactCreatorIngestModule.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/test/InterestingArtifactCreatorIngestModuleFactory.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/test/TestAutopsyService.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/Bundle.properties mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/Bundle_ja.properties mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/CancellationProgressTask.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/ChronoFieldListCell.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/FXMLConstructor.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/OpenTimelineAction.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/PerCaseTimelineProperties.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/PromptDialogManager.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/ShowInTimelineDialog.fxml mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/ShowInTimelineDialog.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/TimeLineController.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/TimeLineException.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/TimeLineTopComponent.form mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/TimeLineTopComponent.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/ViewMode.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/WrappingListCell.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/actions/Back.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/actions/Bundle_ja.properties mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/actions/Forward.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/actions/ResetFilters.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/actions/SaveSnapshotAsReport.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/actions/UpdateDB.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/actions/ViewArtifactInTimelineAction.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/actions/ViewFileInTimelineAction.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/actions/ZoomIn.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/actions/ZoomOut.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/actions/ZoomToEvents.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/datamodel/CombinedEvent.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/datamodel/EventCluster.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/datamodel/EventStripe.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/datamodel/FilteredEventsModel.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/datamodel/MultiEvent.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/datamodel/SingleEvent.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/datamodel/TimeLineEvent.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/datamodel/eventtype/ArtifactEventType.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/datamodel/eventtype/BaseTypes.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/datamodel/eventtype/Bundle.properties mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/datamodel/eventtype/Bundle_ja.properties mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/datamodel/eventtype/EventType.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/datamodel/eventtype/FileSystemTypes.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/datamodel/eventtype/MiscTypes.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/datamodel/eventtype/RootEventType.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/datamodel/eventtype/WebTypes.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/db/Bundle_ja.properties mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/db/EventDB.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/db/EventsRepository.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/db/MultipleTransactionException.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/db/SQLHelper.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/events/DBUpdatedEvent.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/events/RefreshRequestedEvent.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/events/TagsAddedEvent.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/events/TagsDeletedEvent.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/events/TagsUpdatedEvent.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/events/ViewInTimelineRequestedEvent.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/explorernodes/Bundle_ja.properties mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/explorernodes/EventNode.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/explorernodes/EventRootNode.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/filters/AbstractFilter.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/filters/Bundle_ja.properties mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/filters/CompoundFilter.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/filters/DataSourceFilter.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/filters/DataSourcesFilter.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/filters/DescriptionFilter.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/filters/Filter.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/filters/HashHitsFilter.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/filters/HashSetFilter.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/filters/HideKnownFilter.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/filters/IntersectionFilter.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/filters/RootFilter.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/filters/TagNameFilter.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/filters/TagsFilter.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/filters/TextFilter.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/filters/TypeFilter.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/filters/UnionFilter.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/arrow-090.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/arrow-180.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/arrow-270.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/arrow-circle-double-135.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/arrow-in.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/arrow-out.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/arrow-step-out.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/arrow-step.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/arrow.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/arrow_in.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/arrow_out.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/block.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/blue-document-attribute-a.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/blue-document-attribute-b.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/blue-document-attribute-c.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/blue-document-attribute-m.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/blue-document.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/bookmark--plus.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/bookmarks.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/btn_icon_timeline_32.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/btn_icon_timeline_colorized_32.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/btn_step_back.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/btn_step_back_disabled.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/btn_step_back_hover.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/btn_step_forward.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/btn_step_forward_disabled.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/btn_step_forward_hover.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/calllog.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/camera-icon-16.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/chart_bar.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/checker64.jpg mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/checkerboard.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/checkerboard_transparent.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/clock-history.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/cookies.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/cross-circle (2).png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/cross-circle.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/cross-script.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/database_refresh.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/downloads.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/eye--minus.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/eye--plus.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/eye_close.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/funnel--minus.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/funnel.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/geolocation.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/gps-search.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/gps-trackpoint.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/history.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/image.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/info-icon-16.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/information-frame.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/information-gray.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/information-white.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/information.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/magnifier-left.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/magnifier-zoom-actual-equal.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/magnifier-zoom-actual.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/magnifier-zoom-fit.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/magnifier-zoom-in-green.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/magnifier-zoom-in.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/magnifier-zoom-out-red.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/magnifier-zoom-out.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/magnifier-zoom.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/magnifier.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/magnifier_zoom_in.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/magnifier_zoom_out.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/mail-icon-16.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/marker--arrow.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/marker--exclamation.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/marker--minus.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/marker--pencil.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/marker--pin.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/marker--plus.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/marker.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/message.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/minus-button.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/plus-button.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/programs.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/prohibition.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/question-frame.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/recent_docs.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/resultset_first.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/resultset_last.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/resultset_next.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/resultset_previous.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/searchquery.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/select.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/table.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/tick.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/timeline_marker.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/usb_devices.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/warning.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/warning_triangle.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/warning_triangle_small.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/images/web-file.png mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/license-timeline.txt mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/snapshot/SnapShotReportWriter.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/snapshot/index.css mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/snapshot/index_template.html mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/snapshot/navigation.html mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/snapshot/snapshot_template.html mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/snapshot/summary.css mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/snapshot/summary_template.html mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/ui/AbstractFXCellFactory.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/ui/AbstractTimeLineView.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/ui/AbstractTimelineChart.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/ui/Bundle.properties mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/ui/Bundle_ja.properties mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/ui/ContextMenuProvider.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/ui/HistoryToolBar.fxml mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/ui/HistoryToolBar.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/ui/IntervalSelector.css mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/ui/IntervalSelector.fxml mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/ui/IntervalSelector.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/ui/NoEventsDialog.fxml mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/ui/StatusBar.fxml mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/ui/StatusBar.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/ui/TimeLineChart.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/ui/TimeZonePanel.fxml mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/ui/TimeZonePanel.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/ui/ViewFrame.fxml mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/ui/ViewFrame.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/ui/ZoomRanges.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/ui/countsview/Bundle_ja.properties mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/ui/countsview/CountsViewPane.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/ui/countsview/CountsViewSettingsPane.fxml mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/ui/countsview/EventCountsChart.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/Bundle_ja.properties mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/DateAxis.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/DescriptionVisibility.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/DetailViewPane.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/DetailViewSettingsPane.fxml mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/DetailsChart.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/DetailsChartLane.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/DetailsChartLayoutSettings.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/EventAxis.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/EventClusterNode.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/EventNodeBase.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/EventStripeNode.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/EventsDetailsChart.css mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/GuideLine.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/HideDescriptionAction.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/MultiEventNodeBase.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/PinnedEventsChartLane.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/PrimaryDetailsChartLane.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/ScrollingLaneWrapper.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/SingleEventNode.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/StripeFlattener.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/UnhideDescriptionAction.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/tree/BaseTypeTreeItem.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/tree/Bundle_ja.properties mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/tree/DescriptionTreeItem.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/tree/EventTypeTreeItem.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/tree/EventsTree.fxml mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/tree/EventsTree.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/tree/EventsTreeItem.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/tree/RootItem.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/tree/SubTypeTreeItem.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/tree/TreeComparator.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/ui/filtering/Bundle_ja.properties mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/ui/filtering/FilterCheckBoxCellFactory.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/ui/filtering/FilterSetPanel.fxml mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/ui/filtering/FilterSetPanel.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/ui/filtering/FilterTable.css mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/ui/filtering/FilterTreeItem.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/ui/filtering/FilterTreeTableRow.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/ui/filtering/LegendCell.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/ui/listvew/ListTimeline.fxml mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/ui/listvew/ListTimeline.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/ui/listvew/ListViewPane.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/ui/listvew/SwingFXMenuUtils.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/utils/IntervalUtils.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/utils/MappedList.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/utils/RangeDivisionInfo.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/zooming/Bundle.properties mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/zooming/Bundle_ja.properties mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/zooming/DescriptionLoD.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/zooming/DisplayNameProvider.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/zooming/EventTypeZoomLevel.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/zooming/TimeUnits.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/zooming/ZoomParams.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/zooming/ZoomSettingsPane.fxml mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/timeline/zooming/ZoomSettingsPane.java mode change 100644 => 100755 Core/updates_ja.xml mode change 100644 => 100755 CoreLibs/build-mac.xml mode change 100644 => 100755 CoreLibs/build-unix.xml mode change 100644 => 100755 CoreLibs/build-windows.xml mode change 100644 => 100755 CoreLibs/build.xml mode change 100644 => 100755 CoreLibs/ivy.xml mode change 100644 => 100755 CoreLibs/ivysettings.xml mode change 100644 => 100755 CoreLibs/manifest.mf mode change 100644 => 100755 CoreLibs/nbproject/build-impl.xml mode change 100644 => 100755 CoreLibs/nbproject/project.properties mode change 100644 => 100755 CoreLibs/nbproject/project.xml mode change 100644 => 100755 CoreLibs/nbproject/suite.properties mode change 100644 => 100755 CoreLibs/src/org/sleuthkit/autopsy/corelibs/Bundle.properties mode change 100644 => 100755 CoreLibs/src/org/sleuthkit/autopsy/corelibs/Bundle_ja.properties mode change 100644 => 100755 CoreLibs/src/org/sleuthkit/autopsy/corelibs/ScalrWrapper.java mode change 100644 => 100755 CoreLibs/src/org/sleuthkit/autopsy/corelibs/SigarLoader.java mode change 100644 => 100755 Experimental/build.xml mode change 100644 => 100755 Experimental/ivy.xml mode change 100644 => 100755 Experimental/ivysettings.xml mode change 100644 => 100755 Experimental/manifest.mf mode change 100644 => 100755 Experimental/nbproject/build-impl.xml mode change 100644 => 100755 Experimental/nbproject/project.properties mode change 100644 => 100755 Experimental/nbproject/project.xml mode change 100644 => 100755 Experimental/nbproject/suite.properties mode change 100644 => 100755 Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/ArchiveUtil.java mode change 100644 => 100755 Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestAlertFile.java mode change 100644 => 100755 Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestCase.java mode change 100644 => 100755 Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestCaseDeletedEvent.java mode change 100644 => 100755 Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestCaseManager.java mode change 100644 => 100755 Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestCaseOpenAction.java mode change 100644 => 100755 Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestCasePanel.form mode change 100644 => 100755 Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestCasePanel.java mode change 100644 => 100755 Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestCasePrioritizedEvent.java delete mode 100755 Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardOpenAction.java delete mode 100755 Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardTopComponent.form delete mode 100755 Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardTopComponent.java mode change 100644 => 100755 Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestJob.java mode change 100644 => 100755 Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestJobCompletedEvent.java mode change 100644 => 100755 Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestJobEvent.java mode change 100644 => 100755 Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestJobLogger.java mode change 100644 => 100755 Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestJobStartedEvent.java mode change 100644 => 100755 Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestJobStatusEvent.java delete mode 100644 Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestLegacyDashboard.form delete mode 100644 Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestLegacyDashboard.java mode change 100644 => 100755 Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestManager.java mode change 100644 => 100755 Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestSystemLogger.java mode change 100644 => 100755 Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutopsyManifestFileParser.java mode change 100644 => 100755 Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties mode change 100644 => 100755 Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/CaseImportPanel.form mode change 100644 => 100755 Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/CaseImportPanel.java mode change 100644 => 100755 Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/CaseImportPanelController.java mode change 100644 => 100755 Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/CaseStatusIconCellRenderer.java mode change 100644 => 100755 Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/CenteredGrayableCellRenderer.java mode change 100644 => 100755 Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/DurationCellRenderer.java mode change 100644 => 100755 Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/FileExportRuleSet.java mode change 100644 => 100755 Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/FileExportSettings.java mode change 100644 => 100755 Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/FileExporter.java mode change 100644 => 100755 Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/FileExporterSettingsPanel.form mode change 100644 => 100755 Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/FileExporterSettingsPanel.java mode change 100644 => 100755 Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/GrayableCellRenderer.java mode change 100644 => 100755 Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/ImportDoneCallback.java mode change 100644 => 100755 Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/LongDateCellRenderer.java mode change 100644 => 100755 Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/Manifest.java mode change 100644 => 100755 Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/ManifestFileParser.java mode change 100644 => 100755 Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/ManifestNodeData.java mode change 100644 => 100755 Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/PathUtils.java mode change 100644 => 100755 Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/ShortDateCellRenderer.java mode change 100644 => 100755 Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/SingleUserCaseImporter.java mode change 100644 => 100755 Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/StatusDatabaseLogger.java mode change 100644 => 100755 Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/TimeStampUtils.java mode change 100644 => 100755 Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/layer.xml mode change 100644 => 100755 Experimental/src/org/sleuthkit/autopsy/experimental/configuration/AdvancedAutoIngestSettingsPanel.form mode change 100644 => 100755 Experimental/src/org/sleuthkit/autopsy/experimental/configuration/AdvancedAutoIngestSettingsPanel.java mode change 100644 => 100755 Experimental/src/org/sleuthkit/autopsy/experimental/configuration/AutoIngestSettingsPanel.form mode change 100644 => 100755 Experimental/src/org/sleuthkit/autopsy/experimental/configuration/AutoIngestSettingsPanel.java mode change 100644 => 100755 Experimental/src/org/sleuthkit/autopsy/experimental/configuration/AutoIngestSettingsPanelController.java mode change 100644 => 100755 Experimental/src/org/sleuthkit/autopsy/experimental/configuration/AutoIngestUserPreferences.java mode change 100644 => 100755 Experimental/src/org/sleuthkit/autopsy/experimental/configuration/Bundle.properties mode change 100644 => 100755 Experimental/src/org/sleuthkit/autopsy/experimental/configuration/Bundle_ja.properties mode change 100644 => 100755 Experimental/src/org/sleuthkit/autopsy/experimental/configuration/NodeStatusLogPanel.form mode change 100644 => 100755 Experimental/src/org/sleuthkit/autopsy/experimental/configuration/NodeStatusLogPanel.java mode change 100644 => 100755 Experimental/src/org/sleuthkit/autopsy/experimental/configuration/SharedConfiguration.java mode change 100644 => 100755 Experimental/src/org/sleuthkit/autopsy/experimental/configuration/StartupWindow.java mode change 100644 => 100755 Experimental/src/org/sleuthkit/autopsy/experimental/images/AIM.png mode change 100644 => 100755 Experimental/src/org/sleuthkit/autopsy/experimental/images/arrow-down-icon.png mode change 100644 => 100755 Experimental/src/org/sleuthkit/autopsy/experimental/images/arrow-up-icon.png mode change 100644 => 100755 Experimental/src/org/sleuthkit/autopsy/experimental/images/artifact-icon.png mode change 100644 => 100755 Experimental/src/org/sleuthkit/autopsy/experimental/images/autoIngest32.png mode change 100644 => 100755 Experimental/src/org/sleuthkit/autopsy/experimental/images/bad.png mode change 100644 => 100755 Experimental/src/org/sleuthkit/autopsy/experimental/images/extracted_content.png mode change 100644 => 100755 Experimental/src/org/sleuthkit/autopsy/experimental/images/file-size-16.png mode change 100644 => 100755 Experimental/src/org/sleuthkit/autopsy/experimental/images/frame.gif mode change 100644 => 100755 Experimental/src/org/sleuthkit/autopsy/experimental/images/frame32.gif mode change 100644 => 100755 Experimental/src/org/sleuthkit/autopsy/experimental/images/good.png mode change 100644 => 100755 Experimental/src/org/sleuthkit/autopsy/experimental/images/import16.png mode change 100644 => 100755 Experimental/src/org/sleuthkit/autopsy/experimental/images/import32.png mode change 100644 => 100755 Experimental/src/org/sleuthkit/autopsy/experimental/images/knownbad-icon.png mode change 100644 => 100755 Experimental/src/org/sleuthkit/autopsy/experimental/images/left-arrow-16-icon.png mode change 100644 => 100755 Experimental/src/org/sleuthkit/autopsy/experimental/images/locked.png mode change 100644 => 100755 Experimental/src/org/sleuthkit/autopsy/experimental/images/mime-icon.png mode change 100644 => 100755 Experimental/src/org/sleuthkit/autopsy/experimental/images/minus-icon.png mode change 100644 => 100755 Experimental/src/org/sleuthkit/autopsy/experimental/images/options-icon.png mode change 100644 => 100755 Experimental/src/org/sleuthkit/autopsy/experimental/images/plus-icon.png mode change 100644 => 100755 Experimental/src/org/sleuthkit/autopsy/experimental/images/ruleset-icon.png mode change 100644 => 100755 Experimental/src/org/sleuthkit/autopsy/experimental/images/save-icon.png mode change 100644 => 100755 Experimental/src/org/sleuthkit/autopsy/experimental/images/tick.png mode change 100644 => 100755 Experimental/src/org/sleuthkit/autopsy/experimental/images/warning16.png mode change 100644 => 100755 Experimental/src/org/sleuthkit/autopsy/experimental/images/yield16-icon.png mode change 100644 => 100755 ImageGallery/.gitattributes mode change 100644 => 100755 ImageGallery/.gitignore mode change 100644 => 100755 ImageGallery/LICENSE-2.0.txt mode change 100644 => 100755 ImageGallery/build.xml mode change 100644 => 100755 ImageGallery/manifest.mf mode change 100644 => 100755 ImageGallery/nbproject/build-impl.xml mode change 100644 => 100755 ImageGallery/nbproject/genfiles.properties mode change 100644 => 100755 ImageGallery/nbproject/platform.properties mode change 100644 => 100755 ImageGallery/nbproject/project.properties mode change 100644 => 100755 ImageGallery/nbproject/project.xml mode change 100644 => 100755 ImageGallery/nbproject/suite.properties mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/Bundle.properties mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/Bundle_ja.properties mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/FXMLConstructor.java mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/FileIDSelectionModel.java mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/FileTypeUtils.java mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryController.java mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryModule.java mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryOptionsPanel.form mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryOptionsPanel.java mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryOptionsPanelController.java mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryPreferences.java mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryTopComponent.form mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryTopComponent.java mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/OnStart.java mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/PerCaseProperties.java mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ThumbnailCache.java mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/actions/AddTagAction.java mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/actions/Back.java mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/actions/Bundle_ja.properties mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/actions/CategorizeAction.java mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/actions/CategorizeGroupAction.java mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/actions/CategorizeSelectedFilesAction.java mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/actions/DeleteFollowUpTagAction.java mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/actions/Forward.java mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/actions/NextUnseenGroup.java mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/actions/OpenExternalViewerAction.java mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/actions/OpenHelpAction.java mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/actions/RedoAction.java mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/actions/SwingMenuItemAdapter.java mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/actions/TagGroupAction.java mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/actions/TagSelectedFilesAction.java mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/actions/UndoAction.java mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/actions/UndoRedoManager.java mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/Bundle_ja.properties mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/Category.java mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/CategoryManager.java mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/DrawableAttribute.java mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/DrawableDB.java mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/DrawableFile.java mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/DrawableTagsManager.java mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/HashSetManager.java mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/ImageFile.java mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/VideoFile.java mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/grouping/Bundle_ja.properties mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/grouping/DrawableGroup.java mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/grouping/GroupKey.java mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/grouping/GroupManager.java mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/grouping/GroupSortBy.java mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/grouping/GroupViewMode.java mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/grouping/GroupViewState.java mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/AttributeListCell.java mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/Bundle_ja.properties mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/GuiUtils.java mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/MediaControl.fxml mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/NoGroupsDialog.fxml mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/NoGroupsDialog.java mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/SortByListCell.java mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/SortChooser.fxml mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/SortChooser.java mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/StatusBar.fxml mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/StatusBar.java mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/SummaryTablePane.fxml mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/SummaryTablePane.java mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/Toolbar.fxml mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/Toolbar.java mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/VideoPlayer.java mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/drawableviews/Bundle_ja.properties mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/drawableviews/DrawableTile.fxml mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/drawableviews/DrawableTile.java mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/drawableviews/DrawableTileBase.java mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/drawableviews/DrawableUIBase.java mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/drawableviews/DrawableView.java mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/drawableviews/GroupPane.fxml mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/drawableviews/GroupPane.java mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/drawableviews/MetaDataPane.fxml mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/drawableviews/MetaDataPane.java mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/drawableviews/SlideShowView.fxml mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/drawableviews/SlideShowView.java mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/navpanel/Bundle_ja.properties mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/navpanel/GroupCell.css mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/navpanel/GroupCellFactory.java mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/navpanel/GroupComparators.java mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/navpanel/GroupTree.java mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/navpanel/GroupTreeItem.java mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/navpanel/GroupTreeNode.java mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/navpanel/HashHitGroupList.java mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/navpanel/NavPanel.fxml mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/navpanel/NavPanel.java mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/Clapperboard.png mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/Folder-icon.png mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/TriangleDown.png mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/application_view_tile.png mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/arrow-090.png mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/arrow-180.png mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/arrow-270.png mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/arrow-circle-double-135.png mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/arrow-circle-double.png mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/arrow-resize-090.png mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/arrow-resize.png mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/arrow.png mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/arrow_down.png mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/arrow_up.png mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/border-bottom-double.png mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/border-top-bottom-double.png mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/btn_icon_image_gallery_32.png mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/btn_icon_image_gallery_48.png mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/bullet_arrow_down.png mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/camera.png mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/category-icon.png mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/clock--minus.png mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/clock--pencil.png mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/clock--plus.png mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/control-double-000-small.png mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/control-double-090-small.png mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/control-double-090.png mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/control-double-180-small.png mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/control-double-180.png mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/control-double-270-small.png mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/control-double-270.png mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/control-double.png mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/control-stop-000-small.png mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/control-stop.png mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/external.png mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/film.png mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/flag_gray.png mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/flag_red.png mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/folder-open-image.png mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/folder-rename.png mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/folder-tree.png mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/folder.png mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/folder_picture.png mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/folders-path.png mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/funnel.png mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/group.png mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/hashset_hits.png mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/icon-hashtag.png mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/info-icon-16.png mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/information.png mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/lightbulb.png mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/media_controls_first_small.png mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/media_controls_forward_small.png mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/media_controls_last_small.png mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/media_controls_pause_small.png mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/media_controls_play_small.png mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/media_controls_rewind_small.png mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/media_controls_stop_small.png mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/mime_types.png mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/page_white_stack.png mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/polaroid_green_48.png mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/polaroid_green_48_silhouette.png mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/prohibition.png mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/question-frame.png mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/redo.png mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/right arrow.png mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/right_arrow_128.png mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/shape_group.png mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/slide.png mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/sort_asc_az.png mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/sort_ascending.png mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/sort_desc_az.png mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/sort_descending.png mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/speaker-volume-control-mute.png mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/speaker-volume-control-up.png mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/speaker-volume-control.png mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/speaker-volume-low.png mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/speaker-volume-none.png mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/speaker-volume.png mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/tag_red.png mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/undo.png mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/video-file.png mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/license-imagegallery.txt mode change 100644 => 100755 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/utils/TaskUtils.java mode change 100644 => 100755 InternalPythonModules/README.txt mode change 100644 => 100755 InternalPythonModules/android/browserlocation.py mode change 100644 => 100755 InternalPythonModules/android/cachelocation.py mode change 100644 => 100755 InternalPythonModules/android/calllog.py mode change 100644 => 100755 InternalPythonModules/android/contact.py mode change 100644 => 100755 InternalPythonModules/android/general.py mode change 100644 => 100755 InternalPythonModules/android/googlemaplocation.py mode change 100644 => 100755 InternalPythonModules/android/module.py mode change 100644 => 100755 InternalPythonModules/android/tangomessage.py mode change 100644 => 100755 InternalPythonModules/android/textmessage.py mode change 100644 => 100755 InternalPythonModules/android/wwfmessage.py mode change 100644 => 100755 KNOWN_ISSUES.txt mode change 100644 => 100755 KeywordSearch/build.xml mode change 100644 => 100755 KeywordSearch/ivy.xml mode change 100644 => 100755 KeywordSearch/ivysettings.xml mode change 100644 => 100755 KeywordSearch/manifest.mf mode change 100644 => 100755 KeywordSearch/nbproject/build-impl.xml mode change 100644 => 100755 KeywordSearch/nbproject/project.properties mode change 100644 => 100755 KeywordSearch/nbproject/project.xml mode change 100644 => 100755 KeywordSearch/nbproject/suite.properties mode change 100644 => 100755 KeywordSearch/solr/contexts/solr-jetty-context.xml mode change 100644 => 100755 KeywordSearch/solr/etc/jetty.xml mode change 100644 => 100755 KeywordSearch/solr/etc/webdefault.xml mode change 100644 => 100755 KeywordSearch/solr/resources/log4j.properties mode change 100644 => 100755 KeywordSearch/solr/solr/configsets/AutopsyConfig/conf/admin-extra.html mode change 100644 => 100755 KeywordSearch/solr/solr/configsets/AutopsyConfig/conf/elevate.xml mode change 100644 => 100755 KeywordSearch/solr/solr/configsets/AutopsyConfig/conf/logging-development.properties mode change 100644 => 100755 KeywordSearch/solr/solr/configsets/AutopsyConfig/conf/logging-release.properties mode change 100644 => 100755 KeywordSearch/solr/solr/configsets/AutopsyConfig/conf/mapping-FoldToASCII.txt mode change 100644 => 100755 KeywordSearch/solr/solr/configsets/AutopsyConfig/conf/mapping-ISOLatin1Accent.txt mode change 100644 => 100755 KeywordSearch/solr/solr/configsets/AutopsyConfig/conf/protwords.txt mode change 100644 => 100755 KeywordSearch/solr/solr/configsets/AutopsyConfig/conf/schema.xml mode change 100644 => 100755 KeywordSearch/solr/solr/configsets/AutopsyConfig/conf/scripts.conf mode change 100644 => 100755 KeywordSearch/solr/solr/configsets/AutopsyConfig/conf/solrconfig.xml mode change 100644 => 100755 KeywordSearch/solr/solr/configsets/AutopsyConfig/conf/spellings.txt mode change 100644 => 100755 KeywordSearch/solr/solr/configsets/AutopsyConfig/conf/stopwords.txt mode change 100644 => 100755 KeywordSearch/solr/solr/configsets/AutopsyConfig/conf/stopwords_en.txt mode change 100644 => 100755 KeywordSearch/solr/solr/configsets/AutopsyConfig/conf/synonyms.txt mode change 100644 => 100755 KeywordSearch/solr/solr/solr.xml mode change 100644 => 100755 KeywordSearch/solr/solr/zoo.cfg mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/AccountsText.java mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/AddKeywordsDialog.form mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/AddKeywordsDialog.java mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/ArtifactTextExtractor.java mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle.properties mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle_ja.properties mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Chunker.java mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/DropdownListSearchPanel.form mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/DropdownListSearchPanel.java mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/DropdownSingleTermSearchPanel.form mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/DropdownSingleTermSearchPanel.java mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/DropdownToolbar.form mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/DropdownToolbar.java mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/EnCaseKeywordSearchList.java mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/ExtractedContentPanel.form mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/ExtractedContentPanel.java mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/ExtractedContentViewer.java mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/FileTextExtractor.java mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/GlobalEditListPanel.form mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/GlobalEditListPanel.java mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/GlobalListSettingsPanel.form mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/GlobalListSettingsPanel.java mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/GlobalListsManagementPanel.form mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/GlobalListsManagementPanel.java mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/HighlightedText.java mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/HtmlTextExtractor.java mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Index.java mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/IndexFinder.java mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/IndexMetadata.java mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/IndexedText.java mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Ingester.java mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Installer.java mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/JerichoParserWrapper.java mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Keyword.java mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordCachedArtifact.java mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordHit.java mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordListsManager.java mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordQueryFilter.java mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearch.java mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchAction.java mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchConfigurationAction.java mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchFilterNode.java mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchGlobalLanguageSettingsPanel.form mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchGlobalLanguageSettingsPanel.java mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchGlobalSearchSettingsPanel.form mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchGlobalSearchSettingsPanel.java mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchGlobalSettingsPanel.form mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchGlobalSettingsPanel.java mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchIngestModule.java mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchJobSettingsPanel.form mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchJobSettingsPanel.java mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchModuleException.java mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchOptionsPanel.form mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchOptionsPanelController.java mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchPanel.java mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchQuery.java mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchQueryDelegator.java mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchResultFactory.java mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchSettings.java mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchUtil.java mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordsSchema.xsd mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/LuceneQuery.java mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/NoOpenCoreException.java mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/RegexQuery.java mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/SearchRunner.java mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Server.java mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/SolrSearchService.java mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/StringsTextExtractor.java mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/TermsComponentQuery.java mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/TextExtractor.java mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/TikaTextExtractor.java mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/XmlKeywordSearchList.java mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/add16.png mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/arrow_left.gif mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/arrow_right.gif mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/btn_step_back.png mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/btn_step_back_disabled.png mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/btn_step_back_hover.png mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/btn_step_forward.png mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/btn_step_forward_disabled.png mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/btn_step_forward_hover.png mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/delete16.png mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/dropdown-icon-pressed.png mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/dropdown-icon-rollover.png mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/dropdown-icon.png mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/edit16.png mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/export16.png mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/filter-icon.png mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/import16.png mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/layer.xml mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/new16.png mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/options-icon.png mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/save16.png mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/search-icon.png mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/searchbutton-icon-pressed.png mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/searchbutton-icon-rollover.png mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/searchbutton-icon.png mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/watchbutton-icon-pressed.png mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/watchbutton-icon-rollover.png mode change 100644 => 100755 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/watchbutton-icon.png mode change 100644 => 100755 LICENSE-2.0.txt mode change 100644 => 100755 NEWS.txt mode change 100644 => 100755 README.txt mode change 100644 => 100755 README_LINUX_OSX.md mode change 100644 => 100755 RecentActivity/build.xml mode change 100644 => 100755 RecentActivity/ivy.xml mode change 100644 => 100755 RecentActivity/ivysettings.xml mode change 100644 => 100755 RecentActivity/manifest.mf mode change 100644 => 100755 RecentActivity/nbproject/build-impl.xml mode change 100644 => 100755 RecentActivity/nbproject/platform.properties mode change 100644 => 100755 RecentActivity/nbproject/project.properties mode change 100644 => 100755 RecentActivity/nbproject/project.xml mode change 100644 => 100755 RecentActivity/nbproject/suite.properties mode change 100644 => 100755 RecentActivity/src/org/sleuthkit/autopsy/recentactivity/Bundle.properties mode change 100644 => 100755 RecentActivity/src/org/sleuthkit/autopsy/recentactivity/Bundle_ja.properties mode change 100644 => 100755 RecentActivity/src/org/sleuthkit/autopsy/recentactivity/Chrome.java mode change 100644 => 100755 RecentActivity/src/org/sleuthkit/autopsy/recentactivity/Extract.java mode change 100644 => 100755 RecentActivity/src/org/sleuthkit/autopsy/recentactivity/ExtractIE.java mode change 100644 => 100755 RecentActivity/src/org/sleuthkit/autopsy/recentactivity/ExtractRegistry.java mode change 100644 => 100755 RecentActivity/src/org/sleuthkit/autopsy/recentactivity/Firefox.java mode change 100644 => 100755 RecentActivity/src/org/sleuthkit/autopsy/recentactivity/RAImageIngestModule.java mode change 100644 => 100755 RecentActivity/src/org/sleuthkit/autopsy/recentactivity/RecentDocumentsByLnk.java mode change 100644 => 100755 RecentActivity/src/org/sleuthkit/autopsy/recentactivity/SEUQAMappings.xml mode change 100644 => 100755 RecentActivity/src/org/sleuthkit/autopsy/recentactivity/SearchEngineSchema.xsd mode change 100644 => 100755 RecentActivity/src/org/sleuthkit/autopsy/recentactivity/SearchEngineURLQueryAnalyzer.java mode change 100644 => 100755 RecentActivity/src/org/sleuthkit/autopsy/recentactivity/USB_DATA.txt mode change 100644 => 100755 RecentActivity/src/org/sleuthkit/autopsy/recentactivity/UsbDeviceIdMapper.java mode change 100644 => 100755 RecentActivity/src/org/sleuthkit/autopsy/recentactivity/Util.java mode change 100644 => 100755 RecentActivity/src/org/sleuthkit/autopsy/recentactivity/layer.xml mode change 100644 => 100755 ScalpelCarver/.gitignore mode change 100644 => 100755 ScalpelCarver/build.xml mode change 100644 => 100755 ScalpelCarver/manifest.mf mode change 100644 => 100755 ScalpelCarver/nbproject/build-impl.xml mode change 100644 => 100755 ScalpelCarver/nbproject/project.properties mode change 100644 => 100755 ScalpelCarver/nbproject/project.xml mode change 100644 => 100755 ScalpelCarver/src/org/sleuthkit/autopsy/scalpel/Bundle.properties mode change 100644 => 100755 ScalpelCarver/src/org/sleuthkit/autopsy/scalpel/Bundle_ja.properties mode change 100644 => 100755 ScalpelCarver/src/org/sleuthkit/autopsy/scalpel/ScalpelCarverIngestModule.java mode change 100644 => 100755 ScalpelCarver/src/org/sleuthkit/autopsy/scalpel/jni/Bundle.properties mode change 100644 => 100755 ScalpelCarver/src/org/sleuthkit/autopsy/scalpel/jni/Bundle_ja.properties mode change 100644 => 100755 ScalpelCarver/src/org/sleuthkit/autopsy/scalpel/jni/ScalpelCarver.java mode change 100644 => 100755 ScalpelCarver/src/org/sleuthkit/autopsy/scalpel/jni/ScalpelException.java mode change 100644 => 100755 ScalpelCarver/src/org/sleuthkit/autopsy/scalpel/jni/ScalpelOutputParser.java mode change 100644 => 100755 ScalpelCarver/src/org/sleuthkit/autopsy/scalpel/scalpel.conf mode change 100644 => 100755 Testing/README.txt mode change 100644 => 100755 Testing/build.xml mode change 100644 => 100755 Testing/manifest.mf mode change 100644 => 100755 Testing/nbproject/build-impl.xml mode change 100644 => 100755 Testing/nbproject/project.properties mode change 100644 => 100755 Testing/nbproject/project.xml mode change 100644 => 100755 Testing/nbproject/suite.properties mode change 100644 => 100755 Testing/src/org/sleuthkit/autopsy/testing/Bundle.properties mode change 100644 => 100755 branding/core/core.jar/org/netbeans/core/startup/Bundle.properties mode change 100644 => 100755 branding/core/core.jar/org/netbeans/core/startup/frame.gif mode change 100644 => 100755 branding/core/core.jar/org/netbeans/core/startup/frame32.gif mode change 100644 => 100755 branding/core/core.jar/org/netbeans/core/startup/frame48.gif mode change 100644 => 100755 branding/core/core.jar/org/netbeans/core/startup/splash.gif mode change 100644 => 100755 branding/modules/org-netbeans-core-windows.jar/org/netbeans/core/windows/view/ui/Bundle.properties mode change 100644 => 100755 build-unix.xml mode change 100644 => 100755 build-windows-installer.xml mode change 100644 => 100755 build-windows.xml mode change 100644 => 100755 developers/netbeans_ide_java_formatting_settings.zip mode change 100644 => 100755 docs/doxygen-user/adHocKeywordSearch.dox mode change 100644 => 100755 docs/doxygen-user/filetype.dox mode change 100644 => 100755 docs/doxygen-user/image_gallery.dox mode change 100644 => 100755 docs/doxygen-user/images/apachebadmessage.PNG mode change 100644 => 100755 docs/doxygen-user/images/case-newcase.PNG mode change 100644 => 100755 docs/doxygen-user/images/dzkrun.PNG mode change 100644 => 100755 docs/doxygen-user/images/ingest-file-filters.PNG mode change 100644 => 100755 docs/doxygen-user/images/ingest-profile-create.PNG mode change 100644 => 100755 docs/doxygen-user/images/ingest-profiles.PNG mode change 100644 => 100755 docs/doxygen-user/images/ingest_pipeline.PNG mode change 100644 => 100755 docs/doxygen-user/images/javaproperties.PNG mode change 100644 => 100755 docs/doxygen-user/images/keyword-search-ad-hoc.PNG mode change 100644 => 100755 docs/doxygen-user/images/keyword-search-configuration-new-keywords.PNG mode change 100644 => 100755 docs/doxygen-user/images/keyword-search-inbox.PNG mode change 100644 => 100755 docs/doxygen-user/images/keyword_results.PNG mode change 100644 => 100755 docs/doxygen-user/images/local-disk-data-source.PNG mode change 100644 => 100755 docs/doxygen-user/images/maxinactivityduration.PNG mode change 100644 => 100755 docs/doxygen-user/images/messagebubbles.PNG mode change 100644 => 100755 docs/doxygen-user/images/messagebubblesbigger.PNG mode change 100644 => 100755 docs/doxygen-user/images/mime-type-tree.PNG mode change 100644 => 100755 docs/doxygen-user/images/othernodeingesting.PNG mode change 100644 => 100755 docs/doxygen-user/images/postgresqlinstall1.PNG mode change 100644 => 100755 docs/doxygen-user/images/postgresqlinstall3.PNG mode change 100644 => 100755 docs/doxygen-user/images/postgresqlinstall4.PNG mode change 100644 => 100755 docs/doxygen-user/images/postgresqlinstall5.PNG mode change 100644 => 100755 docs/doxygen-user/images/postgresqlinstall6.PNG mode change 100644 => 100755 docs/doxygen-user/images/postgresqlinstall7.PNG mode change 100644 => 100755 docs/doxygen-user/images/profile-data-source-panel.PNG mode change 100644 => 100755 docs/doxygen-user/images/serviceinstall.PNG mode change 100644 => 100755 docs/doxygen-user/images/solrinstall1.PNG mode change 100644 => 100755 docs/doxygen-user/images/solrinstall2.PNG mode change 100644 => 100755 docs/doxygen-user/images/solrinstall3.PNG mode change 100644 => 100755 docs/doxygen-user/images/symlinkjava.PNG mode change 100644 => 100755 docs/doxygen-user/images/tagging-5.PNG mode change 100644 => 100755 docs/doxygen-user/images/transientcache.PNG mode change 100644 => 100755 docs/doxygen-user/images/unallocated_space_options.PNG mode change 100644 => 100755 docs/doxygen-user/images/updatedSolr_cmd.PNG mode change 100644 => 100755 docs/doxygen-user/images/wherejava.PNG mode change 100644 => 100755 docs/doxygen-user/images/zooDir.PNG mode change 100644 => 100755 docs/doxygen-user/images/zooPurge.PNG mode change 100644 => 100755 docs/doxygen-user/ingest.dox mode change 100644 => 100755 docs/doxygen-user/ingest_template.xod mode change 100644 => 100755 docs/doxygen-user/installMultiUser.dox mode change 100644 => 100755 docs/doxygen-user/keyword_search.dox mode change 100644 => 100755 docs/doxygen-user/main.dox mode change 100644 => 100755 docs/doxygen-user/module_install.dox mode change 100644 => 100755 docs/doxygen-user/multiuser-security.dox mode change 100644 => 100755 docs/doxygen-user/multiuser.dox mode change 100644 => 100755 docs/doxygen-user/performance.dox mode change 100644 => 100755 docs/doxygen-user/result_viewers.dox mode change 100644 => 100755 docs/doxygen-user/uilayout.dox mode change 100644 => 100755 docs/doxygen-user/workflow.dox mode change 100644 => 100755 docs/doxygen/debugTsk.dox mode change 100644 => 100755 docs/doxygen/doxygen_docs/.gitignore mode change 100644 => 100755 docs/doxygen/doxygen_docs/api-docs/.gitignore mode change 100644 => 100755 git-daemon-export-okay mode change 100644 => 100755 icons/icon.icns mode change 100644 => 100755 icons/icon.ico mode change 100644 => 100755 nbproject/build-impl.xml mode change 100644 => 100755 nbproject/genfiles.properties mode change 100644 => 100755 nbproject/platform.properties mode change 100644 => 100755 nbproject/platform.xml mode change 100644 => 100755 nbproject/project.properties mode change 100644 => 100755 nbproject/project.xml mode change 100644 => 100755 pythonExamples/July2015FileTutorial_BigRound/bigRoundFile.dat mode change 100644 => 100755 pythonExamples/July2015FileTutorial_BigRound/notRoundFile.dat mode change 100644 => 100755 test/README.txt mode change 100644 => 100755 test/input/NSRL.txt-md5.idx mode change 100644 => 100755 test/input/notablehashes.txt-md5.idx mode change 100644 => 100755 test/input/notablekeywords.xml mode change 100644 => 100755 test/script/Emailer.py mode change 100644 => 100755 test/script/config.xml mode change 100644 => 100755 test/script/getcounts.py mode change 100644 => 100755 thirdparty/LICENSE-2.0.txt mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/ant-contrib.jar mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/LICENSE.txt mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/allclasses-frame.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/allclasses-noframe.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/constant-values.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/deprecated-list.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/help-doc.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/index-all.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/index.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/AntContribVersion.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antclipse/ClassPathParser.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antclipse/ClassPathTask.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antclipse/package-frame.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antclipse/package-summary.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antclipse/package-tree.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/Command.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/Response.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/Util.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/client/Client.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/client/ClientTask.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/client/package-frame.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/client/package-summary.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/client/package-tree.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/commands/AbstractCommand.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/commands/DisconnectCommand.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/commands/HelloWorldCommand.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/commands/PropertyContainer.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/commands/ReferenceContainer.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/commands/RunAntCommand.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/commands/RunTargetCommand.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/commands/SendFileCommand.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/commands/ShutdownCommand.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/commands/package-frame.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/commands/package-summary.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/commands/package-tree.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/package-frame.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/package-summary.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/package-tree.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/server/ConnectionBuildListener.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/server/ConnectionHandler.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/server/Server.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/server/ServerTask.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/server/package-frame.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/server/package-summary.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/server/package-tree.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/design/Depends.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/design/Design.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/design/InstructionVisitor.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/design/Log.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/design/Package.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/design/VerifyDesign.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/design/VerifyDesignDelegate.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/design/package-frame.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/design/package-summary.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/design/package-tree.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/inifile/IniFile.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/inifile/IniFileTask.Exists.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/inifile/IniFileTask.Get.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/inifile/IniFileTask.IniOperation.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/inifile/IniFileTask.IniOperationConditional.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/inifile/IniFileTask.IniOperationPropertySetter.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/inifile/IniFileTask.Remove.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/inifile/IniFileTask.Set.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/inifile/IniFileTask.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/inifile/IniPart.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/inifile/IniProperty.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/inifile/IniSection.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/inifile/package-frame.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/inifile/package-summary.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/inifile/package-tree.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/input/GUIInputHandler.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/input/package-frame.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/input/package-summary.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/input/package-tree.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/AntCallBack.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/AntFetch.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/Assert.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/ForEach.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/ForTask.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/IfTask.ElseIf.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/IfTask.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/OutOfDate.CollectionEnum.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/OutOfDate.DeleteTargets.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/OutOfDate.MyMapper.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/OutOfDate.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/ProjectDelegate.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/Relentless.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/RunTargetTask.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/Switch.Case.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/Switch.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/Throw.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/TimestampSelector.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/TryCatchTask.CatchBlock.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/TryCatchTask.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/condition/BooleanConditionBase.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/condition/IsGreaterThan.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/condition/IsLessThan.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/condition/IsPropertyFalse.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/condition/IsPropertyTrue.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/condition/package-frame.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/condition/package-summary.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/condition/package-tree.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/package-frame.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/package-summary.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/package-tree.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/math/Evaluateable.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/math/Math.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/math/MathTask.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/math/Numeric.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/math/Operation.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/math/package-frame.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/math/package-summary.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/math/package-tree.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/PostTask.Cookie.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/PostTask.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/Prop.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/URLImportTask.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/AbstractHttpStateTypeTask.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/AbstractMethodTask.ResponseHeader.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/AbstractMethodTask.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/AddCookieTask.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/AddCredentialsTask.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/ClearCookiesTask.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/ClearCredentialsTask.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/ClientParams.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/Credentials.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/GetCookieTask.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/GetMethodTask.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/HeadMethodTask.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/HostConfig.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/HostParams.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/HttpClientType.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/HttpStateType.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/MethodParams.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/Params.BooleanParam.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/Params.DoubleParam.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/Params.IntParam.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/Params.LongParam.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/Params.Param.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/Params.StringParam.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/Params.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/PostMethodTask.FilePartType.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/PostMethodTask.TextPartType.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/PostMethodTask.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/PurgeExpiredCookiesTask.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/package-frame.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/package-summary.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/package-tree.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/package-frame.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/package-summary.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/package-tree.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/package-frame.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/package-summary.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/package-tree.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/perf/AntPerformanceListener.StopWatch.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/perf/AntPerformanceListener.StopWatchComparator.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/perf/AntPerformanceListener.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/perf/StopWatch.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/perf/StopWatchTask.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/perf/package-frame.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/perf/package-summary.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/perf/package-tree.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/platform/OsFamily.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/platform/Platform.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/platform/ShellScriptTask.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/platform/package-frame.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/platform/package-summary.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/platform/package-tree.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/process/ForgetTask.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/process/Limit.TimeUnit.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/process/Limit.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/process/package-frame.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/process/package-summary.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/process/package-tree.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/property/AbstractPropertySetterTask.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/property/PathFilterTask.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/property/PathToFileSet.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/property/PropertyCopy.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/property/PropertySelector.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/property/RegexTask.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/property/RegexUtil.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/property/SortList.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/property/URLEncodeTask.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/property/Variable.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/property/package-frame.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/property/package-summary.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/property/package-tree.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/util/Reflector.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/util/ThreadPool.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/util/ThreadPoolThread.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/util/package-frame.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/util/package-summary.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/util/package-tree.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/walls/CompileWithWalls.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/walls/Package.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/walls/SilentCopy.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/walls/SilentMove.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/walls/Walls.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/walls/package-frame.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/walls/package-summary.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/walls/package-tree.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/overview-frame.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/overview-summary.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/overview-tree.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/package-list mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/resources/inherit.gif mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/serialized-form.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/api/stylesheet.css mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/manual/index.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/manual/tasks/antcallback_task.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/manual/tasks/antclipse_task.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/manual/tasks/antfetch_task.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/manual/tasks/assert_task.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/manual/tasks/compilewithwalls.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/manual/tasks/for.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/manual/tasks/foreach.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/manual/tasks/forget.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/manual/tasks/get-cookie_task.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/manual/tasks/get-method_task.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/manual/tasks/head-method_task.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/manual/tasks/http-client_type.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/manual/tasks/http-state_type.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/manual/tasks/if.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/manual/tasks/importurl.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/manual/tasks/index.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/manual/tasks/inifile.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/manual/tasks/limit_task.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/manual/tasks/math_task.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/manual/tasks/method_task_common.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/manual/tasks/more_conditions.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/manual/tasks/osfamily.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/manual/tasks/outofdate.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/manual/tasks/pathtofileset.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/manual/tasks/performance_monitor.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/manual/tasks/post-method_task.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/manual/tasks/post_task.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/manual/tasks/propertycopy.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/manual/tasks/propertyregex.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/manual/tasks/propertyselector.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/manual/tasks/relentless.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/manual/tasks/runtarget.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/manual/tasks/server_tasks.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/manual/tasks/shellscript.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/manual/tasks/sortlist.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/manual/tasks/stopwatch_task.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/manual/tasks/switch.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/manual/tasks/throw.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/manual/tasks/timestampselector.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/manual/tasks/toc.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/manual/tasks/trycatch.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/manual/tasks/urlencode.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/manual/tasks/variable_task.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/manual/tasks/verifydesign.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/manual/tasks/verifylegacytutorial.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/docs/manual/tasks/verifynewprojtutorial.html mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/lib/bcel-5.1.jar mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/lib/commons-httpclient-3.0.1.jar mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/lib/commons-logging-1.0.4.jar mode change 100644 => 100755 thirdparty/ant-contrib/1.0b3/lib/ivy-1.3.1.jar mode change 100644 => 100755 thirdparty/apache-mime4j/apache-mime4j-core-0.8.0-SNAPSHOT.jar mode change 100644 => 100755 thirdparty/apache-mime4j/apache-mime4j-dom-0.8.0-SNAPSHOT.jar mode change 100644 => 100755 thirdparty/apache-mime4j/apache-mime4j-mbox-iterator-0.8.0-SNAPSHOT.jar mode change 100644 => 100755 thirdparty/gstreamer/windows/i386/0.10.7/gstreamer.zip mode change 100644 => 100755 thirdparty/java-libpst/java-libpst-1.0-SNAPSHOT.jar mode change 100644 => 100755 thirdparty/jdiff/v-custom/.cvsignore mode change 100644 => 100755 thirdparty/jdiff/v-custom/LICENSE.txt mode change 100644 => 100755 thirdparty/jdiff/v-custom/README.txt mode change 100644 => 100755 thirdparty/jdiff/v-custom/doc/CHANGES.txt mode change 100644 => 100755 thirdparty/jdiff/v-custom/doc/JDiffArticle.pdf mode change 100644 => 100755 thirdparty/jdiff/v-custom/doc/KNOWN_LIMITATIONS.txt mode change 100644 => 100755 thirdparty/jdiff/v-custom/doc/TODO mode change 100644 => 100755 thirdparty/jdiff/v-custom/doc/dev_notes.txt mode change 100644 => 100755 thirdparty/jdiff/v-custom/doc/index.html mode change 100644 => 100755 thirdparty/jdiff/v-custom/doc/jdiff.html mode change 100644 => 100755 thirdparty/jdiff/v-custom/doc/stylesheet.css mode change 100644 => 100755 thirdparty/jdiff/v-custom/index.xhtml mode change 100644 => 100755 thirdparty/jdiff/v-custom/jdiff.jar mode change 100644 => 100755 thirdparty/jdiff/v-custom/lib/2000/10/XMLSchema mode change 100644 => 100755 thirdparty/jdiff/v-custom/lib/2000/10/XMLSchema-instance mode change 100644 => 100755 thirdparty/jdiff/v-custom/lib/2001/XMLSchema mode change 100644 => 100755 thirdparty/jdiff/v-custom/lib/2001/XMLSchema-instance mode change 100644 => 100755 thirdparty/jdiff/v-custom/lib/Null.java mode change 100644 => 100755 thirdparty/jdiff/v-custom/lib/background.gif mode change 100644 => 100755 thirdparty/jdiff/v-custom/lib/black.gif mode change 100644 => 100755 thirdparty/jdiff/v-custom/lib/classdoc.jar mode change 100644 => 100755 thirdparty/jdiff/v-custom/lib/jdiff_logo.gif mode change 100644 => 100755 thirdparty/jdiff/v-custom/lib/new.gif mode change 100644 => 100755 thirdparty/jdiff/v-custom/lib/xerces.jar mode change 100644 => 100755 thirdparty/jdiff/v-custom/src/api.xsd mode change 100644 => 100755 thirdparty/jdiff/v-custom/src/comments.xsd mode change 100644 => 100755 thirdparty/jdiff/v-custom/src/jdiff/.cvsignore mode change 100644 => 100755 thirdparty/jdiff/v-custom/src/jdiff/API.java mode change 100644 => 100755 thirdparty/jdiff/v-custom/src/jdiff/APIComparator.java mode change 100644 => 100755 thirdparty/jdiff/v-custom/src/jdiff/APIDiff.java mode change 100644 => 100755 thirdparty/jdiff/v-custom/src/jdiff/APIHandler.java mode change 100644 => 100755 thirdparty/jdiff/v-custom/src/jdiff/ClassAPI.java mode change 100644 => 100755 thirdparty/jdiff/v-custom/src/jdiff/ClassDiff.java mode change 100644 => 100755 thirdparty/jdiff/v-custom/src/jdiff/Comments.java mode change 100644 => 100755 thirdparty/jdiff/v-custom/src/jdiff/CommentsHandler.java mode change 100644 => 100755 thirdparty/jdiff/v-custom/src/jdiff/CompareClassPdiffs.java mode change 100644 => 100755 thirdparty/jdiff/v-custom/src/jdiff/ComparePkgPdiffs.java mode change 100644 => 100755 thirdparty/jdiff/v-custom/src/jdiff/ConstructorAPI.java mode change 100644 => 100755 thirdparty/jdiff/v-custom/src/jdiff/Diff.java mode change 100644 => 100755 thirdparty/jdiff/v-custom/src/jdiff/DiffMyers.java mode change 100644 => 100755 thirdparty/jdiff/v-custom/src/jdiff/DiffOutput.java mode change 100644 => 100755 thirdparty/jdiff/v-custom/src/jdiff/FieldAPI.java mode change 100644 => 100755 thirdparty/jdiff/v-custom/src/jdiff/HTMLFiles.java mode change 100644 => 100755 thirdparty/jdiff/v-custom/src/jdiff/HTMLIndexes.java mode change 100644 => 100755 thirdparty/jdiff/v-custom/src/jdiff/HTMLReportGenerator.java mode change 100644 => 100755 thirdparty/jdiff/v-custom/src/jdiff/HTMLStatistics.java mode change 100644 => 100755 thirdparty/jdiff/v-custom/src/jdiff/JDiff.java mode change 100644 => 100755 thirdparty/jdiff/v-custom/src/jdiff/JDiffAntTask.java mode change 100644 => 100755 thirdparty/jdiff/v-custom/src/jdiff/MemberDiff.java mode change 100644 => 100755 thirdparty/jdiff/v-custom/src/jdiff/MergeChanges.java mode change 100644 => 100755 thirdparty/jdiff/v-custom/src/jdiff/MethodAPI.java mode change 100644 => 100755 thirdparty/jdiff/v-custom/src/jdiff/Modifiers.java mode change 100644 => 100755 thirdparty/jdiff/v-custom/src/jdiff/Options.java mode change 100644 => 100755 thirdparty/jdiff/v-custom/src/jdiff/PackageAPI.java mode change 100644 => 100755 thirdparty/jdiff/v-custom/src/jdiff/PackageDiff.java mode change 100644 => 100755 thirdparty/jdiff/v-custom/src/jdiff/ParamAPI.java mode change 100644 => 100755 thirdparty/jdiff/v-custom/src/jdiff/RootDocToXML.java mode change 100644 => 100755 thirdparty/jdiff/v-custom/src/jdiff/ScriptReport.java mode change 100644 => 100755 thirdparty/jdiff/v-custom/src/jdiff/SingleComment.java mode change 100644 => 100755 thirdparty/jdiff/v-custom/src/jdiff/StreamReader.java mode change 100644 => 100755 thirdparty/jdiff/v-custom/src/jdiff/XMLToAPI.java mode change 100644 => 100755 thirdparty/jdom/jdom-2.0.5-contrib.jar mode change 100644 => 100755 thirdparty/jdom/jdom-2.0.5.jar mode change 100644 => 100755 thirdparty/jfxrt/1.7.11/jfxrt.jar mode change 100644 => 100755 thirdparty/jfxrt/1.7.13/jfxrt.jar mode change 100644 => 100755 thirdparty/jfxrt/1.7.21/jfxrt.jar mode change 100644 => 100755 thirdparty/junit/7.3.1/junit.zip mode change 100644 => 100755 thirdparty/junit/7.3/junit.zip mode change 100644 => 100755 thirdparty/junit/8.2/junit.zip mode change 100644 => 100755 thirdparty/libscalpel_jni/current/libscalpel_jni.zip mode change 100644 => 100755 thirdparty/opencv/ext/opencv-248.jar mode change 100644 => 100755 thirdparty/opencv/lib/amd64/api-ms-win-core-console-l1-1-0.dll mode change 100644 => 100755 thirdparty/opencv/lib/amd64/api-ms-win-core-datetime-l1-1-0.dll mode change 100644 => 100755 thirdparty/opencv/lib/amd64/api-ms-win-core-debug-l1-1-0.dll mode change 100644 => 100755 thirdparty/opencv/lib/amd64/api-ms-win-core-errorhandling-l1-1-0.dll mode change 100644 => 100755 thirdparty/opencv/lib/amd64/api-ms-win-core-file-l1-1-0.dll mode change 100644 => 100755 thirdparty/opencv/lib/amd64/api-ms-win-core-file-l1-2-0.dll mode change 100644 => 100755 thirdparty/opencv/lib/amd64/api-ms-win-core-file-l2-1-0.dll mode change 100644 => 100755 thirdparty/opencv/lib/amd64/api-ms-win-core-handle-l1-1-0.dll mode change 100644 => 100755 thirdparty/opencv/lib/amd64/api-ms-win-core-heap-l1-1-0.dll mode change 100644 => 100755 thirdparty/opencv/lib/amd64/api-ms-win-core-interlocked-l1-1-0.dll mode change 100644 => 100755 thirdparty/opencv/lib/amd64/api-ms-win-core-libraryloader-l1-1-0.dll mode change 100644 => 100755 thirdparty/opencv/lib/amd64/api-ms-win-core-localization-l1-2-0.dll mode change 100644 => 100755 thirdparty/opencv/lib/amd64/api-ms-win-core-memory-l1-1-0.dll mode change 100644 => 100755 thirdparty/opencv/lib/amd64/api-ms-win-core-namedpipe-l1-1-0.dll mode change 100644 => 100755 thirdparty/opencv/lib/amd64/api-ms-win-core-processenvironment-l1-1-0.dll mode change 100644 => 100755 thirdparty/opencv/lib/amd64/api-ms-win-core-processthreads-l1-1-0.dll mode change 100644 => 100755 thirdparty/opencv/lib/amd64/api-ms-win-core-processthreads-l1-1-1.dll mode change 100644 => 100755 thirdparty/opencv/lib/amd64/api-ms-win-core-profile-l1-1-0.dll mode change 100644 => 100755 thirdparty/opencv/lib/amd64/api-ms-win-core-rtlsupport-l1-1-0.dll mode change 100644 => 100755 thirdparty/opencv/lib/amd64/api-ms-win-core-string-l1-1-0.dll mode change 100644 => 100755 thirdparty/opencv/lib/amd64/api-ms-win-core-synch-l1-1-0.dll mode change 100644 => 100755 thirdparty/opencv/lib/amd64/api-ms-win-core-synch-l1-2-0.dll mode change 100644 => 100755 thirdparty/opencv/lib/amd64/api-ms-win-core-sysinfo-l1-1-0.dll mode change 100644 => 100755 thirdparty/opencv/lib/amd64/api-ms-win-core-timezone-l1-1-0.dll mode change 100644 => 100755 thirdparty/opencv/lib/amd64/api-ms-win-core-util-l1-1-0.dll mode change 100644 => 100755 thirdparty/opencv/lib/amd64/api-ms-win-crt-conio-l1-1-0.dll mode change 100644 => 100755 thirdparty/opencv/lib/amd64/api-ms-win-crt-convert-l1-1-0.dll mode change 100644 => 100755 thirdparty/opencv/lib/amd64/api-ms-win-crt-environment-l1-1-0.dll mode change 100644 => 100755 thirdparty/opencv/lib/amd64/api-ms-win-crt-filesystem-l1-1-0.dll mode change 100644 => 100755 thirdparty/opencv/lib/amd64/api-ms-win-crt-heap-l1-1-0.dll mode change 100644 => 100755 thirdparty/opencv/lib/amd64/api-ms-win-crt-locale-l1-1-0.dll mode change 100644 => 100755 thirdparty/opencv/lib/amd64/api-ms-win-crt-math-l1-1-0.dll mode change 100644 => 100755 thirdparty/opencv/lib/amd64/api-ms-win-crt-multibyte-l1-1-0.dll mode change 100644 => 100755 thirdparty/opencv/lib/amd64/api-ms-win-crt-private-l1-1-0.dll mode change 100644 => 100755 thirdparty/opencv/lib/amd64/api-ms-win-crt-process-l1-1-0.dll mode change 100644 => 100755 thirdparty/opencv/lib/amd64/api-ms-win-crt-runtime-l1-1-0.dll mode change 100644 => 100755 thirdparty/opencv/lib/amd64/api-ms-win-crt-stdio-l1-1-0.dll mode change 100644 => 100755 thirdparty/opencv/lib/amd64/api-ms-win-crt-string-l1-1-0.dll mode change 100644 => 100755 thirdparty/opencv/lib/amd64/api-ms-win-crt-time-l1-1-0.dll mode change 100644 => 100755 thirdparty/opencv/lib/amd64/api-ms-win-crt-utility-l1-1-0.dll mode change 100644 => 100755 thirdparty/opencv/lib/amd64/concrt140.dll mode change 100644 => 100755 thirdparty/opencv/lib/amd64/libeay32.dll mode change 100644 => 100755 thirdparty/opencv/lib/amd64/libewf.dll mode change 100644 => 100755 thirdparty/opencv/lib/amd64/libiconv-2.dll mode change 100644 => 100755 thirdparty/opencv/lib/amd64/libintl-8.dll mode change 100644 => 100755 thirdparty/opencv/lib/amd64/libpq.dll mode change 100644 => 100755 thirdparty/opencv/lib/amd64/libvhdi.dll mode change 100644 => 100755 thirdparty/opencv/lib/amd64/libvmdk.dll mode change 100644 => 100755 thirdparty/opencv/lib/amd64/msvcp140.dll mode change 100644 => 100755 thirdparty/opencv/lib/amd64/msvcr120.dll mode change 100644 => 100755 thirdparty/opencv/lib/amd64/opencv_ffmpeg248_64.dll mode change 100644 => 100755 thirdparty/opencv/lib/amd64/opencv_java248.dll mode change 100644 => 100755 thirdparty/opencv/lib/amd64/ssleay32.dll mode change 100644 => 100755 thirdparty/opencv/lib/amd64/ucrtbase.dll mode change 100644 => 100755 thirdparty/opencv/lib/amd64/vccorlib140.dll mode change 100644 => 100755 thirdparty/opencv/lib/amd64/vcruntime140.dll mode change 100644 => 100755 thirdparty/opencv/lib/amd64/zlib.dll mode change 100644 => 100755 thirdparty/opencv/lib/i386/opencv_ffmpeg248.dll mode change 100644 => 100755 thirdparty/opencv/lib/i386/opencv_java248.dll mode change 100644 => 100755 thirdparty/opencv/lib/i586/opencv_ffmpeg248_64.dll mode change 100644 => 100755 thirdparty/opencv/lib/i586/opencv_java248.dll mode change 100644 => 100755 thirdparty/opencv/lib/i686/opencv_ffmpeg248_64.dll mode change 100644 => 100755 thirdparty/opencv/lib/i686/opencv_java248.dll mode change 100644 => 100755 thirdparty/opencv/lib/x86/opencv_ffmpeg248.dll mode change 100644 => 100755 thirdparty/opencv/lib/x86/opencv_java248.dll mode change 100644 => 100755 thirdparty/opencv/lib/x86_64/api-ms-win-core-console-l1-1-0.dll mode change 100644 => 100755 thirdparty/opencv/lib/x86_64/api-ms-win-core-datetime-l1-1-0.dll mode change 100644 => 100755 thirdparty/opencv/lib/x86_64/api-ms-win-core-debug-l1-1-0.dll mode change 100644 => 100755 thirdparty/opencv/lib/x86_64/api-ms-win-core-errorhandling-l1-1-0.dll mode change 100644 => 100755 thirdparty/opencv/lib/x86_64/api-ms-win-core-file-l1-1-0.dll mode change 100644 => 100755 thirdparty/opencv/lib/x86_64/api-ms-win-core-file-l1-2-0.dll mode change 100644 => 100755 thirdparty/opencv/lib/x86_64/api-ms-win-core-file-l2-1-0.dll mode change 100644 => 100755 thirdparty/opencv/lib/x86_64/api-ms-win-core-handle-l1-1-0.dll mode change 100644 => 100755 thirdparty/opencv/lib/x86_64/api-ms-win-core-heap-l1-1-0.dll mode change 100644 => 100755 thirdparty/opencv/lib/x86_64/api-ms-win-core-interlocked-l1-1-0.dll mode change 100644 => 100755 thirdparty/opencv/lib/x86_64/api-ms-win-core-libraryloader-l1-1-0.dll mode change 100644 => 100755 thirdparty/opencv/lib/x86_64/api-ms-win-core-localization-l1-2-0.dll mode change 100644 => 100755 thirdparty/opencv/lib/x86_64/api-ms-win-core-memory-l1-1-0.dll mode change 100644 => 100755 thirdparty/opencv/lib/x86_64/api-ms-win-core-namedpipe-l1-1-0.dll mode change 100644 => 100755 thirdparty/opencv/lib/x86_64/api-ms-win-core-processenvironment-l1-1-0.dll mode change 100644 => 100755 thirdparty/opencv/lib/x86_64/api-ms-win-core-processthreads-l1-1-0.dll mode change 100644 => 100755 thirdparty/opencv/lib/x86_64/api-ms-win-core-processthreads-l1-1-1.dll mode change 100644 => 100755 thirdparty/opencv/lib/x86_64/api-ms-win-core-profile-l1-1-0.dll mode change 100644 => 100755 thirdparty/opencv/lib/x86_64/api-ms-win-core-rtlsupport-l1-1-0.dll mode change 100644 => 100755 thirdparty/opencv/lib/x86_64/api-ms-win-core-string-l1-1-0.dll mode change 100644 => 100755 thirdparty/opencv/lib/x86_64/api-ms-win-core-synch-l1-1-0.dll mode change 100644 => 100755 thirdparty/opencv/lib/x86_64/api-ms-win-core-synch-l1-2-0.dll mode change 100644 => 100755 thirdparty/opencv/lib/x86_64/api-ms-win-core-sysinfo-l1-1-0.dll mode change 100644 => 100755 thirdparty/opencv/lib/x86_64/api-ms-win-core-timezone-l1-1-0.dll mode change 100644 => 100755 thirdparty/opencv/lib/x86_64/api-ms-win-core-util-l1-1-0.dll mode change 100644 => 100755 thirdparty/opencv/lib/x86_64/api-ms-win-crt-conio-l1-1-0.dll mode change 100644 => 100755 thirdparty/opencv/lib/x86_64/api-ms-win-crt-convert-l1-1-0.dll mode change 100644 => 100755 thirdparty/opencv/lib/x86_64/api-ms-win-crt-environment-l1-1-0.dll mode change 100644 => 100755 thirdparty/opencv/lib/x86_64/api-ms-win-crt-filesystem-l1-1-0.dll mode change 100644 => 100755 thirdparty/opencv/lib/x86_64/api-ms-win-crt-heap-l1-1-0.dll mode change 100644 => 100755 thirdparty/opencv/lib/x86_64/api-ms-win-crt-locale-l1-1-0.dll mode change 100644 => 100755 thirdparty/opencv/lib/x86_64/api-ms-win-crt-math-l1-1-0.dll mode change 100644 => 100755 thirdparty/opencv/lib/x86_64/api-ms-win-crt-multibyte-l1-1-0.dll mode change 100644 => 100755 thirdparty/opencv/lib/x86_64/api-ms-win-crt-private-l1-1-0.dll mode change 100644 => 100755 thirdparty/opencv/lib/x86_64/api-ms-win-crt-process-l1-1-0.dll mode change 100644 => 100755 thirdparty/opencv/lib/x86_64/api-ms-win-crt-runtime-l1-1-0.dll mode change 100644 => 100755 thirdparty/opencv/lib/x86_64/api-ms-win-crt-stdio-l1-1-0.dll mode change 100644 => 100755 thirdparty/opencv/lib/x86_64/api-ms-win-crt-string-l1-1-0.dll mode change 100644 => 100755 thirdparty/opencv/lib/x86_64/api-ms-win-crt-time-l1-1-0.dll mode change 100644 => 100755 thirdparty/opencv/lib/x86_64/api-ms-win-crt-utility-l1-1-0.dll mode change 100644 => 100755 thirdparty/opencv/lib/x86_64/concrt140.dll mode change 100644 => 100755 thirdparty/opencv/lib/x86_64/libeay32.dll mode change 100644 => 100755 thirdparty/opencv/lib/x86_64/libewf.dll mode change 100644 => 100755 thirdparty/opencv/lib/x86_64/libiconv-2.dll mode change 100644 => 100755 thirdparty/opencv/lib/x86_64/libintl-8.dll mode change 100644 => 100755 thirdparty/opencv/lib/x86_64/libpq.dll mode change 100644 => 100755 thirdparty/opencv/lib/x86_64/libvhdi.dll mode change 100644 => 100755 thirdparty/opencv/lib/x86_64/libvmdk.dll mode change 100644 => 100755 thirdparty/opencv/lib/x86_64/msvcp140.dll mode change 100644 => 100755 thirdparty/opencv/lib/x86_64/msvcr120.dll mode change 100644 => 100755 thirdparty/opencv/lib/x86_64/opencv_ffmpeg248_64.dll mode change 100644 => 100755 thirdparty/opencv/lib/x86_64/opencv_java248.dll mode change 100644 => 100755 thirdparty/opencv/lib/x86_64/ssleay32.dll mode change 100644 => 100755 thirdparty/opencv/lib/x86_64/ucrtbase.dll mode change 100644 => 100755 thirdparty/opencv/lib/x86_64/vccorlib140.dll mode change 100644 => 100755 thirdparty/opencv/lib/x86_64/vcruntime140.dll mode change 100644 => 100755 thirdparty/opencv/lib/x86_64/zlib.dll mode change 100644 => 100755 thirdparty/pasco2/.classpath mode change 100644 => 100755 thirdparty/pasco2/.project mode change 100644 => 100755 thirdparty/pasco2/.settings/org.eclipse.jdt.core.prefs mode change 100644 => 100755 thirdparty/pasco2/.settings/org.eclipse.jdt.ui.prefs mode change 100644 => 100755 thirdparty/pasco2/build.xml mode change 100644 => 100755 thirdparty/pasco2/lib/commons-cli-1.0.jar mode change 100644 => 100755 thirdparty/pasco2/lib/commons-collections-3.1.jar mode change 100644 => 100755 thirdparty/pasco2/lib/ctypes4j.dll mode change 100644 => 100755 thirdparty/pasco2/lib/ctypes4j.jar mode change 100644 => 100755 thirdparty/pasco2/lib/ctypes4j.zip mode change 100644 => 100755 thirdparty/pasco2/lib/pasco2.jar mode change 100644 => 100755 thirdparty/pasco2/lib/trove-1.0.2.jar mode change 100644 => 100755 thirdparty/pasco2/lib/trove-3.0.2.jar mode change 100644 => 100755 thirdparty/pasco2/results/pasco2Result0.txt mode change 100644 => 100755 thirdparty/pasco2/src/isi/pasco2/Main.java mode change 100644 => 100755 thirdparty/pasco2/src/isi/pasco2/Poller.java mode change 100644 => 100755 thirdparty/pasco2/src/isi/pasco2/handler/AbstractPrinterHandler.java mode change 100644 => 100755 thirdparty/pasco2/src/isi/pasco2/handler/CacheAccessHandler.java mode change 100644 => 100755 thirdparty/pasco2/src/isi/pasco2/handler/CountingCacheHandler.java mode change 100644 => 100755 thirdparty/pasco2/src/isi/pasco2/handler/DefaultHandler.java mode change 100644 => 100755 thirdparty/pasco2/src/isi/pasco2/handler/HistoryAccessHandler.java mode change 100644 => 100755 thirdparty/pasco2/src/isi/pasco2/handler/Pasco2CacheHandler.java mode change 100644 => 100755 thirdparty/pasco2/src/isi/pasco2/handler/Pasco2HistoryHandler.java mode change 100644 => 100755 thirdparty/pasco2/src/isi/pasco2/io/EnhancedRandomAccessFile.java mode change 100644 => 100755 thirdparty/pasco2/src/isi/pasco2/io/FastReadIndexFile.java mode change 100644 => 100755 thirdparty/pasco2/src/isi/pasco2/io/IndexFile.java mode change 100644 => 100755 thirdparty/pasco2/src/isi/pasco2/model/REDRRecord.java mode change 100644 => 100755 thirdparty/pasco2/src/isi/pasco2/model/RecognisedRecord.java mode change 100644 => 100755 thirdparty/pasco2/src/isi/pasco2/model/Record.java mode change 100644 => 100755 thirdparty/pasco2/src/isi/pasco2/model/URLLEAKRecord.java mode change 100644 => 100755 thirdparty/pasco2/src/isi/pasco2/model/UnknownRecord.java mode change 100644 => 100755 thirdparty/pasco2/src/isi/pasco2/parser/AbstractValidRecordIterator.java mode change 100644 => 100755 thirdparty/pasco2/src/isi/pasco2/parser/AllRecordIterator.java mode change 100644 => 100755 thirdparty/pasco2/src/isi/pasco2/parser/Allocator.java mode change 100644 => 100755 thirdparty/pasco2/src/isi/pasco2/parser/DateTime.java mode change 100644 => 100755 thirdparty/pasco2/src/isi/pasco2/parser/HashBlock.java mode change 100644 => 100755 thirdparty/pasco2/src/isi/pasco2/parser/HashBlockIterator.java mode change 100644 => 100755 thirdparty/pasco2/src/isi/pasco2/parser/HashRecord.java mode change 100644 => 100755 thirdparty/pasco2/src/isi/pasco2/parser/HashRecordIterator.java mode change 100644 => 100755 thirdparty/pasco2/src/isi/pasco2/parser/IECacheFileParser.java mode change 100644 => 100755 thirdparty/pasco2/src/isi/pasco2/parser/IEHistoryFileParser.java mode change 100644 => 100755 thirdparty/pasco2/src/isi/pasco2/parser/IEIndexFileParser.java mode change 100644 => 100755 thirdparty/pasco2/src/isi/pasco2/parser/RecordIterator.java mode change 100644 => 100755 thirdparty/pasco2/src/isi/pasco2/parser/ValidRecordIterator.java mode change 100644 => 100755 thirdparty/pasco2/src/isi/pasco2/parser/time/DOSTime.java mode change 100644 => 100755 thirdparty/pasco2/src/isi/pasco2/parser/time/FileTime.java mode change 100644 => 100755 thirdparty/pasco2/src/isi/pasco2/poller/DifferenceHandler.java mode change 100644 => 100755 thirdparty/pasco2/src/isi/pasco2/util/HexFormatter.java mode change 100644 => 100755 thirdparty/pasco2/src/isi/pasco2/util/StructConverter.java mode change 100644 => 100755 thirdparty/pasco2/test/isi/pasco2/TestAllocationLayer.java mode change 100644 => 100755 thirdparty/pasco2/test/isi/pasco2/TestDOSTime.java mode change 100644 => 100755 thirdparty/pasco2/test/isi/pasco2/TestFileTime.java mode change 100644 => 100755 thirdparty/pasco2/test/isi/pasco2/TestPackage.java mode change 100644 => 100755 thirdparty/pasco2/test/isi/pasco2/TestPlatform.java mode change 100644 => 100755 thirdparty/pasco2/test/isi/pasco2/TestReadFunctions.java mode change 100644 => 100755 thirdparty/pasco2/test/isi/pasco2/TestRecordLayer.java mode change 100644 => 100755 thirdparty/pasco2/test/isi/pasco2/empty.cache.index.dat mode change 100644 => 100755 thirdparty/pasco2/test/isi/pasco2/empty.history.index.dat mode change 100644 => 100755 thirdparty/pasco2/test/isi/pasco2/first.cache.index.dat mode change 100644 => 100755 thirdparty/pasco2/test/isi/pasco2/first.history.index.dat mode change 100644 => 100755 thirdparty/pasco2/test/isi/pasco2/platform/FILETIME.java mode change 100644 => 100755 thirdparty/pasco2/test/isi/pasco2/platform/SYSTEMTIME.java mode change 100644 => 100755 thirdparty/photorec_exec/63/cygwin mode change 100644 => 100755 thirdparty/photorec_exec/AUTHORS.txt mode change 100644 => 100755 thirdparty/photorec_exec/COPYING.txt mode change 100644 => 100755 thirdparty/photorec_exec/INFO mode change 100644 => 100755 thirdparty/photorec_exec/NEWS.txt mode change 100644 => 100755 thirdparty/photorec_exec/QtCore4.dll mode change 100644 => 100755 thirdparty/photorec_exec/QtGui4.dll mode change 100644 => 100755 thirdparty/photorec_exec/THANKS.txt mode change 100644 => 100755 thirdparty/photorec_exec/VERSION.txt mode change 100644 => 100755 thirdparty/photorec_exec/cyggcc_s-1.dll mode change 100644 => 100755 thirdparty/photorec_exec/cygiconv-2.dll mode change 100644 => 100755 thirdparty/photorec_exec/cygjpeg-8.dll mode change 100644 => 100755 thirdparty/photorec_exec/cygncursesw-10.dll mode change 100644 => 100755 thirdparty/photorec_exec/cygssp-0.dll mode change 100644 => 100755 thirdparty/photorec_exec/cygwin1.dll mode change 100644 => 100755 thirdparty/photorec_exec/cygz.dll mode change 100644 => 100755 thirdparty/photorec_exec/documentation.html mode change 100644 => 100755 thirdparty/photorec_exec/fidentify_win.exe mode change 100644 => 100755 thirdparty/photorec_exec/iconv.dll mode change 100644 => 100755 thirdparty/photorec_exec/libgcc_s_sjlj-1.dll mode change 100644 => 100755 thirdparty/photorec_exec/libjpeg-62.dll mode change 100644 => 100755 thirdparty/photorec_exec/libpng16-16.dll mode change 100644 => 100755 thirdparty/photorec_exec/libssp-0.dll mode change 100644 => 100755 thirdparty/photorec_exec/libstdc++-6.dll mode change 100644 => 100755 thirdparty/photorec_exec/libwinpthread-1.dll mode change 100644 => 100755 thirdparty/photorec_exec/photorec_win.exe mode change 100644 => 100755 thirdparty/photorec_exec/plugins/BartPE/Get_Files.cmd mode change 100644 => 100755 thirdparty/photorec_exec/plugins/BartPE/Help.htm mode change 100644 => 100755 thirdparty/photorec_exec/plugins/BartPE/RESET.cmd mode change 100644 => 100755 thirdparty/photorec_exec/plugins/BartPE/ReadMe.txt mode change 100644 => 100755 thirdparty/photorec_exec/plugins/BartPE/SCRIPTS/Start_INF.dat mode change 100644 => 100755 thirdparty/photorec_exec/plugins/BartPE/SCRIPTS/StaticINF.dat mode change 100644 => 100755 thirdparty/photorec_exec/plugins/BartPE/start.inf mode change 100644 => 100755 thirdparty/photorec_exec/plugins/BartPE/testdisk_nu2menu.xml mode change 100644 => 100755 thirdparty/photorec_exec/plugins/WinBuilder/Help.htm mode change 100644 => 100755 thirdparty/photorec_exec/plugins/WinBuilder/ReadMe.txt mode change 100644 => 100755 thirdparty/photorec_exec/plugins/WinBuilder/TestDisk.script mode change 100644 => 100755 thirdparty/photorec_exec/qphotorec_win.exe mode change 100644 => 100755 thirdparty/photorec_exec/readme.txt mode change 100644 => 100755 thirdparty/photorec_exec/testdisk_win.exe mode change 100644 => 100755 thirdparty/photorec_exec/zlib1.dll mode change 100644 => 100755 thirdparty/rejistry/Rejistry-1.0-SNAPSHOT.jar mode change 100644 => 100755 thirdparty/rr-full/license.txt mode change 100644 => 100755 thirdparty/rr-full/p2x5124.dll mode change 100644 => 100755 thirdparty/rr-full/plugins/acmru.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/adoberdr.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/ahaha.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/aim.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/all mode change 100644 => 100755 thirdparty/rr-full/plugins/amcache.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/aports.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/appcertdlls.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/appcompatcache.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/appcompatcache_tln.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/appcompatflags.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/appinitdlls.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/applets.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/applets_tln.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/apppaths.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/apppaths_tln.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/appspecific.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/ares.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/arpcache.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/assoc.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/at.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/at_tln.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/attachmgr.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/attachmgr_tln.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/audiodev.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/auditfail.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/auditpol.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/autoendtasks.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/autorun.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/backuprestore.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/banner.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/baseline.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/bho.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/bitbucket.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/bitbucket_user.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/brisv.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/btconfig.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/bthport.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/cain.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/ccleaner.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/cdstaginginfo.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/clampi.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/clampitm.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/clsid.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/cmd_shell.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/cmd_shell_tln.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/cmd_shell_u.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/cmdproc.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/cmdproc_tln.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/codeid.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/comdlg32.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/comfoo.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/compdesc.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/compname.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/controlpanel.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/cpldontload.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/crashcontrol.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/ctrlpnl.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/ddm.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/ddo.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/decaf.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/defbrowser.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/del.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/del_tln.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/dependency_walker.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/devclass.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/dfrg.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/diag_sr.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/direct.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/direct_tln.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/disablelastaccess.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/disablesr.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/dllsearch.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/dnschanger.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/domains.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/drivers32.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/drwatson.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/emdmgmt.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/environment.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/esent.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/eventlog.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/eventlogs.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/fileexts.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/filehistory.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/findexes.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/fw_config.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/gauss.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/gthist.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/gtwhitelist.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/haven_and_hearth.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/hibernate.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/ide.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/ie_main.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/ie_settings.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/ie_version.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/ie_zones.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/iejava.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/imagedev.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/imagefile.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/init_dlls.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/inprocserver.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/installedcomp.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/installer.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/internet_explorer_cu.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/internet_settings_cu.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/itempos.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/javafx.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/javasoft.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/kankan.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/kb950582.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/kbdcrash.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/knowndev.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/landesk.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/landesk_tln.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/lazyshell.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/legacy.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/legacy_tln.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/licenses.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/listsoft.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/liveContactsGUID.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/load.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/logonusername.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/lsa_packages.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/lsasecrets.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/macaddr.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/menuorder.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/mixer.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/mixer_tln.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/mmc.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/mmc_tln.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/mmo.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/mndmru.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/mndmru_tln.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/mountdev.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/mountdev2.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/mountdev2.pl.old mode change 100644 => 100755 thirdparty/rr-full/plugins/mp2.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/mp3.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/mpmru.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/mrt.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/msis.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/mspaper.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/muicache.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/muicache_tln.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/nero.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/netassist.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/netsvcs.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/network.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/networkcards.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/networklist.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/networklist_tln.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/networkuid.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/nic.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/nic2.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/nic_mst2.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/nolmhash.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/ntuser mode change 100644 => 100755 thirdparty/rr-full/plugins/ntusernetwork.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/odysseus.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/officedocs.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/officedocs2010.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/officedocs2010_tln.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/oisc.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/olsearch.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/opencandy.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/osversion.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/osversion_tln.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/outlook.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/outlook2.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/pagefile.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/pending.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/phdet.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/photos.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/polacdms.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/policies_u.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/port_dev.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/prefetch.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/printermru.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/printers.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/privoxy.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/processor_architecture.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/product.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/productpolicy.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/producttype.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/profilelist.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/profiler.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/proxysettings.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/publishingwizard.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/putty.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/rdphint.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/rdpport.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/reading_locations.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/real_profilelist.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/realplayer6.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/realvnc.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/recentdocs.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/recentdocs_tln.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/regback.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/regtime.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/regtime_tln.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/removdev.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/renocide.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/reveton.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/rlo.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/rootkit_revealer.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/routes.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/runmru.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/runmru_tln.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/safeboot.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/sam mode change 100644 => 100755 thirdparty/rr-full/plugins/samparse.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/samparse_tln.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/schedagent.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/secctr.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/secrets.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/secrets_tln.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/security mode change 100644 => 100755 thirdparty/rr-full/plugins/securityproviders.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/services.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/sevenzip.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/sfc.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/shares.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/shc.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/shellbags.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/shellbags_test.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/shellbags_tln.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/shellbags_xp.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/shellexec.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/shellext.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/shellfolders.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/shelloverlay.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/shutdown.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/shutdowncount.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/skype.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/snapshot.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/snapshot_viewer.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/soft_run.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/software mode change 100644 => 100755 thirdparty/rr-full/plugins/spp_clients.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/sql_lastconnect.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/srun_tln.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/ssh_host_keys.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/ssid.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/startmenuinternetapps_cu.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/startmenuinternetapps_lm.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/startpage.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/startup.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/stillimage.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/susclient.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/svc.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/svc_plus.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/svc_tln.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/svcdll.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/svchost.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/sysinternals.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/sysinternals_tln.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/system mode change 100644 => 100755 thirdparty/rr-full/plugins/systemindex.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/termcert.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/termserv.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/timezone.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/tracing.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/tracing_tln.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/trappoll.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/trustrecords.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/trustrecords_tln.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/tsclient.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/tsclient_tln.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/typedpaths.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/typedpaths_tln.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/typedurls.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/typedurls_tln.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/typedurlstime.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/typedurlstime_tln.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/uac.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/uninstall.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/uninstall_tln.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/unreadmail.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/urlzone.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/urun_tln.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/usb.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/usbdevices.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/usbstor.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/usbstor2.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/usbstor3.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/user_run.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/user_win.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/userassist.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/userassist_tln.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/userinfo.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/userlocsvc.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/usrclass mode change 100644 => 100755 thirdparty/rr-full/plugins/vawtrak.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/virut.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/vista_bitbucket.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/vmplayer.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/vmware_vsphere_client.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/vnchooksapplicationprefs.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/vncviewer.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/volinfocache.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/wallpaper.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/warcraft3.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/wbem.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/win_cv.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/winbackup.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/winevt.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/winlogon.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/winlogon_tln.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/winlogon_u.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/winnt_cv.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/winrar.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/winrar_tln.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/winscp.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/winscp_sessions.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/winver.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/winvnc.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/winzip.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/wordwheelquery.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/wpdbusenum.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/xpedition.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/yahoo_cu.pl mode change 100644 => 100755 thirdparty/rr-full/plugins/yahoo_lm.pl mode change 100644 => 100755 thirdparty/rr-full/regripper.pdf mode change 100644 => 100755 thirdparty/rr-full/rip.exe mode change 100644 => 100755 thirdparty/rr-full/rip.pl mode change 100644 => 100755 thirdparty/rr-full/rr.exe mode change 100644 => 100755 thirdparty/rr-full/rr.pl mode change 100644 => 100755 thirdparty/rr/p2x5124.dll mode change 100644 => 100755 thirdparty/rr/plugins/arunmru.pl mode change 100644 => 100755 thirdparty/rr/plugins/autopsycompname.pl mode change 100644 => 100755 thirdparty/rr/plugins/autopsylogin.pl mode change 100644 => 100755 thirdparty/rr/plugins/autopsyntuser mode change 100644 => 100755 thirdparty/rr/plugins/autopsyntusernetwork.pl mode change 100644 => 100755 thirdparty/rr/plugins/autopsyprocarchitecture.pl mode change 100644 => 100755 thirdparty/rr/plugins/autopsyprofilelist.pl mode change 100644 => 100755 thirdparty/rr/plugins/autopsyprofiler.pl mode change 100644 => 100755 thirdparty/rr/plugins/autopsyrecentdocs.pl mode change 100644 => 100755 thirdparty/rr/plugins/autopsyshellfolders.pl mode change 100644 => 100755 thirdparty/rr/plugins/autopsysoftware mode change 100644 => 100755 thirdparty/rr/plugins/autopsysystem mode change 100644 => 100755 thirdparty/rr/plugins/autopsyuninstall.pl mode change 100644 => 100755 thirdparty/rr/plugins/autopsyusb.pl mode change 100644 => 100755 thirdparty/rr/plugins/autopsyusbdevices.pl mode change 100644 => 100755 thirdparty/rr/plugins/autopsywinver.pl mode change 100644 => 100755 thirdparty/rr/plugins/officedocs.pl mode change 100644 => 100755 thirdparty/rr/plugins/officedocs2010.pl mode change 100644 => 100755 thirdparty/rr/rip.exe mode change 100644 => 100755 thirdparty/rr/rip.pl mode change 100644 => 100755 thirdparty/rr/rr.exe mode change 100644 => 100755 thirdparty/rr/rr.pl mode change 100644 => 100755 thirdparty/sevenzip/sevenzipjbinding-AllPlatforms.jar mode change 100644 => 100755 thirdparty/sevenzip/sevenzipjbinding.jar mode change 100644 => 100755 thirdparty/sigar/1.6.4/sigar-native.zip mode change 100644 => 100755 thirdparty/sqlite-jdbc/sqlite-jdbc-3.7.8-SNAPSHOT.jar mode change 100644 => 100755 thirdparty/stix/StixLib.jar mode change 100644 => 100755 thunderbirdparser/build.xml mode change 100644 => 100755 thunderbirdparser/ivy.xml mode change 100644 => 100755 thunderbirdparser/ivysettings.xml mode change 100644 => 100755 thunderbirdparser/manifest.mf mode change 100644 => 100755 thunderbirdparser/nbproject/build-impl.xml mode change 100644 => 100755 thunderbirdparser/nbproject/project.properties mode change 100644 => 100755 thunderbirdparser/nbproject/project.xml mode change 100644 => 100755 thunderbirdparser/nbproject/suite.properties mode change 100644 => 100755 thunderbirdparser/src/org/sleuthkit/autopsy/thunderbirdparser/Bundle.properties mode change 100644 => 100755 thunderbirdparser/src/org/sleuthkit/autopsy/thunderbirdparser/Bundle_ja.properties mode change 100644 => 100755 thunderbirdparser/src/org/sleuthkit/autopsy/thunderbirdparser/ThunderbirdMboxFileIngestModule.java mode change 100644 => 100755 thunderbirdparser/src/org/sleuthkit/autopsy/thunderbirdparser/layer.xml diff --git a/.gitattributes b/.gitattributes old mode 100644 new mode 100755 diff --git a/.gitignore b/.gitignore old mode 100644 new mode 100755 diff --git a/API-CHANGES.txt b/API-CHANGES.txt old mode 100644 new mode 100755 diff --git a/BUILDING.txt b/BUILDING.txt old mode 100644 new mode 100755 diff --git a/BootstrapIvy.xml b/BootstrapIvy.xml old mode 100644 new mode 100755 diff --git a/CentralRepository/Central Repository User Guide.pdf b/CentralRepository/Central Repository User Guide.pdf old mode 100644 new mode 100755 diff --git a/CentralRepository/ivy.xml b/CentralRepository/ivy.xml old mode 100644 new mode 100755 diff --git a/CentralRepository/ivysettings.xml b/CentralRepository/ivysettings.xml old mode 100644 new mode 100755 diff --git a/Core/autopsy-updates.xml b/Core/autopsy-updates.xml old mode 100644 new mode 100755 diff --git a/Core/build.xml b/Core/build.xml old mode 100644 new mode 100755 diff --git a/Core/ivy.xml b/Core/ivy.xml old mode 100644 new mode 100755 diff --git a/Core/ivysettings.xml b/Core/ivysettings.xml old mode 100644 new mode 100755 diff --git a/Core/manifest.mf b/Core/manifest.mf old mode 100644 new mode 100755 diff --git a/Core/nbproject/build-impl.xml b/Core/nbproject/build-impl.xml old mode 100644 new mode 100755 diff --git a/Core/nbproject/platform.properties b/Core/nbproject/platform.properties old mode 100644 new mode 100755 diff --git a/Core/nbproject/project.properties b/Core/nbproject/project.properties old mode 100644 new mode 100755 diff --git a/Core/nbproject/project.xml b/Core/nbproject/project.xml old mode 100644 new mode 100755 diff --git a/Core/nbproject/suite.properties b/Core/nbproject/suite.properties old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/actions/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/actions/Bundle_ja.properties old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/actions/GetTagNameAndCommentDialog.form b/Core/src/org/sleuthkit/autopsy/actions/GetTagNameAndCommentDialog.form old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/actions/GetTagNameAndCommentDialog.java b/Core/src/org/sleuthkit/autopsy/actions/GetTagNameAndCommentDialog.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/actions/GetTagNameDialog.form b/Core/src/org/sleuthkit/autopsy/actions/GetTagNameDialog.form old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/actions/GetTagNameDialog.java b/Core/src/org/sleuthkit/autopsy/actions/GetTagNameDialog.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/actions/IngestRunningCheck.java b/Core/src/org/sleuthkit/autopsy/actions/IngestRunningCheck.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/actions/OpenOutputFolderAction.java b/Core/src/org/sleuthkit/autopsy/actions/OpenOutputFolderAction.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/appservices/AutopsyService.java b/Core/src/org/sleuthkit/autopsy/appservices/AutopsyService.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageAction.java b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageAction.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageErrorsDialog.form b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageErrorsDialog.form old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageErrorsDialog.java b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageErrorsDialog.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageTask.java b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageTask.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardAddingProgressPanel.java b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardAddingProgressPanel.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardAddingProgressVisual.form b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardAddingProgressVisual.form old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardAddingProgressVisual.java b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardAddingProgressVisual.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardDataSourceSettingsPanel.java b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardDataSourceSettingsPanel.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardDataSourceSettingsVisual.form b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardDataSourceSettingsVisual.form old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardDataSourceSettingsVisual.java b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardDataSourceSettingsVisual.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardIngestConfigPanel.java b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardIngestConfigPanel.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardIngestConfigVisual.form b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardIngestConfigVisual.form old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardIngestConfigVisual.java b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardIngestConfigVisual.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardIterator.java b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardIterator.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardSelectDspPanel.java b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardSelectDspPanel.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardSelectDspVisual.form b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardSelectDspVisual.form old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardSelectDspVisual.java b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardSelectDspVisual.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/AddLocalFilesTask.java b/Core/src/org/sleuthkit/autopsy/casemodule/AddLocalFilesTask.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties b/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/casemodule/Bundle_ja.properties old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/ButtonColumn.java b/Core/src/org/sleuthkit/autopsy/casemodule/ButtonColumn.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/Case.java b/Core/src/org/sleuthkit/autopsy/casemodule/Case.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/CaseActionException.java b/Core/src/org/sleuthkit/autopsy/casemodule/CaseActionException.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/CaseCloseAction.java b/Core/src/org/sleuthkit/autopsy/casemodule/CaseCloseAction.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/CaseDeleteAction.java b/Core/src/org/sleuthkit/autopsy/casemodule/CaseDeleteAction.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/CaseMetadata.java b/Core/src/org/sleuthkit/autopsy/casemodule/CaseMetadata.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/CaseNewAction.java b/Core/src/org/sleuthkit/autopsy/casemodule/CaseNewAction.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/CaseNewActionInterface.java b/Core/src/org/sleuthkit/autopsy/casemodule/CaseNewActionInterface.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/CaseOpenAction.java b/Core/src/org/sleuthkit/autopsy/casemodule/CaseOpenAction.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesAction.java b/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesAction.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesPanel.form b/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesPanel.form old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesPanel.java b/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesPanel.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/CollaborationMonitor.java b/Core/src/org/sleuthkit/autopsy/casemodule/CollaborationMonitor.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/CueBannerPanel.form b/Core/src/org/sleuthkit/autopsy/casemodule/CueBannerPanel.form old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/CueBannerPanel.java b/Core/src/org/sleuthkit/autopsy/casemodule/CueBannerPanel.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/GeneralFilter.java b/Core/src/org/sleuthkit/autopsy/casemodule/GeneralFilter.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/ImageDSProcessor.java b/Core/src/org/sleuthkit/autopsy/casemodule/ImageDSProcessor.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/ImageFilePanel.form b/Core/src/org/sleuthkit/autopsy/casemodule/ImageFilePanel.form old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/ImageFilePanel.java b/Core/src/org/sleuthkit/autopsy/casemodule/ImageFilePanel.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/LocalDiskDSProcessor.java b/Core/src/org/sleuthkit/autopsy/casemodule/LocalDiskDSProcessor.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/LocalDiskPanel.form b/Core/src/org/sleuthkit/autopsy/casemodule/LocalDiskPanel.form old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/LocalDiskPanel.java b/Core/src/org/sleuthkit/autopsy/casemodule/LocalDiskPanel.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/LocalFilesDSProcessor.java b/Core/src/org/sleuthkit/autopsy/casemodule/LocalFilesDSProcessor.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/LocalFilesPanel.form b/Core/src/org/sleuthkit/autopsy/casemodule/LocalFilesPanel.form old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/LocalFilesPanel.java b/Core/src/org/sleuthkit/autopsy/casemodule/LocalFilesPanel.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/MissingImageDialog.form b/Core/src/org/sleuthkit/autopsy/casemodule/MissingImageDialog.form old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/MissingImageDialog.java b/Core/src/org/sleuthkit/autopsy/casemodule/MissingImageDialog.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel1.form b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel1.form old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel1.java b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel1.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel2.form b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel2.form old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel2.java b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel2.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardAction.java b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardAction.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardPanel1.java b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardPanel1.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardPanel2.java b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardPanel2.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/OpenRecentCasePanel.form b/Core/src/org/sleuthkit/autopsy/casemodule/OpenRecentCasePanel.form old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/OpenRecentCasePanel.java b/Core/src/org/sleuthkit/autopsy/casemodule/OpenRecentCasePanel.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/RecentCases.java b/Core/src/org/sleuthkit/autopsy/casemodule/RecentCases.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/RecentItems.java b/Core/src/org/sleuthkit/autopsy/casemodule/RecentItems.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/SingleUserCaseConverter.java b/Core/src/org/sleuthkit/autopsy/casemodule/SingleUserCaseConverter.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/StartupWindow.java b/Core/src/org/sleuthkit/autopsy/casemodule/StartupWindow.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/StartupWindowInterface.java b/Core/src/org/sleuthkit/autopsy/casemodule/StartupWindowInterface.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/StartupWindowProvider.java b/Core/src/org/sleuthkit/autopsy/casemodule/StartupWindowProvider.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/UpdateRecentCases.java b/Core/src/org/sleuthkit/autopsy/casemodule/UpdateRecentCases.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/addImage-icon.png b/Core/src/org/sleuthkit/autopsy/casemodule/addImage-icon.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/btn_icon_add_image.png b/Core/src/org/sleuthkit/autopsy/casemodule/btn_icon_add_image.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/btn_icon_close_case.png b/Core/src/org/sleuthkit/autopsy/casemodule/btn_icon_close_case.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/btn_icon_create_new_case.png b/Core/src/org/sleuthkit/autopsy/casemodule/btn_icon_create_new_case.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/btn_icon_open_existing.png b/Core/src/org/sleuthkit/autopsy/casemodule/btn_icon_open_existing.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/btn_icon_open_recent.png b/Core/src/org/sleuthkit/autopsy/casemodule/btn_icon_open_recent.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/close-icon.png b/Core/src/org/sleuthkit/autopsy/casemodule/close-icon.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/events/AddingDataSourceEvent.java b/Core/src/org/sleuthkit/autopsy/casemodule/events/AddingDataSourceEvent.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/events/AddingDataSourceFailedEvent.java b/Core/src/org/sleuthkit/autopsy/casemodule/events/AddingDataSourceFailedEvent.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/events/BlackBoardArtifactTagAddedEvent.java b/Core/src/org/sleuthkit/autopsy/casemodule/events/BlackBoardArtifactTagAddedEvent.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/events/BlackBoardArtifactTagDeletedEvent.java b/Core/src/org/sleuthkit/autopsy/casemodule/events/BlackBoardArtifactTagDeletedEvent.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/events/ContentTagAddedEvent.java b/Core/src/org/sleuthkit/autopsy/casemodule/events/ContentTagAddedEvent.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/events/ContentTagDeletedEvent.java b/Core/src/org/sleuthkit/autopsy/casemodule/events/ContentTagDeletedEvent.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/events/DataSourceAddedEvent.java b/Core/src/org/sleuthkit/autopsy/casemodule/events/DataSourceAddedEvent.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/events/ReportAddedEvent.java b/Core/src/org/sleuthkit/autopsy/casemodule/events/ReportAddedEvent.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/events/TagAddedEvent.java b/Core/src/org/sleuthkit/autopsy/casemodule/events/TagAddedEvent.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/events/TagDeletedEvent.java b/Core/src/org/sleuthkit/autopsy/casemodule/events/TagDeletedEvent.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/package.dox b/Core/src/org/sleuthkit/autopsy/casemodule/package.dox old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/services/Blackboard.java b/Core/src/org/sleuthkit/autopsy/casemodule/services/Blackboard.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/services/Bundle.properties b/Core/src/org/sleuthkit/autopsy/casemodule/services/Bundle.properties old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/services/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/casemodule/services/Bundle_ja.properties old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/services/FileManager.java b/Core/src/org/sleuthkit/autopsy/casemodule/services/FileManager.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/services/TagNameDefiniton.java b/Core/src/org/sleuthkit/autopsy/casemodule/services/TagNameDefiniton.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/welcome_logo.png b/Core/src/org/sleuthkit/autopsy/casemodule/welcome_logo.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/Bundle.properties b/Core/src/org/sleuthkit/autopsy/centralrepository/Bundle.properties old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/README-POSTGRES-TESTING.md b/Core/src/org/sleuthkit/autopsy/centralrepository/README-POSTGRES-TESTING.md old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/README_MONGODB_TESTING.md b/Core/src/org/sleuthkit/autopsy/centralrepository/README_MONGODB_TESTING.md old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/actions/Bundle.properties b/Core/src/org/sleuthkit/autopsy/centralrepository/actions/Bundle.properties old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/actions/EamCaseEditDetailsDialog.form b/Core/src/org/sleuthkit/autopsy/centralrepository/actions/EamCaseEditDetailsDialog.form old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/actions/EamCaseEditDetailsDialog.java b/Core/src/org/sleuthkit/autopsy/centralrepository/actions/EamCaseEditDetailsDialog.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/actions/EamEditCaseInfoAction.java b/Core/src/org/sleuthkit/autopsy/centralrepository/actions/EamEditCaseInfoAction.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/contentviewer/Bundle.properties b/Core/src/org/sleuthkit/autopsy/centralrepository/contentviewer/Bundle.properties old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/contentviewer/DataContentViewerOtherCases.form b/Core/src/org/sleuthkit/autopsy/centralrepository/contentviewer/DataContentViewerOtherCases.form old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/contentviewer/DataContentViewerOtherCases.java b/Core/src/org/sleuthkit/autopsy/centralrepository/contentviewer/DataContentViewerOtherCases.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/contentviewer/DataContentViewerOtherCasesTableCellRenderer.java b/Core/src/org/sleuthkit/autopsy/centralrepository/contentviewer/DataContentViewerOtherCasesTableCellRenderer.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/contentviewer/DataContentViewerOtherCasesTableModel.java b/Core/src/org/sleuthkit/autopsy/centralrepository/contentviewer/DataContentViewerOtherCasesTableModel.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/AbstractSqlEamDb.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/AbstractSqlEamDb.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamArtifact.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamArtifact.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamArtifactInstance.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamArtifactInstance.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamArtifactUtil.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamArtifactUtil.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamCase.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamCase.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamDataSource.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamDataSource.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamDb.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamDb.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamDbException.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamDbException.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamDbPlatformEnum.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamDbPlatformEnum.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamDbUtil.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamDbUtil.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamGlobalFileInstance.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamGlobalFileInstance.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamGlobalSet.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamGlobalSet.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamOrganization.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamOrganization.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/PostgresEamDb.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/PostgresEamDb.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/PostgresEamDbSettings.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/PostgresEamDbSettings.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/SqliteEamDb.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/SqliteEamDb.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/SqliteEamDbSettings.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/SqliteEamDbSettings.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/BadFileTagRunner.java b/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/BadFileTagRunner.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/CaseEventListener.java b/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/CaseEventListener.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/IngestEventsListener.java b/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/IngestEventsListener.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/Installer.java b/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/Installer.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/NewArtifactsRunner.java b/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/NewArtifactsRunner.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/images/bad.png b/Core/src/org/sleuthkit/autopsy/centralrepository/images/bad.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/images/good.png b/Core/src/org/sleuthkit/autopsy/centralrepository/images/good.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/images/import16.png b/Core/src/org/sleuthkit/autopsy/centralrepository/images/import16.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/images/options-icon.png b/Core/src/org/sleuthkit/autopsy/centralrepository/images/options-icon.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/ingestmodule/IngestModule.java b/Core/src/org/sleuthkit/autopsy/centralrepository/ingestmodule/IngestModule.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/ingestmodule/IngestModuleFactory.java b/Core/src/org/sleuthkit/autopsy/centralrepository/ingestmodule/IngestModuleFactory.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/license-centralrepository.txt b/Core/src/org/sleuthkit/autopsy/centralrepository/license-centralrepository.txt old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/AddNewOrganizationDialog.form b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/AddNewOrganizationDialog.form old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/AddNewOrganizationDialog.java b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/AddNewOrganizationDialog.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/Bundle.properties b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/Bundle.properties old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/EamDbSettingsDialog.form b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/EamDbSettingsDialog.form old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/EamDbSettingsDialog.java b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/EamDbSettingsDialog.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/EamOptionsPanelController.java b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/EamOptionsPanelController.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/GlobalSettingsPanel.form b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/GlobalSettingsPanel.form old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/GlobalSettingsPanel.java b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/GlobalSettingsPanel.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ImportHashDatabaseDialog.form b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ImportHashDatabaseDialog.form old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ImportHashDatabaseDialog.java b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ImportHashDatabaseDialog.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ManageCorrelationPropertiesDialog.form b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ManageCorrelationPropertiesDialog.form old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ManageCorrelationPropertiesDialog.java b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ManageCorrelationPropertiesDialog.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ManageTagsDialog.form b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ManageTagsDialog.form old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ManageTagsDialog.java b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ManageTagsDialog.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/contentviewers/Bundle.properties b/Core/src/org/sleuthkit/autopsy/contentviewers/Bundle.properties old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/contentviewers/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/contentviewers/Bundle_ja.properties old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/coordinationservice/CoordinationService.java b/Core/src/org/sleuthkit/autopsy/coordinationservice/CoordinationService.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/coordinationservice/CoordinationServiceNamespace.java b/Core/src/org/sleuthkit/autopsy/coordinationservice/CoordinationServiceNamespace.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/core/Bundle.properties b/Core/src/org/sleuthkit/autopsy/core/Bundle.properties old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/core/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/core/Bundle_ja.properties old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/core/DataContentTopComponentSettings.xml b/Core/src/org/sleuthkit/autopsy/core/DataContentTopComponentSettings.xml old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/core/DataContentTopComponentWstcref.xml b/Core/src/org/sleuthkit/autopsy/core/DataContentTopComponentWstcref.xml old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/core/DirectoryTreeTopComponentSettings.xml b/Core/src/org/sleuthkit/autopsy/core/DirectoryTreeTopComponentSettings.xml old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/core/DirectoryTreeTopComponentWstcref.xml b/Core/src/org/sleuthkit/autopsy/core/DirectoryTreeTopComponentWstcref.xml old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/core/FileSearchTopComponentSettings.xml b/Core/src/org/sleuthkit/autopsy/core/FileSearchTopComponentSettings.xml old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/core/FileSearchTopComponentWstcref.xml b/Core/src/org/sleuthkit/autopsy/core/FileSearchTopComponentWstcref.xml old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/core/IngestMessageTopComponentSettings.xml b/Core/src/org/sleuthkit/autopsy/core/IngestMessageTopComponentSettings.xml old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/core/IngestMessageTopComponentWstcref.xml b/Core/src/org/sleuthkit/autopsy/core/IngestMessageTopComponentWstcref.xml old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/core/Installer.java b/Core/src/org/sleuthkit/autopsy/core/Installer.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/core/RuntimeProperties.java b/Core/src/org/sleuthkit/autopsy/core/RuntimeProperties.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/core/ServicesMonitor.java b/Core/src/org/sleuthkit/autopsy/core/ServicesMonitor.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/core/UserPreferencesException.java b/Core/src/org/sleuthkit/autopsy/core/UserPreferencesException.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/core/dockedBottomWsmode.xml b/Core/src/org/sleuthkit/autopsy/core/dockedBottomWsmode.xml old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/core/events/ServiceEvent.java b/Core/src/org/sleuthkit/autopsy/core/events/ServiceEvent.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/core/explorerWsmode.xml b/Core/src/org/sleuthkit/autopsy/core/explorerWsmode.xml old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/core/floatingLeftBottomWsmode.xml b/Core/src/org/sleuthkit/autopsy/core/floatingLeftBottomWsmode.xml old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/core/layer.xml b/Core/src/org/sleuthkit/autopsy/core/layer.xml old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/core/org_sleuthkit_autopsy_core_update_centerSettings.xml b/Core/src/org/sleuthkit/autopsy/core/org_sleuthkit_autopsy_core_update_centerSettings.xml old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/core/outputFloatWsmode.xml b/Core/src/org/sleuthkit/autopsy/core/outputFloatWsmode.xml old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/corecomponentinterfaces/BlackboardResultViewer.java b/Core/src/org/sleuthkit/autopsy/corecomponentinterfaces/BlackboardResultViewer.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/corecomponentinterfaces/Bundle.properties b/Core/src/org/sleuthkit/autopsy/corecomponentinterfaces/Bundle.properties old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/corecomponentinterfaces/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/corecomponentinterfaces/Bundle_ja.properties old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/corecomponentinterfaces/CoreComponentControl.java b/Core/src/org/sleuthkit/autopsy/corecomponentinterfaces/CoreComponentControl.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/corecomponentinterfaces/DataContent.java b/Core/src/org/sleuthkit/autopsy/corecomponentinterfaces/DataContent.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/corecomponentinterfaces/DataContentViewer.java b/Core/src/org/sleuthkit/autopsy/corecomponentinterfaces/DataContentViewer.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/corecomponentinterfaces/DataExplorer.java b/Core/src/org/sleuthkit/autopsy/corecomponentinterfaces/DataExplorer.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/corecomponentinterfaces/DataResult.java b/Core/src/org/sleuthkit/autopsy/corecomponentinterfaces/DataResult.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/corecomponentinterfaces/DataResultViewer.java b/Core/src/org/sleuthkit/autopsy/corecomponentinterfaces/DataResultViewer.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/corecomponentinterfaces/DataSourceProcessor.java b/Core/src/org/sleuthkit/autopsy/corecomponentinterfaces/DataSourceProcessor.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/corecomponentinterfaces/DataSourceProcessorCallback.java b/Core/src/org/sleuthkit/autopsy/corecomponentinterfaces/DataSourceProcessorCallback.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/corecomponentinterfaces/DataSourceProcessorProgressMonitor.java b/Core/src/org/sleuthkit/autopsy/corecomponentinterfaces/DataSourceProcessorProgressMonitor.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/corecomponentinterfaces/package.dox b/Core/src/org/sleuthkit/autopsy/corecomponentinterfaces/package.dox old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/AboutWindowAction.java b/Core/src/org/sleuthkit/autopsy/corecomponents/AboutWindowAction.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/AboutWindowPanel.form b/Core/src/org/sleuthkit/autopsy/corecomponents/AboutWindowPanel.form old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/AboutWindowPanel.java b/Core/src/org/sleuthkit/autopsy/corecomponents/AboutWindowPanel.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/AbstractDataResultViewer.java b/Core/src/org/sleuthkit/autopsy/corecomponents/AbstractDataResultViewer.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/AdvancedConfigurationCleanDialog.form b/Core/src/org/sleuthkit/autopsy/corecomponents/AdvancedConfigurationCleanDialog.form old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/AdvancedConfigurationCleanDialog.java b/Core/src/org/sleuthkit/autopsy/corecomponents/AdvancedConfigurationCleanDialog.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/AdvancedConfigurationDialog.form b/Core/src/org/sleuthkit/autopsy/corecomponents/AdvancedConfigurationDialog.form old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/AdvancedConfigurationDialog.java b/Core/src/org/sleuthkit/autopsy/corecomponents/AdvancedConfigurationDialog.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/AutopsyOptionsPanel.form b/Core/src/org/sleuthkit/autopsy/corecomponents/AutopsyOptionsPanel.form old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/AutopsyOptionsPanel.java b/Core/src/org/sleuthkit/autopsy/corecomponents/AutopsyOptionsPanel.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/AutopsyOptionsPanelController.java b/Core/src/org/sleuthkit/autopsy/corecomponents/AutopsyOptionsPanelController.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/Bundle.properties b/Core/src/org/sleuthkit/autopsy/corecomponents/Bundle.properties old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/CriterionChooser.form b/Core/src/org/sleuthkit/autopsy/corecomponents/CriterionChooser.form old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/CriterionChooser.java b/Core/src/org/sleuthkit/autopsy/corecomponents/CriterionChooser.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/DataContentPanel.form b/Core/src/org/sleuthkit/autopsy/corecomponents/DataContentPanel.form old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/DataContentPanel.java b/Core/src/org/sleuthkit/autopsy/corecomponents/DataContentPanel.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/DataContentTopComponent.form b/Core/src/org/sleuthkit/autopsy/corecomponents/DataContentTopComponent.form old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/DataContentTopComponent.java b/Core/src/org/sleuthkit/autopsy/corecomponents/DataContentTopComponent.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/DataContentViewerArtifact.form b/Core/src/org/sleuthkit/autopsy/corecomponents/DataContentViewerArtifact.form old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/DataContentViewerArtifact.java b/Core/src/org/sleuthkit/autopsy/corecomponents/DataContentViewerArtifact.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/DataContentViewerHex.form b/Core/src/org/sleuthkit/autopsy/corecomponents/DataContentViewerHex.form old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/DataContentViewerHex.java b/Core/src/org/sleuthkit/autopsy/corecomponents/DataContentViewerHex.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/DataContentViewerMedia.form b/Core/src/org/sleuthkit/autopsy/corecomponents/DataContentViewerMedia.form old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/DataContentViewerMedia.java b/Core/src/org/sleuthkit/autopsy/corecomponents/DataContentViewerMedia.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/DataContentViewerString.form b/Core/src/org/sleuthkit/autopsy/corecomponents/DataContentViewerString.form old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/DataContentViewerString.java b/Core/src/org/sleuthkit/autopsy/corecomponents/DataContentViewerString.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/DataResultPanel.form b/Core/src/org/sleuthkit/autopsy/corecomponents/DataResultPanel.form old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/DataResultPanel.java b/Core/src/org/sleuthkit/autopsy/corecomponents/DataResultPanel.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/DataResultTopComponent.form b/Core/src/org/sleuthkit/autopsy/corecomponents/DataResultTopComponent.form old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/DataResultTopComponent.java b/Core/src/org/sleuthkit/autopsy/corecomponents/DataResultTopComponent.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/DataResultViewerTable.form b/Core/src/org/sleuthkit/autopsy/corecomponents/DataResultViewerTable.form old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/DataResultViewerTable.java b/Core/src/org/sleuthkit/autopsy/corecomponents/DataResultViewerTable.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/DataResultViewerThumbnail.form b/Core/src/org/sleuthkit/autopsy/corecomponents/DataResultViewerThumbnail.form old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/DataResultViewerThumbnail.java b/Core/src/org/sleuthkit/autopsy/corecomponents/DataResultViewerThumbnail.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/FXVideoPanel.form b/Core/src/org/sleuthkit/autopsy/corecomponents/FXVideoPanel.form old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/FXVideoPanel.java b/Core/src/org/sleuthkit/autopsy/corecomponents/FXVideoPanel.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/FrameCapture.java b/Core/src/org/sleuthkit/autopsy/corecomponents/FrameCapture.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/GstVideoPanel.form b/Core/src/org/sleuthkit/autopsy/corecomponents/GstVideoPanel.form old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/GstVideoPanel.java b/Core/src/org/sleuthkit/autopsy/corecomponents/GstVideoPanel.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/Installer.java b/Core/src/org/sleuthkit/autopsy/corecomponents/Installer.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/MediaViewImagePanel.css b/Core/src/org/sleuthkit/autopsy/corecomponents/MediaViewImagePanel.css old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/MediaViewImagePanel.form b/Core/src/org/sleuthkit/autopsy/corecomponents/MediaViewImagePanel.form old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/MediaViewImagePanel.java b/Core/src/org/sleuthkit/autopsy/corecomponents/MediaViewImagePanel.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/MediaViewVideoPanel.java b/Core/src/org/sleuthkit/autopsy/corecomponents/MediaViewVideoPanel.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/MultiUserSettingsPanel.form b/Core/src/org/sleuthkit/autopsy/corecomponents/MultiUserSettingsPanel.form old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/MultiUserSettingsPanel.java b/Core/src/org/sleuthkit/autopsy/corecomponents/MultiUserSettingsPanel.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/MultiUserSettingsPanelController.java b/Core/src/org/sleuthkit/autopsy/corecomponents/MultiUserSettingsPanelController.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/NoTabsTabDisplayerUI.java b/Core/src/org/sleuthkit/autopsy/corecomponents/NoTabsTabDisplayerUI.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/OfflineHelpAction.java b/Core/src/org/sleuthkit/autopsy/corecomponents/OfflineHelpAction.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/OnlineHelpAction.java b/Core/src/org/sleuthkit/autopsy/corecomponents/OnlineHelpAction.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/OptionsPanel.java b/Core/src/org/sleuthkit/autopsy/corecomponents/OptionsPanel.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/ResultViewerPersistence.java b/Core/src/org/sleuthkit/autopsy/corecomponents/ResultViewerPersistence.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/SortChooser.form b/Core/src/org/sleuthkit/autopsy/corecomponents/SortChooser.form old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/SortChooser.java b/Core/src/org/sleuthkit/autopsy/corecomponents/SortChooser.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/TableFilterChildren.java b/Core/src/org/sleuthkit/autopsy/corecomponents/TableFilterChildren.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/TableFilterNode.java b/Core/src/org/sleuthkit/autopsy/corecomponents/TableFilterNode.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/TextPrompt.java b/Core/src/org/sleuthkit/autopsy/corecomponents/TextPrompt.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/ThumbnailViewChildren.java b/Core/src/org/sleuthkit/autopsy/corecomponents/ThumbnailViewChildren.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/VideoFrame.java b/Core/src/org/sleuthkit/autopsy/corecomponents/VideoFrame.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/arrow_left.gif b/Core/src/org/sleuthkit/autopsy/corecomponents/arrow_left.gif old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/arrow_right.gif b/Core/src/org/sleuthkit/autopsy/corecomponents/arrow_right.gif old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/btn_step_back.png b/Core/src/org/sleuthkit/autopsy/corecomponents/btn_step_back.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/btn_step_back_disabled.png b/Core/src/org/sleuthkit/autopsy/corecomponents/btn_step_back_disabled.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/btn_step_back_hover.png b/Core/src/org/sleuthkit/autopsy/corecomponents/btn_step_back_hover.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/btn_step_forward.png b/Core/src/org/sleuthkit/autopsy/corecomponents/btn_step_forward.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/btn_step_forward_disabled.png b/Core/src/org/sleuthkit/autopsy/corecomponents/btn_step_forward_disabled.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/btn_step_forward_hover.png b/Core/src/org/sleuthkit/autopsy/corecomponents/btn_step_forward_hover.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/checkbox24.png b/Core/src/org/sleuthkit/autopsy/corecomponents/checkbox24.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/checkbox32.png b/Core/src/org/sleuthkit/autopsy/corecomponents/checkbox32.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/general-options.png b/Core/src/org/sleuthkit/autopsy/corecomponents/general-options.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/package.dox b/Core/src/org/sleuthkit/autopsy/corecomponents/package.dox old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/coreutils/AutopsyExceptionHandler.java b/Core/src/org/sleuthkit/autopsy/coreutils/AutopsyExceptionHandler.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/coreutils/Bundle.properties b/Core/src/org/sleuthkit/autopsy/coreutils/Bundle.properties old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/coreutils/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/coreutils/Bundle_ja.properties old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/coreutils/ColorUtilities.java b/Core/src/org/sleuthkit/autopsy/coreutils/ColorUtilities.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/coreutils/DataSourceUtils.java b/Core/src/org/sleuthkit/autopsy/coreutils/DataSourceUtils.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/coreutils/DriveUtils.java b/Core/src/org/sleuthkit/autopsy/coreutils/DriveUtils.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/coreutils/EscapeUtil.java b/Core/src/org/sleuthkit/autopsy/coreutils/EscapeUtil.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/coreutils/ExecUtil.java b/Core/src/org/sleuthkit/autopsy/coreutils/ExecUtil.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/coreutils/FileUtil.java b/Core/src/org/sleuthkit/autopsy/coreutils/FileUtil.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/coreutils/History.java b/Core/src/org/sleuthkit/autopsy/coreutils/History.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/coreutils/Installer.java b/Core/src/org/sleuthkit/autopsy/coreutils/Installer.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/coreutils/JLNK.java b/Core/src/org/sleuthkit/autopsy/coreutils/JLNK.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/coreutils/JLnkParser.java b/Core/src/org/sleuthkit/autopsy/coreutils/JLnkParser.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/coreutils/LnkEnums.java b/Core/src/org/sleuthkit/autopsy/coreutils/LnkEnums.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/coreutils/LocalDisk.java b/Core/src/org/sleuthkit/autopsy/coreutils/LocalDisk.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/coreutils/LogIcon.png b/Core/src/org/sleuthkit/autopsy/coreutils/LogIcon.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/coreutils/LoggedTask.java b/Core/src/org/sleuthkit/autopsy/coreutils/LoggedTask.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/coreutils/Logger.java b/Core/src/org/sleuthkit/autopsy/coreutils/Logger.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/coreutils/MessageNotifyUtil.java b/Core/src/org/sleuthkit/autopsy/coreutils/MessageNotifyUtil.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/coreutils/ModuleSettings.java b/Core/src/org/sleuthkit/autopsy/coreutils/ModuleSettings.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/coreutils/NetworkUtils.java b/Core/src/org/sleuthkit/autopsy/coreutils/NetworkUtils.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/coreutils/PathValidator.java b/Core/src/org/sleuthkit/autopsy/coreutils/PathValidator.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/coreutils/PlatformUtil.java b/Core/src/org/sleuthkit/autopsy/coreutils/PlatformUtil.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/coreutils/SQLiteDBConnect.java b/Core/src/org/sleuthkit/autopsy/coreutils/SQLiteDBConnect.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/coreutils/StopWatch.java b/Core/src/org/sleuthkit/autopsy/coreutils/StopWatch.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/coreutils/StringExtract.java b/Core/src/org/sleuthkit/autopsy/coreutils/StringExtract.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/coreutils/StringExtract.properties b/Core/src/org/sleuthkit/autopsy/coreutils/StringExtract.properties old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/coreutils/TestLogger.java b/Core/src/org/sleuthkit/autopsy/coreutils/TestLogger.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/coreutils/TextConverter.java b/Core/src/org/sleuthkit/autopsy/coreutils/TextConverter.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/coreutils/TextConverterException.java b/Core/src/org/sleuthkit/autopsy/coreutils/TextConverterException.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/coreutils/TextUtil.java b/Core/src/org/sleuthkit/autopsy/coreutils/TextUtil.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/coreutils/ThreadConfined.java b/Core/src/org/sleuthkit/autopsy/coreutils/ThreadConfined.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/coreutils/TimeZoneUtils.java b/Core/src/org/sleuthkit/autopsy/coreutils/TimeZoneUtils.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/coreutils/UNCPathUtilities.java b/Core/src/org/sleuthkit/autopsy/coreutils/UNCPathUtilities.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/coreutils/Version.java b/Core/src/org/sleuthkit/autopsy/coreutils/Version.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/coreutils/VideoUtils.java b/Core/src/org/sleuthkit/autopsy/coreutils/VideoUtils.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/coreutils/Win32Process.java b/Core/src/org/sleuthkit/autopsy/coreutils/Win32Process.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/coreutils/XMLUtil.java b/Core/src/org/sleuthkit/autopsy/coreutils/XMLUtil.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/AbstractAbstractFileNode.java b/Core/src/org/sleuthkit/autopsy/datamodel/AbstractAbstractFileNode.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/AbstractContentChildren.java b/Core/src/org/sleuthkit/autopsy/datamodel/AbstractContentChildren.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/AbstractContentNode.java b/Core/src/org/sleuthkit/autopsy/datamodel/AbstractContentNode.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/AbstractFsContentNode.java b/Core/src/org/sleuthkit/autopsy/datamodel/AbstractFsContentNode.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/ArtifactStringContent.java b/Core/src/org/sleuthkit/autopsy/datamodel/ArtifactStringContent.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/AutopsyItemVisitor.java b/Core/src/org/sleuthkit/autopsy/datamodel/AutopsyItemVisitor.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/AutopsyVisitableItem.java b/Core/src/org/sleuthkit/autopsy/datamodel/AutopsyVisitableItem.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/BlackboardArtifactNode.java b/Core/src/org/sleuthkit/autopsy/datamodel/BlackboardArtifactNode.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/Bundle.properties b/Core/src/org/sleuthkit/autopsy/datamodel/Bundle.properties old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/datamodel/Bundle_ja.properties old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/ContentChildren.java b/Core/src/org/sleuthkit/autopsy/datamodel/ContentChildren.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/ContentNode.java b/Core/src/org/sleuthkit/autopsy/datamodel/ContentNode.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/ContentNodeVisitor.java b/Core/src/org/sleuthkit/autopsy/datamodel/ContentNodeVisitor.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/ContentUtils.java b/Core/src/org/sleuthkit/autopsy/datamodel/ContentUtils.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/CreditCards.java b/Core/src/org/sleuthkit/autopsy/datamodel/CreditCards.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/DataConversion.java b/Core/src/org/sleuthkit/autopsy/datamodel/DataConversion.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/DataModelActionsFactory.java b/Core/src/org/sleuthkit/autopsy/datamodel/DataModelActionsFactory.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/DataSources.java b/Core/src/org/sleuthkit/autopsy/datamodel/DataSources.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/DataSourcesNode.java b/Core/src/org/sleuthkit/autopsy/datamodel/DataSourcesNode.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/DeletedContent.java b/Core/src/org/sleuthkit/autopsy/datamodel/DeletedContent.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/DisplayableItemNode.java b/Core/src/org/sleuthkit/autopsy/datamodel/DisplayableItemNode.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/DisplayableItemNodeVisitor.java b/Core/src/org/sleuthkit/autopsy/datamodel/DisplayableItemNodeVisitor.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/EmailExtracted.java b/Core/src/org/sleuthkit/autopsy/datamodel/EmailExtracted.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/EmptyNode.java b/Core/src/org/sleuthkit/autopsy/datamodel/EmptyNode.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/ExtractedContent.java b/Core/src/org/sleuthkit/autopsy/datamodel/ExtractedContent.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/FileSize.java b/Core/src/org/sleuthkit/autopsy/datamodel/FileSize.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/FileTypeExtensions.java b/Core/src/org/sleuthkit/autopsy/datamodel/FileTypeExtensions.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/FileTypes.java b/Core/src/org/sleuthkit/autopsy/datamodel/FileTypes.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/FileTypesByExtension.java b/Core/src/org/sleuthkit/autopsy/datamodel/FileTypesByExtension.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/FileTypesByMimeType.java b/Core/src/org/sleuthkit/autopsy/datamodel/FileTypesByMimeType.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/FilterNodeLeaf.java b/Core/src/org/sleuthkit/autopsy/datamodel/FilterNodeLeaf.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/HashsetHits.java b/Core/src/org/sleuthkit/autopsy/datamodel/HashsetHits.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/ImageNode.java b/Core/src/org/sleuthkit/autopsy/datamodel/ImageNode.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/Installer.java b/Core/src/org/sleuthkit/autopsy/datamodel/Installer.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/InterestingHits.java b/Core/src/org/sleuthkit/autopsy/datamodel/InterestingHits.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/KeyValue.java b/Core/src/org/sleuthkit/autopsy/datamodel/KeyValue.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/KeyValueNode.java b/Core/src/org/sleuthkit/autopsy/datamodel/KeyValueNode.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/KeywordHits.java b/Core/src/org/sleuthkit/autopsy/datamodel/KeywordHits.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/LayoutFileNode.java b/Core/src/org/sleuthkit/autopsy/datamodel/LayoutFileNode.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/LocalDirectoryNode.java b/Core/src/org/sleuthkit/autopsy/datamodel/LocalDirectoryNode.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/LocalFileNode.java b/Core/src/org/sleuthkit/autopsy/datamodel/LocalFileNode.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/NodeProperty.java b/Core/src/org/sleuthkit/autopsy/datamodel/NodeProperty.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/RecentFiles.java b/Core/src/org/sleuthkit/autopsy/datamodel/RecentFiles.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/RecentFilesChildren.java b/Core/src/org/sleuthkit/autopsy/datamodel/RecentFilesChildren.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/RecentFilesFilterChildren.java b/Core/src/org/sleuthkit/autopsy/datamodel/RecentFilesFilterChildren.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/RecentFilesFilterNode.java b/Core/src/org/sleuthkit/autopsy/datamodel/RecentFilesFilterNode.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/RecentFilesNode.java b/Core/src/org/sleuthkit/autopsy/datamodel/RecentFilesNode.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/Results.java b/Core/src/org/sleuthkit/autopsy/datamodel/Results.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/ResultsNode.java b/Core/src/org/sleuthkit/autopsy/datamodel/ResultsNode.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/RootContentChildren.java b/Core/src/org/sleuthkit/autopsy/datamodel/RootContentChildren.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/SlackFileNode.java b/Core/src/org/sleuthkit/autopsy/datamodel/SlackFileNode.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/SpecialDirectoryNode.java b/Core/src/org/sleuthkit/autopsy/datamodel/SpecialDirectoryNode.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/StringContent.java b/Core/src/org/sleuthkit/autopsy/datamodel/StringContent.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/ViewTaggedArtifactAction.java b/Core/src/org/sleuthkit/autopsy/datamodel/ViewTaggedArtifactAction.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/Views.java b/Core/src/org/sleuthkit/autopsy/datamodel/Views.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/ViewsNode.java b/Core/src/org/sleuthkit/autopsy/datamodel/ViewsNode.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/VirtualDirectoryNode.java b/Core/src/org/sleuthkit/autopsy/datamodel/VirtualDirectoryNode.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/VolumeNode.java b/Core/src/org/sleuthkit/autopsy/datamodel/VolumeNode.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/accounts/Accounts.java b/Core/src/org/sleuthkit/autopsy/datamodel/accounts/Accounts.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/accounts/BINRange.java b/Core/src/org/sleuthkit/autopsy/datamodel/accounts/BINRange.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/package.dox b/Core/src/org/sleuthkit/autopsy/datamodel/package.dox old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/datasourceprocessors/AddRawImageTask.java b/Core/src/org/sleuthkit/autopsy/datasourceprocessors/AddRawImageTask.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/datasourceprocessors/AutoIngestDataSourceProcessor.java b/Core/src/org/sleuthkit/autopsy/datasourceprocessors/AutoIngestDataSourceProcessor.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/datasourceprocessors/RawDSProcessor.java b/Core/src/org/sleuthkit/autopsy/datasourceprocessors/RawDSProcessor.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/diagnostics/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/diagnostics/Bundle_ja.properties old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/Bundle.properties b/Core/src/org/sleuthkit/autopsy/directorytree/Bundle.properties old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/directorytree/Bundle_ja.properties old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/ChangeViewAction.java b/Core/src/org/sleuthkit/autopsy/directorytree/ChangeViewAction.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/CollapseAction.java b/Core/src/org/sleuthkit/autopsy/directorytree/CollapseAction.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeFilterChildren.java b/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeFilterChildren.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeTopComponent.form b/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeTopComponent.form old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeTopComponent.java b/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeTopComponent.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/ExternalViewerAction.java b/Core/src/org/sleuthkit/autopsy/directorytree/ExternalViewerAction.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/ExtractAction.java b/Core/src/org/sleuthkit/autopsy/directorytree/ExtractAction.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/ExtractUnallocAction.java b/Core/src/org/sleuthkit/autopsy/directorytree/ExtractUnallocAction.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/FileSearchAction.java b/Core/src/org/sleuthkit/autopsy/directorytree/FileSearchAction.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/FileSearchProvider.java b/Core/src/org/sleuthkit/autopsy/directorytree/FileSearchProvider.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/FileSystemDetailsPanel.form b/Core/src/org/sleuthkit/autopsy/directorytree/FileSystemDetailsPanel.form old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/FileSystemDetailsPanel.java b/Core/src/org/sleuthkit/autopsy/directorytree/FileSystemDetailsPanel.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/HashSearchAction.java b/Core/src/org/sleuthkit/autopsy/directorytree/HashSearchAction.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/HashSearchProvider.java b/Core/src/org/sleuthkit/autopsy/directorytree/HashSearchProvider.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/ImageDetailsPanel.form b/Core/src/org/sleuthkit/autopsy/directorytree/ImageDetailsPanel.form old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/ImageDetailsPanel.java b/Core/src/org/sleuthkit/autopsy/directorytree/ImageDetailsPanel.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/NewWindowViewAction.java b/Core/src/org/sleuthkit/autopsy/directorytree/NewWindowViewAction.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/SelectionContext.java b/Core/src/org/sleuthkit/autopsy/directorytree/SelectionContext.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/ViewAssociatedContentAction.java b/Core/src/org/sleuthkit/autopsy/directorytree/ViewAssociatedContentAction.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/ViewContextAction.java b/Core/src/org/sleuthkit/autopsy/directorytree/ViewContextAction.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/ViewSourceArtifactAction.java b/Core/src/org/sleuthkit/autopsy/directorytree/ViewSourceArtifactAction.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/VolumeDetailsPanel.form b/Core/src/org/sleuthkit/autopsy/directorytree/VolumeDetailsPanel.form old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/VolumeDetailsPanel.java b/Core/src/org/sleuthkit/autopsy/directorytree/VolumeDetailsPanel.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/arrow_left.gif b/Core/src/org/sleuthkit/autopsy/directorytree/arrow_left.gif old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/arrow_right.gif b/Core/src/org/sleuthkit/autopsy/directorytree/arrow_right.gif old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/back-button.png b/Core/src/org/sleuthkit/autopsy/directorytree/back-button.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/btn_step_back.png b/Core/src/org/sleuthkit/autopsy/directorytree/btn_step_back.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/btn_step_back_disabled.png b/Core/src/org/sleuthkit/autopsy/directorytree/btn_step_back_disabled.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/btn_step_back_hover.png b/Core/src/org/sleuthkit/autopsy/directorytree/btn_step_back_hover.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/btn_step_forward.png b/Core/src/org/sleuthkit/autopsy/directorytree/btn_step_forward.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/btn_step_forward_disabled.png b/Core/src/org/sleuthkit/autopsy/directorytree/btn_step_forward_disabled.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/btn_step_forward_hover.png b/Core/src/org/sleuthkit/autopsy/directorytree/btn_step_forward_hover.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/forward-button.png b/Core/src/org/sleuthkit/autopsy/directorytree/forward-button.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/package.dox b/Core/src/org/sleuthkit/autopsy/directorytree/package.dox old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/events/AutopsyEvent.java b/Core/src/org/sleuthkit/autopsy/events/AutopsyEvent.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/events/AutopsyEventException.java b/Core/src/org/sleuthkit/autopsy/events/AutopsyEventException.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/events/AutopsyEventPublisher.java b/Core/src/org/sleuthkit/autopsy/events/AutopsyEventPublisher.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/events/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/events/Bundle_ja.properties old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/events/LocalEventPublisher.java b/Core/src/org/sleuthkit/autopsy/events/LocalEventPublisher.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/events/MessageServiceConnectionInfo.java b/Core/src/org/sleuthkit/autopsy/events/MessageServiceConnectionInfo.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/events/RemoteEventPublisher.java b/Core/src/org/sleuthkit/autopsy/events/RemoteEventPublisher.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/externalresults/Bundle.properties b/Core/src/org/sleuthkit/autopsy/externalresults/Bundle.properties old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/externalresults/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/externalresults/Bundle_ja.properties old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/externalresults/ExternalResults.java b/Core/src/org/sleuthkit/autopsy/externalresults/ExternalResults.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/externalresults/ExternalResultsImporter.java b/Core/src/org/sleuthkit/autopsy/externalresults/ExternalResultsImporter.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/externalresults/ExternalResultsXMLParser.java b/Core/src/org/sleuthkit/autopsy/externalresults/ExternalResultsXMLParser.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/externalresults/autopsy_external_results.xsd b/Core/src/org/sleuthkit/autopsy/externalresults/autopsy_external_results.xsd old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/filesearch/AbstractFileSearchFilter.java b/Core/src/org/sleuthkit/autopsy/filesearch/AbstractFileSearchFilter.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/filesearch/Bundle.properties b/Core/src/org/sleuthkit/autopsy/filesearch/Bundle.properties old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/filesearch/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/filesearch/Bundle_ja.properties old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/filesearch/DateSearchFilter.java b/Core/src/org/sleuthkit/autopsy/filesearch/DateSearchFilter.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/filesearch/DateSearchPanel.form b/Core/src/org/sleuthkit/autopsy/filesearch/DateSearchPanel.form old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/filesearch/DateSearchPanel.java b/Core/src/org/sleuthkit/autopsy/filesearch/DateSearchPanel.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/filesearch/FileSearchAction.java b/Core/src/org/sleuthkit/autopsy/filesearch/FileSearchAction.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/filesearch/FileSearchDialog.form b/Core/src/org/sleuthkit/autopsy/filesearch/FileSearchDialog.form old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/filesearch/FileSearchDialog.java b/Core/src/org/sleuthkit/autopsy/filesearch/FileSearchDialog.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/filesearch/FileSearchFilter.java b/Core/src/org/sleuthkit/autopsy/filesearch/FileSearchFilter.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/filesearch/FileSearchPanel.form b/Core/src/org/sleuthkit/autopsy/filesearch/FileSearchPanel.form old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/filesearch/FileSearchPanel.java b/Core/src/org/sleuthkit/autopsy/filesearch/FileSearchPanel.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/filesearch/FilterArea.java b/Core/src/org/sleuthkit/autopsy/filesearch/FilterArea.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/filesearch/KnownStatusSearchFilter.java b/Core/src/org/sleuthkit/autopsy/filesearch/KnownStatusSearchFilter.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/filesearch/KnownStatusSearchPanel.form b/Core/src/org/sleuthkit/autopsy/filesearch/KnownStatusSearchPanel.form old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/filesearch/KnownStatusSearchPanel.java b/Core/src/org/sleuthkit/autopsy/filesearch/KnownStatusSearchPanel.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/filesearch/NameSearchFilter.java b/Core/src/org/sleuthkit/autopsy/filesearch/NameSearchFilter.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/filesearch/NameSearchPanel.form b/Core/src/org/sleuthkit/autopsy/filesearch/NameSearchPanel.form old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/filesearch/NameSearchPanel.java b/Core/src/org/sleuthkit/autopsy/filesearch/NameSearchPanel.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/filesearch/SearchChildren.java b/Core/src/org/sleuthkit/autopsy/filesearch/SearchChildren.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/filesearch/SearchNode.java b/Core/src/org/sleuthkit/autopsy/filesearch/SearchNode.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/filesearch/SizeSearchFilter.java b/Core/src/org/sleuthkit/autopsy/filesearch/SizeSearchFilter.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/filesearch/SizeSearchPanel.form b/Core/src/org/sleuthkit/autopsy/filesearch/SizeSearchPanel.form old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/filesearch/SizeSearchPanel.java b/Core/src/org/sleuthkit/autopsy/filesearch/SizeSearchPanel.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/filesearch/arrow_down.gif b/Core/src/org/sleuthkit/autopsy/filesearch/arrow_down.gif old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/filesearch/arrow_right.gif b/Core/src/org/sleuthkit/autopsy/filesearch/arrow_right.gif old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/images/Bluetooth.png b/Core/src/org/sleuthkit/autopsy/images/Bluetooth.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/images/Folder-icon.png b/Core/src/org/sleuthkit/autopsy/images/Folder-icon.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/images/User-Group-icon-green32.png b/Core/src/org/sleuthkit/autopsy/images/User-Group-icon-green32.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/images/account-icon-16.png b/Core/src/org/sleuthkit/autopsy/images/account-icon-16.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/images/accounts.png b/Core/src/org/sleuthkit/autopsy/images/accounts.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/images/addImage-icon.png b/Core/src/org/sleuthkit/autopsy/images/addImage-icon.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/images/archive-file.png b/Core/src/org/sleuthkit/autopsy/images/archive-file.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/images/artifact-icon.png b/Core/src/org/sleuthkit/autopsy/images/artifact-icon.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/images/audio-file.png b/Core/src/org/sleuthkit/autopsy/images/audio-file.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/images/bank.png b/Core/src/org/sleuthkit/autopsy/images/bank.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/images/blue-tag-icon-16.png b/Core/src/org/sleuthkit/autopsy/images/blue-tag-icon-16.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/images/bookmarks.png b/Core/src/org/sleuthkit/autopsy/images/bookmarks.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/images/calendar.png b/Core/src/org/sleuthkit/autopsy/images/calendar.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/images/calllog.png b/Core/src/org/sleuthkit/autopsy/images/calllog.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/images/camera-icon-16.png b/Core/src/org/sleuthkit/autopsy/images/camera-icon-16.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/images/carved-file-icon-16.png b/Core/src/org/sleuthkit/autopsy/images/carved-file-icon-16.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/images/close-icon.png b/Core/src/org/sleuthkit/autopsy/images/close-icon.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/images/computer.png b/Core/src/org/sleuthkit/autopsy/images/computer.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/images/contact.png b/Core/src/org/sleuthkit/autopsy/images/contact.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/images/cookies.png b/Core/src/org/sleuthkit/autopsy/images/cookies.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/images/credit-card-green.png b/Core/src/org/sleuthkit/autopsy/images/credit-card-green.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/images/credit-card.png b/Core/src/org/sleuthkit/autopsy/images/credit-card.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/images/credit-cards.png b/Core/src/org/sleuthkit/autopsy/images/credit-cards.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/images/cross-script.png b/Core/src/org/sleuthkit/autopsy/images/cross-script.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/images/doc-file.png b/Core/src/org/sleuthkit/autopsy/images/doc-file.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/images/downloads.png b/Core/src/org/sleuthkit/autopsy/images/downloads.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/images/error-icon-16.png b/Core/src/org/sleuthkit/autopsy/images/error-icon-16.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/images/exe-file.png b/Core/src/org/sleuthkit/autopsy/images/exe-file.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/images/export16.png b/Core/src/org/sleuthkit/autopsy/images/export16.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/images/external.png b/Core/src/org/sleuthkit/autopsy/images/external.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/images/extracted_content.png b/Core/src/org/sleuthkit/autopsy/images/extracted_content.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/images/file-filter-icon.png b/Core/src/org/sleuthkit/autopsy/images/file-filter-icon.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/images/file-icon-deleted.png b/Core/src/org/sleuthkit/autopsy/images/file-icon-deleted.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/images/file-icon.png b/Core/src/org/sleuthkit/autopsy/images/file-icon.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/images/file-size-16.png b/Core/src/org/sleuthkit/autopsy/images/file-size-16.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/images/file_ingest_filter32x32.png b/Core/src/org/sleuthkit/autopsy/images/file_ingest_filter32x32.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/images/file_types.png b/Core/src/org/sleuthkit/autopsy/images/file_types.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/images/fileset-icon-16.png b/Core/src/org/sleuthkit/autopsy/images/fileset-icon-16.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/images/folder-icon-16.png b/Core/src/org/sleuthkit/autopsy/images/folder-icon-16.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/images/folder-icon-deleted.png b/Core/src/org/sleuthkit/autopsy/images/folder-icon-deleted.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/images/folder-icon-virtual.png b/Core/src/org/sleuthkit/autopsy/images/folder-icon-virtual.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/images/folder-local-icon-16.png b/Core/src/org/sleuthkit/autopsy/images/folder-local-icon-16.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/images/gps-lastlocation.png b/Core/src/org/sleuthkit/autopsy/images/gps-lastlocation.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/images/gps-search.png b/Core/src/org/sleuthkit/autopsy/images/gps-search.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/images/gps-trackpoint.png b/Core/src/org/sleuthkit/autopsy/images/gps-trackpoint.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/images/gpsfav.png b/Core/src/org/sleuthkit/autopsy/images/gpsfav.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/images/green-tag-icon-16.png b/Core/src/org/sleuthkit/autopsy/images/green-tag-icon-16.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/images/hard-drive-icon.jpg b/Core/src/org/sleuthkit/autopsy/images/hard-drive-icon.jpg old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/images/hashset_hits.png b/Core/src/org/sleuthkit/autopsy/images/hashset_hits.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/images/history.png b/Core/src/org/sleuthkit/autopsy/images/history.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/images/image-file.png b/Core/src/org/sleuthkit/autopsy/images/image-file.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/images/image.png b/Core/src/org/sleuthkit/autopsy/images/image.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/images/import16.png b/Core/src/org/sleuthkit/autopsy/images/import16.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/images/info-icon-16.png b/Core/src/org/sleuthkit/autopsy/images/info-icon-16.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/images/interesting_item.png b/Core/src/org/sleuthkit/autopsy/images/interesting_item.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/images/keyword_hits.png b/Core/src/org/sleuthkit/autopsy/images/keyword_hits.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/images/mail-icon-16.png b/Core/src/org/sleuthkit/autopsy/images/mail-icon-16.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/images/message.png b/Core/src/org/sleuthkit/autopsy/images/message.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/images/mismatch-16.png b/Core/src/org/sleuthkit/autopsy/images/mismatch-16.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/images/new-icon.png b/Core/src/org/sleuthkit/autopsy/images/new-icon.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/images/new16.png b/Core/src/org/sleuthkit/autopsy/images/new16.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/images/open-icon.png b/Core/src/org/sleuthkit/autopsy/images/open-icon.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/images/pdf-file.png b/Core/src/org/sleuthkit/autopsy/images/pdf-file.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/images/programs.png b/Core/src/org/sleuthkit/autopsy/images/programs.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/images/recent_docs.png b/Core/src/org/sleuthkit/autopsy/images/recent_docs.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/images/recent_files.png b/Core/src/org/sleuthkit/autopsy/images/recent_files.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/images/results.png b/Core/src/org/sleuthkit/autopsy/images/results.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/images/save-icon.png b/Core/src/org/sleuthkit/autopsy/images/save-icon.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/images/searchquery.png b/Core/src/org/sleuthkit/autopsy/images/searchquery.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/images/speeddialentry.png b/Core/src/org/sleuthkit/autopsy/images/speeddialentry.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/images/star-bookmark-icon-16.png b/Core/src/org/sleuthkit/autopsy/images/star-bookmark-icon-16.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/images/tag-folder-blue-icon-16.png b/Core/src/org/sleuthkit/autopsy/images/tag-folder-blue-icon-16.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/images/text-file.png b/Core/src/org/sleuthkit/autopsy/images/text-file.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/images/usb_devices.png b/Core/src/org/sleuthkit/autopsy/images/usb_devices.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/images/video-file.png b/Core/src/org/sleuthkit/autopsy/images/video-file.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/images/views.png b/Core/src/org/sleuthkit/autopsy/images/views.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/images/vol-icon.png b/Core/src/org/sleuthkit/autopsy/images/vol-icon.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/images/warning-icon-16.png b/Core/src/org/sleuthkit/autopsy/images/warning-icon-16.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/images/web-file.png b/Core/src/org/sleuthkit/autopsy/images/web-file.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/images/working_spinner.gif b/Core/src/org/sleuthkit/autopsy/images/working_spinner.gif old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/imagewriter/Bundle.properties b/Core/src/org/sleuthkit/autopsy/imagewriter/Bundle.properties old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/imagewriter/ImageWriter.java b/Core/src/org/sleuthkit/autopsy/imagewriter/ImageWriter.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/imagewriter/ImageWriterService.java b/Core/src/org/sleuthkit/autopsy/imagewriter/ImageWriterService.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/imagewriter/ImageWriterSettings.java b/Core/src/org/sleuthkit/autopsy/imagewriter/ImageWriterSettings.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/ingest/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/ingest/Bundle_ja.properties old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/ingest/DataSourceIngestCancellationPanel.form b/Core/src/org/sleuthkit/autopsy/ingest/DataSourceIngestCancellationPanel.form old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/ingest/DataSourceIngestCancellationPanel.java b/Core/src/org/sleuthkit/autopsy/ingest/DataSourceIngestCancellationPanel.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/ingest/DataSourceIngestJob.java b/Core/src/org/sleuthkit/autopsy/ingest/DataSourceIngestJob.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/ingest/DataSourceIngestModuleProcessTerminator.java b/Core/src/org/sleuthkit/autopsy/ingest/DataSourceIngestModuleProcessTerminator.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/ingest/DataSourceIngestModuleProgress.java b/Core/src/org/sleuthkit/autopsy/ingest/DataSourceIngestModuleProgress.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/ingest/FileIngestModuleProcessTerminator.java b/Core/src/org/sleuthkit/autopsy/ingest/FileIngestModuleProcessTerminator.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/ingest/GetFilesContentVisitor.java b/Core/src/org/sleuthkit/autopsy/ingest/GetFilesContentVisitor.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/ingest/IngestJob.java b/Core/src/org/sleuthkit/autopsy/ingest/IngestJob.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/ingest/IngestJobConfigurator.java b/Core/src/org/sleuthkit/autopsy/ingest/IngestJobConfigurator.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/ingest/IngestJobSettings.java b/Core/src/org/sleuthkit/autopsy/ingest/IngestJobSettings.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/ingest/IngestJobSettingsPanel.form b/Core/src/org/sleuthkit/autopsy/ingest/IngestJobSettingsPanel.form old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/ingest/IngestJobSettingsPanel.java b/Core/src/org/sleuthkit/autopsy/ingest/IngestJobSettingsPanel.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/ingest/IngestManager.java b/Core/src/org/sleuthkit/autopsy/ingest/IngestManager.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/ingest/IngestMessage.java b/Core/src/org/sleuthkit/autopsy/ingest/IngestMessage.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/ingest/IngestMessageDetailsPanel.form b/Core/src/org/sleuthkit/autopsy/ingest/IngestMessageDetailsPanel.form old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/ingest/IngestMessageDetailsPanel.java b/Core/src/org/sleuthkit/autopsy/ingest/IngestMessageDetailsPanel.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/ingest/IngestMessageMainPanel.form b/Core/src/org/sleuthkit/autopsy/ingest/IngestMessageMainPanel.form old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/ingest/IngestMessageMainPanel.java b/Core/src/org/sleuthkit/autopsy/ingest/IngestMessageMainPanel.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/ingest/IngestMessagePanel.form b/Core/src/org/sleuthkit/autopsy/ingest/IngestMessagePanel.form old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/ingest/IngestMessagePanel.java b/Core/src/org/sleuthkit/autopsy/ingest/IngestMessagePanel.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/ingest/IngestMessageTopComponent.form b/Core/src/org/sleuthkit/autopsy/ingest/IngestMessageTopComponent.form old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/ingest/IngestMessageTopComponent.java b/Core/src/org/sleuthkit/autopsy/ingest/IngestMessageTopComponent.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/ingest/IngestMessagesAction.java b/Core/src/org/sleuthkit/autopsy/ingest/IngestMessagesAction.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/ingest/IngestMessagesToolbar.form b/Core/src/org/sleuthkit/autopsy/ingest/IngestMessagesToolbar.form old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/ingest/IngestMessagesToolbar.java b/Core/src/org/sleuthkit/autopsy/ingest/IngestMessagesToolbar.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/ingest/IngestModuleFactoryLoader.java b/Core/src/org/sleuthkit/autopsy/ingest/IngestModuleFactoryLoader.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/ingest/IngestModuleReferenceCounter.java b/Core/src/org/sleuthkit/autopsy/ingest/IngestModuleReferenceCounter.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/ingest/IngestMonitor.java b/Core/src/org/sleuthkit/autopsy/ingest/IngestMonitor.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/ingest/IngestOptionsPanel.form b/Core/src/org/sleuthkit/autopsy/ingest/IngestOptionsPanel.form old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/ingest/IngestOptionsPanel.java b/Core/src/org/sleuthkit/autopsy/ingest/IngestOptionsPanel.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/ingest/IngestOptionsPanelController.java b/Core/src/org/sleuthkit/autopsy/ingest/IngestOptionsPanelController.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/ingest/IngestProfiles.java b/Core/src/org/sleuthkit/autopsy/ingest/IngestProfiles.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/ingest/IngestServices.java b/Core/src/org/sleuthkit/autopsy/ingest/IngestServices.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/ingest/IngestSettingsPanel.form b/Core/src/org/sleuthkit/autopsy/ingest/IngestSettingsPanel.form old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/ingest/IngestSettingsPanel.java b/Core/src/org/sleuthkit/autopsy/ingest/IngestSettingsPanel.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/ingest/Installer.java b/Core/src/org/sleuthkit/autopsy/ingest/Installer.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/ingest/ModuleContentEvent.java b/Core/src/org/sleuthkit/autopsy/ingest/ModuleContentEvent.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/ingest/ModuleDataEvent.java b/Core/src/org/sleuthkit/autopsy/ingest/ModuleDataEvent.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/ingest/PipelineConfig.xml b/Core/src/org/sleuthkit/autopsy/ingest/PipelineConfig.xml old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/ingest/PipelineConfigSchema.xsd b/Core/src/org/sleuthkit/autopsy/ingest/PipelineConfigSchema.xsd old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/ingest/ProcTerminationCode.java b/Core/src/org/sleuthkit/autopsy/ingest/ProcTerminationCode.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/ingest/ProfilePanel.form b/Core/src/org/sleuthkit/autopsy/ingest/ProfilePanel.form old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/ingest/ProfilePanel.java b/Core/src/org/sleuthkit/autopsy/ingest/ProfilePanel.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/ingest/ProfileSettingsPanel.form b/Core/src/org/sleuthkit/autopsy/ingest/ProfileSettingsPanel.form old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/ingest/ProfileSettingsPanel.java b/Core/src/org/sleuthkit/autopsy/ingest/ProfileSettingsPanel.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/ingest/btn_step_back.png b/Core/src/org/sleuthkit/autopsy/ingest/btn_step_back.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/ingest/btn_step_back_hover.png b/Core/src/org/sleuthkit/autopsy/ingest/btn_step_back_hover.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/ingest/events/BlackboardPostEvent.java b/Core/src/org/sleuthkit/autopsy/ingest/events/BlackboardPostEvent.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/ingest/events/ContentChangedEvent.java b/Core/src/org/sleuthkit/autopsy/ingest/events/ContentChangedEvent.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/ingest/events/DataSourceAnalysisCompletedEvent.java b/Core/src/org/sleuthkit/autopsy/ingest/events/DataSourceAnalysisCompletedEvent.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/ingest/events/DataSourceAnalysisEvent.java b/Core/src/org/sleuthkit/autopsy/ingest/events/DataSourceAnalysisEvent.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/ingest/events/DataSourceAnalysisStartedEvent.java b/Core/src/org/sleuthkit/autopsy/ingest/events/DataSourceAnalysisStartedEvent.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/ingest/events/FileAnalyzedEvent.java b/Core/src/org/sleuthkit/autopsy/ingest/events/FileAnalyzedEvent.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/ingest/eye-bw-25-rollover.png b/Core/src/org/sleuthkit/autopsy/ingest/eye-bw-25-rollover.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/ingest/eye-bw-25.png b/Core/src/org/sleuthkit/autopsy/ingest/eye-bw-25.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/ingest/goto_dir.png b/Core/src/org/sleuthkit/autopsy/ingest/goto_dir.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/ingest/goto_res.png b/Core/src/org/sleuthkit/autopsy/ingest/goto_res.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/ingest/package.dox b/Core/src/org/sleuthkit/autopsy/ingest/package.dox old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/ingest/runIngestModuleWizard/Bundle.properties b/Core/src/org/sleuthkit/autopsy/ingest/runIngestModuleWizard/Bundle.properties old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/ingest/runIngestModuleWizard/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/ingest/runIngestModuleWizard/Bundle_ja.properties old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/ingest/runIngestModuleWizard/IngestModulesConfigWizardPanel.java b/Core/src/org/sleuthkit/autopsy/ingest/runIngestModuleWizard/IngestModulesConfigWizardPanel.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/ingest/runIngestModuleWizard/IngestProfileSelectionPanel.form b/Core/src/org/sleuthkit/autopsy/ingest/runIngestModuleWizard/IngestProfileSelectionPanel.form old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/ingest/runIngestModuleWizard/IngestProfileSelectionPanel.java b/Core/src/org/sleuthkit/autopsy/ingest/runIngestModuleWizard/IngestProfileSelectionPanel.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/ingest/runIngestModuleWizard/IngestProfileSelectionWizardPanel.java b/Core/src/org/sleuthkit/autopsy/ingest/runIngestModuleWizard/IngestProfileSelectionWizardPanel.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/ingest/runIngestModuleWizard/RunIngestModulesWizardIterator.java b/Core/src/org/sleuthkit/autopsy/ingest/runIngestModuleWizard/RunIngestModulesWizardIterator.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/ingest/runIngestModuleWizard/ShortcutWizardDescriptorPanel.java b/Core/src/org/sleuthkit/autopsy/ingest/runIngestModuleWizard/ShortcutWizardDescriptorPanel.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/keywordsearchservice/KeywordSearchService.java b/Core/src/org/sleuthkit/autopsy/keywordsearchservice/KeywordSearchService.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/menuactions/Bundle.properties b/Core/src/org/sleuthkit/autopsy/menuactions/Bundle.properties old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/menuactions/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/menuactions/Bundle_ja.properties old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/menuactions/DataContentDynamicMenu.java b/Core/src/org/sleuthkit/autopsy/menuactions/DataContentDynamicMenu.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/menuactions/DataContentMenu.java b/Core/src/org/sleuthkit/autopsy/menuactions/DataContentMenu.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/menuactions/DataExplorerDynamicMenu.java b/Core/src/org/sleuthkit/autopsy/menuactions/DataExplorerDynamicMenu.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/menuactions/DataExplorerMenu.java b/Core/src/org/sleuthkit/autopsy/menuactions/DataExplorerMenu.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/menuactions/DataResultMenu.java b/Core/src/org/sleuthkit/autopsy/menuactions/DataResultMenu.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/menuactions/OpenTopComponentAction.java b/Core/src/org/sleuthkit/autopsy/menuactions/OpenTopComponentAction.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/menuactions/SearchResultMenu.java b/Core/src/org/sleuthkit/autopsy/menuactions/SearchResultMenu.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/menuactions/SpacerPanel.java b/Core/src/org/sleuthkit/autopsy/menuactions/SpacerPanel.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/e01verify/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/modules/e01verify/Bundle_ja.properties old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/embeddedfileextractor/Bundle.properties b/Core/src/org/sleuthkit/autopsy/modules/embeddedfileextractor/Bundle.properties old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/embeddedfileextractor/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/modules/embeddedfileextractor/Bundle_ja.properties old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/embeddedfileextractor/EmbeddedFileExtractorIngestModule.java b/Core/src/org/sleuthkit/autopsy/modules/embeddedfileextractor/EmbeddedFileExtractorIngestModule.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/embeddedfileextractor/SevenZipContentReadStream.java b/Core/src/org/sleuthkit/autopsy/modules/embeddedfileextractor/SevenZipContentReadStream.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/embeddedfileextractor/SevenZipExtractor.java b/Core/src/org/sleuthkit/autopsy/modules/embeddedfileextractor/SevenZipExtractor.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/exif/Bundle.properties b/Core/src/org/sleuthkit/autopsy/modules/exif/Bundle.properties old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/exif/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/modules/exif/Bundle_ja.properties old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/exif/ExifParserFileIngestModule.java b/Core/src/org/sleuthkit/autopsy/modules/exif/ExifParserFileIngestModule.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/exif/layer.xml b/Core/src/org/sleuthkit/autopsy/modules/exif/layer.xml old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/AddFileExtensionAction.java b/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/AddFileExtensionAction.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/Bundle.properties b/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/Bundle.properties old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/Bundle_ja.properties old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/FileExtMismatchContextMenuActionsProvider.java b/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/FileExtMismatchContextMenuActionsProvider.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/FileExtMismatchIngestModule.java b/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/FileExtMismatchIngestModule.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/FileExtMismatchModuleSettingsPanel.form b/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/FileExtMismatchModuleSettingsPanel.form old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/FileExtMismatchModuleSettingsPanel.java b/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/FileExtMismatchModuleSettingsPanel.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/FileExtMismatchOptionsPanelController.java b/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/FileExtMismatchOptionsPanelController.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/FileExtMismatchSettingsPanel.form b/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/FileExtMismatchSettingsPanel.form old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/FileExtMismatchSettingsPanel.java b/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/FileExtMismatchSettingsPanel.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/MismatchConfigSchema.xsd b/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/MismatchConfigSchema.xsd old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/mismatch_config.xml b/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/mismatch_config.xml old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/options-icon.png b/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/options-icon.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/save16.png b/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/save16.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/filetypeid/Bundle.properties b/Core/src/org/sleuthkit/autopsy/modules/filetypeid/Bundle.properties old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/filetypeid/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/modules/filetypeid/Bundle_ja.properties old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/filetypeid/CustomFileTypesManager.java b/Core/src/org/sleuthkit/autopsy/modules/filetypeid/CustomFileTypesManager.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/filetypeid/FileType.java b/Core/src/org/sleuthkit/autopsy/modules/filetypeid/FileType.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/filetypeid/FileTypeDetector.java b/Core/src/org/sleuthkit/autopsy/modules/filetypeid/FileTypeDetector.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/filetypeid/FileTypeIdGlobalSettingsPanel.form b/Core/src/org/sleuthkit/autopsy/modules/filetypeid/FileTypeIdGlobalSettingsPanel.form old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/filetypeid/FileTypeIdGlobalSettingsPanel.java b/Core/src/org/sleuthkit/autopsy/modules/filetypeid/FileTypeIdGlobalSettingsPanel.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/filetypeid/FileTypeIdIngestModule.java b/Core/src/org/sleuthkit/autopsy/modules/filetypeid/FileTypeIdIngestModule.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/filetypeid/FileTypeIdModuleSettings.java b/Core/src/org/sleuthkit/autopsy/modules/filetypeid/FileTypeIdModuleSettings.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/filetypeid/FileTypeIdOptionsPanelController.java b/Core/src/org/sleuthkit/autopsy/modules/filetypeid/FileTypeIdOptionsPanelController.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/filetypeid/FileTypes.xsd b/Core/src/org/sleuthkit/autopsy/modules/filetypeid/FileTypes.xsd old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/filetypeid/TikaFileTypeDetector.java b/Core/src/org/sleuthkit/autopsy/modules/filetypeid/TikaFileTypeDetector.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/filetypeid/user-defined-file-types-settings.png b/Core/src/org/sleuthkit/autopsy/modules/filetypeid/user-defined-file-types-settings.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/filetypeid/warning16.png b/Core/src/org/sleuthkit/autopsy/modules/filetypeid/warning16.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/Bundle.properties b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/Bundle.properties old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/Bundle_ja.properties old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashDatabaseOptionsPanelController.java b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashDatabaseOptionsPanelController.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashDbCreateDatabaseDialog.form b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashDbCreateDatabaseDialog.form old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashDbCreateDatabaseDialog.java b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashDbCreateDatabaseDialog.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashDbImportDatabaseDialog.form b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashDbImportDatabaseDialog.form old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashDbImportDatabaseDialog.java b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashDbImportDatabaseDialog.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashDbIngestModule.java b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashDbIngestModule.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashDbPanelSearchAction.java b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashDbPanelSearchAction.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashDbSearchAction.java b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashDbSearchAction.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashDbSearchManager.java b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashDbSearchManager.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashDbSearchPanel.form b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashDbSearchPanel.form old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashDbSearchPanel.java b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashDbSearchPanel.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashDbSearchResultFactory.java b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashDbSearchResultFactory.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashDbSearchThread.java b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashDbSearchThread.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashDbSearcher.java b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashDbSearcher.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashLookupModuleSettingsPanel.form b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashLookupModuleSettingsPanel.form old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashLookupModuleSettingsPanel.java b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashLookupModuleSettingsPanel.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashLookupSettingsPanel.form b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashLookupSettingsPanel.form old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashLookupSettingsPanel.java b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashLookupSettingsPanel.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/ModalNoButtons.form b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/ModalNoButtons.form old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/ModalNoButtons.java b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/ModalNoButtons.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/btn_icon_create_new_16.png b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/btn_icon_create_new_16.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/delete16.png b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/delete16.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/import16.png b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/import16.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/layer.xml b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/layer.xml old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/new16.png b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/new16.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/options-icon.png b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/options-icon.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/options_icon.png b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/options_icon.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/warning16.png b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/warning16.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/iOS/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/modules/iOS/Bundle_ja.properties old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/interestingitems/FileSetsDefinitions.java b/Core/src/org/sleuthkit/autopsy/modules/interestingitems/FileSetsDefinitions.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/photoreccarver/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/modules/photoreccarver/Bundle_ja.properties old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/stix/Bundle.properties b/Core/src/org/sleuthkit/autopsy/modules/stix/Bundle.properties old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/stix/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/modules/stix/Bundle_ja.properties old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/stix/EvalAccountObj.java b/Core/src/org/sleuthkit/autopsy/modules/stix/EvalAccountObj.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/stix/EvalAddressObj.java b/Core/src/org/sleuthkit/autopsy/modules/stix/EvalAddressObj.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/stix/EvalDomainObj.java b/Core/src/org/sleuthkit/autopsy/modules/stix/EvalDomainObj.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/stix/EvalEmailObj.java b/Core/src/org/sleuthkit/autopsy/modules/stix/EvalEmailObj.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/stix/EvalFileObj.java b/Core/src/org/sleuthkit/autopsy/modules/stix/EvalFileObj.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/stix/EvalNetworkShareObj.java b/Core/src/org/sleuthkit/autopsy/modules/stix/EvalNetworkShareObj.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/stix/EvalRegistryObj.java b/Core/src/org/sleuthkit/autopsy/modules/stix/EvalRegistryObj.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/stix/EvalSystemObj.java b/Core/src/org/sleuthkit/autopsy/modules/stix/EvalSystemObj.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/stix/EvalURIObj.java b/Core/src/org/sleuthkit/autopsy/modules/stix/EvalURIObj.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/stix/EvalURLHistoryObj.java b/Core/src/org/sleuthkit/autopsy/modules/stix/EvalURLHistoryObj.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/stix/EvaluatableObject.java b/Core/src/org/sleuthkit/autopsy/modules/stix/EvaluatableObject.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/stix/ObservableResult.java b/Core/src/org/sleuthkit/autopsy/modules/stix/ObservableResult.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/stix/STIXReportModule.java b/Core/src/org/sleuthkit/autopsy/modules/stix/STIXReportModule.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/stix/STIXReportModuleConfigPanel.form b/Core/src/org/sleuthkit/autopsy/modules/stix/STIXReportModuleConfigPanel.form old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/stix/STIXReportModuleConfigPanel.java b/Core/src/org/sleuthkit/autopsy/modules/stix/STIXReportModuleConfigPanel.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/stix/StixArtifactData.java b/Core/src/org/sleuthkit/autopsy/modules/stix/StixArtifactData.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/vmextractor/Bundle.properties b/Core/src/org/sleuthkit/autopsy/modules/vmextractor/Bundle.properties old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/vmextractor/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/modules/vmextractor/Bundle_ja.properties old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/vmextractor/VMExtractorIngestModule.java b/Core/src/org/sleuthkit/autopsy/modules/vmextractor/VMExtractorIngestModule.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/vmextractor/VMExtractorIngestModuleFactory.java b/Core/src/org/sleuthkit/autopsy/modules/vmextractor/VMExtractorIngestModuleFactory.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/modules/vmextractor/VirtualMachineFinder.java b/Core/src/org/sleuthkit/autopsy/modules/vmextractor/VirtualMachineFinder.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/progress/Bundle.properties b/Core/src/org/sleuthkit/autopsy/progress/Bundle.properties old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/progress/LoggingProgressIndicator.java b/Core/src/org/sleuthkit/autopsy/progress/LoggingProgressIndicator.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/progress/ModalDialogProgressIndicator.java b/Core/src/org/sleuthkit/autopsy/progress/ModalDialogProgressIndicator.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/progress/ProgressIndicator.java b/Core/src/org/sleuthkit/autopsy/progress/ProgressIndicator.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/progress/ProgressPanel.form b/Core/src/org/sleuthkit/autopsy/progress/ProgressPanel.form old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/progress/ProgressPanel.java b/Core/src/org/sleuthkit/autopsy/progress/ProgressPanel.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/progress/SilentProgressIndicator.java b/Core/src/org/sleuthkit/autopsy/progress/SilentProgressIndicator.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/python/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/python/Bundle_ja.properties old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/report/ArtifactSelectionDialog.form b/Core/src/org/sleuthkit/autopsy/report/ArtifactSelectionDialog.form old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/report/ArtifactSelectionDialog.java b/Core/src/org/sleuthkit/autopsy/report/ArtifactSelectionDialog.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/report/Bundle.properties b/Core/src/org/sleuthkit/autopsy/report/Bundle.properties old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/report/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/report/Bundle_ja.properties old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/report/DefaultReportConfigurationPanel.form b/Core/src/org/sleuthkit/autopsy/report/DefaultReportConfigurationPanel.form old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/report/DefaultReportConfigurationPanel.java b/Core/src/org/sleuthkit/autopsy/report/DefaultReportConfigurationPanel.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/report/GeneralReportModule.java b/Core/src/org/sleuthkit/autopsy/report/GeneralReportModule.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/report/ReportBodyFile.java b/Core/src/org/sleuthkit/autopsy/report/ReportBodyFile.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/report/ReportBranding.java b/Core/src/org/sleuthkit/autopsy/report/ReportBranding.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/report/ReportBrandingProviderI.java b/Core/src/org/sleuthkit/autopsy/report/ReportBrandingProviderI.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/report/ReportExcel.java b/Core/src/org/sleuthkit/autopsy/report/ReportExcel.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/report/ReportGenerationPanel.form b/Core/src/org/sleuthkit/autopsy/report/ReportGenerationPanel.form old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/report/ReportGenerationPanel.java b/Core/src/org/sleuthkit/autopsy/report/ReportGenerationPanel.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/report/ReportGenerator.java b/Core/src/org/sleuthkit/autopsy/report/ReportGenerator.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/report/ReportHTML.java b/Core/src/org/sleuthkit/autopsy/report/ReportHTML.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/report/ReportModule.java b/Core/src/org/sleuthkit/autopsy/report/ReportModule.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/report/ReportProgressPanel.form b/Core/src/org/sleuthkit/autopsy/report/ReportProgressPanel.form old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/report/ReportProgressPanel.java b/Core/src/org/sleuthkit/autopsy/report/ReportProgressPanel.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/report/ReportVisualPanel1.form b/Core/src/org/sleuthkit/autopsy/report/ReportVisualPanel1.form old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/report/ReportVisualPanel1.java b/Core/src/org/sleuthkit/autopsy/report/ReportVisualPanel1.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/report/ReportVisualPanel2.form b/Core/src/org/sleuthkit/autopsy/report/ReportVisualPanel2.form old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/report/ReportVisualPanel2.java b/Core/src/org/sleuthkit/autopsy/report/ReportVisualPanel2.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/report/ReportWizardAction.java b/Core/src/org/sleuthkit/autopsy/report/ReportWizardAction.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/report/ReportWizardIterator.java b/Core/src/org/sleuthkit/autopsy/report/ReportWizardIterator.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/report/ReportWizardPanel1.java b/Core/src/org/sleuthkit/autopsy/report/ReportWizardPanel1.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/report/ReportWizardPanel2.java b/Core/src/org/sleuthkit/autopsy/report/ReportWizardPanel2.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/report/TableReportModule.java b/Core/src/org/sleuthkit/autopsy/report/TableReportModule.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/report/images/account-icon-16.png b/Core/src/org/sleuthkit/autopsy/report/images/account-icon-16.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/report/images/accounts.png b/Core/src/org/sleuthkit/autopsy/report/images/accounts.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/report/images/bluetooth.png b/Core/src/org/sleuthkit/autopsy/report/images/bluetooth.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/report/images/bookmarks.png b/Core/src/org/sleuthkit/autopsy/report/images/bookmarks.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/report/images/btn_icon_generate_report.png b/Core/src/org/sleuthkit/autopsy/report/images/btn_icon_generate_report.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/report/images/calendar.png b/Core/src/org/sleuthkit/autopsy/report/images/calendar.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/report/images/calllog.png b/Core/src/org/sleuthkit/autopsy/report/images/calllog.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/report/images/computer.png b/Core/src/org/sleuthkit/autopsy/report/images/computer.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/report/images/contact.png b/Core/src/org/sleuthkit/autopsy/report/images/contact.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/report/images/cookies.png b/Core/src/org/sleuthkit/autopsy/report/images/cookies.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/report/images/credit-card.png b/Core/src/org/sleuthkit/autopsy/report/images/credit-card.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/report/images/default_generator_logo.png b/Core/src/org/sleuthkit/autopsy/report/images/default_generator_logo.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/report/images/devices.png b/Core/src/org/sleuthkit/autopsy/report/images/devices.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/report/images/downloads.png b/Core/src/org/sleuthkit/autopsy/report/images/downloads.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/report/images/drive_network.png b/Core/src/org/sleuthkit/autopsy/report/images/drive_network.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/report/images/exif.png b/Core/src/org/sleuthkit/autopsy/report/images/exif.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/report/images/favicon.ico b/Core/src/org/sleuthkit/autopsy/report/images/favicon.ico old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/report/images/gps-lastlocation.png b/Core/src/org/sleuthkit/autopsy/report/images/gps-lastlocation.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/report/images/gps-search.png b/Core/src/org/sleuthkit/autopsy/report/images/gps-search.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/report/images/gps_trackpoint.png b/Core/src/org/sleuthkit/autopsy/report/images/gps_trackpoint.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/report/images/gpsfav.png b/Core/src/org/sleuthkit/autopsy/report/images/gpsfav.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/report/images/hash.png b/Core/src/org/sleuthkit/autopsy/report/images/hash.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/report/images/history.png b/Core/src/org/sleuthkit/autopsy/report/images/history.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/report/images/installed.png b/Core/src/org/sleuthkit/autopsy/report/images/installed.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/report/images/keywords.png b/Core/src/org/sleuthkit/autopsy/report/images/keywords.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/report/images/message.png b/Core/src/org/sleuthkit/autopsy/report/images/message.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/report/images/recent.png b/Core/src/org/sleuthkit/autopsy/report/images/recent.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/report/images/report_loading.png b/Core/src/org/sleuthkit/autopsy/report/images/report_loading.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/report/images/search.png b/Core/src/org/sleuthkit/autopsy/report/images/search.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/report/images/speeddialentry.png b/Core/src/org/sleuthkit/autopsy/report/images/speeddialentry.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/report/images/star.png b/Core/src/org/sleuthkit/autopsy/report/images/star.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/report/images/summary.png b/Core/src/org/sleuthkit/autopsy/report/images/summary.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/report/images/userbookmarks.png b/Core/src/org/sleuthkit/autopsy/report/images/userbookmarks.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/report/package.dox b/Core/src/org/sleuthkit/autopsy/report/package.dox old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/test/CustomArtifactsCreatorFileIngestModule.java b/Core/src/org/sleuthkit/autopsy/test/CustomArtifactsCreatorFileIngestModule.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/test/CustomArtifactsCreatorIngestModuleFactory.java b/Core/src/org/sleuthkit/autopsy/test/CustomArtifactsCreatorIngestModuleFactory.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/test/InterestingArtifactCreatorIngestModule.java b/Core/src/org/sleuthkit/autopsy/test/InterestingArtifactCreatorIngestModule.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/test/InterestingArtifactCreatorIngestModuleFactory.java b/Core/src/org/sleuthkit/autopsy/test/InterestingArtifactCreatorIngestModuleFactory.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/test/TestAutopsyService.java b/Core/src/org/sleuthkit/autopsy/test/TestAutopsyService.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/Bundle.properties b/Core/src/org/sleuthkit/autopsy/timeline/Bundle.properties old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/timeline/Bundle_ja.properties old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/CancellationProgressTask.java b/Core/src/org/sleuthkit/autopsy/timeline/CancellationProgressTask.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ChronoFieldListCell.java b/Core/src/org/sleuthkit/autopsy/timeline/ChronoFieldListCell.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/FXMLConstructor.java b/Core/src/org/sleuthkit/autopsy/timeline/FXMLConstructor.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/OpenTimelineAction.java b/Core/src/org/sleuthkit/autopsy/timeline/OpenTimelineAction.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/PerCaseTimelineProperties.java b/Core/src/org/sleuthkit/autopsy/timeline/PerCaseTimelineProperties.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/PromptDialogManager.java b/Core/src/org/sleuthkit/autopsy/timeline/PromptDialogManager.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ShowInTimelineDialog.fxml b/Core/src/org/sleuthkit/autopsy/timeline/ShowInTimelineDialog.fxml old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ShowInTimelineDialog.java b/Core/src/org/sleuthkit/autopsy/timeline/ShowInTimelineDialog.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/TimeLineController.java b/Core/src/org/sleuthkit/autopsy/timeline/TimeLineController.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/TimeLineException.java b/Core/src/org/sleuthkit/autopsy/timeline/TimeLineException.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/TimeLineTopComponent.form b/Core/src/org/sleuthkit/autopsy/timeline/TimeLineTopComponent.form old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/TimeLineTopComponent.java b/Core/src/org/sleuthkit/autopsy/timeline/TimeLineTopComponent.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ViewMode.java b/Core/src/org/sleuthkit/autopsy/timeline/ViewMode.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/WrappingListCell.java b/Core/src/org/sleuthkit/autopsy/timeline/WrappingListCell.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/actions/Back.java b/Core/src/org/sleuthkit/autopsy/timeline/actions/Back.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/actions/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/timeline/actions/Bundle_ja.properties old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/actions/Forward.java b/Core/src/org/sleuthkit/autopsy/timeline/actions/Forward.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/actions/ResetFilters.java b/Core/src/org/sleuthkit/autopsy/timeline/actions/ResetFilters.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/actions/SaveSnapshotAsReport.java b/Core/src/org/sleuthkit/autopsy/timeline/actions/SaveSnapshotAsReport.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/actions/UpdateDB.java b/Core/src/org/sleuthkit/autopsy/timeline/actions/UpdateDB.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/actions/ViewArtifactInTimelineAction.java b/Core/src/org/sleuthkit/autopsy/timeline/actions/ViewArtifactInTimelineAction.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/actions/ViewFileInTimelineAction.java b/Core/src/org/sleuthkit/autopsy/timeline/actions/ViewFileInTimelineAction.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/actions/ZoomIn.java b/Core/src/org/sleuthkit/autopsy/timeline/actions/ZoomIn.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/actions/ZoomOut.java b/Core/src/org/sleuthkit/autopsy/timeline/actions/ZoomOut.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/actions/ZoomToEvents.java b/Core/src/org/sleuthkit/autopsy/timeline/actions/ZoomToEvents.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/datamodel/CombinedEvent.java b/Core/src/org/sleuthkit/autopsy/timeline/datamodel/CombinedEvent.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/datamodel/EventCluster.java b/Core/src/org/sleuthkit/autopsy/timeline/datamodel/EventCluster.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/datamodel/EventStripe.java b/Core/src/org/sleuthkit/autopsy/timeline/datamodel/EventStripe.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/datamodel/FilteredEventsModel.java b/Core/src/org/sleuthkit/autopsy/timeline/datamodel/FilteredEventsModel.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/datamodel/MultiEvent.java b/Core/src/org/sleuthkit/autopsy/timeline/datamodel/MultiEvent.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/datamodel/SingleEvent.java b/Core/src/org/sleuthkit/autopsy/timeline/datamodel/SingleEvent.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/datamodel/TimeLineEvent.java b/Core/src/org/sleuthkit/autopsy/timeline/datamodel/TimeLineEvent.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/datamodel/eventtype/ArtifactEventType.java b/Core/src/org/sleuthkit/autopsy/timeline/datamodel/eventtype/ArtifactEventType.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/datamodel/eventtype/BaseTypes.java b/Core/src/org/sleuthkit/autopsy/timeline/datamodel/eventtype/BaseTypes.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/datamodel/eventtype/Bundle.properties b/Core/src/org/sleuthkit/autopsy/timeline/datamodel/eventtype/Bundle.properties old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/datamodel/eventtype/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/timeline/datamodel/eventtype/Bundle_ja.properties old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/datamodel/eventtype/EventType.java b/Core/src/org/sleuthkit/autopsy/timeline/datamodel/eventtype/EventType.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/datamodel/eventtype/FileSystemTypes.java b/Core/src/org/sleuthkit/autopsy/timeline/datamodel/eventtype/FileSystemTypes.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/datamodel/eventtype/MiscTypes.java b/Core/src/org/sleuthkit/autopsy/timeline/datamodel/eventtype/MiscTypes.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/datamodel/eventtype/RootEventType.java b/Core/src/org/sleuthkit/autopsy/timeline/datamodel/eventtype/RootEventType.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/datamodel/eventtype/WebTypes.java b/Core/src/org/sleuthkit/autopsy/timeline/datamodel/eventtype/WebTypes.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/db/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/timeline/db/Bundle_ja.properties old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/db/EventDB.java b/Core/src/org/sleuthkit/autopsy/timeline/db/EventDB.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/db/EventsRepository.java b/Core/src/org/sleuthkit/autopsy/timeline/db/EventsRepository.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/db/MultipleTransactionException.java b/Core/src/org/sleuthkit/autopsy/timeline/db/MultipleTransactionException.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/db/SQLHelper.java b/Core/src/org/sleuthkit/autopsy/timeline/db/SQLHelper.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/events/DBUpdatedEvent.java b/Core/src/org/sleuthkit/autopsy/timeline/events/DBUpdatedEvent.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/events/RefreshRequestedEvent.java b/Core/src/org/sleuthkit/autopsy/timeline/events/RefreshRequestedEvent.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/events/TagsAddedEvent.java b/Core/src/org/sleuthkit/autopsy/timeline/events/TagsAddedEvent.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/events/TagsDeletedEvent.java b/Core/src/org/sleuthkit/autopsy/timeline/events/TagsDeletedEvent.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/events/TagsUpdatedEvent.java b/Core/src/org/sleuthkit/autopsy/timeline/events/TagsUpdatedEvent.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/events/ViewInTimelineRequestedEvent.java b/Core/src/org/sleuthkit/autopsy/timeline/events/ViewInTimelineRequestedEvent.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/explorernodes/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/timeline/explorernodes/Bundle_ja.properties old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/explorernodes/EventNode.java b/Core/src/org/sleuthkit/autopsy/timeline/explorernodes/EventNode.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/explorernodes/EventRootNode.java b/Core/src/org/sleuthkit/autopsy/timeline/explorernodes/EventRootNode.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/filters/AbstractFilter.java b/Core/src/org/sleuthkit/autopsy/timeline/filters/AbstractFilter.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/filters/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/timeline/filters/Bundle_ja.properties old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/filters/CompoundFilter.java b/Core/src/org/sleuthkit/autopsy/timeline/filters/CompoundFilter.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/filters/DataSourceFilter.java b/Core/src/org/sleuthkit/autopsy/timeline/filters/DataSourceFilter.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/filters/DataSourcesFilter.java b/Core/src/org/sleuthkit/autopsy/timeline/filters/DataSourcesFilter.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/filters/DescriptionFilter.java b/Core/src/org/sleuthkit/autopsy/timeline/filters/DescriptionFilter.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/filters/Filter.java b/Core/src/org/sleuthkit/autopsy/timeline/filters/Filter.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/filters/HashHitsFilter.java b/Core/src/org/sleuthkit/autopsy/timeline/filters/HashHitsFilter.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/filters/HashSetFilter.java b/Core/src/org/sleuthkit/autopsy/timeline/filters/HashSetFilter.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/filters/HideKnownFilter.java b/Core/src/org/sleuthkit/autopsy/timeline/filters/HideKnownFilter.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/filters/IntersectionFilter.java b/Core/src/org/sleuthkit/autopsy/timeline/filters/IntersectionFilter.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/filters/RootFilter.java b/Core/src/org/sleuthkit/autopsy/timeline/filters/RootFilter.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/filters/TagNameFilter.java b/Core/src/org/sleuthkit/autopsy/timeline/filters/TagNameFilter.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/filters/TagsFilter.java b/Core/src/org/sleuthkit/autopsy/timeline/filters/TagsFilter.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/filters/TextFilter.java b/Core/src/org/sleuthkit/autopsy/timeline/filters/TextFilter.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/filters/TypeFilter.java b/Core/src/org/sleuthkit/autopsy/timeline/filters/TypeFilter.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/filters/UnionFilter.java b/Core/src/org/sleuthkit/autopsy/timeline/filters/UnionFilter.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/arrow-090.png b/Core/src/org/sleuthkit/autopsy/timeline/images/arrow-090.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/arrow-180.png b/Core/src/org/sleuthkit/autopsy/timeline/images/arrow-180.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/arrow-270.png b/Core/src/org/sleuthkit/autopsy/timeline/images/arrow-270.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/arrow-circle-double-135.png b/Core/src/org/sleuthkit/autopsy/timeline/images/arrow-circle-double-135.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/arrow-in.png b/Core/src/org/sleuthkit/autopsy/timeline/images/arrow-in.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/arrow-out.png b/Core/src/org/sleuthkit/autopsy/timeline/images/arrow-out.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/arrow-step-out.png b/Core/src/org/sleuthkit/autopsy/timeline/images/arrow-step-out.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/arrow-step.png b/Core/src/org/sleuthkit/autopsy/timeline/images/arrow-step.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/arrow.png b/Core/src/org/sleuthkit/autopsy/timeline/images/arrow.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/arrow_in.png b/Core/src/org/sleuthkit/autopsy/timeline/images/arrow_in.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/arrow_out.png b/Core/src/org/sleuthkit/autopsy/timeline/images/arrow_out.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/block.png b/Core/src/org/sleuthkit/autopsy/timeline/images/block.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/blue-document-attribute-a.png b/Core/src/org/sleuthkit/autopsy/timeline/images/blue-document-attribute-a.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/blue-document-attribute-b.png b/Core/src/org/sleuthkit/autopsy/timeline/images/blue-document-attribute-b.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/blue-document-attribute-c.png b/Core/src/org/sleuthkit/autopsy/timeline/images/blue-document-attribute-c.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/blue-document-attribute-m.png b/Core/src/org/sleuthkit/autopsy/timeline/images/blue-document-attribute-m.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/blue-document.png b/Core/src/org/sleuthkit/autopsy/timeline/images/blue-document.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/bookmark--plus.png b/Core/src/org/sleuthkit/autopsy/timeline/images/bookmark--plus.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/bookmarks.png b/Core/src/org/sleuthkit/autopsy/timeline/images/bookmarks.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/btn_icon_timeline_32.png b/Core/src/org/sleuthkit/autopsy/timeline/images/btn_icon_timeline_32.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/btn_icon_timeline_colorized_32.png b/Core/src/org/sleuthkit/autopsy/timeline/images/btn_icon_timeline_colorized_32.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/btn_step_back.png b/Core/src/org/sleuthkit/autopsy/timeline/images/btn_step_back.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/btn_step_back_disabled.png b/Core/src/org/sleuthkit/autopsy/timeline/images/btn_step_back_disabled.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/btn_step_back_hover.png b/Core/src/org/sleuthkit/autopsy/timeline/images/btn_step_back_hover.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/btn_step_forward.png b/Core/src/org/sleuthkit/autopsy/timeline/images/btn_step_forward.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/btn_step_forward_disabled.png b/Core/src/org/sleuthkit/autopsy/timeline/images/btn_step_forward_disabled.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/btn_step_forward_hover.png b/Core/src/org/sleuthkit/autopsy/timeline/images/btn_step_forward_hover.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/calllog.png b/Core/src/org/sleuthkit/autopsy/timeline/images/calllog.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/camera-icon-16.png b/Core/src/org/sleuthkit/autopsy/timeline/images/camera-icon-16.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/chart_bar.png b/Core/src/org/sleuthkit/autopsy/timeline/images/chart_bar.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/checker64.jpg b/Core/src/org/sleuthkit/autopsy/timeline/images/checker64.jpg old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/checkerboard.png b/Core/src/org/sleuthkit/autopsy/timeline/images/checkerboard.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/checkerboard_transparent.png b/Core/src/org/sleuthkit/autopsy/timeline/images/checkerboard_transparent.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/clock-history.png b/Core/src/org/sleuthkit/autopsy/timeline/images/clock-history.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/cookies.png b/Core/src/org/sleuthkit/autopsy/timeline/images/cookies.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/cross-circle (2).png b/Core/src/org/sleuthkit/autopsy/timeline/images/cross-circle (2).png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/cross-circle.png b/Core/src/org/sleuthkit/autopsy/timeline/images/cross-circle.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/cross-script.png b/Core/src/org/sleuthkit/autopsy/timeline/images/cross-script.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/database_refresh.png b/Core/src/org/sleuthkit/autopsy/timeline/images/database_refresh.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/downloads.png b/Core/src/org/sleuthkit/autopsy/timeline/images/downloads.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/eye--minus.png b/Core/src/org/sleuthkit/autopsy/timeline/images/eye--minus.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/eye--plus.png b/Core/src/org/sleuthkit/autopsy/timeline/images/eye--plus.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/eye_close.png b/Core/src/org/sleuthkit/autopsy/timeline/images/eye_close.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/funnel--minus.png b/Core/src/org/sleuthkit/autopsy/timeline/images/funnel--minus.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/funnel.png b/Core/src/org/sleuthkit/autopsy/timeline/images/funnel.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/geolocation.png b/Core/src/org/sleuthkit/autopsy/timeline/images/geolocation.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/gps-search.png b/Core/src/org/sleuthkit/autopsy/timeline/images/gps-search.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/gps-trackpoint.png b/Core/src/org/sleuthkit/autopsy/timeline/images/gps-trackpoint.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/history.png b/Core/src/org/sleuthkit/autopsy/timeline/images/history.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/image.png b/Core/src/org/sleuthkit/autopsy/timeline/images/image.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/info-icon-16.png b/Core/src/org/sleuthkit/autopsy/timeline/images/info-icon-16.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/information-frame.png b/Core/src/org/sleuthkit/autopsy/timeline/images/information-frame.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/information-gray.png b/Core/src/org/sleuthkit/autopsy/timeline/images/information-gray.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/information-white.png b/Core/src/org/sleuthkit/autopsy/timeline/images/information-white.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/information.png b/Core/src/org/sleuthkit/autopsy/timeline/images/information.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/magnifier-left.png b/Core/src/org/sleuthkit/autopsy/timeline/images/magnifier-left.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/magnifier-zoom-actual-equal.png b/Core/src/org/sleuthkit/autopsy/timeline/images/magnifier-zoom-actual-equal.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/magnifier-zoom-actual.png b/Core/src/org/sleuthkit/autopsy/timeline/images/magnifier-zoom-actual.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/magnifier-zoom-fit.png b/Core/src/org/sleuthkit/autopsy/timeline/images/magnifier-zoom-fit.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/magnifier-zoom-in-green.png b/Core/src/org/sleuthkit/autopsy/timeline/images/magnifier-zoom-in-green.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/magnifier-zoom-in.png b/Core/src/org/sleuthkit/autopsy/timeline/images/magnifier-zoom-in.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/magnifier-zoom-out-red.png b/Core/src/org/sleuthkit/autopsy/timeline/images/magnifier-zoom-out-red.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/magnifier-zoom-out.png b/Core/src/org/sleuthkit/autopsy/timeline/images/magnifier-zoom-out.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/magnifier-zoom.png b/Core/src/org/sleuthkit/autopsy/timeline/images/magnifier-zoom.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/magnifier.png b/Core/src/org/sleuthkit/autopsy/timeline/images/magnifier.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/magnifier_zoom_in.png b/Core/src/org/sleuthkit/autopsy/timeline/images/magnifier_zoom_in.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/magnifier_zoom_out.png b/Core/src/org/sleuthkit/autopsy/timeline/images/magnifier_zoom_out.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/mail-icon-16.png b/Core/src/org/sleuthkit/autopsy/timeline/images/mail-icon-16.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/marker--arrow.png b/Core/src/org/sleuthkit/autopsy/timeline/images/marker--arrow.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/marker--exclamation.png b/Core/src/org/sleuthkit/autopsy/timeline/images/marker--exclamation.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/marker--minus.png b/Core/src/org/sleuthkit/autopsy/timeline/images/marker--minus.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/marker--pencil.png b/Core/src/org/sleuthkit/autopsy/timeline/images/marker--pencil.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/marker--pin.png b/Core/src/org/sleuthkit/autopsy/timeline/images/marker--pin.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/marker--plus.png b/Core/src/org/sleuthkit/autopsy/timeline/images/marker--plus.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/marker.png b/Core/src/org/sleuthkit/autopsy/timeline/images/marker.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/message.png b/Core/src/org/sleuthkit/autopsy/timeline/images/message.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/minus-button.png b/Core/src/org/sleuthkit/autopsy/timeline/images/minus-button.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/plus-button.png b/Core/src/org/sleuthkit/autopsy/timeline/images/plus-button.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/programs.png b/Core/src/org/sleuthkit/autopsy/timeline/images/programs.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/prohibition.png b/Core/src/org/sleuthkit/autopsy/timeline/images/prohibition.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/question-frame.png b/Core/src/org/sleuthkit/autopsy/timeline/images/question-frame.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/recent_docs.png b/Core/src/org/sleuthkit/autopsy/timeline/images/recent_docs.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/resultset_first.png b/Core/src/org/sleuthkit/autopsy/timeline/images/resultset_first.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/resultset_last.png b/Core/src/org/sleuthkit/autopsy/timeline/images/resultset_last.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/resultset_next.png b/Core/src/org/sleuthkit/autopsy/timeline/images/resultset_next.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/resultset_previous.png b/Core/src/org/sleuthkit/autopsy/timeline/images/resultset_previous.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/searchquery.png b/Core/src/org/sleuthkit/autopsy/timeline/images/searchquery.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/select.png b/Core/src/org/sleuthkit/autopsy/timeline/images/select.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/table.png b/Core/src/org/sleuthkit/autopsy/timeline/images/table.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/tick.png b/Core/src/org/sleuthkit/autopsy/timeline/images/tick.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/timeline_marker.png b/Core/src/org/sleuthkit/autopsy/timeline/images/timeline_marker.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/usb_devices.png b/Core/src/org/sleuthkit/autopsy/timeline/images/usb_devices.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/warning.png b/Core/src/org/sleuthkit/autopsy/timeline/images/warning.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/warning_triangle.png b/Core/src/org/sleuthkit/autopsy/timeline/images/warning_triangle.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/warning_triangle_small.png b/Core/src/org/sleuthkit/autopsy/timeline/images/warning_triangle_small.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/images/web-file.png b/Core/src/org/sleuthkit/autopsy/timeline/images/web-file.png old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/license-timeline.txt b/Core/src/org/sleuthkit/autopsy/timeline/license-timeline.txt old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/snapshot/SnapShotReportWriter.java b/Core/src/org/sleuthkit/autopsy/timeline/snapshot/SnapShotReportWriter.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/snapshot/index.css b/Core/src/org/sleuthkit/autopsy/timeline/snapshot/index.css old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/snapshot/index_template.html b/Core/src/org/sleuthkit/autopsy/timeline/snapshot/index_template.html old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/snapshot/navigation.html b/Core/src/org/sleuthkit/autopsy/timeline/snapshot/navigation.html old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/snapshot/snapshot_template.html b/Core/src/org/sleuthkit/autopsy/timeline/snapshot/snapshot_template.html old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/snapshot/summary.css b/Core/src/org/sleuthkit/autopsy/timeline/snapshot/summary.css old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/snapshot/summary_template.html b/Core/src/org/sleuthkit/autopsy/timeline/snapshot/summary_template.html old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/AbstractFXCellFactory.java b/Core/src/org/sleuthkit/autopsy/timeline/ui/AbstractFXCellFactory.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/AbstractTimeLineView.java b/Core/src/org/sleuthkit/autopsy/timeline/ui/AbstractTimeLineView.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/AbstractTimelineChart.java b/Core/src/org/sleuthkit/autopsy/timeline/ui/AbstractTimelineChart.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/Bundle.properties b/Core/src/org/sleuthkit/autopsy/timeline/ui/Bundle.properties old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/timeline/ui/Bundle_ja.properties old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/ContextMenuProvider.java b/Core/src/org/sleuthkit/autopsy/timeline/ui/ContextMenuProvider.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/HistoryToolBar.fxml b/Core/src/org/sleuthkit/autopsy/timeline/ui/HistoryToolBar.fxml old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/HistoryToolBar.java b/Core/src/org/sleuthkit/autopsy/timeline/ui/HistoryToolBar.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/IntervalSelector.css b/Core/src/org/sleuthkit/autopsy/timeline/ui/IntervalSelector.css old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/IntervalSelector.fxml b/Core/src/org/sleuthkit/autopsy/timeline/ui/IntervalSelector.fxml old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/IntervalSelector.java b/Core/src/org/sleuthkit/autopsy/timeline/ui/IntervalSelector.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/NoEventsDialog.fxml b/Core/src/org/sleuthkit/autopsy/timeline/ui/NoEventsDialog.fxml old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/StatusBar.fxml b/Core/src/org/sleuthkit/autopsy/timeline/ui/StatusBar.fxml old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/StatusBar.java b/Core/src/org/sleuthkit/autopsy/timeline/ui/StatusBar.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/TimeLineChart.java b/Core/src/org/sleuthkit/autopsy/timeline/ui/TimeLineChart.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/TimeZonePanel.fxml b/Core/src/org/sleuthkit/autopsy/timeline/ui/TimeZonePanel.fxml old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/TimeZonePanel.java b/Core/src/org/sleuthkit/autopsy/timeline/ui/TimeZonePanel.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/ViewFrame.fxml b/Core/src/org/sleuthkit/autopsy/timeline/ui/ViewFrame.fxml old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/ViewFrame.java b/Core/src/org/sleuthkit/autopsy/timeline/ui/ViewFrame.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/ZoomRanges.java b/Core/src/org/sleuthkit/autopsy/timeline/ui/ZoomRanges.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/countsview/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/timeline/ui/countsview/Bundle_ja.properties old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/countsview/CountsViewPane.java b/Core/src/org/sleuthkit/autopsy/timeline/ui/countsview/CountsViewPane.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/countsview/CountsViewSettingsPane.fxml b/Core/src/org/sleuthkit/autopsy/timeline/ui/countsview/CountsViewSettingsPane.fxml old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/countsview/EventCountsChart.java b/Core/src/org/sleuthkit/autopsy/timeline/ui/countsview/EventCountsChart.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/Bundle_ja.properties old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/DateAxis.java b/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/DateAxis.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/DescriptionVisibility.java b/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/DescriptionVisibility.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/DetailViewPane.java b/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/DetailViewPane.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/DetailViewSettingsPane.fxml b/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/DetailViewSettingsPane.fxml old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/DetailsChart.java b/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/DetailsChart.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/DetailsChartLane.java b/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/DetailsChartLane.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/DetailsChartLayoutSettings.java b/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/DetailsChartLayoutSettings.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/EventAxis.java b/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/EventAxis.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/EventClusterNode.java b/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/EventClusterNode.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/EventNodeBase.java b/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/EventNodeBase.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/EventStripeNode.java b/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/EventStripeNode.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/EventsDetailsChart.css b/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/EventsDetailsChart.css old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/GuideLine.java b/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/GuideLine.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/HideDescriptionAction.java b/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/HideDescriptionAction.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/MultiEventNodeBase.java b/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/MultiEventNodeBase.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/PinnedEventsChartLane.java b/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/PinnedEventsChartLane.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/PrimaryDetailsChartLane.java b/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/PrimaryDetailsChartLane.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/ScrollingLaneWrapper.java b/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/ScrollingLaneWrapper.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/SingleEventNode.java b/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/SingleEventNode.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/StripeFlattener.java b/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/StripeFlattener.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/UnhideDescriptionAction.java b/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/UnhideDescriptionAction.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/tree/BaseTypeTreeItem.java b/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/tree/BaseTypeTreeItem.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/tree/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/tree/Bundle_ja.properties old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/tree/DescriptionTreeItem.java b/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/tree/DescriptionTreeItem.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/tree/EventTypeTreeItem.java b/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/tree/EventTypeTreeItem.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/tree/EventsTree.fxml b/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/tree/EventsTree.fxml old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/tree/EventsTree.java b/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/tree/EventsTree.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/tree/EventsTreeItem.java b/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/tree/EventsTreeItem.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/tree/RootItem.java b/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/tree/RootItem.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/tree/SubTypeTreeItem.java b/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/tree/SubTypeTreeItem.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/tree/TreeComparator.java b/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/tree/TreeComparator.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/filtering/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/timeline/ui/filtering/Bundle_ja.properties old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/filtering/FilterCheckBoxCellFactory.java b/Core/src/org/sleuthkit/autopsy/timeline/ui/filtering/FilterCheckBoxCellFactory.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/filtering/FilterSetPanel.fxml b/Core/src/org/sleuthkit/autopsy/timeline/ui/filtering/FilterSetPanel.fxml old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/filtering/FilterSetPanel.java b/Core/src/org/sleuthkit/autopsy/timeline/ui/filtering/FilterSetPanel.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/filtering/FilterTable.css b/Core/src/org/sleuthkit/autopsy/timeline/ui/filtering/FilterTable.css old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/filtering/FilterTreeItem.java b/Core/src/org/sleuthkit/autopsy/timeline/ui/filtering/FilterTreeItem.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/filtering/FilterTreeTableRow.java b/Core/src/org/sleuthkit/autopsy/timeline/ui/filtering/FilterTreeTableRow.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/filtering/LegendCell.java b/Core/src/org/sleuthkit/autopsy/timeline/ui/filtering/LegendCell.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/listvew/ListTimeline.fxml b/Core/src/org/sleuthkit/autopsy/timeline/ui/listvew/ListTimeline.fxml old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/listvew/ListTimeline.java b/Core/src/org/sleuthkit/autopsy/timeline/ui/listvew/ListTimeline.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/listvew/ListViewPane.java b/Core/src/org/sleuthkit/autopsy/timeline/ui/listvew/ListViewPane.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/listvew/SwingFXMenuUtils.java b/Core/src/org/sleuthkit/autopsy/timeline/ui/listvew/SwingFXMenuUtils.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/utils/IntervalUtils.java b/Core/src/org/sleuthkit/autopsy/timeline/utils/IntervalUtils.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/utils/MappedList.java b/Core/src/org/sleuthkit/autopsy/timeline/utils/MappedList.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/utils/RangeDivisionInfo.java b/Core/src/org/sleuthkit/autopsy/timeline/utils/RangeDivisionInfo.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/zooming/Bundle.properties b/Core/src/org/sleuthkit/autopsy/timeline/zooming/Bundle.properties old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/zooming/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/timeline/zooming/Bundle_ja.properties old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/zooming/DescriptionLoD.java b/Core/src/org/sleuthkit/autopsy/timeline/zooming/DescriptionLoD.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/zooming/DisplayNameProvider.java b/Core/src/org/sleuthkit/autopsy/timeline/zooming/DisplayNameProvider.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/zooming/EventTypeZoomLevel.java b/Core/src/org/sleuthkit/autopsy/timeline/zooming/EventTypeZoomLevel.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/zooming/TimeUnits.java b/Core/src/org/sleuthkit/autopsy/timeline/zooming/TimeUnits.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/zooming/ZoomParams.java b/Core/src/org/sleuthkit/autopsy/timeline/zooming/ZoomParams.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/zooming/ZoomSettingsPane.fxml b/Core/src/org/sleuthkit/autopsy/timeline/zooming/ZoomSettingsPane.fxml old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/timeline/zooming/ZoomSettingsPane.java b/Core/src/org/sleuthkit/autopsy/timeline/zooming/ZoomSettingsPane.java old mode 100644 new mode 100755 diff --git a/Core/updates_ja.xml b/Core/updates_ja.xml old mode 100644 new mode 100755 diff --git a/CoreLibs/build-mac.xml b/CoreLibs/build-mac.xml old mode 100644 new mode 100755 diff --git a/CoreLibs/build-unix.xml b/CoreLibs/build-unix.xml old mode 100644 new mode 100755 diff --git a/CoreLibs/build-windows.xml b/CoreLibs/build-windows.xml old mode 100644 new mode 100755 diff --git a/CoreLibs/build.xml b/CoreLibs/build.xml old mode 100644 new mode 100755 diff --git a/CoreLibs/ivy.xml b/CoreLibs/ivy.xml old mode 100644 new mode 100755 diff --git a/CoreLibs/ivysettings.xml b/CoreLibs/ivysettings.xml old mode 100644 new mode 100755 diff --git a/CoreLibs/manifest.mf b/CoreLibs/manifest.mf old mode 100644 new mode 100755 diff --git a/CoreLibs/nbproject/build-impl.xml b/CoreLibs/nbproject/build-impl.xml old mode 100644 new mode 100755 diff --git a/CoreLibs/nbproject/project.properties b/CoreLibs/nbproject/project.properties old mode 100644 new mode 100755 diff --git a/CoreLibs/nbproject/project.xml b/CoreLibs/nbproject/project.xml old mode 100644 new mode 100755 diff --git a/CoreLibs/nbproject/suite.properties b/CoreLibs/nbproject/suite.properties old mode 100644 new mode 100755 diff --git a/CoreLibs/src/org/sleuthkit/autopsy/corelibs/Bundle.properties b/CoreLibs/src/org/sleuthkit/autopsy/corelibs/Bundle.properties old mode 100644 new mode 100755 diff --git a/CoreLibs/src/org/sleuthkit/autopsy/corelibs/Bundle_ja.properties b/CoreLibs/src/org/sleuthkit/autopsy/corelibs/Bundle_ja.properties old mode 100644 new mode 100755 diff --git a/CoreLibs/src/org/sleuthkit/autopsy/corelibs/ScalrWrapper.java b/CoreLibs/src/org/sleuthkit/autopsy/corelibs/ScalrWrapper.java old mode 100644 new mode 100755 diff --git a/CoreLibs/src/org/sleuthkit/autopsy/corelibs/SigarLoader.java b/CoreLibs/src/org/sleuthkit/autopsy/corelibs/SigarLoader.java old mode 100644 new mode 100755 diff --git a/Experimental/build.xml b/Experimental/build.xml old mode 100644 new mode 100755 diff --git a/Experimental/ivy.xml b/Experimental/ivy.xml old mode 100644 new mode 100755 diff --git a/Experimental/ivysettings.xml b/Experimental/ivysettings.xml old mode 100644 new mode 100755 diff --git a/Experimental/manifest.mf b/Experimental/manifest.mf old mode 100644 new mode 100755 index a53adc8642..cafb630948 --- a/Experimental/manifest.mf +++ b/Experimental/manifest.mf @@ -3,5 +3,4 @@ AutoUpdate-Show-In-Client: true OpenIDE-Module: org.sleuthkit.autopsy.experimental OpenIDE-Module-Layer: org/sleuthkit/autopsy/experimental/autoingest/layer.xml OpenIDE-Module-Localizing-Bundle: org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties -OpenIDE-Module-Requires: org.openide.windows.WindowManager OpenIDE-Module-Specification-Version: 1.0 diff --git a/Experimental/nbproject/build-impl.xml b/Experimental/nbproject/build-impl.xml old mode 100644 new mode 100755 diff --git a/Experimental/nbproject/project.properties b/Experimental/nbproject/project.properties old mode 100644 new mode 100755 diff --git a/Experimental/nbproject/project.xml b/Experimental/nbproject/project.xml old mode 100644 new mode 100755 index fe85da26ba..280fbc431b --- a/Experimental/nbproject/project.xml +++ b/Experimental/nbproject/project.xml @@ -24,15 +24,6 @@ 1.44.1
- - org.netbeans.modules.settings - - - - 1 - 1.49.1 - - org.openide.awt diff --git a/Experimental/nbproject/suite.properties b/Experimental/nbproject/suite.properties old mode 100644 new mode 100755 diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/ArchiveUtil.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/ArchiveUtil.java old mode 100644 new mode 100755 diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestAlertFile.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestAlertFile.java old mode 100644 new mode 100755 diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestCase.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestCase.java old mode 100644 new mode 100755 diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestCaseDeletedEvent.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestCaseDeletedEvent.java old mode 100644 new mode 100755 diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestCaseManager.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestCaseManager.java old mode 100644 new mode 100755 diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestCaseOpenAction.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestCaseOpenAction.java old mode 100644 new mode 100755 diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestCasePanel.form b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestCasePanel.form old mode 100644 new mode 100755 diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestCasePanel.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestCasePanel.java old mode 100644 new mode 100755 diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestCasePrioritizedEvent.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestCasePrioritizedEvent.java old mode 100644 new mode 100755 diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.form b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.form index 26e14e2176..b1d90f4479 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.form +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.form @@ -235,6 +235,9 @@ + + + @@ -245,6 +248,9 @@ + + + @@ -285,6 +291,9 @@ + + + @@ -295,6 +304,9 @@ + + + @@ -319,6 +331,9 @@ + + + @@ -329,6 +344,9 @@ + + + @@ -339,16 +357,22 @@ + + + - + - + + + + @@ -359,6 +383,9 @@ + + + @@ -396,6 +423,9 @@ + + + @@ -427,6 +457,9 @@ + + + @@ -434,6 +467,9 @@ + + + diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java index 875cf9d46f..157d371eed 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java @@ -1,7 +1,7 @@ /* * Autopsy Forensic Browser * - * Copyright 2015-2017 Basis Technology Corp. + * Copyright 2015 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -20,7 +20,9 @@ package org.sleuthkit.autopsy.experimental.autoingest; import com.google.common.util.concurrent.ThreadFactoryBuilder; import java.awt.Cursor; +import java.awt.Desktop; import java.awt.EventQueue; +import java.io.IOException; import java.nio.file.Path; import java.nio.file.Paths; import java.time.Instant; @@ -36,6 +38,7 @@ import java.util.logging.Level; import javax.swing.DefaultListSelectionModel; import java.awt.Color; import java.beans.PropertyChangeEvent; +import java.io.File; import java.util.Collections; import java.util.logging.Logger; import javax.swing.JOptionPane; @@ -46,12 +49,25 @@ import javax.swing.UIManager; import javax.swing.event.ListSelectionEvent; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableColumn; +import org.netbeans.api.options.OptionsDisplayer; +import org.openide.DialogDisplayer; import org.openide.LifecycleManager; +import org.openide.NotifyDescriptor; +import org.openide.filesystems.FileObject; +import org.openide.filesystems.FileUtil; import org.openide.util.NbBundle; +import org.openide.util.actions.CallableSystemAction; import org.openide.windows.WindowManager; +import org.sleuthkit.autopsy.casemodule.CaseNewAction; +import org.sleuthkit.autopsy.casemodule.CaseOpenAction; import org.sleuthkit.autopsy.core.ServicesMonitor; +import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil; import org.sleuthkit.autopsy.coreutils.NetworkUtils; +import org.sleuthkit.autopsy.coreutils.PlatformUtil; import org.sleuthkit.autopsy.ingest.IngestManager; +import org.sleuthkit.autopsy.ingest.IngestProgressSnapshotDialog; +import org.sleuthkit.autopsy.experimental.autoingest.AutoIngestManager.CaseDeletionResult; +import org.sleuthkit.autopsy.experimental.autoingest.AutoIngestManager.JobsSnapshot; /** * A panel for monitoring automated ingest by a cluster, and for controlling @@ -89,6 +105,7 @@ public final class AutoIngestDashboard extends JPanel implements Observer { private final DefaultTableModel pendingTableModel; private final DefaultTableModel runningTableModel; private final DefaultTableModel completedTableModel; + private AutoIngestManager manager; private ExecutorService updateExecutor; private boolean isPaused; private boolean autoIngestStarted; @@ -167,6 +184,8 @@ public final class AutoIngestDashboard extends JPanel implements Observer { private AutoIngestDashboard() { //Disable the main window so they can only use the dashboard (if we used setVisible the taskBar icon would go away) WindowManager.getDefault().getMainWindow().setEnabled(false); + + manager = AutoIngestManager.getInstance(); pendingTableModel = new DefaultTableModel(JobsTableModelColumns.headers, 0) { private static final long serialVersionUID = 1L; @@ -571,7 +590,28 @@ public final class AutoIngestDashboard extends JPanel implements Observer { */ private void startUp() { - autoIngestStarted = true; + /* + * Starts up the auto ingest manager (AIM). + */ + try { + manager.startUp(); + autoIngestStarted = true; + } catch (AutoIngestManager.AutoIngestManagerStartupException ex) { + SYS_LOGGER.log(Level.SEVERE, "Dashboard error starting up auto ingest", ex); + tbStatusMessage.setText(NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.AutoIngestStartupError")); + manager = null; + + JOptionPane.showMessageDialog(this, + NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.AutoIngestStartupFailed.Message"), + NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.AutoIngestStartupFailed.Title"), + JOptionPane.ERROR_MESSAGE); + bnOptions.setEnabled(true); + + /* + * If the AIM cannot be started, there is nothing more to do. + */ + return; + } /* * Subscribe to services monitor events. @@ -580,11 +620,17 @@ public final class AutoIngestDashboard extends JPanel implements Observer { setServicesStatusMessage(); }); + /* + * Register with the AIM as an observer. + */ + manager.addObserver(this); + /* * Populate the pending, running, and completed auto ingest job tables. */ updateExecutor = Executors.newSingleThreadExecutor(new ThreadFactoryBuilder().setNameFormat(UPDATE_TASKS_THREAD_NAME).build()); updateExecutor.submit(new UpdateAllJobsTablesTask()); + manager.scanInputDirsNow(); //bnPause.setEnabled(true); bnPause.setText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnPause.text")); @@ -613,7 +659,7 @@ public final class AutoIngestDashboard extends JPanel implements Observer { NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.Cancel")}; int reply = JOptionPane.OK_OPTION; - if (IngestManager.getInstance().isIngestRunning()) { + if (null != manager && IngestManager.getInstance().isIngestRunning()) { reply = JOptionPane.showOptionDialog(this, NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.ExitConsequences"), NbBundle.getMessage(AutoIngestDashboard.class, "ConfirmationDialog.ConfirmExitHeader"), @@ -638,6 +684,13 @@ public final class AutoIngestDashboard extends JPanel implements Observer { updateExecutor.shutdownNow(); } + /* + * Stop observing the auto ingest manager (AIM). + */ + if (null != manager) { + manager.deleteObserver(this); + } + /* * Shut down the AIM and close. */ @@ -645,6 +698,9 @@ public final class AutoIngestDashboard extends JPanel implements Observer { @Override protected Void doInBackground() throws Exception { + if (null != manager) { + manager.shutDown(); + } return null; } @@ -751,6 +807,7 @@ public final class AutoIngestDashboard extends JPanel implements Observer { * Ask the auto ingest manager to pause when it completes the * currently running job, if any. */ + manager.pause(); bnRefresh.setEnabled(false); } } @@ -778,6 +835,11 @@ public final class AutoIngestDashboard extends JPanel implements Observer { */ pendingTable.setBackground(pendingTableBackground); pendingTable.setForeground(pendingTablelForeground); + + /** + * Ask the auto ingest manager to resume processing. + */ + manager.resume(); } /** @@ -793,6 +855,7 @@ public final class AutoIngestDashboard extends JPanel implements Observer { @Override public void run() { List pendingJobs = new ArrayList<>(); + manager.getJobs(pendingJobs, null, null); EventQueue.invokeLater(new RefreshComponentsTask(pendingJobs, null, null)); } } @@ -810,6 +873,7 @@ public final class AutoIngestDashboard extends JPanel implements Observer { @Override public void run() { List runningJobs = new ArrayList<>(); + manager.getJobs(null, runningJobs, null); EventQueue.invokeLater(new RefreshComponentsTask(null, runningJobs, null)); } } @@ -833,6 +897,7 @@ public final class AutoIngestDashboard extends JPanel implements Observer { List pendingJobs = new ArrayList<>(); List runningJobs = new ArrayList<>(); List completedJobs = new ArrayList<>(); + manager.getJobs(pendingJobs, runningJobs, completedJobs); // Sort the completed jobs list by completed date Collections.sort(completedJobs, new AutoIngestJob.ReverseDateCompletedComparator()); EventQueue.invokeLater(new RefreshComponentsTask(pendingJobs, runningJobs, completedJobs)); @@ -1019,6 +1084,10 @@ public final class AutoIngestDashboard extends JPanel implements Observer { * Get the current lists of jobs and update the UI. */ private void refreshTables(){ + JobsSnapshot jobsSnapshot = manager.getCurrentJobsSnapshot(); + refreshTable(jobsSnapshot.getCompletedJobs(), completedTableModel, null); + refreshTable(jobsSnapshot.getPendingJobs(), pendingTableModel, null); + refreshTable(jobsSnapshot.getRunningJobs(), runningTableModel, null); } /** @@ -1113,9 +1182,19 @@ public final class AutoIngestDashboard extends JPanel implements Observer { org.openide.awt.Mnemonics.setLocalizedText(bnCancelJob, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnCancelJob.text")); // NOI18N bnCancelJob.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnCancelJob.toolTipText")); // NOI18N + bnCancelJob.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + bnCancelJobActionPerformed(evt); + } + }); org.openide.awt.Mnemonics.setLocalizedText(bnDeleteCase, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnDeleteCase.text")); // NOI18N bnDeleteCase.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnDeleteCase.toolTipText")); // NOI18N + bnDeleteCase.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + bnDeleteCaseActionPerformed(evt); + } + }); lbPending.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N org.openide.awt.Mnemonics.setLocalizedText(lbPending, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.lbPending.text")); // NOI18N @@ -1128,9 +1207,19 @@ public final class AutoIngestDashboard extends JPanel implements Observer { org.openide.awt.Mnemonics.setLocalizedText(bnRefresh, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnRefresh.text")); // NOI18N bnRefresh.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnRefresh.toolTipText")); // NOI18N + bnRefresh.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + bnRefreshActionPerformed(evt); + } + }); org.openide.awt.Mnemonics.setLocalizedText(bnCancelModule, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnCancelModule.text")); // NOI18N bnCancelModule.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnCancelModule.toolTipText")); // NOI18N + bnCancelModule.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + bnCancelModuleActionPerformed(evt); + } + }); org.openide.awt.Mnemonics.setLocalizedText(bnExit, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnExit.text")); // NOI18N bnExit.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnExit.toolTipText")); // NOI18N @@ -1143,18 +1232,43 @@ public final class AutoIngestDashboard extends JPanel implements Observer { org.openide.awt.Mnemonics.setLocalizedText(bnOptions, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnOptions.text")); // NOI18N bnOptions.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnOptions.toolTipText")); // NOI18N bnOptions.setEnabled(false); + bnOptions.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + bnOptionsActionPerformed(evt); + } + }); org.openide.awt.Mnemonics.setLocalizedText(bnShowProgress, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnShowProgress.text")); // NOI18N bnShowProgress.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnShowProgress.toolTipText")); // NOI18N + bnShowProgress.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + bnShowProgressActionPerformed(evt); + } + }); org.openide.awt.Mnemonics.setLocalizedText(bnPause, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnPause.text")); // NOI18N bnPause.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnPause.toolTipText")); // NOI18N + bnPause.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + bnPauseActionPerformed(evt); + } + }); - org.openide.awt.Mnemonics.setLocalizedText(bnPrioritizeCase, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnPrioritizeCase.text_1")); // NOI18N - bnPrioritizeCase.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnPrioritizeCase.toolTipText_1")); // NOI18N + org.openide.awt.Mnemonics.setLocalizedText(bnPrioritizeCase, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnPrioritizeCase.text")); // NOI18N + bnPrioritizeCase.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnPrioritizeCase.toolTipText")); // NOI18N + bnPrioritizeCase.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + bnPrioritizeCaseActionPerformed(evt); + } + }); org.openide.awt.Mnemonics.setLocalizedText(bnShowCaseLog, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnShowCaseLog.text")); // NOI18N bnShowCaseLog.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnShowCaseLog.toolTipText")); // NOI18N + bnShowCaseLog.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + bnShowCaseLogActionPerformed(evt); + } + }); tbStatusMessage.setEditable(false); tbStatusMessage.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N @@ -1167,6 +1281,11 @@ public final class AutoIngestDashboard extends JPanel implements Observer { org.openide.awt.Mnemonics.setLocalizedText(bnPrioritizeJob, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnPrioritizeJob.text")); // NOI18N bnPrioritizeJob.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnPrioritizeJob.toolTipText")); // NOI18N bnPrioritizeJob.setActionCommand(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnPrioritizeJob.actionCommand")); // NOI18N + bnPrioritizeJob.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + bnPrioritizeJobActionPerformed(evt); + } + }); lbServicesStatus.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N org.openide.awt.Mnemonics.setLocalizedText(lbServicesStatus, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.lbServicesStatus.text")); // NOI18N @@ -1177,8 +1296,18 @@ public final class AutoIngestDashboard extends JPanel implements Observer { tbServicesStatusMessage.setBorder(null); org.openide.awt.Mnemonics.setLocalizedText(bnOpenLogDir, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnOpenLogDir.text")); // NOI18N + bnOpenLogDir.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + bnOpenLogDirActionPerformed(evt); + } + }); org.openide.awt.Mnemonics.setLocalizedText(bnReprocessJob, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnReprocessJob.text")); // NOI18N + bnReprocessJob.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + bnReprocessJobActionPerformed(evt); + } + }); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); @@ -1298,6 +1427,179 @@ public final class AutoIngestDashboard extends JPanel implements Observer { }// //GEN-END:initComponents + /** + * Handles a click on the refresh button. Requests an immediate scan of the + * input folders for new jobs and queues a refresh of all three of the jobs + * tables. + * + * @param evt - The button click event. + */ + private void bnRefreshActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnRefreshActionPerformed + this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + manager.scanInputDirsAndWait(); + refreshTables(); + this.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); + }//GEN-LAST:event_bnRefreshActionPerformed + + /** + * Handles a click on the delete case button. If an entry is selected that + * can be deleted, pops up a confirmation dialog. Upon confirmation, asks + * AutoIngestManager to delete the entry and asks for an updated view. + * + * @param evt The button click event. + */ + private void bnDeleteCaseActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnDeleteCaseActionPerformed + if (completedTableModel.getRowCount() < 0 || completedTable.getSelectedRow() < 0) { + return; + } + + String caseName = (String) completedTable.getValueAt(completedTable.getSelectedRow(), JobsTableModelColumns.CASE.ordinal()); + Object[] options = { + org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "ConfirmationDialog.Delete"), + org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "ConfirmationDialog.DoNotDelete") + }; + Object[] msgContent = {org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "ConfirmationDialog.DeleteAreYouSure") + "\"" + caseName + "\"?"}; + int reply = JOptionPane.showOptionDialog(this, + msgContent, + org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "ConfirmationDialog.ConfirmDeletionHeader"), + JOptionPane.DEFAULT_OPTION, + JOptionPane.WARNING_MESSAGE, + null, + options, + options[JOptionPane.NO_OPTION]); + if (reply == JOptionPane.YES_OPTION) { + bnDeleteCase.setEnabled(false); + bnShowCaseLog.setEnabled(false); + if (completedTableModel.getRowCount() > 0 && completedTable.getSelectedRow() >= 0) { + Path caseDirectoryPath = (Path) completedTableModel.getValueAt(completedTable.getSelectedRow(), JobsTableModelColumns.CASE_DIRECTORY_PATH.ordinal()); + completedTable.clearSelection(); + this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + CaseDeletionResult result = manager.deleteCase(caseName, caseDirectoryPath); + refreshTables(); + this.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); + if (CaseDeletionResult.FAILED == result) { + JOptionPane.showMessageDialog(this, + String.format("Could not delete case %s. It may be in in use.", caseName), + org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.DeletionFailed"), + JOptionPane.INFORMATION_MESSAGE); + } else if (CaseDeletionResult.PARTIALLY_DELETED == result) { + JOptionPane.showMessageDialog(this, + String.format("Could not delete case %s. See system log for details.", caseName), + org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.DeletionFailed"), + JOptionPane.INFORMATION_MESSAGE); + } + } + } + }//GEN-LAST:event_bnDeleteCaseActionPerformed + + /** + * Handles a click on the cancel auto ingest job button. Cancels the + * selected job. + * + * @param evt The button click event. + */ + private void bnCancelJobActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnCancelJobActionPerformed + Object[] options = { + org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "ConfirmationDialog.CancelJob"), + org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "ConfirmationDialog.DoNotCancelJob")}; + int reply = JOptionPane.showOptionDialog(this, + NbBundle.getMessage(AutoIngestDashboard.class, "ConfirmationDialog.CancelJobAreYouSure"), + NbBundle.getMessage(AutoIngestDashboard.class, "ConfirmationDialog.ConfirmCancellationHeader"), + JOptionPane.DEFAULT_OPTION, + JOptionPane.WARNING_MESSAGE, + null, + options, + options[1]); + if (reply == 0) { + /* + * Call setCursor on this to ensure it appears (if there is time to + * see it). + */ + this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + manager.cancelCurrentJob(); + refreshTables(); + this.setCursor(Cursor.getDefaultCursor()); + } + }//GEN-LAST:event_bnCancelJobActionPerformed + + /** + * Handles a click on the show auto ingest job progress button. Displays an + * ingest job progress panel. + * + * @param evt The button click event. + */ + private void bnShowProgressActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnShowProgressActionPerformed + IngestProgressSnapshotDialog dialog = new IngestProgressSnapshotDialog(this.getTopLevelAncestor(), true); + }//GEN-LAST:event_bnShowProgressActionPerformed + + /** + * Handles a click on the pause/resume auto ingest job button. Sends a + * pause/resume request to the auto ingest manager. + * + * @param evt The button click event. + */ + private void bnPauseActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnPauseActionPerformed + + if (!autoIngestStarted) { + //put up a wait cursor during the start up operation + this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + + startUp(); + + this.setCursor(null); + //done for startup + return; + } + if (!isPaused) { + tbStatusMessage.setText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnPause.pausing")); + pause(true); + } else { + resume(); + } + isPaused = !isPaused; + }//GEN-LAST:event_bnPauseActionPerformed + + /** + * Handles a click on the options button. Displays the options window. + * + * @param evt The button click event. + */ + private void bnOptionsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnOptionsActionPerformed + setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + OptionsDisplayer.getDefault().open(); + setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); + }//GEN-LAST:event_bnOptionsActionPerformed + + /** + * Handles a click on the cancel ingest module button. Cancels the currently + * running data source level ingest module for the selected job. + * + * @param evt The button click event. + */ + private void bnCancelModuleActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnCancelModuleActionPerformed + Object[] options = { + org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "ConfirmationDialog.CancelModule"), + org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "ConfirmationDialog.DoNotCancelModule")}; + int reply = JOptionPane.showOptionDialog(this, + NbBundle.getMessage(AutoIngestDashboard.class, "ConfirmationDialog.CancelModuleAreYouSure"), + NbBundle.getMessage(AutoIngestDashboard.class, "ConfirmationDialog.ConfirmCancellationHeader"), + JOptionPane.DEFAULT_OPTION, + JOptionPane.WARNING_MESSAGE, + null, + options, + options[1]); + if (reply == 0) { + /* + * Call setCursor on this to ensure it appears (if there is time to + * see it). + */ + this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + manager.cancelCurrentDataSourceLevelIngestModule(); + refreshTables(); + this.setCursor(Cursor.getDefaultCursor()); + } + }//GEN-LAST:event_bnCancelModuleActionPerformed + /** * Handles a click on the exit button. Shuts down auto ingest. * @@ -1307,6 +1609,96 @@ public final class AutoIngestDashboard extends JPanel implements Observer { shutdown(); }//GEN-LAST:event_bnExitActionPerformed + /** + * Handle a click on the prioritize case button. Requests prioritization of + * all of the auto ingest jobs for a case. + * + * @param evt The button click event. + */ + private void bnPrioritizeCaseActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnPrioritizeCaseActionPerformed + if (pendingTableModel.getRowCount() > 0 && pendingTable.getSelectedRow() >= 0) { + this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + String caseName = (pendingTableModel.getValueAt(pendingTable.getSelectedRow(), JobsTableModelColumns.CASE.ordinal())).toString(); + manager.prioritizeCase(caseName); + refreshTables(); + pendingTable.clearSelection(); + enablePendingTableButtons(false); + AutoIngestDashboard.this.setCursor(Cursor.getDefaultCursor()); + } + }//GEN-LAST:event_bnPrioritizeCaseActionPerformed + + /** + * Handles a click on the show log button. Displays the auto ingest job log + * for a case in NotePad. + * + * @param evt The button click event. + */ + private void bnShowCaseLogActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnShowCaseLogActionPerformed + try { + int selectedRow = completedTable.getSelectedRow(); + if (selectedRow != -1) { + Path caseDirectoryPath = (Path) completedTableModel.getValueAt(selectedRow, JobsTableModelColumns.CASE_DIRECTORY_PATH.ordinal()); + if (null != caseDirectoryPath) { + Path pathToLog = AutoIngestJobLogger.getLogPath(caseDirectoryPath); + if (pathToLog.toFile().exists()) { + Desktop.getDesktop().edit(pathToLog.toFile()); + } else { + JOptionPane.showMessageDialog(this, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.ShowLogFailed.Message"), + org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.ShowLogFailed.Title"), JOptionPane.ERROR_MESSAGE); + } + } else { + MessageNotifyUtil.Message.warn("The case directory for this job has been deleted."); + } + } + } catch (IOException ex) { + SYS_LOGGER.log(Level.SEVERE, "Dashboard error attempting to display case auto ingest log", ex); + Object[] options = {org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "DisplayLogDialog.okay")}; + JOptionPane.showOptionDialog(this, + org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "DisplayLogDialog.cannotFindLog"), + org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "DisplayLogDialog.unableToShowLogFile"), + JOptionPane.DEFAULT_OPTION, + JOptionPane.PLAIN_MESSAGE, + null, + options, + options[0]); + } + }//GEN-LAST:event_bnShowCaseLogActionPerformed + + private void bnPrioritizeJobActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnPrioritizeJobActionPerformed + if (pendingTableModel.getRowCount() > 0 && pendingTable.getSelectedRow() >= 0) { + this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + Path manifestFilePath = (Path) (pendingTableModel.getValueAt(pendingTable.getSelectedRow(), JobsTableModelColumns.MANIFEST_FILE_PATH.ordinal())); + manager.prioritizeJob(manifestFilePath); + refreshTables(); + pendingTable.clearSelection(); + enablePendingTableButtons(false); + AutoIngestDashboard.this.setCursor(Cursor.getDefaultCursor()); + } + }//GEN-LAST:event_bnPrioritizeJobActionPerformed + + private void bnOpenLogDirActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnOpenLogDirActionPerformed + Path logDirPath = Paths.get(PlatformUtil.getUserDirectory().getAbsolutePath(), "var", "log"); + File logDir = logDirPath.toFile(); + try { + Desktop.getDesktop().open(logDir); + } catch (IOException ex) { + DialogDisplayer.getDefault().notify(new NotifyDescriptor.Message( + String.format("Unable to open log directory %s:\n%s", logDirPath, ex.getLocalizedMessage()), + NotifyDescriptor.ERROR_MESSAGE)); + } + }//GEN-LAST:event_bnOpenLogDirActionPerformed + + private void bnReprocessJobActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnReprocessJobActionPerformed + if (completedTableModel.getRowCount() < 0 || completedTable.getSelectedRow() < 0) { + return; + } + this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + Path manifestPath = (Path) completedTableModel.getValueAt(completedTable.getSelectedRow(), JobsTableModelColumns.MANIFEST_FILE_PATH.ordinal()); + manager.reprocessJob(manifestPath); + refreshTables(); + AutoIngestDashboard.this.setCursor(Cursor.getDefaultCursor()); + }//GEN-LAST:event_bnReprocessJobActionPerformed + // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton bnCancelJob; private javax.swing.JButton bnCancelModule; diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardOpenAction.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardOpenAction.java deleted file mode 100755 index 7142f3be01..0000000000 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardOpenAction.java +++ /dev/null @@ -1,115 +0,0 @@ -/* -* Autopsy Forensic Browser -* -* Copyright 2017 Basis Technology Corp. -* Contact: carrier sleuthkit org -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ -package org.sleuthkit.autopsy.experimental.autoingest; - -import java.awt.Component; -import java.beans.PropertyChangeEvent; -import java.beans.PropertyChangeListener; -import javax.swing.ImageIcon; -import javax.swing.JButton; -import org.openide.awt.ActionID; -import org.openide.awt.ActionReference; -import org.openide.awt.ActionReferences; -import org.openide.awt.ActionRegistration; -import org.openide.util.HelpCtx; -import org.openide.util.NbBundle.Messages; -import org.openide.util.actions.CallableSystemAction; -import org.openide.util.actions.Presenter; -import org.sleuthkit.autopsy.casemodule.Case; -import org.sleuthkit.autopsy.core.RuntimeProperties; -import org.sleuthkit.autopsy.core.UserPreferences; -import static org.sleuthkit.autopsy.core.UserPreferences.SelectedMode.REVIEW; -import org.sleuthkit.autopsy.coreutils.Logger; - -@ActionID(category = "Tools", id = "org.sleuthkit.autopsy.experimental.autoingest.AutoIngestDashboardOpenAction") -@ActionReferences(value = { - @ActionReference(path = "Menu/Tools", position = 104), - @ActionReference(path = "Toolbars/Case", position = 104) -}) -@ActionRegistration(displayName = "#CTL_AutoIngestDashboardOpenAction", lazy = false) -@Messages({"CTL_AutoIngestDashboardOpenAction=Auto Ingest Dashboard"}) -public final class AutoIngestDashboardOpenAction extends CallableSystemAction implements Presenter.Toolbar { - - private static final Logger LOGGER = Logger.getLogger(AutoIngestDashboardOpenAction.class.getName()); - private static final String VIEW_IMAGES_VIDEOS = Bundle.CTL_AutoIngestDashboardOpenAction(); - - private final JButton toolbarButton = new JButton(); - private final PropertyChangeListener pcl; - - public AutoIngestDashboardOpenAction() { - super(); - toolbarButton.addActionListener(actionEvent -> performAction()); - pcl = (PropertyChangeEvent evt) -> { - if (evt.getPropertyName().equals(Case.Events.CURRENT_CASE.toString())) { - setEnabled(RuntimeProperties.runningWithGUI() && evt.getNewValue() != null); - } - }; - Case.addPropertyChangeListener(pcl); - this.setEnabled(false); - } - - @Override - public boolean isEnabled() { - UserPreferences.SelectedMode mode = UserPreferences.getMode(); - return (mode == REVIEW); - } - - /** Returns the toolbar component of this action - * - * @return component the toolbar button */ - @Override - public Component getToolbarPresenter() { - ImageIcon icon = new ImageIcon(getClass().getResource("btn_icon_image_gallery_26.png")); //NON-NLS - toolbarButton.setIcon(icon); - toolbarButton.setText(this.getName()); - return toolbarButton; - } - - /** - * Set this action to be enabled/disabled - * - * @param value whether to enable this action or not - */ - @Override - public void setEnabled(boolean value) { - super.setEnabled(value); - toolbarButton.setEnabled(value); - } - - @Override - @SuppressWarnings("fallthrough") - public void performAction() { - AutoIngestDashboardTopComponent.openTopComponent(); - } - - @Override - public String getName() { - return VIEW_IMAGES_VIDEOS; - } - - @Override - public HelpCtx getHelpCtx() { - return HelpCtx.DEFAULT_HELP; - } - - @Override - public boolean asynchronous() { - return false; // run on edt - } -} diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardTopComponent.form b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardTopComponent.form deleted file mode 100755 index 5f3eab1a5f..0000000000 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardTopComponent.form +++ /dev/null @@ -1,28 +0,0 @@ - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardTopComponent.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardTopComponent.java deleted file mode 100755 index 61b6cac0ac..0000000000 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardTopComponent.java +++ /dev/null @@ -1,143 +0,0 @@ -/* - * Autopsy Forensic Browser - * - * Copyright 2017 Basis Technology Corp. - * Contact: carrier sleuthkit org - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.sleuthkit.autopsy.experimental.autoingest; - -import java.util.logging.Level; -import org.netbeans.api.settings.ConvertAsProperties; -import org.openide.awt.ActionID; -import org.openide.awt.ActionReference; -import org.openide.windows.TopComponent; -import org.openide.util.NbBundle.Messages; -import org.openide.windows.Mode; -import org.openide.windows.WindowManager; -import org.sleuthkit.autopsy.coreutils.Logger; - -/** - * Top component which displays the Auto Ingest Dashboard interface. - */ -@ConvertAsProperties( - dtd = "-//org.sleuthkit.autopsy.experimental.autoingest//AutoIngestDashboard//EN", - autostore = false -) -@TopComponent.Description( - preferredID = "AutoIngestDashboardTopComponent", - //iconBase="SET/PATH/TO/ICON/HERE", - persistenceType = TopComponent.PERSISTENCE_NEVER -) -@TopComponent.Registration(mode = "dashboard", openAtStartup = false) -@ActionID(category = "Window", id = "org.sleuthkit.autopsy.experimental.autoingest.AutoIngestDashboardTopComponent") -@ActionReference(path = "Menu/Window" /* - * , position = 333 - */) -@TopComponent.OpenActionRegistration( - displayName = "#CTL_AutoIngestDashboardAction", - preferredID = "AutoIngestDashboardTopComponent" -) -@Messages({ - "CTL_AutoIngestDashboardAction=Auto Ingest Dashboard", - "CTL_AutoIngestDashboardTopComponent=Auto Ingest Dashboard", - "HINT_AutoIngestDashboardTopComponent=This is an Auto Ingest Dashboard window" -}) -public final class AutoIngestDashboardTopComponent extends TopComponent { - public final static String PREFERRED_ID = "AutoIngestDashboardTopComponent"; // NON-NLS - private static final Logger LOGGER = Logger.getLogger(AutoIngestDashboardTopComponent.class.getName()); - private static boolean topComponentInitialized = false; - - public static void openTopComponent() { - final AutoIngestDashboardTopComponent tc = (AutoIngestDashboardTopComponent) WindowManager.getDefault().findTopComponent(PREFERRED_ID); - if (tc != null) { - topComponentInitialized = true; - WindowManager.getDefault().isTopComponentFloating(tc); - Mode mode = WindowManager.getDefault().findMode("dashboard"); // NON-NLS - if (mode != null) { - mode.dockInto(tc); - } - - AutoIngestDashboard dashboard = AutoIngestDashboard.getInstance(); - tc.add(dashboard); - dashboard.setSize(dashboard.getPreferredSize()); - - tc.open(); - tc.requestActive(); - } - } - - public static void closeTopComponent() { - if (topComponentInitialized) { - final TopComponent etc = WindowManager.getDefault().findTopComponent(PREFERRED_ID); - if (etc != null) { - try { - etc.close(); - } catch (Exception e) { - LOGGER.log(Level.SEVERE, "failed to close " + PREFERRED_ID, e); // NON-NLS - } - } - } - } - - public AutoIngestDashboardTopComponent() { - initComponents(); - setName(Bundle.CTL_AutoIngestDashboardTopComponent()); - setToolTipText(Bundle.HINT_AutoIngestDashboardTopComponent()); - } - - /** - * This method is called from within the constructor to initialize the form. - * WARNING: Do NOT modify this code. The content of this method is always - * regenerated by the Form Editor. - */ - // //GEN-BEGIN:initComponents - private void initComponents() { - - javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); - this.setLayout(layout); - layout.setHorizontalGroup( - layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 400, Short.MAX_VALUE) - ); - layout.setVerticalGroup( - layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 300, Short.MAX_VALUE) - ); - }// //GEN-END:initComponents - - // Variables declaration - do not modify//GEN-BEGIN:variables - // End of variables declaration//GEN-END:variables - @Override - public void componentOpened() { - // TODO add custom code on component opening - } - - @Override - public void componentClosed() { - // TODO add custom code on component closing - } - - void writeProperties(java.util.Properties p) { - // better to version settings since initial version as advocated at - // http://wiki.apidesign.org/wiki/PropertyFiles - p.setProperty("version", "1.0"); - // TODO store your settings - } - - void readProperties(java.util.Properties p) { - String version = p.getProperty("version"); - // TODO read your settings according to their version - } -} diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestJob.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestJob.java old mode 100644 new mode 100755 diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestJobCompletedEvent.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestJobCompletedEvent.java old mode 100644 new mode 100755 diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestJobEvent.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestJobEvent.java old mode 100644 new mode 100755 diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestJobLogger.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestJobLogger.java old mode 100644 new mode 100755 diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestJobStartedEvent.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestJobStartedEvent.java old mode 100644 new mode 100755 diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestJobStatusEvent.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestJobStatusEvent.java old mode 100644 new mode 100755 diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestLegacyDashboard.form b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestLegacyDashboard.form deleted file mode 100644 index 9d28df9288..0000000000 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestLegacyDashboard.form +++ /dev/null @@ -1,475 +0,0 @@ - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestLegacyDashboard.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestLegacyDashboard.java deleted file mode 100644 index b043d9c1fb..0000000000 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestLegacyDashboard.java +++ /dev/null @@ -1,1731 +0,0 @@ -/* - * Autopsy Forensic Browser - * - * Copyright 2015-2017 Basis Technology Corp. - * Contact: carrier sleuthkit org - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.sleuthkit.autopsy.experimental.autoingest; - -import com.google.common.util.concurrent.ThreadFactoryBuilder; -import java.awt.Cursor; -import java.awt.Desktop; -import java.awt.EventQueue; -import java.io.IOException; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.time.Instant; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.Date; -import java.util.List; -import java.util.Observable; -import java.util.Observer; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.logging.Level; -import javax.swing.DefaultListSelectionModel; -import java.awt.Color; -import java.beans.PropertyChangeEvent; -import java.io.File; -import java.util.Collections; -import java.util.logging.Logger; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JTable; -import javax.swing.SwingWorker; -import javax.swing.UIManager; -import javax.swing.event.ListSelectionEvent; -import javax.swing.table.DefaultTableModel; -import javax.swing.table.TableColumn; -import org.netbeans.api.options.OptionsDisplayer; -import org.openide.DialogDisplayer; -import org.openide.LifecycleManager; -import org.openide.NotifyDescriptor; -import org.openide.filesystems.FileObject; -import org.openide.filesystems.FileUtil; -import org.openide.util.NbBundle; -import org.openide.util.actions.CallableSystemAction; -import org.openide.windows.WindowManager; -import org.sleuthkit.autopsy.casemodule.CaseNewAction; -import org.sleuthkit.autopsy.casemodule.CaseOpenAction; -import org.sleuthkit.autopsy.core.ServicesMonitor; -import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil; -import org.sleuthkit.autopsy.coreutils.NetworkUtils; -import org.sleuthkit.autopsy.coreutils.PlatformUtil; -import org.sleuthkit.autopsy.ingest.IngestManager; -import org.sleuthkit.autopsy.ingest.IngestProgressSnapshotDialog; -import org.sleuthkit.autopsy.experimental.autoingest.AutoIngestManager.CaseDeletionResult; -import org.sleuthkit.autopsy.experimental.autoingest.AutoIngestManager.JobsSnapshot; - -/** - * A panel for monitoring automated ingest by a cluster, and for controlling - * automated ingest for a single node within the cluster. There can be at most - * one such panel per node. - */ -public final class AutoIngestLegacyDashboard extends JPanel implements Observer { - - private static final long serialVersionUID = 1L; - private static final int GENERIC_COL_MIN_WIDTH = 30; - private static final int GENERIC_COL_MAX_WIDTH = 2000; - private static final int PENDING_TABLE_COL_PREFERRED_WIDTH = 280; - private static final int RUNNING_TABLE_COL_PREFERRED_WIDTH = 175; - private static final int ACTIVITY_TIME_COL_MIN_WIDTH = 250; - private static final int ACTIVITY_TIME_COL_MAX_WIDTH = 450; - private static final int TIME_COL_MIN_WIDTH = 30; - private static final int TIME_COL_MAX_WIDTH = 250; - private static final int TIME_COL_PREFERRED_WIDTH = 140; - private static final int NAME_COL_MIN_WIDTH = 100; - private static final int NAME_COL_MAX_WIDTH = 250; - private static final int NAME_COL_PREFERRED_WIDTH = 140; - private static final int ACTIVITY_COL_MIN_WIDTH = 70; - private static final int ACTIVITY_COL_MAX_WIDTH = 2000; - private static final int ACTIVITY_COL_PREFERRED_WIDTH = 300; - private static final int STATUS_COL_MIN_WIDTH = 55; - private static final int STATUS_COL_MAX_WIDTH = 250; - private static final int STATUS_COL_PREFERRED_WIDTH = 55; - private static final int COMPLETED_TIME_COL_MIN_WIDTH = 30; - private static final int COMPLETED_TIME_COL_MAX_WIDTH = 2000; - private static final int COMPLETED_TIME_COL_PREFERRED_WIDTH = 280; - private static final String UPDATE_TASKS_THREAD_NAME = "AID-update-tasks-%d"; - private static final String LOCAL_HOST_NAME = NetworkUtils.getLocalHostName(); - private static final Logger SYS_LOGGER = AutoIngestSystemLogger.getLogger(); - private static AutoIngestLegacyDashboard instance; - private final DefaultTableModel pendingTableModel; - private final DefaultTableModel runningTableModel; - private final DefaultTableModel completedTableModel; - private AutoIngestManager manager; - private ExecutorService updateExecutor; - private boolean isPaused; - private boolean autoIngestStarted; - private Color pendingTableBackground; - private Color pendingTablelForeground; - - /* - * The enum is used in conjunction with the DefaultTableModel class to - * provide table models for the JTables used to display a view of the - * pending jobs queue, running jobs list, and completed jobs list. The enum - * allows the columns of the table model to be described by either an enum - * ordinal or a column header string. - */ - private enum JobsTableModelColumns { - - CASE(NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.Case")), - DATA_SOURCE(NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.ImageFolder")), - HOST_NAME(NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.HostName")), - CREATED_TIME(NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.CreatedTime")), - STARTED_TIME(NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.StartedTime")), - COMPLETED_TIME(NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.CompletedTime")), - STAGE(NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.Stage")), - STAGE_TIME(NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.StageTime")), - STATUS(NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.Status")), - CASE_DIRECTORY_PATH(NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.CaseFolder")), - IS_LOCAL_JOB(NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.LocalJob")), - MANIFEST_FILE_PATH(NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.ManifestFilePath")); - - private final String header; - - private JobsTableModelColumns(String header) { - this.header = header; - } - - private String getColumnHeader() { - return header; - } - - private static final String[] headers = { - CASE.getColumnHeader(), - DATA_SOURCE.getColumnHeader(), - HOST_NAME.getColumnHeader(), - CREATED_TIME.getColumnHeader(), - STARTED_TIME.getColumnHeader(), - COMPLETED_TIME.getColumnHeader(), - STAGE.getColumnHeader(), - STATUS.getColumnHeader(), - STAGE_TIME.getColumnHeader(), - CASE_DIRECTORY_PATH.getColumnHeader(), - IS_LOCAL_JOB.getColumnHeader(), - MANIFEST_FILE_PATH.getColumnHeader()}; - } - - /** - * Gets the singleton automated ingest control and monitoring panel for this - * cluster node. - * - * @return The panel. - */ - public static AutoIngestLegacyDashboard getInstance() { - if (null == instance) { - /* - * Two stage construction is used here to avoid publishing a - * reference to the panel to the Observable auto ingest manager - * before object construction is complete. - */ - instance = new AutoIngestLegacyDashboard(); - } - return instance; - } - - /** - * Constructs a panel for monitoring automated ingest by a cluster, and for - * controlling automated ingest for a single node within the cluster. - */ - private AutoIngestLegacyDashboard() { - //Disable the main window so they can only use the dashboard (if we used setVisible the taskBar icon would go away) - WindowManager.getDefault().getMainWindow().setEnabled(false); - - manager = AutoIngestManager.getInstance(); - - pendingTableModel = new DefaultTableModel(JobsTableModelColumns.headers, 0) { - private static final long serialVersionUID = 1L; - - @Override - public boolean isCellEditable(int row, int column) { - return false; - } - }; - - runningTableModel = new DefaultTableModel(JobsTableModelColumns.headers, 0) { - private static final long serialVersionUID = 1L; - - @Override - public boolean isCellEditable(int row, int column) { - return false; - } - }; - - completedTableModel = new DefaultTableModel(JobsTableModelColumns.headers, 0) { - private static final long serialVersionUID = 1L; - - @Override - public boolean isCellEditable(int row, int column) { - return false; - } - }; - - initComponents(); // Generated code. - setServicesStatusMessage(); - initPendingJobsTable(); - initRunningJobsTable(); - initCompletedJobsTable(); - initButtons(); - - /* - * Must set this flag, otherwise pop up menus don't close properly. - */ - UIManager.put("PopupMenu.consumeEventOnClose", false); - } - - /** - * Queries the services monitor and sets the text for the services status - * text box. - */ - private void setServicesStatusMessage() { - new SwingWorker() { - - String caseDatabaseServerStatus = ServicesMonitor.ServiceStatus.DOWN.toString(); - String keywordSearchServiceStatus = ServicesMonitor.ServiceStatus.DOWN.toString(); - String messagingStatus = ServicesMonitor.ServiceStatus.DOWN.toString(); - - @Override - protected Void doInBackground() throws Exception { - caseDatabaseServerStatus = getServiceStatus(ServicesMonitor.Service.REMOTE_CASE_DATABASE); - keywordSearchServiceStatus = getServiceStatus(ServicesMonitor.Service.REMOTE_KEYWORD_SEARCH); - messagingStatus = getServiceStatus(ServicesMonitor.Service.MESSAGING); - return null; - } - - /** - * Gets a status string for a given service. - * - * @param service The service to test. - * - * @return The status string. - */ - private String getServiceStatus(ServicesMonitor.Service service) { - String serviceStatus = NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.tbServicesStatusMessage.Message.Unknown"); - try { - ServicesMonitor servicesMonitor = ServicesMonitor.getInstance(); - serviceStatus = servicesMonitor.getServiceStatus(service.toString()); - if (serviceStatus.compareTo(ServicesMonitor.ServiceStatus.UP.toString()) == 0) { - serviceStatus = NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.tbServicesStatusMessage.Message.Up"); - } else { - serviceStatus = NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.tbServicesStatusMessage.Message.Down"); - } - } catch (ServicesMonitor.ServicesMonitorException ex) { - SYS_LOGGER.log(Level.SEVERE, String.format("Dashboard error getting service status for %s", service), ex); - } - return serviceStatus; - } - - @Override - protected void done() { - tbServicesStatusMessage.setText(NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.tbServicesStatusMessage.Message", caseDatabaseServerStatus, keywordSearchServiceStatus, keywordSearchServiceStatus, messagingStatus)); - String upStatus = NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.tbServicesStatusMessage.Message.Up"); - if (caseDatabaseServerStatus.compareTo(upStatus) != 0 - || keywordSearchServiceStatus.compareTo(upStatus) != 0 - || messagingStatus.compareTo(upStatus) != 0) { - tbServicesStatusMessage.setForeground(Color.RED); - } else { - tbServicesStatusMessage.setForeground(Color.BLACK); - } - } - - }.execute(); - } - - /** - * Sets up the JTable that presents a view of the system-wide pending jobs - * queue. - */ - private void initPendingJobsTable() { - /* - * Remove some of the jobs table model columns from the JTable. This - * does not remove the columns from the model, just from this table. - */ - pendingTable.removeColumn(pendingTable.getColumn(JobsTableModelColumns.HOST_NAME.getColumnHeader())); - pendingTable.removeColumn(pendingTable.getColumn(JobsTableModelColumns.STARTED_TIME.getColumnHeader())); - pendingTable.removeColumn(pendingTable.getColumn(JobsTableModelColumns.COMPLETED_TIME.getColumnHeader())); - pendingTable.removeColumn(pendingTable.getColumn(JobsTableModelColumns.STAGE.getColumnHeader())); - pendingTable.removeColumn(pendingTable.getColumn(JobsTableModelColumns.STAGE_TIME.getColumnHeader())); - pendingTable.removeColumn(pendingTable.getColumn(JobsTableModelColumns.CASE_DIRECTORY_PATH.getColumnHeader())); - pendingTable.removeColumn(pendingTable.getColumn(JobsTableModelColumns.IS_LOCAL_JOB.getColumnHeader())); - pendingTable.removeColumn(pendingTable.getColumn(JobsTableModelColumns.STATUS.getColumnHeader())); - pendingTable.removeColumn(pendingTable.getColumn(JobsTableModelColumns.MANIFEST_FILE_PATH.getColumnHeader())); - - /* - * Set up a column to display the cases associated with the jobs. - */ - TableColumn column; - column = pendingTable.getColumn(JobsTableModelColumns.CASE.getColumnHeader()); - column.setMinWidth(GENERIC_COL_MIN_WIDTH); - column.setMaxWidth(GENERIC_COL_MAX_WIDTH); - column.setPreferredWidth(PENDING_TABLE_COL_PREFERRED_WIDTH); - column.setWidth(PENDING_TABLE_COL_PREFERRED_WIDTH); - - /* - * Set up a column to display the image folders associated with the - * jobs. - */ - column = pendingTable.getColumn(JobsTableModelColumns.DATA_SOURCE.getColumnHeader()); - column.setMaxWidth(GENERIC_COL_MAX_WIDTH); - column.setPreferredWidth(PENDING_TABLE_COL_PREFERRED_WIDTH); - column.setWidth(PENDING_TABLE_COL_PREFERRED_WIDTH); - - /* - * Set up a column to display the create times of the jobs. - */ - column = pendingTable.getColumn(JobsTableModelColumns.CREATED_TIME.getColumnHeader()); - column.setCellRenderer(new LongDateCellRenderer()); - column.setMinWidth(TIME_COL_MIN_WIDTH); - column.setMaxWidth(TIME_COL_MAX_WIDTH); - column.setPreferredWidth(TIME_COL_PREFERRED_WIDTH); - column.setWidth(TIME_COL_PREFERRED_WIDTH); - - /** - * Prevent sorting when a column header is clicked. - */ - pendingTable.setAutoCreateRowSorter(false); - - /* - * Create a row selection listener to enable/disable the prioritize - * folder and prioritize case buttons. - */ - pendingTable.getSelectionModel().addListSelectionListener((ListSelectionEvent e) -> { - if (e.getValueIsAdjusting()) { - return; - } - int row = pendingTable.getSelectedRow(); - enablePendingTableButtons((row >= 0) && (row < pendingTable.getRowCount())); - }); - - /* - * Save the background color of the table so it can be restored on - * resume, after being grayed out on pause. Note the assumption that all - * of the tables use the same background color. - */ - pendingTableBackground = pendingTable.getBackground(); - pendingTablelForeground = pendingTable.getForeground(); - } - - /** - * Sets up the JTable that presents a view of the system-wide running jobs - * list. - */ - private void initRunningJobsTable() { - /* - * Remove some of the jobs table model columns from the JTable. This - * does not remove the columns from the model, just from this table. - */ - runningTable.removeColumn(runningTable.getColumn(JobsTableModelColumns.CREATED_TIME.getColumnHeader())); - runningTable.removeColumn(runningTable.getColumn(JobsTableModelColumns.STARTED_TIME.getColumnHeader())); - runningTable.removeColumn(runningTable.getColumn(JobsTableModelColumns.COMPLETED_TIME.getColumnHeader())); - runningTable.removeColumn(runningTable.getColumn(JobsTableModelColumns.STATUS.getColumnHeader())); - runningTable.removeColumn(runningTable.getColumn(JobsTableModelColumns.CASE_DIRECTORY_PATH.getColumnHeader())); - runningTable.removeColumn(runningTable.getColumn(JobsTableModelColumns.IS_LOCAL_JOB.getColumnHeader())); - runningTable.removeColumn(runningTable.getColumn(JobsTableModelColumns.MANIFEST_FILE_PATH.getColumnHeader())); - - /* - * Set up a column to display the cases associated with the jobs. - */ - TableColumn column; - column = runningTable.getColumn(JobsTableModelColumns.CASE.getColumnHeader()); - column.setMinWidth(GENERIC_COL_MIN_WIDTH); - column.setMaxWidth(GENERIC_COL_MAX_WIDTH); - column.setPreferredWidth(RUNNING_TABLE_COL_PREFERRED_WIDTH); - column.setWidth(RUNNING_TABLE_COL_PREFERRED_WIDTH); - - /* - * Set up a column to display the image folders associated with the - * jobs. - */ - column = runningTable.getColumn(JobsTableModelColumns.DATA_SOURCE.getColumnHeader()); - column.setMinWidth(GENERIC_COL_MIN_WIDTH); - column.setMaxWidth(GENERIC_COL_MAX_WIDTH); - column.setPreferredWidth(RUNNING_TABLE_COL_PREFERRED_WIDTH); - column.setWidth(RUNNING_TABLE_COL_PREFERRED_WIDTH); - - /* - * Set up a column to display the host names of the cluster nodes - * processing the jobs. - */ - column = runningTable.getColumn(JobsTableModelColumns.HOST_NAME.getColumnHeader()); - column.setMinWidth(NAME_COL_MIN_WIDTH); - column.setMaxWidth(NAME_COL_MAX_WIDTH); - column.setPreferredWidth(NAME_COL_PREFERRED_WIDTH); - column.setWidth(NAME_COL_PREFERRED_WIDTH); - - /* - * Set up a column to display the ingest activities associated with the - * jobs. - */ - column = runningTable.getColumn(JobsTableModelColumns.STAGE.getColumnHeader()); - column.setMinWidth(ACTIVITY_COL_MIN_WIDTH); - column.setMaxWidth(ACTIVITY_COL_MAX_WIDTH); - column.setPreferredWidth(ACTIVITY_COL_PREFERRED_WIDTH); - column.setWidth(ACTIVITY_COL_PREFERRED_WIDTH); - - /* - * Set up a column to display the ingest activity times associated with - * the jobs. - */ - column = runningTable.getColumn(JobsTableModelColumns.STAGE_TIME.getColumnHeader()); - column.setCellRenderer(new DurationCellRenderer()); - column.setMinWidth(GENERIC_COL_MIN_WIDTH); - column.setMaxWidth(ACTIVITY_TIME_COL_MAX_WIDTH); - column.setPreferredWidth(ACTIVITY_TIME_COL_MIN_WIDTH); - column.setWidth(ACTIVITY_TIME_COL_MIN_WIDTH); - - /* - * Prevent sorting when a column header is clicked. - */ - runningTable.setAutoCreateRowSorter(false); - - /* - * Create a row selection listener to enable/disable the cancel current - * job, cancel current module, and show progress buttons. - */ - runningTable.getSelectionModel().addListSelectionListener((ListSelectionEvent e) -> { - if (e.getValueIsAdjusting()) { - return; - } - updateRunningTableButtonsBasedOnSelectedRow(); - }); - } - - private void updateRunningTableButtonsBasedOnSelectedRow() { - int row = runningTable.getSelectedRow(); - if (row >= 0 && row < runningTable.getRowCount()) { - if ((boolean) runningTableModel.getValueAt(row, JobsTableModelColumns.IS_LOCAL_JOB.ordinal())) { - enableRunningTableButtons(true); - return; - } - } - enableRunningTableButtons(false); - } - - /** - * Sets up the JTable that presents a view of the system-wide competed jobs - * list. - */ - private void initCompletedJobsTable() { - /* - * Remove some of the jobs table model columns from the JTable. This - * does not remove the columns from the model, just from this table. - */ - completedTable.removeColumn(completedTable.getColumn(JobsTableModelColumns.STARTED_TIME.getColumnHeader())); - completedTable.removeColumn(completedTable.getColumn(JobsTableModelColumns.STAGE.getColumnHeader())); - completedTable.removeColumn(completedTable.getColumn(JobsTableModelColumns.STAGE_TIME.getColumnHeader())); - completedTable.removeColumn(completedTable.getColumn(JobsTableModelColumns.IS_LOCAL_JOB.getColumnHeader())); - completedTable.removeColumn(completedTable.getColumn(JobsTableModelColumns.HOST_NAME.getColumnHeader())); - completedTable.removeColumn(completedTable.getColumn(JobsTableModelColumns.CASE_DIRECTORY_PATH.getColumnHeader())); - completedTable.removeColumn(completedTable.getColumn(JobsTableModelColumns.MANIFEST_FILE_PATH.getColumnHeader())); - - /* - * Set up a column to display the cases associated with the jobs. - */ - TableColumn column; - column = completedTable.getColumn(JobsTableModelColumns.CASE.getColumnHeader()); - column.setMinWidth(COMPLETED_TIME_COL_MIN_WIDTH); - column.setMaxWidth(COMPLETED_TIME_COL_MAX_WIDTH); - column.setPreferredWidth(COMPLETED_TIME_COL_PREFERRED_WIDTH); - column.setWidth(COMPLETED_TIME_COL_PREFERRED_WIDTH); - - /* - * Set up a column to display the image folders associated with the - * jobs. - */ - column = completedTable.getColumn(JobsTableModelColumns.DATA_SOURCE.getColumnHeader()); - column.setMinWidth(COMPLETED_TIME_COL_MIN_WIDTH); - column.setMaxWidth(COMPLETED_TIME_COL_MAX_WIDTH); - column.setPreferredWidth(COMPLETED_TIME_COL_PREFERRED_WIDTH); - column.setWidth(COMPLETED_TIME_COL_PREFERRED_WIDTH); - - /* - * Set up a column to display the create times of the jobs. - */ - column = completedTable.getColumn(JobsTableModelColumns.CREATED_TIME.getColumnHeader()); - column.setCellRenderer(new LongDateCellRenderer()); - column.setMinWidth(TIME_COL_MIN_WIDTH); - column.setMaxWidth(TIME_COL_MAX_WIDTH); - column.setPreferredWidth(TIME_COL_PREFERRED_WIDTH); - column.setWidth(TIME_COL_PREFERRED_WIDTH); - - /* - * Set up a column to display the completed times of the jobs. - */ - column = completedTable.getColumn(JobsTableModelColumns.COMPLETED_TIME.getColumnHeader()); - column.setCellRenderer(new LongDateCellRenderer()); - column.setMinWidth(TIME_COL_MIN_WIDTH); - column.setMaxWidth(TIME_COL_MAX_WIDTH); - column.setPreferredWidth(TIME_COL_PREFERRED_WIDTH); - column.setWidth(TIME_COL_PREFERRED_WIDTH); - - /* - * Set up a column to display the statuses of the jobs, with a cell - * renderer that will choose an icon to represent the job status. - */ - column = completedTable.getColumn(JobsTableModelColumns.STATUS.getColumnHeader()); - column.setCellRenderer(new CaseStatusIconCellRenderer()); - column.setMinWidth(STATUS_COL_MIN_WIDTH); - column.setMaxWidth(STATUS_COL_MAX_WIDTH); - column.setPreferredWidth(STATUS_COL_PREFERRED_WIDTH); - column.setWidth(STATUS_COL_PREFERRED_WIDTH); - - /* - * Prevent sorting when a column header is clicked. - */ - completedTable.setAutoCreateRowSorter(false); - - /* - * Create a row selection listener to enable/disable the delete case and - * show log buttons. - */ - completedTable.getSelectionModel() - .addListSelectionListener((ListSelectionEvent e) -> { - if (e.getValueIsAdjusting()) { - return; - } - int row = completedTable.getSelectedRow(); - boolean enabled = row >= 0 && row < completedTable.getRowCount(); - bnDeleteCase.setEnabled(enabled); - bnShowCaseLog.setEnabled(enabled); - bnReprocessJob.setEnabled(enabled); - }); - } - - /** - * Sets the initial state of the buttons on the panel. - */ - private void initButtons() { - bnOptions.setEnabled(true); - bnDeleteCase.setEnabled(false); - enablePendingTableButtons(false); - bnShowCaseLog.setEnabled(false); - bnReprocessJob.setEnabled(false); - bnPause.setText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.bnStart.text")); - bnPause.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.bnStart.toolTipText")); - bnPause.setEnabled(true); //initial label for bnPause is 'Start' and it's enabled for user to start the process - bnRefresh.setEnabled(false); //at initial stage, nothing to refresh - enableRunningTableButtons(false); - tbStatusMessage.setText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.bnStart.startMessage")); - } - - /** - * Enables or disables buttons related to the running jobs table. - * - * @param enable Enable/disable the buttons. - */ - private void enableRunningTableButtons(Boolean enable) { - bnCancelJob.setEnabled(enable); - bnCancelModule.setEnabled(enable); - bnShowProgress.setEnabled(enable); - } - - /** - * Enables or disables buttons related to pending jobs table. - * - * @param enable Enable/disable the buttons. - */ - private void enablePendingTableButtons(Boolean enable) { - bnPrioritizeCase.setEnabled(enable); - bnPrioritizeJob.setEnabled(enable); - } - - /** - * Starts up the auto ingest manager and adds this panel as an observer, - * subscribes to services monitor events and starts a task to populate the - * auto ingest job tables. The Refresh and Pause buttons are enabled. - */ - private void startUp() { - - /* - * Starts up the auto ingest manager (AIM). - */ - try { - manager.startUp(); - autoIngestStarted = true; - } catch (AutoIngestManager.AutoIngestManagerStartupException ex) { - SYS_LOGGER.log(Level.SEVERE, "Dashboard error starting up auto ingest", ex); - tbStatusMessage.setText(NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.AutoIngestStartupError")); - manager = null; - - JOptionPane.showMessageDialog(this, - NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.AutoIngestStartupFailed.Message"), - NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.AutoIngestStartupFailed.Title"), - JOptionPane.ERROR_MESSAGE); - bnOptions.setEnabled(true); - - /* - * If the AIM cannot be started, there is nothing more to do. - */ - return; - } - - /* - * Subscribe to services monitor events. - */ - ServicesMonitor.getInstance().addSubscriber((PropertyChangeEvent evt) -> { - setServicesStatusMessage(); - }); - - /* - * Register with the AIM as an observer. - */ - manager.addObserver(this); - - /* - * Populate the pending, running, and completed auto ingest job tables. - */ - updateExecutor = Executors.newSingleThreadExecutor(new ThreadFactoryBuilder().setNameFormat(UPDATE_TASKS_THREAD_NAME).build()); - updateExecutor.submit(new UpdateAllJobsTablesTask()); - manager.scanInputDirsNow(); - - //bnPause.setEnabled(true); - bnPause.setText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.bnPause.text")); - bnPause.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.bnPause.toolTipText")); - bnRefresh.setEnabled(true); - bnOptions.setEnabled(false); - - tbStatusMessage.setText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.bnPause.running")); - } - - /** - * Shuts down auto ingest by shutting down the auto ingest manager and doing - * an application exit. - */ - public void shutdown() { - /* - * Confirm that the user wants to proceed, letting him or her no that if - * there is a currently running job it will be cancelled. TODO (RC): If - * a wait cursor is provided, this could perhaps be made conditional on - * a running job check again. Or the simple check in isLocalJobRunning - * could be used. Was this previously used and I removed it thinking it - * was grabbing the monitor? - */ - Object[] options = { - NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.OK"), - NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.Cancel")}; - int reply = JOptionPane.OK_OPTION; - - if (null != manager && IngestManager.getInstance().isIngestRunning()) { - reply = JOptionPane.showOptionDialog(this, - NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.ExitConsequences"), - NbBundle.getMessage(AutoIngestLegacyDashboard.class, "ConfirmationDialog.ConfirmExitHeader"), - JOptionPane.DEFAULT_OPTION, - JOptionPane.WARNING_MESSAGE, - null, - options, - options[JOptionPane.NO_OPTION]); - } - if (reply == JOptionPane.OK_OPTION) { - /* - * Provide user feedback. Call setCursor on this to ensure it - * appears (if there is time to see it). - */ - this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); - tbStatusMessage.setText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.ExitingStatus")); - - /* - * Shut down the table refresh task executor. - */ - if (null != updateExecutor) { - updateExecutor.shutdownNow(); - } - - /* - * Stop observing the auto ingest manager (AIM). - */ - if (null != manager) { - manager.deleteObserver(this); - } - - /* - * Shut down the AIM and close. - */ - new SwingWorker() { - - @Override - protected Void doInBackground() throws Exception { - if (null != manager) { - manager.shutDown(); - } - return null; - } - - @Override - protected void done() { - AutoIngestLegacyDashboard.this.setCursor(Cursor.getDefaultCursor()); - LifecycleManager.getDefault().exit(); - } - }.execute(); - } - } - - /** - * @inheritDoc - */ - @NbBundle.Messages({ - "AutoIngestLegacyDashboard.bnPause.paused=Paused", - "AutoIngestLegacyDashboard.PauseDueToDatabaseServiceDown=Paused, unable to communicate with case database service.", - "AutoIngestLegacyDashboard.PauseDueToKeywordSearchServiceDown=Paused, unable to communicate with keyword search service.", - "AutoIngestLegacyDashboard.PauseDueToCoordinationServiceDown=Paused, unable to communicate with coordination service.", - "AutoIngestLegacyDashboard.PauseDueToWriteStateFilesFailure=Paused, unable to write to shared images or cases location.", - "AutoIngestLegacyDashboard.PauseDueToSharedConfigError=Paused, unable to update shared configuration.", - "AutoIngestLegacyDashboard.PauseDueToIngestJobStartFailure=Paused, unable to start ingest job processing.", - "AutoIngestLegacyDashboard.PauseDueToFileExporterError=Paused, unable to load File Exporter settings.", - "AutoIngestLegacyDashboard.bnPause.running=Running", - "AutoIngestLegacyDashboard.bnStart.startMessage=Waiting to start", - "AutoIngestLegacyDashboard.bnStart.text=Start", - "AutoIngestLegacyDashboard.bnStart.toolTipText=Start processing auto ingest jobs" - }) - @Override - public void update(Observable o, Object arg) { - - if (arg instanceof AutoIngestManager.Event) { - switch ((AutoIngestManager.Event) arg) { - case INPUT_SCAN_COMPLETED: - case JOB_STARTED: - case JOB_COMPLETED: - case CASE_DELETED: - updateExecutor.submit(new UpdateAllJobsTablesTask()); - break; - case PAUSED_BY_REQUEST: - EventQueue.invokeLater(() -> { - tbStatusMessage.setText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.bnPause.paused")); - bnOptions.setEnabled(true); - bnRefresh.setEnabled(false); - isPaused = true; - }); - break; - case PAUSED_FOR_SYSTEM_ERROR: - EventQueue.invokeLater(() -> { - tbStatusMessage.setText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.PauseDueToSystemError")); - bnOptions.setEnabled(true); - bnRefresh.setEnabled(false); - pause(false); - isPaused = true; - setServicesStatusMessage(); - }); - break; - case RESUMED: - EventQueue.invokeLater(() -> { - tbStatusMessage.setText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.bnPause.running")); - }); - break; - case CASE_PRIORITIZED: - updateExecutor.submit(new UpdatePendingJobsTableTask()); - break; - case JOB_STATUS_UPDATED: - updateExecutor.submit(new UpdateRunningJobsTablesTask()); - break; - default: - break; - } - } - } - - /** - * Requests a pause of auto ingest processing by the auto ingest manager and - * handles updates to the components that implement the pause and resume - * feature. Note that this feature is needed to get around restrictions on - * changing ingest module selections and settings while an ingest job is - * running, and that the auto ingest manager will not actually pause until - * the current auto ingest job completes. - * - * @param buttonClicked Is this pause request in response to a user gesture - * or a nofification from the auto ingest manager - * (AIM)? - */ - private void pause(boolean buttonClicked) { - /** - * Gray out the cells in the pending table to give a visual indicator of - * the pausing/paused state. - */ - pendingTable.setBackground(Color.LIGHT_GRAY); - pendingTable.setForeground(Color.DARK_GRAY); - - /** - * Change the pause button text and tool tip to make it a resume button. - */ - bnPause.setText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.bnResume.text")); - bnPause.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.bnPause.toolTipTextResume")); - - if (buttonClicked) { - /** - * Ask the auto ingest manager to pause when it completes the - * currently running job, if any. - */ - manager.pause(); - bnRefresh.setEnabled(false); - } - } - - /** - * Requests a resume of auto ingest processing by the auto ingest manager - * and handles updates to the components that implement the pause and resume - * feature. Note that this feature is needed to get around restrictions on - * changing ingest module selections and settings while an ingest job is - * running, and that the auto ingest manager will not actually pause until - * the current auto ingest job completes. - */ - private void resume() { - /** - * Change the resume button text and tool tip to make it a pause button. - */ - bnOptions.setEnabled(false); - bnPause.setText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.bnPause.text")); - bnPause.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.bnPause.toolTipText")); - tbStatusMessage.setText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.bnPause.running")); - bnRefresh.setEnabled(true); - - /** - * Remove the graying out of the pending table. - */ - pendingTable.setBackground(pendingTableBackground); - pendingTable.setForeground(pendingTablelForeground); - - /** - * Ask the auto ingest manager to resume processing. - */ - manager.resume(); - } - - /** - * A runnable task that gets the pending auto ingest jobs list from the auto - * ingest manager and queues a components refresh task for execution in the - * EDT. - */ - private class UpdatePendingJobsTableTask implements Runnable { - - /** - * @inheritDoc - */ - @Override - public void run() { - List pendingJobs = new ArrayList<>(); - manager.getJobs(pendingJobs, null, null); - EventQueue.invokeLater(new RefreshComponentsTask(pendingJobs, null, null)); - } - } - - /** - * A runnable task that gets the running auto ingest jobs list from the auto - * ingest manager and queues a components refresh task for execution in the - * EDT. - */ - private class UpdateRunningJobsTablesTask implements Runnable { - - /** - * @inheritDoc - */ - @Override - public void run() { - List runningJobs = new ArrayList<>(); - manager.getJobs(null, runningJobs, null); - EventQueue.invokeLater(new RefreshComponentsTask(null, runningJobs, null)); - } - } - - /** - * A runnable task that gets the pending, running and completed auto ingest - * jobs lists from the auto ingest manager and queues a components refresh - * task for execution in the EDT. Note that this task is frequently used - * when only the pending and updated lists definitely need to be updated. - * This is because the cost of updating the running jobs list is both very - * small and it is beneficial to keep running job status up to date if there - * is a running job. - */ - private class UpdateAllJobsTablesTask implements Runnable { - - /** - * @inheritDoc - */ - @Override - public void run() { - List pendingJobs = new ArrayList<>(); - List runningJobs = new ArrayList<>(); - List completedJobs = new ArrayList<>(); - manager.getJobs(pendingJobs, runningJobs, completedJobs); - // Sort the completed jobs list by completed date - Collections.sort(completedJobs, new AutoIngestJob.ReverseDateCompletedComparator()); - EventQueue.invokeLater(new RefreshComponentsTask(pendingJobs, runningJobs, completedJobs)); - } - } - - /** - * A runnable task that refreshes the components on this panel to reflect - * the current state of one or more auto ingest job lists obtained from the - * auto ingest manager. - */ - private class RefreshComponentsTask implements Runnable { - - private final List pendingJobs; - private final List runningJobs; - private final List completedJobs; - - /** - * Constructs a runnable task that refreshes the components on this - * panel to reflect the current state of the auto ingest jobs. - * - * @param pendingJobs A list of pending jobs, may be null if the - * pending jobs are unchanged. - * @param runningJobs A list of running jobs, may be null if the - * running jobs are unchanged. - * @param completedJobs A list of completed jobs, may be null if the - * completed jobs are unchanged. - */ - RefreshComponentsTask(List pendingJobs, List runningJobs, List completedJobs) { - this.pendingJobs = pendingJobs; - this.runningJobs = runningJobs; - this.completedJobs = completedJobs; - } - - /** - * @inheritDoc - */ - @Override - public void run() { - /* - * NOTE: There is a problem with our approach of preserving table - * row selections - what if the number of rows has changed as result - * of calling refreshTable(). Then it is possible for what used to - * be (for example) row 1 to now be in some other row or be removed - * from the table. This code will re-set the selection back to what - * it used to be before calling refreshTable(), i.e. row 1 - */ - - if (null != pendingJobs) { - Path currentRow = getSelectedEntry(pendingTable, pendingTableModel); - refreshTable(pendingJobs, pendingTableModel, null); - setSelectedEntry(pendingTable, pendingTableModel, currentRow); - } - - if (null != runningJobs) { - if (!isLocalJobRunning()) { - enableRunningTableButtons(false); - } else { - updateRunningTableButtonsBasedOnSelectedRow(); - } - Path currentRow = getSelectedEntry(runningTable, runningTableModel); - refreshTable(runningJobs, runningTableModel, null); - setSelectedEntry(runningTable, runningTableModel, currentRow); - } - - if (null != completedJobs) { - Path currentRow = getSelectedEntry(completedTable, completedTableModel); - refreshTable(completedJobs, completedTableModel, null); - setSelectedEntry(completedTable, completedTableModel, currentRow); - } - } - - /** - * Checks whether there is a job that is running on local AIN. - * - * @return true is local job is found, false otherwise. - */ - private boolean isLocalJobRunning() { - for (AutoIngestJob job : runningJobs) { - if (isLocalJob(job)) { - return true; - } - } - return false; - } - - /** - * Checks whether or not an automated ingest job is local to this node. - * - * @param job The job. - * - * @return True or fale. - */ - private boolean isLocalJob(AutoIngestJob job) { - return job.getNodeName().equals(LOCAL_HOST_NAME); - } - - /** - * Get a path representing the current selection on the table passed in. - * If there is no selection, return null. - * - * @param table The table to get - * @param tableModel The tableModel of the table to get - * - * @return a path representing the current selection - */ - Path getSelectedEntry(JTable table, DefaultTableModel tableModel) { - try { - int currentlySelectedRow = table.getSelectedRow(); - if (currentlySelectedRow >= 0 && currentlySelectedRow < table.getRowCount()) { - return Paths.get(tableModel.getValueAt(currentlySelectedRow, JobsTableModelColumns.CASE.ordinal()).toString(), - tableModel.getValueAt(currentlySelectedRow, JobsTableModelColumns.DATA_SOURCE.ordinal()).toString()); - } - } catch (Exception ignored) { - return null; - } - return null; - } - - /** - * Set the selection on the table to the passed-in path's item, if that - * item exists in the table. If it does not, clears the table selection. - * - * @param table The table to set - * @param tableModel The tableModel of the table to set - * @param path The path of the item to set - */ - void setSelectedEntry(JTable table, DefaultTableModel tableModel, Path path) { - if (path != null) { - try { - for (int row = 0; row < table.getRowCount(); ++row) { - Path temp = Paths.get(tableModel.getValueAt(row, JobsTableModelColumns.CASE.ordinal()).toString(), - tableModel.getValueAt(row, JobsTableModelColumns.DATA_SOURCE.ordinal()).toString()); - if (temp.compareTo(path) == 0) { // found it - table.setRowSelectionInterval(row, row); - return; - } - } - } catch (Exception ignored) { - table.clearSelection(); - } - } - table.clearSelection(); - } - } - - /** - * Reloads the table model for an auto ingest jobs table, refreshing the - * JTable that uses the model. - * - * @param jobs The list of auto ingest jobs. - * @param tableModel The table model. - * @param comparator An optional comparator (may be null) for sorting the - * table model. - */ - private void refreshTable(List jobs, DefaultTableModel tableModel, Comparator comparator) { - try { - if (comparator != null) { - jobs.sort(comparator); - } - tableModel.setRowCount(0); - for (AutoIngestJob job : jobs) { - AutoIngestJob.StageDetails status = job.getStageDetails(); - tableModel.addRow(new Object[]{ - job.getManifest().getCaseName(), // CASE - job.getManifest().getDataSourcePath().getFileName(), // DATA_SOURCE - job.getNodeName(), // HOST_NAME - job.getManifest().getDateFileCreated(), // CREATED_TIME - job.getStageStartDate(), // STARTED_TIME - job.getCompletedDate(), // COMPLETED_TIME - status.getDescription(), // ACTIVITY - job.hasErrors(), // STATUS - ((Date.from(Instant.now()).getTime()) - (status.getStartDate().getTime())), // ACTIVITY_TIME - job.getCaseDirectoryPath(), // CASE_DIRECTORY_PATH - job.getNodeName().equals(LOCAL_HOST_NAME), // IS_LOCAL_JOB - job.getManifest().getFilePath()}); // MANIFEST_FILE_PATH - } - } catch (Exception ex) { - SYS_LOGGER.log(Level.SEVERE, "Dashboard error refreshing table", ex); - } - } - - /** - * Get the current lists of jobs and update the UI. - */ - private void refreshTables(){ - JobsSnapshot jobsSnapshot = manager.getCurrentJobsSnapshot(); - refreshTable(jobsSnapshot.getCompletedJobs(), completedTableModel, null); - refreshTable(jobsSnapshot.getPendingJobs(), pendingTableModel, null); - refreshTable(jobsSnapshot.getRunningJobs(), runningTableModel, null); - } - - /** - * This method is called from within the constructor to initialize the form. - * WARNING: Do NOT modify this code. The content of this method is always - * regenerated by the Form Editor. - */ - @SuppressWarnings("unchecked") - // //GEN-BEGIN:initComponents - private void initComponents() { - - pendingScrollPane = new javax.swing.JScrollPane(); - pendingTable = new javax.swing.JTable(); - runningScrollPane = new javax.swing.JScrollPane(); - runningTable = new javax.swing.JTable(); - completedScrollPane = new javax.swing.JScrollPane(); - completedTable = new javax.swing.JTable(); - bnCancelJob = new javax.swing.JButton(); - bnDeleteCase = new javax.swing.JButton(); - lbPending = new javax.swing.JLabel(); - lbRunning = new javax.swing.JLabel(); - lbCompleted = new javax.swing.JLabel(); - bnRefresh = new javax.swing.JButton(); - bnCancelModule = new javax.swing.JButton(); - bnExit = new javax.swing.JButton(); - bnOptions = new javax.swing.JButton(); - bnShowProgress = new javax.swing.JButton(); - bnPause = new javax.swing.JButton(); - bnPrioritizeCase = new javax.swing.JButton(); - bnShowCaseLog = new javax.swing.JButton(); - tbStatusMessage = new javax.swing.JTextField(); - lbStatus = new javax.swing.JLabel(); - bnPrioritizeJob = new javax.swing.JButton(); - lbServicesStatus = new javax.swing.JLabel(); - tbServicesStatusMessage = new javax.swing.JTextField(); - bnOpenLogDir = new javax.swing.JButton(); - bnReprocessJob = new javax.swing.JButton(); - - pendingTable.setModel(pendingTableModel); - pendingTable.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.pendingTable.toolTipText")); // NOI18N - pendingTable.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_ALL_COLUMNS); - pendingTable.setRowHeight(20); - pendingTable.setSelectionModel(new DefaultListSelectionModel() { - private static final long serialVersionUID = 1L; - @Override - public void setSelectionInterval(int index0, int index1) { - if (index0 == pendingTable.getSelectedRow()) { - pendingTable.clearSelection(); - } else { - super.setSelectionInterval(index0, index1); - } - } - }); - pendingTable.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION); - pendingScrollPane.setViewportView(pendingTable); - - runningTable.setModel(runningTableModel); - runningTable.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.runningTable.toolTipText")); // NOI18N - runningTable.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_ALL_COLUMNS); - runningTable.setRowHeight(20); - runningTable.setSelectionModel(new DefaultListSelectionModel() { - private static final long serialVersionUID = 1L; - @Override - public void setSelectionInterval(int index0, int index1) { - if (index0 == runningTable.getSelectedRow()) { - runningTable.clearSelection(); - } else { - super.setSelectionInterval(index0, index1); - } - } - }); - runningTable.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION); - runningScrollPane.setViewportView(runningTable); - - completedTable.setModel(completedTableModel); - completedTable.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.completedTable.toolTipText")); // NOI18N - completedTable.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_ALL_COLUMNS); - completedTable.setRowHeight(20); - completedTable.setSelectionModel(new DefaultListSelectionModel() { - private static final long serialVersionUID = 1L; - @Override - public void setSelectionInterval(int index0, int index1) { - if (index0 == completedTable.getSelectedRow()) { - completedTable.clearSelection(); - } else { - super.setSelectionInterval(index0, index1); - } - } - }); - completedTable.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION); - completedScrollPane.setViewportView(completedTable); - - org.openide.awt.Mnemonics.setLocalizedText(bnCancelJob, org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.bnCancelJob.text")); // NOI18N - bnCancelJob.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.bnCancelJob.toolTipText")); // NOI18N - bnCancelJob.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - bnCancelJobActionPerformed(evt); - } - }); - - org.openide.awt.Mnemonics.setLocalizedText(bnDeleteCase, org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.bnDeleteCase.text")); // NOI18N - bnDeleteCase.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.bnDeleteCase.toolTipText")); // NOI18N - bnDeleteCase.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - bnDeleteCaseActionPerformed(evt); - } - }); - - lbPending.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N - org.openide.awt.Mnemonics.setLocalizedText(lbPending, org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.lbPending.text")); // NOI18N - - lbRunning.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N - org.openide.awt.Mnemonics.setLocalizedText(lbRunning, org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.lbRunning.text")); // NOI18N - - lbCompleted.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N - org.openide.awt.Mnemonics.setLocalizedText(lbCompleted, org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.lbCompleted.text")); // NOI18N - - org.openide.awt.Mnemonics.setLocalizedText(bnRefresh, org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.bnRefresh.text")); // NOI18N - bnRefresh.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.bnRefresh.toolTipText")); // NOI18N - bnRefresh.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - bnRefreshActionPerformed(evt); - } - }); - - org.openide.awt.Mnemonics.setLocalizedText(bnCancelModule, org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.bnCancelModule.text")); // NOI18N - bnCancelModule.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.bnCancelModule.toolTipText")); // NOI18N - bnCancelModule.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - bnCancelModuleActionPerformed(evt); - } - }); - - org.openide.awt.Mnemonics.setLocalizedText(bnExit, org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.bnExit.text")); // NOI18N - bnExit.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.bnExit.toolTipText")); // NOI18N - bnExit.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - bnExitActionPerformed(evt); - } - }); - - org.openide.awt.Mnemonics.setLocalizedText(bnOptions, org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.bnOptions.text")); // NOI18N - bnOptions.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.bnOptions.toolTipText")); // NOI18N - bnOptions.setEnabled(false); - bnOptions.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - bnOptionsActionPerformed(evt); - } - }); - - org.openide.awt.Mnemonics.setLocalizedText(bnShowProgress, org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.bnShowProgress.text")); // NOI18N - bnShowProgress.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.bnShowProgress.toolTipText")); // NOI18N - bnShowProgress.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - bnShowProgressActionPerformed(evt); - } - }); - - org.openide.awt.Mnemonics.setLocalizedText(bnPause, org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.bnPause.text")); // NOI18N - bnPause.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.bnPause.toolTipText")); // NOI18N - bnPause.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - bnPauseActionPerformed(evt); - } - }); - - org.openide.awt.Mnemonics.setLocalizedText(bnPrioritizeCase, org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.bnPrioritizeCase.text")); // NOI18N - bnPrioritizeCase.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.bnPrioritizeCase.toolTipText")); // NOI18N - bnPrioritizeCase.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - bnPrioritizeCaseActionPerformed(evt); - } - }); - - org.openide.awt.Mnemonics.setLocalizedText(bnShowCaseLog, org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.bnShowCaseLog.text")); // NOI18N - bnShowCaseLog.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.bnShowCaseLog.toolTipText")); // NOI18N - bnShowCaseLog.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - bnShowCaseLogActionPerformed(evt); - } - }); - - tbStatusMessage.setEditable(false); - tbStatusMessage.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N - tbStatusMessage.setText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.tbStatusMessage.text")); // NOI18N - tbStatusMessage.setBorder(null); - - lbStatus.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N - org.openide.awt.Mnemonics.setLocalizedText(lbStatus, org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.lbStatus.text")); // NOI18N - - org.openide.awt.Mnemonics.setLocalizedText(bnPrioritizeJob, org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.bnPrioritizeJob.text")); // NOI18N - bnPrioritizeJob.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.bnPrioritizeJob.toolTipText")); // NOI18N - bnPrioritizeJob.setActionCommand(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.bnPrioritizeJob.actionCommand")); // NOI18N - bnPrioritizeJob.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - bnPrioritizeJobActionPerformed(evt); - } - }); - - lbServicesStatus.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N - org.openide.awt.Mnemonics.setLocalizedText(lbServicesStatus, org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.lbServicesStatus.text")); // NOI18N - - tbServicesStatusMessage.setEditable(false); - tbServicesStatusMessage.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N - tbServicesStatusMessage.setText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.tbServicesStatusMessage.text")); // NOI18N - tbServicesStatusMessage.setBorder(null); - - org.openide.awt.Mnemonics.setLocalizedText(bnOpenLogDir, org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.bnOpenLogDir.text")); // NOI18N - bnOpenLogDir.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - bnOpenLogDirActionPerformed(evt); - } - }); - - org.openide.awt.Mnemonics.setLocalizedText(bnReprocessJob, org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.bnReprocessJob.text")); // NOI18N - bnReprocessJob.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - bnReprocessJobActionPerformed(evt); - } - }); - - javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); - this.setLayout(layout); - layout.setHorizontalGroup( - layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addContainerGap() - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) - .addComponent(lbPending, javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(pendingScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 920, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(bnPrioritizeCase, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(bnPrioritizeJob, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) - .addGroup(layout.createSequentialGroup() - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addComponent(bnPause) - .addGap(18, 18, 18) - .addComponent(bnRefresh, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE) - .addGap(18, 18, 18) - .addComponent(bnOptions) - .addGap(18, 18, 18) - .addComponent(bnOpenLogDir) - .addGap(18, 18, 18) - .addComponent(bnExit, javax.swing.GroupLayout.PREFERRED_SIZE, 94, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addGroup(layout.createSequentialGroup() - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(runningScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 920, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(completedScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 920, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) - .addComponent(bnCancelJob, javax.swing.GroupLayout.DEFAULT_SIZE, 117, Short.MAX_VALUE) - .addComponent(bnShowProgress, javax.swing.GroupLayout.DEFAULT_SIZE, 116, Short.MAX_VALUE) - .addComponent(bnCancelModule, javax.swing.GroupLayout.DEFAULT_SIZE, 117, Short.MAX_VALUE) - .addComponent(bnDeleteCase, javax.swing.GroupLayout.DEFAULT_SIZE, 117, Short.MAX_VALUE) - .addComponent(bnShowCaseLog, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(bnReprocessJob, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) - .addGroup(layout.createSequentialGroup() - .addComponent(lbStatus) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addComponent(tbStatusMessage, javax.swing.GroupLayout.PREFERRED_SIZE, 861, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addComponent(lbCompleted) - .addComponent(lbRunning) - .addGroup(layout.createSequentialGroup() - .addComponent(lbServicesStatus) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addComponent(tbServicesStatusMessage, javax.swing.GroupLayout.PREFERRED_SIZE, 861, javax.swing.GroupLayout.PREFERRED_SIZE))) - .addGap(0, 0, Short.MAX_VALUE))) - .addContainerGap()) - ); - - layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {bnCancelJob, bnCancelModule, bnDeleteCase, bnExit, bnOpenLogDir, bnOptions, bnPause, bnRefresh, bnShowProgress}); - - layout.setVerticalGroup( - layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(lbStatus, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(tbStatusMessage, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(lbServicesStatus, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(tbServicesStatusMessage, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(lbPending, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(pendingScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 215, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addGroup(layout.createSequentialGroup() - .addGap(82, 82, 82) - .addComponent(bnPrioritizeCase) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(bnPrioritizeJob))) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(lbRunning) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addGap(34, 34, 34) - .addComponent(bnShowProgress) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(bnCancelJob) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(bnCancelModule)) - .addGroup(layout.createSequentialGroup() - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(runningScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 133, javax.swing.GroupLayout.PREFERRED_SIZE))) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addGap(68, 68, 68) - .addComponent(bnReprocessJob) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(bnDeleteCase) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(bnShowCaseLog)) - .addGroup(layout.createSequentialGroup() - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(lbCompleted) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(completedScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 179, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(bnExit) - .addComponent(bnOpenLogDir)) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(bnPause) - .addComponent(bnRefresh) - .addComponent(bnOptions))))) - .addContainerGap()) - ); - - layout.linkSize(javax.swing.SwingConstants.VERTICAL, new java.awt.Component[] {bnCancelJob, bnCancelModule, bnDeleteCase, bnExit, bnOpenLogDir, bnOptions, bnRefresh, bnShowProgress}); - - }// //GEN-END:initComponents - - /** - * Handles a click on the refresh button. Requests an immediate scan of the - * input folders for new jobs and queues a refresh of all three of the jobs - * tables. - * - * @param evt - The button click event. - */ - private void bnRefreshActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnRefreshActionPerformed - this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); - manager.scanInputDirsAndWait(); - refreshTables(); - this.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); - }//GEN-LAST:event_bnRefreshActionPerformed - - /** - * Handles a click on the delete case button. If an entry is selected that - * can be deleted, pops up a confirmation dialog. Upon confirmation, asks - * AutoIngestManager to delete the entry and asks for an updated view. - * - * @param evt The button click event. - */ - private void bnDeleteCaseActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnDeleteCaseActionPerformed - if (completedTableModel.getRowCount() < 0 || completedTable.getSelectedRow() < 0) { - return; - } - - String caseName = (String) completedTable.getValueAt(completedTable.getSelectedRow(), JobsTableModelColumns.CASE.ordinal()); - Object[] options = { - org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "ConfirmationDialog.Delete"), - org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "ConfirmationDialog.DoNotDelete") - }; - Object[] msgContent = {org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "ConfirmationDialog.DeleteAreYouSure") + "\"" + caseName + "\"?"}; - int reply = JOptionPane.showOptionDialog(this, - msgContent, - org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "ConfirmationDialog.ConfirmDeletionHeader"), - JOptionPane.DEFAULT_OPTION, - JOptionPane.WARNING_MESSAGE, - null, - options, - options[JOptionPane.NO_OPTION]); - if (reply == JOptionPane.YES_OPTION) { - bnDeleteCase.setEnabled(false); - bnShowCaseLog.setEnabled(false); - if (completedTableModel.getRowCount() > 0 && completedTable.getSelectedRow() >= 0) { - Path caseDirectoryPath = (Path) completedTableModel.getValueAt(completedTable.getSelectedRow(), JobsTableModelColumns.CASE_DIRECTORY_PATH.ordinal()); - completedTable.clearSelection(); - this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); - CaseDeletionResult result = manager.deleteCase(caseName, caseDirectoryPath); - refreshTables(); - this.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); - if (CaseDeletionResult.FAILED == result) { - JOptionPane.showMessageDialog(this, - String.format("Could not delete case %s. It may be in in use.", caseName), - org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.DeletionFailed"), - JOptionPane.INFORMATION_MESSAGE); - } else if (CaseDeletionResult.PARTIALLY_DELETED == result) { - JOptionPane.showMessageDialog(this, - String.format("Could not delete case %s. See system log for details.", caseName), - org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.DeletionFailed"), - JOptionPane.INFORMATION_MESSAGE); - } - } - } - }//GEN-LAST:event_bnDeleteCaseActionPerformed - - /** - * Handles a click on the cancel auto ingest job button. Cancels the - * selected job. - * - * @param evt The button click event. - */ - private void bnCancelJobActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnCancelJobActionPerformed - Object[] options = { - org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "ConfirmationDialog.CancelJob"), - org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "ConfirmationDialog.DoNotCancelJob")}; - int reply = JOptionPane.showOptionDialog(this, - NbBundle.getMessage(AutoIngestLegacyDashboard.class, "ConfirmationDialog.CancelJobAreYouSure"), - NbBundle.getMessage(AutoIngestLegacyDashboard.class, "ConfirmationDialog.ConfirmCancellationHeader"), - JOptionPane.DEFAULT_OPTION, - JOptionPane.WARNING_MESSAGE, - null, - options, - options[1]); - if (reply == 0) { - /* - * Call setCursor on this to ensure it appears (if there is time to - * see it). - */ - this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); - manager.cancelCurrentJob(); - refreshTables(); - this.setCursor(Cursor.getDefaultCursor()); - } - }//GEN-LAST:event_bnCancelJobActionPerformed - - /** - * Handles a click on the show auto ingest job progress button. Displays an - * ingest job progress panel. - * - * @param evt The button click event. - */ - private void bnShowProgressActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnShowProgressActionPerformed - IngestProgressSnapshotDialog dialog = new IngestProgressSnapshotDialog(this.getTopLevelAncestor(), true); - }//GEN-LAST:event_bnShowProgressActionPerformed - - /** - * Handles a click on the pause/resume auto ingest job button. Sends a - * pause/resume request to the auto ingest manager. - * - * @param evt The button click event. - */ - private void bnPauseActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnPauseActionPerformed - - if (!autoIngestStarted) { - //put up a wait cursor during the start up operation - this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); - - startUp(); - - this.setCursor(null); - //done for startup - return; - } - if (!isPaused) { - tbStatusMessage.setText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.bnPause.pausing")); - pause(true); - } else { - resume(); - } - isPaused = !isPaused; - }//GEN-LAST:event_bnPauseActionPerformed - - /** - * Handles a click on the options button. Displays the options window. - * - * @param evt The button click event. - */ - private void bnOptionsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnOptionsActionPerformed - setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); - OptionsDisplayer.getDefault().open(); - setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); - }//GEN-LAST:event_bnOptionsActionPerformed - - /** - * Handles a click on the cancel ingest module button. Cancels the currently - * running data source level ingest module for the selected job. - * - * @param evt The button click event. - */ - private void bnCancelModuleActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnCancelModuleActionPerformed - Object[] options = { - org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "ConfirmationDialog.CancelModule"), - org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "ConfirmationDialog.DoNotCancelModule")}; - int reply = JOptionPane.showOptionDialog(this, - NbBundle.getMessage(AutoIngestLegacyDashboard.class, "ConfirmationDialog.CancelModuleAreYouSure"), - NbBundle.getMessage(AutoIngestLegacyDashboard.class, "ConfirmationDialog.ConfirmCancellationHeader"), - JOptionPane.DEFAULT_OPTION, - JOptionPane.WARNING_MESSAGE, - null, - options, - options[1]); - if (reply == 0) { - /* - * Call setCursor on this to ensure it appears (if there is time to - * see it). - */ - this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); - manager.cancelCurrentDataSourceLevelIngestModule(); - refreshTables(); - this.setCursor(Cursor.getDefaultCursor()); - } - }//GEN-LAST:event_bnCancelModuleActionPerformed - - /** - * Handles a click on the exit button. Shuts down auto ingest. - * - * @param evt The button click event. - */ - private void bnExitActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnExitActionPerformed - shutdown(); - }//GEN-LAST:event_bnExitActionPerformed - - /** - * Handle a click on the prioritize case button. Requests prioritization of - * all of the auto ingest jobs for a case. - * - * @param evt The button click event. - */ - private void bnPrioritizeCaseActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnPrioritizeCaseActionPerformed - if (pendingTableModel.getRowCount() > 0 && pendingTable.getSelectedRow() >= 0) { - this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); - String caseName = (pendingTableModel.getValueAt(pendingTable.getSelectedRow(), JobsTableModelColumns.CASE.ordinal())).toString(); - manager.prioritizeCase(caseName); - refreshTables(); - pendingTable.clearSelection(); - enablePendingTableButtons(false); - AutoIngestLegacyDashboard.this.setCursor(Cursor.getDefaultCursor()); - } - }//GEN-LAST:event_bnPrioritizeCaseActionPerformed - - /** - * Handles a click on the show log button. Displays the auto ingest job log - * for a case in NotePad. - * - * @param evt The button click event. - */ - private void bnShowCaseLogActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnShowCaseLogActionPerformed - try { - int selectedRow = completedTable.getSelectedRow(); - if (selectedRow != -1) { - Path caseDirectoryPath = (Path) completedTableModel.getValueAt(selectedRow, JobsTableModelColumns.CASE_DIRECTORY_PATH.ordinal()); - if (null != caseDirectoryPath) { - Path pathToLog = AutoIngestJobLogger.getLogPath(caseDirectoryPath); - if (pathToLog.toFile().exists()) { - Desktop.getDesktop().edit(pathToLog.toFile()); - } else { - JOptionPane.showMessageDialog(this, org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.ShowLogFailed.Message"), - org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.ShowLogFailed.Title"), JOptionPane.ERROR_MESSAGE); - } - } else { - MessageNotifyUtil.Message.warn("The case directory for this job has been deleted."); - } - } - } catch (IOException ex) { - SYS_LOGGER.log(Level.SEVERE, "Dashboard error attempting to display case auto ingest log", ex); - Object[] options = {org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "DisplayLogDialog.okay")}; - JOptionPane.showOptionDialog(this, - org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "DisplayLogDialog.cannotFindLog"), - org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "DisplayLogDialog.unableToShowLogFile"), - JOptionPane.DEFAULT_OPTION, - JOptionPane.PLAIN_MESSAGE, - null, - options, - options[0]); - } - }//GEN-LAST:event_bnShowCaseLogActionPerformed - - private void bnPrioritizeJobActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnPrioritizeJobActionPerformed - if (pendingTableModel.getRowCount() > 0 && pendingTable.getSelectedRow() >= 0) { - this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); - Path manifestFilePath = (Path) (pendingTableModel.getValueAt(pendingTable.getSelectedRow(), JobsTableModelColumns.MANIFEST_FILE_PATH.ordinal())); - manager.prioritizeJob(manifestFilePath); - refreshTables(); - pendingTable.clearSelection(); - enablePendingTableButtons(false); - AutoIngestLegacyDashboard.this.setCursor(Cursor.getDefaultCursor()); - } - }//GEN-LAST:event_bnPrioritizeJobActionPerformed - - private void bnOpenLogDirActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnOpenLogDirActionPerformed - Path logDirPath = Paths.get(PlatformUtil.getUserDirectory().getAbsolutePath(), "var", "log"); - File logDir = logDirPath.toFile(); - try { - Desktop.getDesktop().open(logDir); - } catch (IOException ex) { - DialogDisplayer.getDefault().notify(new NotifyDescriptor.Message( - String.format("Unable to open log directory %s:\n%s", logDirPath, ex.getLocalizedMessage()), - NotifyDescriptor.ERROR_MESSAGE)); - } - }//GEN-LAST:event_bnOpenLogDirActionPerformed - - private void bnReprocessJobActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnReprocessJobActionPerformed - if (completedTableModel.getRowCount() < 0 || completedTable.getSelectedRow() < 0) { - return; - } - this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); - Path manifestPath = (Path) completedTableModel.getValueAt(completedTable.getSelectedRow(), JobsTableModelColumns.MANIFEST_FILE_PATH.ordinal()); - manager.reprocessJob(manifestPath); - refreshTables(); - AutoIngestLegacyDashboard.this.setCursor(Cursor.getDefaultCursor()); - }//GEN-LAST:event_bnReprocessJobActionPerformed - - // Variables declaration - do not modify//GEN-BEGIN:variables - private javax.swing.JButton bnCancelJob; - private javax.swing.JButton bnCancelModule; - private javax.swing.JButton bnDeleteCase; - private javax.swing.JButton bnExit; - private javax.swing.JButton bnOpenLogDir; - private javax.swing.JButton bnOptions; - private javax.swing.JButton bnPause; - private javax.swing.JButton bnPrioritizeCase; - private javax.swing.JButton bnPrioritizeJob; - private javax.swing.JButton bnRefresh; - private javax.swing.JButton bnReprocessJob; - private javax.swing.JButton bnShowCaseLog; - private javax.swing.JButton bnShowProgress; - private javax.swing.JScrollPane completedScrollPane; - private javax.swing.JTable completedTable; - private javax.swing.JLabel lbCompleted; - private javax.swing.JLabel lbPending; - private javax.swing.JLabel lbRunning; - private javax.swing.JLabel lbServicesStatus; - private javax.swing.JLabel lbStatus; - private javax.swing.JScrollPane pendingScrollPane; - private javax.swing.JTable pendingTable; - private javax.swing.JScrollPane runningScrollPane; - private javax.swing.JTable runningTable; - private javax.swing.JTextField tbServicesStatusMessage; - private javax.swing.JTextField tbStatusMessage; - // End of variables declaration//GEN-END:variables - -} diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestManager.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestManager.java old mode 100644 new mode 100755 diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestSystemLogger.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestSystemLogger.java old mode 100644 new mode 100755 diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutopsyManifestFileParser.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutopsyManifestFileParser.java old mode 100644 new mode 100755 diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties old mode 100644 new mode 100755 index 7e04d4c8e4..a659557b17 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties @@ -297,4 +297,4 @@ AutoIngestCasePanel.bnRefresh.text=&Refresh AutoIngestCasePanel.bnOpen.text=&Open AutoIngestCasePanel.bnShowLog.toolTipText=Display case log file for selected case AutoIngestCasePanel.bnShowLog.text=&Show Log -AutoIngestCasePanel.rbGroupLabel.text=Show cases accessed in the last 10: \ No newline at end of file +AutoIngestCasePanel.rbGroupLabel.text=Show cases accessed in the last 10: diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/CaseImportPanel.form b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/CaseImportPanel.form old mode 100644 new mode 100755 diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/CaseImportPanel.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/CaseImportPanel.java old mode 100644 new mode 100755 diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/CaseImportPanelController.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/CaseImportPanelController.java old mode 100644 new mode 100755 diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/CaseStatusIconCellRenderer.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/CaseStatusIconCellRenderer.java old mode 100644 new mode 100755 diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/CenteredGrayableCellRenderer.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/CenteredGrayableCellRenderer.java old mode 100644 new mode 100755 diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/DurationCellRenderer.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/DurationCellRenderer.java old mode 100644 new mode 100755 diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/FileExportRuleSet.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/FileExportRuleSet.java old mode 100644 new mode 100755 diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/FileExportSettings.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/FileExportSettings.java old mode 100644 new mode 100755 diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/FileExporter.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/FileExporter.java old mode 100644 new mode 100755 diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/FileExporterSettingsPanel.form b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/FileExporterSettingsPanel.form old mode 100644 new mode 100755 diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/FileExporterSettingsPanel.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/FileExporterSettingsPanel.java old mode 100644 new mode 100755 diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/GrayableCellRenderer.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/GrayableCellRenderer.java old mode 100644 new mode 100755 diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/ImportDoneCallback.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/ImportDoneCallback.java old mode 100644 new mode 100755 diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/LongDateCellRenderer.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/LongDateCellRenderer.java old mode 100644 new mode 100755 diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/Manifest.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/Manifest.java old mode 100644 new mode 100755 diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/ManifestFileParser.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/ManifestFileParser.java old mode 100644 new mode 100755 diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/ManifestNodeData.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/ManifestNodeData.java old mode 100644 new mode 100755 diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/PathUtils.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/PathUtils.java old mode 100644 new mode 100755 diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/ShortDateCellRenderer.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/ShortDateCellRenderer.java old mode 100644 new mode 100755 diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/SingleUserCaseImporter.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/SingleUserCaseImporter.java old mode 100644 new mode 100755 diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/StatusDatabaseLogger.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/StatusDatabaseLogger.java old mode 100644 new mode 100755 diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/TimeStampUtils.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/TimeStampUtils.java old mode 100644 new mode 100755 diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/layer.xml b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/layer.xml old mode 100644 new mode 100755 diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/configuration/AdvancedAutoIngestSettingsPanel.form b/Experimental/src/org/sleuthkit/autopsy/experimental/configuration/AdvancedAutoIngestSettingsPanel.form old mode 100644 new mode 100755 diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/configuration/AdvancedAutoIngestSettingsPanel.java b/Experimental/src/org/sleuthkit/autopsy/experimental/configuration/AdvancedAutoIngestSettingsPanel.java old mode 100644 new mode 100755 diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/configuration/AutoIngestSettingsPanel.form b/Experimental/src/org/sleuthkit/autopsy/experimental/configuration/AutoIngestSettingsPanel.form old mode 100644 new mode 100755 diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/configuration/AutoIngestSettingsPanel.java b/Experimental/src/org/sleuthkit/autopsy/experimental/configuration/AutoIngestSettingsPanel.java old mode 100644 new mode 100755 diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/configuration/AutoIngestSettingsPanelController.java b/Experimental/src/org/sleuthkit/autopsy/experimental/configuration/AutoIngestSettingsPanelController.java old mode 100644 new mode 100755 diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/configuration/AutoIngestUserPreferences.java b/Experimental/src/org/sleuthkit/autopsy/experimental/configuration/AutoIngestUserPreferences.java old mode 100644 new mode 100755 diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/configuration/Bundle.properties b/Experimental/src/org/sleuthkit/autopsy/experimental/configuration/Bundle.properties old mode 100644 new mode 100755 diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/configuration/Bundle_ja.properties b/Experimental/src/org/sleuthkit/autopsy/experimental/configuration/Bundle_ja.properties old mode 100644 new mode 100755 diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/configuration/NodeStatusLogPanel.form b/Experimental/src/org/sleuthkit/autopsy/experimental/configuration/NodeStatusLogPanel.form old mode 100644 new mode 100755 diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/configuration/NodeStatusLogPanel.java b/Experimental/src/org/sleuthkit/autopsy/experimental/configuration/NodeStatusLogPanel.java old mode 100644 new mode 100755 diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/configuration/SharedConfiguration.java b/Experimental/src/org/sleuthkit/autopsy/experimental/configuration/SharedConfiguration.java old mode 100644 new mode 100755 diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/configuration/StartupWindow.java b/Experimental/src/org/sleuthkit/autopsy/experimental/configuration/StartupWindow.java old mode 100644 new mode 100755 index 5e038d1ae2..a88ccfd4f2 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/configuration/StartupWindow.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/configuration/StartupWindow.java @@ -26,20 +26,17 @@ import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.JDialog; -import javax.swing.SwingUtilities; import javax.swing.WindowConstants; import org.openide.util.ImageUtilities; import org.openide.util.NbBundle; -import org.openide.util.actions.CallableSystemAction; import org.openide.util.lookup.ServiceProvider; import org.openide.windows.WindowManager; import org.sleuthkit.autopsy.casemodule.CueBannerPanel; import org.sleuthkit.autopsy.casemodule.StartupWindowInterface; import org.sleuthkit.autopsy.core.UserPreferences; import org.sleuthkit.autopsy.coreutils.NetworkUtils; -import org.sleuthkit.autopsy.experimental.autoingest.AutoIngestLegacyDashboard; +import org.sleuthkit.autopsy.experimental.autoingest.AutoIngestDashboard; import org.sleuthkit.autopsy.experimental.autoingest.AutoIngestCasePanel; -import org.sleuthkit.autopsy.experimental.autoingest.AutoIngestDashboardOpenAction; /** * The default implementation of the Autopsy startup window @@ -115,20 +112,17 @@ public final class StartupWindow extends JDialog implements StartupWindowInterfa this.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { - AutoIngestLegacyDashboard.getInstance().shutdown(); + AutoIngestDashboard.getInstance().shutdown(); } }); setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); - add(AutoIngestLegacyDashboard.getInstance()); + add(AutoIngestDashboard.getInstance()); break; case REVIEW: this.setTitle(NbBundle.getMessage(StartupWindow.class, "StartupWindow.ReviewMode") + " (" + LOCAL_HOST_NAME + ")"); caseManagementPanel = new AutoIngestCasePanel(this); setIconImage(ImageUtilities.loadImage("org/sleuthkit/autopsy/experimental/images/frame.gif", false)); //NON-NLS add(caseManagementPanel); - SwingUtilities.invokeLater(() -> { - CallableSystemAction.get(AutoIngestDashboardOpenAction.class).setEnabled(true); - }); break; default: welcomeWindow = new CueBannerPanel(); diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/images/AIM.png b/Experimental/src/org/sleuthkit/autopsy/experimental/images/AIM.png old mode 100644 new mode 100755 diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/images/arrow-down-icon.png b/Experimental/src/org/sleuthkit/autopsy/experimental/images/arrow-down-icon.png old mode 100644 new mode 100755 diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/images/arrow-up-icon.png b/Experimental/src/org/sleuthkit/autopsy/experimental/images/arrow-up-icon.png old mode 100644 new mode 100755 diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/images/artifact-icon.png b/Experimental/src/org/sleuthkit/autopsy/experimental/images/artifact-icon.png old mode 100644 new mode 100755 diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/images/autoIngest32.png b/Experimental/src/org/sleuthkit/autopsy/experimental/images/autoIngest32.png old mode 100644 new mode 100755 diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/images/bad.png b/Experimental/src/org/sleuthkit/autopsy/experimental/images/bad.png old mode 100644 new mode 100755 diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/images/extracted_content.png b/Experimental/src/org/sleuthkit/autopsy/experimental/images/extracted_content.png old mode 100644 new mode 100755 diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/images/file-size-16.png b/Experimental/src/org/sleuthkit/autopsy/experimental/images/file-size-16.png old mode 100644 new mode 100755 diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/images/frame.gif b/Experimental/src/org/sleuthkit/autopsy/experimental/images/frame.gif old mode 100644 new mode 100755 diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/images/frame32.gif b/Experimental/src/org/sleuthkit/autopsy/experimental/images/frame32.gif old mode 100644 new mode 100755 diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/images/good.png b/Experimental/src/org/sleuthkit/autopsy/experimental/images/good.png old mode 100644 new mode 100755 diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/images/import16.png b/Experimental/src/org/sleuthkit/autopsy/experimental/images/import16.png old mode 100644 new mode 100755 diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/images/import32.png b/Experimental/src/org/sleuthkit/autopsy/experimental/images/import32.png old mode 100644 new mode 100755 diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/images/knownbad-icon.png b/Experimental/src/org/sleuthkit/autopsy/experimental/images/knownbad-icon.png old mode 100644 new mode 100755 diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/images/left-arrow-16-icon.png b/Experimental/src/org/sleuthkit/autopsy/experimental/images/left-arrow-16-icon.png old mode 100644 new mode 100755 diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/images/locked.png b/Experimental/src/org/sleuthkit/autopsy/experimental/images/locked.png old mode 100644 new mode 100755 diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/images/mime-icon.png b/Experimental/src/org/sleuthkit/autopsy/experimental/images/mime-icon.png old mode 100644 new mode 100755 diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/images/minus-icon.png b/Experimental/src/org/sleuthkit/autopsy/experimental/images/minus-icon.png old mode 100644 new mode 100755 diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/images/options-icon.png b/Experimental/src/org/sleuthkit/autopsy/experimental/images/options-icon.png old mode 100644 new mode 100755 diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/images/plus-icon.png b/Experimental/src/org/sleuthkit/autopsy/experimental/images/plus-icon.png old mode 100644 new mode 100755 diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/images/ruleset-icon.png b/Experimental/src/org/sleuthkit/autopsy/experimental/images/ruleset-icon.png old mode 100644 new mode 100755 diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/images/save-icon.png b/Experimental/src/org/sleuthkit/autopsy/experimental/images/save-icon.png old mode 100644 new mode 100755 diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/images/tick.png b/Experimental/src/org/sleuthkit/autopsy/experimental/images/tick.png old mode 100644 new mode 100755 diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/images/warning16.png b/Experimental/src/org/sleuthkit/autopsy/experimental/images/warning16.png old mode 100644 new mode 100755 diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/images/yield16-icon.png b/Experimental/src/org/sleuthkit/autopsy/experimental/images/yield16-icon.png old mode 100644 new mode 100755 diff --git a/ImageGallery/.gitattributes b/ImageGallery/.gitattributes old mode 100644 new mode 100755 diff --git a/ImageGallery/.gitignore b/ImageGallery/.gitignore old mode 100644 new mode 100755 diff --git a/ImageGallery/LICENSE-2.0.txt b/ImageGallery/LICENSE-2.0.txt old mode 100644 new mode 100755 diff --git a/ImageGallery/build.xml b/ImageGallery/build.xml old mode 100644 new mode 100755 diff --git a/ImageGallery/manifest.mf b/ImageGallery/manifest.mf old mode 100644 new mode 100755 diff --git a/ImageGallery/nbproject/build-impl.xml b/ImageGallery/nbproject/build-impl.xml old mode 100644 new mode 100755 diff --git a/ImageGallery/nbproject/genfiles.properties b/ImageGallery/nbproject/genfiles.properties old mode 100644 new mode 100755 diff --git a/ImageGallery/nbproject/platform.properties b/ImageGallery/nbproject/platform.properties old mode 100644 new mode 100755 diff --git a/ImageGallery/nbproject/project.properties b/ImageGallery/nbproject/project.properties old mode 100644 new mode 100755 diff --git a/ImageGallery/nbproject/project.xml b/ImageGallery/nbproject/project.xml old mode 100644 new mode 100755 diff --git a/ImageGallery/nbproject/suite.properties b/ImageGallery/nbproject/suite.properties old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/Bundle.properties b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/Bundle.properties old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/Bundle_ja.properties b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/Bundle_ja.properties old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/FXMLConstructor.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/FXMLConstructor.java old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/FileIDSelectionModel.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/FileIDSelectionModel.java old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/FileTypeUtils.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/FileTypeUtils.java old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryController.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryController.java old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryModule.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryModule.java old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryOptionsPanel.form b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryOptionsPanel.form old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryOptionsPanel.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryOptionsPanel.java old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryOptionsPanelController.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryOptionsPanelController.java old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryPreferences.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryPreferences.java old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryTopComponent.form b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryTopComponent.form old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryTopComponent.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryTopComponent.java old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/OnStart.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/OnStart.java old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/PerCaseProperties.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/PerCaseProperties.java old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ThumbnailCache.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ThumbnailCache.java old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/actions/AddTagAction.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/actions/AddTagAction.java old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/actions/Back.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/actions/Back.java old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/actions/Bundle_ja.properties b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/actions/Bundle_ja.properties old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/actions/CategorizeAction.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/actions/CategorizeAction.java old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/actions/CategorizeGroupAction.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/actions/CategorizeGroupAction.java old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/actions/CategorizeSelectedFilesAction.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/actions/CategorizeSelectedFilesAction.java old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/actions/DeleteFollowUpTagAction.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/actions/DeleteFollowUpTagAction.java old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/actions/Forward.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/actions/Forward.java old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/actions/NextUnseenGroup.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/actions/NextUnseenGroup.java old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/actions/OpenExternalViewerAction.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/actions/OpenExternalViewerAction.java old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/actions/OpenHelpAction.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/actions/OpenHelpAction.java old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/actions/RedoAction.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/actions/RedoAction.java old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/actions/SwingMenuItemAdapter.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/actions/SwingMenuItemAdapter.java old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/actions/TagGroupAction.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/actions/TagGroupAction.java old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/actions/TagSelectedFilesAction.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/actions/TagSelectedFilesAction.java old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/actions/UndoAction.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/actions/UndoAction.java old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/actions/UndoRedoManager.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/actions/UndoRedoManager.java old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/Bundle_ja.properties b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/Bundle_ja.properties old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/Category.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/Category.java old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/CategoryManager.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/CategoryManager.java old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/DrawableAttribute.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/DrawableAttribute.java old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/DrawableDB.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/DrawableDB.java old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/DrawableFile.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/DrawableFile.java old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/DrawableTagsManager.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/DrawableTagsManager.java old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/HashSetManager.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/HashSetManager.java old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/ImageFile.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/ImageFile.java old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/VideoFile.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/VideoFile.java old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/grouping/Bundle_ja.properties b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/grouping/Bundle_ja.properties old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/grouping/DrawableGroup.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/grouping/DrawableGroup.java old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/grouping/GroupKey.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/grouping/GroupKey.java old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/grouping/GroupManager.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/grouping/GroupManager.java old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/grouping/GroupSortBy.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/grouping/GroupSortBy.java old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/grouping/GroupViewMode.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/grouping/GroupViewMode.java old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/grouping/GroupViewState.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/grouping/GroupViewState.java old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/AttributeListCell.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/AttributeListCell.java old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/Bundle_ja.properties b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/Bundle_ja.properties old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/GuiUtils.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/GuiUtils.java old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/MediaControl.fxml b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/MediaControl.fxml old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/NoGroupsDialog.fxml b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/NoGroupsDialog.fxml old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/NoGroupsDialog.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/NoGroupsDialog.java old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/SortByListCell.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/SortByListCell.java old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/SortChooser.fxml b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/SortChooser.fxml old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/SortChooser.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/SortChooser.java old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/StatusBar.fxml b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/StatusBar.fxml old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/StatusBar.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/StatusBar.java old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/SummaryTablePane.fxml b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/SummaryTablePane.fxml old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/SummaryTablePane.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/SummaryTablePane.java old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/Toolbar.fxml b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/Toolbar.fxml old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/Toolbar.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/Toolbar.java old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/VideoPlayer.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/VideoPlayer.java old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/drawableviews/Bundle_ja.properties b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/drawableviews/Bundle_ja.properties old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/drawableviews/DrawableTile.fxml b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/drawableviews/DrawableTile.fxml old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/drawableviews/DrawableTile.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/drawableviews/DrawableTile.java old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/drawableviews/DrawableTileBase.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/drawableviews/DrawableTileBase.java old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/drawableviews/DrawableUIBase.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/drawableviews/DrawableUIBase.java old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/drawableviews/DrawableView.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/drawableviews/DrawableView.java old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/drawableviews/GroupPane.fxml b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/drawableviews/GroupPane.fxml old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/drawableviews/GroupPane.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/drawableviews/GroupPane.java old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/drawableviews/MetaDataPane.fxml b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/drawableviews/MetaDataPane.fxml old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/drawableviews/MetaDataPane.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/drawableviews/MetaDataPane.java old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/drawableviews/SlideShowView.fxml b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/drawableviews/SlideShowView.fxml old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/drawableviews/SlideShowView.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/drawableviews/SlideShowView.java old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/navpanel/Bundle_ja.properties b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/navpanel/Bundle_ja.properties old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/navpanel/GroupCell.css b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/navpanel/GroupCell.css old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/navpanel/GroupCellFactory.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/navpanel/GroupCellFactory.java old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/navpanel/GroupComparators.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/navpanel/GroupComparators.java old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/navpanel/GroupTree.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/navpanel/GroupTree.java old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/navpanel/GroupTreeItem.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/navpanel/GroupTreeItem.java old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/navpanel/GroupTreeNode.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/navpanel/GroupTreeNode.java old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/navpanel/HashHitGroupList.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/navpanel/HashHitGroupList.java old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/navpanel/NavPanel.fxml b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/navpanel/NavPanel.fxml old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/navpanel/NavPanel.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/navpanel/NavPanel.java old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/Clapperboard.png b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/Clapperboard.png old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/Folder-icon.png b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/Folder-icon.png old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/TriangleDown.png b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/TriangleDown.png old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/application_view_tile.png b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/application_view_tile.png old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/arrow-090.png b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/arrow-090.png old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/arrow-180.png b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/arrow-180.png old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/arrow-270.png b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/arrow-270.png old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/arrow-circle-double-135.png b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/arrow-circle-double-135.png old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/arrow-circle-double.png b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/arrow-circle-double.png old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/arrow-resize-090.png b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/arrow-resize-090.png old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/arrow-resize.png b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/arrow-resize.png old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/arrow.png b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/arrow.png old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/arrow_down.png b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/arrow_down.png old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/arrow_up.png b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/arrow_up.png old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/border-bottom-double.png b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/border-bottom-double.png old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/border-top-bottom-double.png b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/border-top-bottom-double.png old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/btn_icon_image_gallery_32.png b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/btn_icon_image_gallery_32.png old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/btn_icon_image_gallery_48.png b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/btn_icon_image_gallery_48.png old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/bullet_arrow_down.png b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/bullet_arrow_down.png old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/camera.png b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/camera.png old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/category-icon.png b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/category-icon.png old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/clock--minus.png b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/clock--minus.png old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/clock--pencil.png b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/clock--pencil.png old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/clock--plus.png b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/clock--plus.png old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/control-double-000-small.png b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/control-double-000-small.png old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/control-double-090-small.png b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/control-double-090-small.png old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/control-double-090.png b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/control-double-090.png old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/control-double-180-small.png b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/control-double-180-small.png old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/control-double-180.png b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/control-double-180.png old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/control-double-270-small.png b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/control-double-270-small.png old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/control-double-270.png b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/control-double-270.png old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/control-double.png b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/control-double.png old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/control-stop-000-small.png b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/control-stop-000-small.png old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/control-stop.png b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/control-stop.png old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/external.png b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/external.png old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/film.png b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/film.png old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/flag_gray.png b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/flag_gray.png old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/flag_red.png b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/flag_red.png old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/folder-open-image.png b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/folder-open-image.png old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/folder-rename.png b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/folder-rename.png old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/folder-tree.png b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/folder-tree.png old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/folder.png b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/folder.png old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/folder_picture.png b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/folder_picture.png old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/folders-path.png b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/folders-path.png old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/funnel.png b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/funnel.png old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/group.png b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/group.png old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/hashset_hits.png b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/hashset_hits.png old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/icon-hashtag.png b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/icon-hashtag.png old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/info-icon-16.png b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/info-icon-16.png old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/information.png b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/information.png old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/lightbulb.png b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/lightbulb.png old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/media_controls_first_small.png b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/media_controls_first_small.png old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/media_controls_forward_small.png b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/media_controls_forward_small.png old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/media_controls_last_small.png b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/media_controls_last_small.png old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/media_controls_pause_small.png b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/media_controls_pause_small.png old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/media_controls_play_small.png b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/media_controls_play_small.png old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/media_controls_rewind_small.png b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/media_controls_rewind_small.png old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/media_controls_stop_small.png b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/media_controls_stop_small.png old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/mime_types.png b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/mime_types.png old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/page_white_stack.png b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/page_white_stack.png old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/polaroid_green_48.png b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/polaroid_green_48.png old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/polaroid_green_48_silhouette.png b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/polaroid_green_48_silhouette.png old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/prohibition.png b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/prohibition.png old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/question-frame.png b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/question-frame.png old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/redo.png b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/redo.png old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/right arrow.png b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/right arrow.png old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/right_arrow_128.png b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/right_arrow_128.png old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/shape_group.png b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/shape_group.png old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/slide.png b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/slide.png old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/sort_asc_az.png b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/sort_asc_az.png old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/sort_ascending.png b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/sort_ascending.png old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/sort_desc_az.png b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/sort_desc_az.png old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/sort_descending.png b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/sort_descending.png old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/speaker-volume-control-mute.png b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/speaker-volume-control-mute.png old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/speaker-volume-control-up.png b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/speaker-volume-control-up.png old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/speaker-volume-control.png b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/speaker-volume-control.png old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/speaker-volume-low.png b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/speaker-volume-low.png old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/speaker-volume-none.png b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/speaker-volume-none.png old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/speaker-volume.png b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/speaker-volume.png old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/tag_red.png b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/tag_red.png old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/undo.png b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/undo.png old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/video-file.png b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/images/video-file.png old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/license-imagegallery.txt b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/license-imagegallery.txt old mode 100644 new mode 100755 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/utils/TaskUtils.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/utils/TaskUtils.java old mode 100644 new mode 100755 diff --git a/InternalPythonModules/README.txt b/InternalPythonModules/README.txt old mode 100644 new mode 100755 diff --git a/InternalPythonModules/android/browserlocation.py b/InternalPythonModules/android/browserlocation.py old mode 100644 new mode 100755 diff --git a/InternalPythonModules/android/cachelocation.py b/InternalPythonModules/android/cachelocation.py old mode 100644 new mode 100755 diff --git a/InternalPythonModules/android/calllog.py b/InternalPythonModules/android/calllog.py old mode 100644 new mode 100755 diff --git a/InternalPythonModules/android/contact.py b/InternalPythonModules/android/contact.py old mode 100644 new mode 100755 diff --git a/InternalPythonModules/android/general.py b/InternalPythonModules/android/general.py old mode 100644 new mode 100755 diff --git a/InternalPythonModules/android/googlemaplocation.py b/InternalPythonModules/android/googlemaplocation.py old mode 100644 new mode 100755 diff --git a/InternalPythonModules/android/module.py b/InternalPythonModules/android/module.py old mode 100644 new mode 100755 diff --git a/InternalPythonModules/android/tangomessage.py b/InternalPythonModules/android/tangomessage.py old mode 100644 new mode 100755 diff --git a/InternalPythonModules/android/textmessage.py b/InternalPythonModules/android/textmessage.py old mode 100644 new mode 100755 diff --git a/InternalPythonModules/android/wwfmessage.py b/InternalPythonModules/android/wwfmessage.py old mode 100644 new mode 100755 diff --git a/KNOWN_ISSUES.txt b/KNOWN_ISSUES.txt old mode 100644 new mode 100755 diff --git a/KeywordSearch/build.xml b/KeywordSearch/build.xml old mode 100644 new mode 100755 diff --git a/KeywordSearch/ivy.xml b/KeywordSearch/ivy.xml old mode 100644 new mode 100755 diff --git a/KeywordSearch/ivysettings.xml b/KeywordSearch/ivysettings.xml old mode 100644 new mode 100755 diff --git a/KeywordSearch/manifest.mf b/KeywordSearch/manifest.mf old mode 100644 new mode 100755 diff --git a/KeywordSearch/nbproject/build-impl.xml b/KeywordSearch/nbproject/build-impl.xml old mode 100644 new mode 100755 diff --git a/KeywordSearch/nbproject/project.properties b/KeywordSearch/nbproject/project.properties old mode 100644 new mode 100755 diff --git a/KeywordSearch/nbproject/project.xml b/KeywordSearch/nbproject/project.xml old mode 100644 new mode 100755 diff --git a/KeywordSearch/nbproject/suite.properties b/KeywordSearch/nbproject/suite.properties old mode 100644 new mode 100755 diff --git a/KeywordSearch/solr/contexts/solr-jetty-context.xml b/KeywordSearch/solr/contexts/solr-jetty-context.xml old mode 100644 new mode 100755 diff --git a/KeywordSearch/solr/etc/jetty.xml b/KeywordSearch/solr/etc/jetty.xml old mode 100644 new mode 100755 diff --git a/KeywordSearch/solr/etc/webdefault.xml b/KeywordSearch/solr/etc/webdefault.xml old mode 100644 new mode 100755 diff --git a/KeywordSearch/solr/resources/log4j.properties b/KeywordSearch/solr/resources/log4j.properties old mode 100644 new mode 100755 diff --git a/KeywordSearch/solr/solr/configsets/AutopsyConfig/conf/admin-extra.html b/KeywordSearch/solr/solr/configsets/AutopsyConfig/conf/admin-extra.html old mode 100644 new mode 100755 diff --git a/KeywordSearch/solr/solr/configsets/AutopsyConfig/conf/elevate.xml b/KeywordSearch/solr/solr/configsets/AutopsyConfig/conf/elevate.xml old mode 100644 new mode 100755 diff --git a/KeywordSearch/solr/solr/configsets/AutopsyConfig/conf/logging-development.properties b/KeywordSearch/solr/solr/configsets/AutopsyConfig/conf/logging-development.properties old mode 100644 new mode 100755 diff --git a/KeywordSearch/solr/solr/configsets/AutopsyConfig/conf/logging-release.properties b/KeywordSearch/solr/solr/configsets/AutopsyConfig/conf/logging-release.properties old mode 100644 new mode 100755 diff --git a/KeywordSearch/solr/solr/configsets/AutopsyConfig/conf/mapping-FoldToASCII.txt b/KeywordSearch/solr/solr/configsets/AutopsyConfig/conf/mapping-FoldToASCII.txt old mode 100644 new mode 100755 diff --git a/KeywordSearch/solr/solr/configsets/AutopsyConfig/conf/mapping-ISOLatin1Accent.txt b/KeywordSearch/solr/solr/configsets/AutopsyConfig/conf/mapping-ISOLatin1Accent.txt old mode 100644 new mode 100755 diff --git a/KeywordSearch/solr/solr/configsets/AutopsyConfig/conf/protwords.txt b/KeywordSearch/solr/solr/configsets/AutopsyConfig/conf/protwords.txt old mode 100644 new mode 100755 diff --git a/KeywordSearch/solr/solr/configsets/AutopsyConfig/conf/schema.xml b/KeywordSearch/solr/solr/configsets/AutopsyConfig/conf/schema.xml old mode 100644 new mode 100755 diff --git a/KeywordSearch/solr/solr/configsets/AutopsyConfig/conf/scripts.conf b/KeywordSearch/solr/solr/configsets/AutopsyConfig/conf/scripts.conf old mode 100644 new mode 100755 diff --git a/KeywordSearch/solr/solr/configsets/AutopsyConfig/conf/solrconfig.xml b/KeywordSearch/solr/solr/configsets/AutopsyConfig/conf/solrconfig.xml old mode 100644 new mode 100755 diff --git a/KeywordSearch/solr/solr/configsets/AutopsyConfig/conf/spellings.txt b/KeywordSearch/solr/solr/configsets/AutopsyConfig/conf/spellings.txt old mode 100644 new mode 100755 diff --git a/KeywordSearch/solr/solr/configsets/AutopsyConfig/conf/stopwords.txt b/KeywordSearch/solr/solr/configsets/AutopsyConfig/conf/stopwords.txt old mode 100644 new mode 100755 diff --git a/KeywordSearch/solr/solr/configsets/AutopsyConfig/conf/stopwords_en.txt b/KeywordSearch/solr/solr/configsets/AutopsyConfig/conf/stopwords_en.txt old mode 100644 new mode 100755 diff --git a/KeywordSearch/solr/solr/configsets/AutopsyConfig/conf/synonyms.txt b/KeywordSearch/solr/solr/configsets/AutopsyConfig/conf/synonyms.txt old mode 100644 new mode 100755 diff --git a/KeywordSearch/solr/solr/solr.xml b/KeywordSearch/solr/solr/solr.xml old mode 100644 new mode 100755 diff --git a/KeywordSearch/solr/solr/zoo.cfg b/KeywordSearch/solr/solr/zoo.cfg old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/AccountsText.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/AccountsText.java old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/AddKeywordsDialog.form b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/AddKeywordsDialog.form old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/AddKeywordsDialog.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/AddKeywordsDialog.java old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/ArtifactTextExtractor.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/ArtifactTextExtractor.java old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle.properties b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle.properties old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle_ja.properties b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle_ja.properties old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Chunker.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Chunker.java old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/DropdownListSearchPanel.form b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/DropdownListSearchPanel.form old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/DropdownListSearchPanel.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/DropdownListSearchPanel.java old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/DropdownSingleTermSearchPanel.form b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/DropdownSingleTermSearchPanel.form old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/DropdownSingleTermSearchPanel.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/DropdownSingleTermSearchPanel.java old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/DropdownToolbar.form b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/DropdownToolbar.form old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/DropdownToolbar.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/DropdownToolbar.java old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/EnCaseKeywordSearchList.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/EnCaseKeywordSearchList.java old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/ExtractedContentPanel.form b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/ExtractedContentPanel.form old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/ExtractedContentPanel.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/ExtractedContentPanel.java old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/ExtractedContentViewer.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/ExtractedContentViewer.java old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/FileTextExtractor.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/FileTextExtractor.java old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/GlobalEditListPanel.form b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/GlobalEditListPanel.form old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/GlobalEditListPanel.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/GlobalEditListPanel.java old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/GlobalListSettingsPanel.form b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/GlobalListSettingsPanel.form old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/GlobalListSettingsPanel.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/GlobalListSettingsPanel.java old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/GlobalListsManagementPanel.form b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/GlobalListsManagementPanel.form old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/GlobalListsManagementPanel.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/GlobalListsManagementPanel.java old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/HighlightedText.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/HighlightedText.java old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/HtmlTextExtractor.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/HtmlTextExtractor.java old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Index.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Index.java old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/IndexFinder.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/IndexFinder.java old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/IndexMetadata.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/IndexMetadata.java old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/IndexedText.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/IndexedText.java old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Ingester.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Ingester.java old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Installer.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Installer.java old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/JerichoParserWrapper.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/JerichoParserWrapper.java old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Keyword.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Keyword.java old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordCachedArtifact.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordCachedArtifact.java old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordHit.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordHit.java old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordListsManager.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordListsManager.java old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordQueryFilter.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordQueryFilter.java old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearch.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearch.java old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchAction.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchAction.java old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchConfigurationAction.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchConfigurationAction.java old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchFilterNode.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchFilterNode.java old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchGlobalLanguageSettingsPanel.form b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchGlobalLanguageSettingsPanel.form old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchGlobalLanguageSettingsPanel.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchGlobalLanguageSettingsPanel.java old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchGlobalSearchSettingsPanel.form b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchGlobalSearchSettingsPanel.form old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchGlobalSearchSettingsPanel.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchGlobalSearchSettingsPanel.java old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchGlobalSettingsPanel.form b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchGlobalSettingsPanel.form old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchGlobalSettingsPanel.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchGlobalSettingsPanel.java old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchIngestModule.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchIngestModule.java old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchJobSettingsPanel.form b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchJobSettingsPanel.form old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchJobSettingsPanel.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchJobSettingsPanel.java old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchModuleException.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchModuleException.java old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchOptionsPanel.form b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchOptionsPanel.form old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchOptionsPanelController.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchOptionsPanelController.java old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchPanel.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchPanel.java old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchQuery.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchQuery.java old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchQueryDelegator.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchQueryDelegator.java old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchResultFactory.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchResultFactory.java old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchSettings.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchSettings.java old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchUtil.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchUtil.java old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordsSchema.xsd b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordsSchema.xsd old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/LuceneQuery.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/LuceneQuery.java old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/NoOpenCoreException.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/NoOpenCoreException.java old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/RegexQuery.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/RegexQuery.java old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/SearchRunner.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/SearchRunner.java old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Server.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Server.java old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/SolrSearchService.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/SolrSearchService.java old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/StringsTextExtractor.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/StringsTextExtractor.java old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/TermsComponentQuery.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/TermsComponentQuery.java old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/TextExtractor.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/TextExtractor.java old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/TikaTextExtractor.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/TikaTextExtractor.java old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/XmlKeywordSearchList.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/XmlKeywordSearchList.java old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/add16.png b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/add16.png old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/arrow_left.gif b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/arrow_left.gif old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/arrow_right.gif b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/arrow_right.gif old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/btn_step_back.png b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/btn_step_back.png old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/btn_step_back_disabled.png b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/btn_step_back_disabled.png old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/btn_step_back_hover.png b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/btn_step_back_hover.png old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/btn_step_forward.png b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/btn_step_forward.png old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/btn_step_forward_disabled.png b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/btn_step_forward_disabled.png old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/btn_step_forward_hover.png b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/btn_step_forward_hover.png old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/delete16.png b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/delete16.png old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/dropdown-icon-pressed.png b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/dropdown-icon-pressed.png old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/dropdown-icon-rollover.png b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/dropdown-icon-rollover.png old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/dropdown-icon.png b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/dropdown-icon.png old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/edit16.png b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/edit16.png old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/export16.png b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/export16.png old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/filter-icon.png b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/filter-icon.png old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/import16.png b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/import16.png old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/layer.xml b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/layer.xml old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/new16.png b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/new16.png old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/options-icon.png b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/options-icon.png old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/save16.png b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/save16.png old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/search-icon.png b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/search-icon.png old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/searchbutton-icon-pressed.png b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/searchbutton-icon-pressed.png old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/searchbutton-icon-rollover.png b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/searchbutton-icon-rollover.png old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/searchbutton-icon.png b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/searchbutton-icon.png old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/watchbutton-icon-pressed.png b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/watchbutton-icon-pressed.png old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/watchbutton-icon-rollover.png b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/watchbutton-icon-rollover.png old mode 100644 new mode 100755 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/watchbutton-icon.png b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/watchbutton-icon.png old mode 100644 new mode 100755 diff --git a/LICENSE-2.0.txt b/LICENSE-2.0.txt old mode 100644 new mode 100755 diff --git a/NEWS.txt b/NEWS.txt old mode 100644 new mode 100755 diff --git a/README.txt b/README.txt old mode 100644 new mode 100755 diff --git a/README_LINUX_OSX.md b/README_LINUX_OSX.md old mode 100644 new mode 100755 diff --git a/RecentActivity/build.xml b/RecentActivity/build.xml old mode 100644 new mode 100755 diff --git a/RecentActivity/ivy.xml b/RecentActivity/ivy.xml old mode 100644 new mode 100755 diff --git a/RecentActivity/ivysettings.xml b/RecentActivity/ivysettings.xml old mode 100644 new mode 100755 diff --git a/RecentActivity/manifest.mf b/RecentActivity/manifest.mf old mode 100644 new mode 100755 diff --git a/RecentActivity/nbproject/build-impl.xml b/RecentActivity/nbproject/build-impl.xml old mode 100644 new mode 100755 diff --git a/RecentActivity/nbproject/platform.properties b/RecentActivity/nbproject/platform.properties old mode 100644 new mode 100755 diff --git a/RecentActivity/nbproject/project.properties b/RecentActivity/nbproject/project.properties old mode 100644 new mode 100755 diff --git a/RecentActivity/nbproject/project.xml b/RecentActivity/nbproject/project.xml old mode 100644 new mode 100755 diff --git a/RecentActivity/nbproject/suite.properties b/RecentActivity/nbproject/suite.properties old mode 100644 new mode 100755 diff --git a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/Bundle.properties b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/Bundle.properties old mode 100644 new mode 100755 diff --git a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/Bundle_ja.properties b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/Bundle_ja.properties old mode 100644 new mode 100755 diff --git a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/Chrome.java b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/Chrome.java old mode 100644 new mode 100755 diff --git a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/Extract.java b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/Extract.java old mode 100644 new mode 100755 diff --git a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/ExtractIE.java b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/ExtractIE.java old mode 100644 new mode 100755 diff --git a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/ExtractRegistry.java b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/ExtractRegistry.java old mode 100644 new mode 100755 diff --git a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/Firefox.java b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/Firefox.java old mode 100644 new mode 100755 diff --git a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/RAImageIngestModule.java b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/RAImageIngestModule.java old mode 100644 new mode 100755 diff --git a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/RecentDocumentsByLnk.java b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/RecentDocumentsByLnk.java old mode 100644 new mode 100755 diff --git a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/SEUQAMappings.xml b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/SEUQAMappings.xml old mode 100644 new mode 100755 diff --git a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/SearchEngineSchema.xsd b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/SearchEngineSchema.xsd old mode 100644 new mode 100755 diff --git a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/SearchEngineURLQueryAnalyzer.java b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/SearchEngineURLQueryAnalyzer.java old mode 100644 new mode 100755 diff --git a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/USB_DATA.txt b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/USB_DATA.txt old mode 100644 new mode 100755 diff --git a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/UsbDeviceIdMapper.java b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/UsbDeviceIdMapper.java old mode 100644 new mode 100755 diff --git a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/Util.java b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/Util.java old mode 100644 new mode 100755 diff --git a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/layer.xml b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/layer.xml old mode 100644 new mode 100755 diff --git a/ScalpelCarver/.gitignore b/ScalpelCarver/.gitignore old mode 100644 new mode 100755 diff --git a/ScalpelCarver/build.xml b/ScalpelCarver/build.xml old mode 100644 new mode 100755 diff --git a/ScalpelCarver/manifest.mf b/ScalpelCarver/manifest.mf old mode 100644 new mode 100755 diff --git a/ScalpelCarver/nbproject/build-impl.xml b/ScalpelCarver/nbproject/build-impl.xml old mode 100644 new mode 100755 diff --git a/ScalpelCarver/nbproject/project.properties b/ScalpelCarver/nbproject/project.properties old mode 100644 new mode 100755 diff --git a/ScalpelCarver/nbproject/project.xml b/ScalpelCarver/nbproject/project.xml old mode 100644 new mode 100755 diff --git a/ScalpelCarver/src/org/sleuthkit/autopsy/scalpel/Bundle.properties b/ScalpelCarver/src/org/sleuthkit/autopsy/scalpel/Bundle.properties old mode 100644 new mode 100755 diff --git a/ScalpelCarver/src/org/sleuthkit/autopsy/scalpel/Bundle_ja.properties b/ScalpelCarver/src/org/sleuthkit/autopsy/scalpel/Bundle_ja.properties old mode 100644 new mode 100755 diff --git a/ScalpelCarver/src/org/sleuthkit/autopsy/scalpel/ScalpelCarverIngestModule.java b/ScalpelCarver/src/org/sleuthkit/autopsy/scalpel/ScalpelCarverIngestModule.java old mode 100644 new mode 100755 diff --git a/ScalpelCarver/src/org/sleuthkit/autopsy/scalpel/jni/Bundle.properties b/ScalpelCarver/src/org/sleuthkit/autopsy/scalpel/jni/Bundle.properties old mode 100644 new mode 100755 diff --git a/ScalpelCarver/src/org/sleuthkit/autopsy/scalpel/jni/Bundle_ja.properties b/ScalpelCarver/src/org/sleuthkit/autopsy/scalpel/jni/Bundle_ja.properties old mode 100644 new mode 100755 diff --git a/ScalpelCarver/src/org/sleuthkit/autopsy/scalpel/jni/ScalpelCarver.java b/ScalpelCarver/src/org/sleuthkit/autopsy/scalpel/jni/ScalpelCarver.java old mode 100644 new mode 100755 diff --git a/ScalpelCarver/src/org/sleuthkit/autopsy/scalpel/jni/ScalpelException.java b/ScalpelCarver/src/org/sleuthkit/autopsy/scalpel/jni/ScalpelException.java old mode 100644 new mode 100755 diff --git a/ScalpelCarver/src/org/sleuthkit/autopsy/scalpel/jni/ScalpelOutputParser.java b/ScalpelCarver/src/org/sleuthkit/autopsy/scalpel/jni/ScalpelOutputParser.java old mode 100644 new mode 100755 diff --git a/ScalpelCarver/src/org/sleuthkit/autopsy/scalpel/scalpel.conf b/ScalpelCarver/src/org/sleuthkit/autopsy/scalpel/scalpel.conf old mode 100644 new mode 100755 diff --git a/Testing/README.txt b/Testing/README.txt old mode 100644 new mode 100755 diff --git a/Testing/build.xml b/Testing/build.xml old mode 100644 new mode 100755 diff --git a/Testing/manifest.mf b/Testing/manifest.mf old mode 100644 new mode 100755 diff --git a/Testing/nbproject/build-impl.xml b/Testing/nbproject/build-impl.xml old mode 100644 new mode 100755 diff --git a/Testing/nbproject/project.properties b/Testing/nbproject/project.properties old mode 100644 new mode 100755 diff --git a/Testing/nbproject/project.xml b/Testing/nbproject/project.xml old mode 100644 new mode 100755 diff --git a/Testing/nbproject/suite.properties b/Testing/nbproject/suite.properties old mode 100644 new mode 100755 diff --git a/Testing/src/org/sleuthkit/autopsy/testing/Bundle.properties b/Testing/src/org/sleuthkit/autopsy/testing/Bundle.properties old mode 100644 new mode 100755 diff --git a/branding/core/core.jar/org/netbeans/core/startup/Bundle.properties b/branding/core/core.jar/org/netbeans/core/startup/Bundle.properties old mode 100644 new mode 100755 diff --git a/branding/core/core.jar/org/netbeans/core/startup/frame.gif b/branding/core/core.jar/org/netbeans/core/startup/frame.gif old mode 100644 new mode 100755 diff --git a/branding/core/core.jar/org/netbeans/core/startup/frame32.gif b/branding/core/core.jar/org/netbeans/core/startup/frame32.gif old mode 100644 new mode 100755 diff --git a/branding/core/core.jar/org/netbeans/core/startup/frame48.gif b/branding/core/core.jar/org/netbeans/core/startup/frame48.gif old mode 100644 new mode 100755 diff --git a/branding/core/core.jar/org/netbeans/core/startup/splash.gif b/branding/core/core.jar/org/netbeans/core/startup/splash.gif old mode 100644 new mode 100755 diff --git a/branding/modules/org-netbeans-core-windows.jar/org/netbeans/core/windows/view/ui/Bundle.properties b/branding/modules/org-netbeans-core-windows.jar/org/netbeans/core/windows/view/ui/Bundle.properties old mode 100644 new mode 100755 diff --git a/build-unix.xml b/build-unix.xml old mode 100644 new mode 100755 diff --git a/build-windows-installer.xml b/build-windows-installer.xml old mode 100644 new mode 100755 diff --git a/build-windows.xml b/build-windows.xml old mode 100644 new mode 100755 diff --git a/developers/netbeans_ide_java_formatting_settings.zip b/developers/netbeans_ide_java_formatting_settings.zip old mode 100644 new mode 100755 diff --git a/docs/doxygen-user/adHocKeywordSearch.dox b/docs/doxygen-user/adHocKeywordSearch.dox old mode 100644 new mode 100755 diff --git a/docs/doxygen-user/filetype.dox b/docs/doxygen-user/filetype.dox old mode 100644 new mode 100755 diff --git a/docs/doxygen-user/image_gallery.dox b/docs/doxygen-user/image_gallery.dox old mode 100644 new mode 100755 diff --git a/docs/doxygen-user/images/apachebadmessage.PNG b/docs/doxygen-user/images/apachebadmessage.PNG old mode 100644 new mode 100755 diff --git a/docs/doxygen-user/images/case-newcase.PNG b/docs/doxygen-user/images/case-newcase.PNG old mode 100644 new mode 100755 diff --git a/docs/doxygen-user/images/dzkrun.PNG b/docs/doxygen-user/images/dzkrun.PNG old mode 100644 new mode 100755 diff --git a/docs/doxygen-user/images/ingest-file-filters.PNG b/docs/doxygen-user/images/ingest-file-filters.PNG old mode 100644 new mode 100755 diff --git a/docs/doxygen-user/images/ingest-profile-create.PNG b/docs/doxygen-user/images/ingest-profile-create.PNG old mode 100644 new mode 100755 diff --git a/docs/doxygen-user/images/ingest-profiles.PNG b/docs/doxygen-user/images/ingest-profiles.PNG old mode 100644 new mode 100755 diff --git a/docs/doxygen-user/images/ingest_pipeline.PNG b/docs/doxygen-user/images/ingest_pipeline.PNG old mode 100644 new mode 100755 diff --git a/docs/doxygen-user/images/javaproperties.PNG b/docs/doxygen-user/images/javaproperties.PNG old mode 100644 new mode 100755 diff --git a/docs/doxygen-user/images/keyword-search-ad-hoc.PNG b/docs/doxygen-user/images/keyword-search-ad-hoc.PNG old mode 100644 new mode 100755 diff --git a/docs/doxygen-user/images/keyword-search-configuration-new-keywords.PNG b/docs/doxygen-user/images/keyword-search-configuration-new-keywords.PNG old mode 100644 new mode 100755 diff --git a/docs/doxygen-user/images/keyword-search-inbox.PNG b/docs/doxygen-user/images/keyword-search-inbox.PNG old mode 100644 new mode 100755 diff --git a/docs/doxygen-user/images/keyword_results.PNG b/docs/doxygen-user/images/keyword_results.PNG old mode 100644 new mode 100755 diff --git a/docs/doxygen-user/images/local-disk-data-source.PNG b/docs/doxygen-user/images/local-disk-data-source.PNG old mode 100644 new mode 100755 diff --git a/docs/doxygen-user/images/maxinactivityduration.PNG b/docs/doxygen-user/images/maxinactivityduration.PNG old mode 100644 new mode 100755 diff --git a/docs/doxygen-user/images/messagebubbles.PNG b/docs/doxygen-user/images/messagebubbles.PNG old mode 100644 new mode 100755 diff --git a/docs/doxygen-user/images/messagebubblesbigger.PNG b/docs/doxygen-user/images/messagebubblesbigger.PNG old mode 100644 new mode 100755 diff --git a/docs/doxygen-user/images/mime-type-tree.PNG b/docs/doxygen-user/images/mime-type-tree.PNG old mode 100644 new mode 100755 diff --git a/docs/doxygen-user/images/othernodeingesting.PNG b/docs/doxygen-user/images/othernodeingesting.PNG old mode 100644 new mode 100755 diff --git a/docs/doxygen-user/images/postgresqlinstall1.PNG b/docs/doxygen-user/images/postgresqlinstall1.PNG old mode 100644 new mode 100755 diff --git a/docs/doxygen-user/images/postgresqlinstall3.PNG b/docs/doxygen-user/images/postgresqlinstall3.PNG old mode 100644 new mode 100755 diff --git a/docs/doxygen-user/images/postgresqlinstall4.PNG b/docs/doxygen-user/images/postgresqlinstall4.PNG old mode 100644 new mode 100755 diff --git a/docs/doxygen-user/images/postgresqlinstall5.PNG b/docs/doxygen-user/images/postgresqlinstall5.PNG old mode 100644 new mode 100755 diff --git a/docs/doxygen-user/images/postgresqlinstall6.PNG b/docs/doxygen-user/images/postgresqlinstall6.PNG old mode 100644 new mode 100755 diff --git a/docs/doxygen-user/images/postgresqlinstall7.PNG b/docs/doxygen-user/images/postgresqlinstall7.PNG old mode 100644 new mode 100755 diff --git a/docs/doxygen-user/images/profile-data-source-panel.PNG b/docs/doxygen-user/images/profile-data-source-panel.PNG old mode 100644 new mode 100755 diff --git a/docs/doxygen-user/images/serviceinstall.PNG b/docs/doxygen-user/images/serviceinstall.PNG old mode 100644 new mode 100755 diff --git a/docs/doxygen-user/images/solrinstall1.PNG b/docs/doxygen-user/images/solrinstall1.PNG old mode 100644 new mode 100755 diff --git a/docs/doxygen-user/images/solrinstall2.PNG b/docs/doxygen-user/images/solrinstall2.PNG old mode 100644 new mode 100755 diff --git a/docs/doxygen-user/images/solrinstall3.PNG b/docs/doxygen-user/images/solrinstall3.PNG old mode 100644 new mode 100755 diff --git a/docs/doxygen-user/images/symlinkjava.PNG b/docs/doxygen-user/images/symlinkjava.PNG old mode 100644 new mode 100755 diff --git a/docs/doxygen-user/images/tagging-5.PNG b/docs/doxygen-user/images/tagging-5.PNG old mode 100644 new mode 100755 diff --git a/docs/doxygen-user/images/transientcache.PNG b/docs/doxygen-user/images/transientcache.PNG old mode 100644 new mode 100755 diff --git a/docs/doxygen-user/images/unallocated_space_options.PNG b/docs/doxygen-user/images/unallocated_space_options.PNG old mode 100644 new mode 100755 diff --git a/docs/doxygen-user/images/updatedSolr_cmd.PNG b/docs/doxygen-user/images/updatedSolr_cmd.PNG old mode 100644 new mode 100755 diff --git a/docs/doxygen-user/images/wherejava.PNG b/docs/doxygen-user/images/wherejava.PNG old mode 100644 new mode 100755 diff --git a/docs/doxygen-user/images/zooDir.PNG b/docs/doxygen-user/images/zooDir.PNG old mode 100644 new mode 100755 diff --git a/docs/doxygen-user/images/zooPurge.PNG b/docs/doxygen-user/images/zooPurge.PNG old mode 100644 new mode 100755 diff --git a/docs/doxygen-user/ingest.dox b/docs/doxygen-user/ingest.dox old mode 100644 new mode 100755 diff --git a/docs/doxygen-user/ingest_template.xod b/docs/doxygen-user/ingest_template.xod old mode 100644 new mode 100755 diff --git a/docs/doxygen-user/installMultiUser.dox b/docs/doxygen-user/installMultiUser.dox old mode 100644 new mode 100755 diff --git a/docs/doxygen-user/keyword_search.dox b/docs/doxygen-user/keyword_search.dox old mode 100644 new mode 100755 diff --git a/docs/doxygen-user/main.dox b/docs/doxygen-user/main.dox old mode 100644 new mode 100755 diff --git a/docs/doxygen-user/module_install.dox b/docs/doxygen-user/module_install.dox old mode 100644 new mode 100755 diff --git a/docs/doxygen-user/multiuser-security.dox b/docs/doxygen-user/multiuser-security.dox old mode 100644 new mode 100755 diff --git a/docs/doxygen-user/multiuser.dox b/docs/doxygen-user/multiuser.dox old mode 100644 new mode 100755 diff --git a/docs/doxygen-user/performance.dox b/docs/doxygen-user/performance.dox old mode 100644 new mode 100755 diff --git a/docs/doxygen-user/result_viewers.dox b/docs/doxygen-user/result_viewers.dox old mode 100644 new mode 100755 diff --git a/docs/doxygen-user/uilayout.dox b/docs/doxygen-user/uilayout.dox old mode 100644 new mode 100755 diff --git a/docs/doxygen-user/workflow.dox b/docs/doxygen-user/workflow.dox old mode 100644 new mode 100755 diff --git a/docs/doxygen/debugTsk.dox b/docs/doxygen/debugTsk.dox old mode 100644 new mode 100755 diff --git a/docs/doxygen/doxygen_docs/.gitignore b/docs/doxygen/doxygen_docs/.gitignore old mode 100644 new mode 100755 diff --git a/docs/doxygen/doxygen_docs/api-docs/.gitignore b/docs/doxygen/doxygen_docs/api-docs/.gitignore old mode 100644 new mode 100755 diff --git a/git-daemon-export-okay b/git-daemon-export-okay old mode 100644 new mode 100755 diff --git a/icons/icon.icns b/icons/icon.icns old mode 100644 new mode 100755 diff --git a/icons/icon.ico b/icons/icon.ico old mode 100644 new mode 100755 diff --git a/nbproject/build-impl.xml b/nbproject/build-impl.xml old mode 100644 new mode 100755 diff --git a/nbproject/genfiles.properties b/nbproject/genfiles.properties old mode 100644 new mode 100755 diff --git a/nbproject/platform.properties b/nbproject/platform.properties old mode 100644 new mode 100755 diff --git a/nbproject/platform.xml b/nbproject/platform.xml old mode 100644 new mode 100755 diff --git a/nbproject/project.properties b/nbproject/project.properties old mode 100644 new mode 100755 diff --git a/nbproject/project.xml b/nbproject/project.xml old mode 100644 new mode 100755 diff --git a/pythonExamples/July2015FileTutorial_BigRound/bigRoundFile.dat b/pythonExamples/July2015FileTutorial_BigRound/bigRoundFile.dat old mode 100644 new mode 100755 diff --git a/pythonExamples/July2015FileTutorial_BigRound/notRoundFile.dat b/pythonExamples/July2015FileTutorial_BigRound/notRoundFile.dat old mode 100644 new mode 100755 diff --git a/test/README.txt b/test/README.txt old mode 100644 new mode 100755 diff --git a/test/input/NSRL.txt-md5.idx b/test/input/NSRL.txt-md5.idx old mode 100644 new mode 100755 diff --git a/test/input/notablehashes.txt-md5.idx b/test/input/notablehashes.txt-md5.idx old mode 100644 new mode 100755 diff --git a/test/input/notablekeywords.xml b/test/input/notablekeywords.xml old mode 100644 new mode 100755 diff --git a/test/script/Emailer.py b/test/script/Emailer.py old mode 100644 new mode 100755 diff --git a/test/script/config.xml b/test/script/config.xml old mode 100644 new mode 100755 diff --git a/test/script/getcounts.py b/test/script/getcounts.py old mode 100644 new mode 100755 diff --git a/thirdparty/LICENSE-2.0.txt b/thirdparty/LICENSE-2.0.txt old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/ant-contrib.jar b/thirdparty/ant-contrib/1.0b3/ant-contrib.jar old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/LICENSE.txt b/thirdparty/ant-contrib/1.0b3/docs/LICENSE.txt old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/allclasses-frame.html b/thirdparty/ant-contrib/1.0b3/docs/api/allclasses-frame.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/allclasses-noframe.html b/thirdparty/ant-contrib/1.0b3/docs/api/allclasses-noframe.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/constant-values.html b/thirdparty/ant-contrib/1.0b3/docs/api/constant-values.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/deprecated-list.html b/thirdparty/ant-contrib/1.0b3/docs/api/deprecated-list.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/help-doc.html b/thirdparty/ant-contrib/1.0b3/docs/api/help-doc.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/index-all.html b/thirdparty/ant-contrib/1.0b3/docs/api/index-all.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/index.html b/thirdparty/ant-contrib/1.0b3/docs/api/index.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/AntContribVersion.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/AntContribVersion.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antclipse/ClassPathParser.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antclipse/ClassPathParser.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antclipse/ClassPathTask.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antclipse/ClassPathTask.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antclipse/package-frame.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antclipse/package-frame.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antclipse/package-summary.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antclipse/package-summary.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antclipse/package-tree.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antclipse/package-tree.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/Command.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/Command.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/Response.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/Response.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/Util.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/Util.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/client/Client.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/client/Client.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/client/ClientTask.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/client/ClientTask.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/client/package-frame.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/client/package-frame.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/client/package-summary.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/client/package-summary.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/client/package-tree.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/client/package-tree.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/commands/AbstractCommand.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/commands/AbstractCommand.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/commands/DisconnectCommand.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/commands/DisconnectCommand.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/commands/HelloWorldCommand.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/commands/HelloWorldCommand.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/commands/PropertyContainer.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/commands/PropertyContainer.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/commands/ReferenceContainer.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/commands/ReferenceContainer.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/commands/RunAntCommand.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/commands/RunAntCommand.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/commands/RunTargetCommand.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/commands/RunTargetCommand.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/commands/SendFileCommand.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/commands/SendFileCommand.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/commands/ShutdownCommand.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/commands/ShutdownCommand.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/commands/package-frame.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/commands/package-frame.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/commands/package-summary.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/commands/package-summary.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/commands/package-tree.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/commands/package-tree.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/package-frame.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/package-frame.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/package-summary.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/package-summary.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/package-tree.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/package-tree.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/server/ConnectionBuildListener.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/server/ConnectionBuildListener.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/server/ConnectionHandler.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/server/ConnectionHandler.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/server/Server.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/server/Server.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/server/ServerTask.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/server/ServerTask.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/server/package-frame.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/server/package-frame.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/server/package-summary.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/server/package-summary.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/server/package-tree.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/antserver/server/package-tree.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/design/Depends.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/design/Depends.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/design/Design.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/design/Design.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/design/InstructionVisitor.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/design/InstructionVisitor.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/design/Log.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/design/Log.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/design/Package.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/design/Package.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/design/VerifyDesign.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/design/VerifyDesign.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/design/VerifyDesignDelegate.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/design/VerifyDesignDelegate.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/design/package-frame.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/design/package-frame.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/design/package-summary.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/design/package-summary.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/design/package-tree.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/design/package-tree.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/inifile/IniFile.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/inifile/IniFile.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/inifile/IniFileTask.Exists.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/inifile/IniFileTask.Exists.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/inifile/IniFileTask.Get.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/inifile/IniFileTask.Get.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/inifile/IniFileTask.IniOperation.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/inifile/IniFileTask.IniOperation.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/inifile/IniFileTask.IniOperationConditional.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/inifile/IniFileTask.IniOperationConditional.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/inifile/IniFileTask.IniOperationPropertySetter.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/inifile/IniFileTask.IniOperationPropertySetter.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/inifile/IniFileTask.Remove.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/inifile/IniFileTask.Remove.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/inifile/IniFileTask.Set.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/inifile/IniFileTask.Set.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/inifile/IniFileTask.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/inifile/IniFileTask.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/inifile/IniPart.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/inifile/IniPart.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/inifile/IniProperty.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/inifile/IniProperty.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/inifile/IniSection.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/inifile/IniSection.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/inifile/package-frame.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/inifile/package-frame.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/inifile/package-summary.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/inifile/package-summary.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/inifile/package-tree.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/inifile/package-tree.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/input/GUIInputHandler.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/input/GUIInputHandler.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/input/package-frame.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/input/package-frame.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/input/package-summary.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/input/package-summary.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/input/package-tree.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/input/package-tree.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/AntCallBack.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/AntCallBack.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/AntFetch.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/AntFetch.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/Assert.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/Assert.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/ForEach.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/ForEach.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/ForTask.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/ForTask.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/IfTask.ElseIf.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/IfTask.ElseIf.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/IfTask.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/IfTask.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/OutOfDate.CollectionEnum.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/OutOfDate.CollectionEnum.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/OutOfDate.DeleteTargets.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/OutOfDate.DeleteTargets.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/OutOfDate.MyMapper.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/OutOfDate.MyMapper.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/OutOfDate.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/OutOfDate.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/ProjectDelegate.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/ProjectDelegate.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/Relentless.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/Relentless.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/RunTargetTask.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/RunTargetTask.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/Switch.Case.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/Switch.Case.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/Switch.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/Switch.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/Throw.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/Throw.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/TimestampSelector.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/TimestampSelector.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/TryCatchTask.CatchBlock.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/TryCatchTask.CatchBlock.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/TryCatchTask.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/TryCatchTask.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/condition/BooleanConditionBase.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/condition/BooleanConditionBase.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/condition/IsGreaterThan.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/condition/IsGreaterThan.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/condition/IsLessThan.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/condition/IsLessThan.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/condition/IsPropertyFalse.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/condition/IsPropertyFalse.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/condition/IsPropertyTrue.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/condition/IsPropertyTrue.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/condition/package-frame.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/condition/package-frame.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/condition/package-summary.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/condition/package-summary.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/condition/package-tree.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/condition/package-tree.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/package-frame.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/package-frame.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/package-summary.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/package-summary.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/package-tree.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/logic/package-tree.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/math/Evaluateable.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/math/Evaluateable.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/math/Math.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/math/Math.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/math/MathTask.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/math/MathTask.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/math/Numeric.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/math/Numeric.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/math/Operation.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/math/Operation.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/math/package-frame.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/math/package-frame.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/math/package-summary.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/math/package-summary.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/math/package-tree.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/math/package-tree.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/PostTask.Cookie.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/PostTask.Cookie.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/PostTask.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/PostTask.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/Prop.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/Prop.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/URLImportTask.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/URLImportTask.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/AbstractHttpStateTypeTask.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/AbstractHttpStateTypeTask.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/AbstractMethodTask.ResponseHeader.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/AbstractMethodTask.ResponseHeader.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/AbstractMethodTask.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/AbstractMethodTask.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/AddCookieTask.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/AddCookieTask.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/AddCredentialsTask.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/AddCredentialsTask.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/ClearCookiesTask.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/ClearCookiesTask.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/ClearCredentialsTask.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/ClearCredentialsTask.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/ClientParams.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/ClientParams.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/Credentials.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/Credentials.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/GetCookieTask.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/GetCookieTask.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/GetMethodTask.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/GetMethodTask.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/HeadMethodTask.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/HeadMethodTask.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/HostConfig.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/HostConfig.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/HostParams.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/HostParams.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/HttpClientType.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/HttpClientType.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/HttpStateType.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/HttpStateType.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/MethodParams.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/MethodParams.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/Params.BooleanParam.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/Params.BooleanParam.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/Params.DoubleParam.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/Params.DoubleParam.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/Params.IntParam.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/Params.IntParam.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/Params.LongParam.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/Params.LongParam.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/Params.Param.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/Params.Param.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/Params.StringParam.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/Params.StringParam.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/Params.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/Params.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/PostMethodTask.FilePartType.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/PostMethodTask.FilePartType.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/PostMethodTask.TextPartType.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/PostMethodTask.TextPartType.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/PostMethodTask.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/PostMethodTask.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/PurgeExpiredCookiesTask.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/PurgeExpiredCookiesTask.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/package-frame.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/package-frame.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/package-summary.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/package-summary.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/package-tree.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/httpclient/package-tree.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/package-frame.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/package-frame.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/package-summary.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/package-summary.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/package-tree.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/net/package-tree.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/package-frame.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/package-frame.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/package-summary.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/package-summary.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/package-tree.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/package-tree.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/perf/AntPerformanceListener.StopWatch.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/perf/AntPerformanceListener.StopWatch.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/perf/AntPerformanceListener.StopWatchComparator.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/perf/AntPerformanceListener.StopWatchComparator.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/perf/AntPerformanceListener.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/perf/AntPerformanceListener.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/perf/StopWatch.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/perf/StopWatch.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/perf/StopWatchTask.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/perf/StopWatchTask.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/perf/package-frame.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/perf/package-frame.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/perf/package-summary.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/perf/package-summary.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/perf/package-tree.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/perf/package-tree.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/platform/OsFamily.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/platform/OsFamily.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/platform/Platform.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/platform/Platform.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/platform/ShellScriptTask.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/platform/ShellScriptTask.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/platform/package-frame.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/platform/package-frame.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/platform/package-summary.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/platform/package-summary.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/platform/package-tree.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/platform/package-tree.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/process/ForgetTask.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/process/ForgetTask.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/process/Limit.TimeUnit.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/process/Limit.TimeUnit.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/process/Limit.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/process/Limit.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/process/package-frame.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/process/package-frame.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/process/package-summary.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/process/package-summary.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/process/package-tree.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/process/package-tree.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/property/AbstractPropertySetterTask.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/property/AbstractPropertySetterTask.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/property/PathFilterTask.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/property/PathFilterTask.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/property/PathToFileSet.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/property/PathToFileSet.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/property/PropertyCopy.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/property/PropertyCopy.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/property/PropertySelector.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/property/PropertySelector.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/property/RegexTask.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/property/RegexTask.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/property/RegexUtil.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/property/RegexUtil.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/property/SortList.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/property/SortList.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/property/URLEncodeTask.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/property/URLEncodeTask.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/property/Variable.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/property/Variable.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/property/package-frame.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/property/package-frame.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/property/package-summary.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/property/package-summary.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/property/package-tree.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/property/package-tree.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/util/Reflector.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/util/Reflector.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/util/ThreadPool.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/util/ThreadPool.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/util/ThreadPoolThread.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/util/ThreadPoolThread.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/util/package-frame.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/util/package-frame.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/util/package-summary.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/util/package-summary.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/util/package-tree.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/util/package-tree.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/walls/CompileWithWalls.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/walls/CompileWithWalls.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/walls/Package.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/walls/Package.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/walls/SilentCopy.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/walls/SilentCopy.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/walls/SilentMove.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/walls/SilentMove.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/walls/Walls.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/walls/Walls.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/walls/package-frame.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/walls/package-frame.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/walls/package-summary.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/walls/package-summary.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/walls/package-tree.html b/thirdparty/ant-contrib/1.0b3/docs/api/net/sf/antcontrib/walls/package-tree.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/overview-frame.html b/thirdparty/ant-contrib/1.0b3/docs/api/overview-frame.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/overview-summary.html b/thirdparty/ant-contrib/1.0b3/docs/api/overview-summary.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/overview-tree.html b/thirdparty/ant-contrib/1.0b3/docs/api/overview-tree.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/package-list b/thirdparty/ant-contrib/1.0b3/docs/api/package-list old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/resources/inherit.gif b/thirdparty/ant-contrib/1.0b3/docs/api/resources/inherit.gif old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/serialized-form.html b/thirdparty/ant-contrib/1.0b3/docs/api/serialized-form.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/api/stylesheet.css b/thirdparty/ant-contrib/1.0b3/docs/api/stylesheet.css old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/manual/index.html b/thirdparty/ant-contrib/1.0b3/docs/manual/index.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/antcallback_task.html b/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/antcallback_task.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/antclipse_task.html b/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/antclipse_task.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/antfetch_task.html b/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/antfetch_task.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/assert_task.html b/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/assert_task.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/compilewithwalls.html b/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/compilewithwalls.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/for.html b/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/for.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/foreach.html b/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/foreach.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/forget.html b/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/forget.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/get-cookie_task.html b/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/get-cookie_task.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/get-method_task.html b/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/get-method_task.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/head-method_task.html b/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/head-method_task.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/http-client_type.html b/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/http-client_type.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/http-state_type.html b/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/http-state_type.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/if.html b/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/if.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/importurl.html b/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/importurl.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/index.html b/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/index.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/inifile.html b/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/inifile.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/limit_task.html b/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/limit_task.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/math_task.html b/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/math_task.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/method_task_common.html b/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/method_task_common.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/more_conditions.html b/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/more_conditions.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/osfamily.html b/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/osfamily.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/outofdate.html b/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/outofdate.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/pathtofileset.html b/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/pathtofileset.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/performance_monitor.html b/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/performance_monitor.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/post-method_task.html b/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/post-method_task.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/post_task.html b/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/post_task.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/propertycopy.html b/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/propertycopy.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/propertyregex.html b/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/propertyregex.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/propertyselector.html b/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/propertyselector.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/relentless.html b/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/relentless.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/runtarget.html b/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/runtarget.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/server_tasks.html b/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/server_tasks.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/shellscript.html b/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/shellscript.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/sortlist.html b/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/sortlist.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/stopwatch_task.html b/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/stopwatch_task.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/switch.html b/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/switch.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/throw.html b/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/throw.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/timestampselector.html b/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/timestampselector.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/toc.html b/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/toc.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/trycatch.html b/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/trycatch.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/urlencode.html b/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/urlencode.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/variable_task.html b/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/variable_task.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/verifydesign.html b/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/verifydesign.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/verifylegacytutorial.html b/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/verifylegacytutorial.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/verifynewprojtutorial.html b/thirdparty/ant-contrib/1.0b3/docs/manual/tasks/verifynewprojtutorial.html old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/lib/bcel-5.1.jar b/thirdparty/ant-contrib/1.0b3/lib/bcel-5.1.jar old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/lib/commons-httpclient-3.0.1.jar b/thirdparty/ant-contrib/1.0b3/lib/commons-httpclient-3.0.1.jar old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/lib/commons-logging-1.0.4.jar b/thirdparty/ant-contrib/1.0b3/lib/commons-logging-1.0.4.jar old mode 100644 new mode 100755 diff --git a/thirdparty/ant-contrib/1.0b3/lib/ivy-1.3.1.jar b/thirdparty/ant-contrib/1.0b3/lib/ivy-1.3.1.jar old mode 100644 new mode 100755 diff --git a/thirdparty/apache-mime4j/apache-mime4j-core-0.8.0-SNAPSHOT.jar b/thirdparty/apache-mime4j/apache-mime4j-core-0.8.0-SNAPSHOT.jar old mode 100644 new mode 100755 diff --git a/thirdparty/apache-mime4j/apache-mime4j-dom-0.8.0-SNAPSHOT.jar b/thirdparty/apache-mime4j/apache-mime4j-dom-0.8.0-SNAPSHOT.jar old mode 100644 new mode 100755 diff --git a/thirdparty/apache-mime4j/apache-mime4j-mbox-iterator-0.8.0-SNAPSHOT.jar b/thirdparty/apache-mime4j/apache-mime4j-mbox-iterator-0.8.0-SNAPSHOT.jar old mode 100644 new mode 100755 diff --git a/thirdparty/gstreamer/windows/i386/0.10.7/gstreamer.zip b/thirdparty/gstreamer/windows/i386/0.10.7/gstreamer.zip old mode 100644 new mode 100755 diff --git a/thirdparty/java-libpst/java-libpst-1.0-SNAPSHOT.jar b/thirdparty/java-libpst/java-libpst-1.0-SNAPSHOT.jar old mode 100644 new mode 100755 diff --git a/thirdparty/jdiff/v-custom/.cvsignore b/thirdparty/jdiff/v-custom/.cvsignore old mode 100644 new mode 100755 diff --git a/thirdparty/jdiff/v-custom/LICENSE.txt b/thirdparty/jdiff/v-custom/LICENSE.txt old mode 100644 new mode 100755 diff --git a/thirdparty/jdiff/v-custom/README.txt b/thirdparty/jdiff/v-custom/README.txt old mode 100644 new mode 100755 diff --git a/thirdparty/jdiff/v-custom/doc/CHANGES.txt b/thirdparty/jdiff/v-custom/doc/CHANGES.txt old mode 100644 new mode 100755 diff --git a/thirdparty/jdiff/v-custom/doc/JDiffArticle.pdf b/thirdparty/jdiff/v-custom/doc/JDiffArticle.pdf old mode 100644 new mode 100755 diff --git a/thirdparty/jdiff/v-custom/doc/KNOWN_LIMITATIONS.txt b/thirdparty/jdiff/v-custom/doc/KNOWN_LIMITATIONS.txt old mode 100644 new mode 100755 diff --git a/thirdparty/jdiff/v-custom/doc/TODO b/thirdparty/jdiff/v-custom/doc/TODO old mode 100644 new mode 100755 diff --git a/thirdparty/jdiff/v-custom/doc/dev_notes.txt b/thirdparty/jdiff/v-custom/doc/dev_notes.txt old mode 100644 new mode 100755 diff --git a/thirdparty/jdiff/v-custom/doc/index.html b/thirdparty/jdiff/v-custom/doc/index.html old mode 100644 new mode 100755 diff --git a/thirdparty/jdiff/v-custom/doc/jdiff.html b/thirdparty/jdiff/v-custom/doc/jdiff.html old mode 100644 new mode 100755 diff --git a/thirdparty/jdiff/v-custom/doc/stylesheet.css b/thirdparty/jdiff/v-custom/doc/stylesheet.css old mode 100644 new mode 100755 diff --git a/thirdparty/jdiff/v-custom/index.xhtml b/thirdparty/jdiff/v-custom/index.xhtml old mode 100644 new mode 100755 diff --git a/thirdparty/jdiff/v-custom/jdiff.jar b/thirdparty/jdiff/v-custom/jdiff.jar old mode 100644 new mode 100755 diff --git a/thirdparty/jdiff/v-custom/lib/2000/10/XMLSchema b/thirdparty/jdiff/v-custom/lib/2000/10/XMLSchema old mode 100644 new mode 100755 diff --git a/thirdparty/jdiff/v-custom/lib/2000/10/XMLSchema-instance b/thirdparty/jdiff/v-custom/lib/2000/10/XMLSchema-instance old mode 100644 new mode 100755 diff --git a/thirdparty/jdiff/v-custom/lib/2001/XMLSchema b/thirdparty/jdiff/v-custom/lib/2001/XMLSchema old mode 100644 new mode 100755 diff --git a/thirdparty/jdiff/v-custom/lib/2001/XMLSchema-instance b/thirdparty/jdiff/v-custom/lib/2001/XMLSchema-instance old mode 100644 new mode 100755 diff --git a/thirdparty/jdiff/v-custom/lib/Null.java b/thirdparty/jdiff/v-custom/lib/Null.java old mode 100644 new mode 100755 diff --git a/thirdparty/jdiff/v-custom/lib/background.gif b/thirdparty/jdiff/v-custom/lib/background.gif old mode 100644 new mode 100755 diff --git a/thirdparty/jdiff/v-custom/lib/black.gif b/thirdparty/jdiff/v-custom/lib/black.gif old mode 100644 new mode 100755 diff --git a/thirdparty/jdiff/v-custom/lib/classdoc.jar b/thirdparty/jdiff/v-custom/lib/classdoc.jar old mode 100644 new mode 100755 diff --git a/thirdparty/jdiff/v-custom/lib/jdiff_logo.gif b/thirdparty/jdiff/v-custom/lib/jdiff_logo.gif old mode 100644 new mode 100755 diff --git a/thirdparty/jdiff/v-custom/lib/new.gif b/thirdparty/jdiff/v-custom/lib/new.gif old mode 100644 new mode 100755 diff --git a/thirdparty/jdiff/v-custom/lib/xerces.jar b/thirdparty/jdiff/v-custom/lib/xerces.jar old mode 100644 new mode 100755 diff --git a/thirdparty/jdiff/v-custom/src/api.xsd b/thirdparty/jdiff/v-custom/src/api.xsd old mode 100644 new mode 100755 diff --git a/thirdparty/jdiff/v-custom/src/comments.xsd b/thirdparty/jdiff/v-custom/src/comments.xsd old mode 100644 new mode 100755 diff --git a/thirdparty/jdiff/v-custom/src/jdiff/.cvsignore b/thirdparty/jdiff/v-custom/src/jdiff/.cvsignore old mode 100644 new mode 100755 diff --git a/thirdparty/jdiff/v-custom/src/jdiff/API.java b/thirdparty/jdiff/v-custom/src/jdiff/API.java old mode 100644 new mode 100755 diff --git a/thirdparty/jdiff/v-custom/src/jdiff/APIComparator.java b/thirdparty/jdiff/v-custom/src/jdiff/APIComparator.java old mode 100644 new mode 100755 diff --git a/thirdparty/jdiff/v-custom/src/jdiff/APIDiff.java b/thirdparty/jdiff/v-custom/src/jdiff/APIDiff.java old mode 100644 new mode 100755 diff --git a/thirdparty/jdiff/v-custom/src/jdiff/APIHandler.java b/thirdparty/jdiff/v-custom/src/jdiff/APIHandler.java old mode 100644 new mode 100755 diff --git a/thirdparty/jdiff/v-custom/src/jdiff/ClassAPI.java b/thirdparty/jdiff/v-custom/src/jdiff/ClassAPI.java old mode 100644 new mode 100755 diff --git a/thirdparty/jdiff/v-custom/src/jdiff/ClassDiff.java b/thirdparty/jdiff/v-custom/src/jdiff/ClassDiff.java old mode 100644 new mode 100755 diff --git a/thirdparty/jdiff/v-custom/src/jdiff/Comments.java b/thirdparty/jdiff/v-custom/src/jdiff/Comments.java old mode 100644 new mode 100755 diff --git a/thirdparty/jdiff/v-custom/src/jdiff/CommentsHandler.java b/thirdparty/jdiff/v-custom/src/jdiff/CommentsHandler.java old mode 100644 new mode 100755 diff --git a/thirdparty/jdiff/v-custom/src/jdiff/CompareClassPdiffs.java b/thirdparty/jdiff/v-custom/src/jdiff/CompareClassPdiffs.java old mode 100644 new mode 100755 diff --git a/thirdparty/jdiff/v-custom/src/jdiff/ComparePkgPdiffs.java b/thirdparty/jdiff/v-custom/src/jdiff/ComparePkgPdiffs.java old mode 100644 new mode 100755 diff --git a/thirdparty/jdiff/v-custom/src/jdiff/ConstructorAPI.java b/thirdparty/jdiff/v-custom/src/jdiff/ConstructorAPI.java old mode 100644 new mode 100755 diff --git a/thirdparty/jdiff/v-custom/src/jdiff/Diff.java b/thirdparty/jdiff/v-custom/src/jdiff/Diff.java old mode 100644 new mode 100755 diff --git a/thirdparty/jdiff/v-custom/src/jdiff/DiffMyers.java b/thirdparty/jdiff/v-custom/src/jdiff/DiffMyers.java old mode 100644 new mode 100755 diff --git a/thirdparty/jdiff/v-custom/src/jdiff/DiffOutput.java b/thirdparty/jdiff/v-custom/src/jdiff/DiffOutput.java old mode 100644 new mode 100755 diff --git a/thirdparty/jdiff/v-custom/src/jdiff/FieldAPI.java b/thirdparty/jdiff/v-custom/src/jdiff/FieldAPI.java old mode 100644 new mode 100755 diff --git a/thirdparty/jdiff/v-custom/src/jdiff/HTMLFiles.java b/thirdparty/jdiff/v-custom/src/jdiff/HTMLFiles.java old mode 100644 new mode 100755 diff --git a/thirdparty/jdiff/v-custom/src/jdiff/HTMLIndexes.java b/thirdparty/jdiff/v-custom/src/jdiff/HTMLIndexes.java old mode 100644 new mode 100755 diff --git a/thirdparty/jdiff/v-custom/src/jdiff/HTMLReportGenerator.java b/thirdparty/jdiff/v-custom/src/jdiff/HTMLReportGenerator.java old mode 100644 new mode 100755 diff --git a/thirdparty/jdiff/v-custom/src/jdiff/HTMLStatistics.java b/thirdparty/jdiff/v-custom/src/jdiff/HTMLStatistics.java old mode 100644 new mode 100755 diff --git a/thirdparty/jdiff/v-custom/src/jdiff/JDiff.java b/thirdparty/jdiff/v-custom/src/jdiff/JDiff.java old mode 100644 new mode 100755 diff --git a/thirdparty/jdiff/v-custom/src/jdiff/JDiffAntTask.java b/thirdparty/jdiff/v-custom/src/jdiff/JDiffAntTask.java old mode 100644 new mode 100755 diff --git a/thirdparty/jdiff/v-custom/src/jdiff/MemberDiff.java b/thirdparty/jdiff/v-custom/src/jdiff/MemberDiff.java old mode 100644 new mode 100755 diff --git a/thirdparty/jdiff/v-custom/src/jdiff/MergeChanges.java b/thirdparty/jdiff/v-custom/src/jdiff/MergeChanges.java old mode 100644 new mode 100755 diff --git a/thirdparty/jdiff/v-custom/src/jdiff/MethodAPI.java b/thirdparty/jdiff/v-custom/src/jdiff/MethodAPI.java old mode 100644 new mode 100755 diff --git a/thirdparty/jdiff/v-custom/src/jdiff/Modifiers.java b/thirdparty/jdiff/v-custom/src/jdiff/Modifiers.java old mode 100644 new mode 100755 diff --git a/thirdparty/jdiff/v-custom/src/jdiff/Options.java b/thirdparty/jdiff/v-custom/src/jdiff/Options.java old mode 100644 new mode 100755 diff --git a/thirdparty/jdiff/v-custom/src/jdiff/PackageAPI.java b/thirdparty/jdiff/v-custom/src/jdiff/PackageAPI.java old mode 100644 new mode 100755 diff --git a/thirdparty/jdiff/v-custom/src/jdiff/PackageDiff.java b/thirdparty/jdiff/v-custom/src/jdiff/PackageDiff.java old mode 100644 new mode 100755 diff --git a/thirdparty/jdiff/v-custom/src/jdiff/ParamAPI.java b/thirdparty/jdiff/v-custom/src/jdiff/ParamAPI.java old mode 100644 new mode 100755 diff --git a/thirdparty/jdiff/v-custom/src/jdiff/RootDocToXML.java b/thirdparty/jdiff/v-custom/src/jdiff/RootDocToXML.java old mode 100644 new mode 100755 diff --git a/thirdparty/jdiff/v-custom/src/jdiff/ScriptReport.java b/thirdparty/jdiff/v-custom/src/jdiff/ScriptReport.java old mode 100644 new mode 100755 diff --git a/thirdparty/jdiff/v-custom/src/jdiff/SingleComment.java b/thirdparty/jdiff/v-custom/src/jdiff/SingleComment.java old mode 100644 new mode 100755 diff --git a/thirdparty/jdiff/v-custom/src/jdiff/StreamReader.java b/thirdparty/jdiff/v-custom/src/jdiff/StreamReader.java old mode 100644 new mode 100755 diff --git a/thirdparty/jdiff/v-custom/src/jdiff/XMLToAPI.java b/thirdparty/jdiff/v-custom/src/jdiff/XMLToAPI.java old mode 100644 new mode 100755 diff --git a/thirdparty/jdom/jdom-2.0.5-contrib.jar b/thirdparty/jdom/jdom-2.0.5-contrib.jar old mode 100644 new mode 100755 diff --git a/thirdparty/jdom/jdom-2.0.5.jar b/thirdparty/jdom/jdom-2.0.5.jar old mode 100644 new mode 100755 diff --git a/thirdparty/jfxrt/1.7.11/jfxrt.jar b/thirdparty/jfxrt/1.7.11/jfxrt.jar old mode 100644 new mode 100755 diff --git a/thirdparty/jfxrt/1.7.13/jfxrt.jar b/thirdparty/jfxrt/1.7.13/jfxrt.jar old mode 100644 new mode 100755 diff --git a/thirdparty/jfxrt/1.7.21/jfxrt.jar b/thirdparty/jfxrt/1.7.21/jfxrt.jar old mode 100644 new mode 100755 diff --git a/thirdparty/junit/7.3.1/junit.zip b/thirdparty/junit/7.3.1/junit.zip old mode 100644 new mode 100755 diff --git a/thirdparty/junit/7.3/junit.zip b/thirdparty/junit/7.3/junit.zip old mode 100644 new mode 100755 diff --git a/thirdparty/junit/8.2/junit.zip b/thirdparty/junit/8.2/junit.zip old mode 100644 new mode 100755 diff --git a/thirdparty/libscalpel_jni/current/libscalpel_jni.zip b/thirdparty/libscalpel_jni/current/libscalpel_jni.zip old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/ext/opencv-248.jar b/thirdparty/opencv/ext/opencv-248.jar old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/amd64/api-ms-win-core-console-l1-1-0.dll b/thirdparty/opencv/lib/amd64/api-ms-win-core-console-l1-1-0.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/amd64/api-ms-win-core-datetime-l1-1-0.dll b/thirdparty/opencv/lib/amd64/api-ms-win-core-datetime-l1-1-0.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/amd64/api-ms-win-core-debug-l1-1-0.dll b/thirdparty/opencv/lib/amd64/api-ms-win-core-debug-l1-1-0.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/amd64/api-ms-win-core-errorhandling-l1-1-0.dll b/thirdparty/opencv/lib/amd64/api-ms-win-core-errorhandling-l1-1-0.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/amd64/api-ms-win-core-file-l1-1-0.dll b/thirdparty/opencv/lib/amd64/api-ms-win-core-file-l1-1-0.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/amd64/api-ms-win-core-file-l1-2-0.dll b/thirdparty/opencv/lib/amd64/api-ms-win-core-file-l1-2-0.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/amd64/api-ms-win-core-file-l2-1-0.dll b/thirdparty/opencv/lib/amd64/api-ms-win-core-file-l2-1-0.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/amd64/api-ms-win-core-handle-l1-1-0.dll b/thirdparty/opencv/lib/amd64/api-ms-win-core-handle-l1-1-0.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/amd64/api-ms-win-core-heap-l1-1-0.dll b/thirdparty/opencv/lib/amd64/api-ms-win-core-heap-l1-1-0.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/amd64/api-ms-win-core-interlocked-l1-1-0.dll b/thirdparty/opencv/lib/amd64/api-ms-win-core-interlocked-l1-1-0.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/amd64/api-ms-win-core-libraryloader-l1-1-0.dll b/thirdparty/opencv/lib/amd64/api-ms-win-core-libraryloader-l1-1-0.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/amd64/api-ms-win-core-localization-l1-2-0.dll b/thirdparty/opencv/lib/amd64/api-ms-win-core-localization-l1-2-0.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/amd64/api-ms-win-core-memory-l1-1-0.dll b/thirdparty/opencv/lib/amd64/api-ms-win-core-memory-l1-1-0.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/amd64/api-ms-win-core-namedpipe-l1-1-0.dll b/thirdparty/opencv/lib/amd64/api-ms-win-core-namedpipe-l1-1-0.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/amd64/api-ms-win-core-processenvironment-l1-1-0.dll b/thirdparty/opencv/lib/amd64/api-ms-win-core-processenvironment-l1-1-0.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/amd64/api-ms-win-core-processthreads-l1-1-0.dll b/thirdparty/opencv/lib/amd64/api-ms-win-core-processthreads-l1-1-0.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/amd64/api-ms-win-core-processthreads-l1-1-1.dll b/thirdparty/opencv/lib/amd64/api-ms-win-core-processthreads-l1-1-1.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/amd64/api-ms-win-core-profile-l1-1-0.dll b/thirdparty/opencv/lib/amd64/api-ms-win-core-profile-l1-1-0.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/amd64/api-ms-win-core-rtlsupport-l1-1-0.dll b/thirdparty/opencv/lib/amd64/api-ms-win-core-rtlsupport-l1-1-0.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/amd64/api-ms-win-core-string-l1-1-0.dll b/thirdparty/opencv/lib/amd64/api-ms-win-core-string-l1-1-0.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/amd64/api-ms-win-core-synch-l1-1-0.dll b/thirdparty/opencv/lib/amd64/api-ms-win-core-synch-l1-1-0.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/amd64/api-ms-win-core-synch-l1-2-0.dll b/thirdparty/opencv/lib/amd64/api-ms-win-core-synch-l1-2-0.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/amd64/api-ms-win-core-sysinfo-l1-1-0.dll b/thirdparty/opencv/lib/amd64/api-ms-win-core-sysinfo-l1-1-0.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/amd64/api-ms-win-core-timezone-l1-1-0.dll b/thirdparty/opencv/lib/amd64/api-ms-win-core-timezone-l1-1-0.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/amd64/api-ms-win-core-util-l1-1-0.dll b/thirdparty/opencv/lib/amd64/api-ms-win-core-util-l1-1-0.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/amd64/api-ms-win-crt-conio-l1-1-0.dll b/thirdparty/opencv/lib/amd64/api-ms-win-crt-conio-l1-1-0.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/amd64/api-ms-win-crt-convert-l1-1-0.dll b/thirdparty/opencv/lib/amd64/api-ms-win-crt-convert-l1-1-0.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/amd64/api-ms-win-crt-environment-l1-1-0.dll b/thirdparty/opencv/lib/amd64/api-ms-win-crt-environment-l1-1-0.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/amd64/api-ms-win-crt-filesystem-l1-1-0.dll b/thirdparty/opencv/lib/amd64/api-ms-win-crt-filesystem-l1-1-0.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/amd64/api-ms-win-crt-heap-l1-1-0.dll b/thirdparty/opencv/lib/amd64/api-ms-win-crt-heap-l1-1-0.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/amd64/api-ms-win-crt-locale-l1-1-0.dll b/thirdparty/opencv/lib/amd64/api-ms-win-crt-locale-l1-1-0.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/amd64/api-ms-win-crt-math-l1-1-0.dll b/thirdparty/opencv/lib/amd64/api-ms-win-crt-math-l1-1-0.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/amd64/api-ms-win-crt-multibyte-l1-1-0.dll b/thirdparty/opencv/lib/amd64/api-ms-win-crt-multibyte-l1-1-0.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/amd64/api-ms-win-crt-private-l1-1-0.dll b/thirdparty/opencv/lib/amd64/api-ms-win-crt-private-l1-1-0.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/amd64/api-ms-win-crt-process-l1-1-0.dll b/thirdparty/opencv/lib/amd64/api-ms-win-crt-process-l1-1-0.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/amd64/api-ms-win-crt-runtime-l1-1-0.dll b/thirdparty/opencv/lib/amd64/api-ms-win-crt-runtime-l1-1-0.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/amd64/api-ms-win-crt-stdio-l1-1-0.dll b/thirdparty/opencv/lib/amd64/api-ms-win-crt-stdio-l1-1-0.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/amd64/api-ms-win-crt-string-l1-1-0.dll b/thirdparty/opencv/lib/amd64/api-ms-win-crt-string-l1-1-0.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/amd64/api-ms-win-crt-time-l1-1-0.dll b/thirdparty/opencv/lib/amd64/api-ms-win-crt-time-l1-1-0.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/amd64/api-ms-win-crt-utility-l1-1-0.dll b/thirdparty/opencv/lib/amd64/api-ms-win-crt-utility-l1-1-0.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/amd64/concrt140.dll b/thirdparty/opencv/lib/amd64/concrt140.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/amd64/libeay32.dll b/thirdparty/opencv/lib/amd64/libeay32.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/amd64/libewf.dll b/thirdparty/opencv/lib/amd64/libewf.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/amd64/libiconv-2.dll b/thirdparty/opencv/lib/amd64/libiconv-2.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/amd64/libintl-8.dll b/thirdparty/opencv/lib/amd64/libintl-8.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/amd64/libpq.dll b/thirdparty/opencv/lib/amd64/libpq.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/amd64/libvhdi.dll b/thirdparty/opencv/lib/amd64/libvhdi.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/amd64/libvmdk.dll b/thirdparty/opencv/lib/amd64/libvmdk.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/amd64/msvcp140.dll b/thirdparty/opencv/lib/amd64/msvcp140.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/amd64/msvcr120.dll b/thirdparty/opencv/lib/amd64/msvcr120.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/amd64/opencv_ffmpeg248_64.dll b/thirdparty/opencv/lib/amd64/opencv_ffmpeg248_64.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/amd64/opencv_java248.dll b/thirdparty/opencv/lib/amd64/opencv_java248.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/amd64/ssleay32.dll b/thirdparty/opencv/lib/amd64/ssleay32.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/amd64/ucrtbase.dll b/thirdparty/opencv/lib/amd64/ucrtbase.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/amd64/vccorlib140.dll b/thirdparty/opencv/lib/amd64/vccorlib140.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/amd64/vcruntime140.dll b/thirdparty/opencv/lib/amd64/vcruntime140.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/amd64/zlib.dll b/thirdparty/opencv/lib/amd64/zlib.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/i386/opencv_ffmpeg248.dll b/thirdparty/opencv/lib/i386/opencv_ffmpeg248.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/i386/opencv_java248.dll b/thirdparty/opencv/lib/i386/opencv_java248.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/i586/opencv_ffmpeg248_64.dll b/thirdparty/opencv/lib/i586/opencv_ffmpeg248_64.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/i586/opencv_java248.dll b/thirdparty/opencv/lib/i586/opencv_java248.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/i686/opencv_ffmpeg248_64.dll b/thirdparty/opencv/lib/i686/opencv_ffmpeg248_64.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/i686/opencv_java248.dll b/thirdparty/opencv/lib/i686/opencv_java248.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/x86/opencv_ffmpeg248.dll b/thirdparty/opencv/lib/x86/opencv_ffmpeg248.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/x86/opencv_java248.dll b/thirdparty/opencv/lib/x86/opencv_java248.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/x86_64/api-ms-win-core-console-l1-1-0.dll b/thirdparty/opencv/lib/x86_64/api-ms-win-core-console-l1-1-0.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/x86_64/api-ms-win-core-datetime-l1-1-0.dll b/thirdparty/opencv/lib/x86_64/api-ms-win-core-datetime-l1-1-0.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/x86_64/api-ms-win-core-debug-l1-1-0.dll b/thirdparty/opencv/lib/x86_64/api-ms-win-core-debug-l1-1-0.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/x86_64/api-ms-win-core-errorhandling-l1-1-0.dll b/thirdparty/opencv/lib/x86_64/api-ms-win-core-errorhandling-l1-1-0.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/x86_64/api-ms-win-core-file-l1-1-0.dll b/thirdparty/opencv/lib/x86_64/api-ms-win-core-file-l1-1-0.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/x86_64/api-ms-win-core-file-l1-2-0.dll b/thirdparty/opencv/lib/x86_64/api-ms-win-core-file-l1-2-0.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/x86_64/api-ms-win-core-file-l2-1-0.dll b/thirdparty/opencv/lib/x86_64/api-ms-win-core-file-l2-1-0.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/x86_64/api-ms-win-core-handle-l1-1-0.dll b/thirdparty/opencv/lib/x86_64/api-ms-win-core-handle-l1-1-0.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/x86_64/api-ms-win-core-heap-l1-1-0.dll b/thirdparty/opencv/lib/x86_64/api-ms-win-core-heap-l1-1-0.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/x86_64/api-ms-win-core-interlocked-l1-1-0.dll b/thirdparty/opencv/lib/x86_64/api-ms-win-core-interlocked-l1-1-0.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/x86_64/api-ms-win-core-libraryloader-l1-1-0.dll b/thirdparty/opencv/lib/x86_64/api-ms-win-core-libraryloader-l1-1-0.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/x86_64/api-ms-win-core-localization-l1-2-0.dll b/thirdparty/opencv/lib/x86_64/api-ms-win-core-localization-l1-2-0.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/x86_64/api-ms-win-core-memory-l1-1-0.dll b/thirdparty/opencv/lib/x86_64/api-ms-win-core-memory-l1-1-0.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/x86_64/api-ms-win-core-namedpipe-l1-1-0.dll b/thirdparty/opencv/lib/x86_64/api-ms-win-core-namedpipe-l1-1-0.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/x86_64/api-ms-win-core-processenvironment-l1-1-0.dll b/thirdparty/opencv/lib/x86_64/api-ms-win-core-processenvironment-l1-1-0.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/x86_64/api-ms-win-core-processthreads-l1-1-0.dll b/thirdparty/opencv/lib/x86_64/api-ms-win-core-processthreads-l1-1-0.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/x86_64/api-ms-win-core-processthreads-l1-1-1.dll b/thirdparty/opencv/lib/x86_64/api-ms-win-core-processthreads-l1-1-1.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/x86_64/api-ms-win-core-profile-l1-1-0.dll b/thirdparty/opencv/lib/x86_64/api-ms-win-core-profile-l1-1-0.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/x86_64/api-ms-win-core-rtlsupport-l1-1-0.dll b/thirdparty/opencv/lib/x86_64/api-ms-win-core-rtlsupport-l1-1-0.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/x86_64/api-ms-win-core-string-l1-1-0.dll b/thirdparty/opencv/lib/x86_64/api-ms-win-core-string-l1-1-0.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/x86_64/api-ms-win-core-synch-l1-1-0.dll b/thirdparty/opencv/lib/x86_64/api-ms-win-core-synch-l1-1-0.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/x86_64/api-ms-win-core-synch-l1-2-0.dll b/thirdparty/opencv/lib/x86_64/api-ms-win-core-synch-l1-2-0.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/x86_64/api-ms-win-core-sysinfo-l1-1-0.dll b/thirdparty/opencv/lib/x86_64/api-ms-win-core-sysinfo-l1-1-0.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/x86_64/api-ms-win-core-timezone-l1-1-0.dll b/thirdparty/opencv/lib/x86_64/api-ms-win-core-timezone-l1-1-0.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/x86_64/api-ms-win-core-util-l1-1-0.dll b/thirdparty/opencv/lib/x86_64/api-ms-win-core-util-l1-1-0.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/x86_64/api-ms-win-crt-conio-l1-1-0.dll b/thirdparty/opencv/lib/x86_64/api-ms-win-crt-conio-l1-1-0.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/x86_64/api-ms-win-crt-convert-l1-1-0.dll b/thirdparty/opencv/lib/x86_64/api-ms-win-crt-convert-l1-1-0.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/x86_64/api-ms-win-crt-environment-l1-1-0.dll b/thirdparty/opencv/lib/x86_64/api-ms-win-crt-environment-l1-1-0.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/x86_64/api-ms-win-crt-filesystem-l1-1-0.dll b/thirdparty/opencv/lib/x86_64/api-ms-win-crt-filesystem-l1-1-0.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/x86_64/api-ms-win-crt-heap-l1-1-0.dll b/thirdparty/opencv/lib/x86_64/api-ms-win-crt-heap-l1-1-0.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/x86_64/api-ms-win-crt-locale-l1-1-0.dll b/thirdparty/opencv/lib/x86_64/api-ms-win-crt-locale-l1-1-0.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/x86_64/api-ms-win-crt-math-l1-1-0.dll b/thirdparty/opencv/lib/x86_64/api-ms-win-crt-math-l1-1-0.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/x86_64/api-ms-win-crt-multibyte-l1-1-0.dll b/thirdparty/opencv/lib/x86_64/api-ms-win-crt-multibyte-l1-1-0.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/x86_64/api-ms-win-crt-private-l1-1-0.dll b/thirdparty/opencv/lib/x86_64/api-ms-win-crt-private-l1-1-0.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/x86_64/api-ms-win-crt-process-l1-1-0.dll b/thirdparty/opencv/lib/x86_64/api-ms-win-crt-process-l1-1-0.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/x86_64/api-ms-win-crt-runtime-l1-1-0.dll b/thirdparty/opencv/lib/x86_64/api-ms-win-crt-runtime-l1-1-0.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/x86_64/api-ms-win-crt-stdio-l1-1-0.dll b/thirdparty/opencv/lib/x86_64/api-ms-win-crt-stdio-l1-1-0.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/x86_64/api-ms-win-crt-string-l1-1-0.dll b/thirdparty/opencv/lib/x86_64/api-ms-win-crt-string-l1-1-0.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/x86_64/api-ms-win-crt-time-l1-1-0.dll b/thirdparty/opencv/lib/x86_64/api-ms-win-crt-time-l1-1-0.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/x86_64/api-ms-win-crt-utility-l1-1-0.dll b/thirdparty/opencv/lib/x86_64/api-ms-win-crt-utility-l1-1-0.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/x86_64/concrt140.dll b/thirdparty/opencv/lib/x86_64/concrt140.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/x86_64/libeay32.dll b/thirdparty/opencv/lib/x86_64/libeay32.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/x86_64/libewf.dll b/thirdparty/opencv/lib/x86_64/libewf.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/x86_64/libiconv-2.dll b/thirdparty/opencv/lib/x86_64/libiconv-2.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/x86_64/libintl-8.dll b/thirdparty/opencv/lib/x86_64/libintl-8.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/x86_64/libpq.dll b/thirdparty/opencv/lib/x86_64/libpq.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/x86_64/libvhdi.dll b/thirdparty/opencv/lib/x86_64/libvhdi.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/x86_64/libvmdk.dll b/thirdparty/opencv/lib/x86_64/libvmdk.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/x86_64/msvcp140.dll b/thirdparty/opencv/lib/x86_64/msvcp140.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/x86_64/msvcr120.dll b/thirdparty/opencv/lib/x86_64/msvcr120.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/x86_64/opencv_ffmpeg248_64.dll b/thirdparty/opencv/lib/x86_64/opencv_ffmpeg248_64.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/x86_64/opencv_java248.dll b/thirdparty/opencv/lib/x86_64/opencv_java248.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/x86_64/ssleay32.dll b/thirdparty/opencv/lib/x86_64/ssleay32.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/x86_64/ucrtbase.dll b/thirdparty/opencv/lib/x86_64/ucrtbase.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/x86_64/vccorlib140.dll b/thirdparty/opencv/lib/x86_64/vccorlib140.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/x86_64/vcruntime140.dll b/thirdparty/opencv/lib/x86_64/vcruntime140.dll old mode 100644 new mode 100755 diff --git a/thirdparty/opencv/lib/x86_64/zlib.dll b/thirdparty/opencv/lib/x86_64/zlib.dll old mode 100644 new mode 100755 diff --git a/thirdparty/pasco2/.classpath b/thirdparty/pasco2/.classpath old mode 100644 new mode 100755 diff --git a/thirdparty/pasco2/.project b/thirdparty/pasco2/.project old mode 100644 new mode 100755 diff --git a/thirdparty/pasco2/.settings/org.eclipse.jdt.core.prefs b/thirdparty/pasco2/.settings/org.eclipse.jdt.core.prefs old mode 100644 new mode 100755 diff --git a/thirdparty/pasco2/.settings/org.eclipse.jdt.ui.prefs b/thirdparty/pasco2/.settings/org.eclipse.jdt.ui.prefs old mode 100644 new mode 100755 diff --git a/thirdparty/pasco2/build.xml b/thirdparty/pasco2/build.xml old mode 100644 new mode 100755 diff --git a/thirdparty/pasco2/lib/commons-cli-1.0.jar b/thirdparty/pasco2/lib/commons-cli-1.0.jar old mode 100644 new mode 100755 diff --git a/thirdparty/pasco2/lib/commons-collections-3.1.jar b/thirdparty/pasco2/lib/commons-collections-3.1.jar old mode 100644 new mode 100755 diff --git a/thirdparty/pasco2/lib/ctypes4j.dll b/thirdparty/pasco2/lib/ctypes4j.dll old mode 100644 new mode 100755 diff --git a/thirdparty/pasco2/lib/ctypes4j.jar b/thirdparty/pasco2/lib/ctypes4j.jar old mode 100644 new mode 100755 diff --git a/thirdparty/pasco2/lib/ctypes4j.zip b/thirdparty/pasco2/lib/ctypes4j.zip old mode 100644 new mode 100755 diff --git a/thirdparty/pasco2/lib/pasco2.jar b/thirdparty/pasco2/lib/pasco2.jar old mode 100644 new mode 100755 diff --git a/thirdparty/pasco2/lib/trove-1.0.2.jar b/thirdparty/pasco2/lib/trove-1.0.2.jar old mode 100644 new mode 100755 diff --git a/thirdparty/pasco2/lib/trove-3.0.2.jar b/thirdparty/pasco2/lib/trove-3.0.2.jar old mode 100644 new mode 100755 diff --git a/thirdparty/pasco2/results/pasco2Result0.txt b/thirdparty/pasco2/results/pasco2Result0.txt old mode 100644 new mode 100755 diff --git a/thirdparty/pasco2/src/isi/pasco2/Main.java b/thirdparty/pasco2/src/isi/pasco2/Main.java old mode 100644 new mode 100755 diff --git a/thirdparty/pasco2/src/isi/pasco2/Poller.java b/thirdparty/pasco2/src/isi/pasco2/Poller.java old mode 100644 new mode 100755 diff --git a/thirdparty/pasco2/src/isi/pasco2/handler/AbstractPrinterHandler.java b/thirdparty/pasco2/src/isi/pasco2/handler/AbstractPrinterHandler.java old mode 100644 new mode 100755 diff --git a/thirdparty/pasco2/src/isi/pasco2/handler/CacheAccessHandler.java b/thirdparty/pasco2/src/isi/pasco2/handler/CacheAccessHandler.java old mode 100644 new mode 100755 diff --git a/thirdparty/pasco2/src/isi/pasco2/handler/CountingCacheHandler.java b/thirdparty/pasco2/src/isi/pasco2/handler/CountingCacheHandler.java old mode 100644 new mode 100755 diff --git a/thirdparty/pasco2/src/isi/pasco2/handler/DefaultHandler.java b/thirdparty/pasco2/src/isi/pasco2/handler/DefaultHandler.java old mode 100644 new mode 100755 diff --git a/thirdparty/pasco2/src/isi/pasco2/handler/HistoryAccessHandler.java b/thirdparty/pasco2/src/isi/pasco2/handler/HistoryAccessHandler.java old mode 100644 new mode 100755 diff --git a/thirdparty/pasco2/src/isi/pasco2/handler/Pasco2CacheHandler.java b/thirdparty/pasco2/src/isi/pasco2/handler/Pasco2CacheHandler.java old mode 100644 new mode 100755 diff --git a/thirdparty/pasco2/src/isi/pasco2/handler/Pasco2HistoryHandler.java b/thirdparty/pasco2/src/isi/pasco2/handler/Pasco2HistoryHandler.java old mode 100644 new mode 100755 diff --git a/thirdparty/pasco2/src/isi/pasco2/io/EnhancedRandomAccessFile.java b/thirdparty/pasco2/src/isi/pasco2/io/EnhancedRandomAccessFile.java old mode 100644 new mode 100755 diff --git a/thirdparty/pasco2/src/isi/pasco2/io/FastReadIndexFile.java b/thirdparty/pasco2/src/isi/pasco2/io/FastReadIndexFile.java old mode 100644 new mode 100755 diff --git a/thirdparty/pasco2/src/isi/pasco2/io/IndexFile.java b/thirdparty/pasco2/src/isi/pasco2/io/IndexFile.java old mode 100644 new mode 100755 diff --git a/thirdparty/pasco2/src/isi/pasco2/model/REDRRecord.java b/thirdparty/pasco2/src/isi/pasco2/model/REDRRecord.java old mode 100644 new mode 100755 diff --git a/thirdparty/pasco2/src/isi/pasco2/model/RecognisedRecord.java b/thirdparty/pasco2/src/isi/pasco2/model/RecognisedRecord.java old mode 100644 new mode 100755 diff --git a/thirdparty/pasco2/src/isi/pasco2/model/Record.java b/thirdparty/pasco2/src/isi/pasco2/model/Record.java old mode 100644 new mode 100755 diff --git a/thirdparty/pasco2/src/isi/pasco2/model/URLLEAKRecord.java b/thirdparty/pasco2/src/isi/pasco2/model/URLLEAKRecord.java old mode 100644 new mode 100755 diff --git a/thirdparty/pasco2/src/isi/pasco2/model/UnknownRecord.java b/thirdparty/pasco2/src/isi/pasco2/model/UnknownRecord.java old mode 100644 new mode 100755 diff --git a/thirdparty/pasco2/src/isi/pasco2/parser/AbstractValidRecordIterator.java b/thirdparty/pasco2/src/isi/pasco2/parser/AbstractValidRecordIterator.java old mode 100644 new mode 100755 diff --git a/thirdparty/pasco2/src/isi/pasco2/parser/AllRecordIterator.java b/thirdparty/pasco2/src/isi/pasco2/parser/AllRecordIterator.java old mode 100644 new mode 100755 diff --git a/thirdparty/pasco2/src/isi/pasco2/parser/Allocator.java b/thirdparty/pasco2/src/isi/pasco2/parser/Allocator.java old mode 100644 new mode 100755 diff --git a/thirdparty/pasco2/src/isi/pasco2/parser/DateTime.java b/thirdparty/pasco2/src/isi/pasco2/parser/DateTime.java old mode 100644 new mode 100755 diff --git a/thirdparty/pasco2/src/isi/pasco2/parser/HashBlock.java b/thirdparty/pasco2/src/isi/pasco2/parser/HashBlock.java old mode 100644 new mode 100755 diff --git a/thirdparty/pasco2/src/isi/pasco2/parser/HashBlockIterator.java b/thirdparty/pasco2/src/isi/pasco2/parser/HashBlockIterator.java old mode 100644 new mode 100755 diff --git a/thirdparty/pasco2/src/isi/pasco2/parser/HashRecord.java b/thirdparty/pasco2/src/isi/pasco2/parser/HashRecord.java old mode 100644 new mode 100755 diff --git a/thirdparty/pasco2/src/isi/pasco2/parser/HashRecordIterator.java b/thirdparty/pasco2/src/isi/pasco2/parser/HashRecordIterator.java old mode 100644 new mode 100755 diff --git a/thirdparty/pasco2/src/isi/pasco2/parser/IECacheFileParser.java b/thirdparty/pasco2/src/isi/pasco2/parser/IECacheFileParser.java old mode 100644 new mode 100755 diff --git a/thirdparty/pasco2/src/isi/pasco2/parser/IEHistoryFileParser.java b/thirdparty/pasco2/src/isi/pasco2/parser/IEHistoryFileParser.java old mode 100644 new mode 100755 diff --git a/thirdparty/pasco2/src/isi/pasco2/parser/IEIndexFileParser.java b/thirdparty/pasco2/src/isi/pasco2/parser/IEIndexFileParser.java old mode 100644 new mode 100755 diff --git a/thirdparty/pasco2/src/isi/pasco2/parser/RecordIterator.java b/thirdparty/pasco2/src/isi/pasco2/parser/RecordIterator.java old mode 100644 new mode 100755 diff --git a/thirdparty/pasco2/src/isi/pasco2/parser/ValidRecordIterator.java b/thirdparty/pasco2/src/isi/pasco2/parser/ValidRecordIterator.java old mode 100644 new mode 100755 diff --git a/thirdparty/pasco2/src/isi/pasco2/parser/time/DOSTime.java b/thirdparty/pasco2/src/isi/pasco2/parser/time/DOSTime.java old mode 100644 new mode 100755 diff --git a/thirdparty/pasco2/src/isi/pasco2/parser/time/FileTime.java b/thirdparty/pasco2/src/isi/pasco2/parser/time/FileTime.java old mode 100644 new mode 100755 diff --git a/thirdparty/pasco2/src/isi/pasco2/poller/DifferenceHandler.java b/thirdparty/pasco2/src/isi/pasco2/poller/DifferenceHandler.java old mode 100644 new mode 100755 diff --git a/thirdparty/pasco2/src/isi/pasco2/util/HexFormatter.java b/thirdparty/pasco2/src/isi/pasco2/util/HexFormatter.java old mode 100644 new mode 100755 diff --git a/thirdparty/pasco2/src/isi/pasco2/util/StructConverter.java b/thirdparty/pasco2/src/isi/pasco2/util/StructConverter.java old mode 100644 new mode 100755 diff --git a/thirdparty/pasco2/test/isi/pasco2/TestAllocationLayer.java b/thirdparty/pasco2/test/isi/pasco2/TestAllocationLayer.java old mode 100644 new mode 100755 diff --git a/thirdparty/pasco2/test/isi/pasco2/TestDOSTime.java b/thirdparty/pasco2/test/isi/pasco2/TestDOSTime.java old mode 100644 new mode 100755 diff --git a/thirdparty/pasco2/test/isi/pasco2/TestFileTime.java b/thirdparty/pasco2/test/isi/pasco2/TestFileTime.java old mode 100644 new mode 100755 diff --git a/thirdparty/pasco2/test/isi/pasco2/TestPackage.java b/thirdparty/pasco2/test/isi/pasco2/TestPackage.java old mode 100644 new mode 100755 diff --git a/thirdparty/pasco2/test/isi/pasco2/TestPlatform.java b/thirdparty/pasco2/test/isi/pasco2/TestPlatform.java old mode 100644 new mode 100755 diff --git a/thirdparty/pasco2/test/isi/pasco2/TestReadFunctions.java b/thirdparty/pasco2/test/isi/pasco2/TestReadFunctions.java old mode 100644 new mode 100755 diff --git a/thirdparty/pasco2/test/isi/pasco2/TestRecordLayer.java b/thirdparty/pasco2/test/isi/pasco2/TestRecordLayer.java old mode 100644 new mode 100755 diff --git a/thirdparty/pasco2/test/isi/pasco2/empty.cache.index.dat b/thirdparty/pasco2/test/isi/pasco2/empty.cache.index.dat old mode 100644 new mode 100755 diff --git a/thirdparty/pasco2/test/isi/pasco2/empty.history.index.dat b/thirdparty/pasco2/test/isi/pasco2/empty.history.index.dat old mode 100644 new mode 100755 diff --git a/thirdparty/pasco2/test/isi/pasco2/first.cache.index.dat b/thirdparty/pasco2/test/isi/pasco2/first.cache.index.dat old mode 100644 new mode 100755 diff --git a/thirdparty/pasco2/test/isi/pasco2/first.history.index.dat b/thirdparty/pasco2/test/isi/pasco2/first.history.index.dat old mode 100644 new mode 100755 diff --git a/thirdparty/pasco2/test/isi/pasco2/platform/FILETIME.java b/thirdparty/pasco2/test/isi/pasco2/platform/FILETIME.java old mode 100644 new mode 100755 diff --git a/thirdparty/pasco2/test/isi/pasco2/platform/SYSTEMTIME.java b/thirdparty/pasco2/test/isi/pasco2/platform/SYSTEMTIME.java old mode 100644 new mode 100755 diff --git a/thirdparty/photorec_exec/63/cygwin b/thirdparty/photorec_exec/63/cygwin old mode 100644 new mode 100755 diff --git a/thirdparty/photorec_exec/AUTHORS.txt b/thirdparty/photorec_exec/AUTHORS.txt old mode 100644 new mode 100755 diff --git a/thirdparty/photorec_exec/COPYING.txt b/thirdparty/photorec_exec/COPYING.txt old mode 100644 new mode 100755 diff --git a/thirdparty/photorec_exec/INFO b/thirdparty/photorec_exec/INFO old mode 100644 new mode 100755 diff --git a/thirdparty/photorec_exec/NEWS.txt b/thirdparty/photorec_exec/NEWS.txt old mode 100644 new mode 100755 diff --git a/thirdparty/photorec_exec/QtCore4.dll b/thirdparty/photorec_exec/QtCore4.dll old mode 100644 new mode 100755 diff --git a/thirdparty/photorec_exec/QtGui4.dll b/thirdparty/photorec_exec/QtGui4.dll old mode 100644 new mode 100755 diff --git a/thirdparty/photorec_exec/THANKS.txt b/thirdparty/photorec_exec/THANKS.txt old mode 100644 new mode 100755 diff --git a/thirdparty/photorec_exec/VERSION.txt b/thirdparty/photorec_exec/VERSION.txt old mode 100644 new mode 100755 diff --git a/thirdparty/photorec_exec/cyggcc_s-1.dll b/thirdparty/photorec_exec/cyggcc_s-1.dll old mode 100644 new mode 100755 diff --git a/thirdparty/photorec_exec/cygiconv-2.dll b/thirdparty/photorec_exec/cygiconv-2.dll old mode 100644 new mode 100755 diff --git a/thirdparty/photorec_exec/cygjpeg-8.dll b/thirdparty/photorec_exec/cygjpeg-8.dll old mode 100644 new mode 100755 diff --git a/thirdparty/photorec_exec/cygncursesw-10.dll b/thirdparty/photorec_exec/cygncursesw-10.dll old mode 100644 new mode 100755 diff --git a/thirdparty/photorec_exec/cygssp-0.dll b/thirdparty/photorec_exec/cygssp-0.dll old mode 100644 new mode 100755 diff --git a/thirdparty/photorec_exec/cygwin1.dll b/thirdparty/photorec_exec/cygwin1.dll old mode 100644 new mode 100755 diff --git a/thirdparty/photorec_exec/cygz.dll b/thirdparty/photorec_exec/cygz.dll old mode 100644 new mode 100755 diff --git a/thirdparty/photorec_exec/documentation.html b/thirdparty/photorec_exec/documentation.html old mode 100644 new mode 100755 diff --git a/thirdparty/photorec_exec/fidentify_win.exe b/thirdparty/photorec_exec/fidentify_win.exe old mode 100644 new mode 100755 diff --git a/thirdparty/photorec_exec/iconv.dll b/thirdparty/photorec_exec/iconv.dll old mode 100644 new mode 100755 diff --git a/thirdparty/photorec_exec/libgcc_s_sjlj-1.dll b/thirdparty/photorec_exec/libgcc_s_sjlj-1.dll old mode 100644 new mode 100755 diff --git a/thirdparty/photorec_exec/libjpeg-62.dll b/thirdparty/photorec_exec/libjpeg-62.dll old mode 100644 new mode 100755 diff --git a/thirdparty/photorec_exec/libpng16-16.dll b/thirdparty/photorec_exec/libpng16-16.dll old mode 100644 new mode 100755 diff --git a/thirdparty/photorec_exec/libssp-0.dll b/thirdparty/photorec_exec/libssp-0.dll old mode 100644 new mode 100755 diff --git a/thirdparty/photorec_exec/libstdc++-6.dll b/thirdparty/photorec_exec/libstdc++-6.dll old mode 100644 new mode 100755 diff --git a/thirdparty/photorec_exec/libwinpthread-1.dll b/thirdparty/photorec_exec/libwinpthread-1.dll old mode 100644 new mode 100755 diff --git a/thirdparty/photorec_exec/photorec_win.exe b/thirdparty/photorec_exec/photorec_win.exe old mode 100644 new mode 100755 diff --git a/thirdparty/photorec_exec/plugins/BartPE/Get_Files.cmd b/thirdparty/photorec_exec/plugins/BartPE/Get_Files.cmd old mode 100644 new mode 100755 diff --git a/thirdparty/photorec_exec/plugins/BartPE/Help.htm b/thirdparty/photorec_exec/plugins/BartPE/Help.htm old mode 100644 new mode 100755 diff --git a/thirdparty/photorec_exec/plugins/BartPE/RESET.cmd b/thirdparty/photorec_exec/plugins/BartPE/RESET.cmd old mode 100644 new mode 100755 diff --git a/thirdparty/photorec_exec/plugins/BartPE/ReadMe.txt b/thirdparty/photorec_exec/plugins/BartPE/ReadMe.txt old mode 100644 new mode 100755 diff --git a/thirdparty/photorec_exec/plugins/BartPE/SCRIPTS/Start_INF.dat b/thirdparty/photorec_exec/plugins/BartPE/SCRIPTS/Start_INF.dat old mode 100644 new mode 100755 diff --git a/thirdparty/photorec_exec/plugins/BartPE/SCRIPTS/StaticINF.dat b/thirdparty/photorec_exec/plugins/BartPE/SCRIPTS/StaticINF.dat old mode 100644 new mode 100755 diff --git a/thirdparty/photorec_exec/plugins/BartPE/start.inf b/thirdparty/photorec_exec/plugins/BartPE/start.inf old mode 100644 new mode 100755 diff --git a/thirdparty/photorec_exec/plugins/BartPE/testdisk_nu2menu.xml b/thirdparty/photorec_exec/plugins/BartPE/testdisk_nu2menu.xml old mode 100644 new mode 100755 diff --git a/thirdparty/photorec_exec/plugins/WinBuilder/Help.htm b/thirdparty/photorec_exec/plugins/WinBuilder/Help.htm old mode 100644 new mode 100755 diff --git a/thirdparty/photorec_exec/plugins/WinBuilder/ReadMe.txt b/thirdparty/photorec_exec/plugins/WinBuilder/ReadMe.txt old mode 100644 new mode 100755 diff --git a/thirdparty/photorec_exec/plugins/WinBuilder/TestDisk.script b/thirdparty/photorec_exec/plugins/WinBuilder/TestDisk.script old mode 100644 new mode 100755 diff --git a/thirdparty/photorec_exec/qphotorec_win.exe b/thirdparty/photorec_exec/qphotorec_win.exe old mode 100644 new mode 100755 diff --git a/thirdparty/photorec_exec/readme.txt b/thirdparty/photorec_exec/readme.txt old mode 100644 new mode 100755 diff --git a/thirdparty/photorec_exec/testdisk_win.exe b/thirdparty/photorec_exec/testdisk_win.exe old mode 100644 new mode 100755 diff --git a/thirdparty/photorec_exec/zlib1.dll b/thirdparty/photorec_exec/zlib1.dll old mode 100644 new mode 100755 diff --git a/thirdparty/rejistry/Rejistry-1.0-SNAPSHOT.jar b/thirdparty/rejistry/Rejistry-1.0-SNAPSHOT.jar old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/license.txt b/thirdparty/rr-full/license.txt old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/p2x5124.dll b/thirdparty/rr-full/p2x5124.dll old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/acmru.pl b/thirdparty/rr-full/plugins/acmru.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/adoberdr.pl b/thirdparty/rr-full/plugins/adoberdr.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/ahaha.pl b/thirdparty/rr-full/plugins/ahaha.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/aim.pl b/thirdparty/rr-full/plugins/aim.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/all b/thirdparty/rr-full/plugins/all old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/amcache.pl b/thirdparty/rr-full/plugins/amcache.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/aports.pl b/thirdparty/rr-full/plugins/aports.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/appcertdlls.pl b/thirdparty/rr-full/plugins/appcertdlls.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/appcompatcache.pl b/thirdparty/rr-full/plugins/appcompatcache.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/appcompatcache_tln.pl b/thirdparty/rr-full/plugins/appcompatcache_tln.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/appcompatflags.pl b/thirdparty/rr-full/plugins/appcompatflags.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/appinitdlls.pl b/thirdparty/rr-full/plugins/appinitdlls.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/applets.pl b/thirdparty/rr-full/plugins/applets.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/applets_tln.pl b/thirdparty/rr-full/plugins/applets_tln.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/apppaths.pl b/thirdparty/rr-full/plugins/apppaths.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/apppaths_tln.pl b/thirdparty/rr-full/plugins/apppaths_tln.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/appspecific.pl b/thirdparty/rr-full/plugins/appspecific.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/ares.pl b/thirdparty/rr-full/plugins/ares.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/arpcache.pl b/thirdparty/rr-full/plugins/arpcache.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/assoc.pl b/thirdparty/rr-full/plugins/assoc.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/at.pl b/thirdparty/rr-full/plugins/at.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/at_tln.pl b/thirdparty/rr-full/plugins/at_tln.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/attachmgr.pl b/thirdparty/rr-full/plugins/attachmgr.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/attachmgr_tln.pl b/thirdparty/rr-full/plugins/attachmgr_tln.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/audiodev.pl b/thirdparty/rr-full/plugins/audiodev.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/auditfail.pl b/thirdparty/rr-full/plugins/auditfail.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/auditpol.pl b/thirdparty/rr-full/plugins/auditpol.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/autoendtasks.pl b/thirdparty/rr-full/plugins/autoendtasks.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/autorun.pl b/thirdparty/rr-full/plugins/autorun.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/backuprestore.pl b/thirdparty/rr-full/plugins/backuprestore.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/banner.pl b/thirdparty/rr-full/plugins/banner.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/baseline.pl b/thirdparty/rr-full/plugins/baseline.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/bho.pl b/thirdparty/rr-full/plugins/bho.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/bitbucket.pl b/thirdparty/rr-full/plugins/bitbucket.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/bitbucket_user.pl b/thirdparty/rr-full/plugins/bitbucket_user.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/brisv.pl b/thirdparty/rr-full/plugins/brisv.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/btconfig.pl b/thirdparty/rr-full/plugins/btconfig.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/bthport.pl b/thirdparty/rr-full/plugins/bthport.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/cain.pl b/thirdparty/rr-full/plugins/cain.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/ccleaner.pl b/thirdparty/rr-full/plugins/ccleaner.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/cdstaginginfo.pl b/thirdparty/rr-full/plugins/cdstaginginfo.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/clampi.pl b/thirdparty/rr-full/plugins/clampi.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/clampitm.pl b/thirdparty/rr-full/plugins/clampitm.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/clsid.pl b/thirdparty/rr-full/plugins/clsid.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/cmd_shell.pl b/thirdparty/rr-full/plugins/cmd_shell.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/cmd_shell_tln.pl b/thirdparty/rr-full/plugins/cmd_shell_tln.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/cmd_shell_u.pl b/thirdparty/rr-full/plugins/cmd_shell_u.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/cmdproc.pl b/thirdparty/rr-full/plugins/cmdproc.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/cmdproc_tln.pl b/thirdparty/rr-full/plugins/cmdproc_tln.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/codeid.pl b/thirdparty/rr-full/plugins/codeid.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/comdlg32.pl b/thirdparty/rr-full/plugins/comdlg32.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/comfoo.pl b/thirdparty/rr-full/plugins/comfoo.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/compdesc.pl b/thirdparty/rr-full/plugins/compdesc.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/compname.pl b/thirdparty/rr-full/plugins/compname.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/controlpanel.pl b/thirdparty/rr-full/plugins/controlpanel.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/cpldontload.pl b/thirdparty/rr-full/plugins/cpldontload.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/crashcontrol.pl b/thirdparty/rr-full/plugins/crashcontrol.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/ctrlpnl.pl b/thirdparty/rr-full/plugins/ctrlpnl.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/ddm.pl b/thirdparty/rr-full/plugins/ddm.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/ddo.pl b/thirdparty/rr-full/plugins/ddo.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/decaf.pl b/thirdparty/rr-full/plugins/decaf.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/defbrowser.pl b/thirdparty/rr-full/plugins/defbrowser.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/del.pl b/thirdparty/rr-full/plugins/del.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/del_tln.pl b/thirdparty/rr-full/plugins/del_tln.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/dependency_walker.pl b/thirdparty/rr-full/plugins/dependency_walker.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/devclass.pl b/thirdparty/rr-full/plugins/devclass.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/dfrg.pl b/thirdparty/rr-full/plugins/dfrg.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/diag_sr.pl b/thirdparty/rr-full/plugins/diag_sr.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/direct.pl b/thirdparty/rr-full/plugins/direct.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/direct_tln.pl b/thirdparty/rr-full/plugins/direct_tln.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/disablelastaccess.pl b/thirdparty/rr-full/plugins/disablelastaccess.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/disablesr.pl b/thirdparty/rr-full/plugins/disablesr.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/dllsearch.pl b/thirdparty/rr-full/plugins/dllsearch.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/dnschanger.pl b/thirdparty/rr-full/plugins/dnschanger.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/domains.pl b/thirdparty/rr-full/plugins/domains.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/drivers32.pl b/thirdparty/rr-full/plugins/drivers32.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/drwatson.pl b/thirdparty/rr-full/plugins/drwatson.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/emdmgmt.pl b/thirdparty/rr-full/plugins/emdmgmt.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/environment.pl b/thirdparty/rr-full/plugins/environment.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/esent.pl b/thirdparty/rr-full/plugins/esent.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/eventlog.pl b/thirdparty/rr-full/plugins/eventlog.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/eventlogs.pl b/thirdparty/rr-full/plugins/eventlogs.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/fileexts.pl b/thirdparty/rr-full/plugins/fileexts.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/filehistory.pl b/thirdparty/rr-full/plugins/filehistory.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/findexes.pl b/thirdparty/rr-full/plugins/findexes.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/fw_config.pl b/thirdparty/rr-full/plugins/fw_config.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/gauss.pl b/thirdparty/rr-full/plugins/gauss.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/gthist.pl b/thirdparty/rr-full/plugins/gthist.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/gtwhitelist.pl b/thirdparty/rr-full/plugins/gtwhitelist.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/haven_and_hearth.pl b/thirdparty/rr-full/plugins/haven_and_hearth.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/hibernate.pl b/thirdparty/rr-full/plugins/hibernate.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/ide.pl b/thirdparty/rr-full/plugins/ide.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/ie_main.pl b/thirdparty/rr-full/plugins/ie_main.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/ie_settings.pl b/thirdparty/rr-full/plugins/ie_settings.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/ie_version.pl b/thirdparty/rr-full/plugins/ie_version.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/ie_zones.pl b/thirdparty/rr-full/plugins/ie_zones.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/iejava.pl b/thirdparty/rr-full/plugins/iejava.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/imagedev.pl b/thirdparty/rr-full/plugins/imagedev.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/imagefile.pl b/thirdparty/rr-full/plugins/imagefile.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/init_dlls.pl b/thirdparty/rr-full/plugins/init_dlls.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/inprocserver.pl b/thirdparty/rr-full/plugins/inprocserver.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/installedcomp.pl b/thirdparty/rr-full/plugins/installedcomp.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/installer.pl b/thirdparty/rr-full/plugins/installer.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/internet_explorer_cu.pl b/thirdparty/rr-full/plugins/internet_explorer_cu.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/internet_settings_cu.pl b/thirdparty/rr-full/plugins/internet_settings_cu.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/itempos.pl b/thirdparty/rr-full/plugins/itempos.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/javafx.pl b/thirdparty/rr-full/plugins/javafx.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/javasoft.pl b/thirdparty/rr-full/plugins/javasoft.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/kankan.pl b/thirdparty/rr-full/plugins/kankan.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/kb950582.pl b/thirdparty/rr-full/plugins/kb950582.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/kbdcrash.pl b/thirdparty/rr-full/plugins/kbdcrash.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/knowndev.pl b/thirdparty/rr-full/plugins/knowndev.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/landesk.pl b/thirdparty/rr-full/plugins/landesk.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/landesk_tln.pl b/thirdparty/rr-full/plugins/landesk_tln.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/lazyshell.pl b/thirdparty/rr-full/plugins/lazyshell.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/legacy.pl b/thirdparty/rr-full/plugins/legacy.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/legacy_tln.pl b/thirdparty/rr-full/plugins/legacy_tln.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/licenses.pl b/thirdparty/rr-full/plugins/licenses.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/listsoft.pl b/thirdparty/rr-full/plugins/listsoft.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/liveContactsGUID.pl b/thirdparty/rr-full/plugins/liveContactsGUID.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/load.pl b/thirdparty/rr-full/plugins/load.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/logonusername.pl b/thirdparty/rr-full/plugins/logonusername.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/lsa_packages.pl b/thirdparty/rr-full/plugins/lsa_packages.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/lsasecrets.pl b/thirdparty/rr-full/plugins/lsasecrets.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/macaddr.pl b/thirdparty/rr-full/plugins/macaddr.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/menuorder.pl b/thirdparty/rr-full/plugins/menuorder.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/mixer.pl b/thirdparty/rr-full/plugins/mixer.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/mixer_tln.pl b/thirdparty/rr-full/plugins/mixer_tln.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/mmc.pl b/thirdparty/rr-full/plugins/mmc.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/mmc_tln.pl b/thirdparty/rr-full/plugins/mmc_tln.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/mmo.pl b/thirdparty/rr-full/plugins/mmo.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/mndmru.pl b/thirdparty/rr-full/plugins/mndmru.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/mndmru_tln.pl b/thirdparty/rr-full/plugins/mndmru_tln.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/mountdev.pl b/thirdparty/rr-full/plugins/mountdev.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/mountdev2.pl b/thirdparty/rr-full/plugins/mountdev2.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/mountdev2.pl.old b/thirdparty/rr-full/plugins/mountdev2.pl.old old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/mp2.pl b/thirdparty/rr-full/plugins/mp2.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/mp3.pl b/thirdparty/rr-full/plugins/mp3.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/mpmru.pl b/thirdparty/rr-full/plugins/mpmru.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/mrt.pl b/thirdparty/rr-full/plugins/mrt.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/msis.pl b/thirdparty/rr-full/plugins/msis.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/mspaper.pl b/thirdparty/rr-full/plugins/mspaper.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/muicache.pl b/thirdparty/rr-full/plugins/muicache.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/muicache_tln.pl b/thirdparty/rr-full/plugins/muicache_tln.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/nero.pl b/thirdparty/rr-full/plugins/nero.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/netassist.pl b/thirdparty/rr-full/plugins/netassist.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/netsvcs.pl b/thirdparty/rr-full/plugins/netsvcs.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/network.pl b/thirdparty/rr-full/plugins/network.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/networkcards.pl b/thirdparty/rr-full/plugins/networkcards.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/networklist.pl b/thirdparty/rr-full/plugins/networklist.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/networklist_tln.pl b/thirdparty/rr-full/plugins/networklist_tln.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/networkuid.pl b/thirdparty/rr-full/plugins/networkuid.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/nic.pl b/thirdparty/rr-full/plugins/nic.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/nic2.pl b/thirdparty/rr-full/plugins/nic2.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/nic_mst2.pl b/thirdparty/rr-full/plugins/nic_mst2.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/nolmhash.pl b/thirdparty/rr-full/plugins/nolmhash.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/ntuser b/thirdparty/rr-full/plugins/ntuser old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/ntusernetwork.pl b/thirdparty/rr-full/plugins/ntusernetwork.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/odysseus.pl b/thirdparty/rr-full/plugins/odysseus.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/officedocs.pl b/thirdparty/rr-full/plugins/officedocs.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/officedocs2010.pl b/thirdparty/rr-full/plugins/officedocs2010.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/officedocs2010_tln.pl b/thirdparty/rr-full/plugins/officedocs2010_tln.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/oisc.pl b/thirdparty/rr-full/plugins/oisc.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/olsearch.pl b/thirdparty/rr-full/plugins/olsearch.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/opencandy.pl b/thirdparty/rr-full/plugins/opencandy.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/osversion.pl b/thirdparty/rr-full/plugins/osversion.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/osversion_tln.pl b/thirdparty/rr-full/plugins/osversion_tln.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/outlook.pl b/thirdparty/rr-full/plugins/outlook.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/outlook2.pl b/thirdparty/rr-full/plugins/outlook2.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/pagefile.pl b/thirdparty/rr-full/plugins/pagefile.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/pending.pl b/thirdparty/rr-full/plugins/pending.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/phdet.pl b/thirdparty/rr-full/plugins/phdet.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/photos.pl b/thirdparty/rr-full/plugins/photos.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/polacdms.pl b/thirdparty/rr-full/plugins/polacdms.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/policies_u.pl b/thirdparty/rr-full/plugins/policies_u.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/port_dev.pl b/thirdparty/rr-full/plugins/port_dev.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/prefetch.pl b/thirdparty/rr-full/plugins/prefetch.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/printermru.pl b/thirdparty/rr-full/plugins/printermru.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/printers.pl b/thirdparty/rr-full/plugins/printers.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/privoxy.pl b/thirdparty/rr-full/plugins/privoxy.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/processor_architecture.pl b/thirdparty/rr-full/plugins/processor_architecture.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/product.pl b/thirdparty/rr-full/plugins/product.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/productpolicy.pl b/thirdparty/rr-full/plugins/productpolicy.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/producttype.pl b/thirdparty/rr-full/plugins/producttype.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/profilelist.pl b/thirdparty/rr-full/plugins/profilelist.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/profiler.pl b/thirdparty/rr-full/plugins/profiler.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/proxysettings.pl b/thirdparty/rr-full/plugins/proxysettings.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/publishingwizard.pl b/thirdparty/rr-full/plugins/publishingwizard.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/putty.pl b/thirdparty/rr-full/plugins/putty.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/rdphint.pl b/thirdparty/rr-full/plugins/rdphint.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/rdpport.pl b/thirdparty/rr-full/plugins/rdpport.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/reading_locations.pl b/thirdparty/rr-full/plugins/reading_locations.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/real_profilelist.pl b/thirdparty/rr-full/plugins/real_profilelist.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/realplayer6.pl b/thirdparty/rr-full/plugins/realplayer6.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/realvnc.pl b/thirdparty/rr-full/plugins/realvnc.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/recentdocs.pl b/thirdparty/rr-full/plugins/recentdocs.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/recentdocs_tln.pl b/thirdparty/rr-full/plugins/recentdocs_tln.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/regback.pl b/thirdparty/rr-full/plugins/regback.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/regtime.pl b/thirdparty/rr-full/plugins/regtime.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/regtime_tln.pl b/thirdparty/rr-full/plugins/regtime_tln.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/removdev.pl b/thirdparty/rr-full/plugins/removdev.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/renocide.pl b/thirdparty/rr-full/plugins/renocide.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/reveton.pl b/thirdparty/rr-full/plugins/reveton.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/rlo.pl b/thirdparty/rr-full/plugins/rlo.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/rootkit_revealer.pl b/thirdparty/rr-full/plugins/rootkit_revealer.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/routes.pl b/thirdparty/rr-full/plugins/routes.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/runmru.pl b/thirdparty/rr-full/plugins/runmru.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/runmru_tln.pl b/thirdparty/rr-full/plugins/runmru_tln.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/safeboot.pl b/thirdparty/rr-full/plugins/safeboot.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/sam b/thirdparty/rr-full/plugins/sam old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/samparse.pl b/thirdparty/rr-full/plugins/samparse.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/samparse_tln.pl b/thirdparty/rr-full/plugins/samparse_tln.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/schedagent.pl b/thirdparty/rr-full/plugins/schedagent.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/secctr.pl b/thirdparty/rr-full/plugins/secctr.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/secrets.pl b/thirdparty/rr-full/plugins/secrets.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/secrets_tln.pl b/thirdparty/rr-full/plugins/secrets_tln.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/security b/thirdparty/rr-full/plugins/security old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/securityproviders.pl b/thirdparty/rr-full/plugins/securityproviders.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/services.pl b/thirdparty/rr-full/plugins/services.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/sevenzip.pl b/thirdparty/rr-full/plugins/sevenzip.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/sfc.pl b/thirdparty/rr-full/plugins/sfc.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/shares.pl b/thirdparty/rr-full/plugins/shares.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/shc.pl b/thirdparty/rr-full/plugins/shc.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/shellbags.pl b/thirdparty/rr-full/plugins/shellbags.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/shellbags_test.pl b/thirdparty/rr-full/plugins/shellbags_test.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/shellbags_tln.pl b/thirdparty/rr-full/plugins/shellbags_tln.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/shellbags_xp.pl b/thirdparty/rr-full/plugins/shellbags_xp.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/shellexec.pl b/thirdparty/rr-full/plugins/shellexec.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/shellext.pl b/thirdparty/rr-full/plugins/shellext.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/shellfolders.pl b/thirdparty/rr-full/plugins/shellfolders.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/shelloverlay.pl b/thirdparty/rr-full/plugins/shelloverlay.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/shutdown.pl b/thirdparty/rr-full/plugins/shutdown.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/shutdowncount.pl b/thirdparty/rr-full/plugins/shutdowncount.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/skype.pl b/thirdparty/rr-full/plugins/skype.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/snapshot.pl b/thirdparty/rr-full/plugins/snapshot.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/snapshot_viewer.pl b/thirdparty/rr-full/plugins/snapshot_viewer.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/soft_run.pl b/thirdparty/rr-full/plugins/soft_run.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/software b/thirdparty/rr-full/plugins/software old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/spp_clients.pl b/thirdparty/rr-full/plugins/spp_clients.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/sql_lastconnect.pl b/thirdparty/rr-full/plugins/sql_lastconnect.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/srun_tln.pl b/thirdparty/rr-full/plugins/srun_tln.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/ssh_host_keys.pl b/thirdparty/rr-full/plugins/ssh_host_keys.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/ssid.pl b/thirdparty/rr-full/plugins/ssid.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/startmenuinternetapps_cu.pl b/thirdparty/rr-full/plugins/startmenuinternetapps_cu.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/startmenuinternetapps_lm.pl b/thirdparty/rr-full/plugins/startmenuinternetapps_lm.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/startpage.pl b/thirdparty/rr-full/plugins/startpage.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/startup.pl b/thirdparty/rr-full/plugins/startup.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/stillimage.pl b/thirdparty/rr-full/plugins/stillimage.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/susclient.pl b/thirdparty/rr-full/plugins/susclient.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/svc.pl b/thirdparty/rr-full/plugins/svc.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/svc_plus.pl b/thirdparty/rr-full/plugins/svc_plus.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/svc_tln.pl b/thirdparty/rr-full/plugins/svc_tln.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/svcdll.pl b/thirdparty/rr-full/plugins/svcdll.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/svchost.pl b/thirdparty/rr-full/plugins/svchost.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/sysinternals.pl b/thirdparty/rr-full/plugins/sysinternals.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/sysinternals_tln.pl b/thirdparty/rr-full/plugins/sysinternals_tln.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/system b/thirdparty/rr-full/plugins/system old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/systemindex.pl b/thirdparty/rr-full/plugins/systemindex.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/termcert.pl b/thirdparty/rr-full/plugins/termcert.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/termserv.pl b/thirdparty/rr-full/plugins/termserv.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/timezone.pl b/thirdparty/rr-full/plugins/timezone.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/tracing.pl b/thirdparty/rr-full/plugins/tracing.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/tracing_tln.pl b/thirdparty/rr-full/plugins/tracing_tln.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/trappoll.pl b/thirdparty/rr-full/plugins/trappoll.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/trustrecords.pl b/thirdparty/rr-full/plugins/trustrecords.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/trustrecords_tln.pl b/thirdparty/rr-full/plugins/trustrecords_tln.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/tsclient.pl b/thirdparty/rr-full/plugins/tsclient.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/tsclient_tln.pl b/thirdparty/rr-full/plugins/tsclient_tln.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/typedpaths.pl b/thirdparty/rr-full/plugins/typedpaths.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/typedpaths_tln.pl b/thirdparty/rr-full/plugins/typedpaths_tln.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/typedurls.pl b/thirdparty/rr-full/plugins/typedurls.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/typedurls_tln.pl b/thirdparty/rr-full/plugins/typedurls_tln.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/typedurlstime.pl b/thirdparty/rr-full/plugins/typedurlstime.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/typedurlstime_tln.pl b/thirdparty/rr-full/plugins/typedurlstime_tln.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/uac.pl b/thirdparty/rr-full/plugins/uac.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/uninstall.pl b/thirdparty/rr-full/plugins/uninstall.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/uninstall_tln.pl b/thirdparty/rr-full/plugins/uninstall_tln.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/unreadmail.pl b/thirdparty/rr-full/plugins/unreadmail.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/urlzone.pl b/thirdparty/rr-full/plugins/urlzone.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/urun_tln.pl b/thirdparty/rr-full/plugins/urun_tln.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/usb.pl b/thirdparty/rr-full/plugins/usb.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/usbdevices.pl b/thirdparty/rr-full/plugins/usbdevices.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/usbstor.pl b/thirdparty/rr-full/plugins/usbstor.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/usbstor2.pl b/thirdparty/rr-full/plugins/usbstor2.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/usbstor3.pl b/thirdparty/rr-full/plugins/usbstor3.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/user_run.pl b/thirdparty/rr-full/plugins/user_run.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/user_win.pl b/thirdparty/rr-full/plugins/user_win.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/userassist.pl b/thirdparty/rr-full/plugins/userassist.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/userassist_tln.pl b/thirdparty/rr-full/plugins/userassist_tln.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/userinfo.pl b/thirdparty/rr-full/plugins/userinfo.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/userlocsvc.pl b/thirdparty/rr-full/plugins/userlocsvc.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/usrclass b/thirdparty/rr-full/plugins/usrclass old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/vawtrak.pl b/thirdparty/rr-full/plugins/vawtrak.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/virut.pl b/thirdparty/rr-full/plugins/virut.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/vista_bitbucket.pl b/thirdparty/rr-full/plugins/vista_bitbucket.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/vmplayer.pl b/thirdparty/rr-full/plugins/vmplayer.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/vmware_vsphere_client.pl b/thirdparty/rr-full/plugins/vmware_vsphere_client.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/vnchooksapplicationprefs.pl b/thirdparty/rr-full/plugins/vnchooksapplicationprefs.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/vncviewer.pl b/thirdparty/rr-full/plugins/vncviewer.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/volinfocache.pl b/thirdparty/rr-full/plugins/volinfocache.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/wallpaper.pl b/thirdparty/rr-full/plugins/wallpaper.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/warcraft3.pl b/thirdparty/rr-full/plugins/warcraft3.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/wbem.pl b/thirdparty/rr-full/plugins/wbem.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/win_cv.pl b/thirdparty/rr-full/plugins/win_cv.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/winbackup.pl b/thirdparty/rr-full/plugins/winbackup.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/winevt.pl b/thirdparty/rr-full/plugins/winevt.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/winlogon.pl b/thirdparty/rr-full/plugins/winlogon.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/winlogon_tln.pl b/thirdparty/rr-full/plugins/winlogon_tln.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/winlogon_u.pl b/thirdparty/rr-full/plugins/winlogon_u.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/winnt_cv.pl b/thirdparty/rr-full/plugins/winnt_cv.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/winrar.pl b/thirdparty/rr-full/plugins/winrar.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/winrar_tln.pl b/thirdparty/rr-full/plugins/winrar_tln.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/winscp.pl b/thirdparty/rr-full/plugins/winscp.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/winscp_sessions.pl b/thirdparty/rr-full/plugins/winscp_sessions.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/winver.pl b/thirdparty/rr-full/plugins/winver.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/winvnc.pl b/thirdparty/rr-full/plugins/winvnc.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/winzip.pl b/thirdparty/rr-full/plugins/winzip.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/wordwheelquery.pl b/thirdparty/rr-full/plugins/wordwheelquery.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/wpdbusenum.pl b/thirdparty/rr-full/plugins/wpdbusenum.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/xpedition.pl b/thirdparty/rr-full/plugins/xpedition.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/yahoo_cu.pl b/thirdparty/rr-full/plugins/yahoo_cu.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/plugins/yahoo_lm.pl b/thirdparty/rr-full/plugins/yahoo_lm.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/regripper.pdf b/thirdparty/rr-full/regripper.pdf old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/rip.exe b/thirdparty/rr-full/rip.exe old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/rip.pl b/thirdparty/rr-full/rip.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/rr.exe b/thirdparty/rr-full/rr.exe old mode 100644 new mode 100755 diff --git a/thirdparty/rr-full/rr.pl b/thirdparty/rr-full/rr.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr/p2x5124.dll b/thirdparty/rr/p2x5124.dll old mode 100644 new mode 100755 diff --git a/thirdparty/rr/plugins/arunmru.pl b/thirdparty/rr/plugins/arunmru.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr/plugins/autopsycompname.pl b/thirdparty/rr/plugins/autopsycompname.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr/plugins/autopsylogin.pl b/thirdparty/rr/plugins/autopsylogin.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr/plugins/autopsyntuser b/thirdparty/rr/plugins/autopsyntuser old mode 100644 new mode 100755 diff --git a/thirdparty/rr/plugins/autopsyntusernetwork.pl b/thirdparty/rr/plugins/autopsyntusernetwork.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr/plugins/autopsyprocarchitecture.pl b/thirdparty/rr/plugins/autopsyprocarchitecture.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr/plugins/autopsyprofilelist.pl b/thirdparty/rr/plugins/autopsyprofilelist.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr/plugins/autopsyprofiler.pl b/thirdparty/rr/plugins/autopsyprofiler.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr/plugins/autopsyrecentdocs.pl b/thirdparty/rr/plugins/autopsyrecentdocs.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr/plugins/autopsyshellfolders.pl b/thirdparty/rr/plugins/autopsyshellfolders.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr/plugins/autopsysoftware b/thirdparty/rr/plugins/autopsysoftware old mode 100644 new mode 100755 diff --git a/thirdparty/rr/plugins/autopsysystem b/thirdparty/rr/plugins/autopsysystem old mode 100644 new mode 100755 diff --git a/thirdparty/rr/plugins/autopsyuninstall.pl b/thirdparty/rr/plugins/autopsyuninstall.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr/plugins/autopsyusb.pl b/thirdparty/rr/plugins/autopsyusb.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr/plugins/autopsyusbdevices.pl b/thirdparty/rr/plugins/autopsyusbdevices.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr/plugins/autopsywinver.pl b/thirdparty/rr/plugins/autopsywinver.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr/plugins/officedocs.pl b/thirdparty/rr/plugins/officedocs.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr/plugins/officedocs2010.pl b/thirdparty/rr/plugins/officedocs2010.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr/rip.exe b/thirdparty/rr/rip.exe old mode 100644 new mode 100755 diff --git a/thirdparty/rr/rip.pl b/thirdparty/rr/rip.pl old mode 100644 new mode 100755 diff --git a/thirdparty/rr/rr.exe b/thirdparty/rr/rr.exe old mode 100644 new mode 100755 diff --git a/thirdparty/rr/rr.pl b/thirdparty/rr/rr.pl old mode 100644 new mode 100755 diff --git a/thirdparty/sevenzip/sevenzipjbinding-AllPlatforms.jar b/thirdparty/sevenzip/sevenzipjbinding-AllPlatforms.jar old mode 100644 new mode 100755 diff --git a/thirdparty/sevenzip/sevenzipjbinding.jar b/thirdparty/sevenzip/sevenzipjbinding.jar old mode 100644 new mode 100755 diff --git a/thirdparty/sigar/1.6.4/sigar-native.zip b/thirdparty/sigar/1.6.4/sigar-native.zip old mode 100644 new mode 100755 diff --git a/thirdparty/sqlite-jdbc/sqlite-jdbc-3.7.8-SNAPSHOT.jar b/thirdparty/sqlite-jdbc/sqlite-jdbc-3.7.8-SNAPSHOT.jar old mode 100644 new mode 100755 diff --git a/thirdparty/stix/StixLib.jar b/thirdparty/stix/StixLib.jar old mode 100644 new mode 100755 diff --git a/thunderbirdparser/build.xml b/thunderbirdparser/build.xml old mode 100644 new mode 100755 diff --git a/thunderbirdparser/ivy.xml b/thunderbirdparser/ivy.xml old mode 100644 new mode 100755 diff --git a/thunderbirdparser/ivysettings.xml b/thunderbirdparser/ivysettings.xml old mode 100644 new mode 100755 diff --git a/thunderbirdparser/manifest.mf b/thunderbirdparser/manifest.mf old mode 100644 new mode 100755 diff --git a/thunderbirdparser/nbproject/build-impl.xml b/thunderbirdparser/nbproject/build-impl.xml old mode 100644 new mode 100755 diff --git a/thunderbirdparser/nbproject/project.properties b/thunderbirdparser/nbproject/project.properties old mode 100644 new mode 100755 diff --git a/thunderbirdparser/nbproject/project.xml b/thunderbirdparser/nbproject/project.xml old mode 100644 new mode 100755 diff --git a/thunderbirdparser/nbproject/suite.properties b/thunderbirdparser/nbproject/suite.properties old mode 100644 new mode 100755 diff --git a/thunderbirdparser/src/org/sleuthkit/autopsy/thunderbirdparser/Bundle.properties b/thunderbirdparser/src/org/sleuthkit/autopsy/thunderbirdparser/Bundle.properties old mode 100644 new mode 100755 diff --git a/thunderbirdparser/src/org/sleuthkit/autopsy/thunderbirdparser/Bundle_ja.properties b/thunderbirdparser/src/org/sleuthkit/autopsy/thunderbirdparser/Bundle_ja.properties old mode 100644 new mode 100755 diff --git a/thunderbirdparser/src/org/sleuthkit/autopsy/thunderbirdparser/ThunderbirdMboxFileIngestModule.java b/thunderbirdparser/src/org/sleuthkit/autopsy/thunderbirdparser/ThunderbirdMboxFileIngestModule.java old mode 100644 new mode 100755 diff --git a/thunderbirdparser/src/org/sleuthkit/autopsy/thunderbirdparser/layer.xml b/thunderbirdparser/src/org/sleuthkit/autopsy/thunderbirdparser/layer.xml old mode 100644 new mode 100755 From 22dc9dc76c8816c6aa79b625c556a0207909b7ee Mon Sep 17 00:00:00 2001 From: "U-BASIS\\dgrove" Date: Wed, 16 Aug 2017 13:25:36 -0400 Subject: [PATCH 010/104] AID separation with fixes. --- Experimental/manifest.mf | 1 + Experimental/nbproject/project.xml | 9 + .../autoingest/AutoIngestControlPanel.form | 475 +++++ .../autoingest/AutoIngestControlPanel.java | 1731 +++++++++++++++++ .../autoingest/AutoIngestDashboard.form | 39 - .../autoingest/AutoIngestDashboard.java | 417 +--- .../AutoIngestDashboardOpenAction.java | 111 ++ .../AutoIngestDashboardTopComponent.form | 28 + .../AutoIngestDashboardTopComponent.java | 135 ++ .../experimental/autoingest/Bundle.properties | 35 + .../configuration/StartupWindow.java | 9 +- .../netbeans/core/startup/Bundle.properties | 11 - .../core/windows/view/ui/Bundle.properties | 4 - 13 files changed, 2534 insertions(+), 471 deletions(-) create mode 100755 Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestControlPanel.form create mode 100755 Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestControlPanel.java create mode 100755 Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardOpenAction.java create mode 100755 Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardTopComponent.form create mode 100755 Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardTopComponent.java delete mode 100755 branding/core/core.jar/org/netbeans/core/startup/Bundle.properties delete mode 100755 branding/modules/org-netbeans-core-windows.jar/org/netbeans/core/windows/view/ui/Bundle.properties diff --git a/Experimental/manifest.mf b/Experimental/manifest.mf index cafb630948..a53adc8642 100755 --- a/Experimental/manifest.mf +++ b/Experimental/manifest.mf @@ -3,4 +3,5 @@ AutoUpdate-Show-In-Client: true OpenIDE-Module: org.sleuthkit.autopsy.experimental OpenIDE-Module-Layer: org/sleuthkit/autopsy/experimental/autoingest/layer.xml OpenIDE-Module-Localizing-Bundle: org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties +OpenIDE-Module-Requires: org.openide.windows.WindowManager OpenIDE-Module-Specification-Version: 1.0 diff --git a/Experimental/nbproject/project.xml b/Experimental/nbproject/project.xml index 280fbc431b..fe85da26ba 100755 --- a/Experimental/nbproject/project.xml +++ b/Experimental/nbproject/project.xml @@ -24,6 +24,15 @@ 1.44.1
+ + org.netbeans.modules.settings + + + + 1 + 1.49.1 + + org.openide.awt diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestControlPanel.form b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestControlPanel.form new file mode 100755 index 0000000000..ad525e92ee --- /dev/null +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestControlPanel.form @@ -0,0 +1,475 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestControlPanel.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestControlPanel.java new file mode 100755 index 0000000000..d48cd31c7f --- /dev/null +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestControlPanel.java @@ -0,0 +1,1731 @@ +/* + * Autopsy Forensic Browser + * + * Copyright 2015-2017 Basis Technology Corp. + * Contact: carrier sleuthkit org + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.sleuthkit.autopsy.experimental.autoingest; + +import com.google.common.util.concurrent.ThreadFactoryBuilder; +import java.awt.Cursor; +import java.awt.Desktop; +import java.awt.EventQueue; +import java.io.IOException; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.time.Instant; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.Date; +import java.util.List; +import java.util.Observable; +import java.util.Observer; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.logging.Level; +import javax.swing.DefaultListSelectionModel; +import java.awt.Color; +import java.beans.PropertyChangeEvent; +import java.io.File; +import java.util.Collections; +import java.util.logging.Logger; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JTable; +import javax.swing.SwingWorker; +import javax.swing.UIManager; +import javax.swing.event.ListSelectionEvent; +import javax.swing.table.DefaultTableModel; +import javax.swing.table.TableColumn; +import org.netbeans.api.options.OptionsDisplayer; +import org.openide.DialogDisplayer; +import org.openide.LifecycleManager; +import org.openide.NotifyDescriptor; +import org.openide.filesystems.FileObject; +import org.openide.filesystems.FileUtil; +import org.openide.util.NbBundle; +import org.openide.util.actions.CallableSystemAction; +import org.openide.windows.WindowManager; +import org.sleuthkit.autopsy.casemodule.CaseNewAction; +import org.sleuthkit.autopsy.casemodule.CaseOpenAction; +import org.sleuthkit.autopsy.core.ServicesMonitor; +import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil; +import org.sleuthkit.autopsy.coreutils.NetworkUtils; +import org.sleuthkit.autopsy.coreutils.PlatformUtil; +import org.sleuthkit.autopsy.ingest.IngestManager; +import org.sleuthkit.autopsy.ingest.IngestProgressSnapshotDialog; +import org.sleuthkit.autopsy.experimental.autoingest.AutoIngestManager.CaseDeletionResult; +import org.sleuthkit.autopsy.experimental.autoingest.AutoIngestManager.JobsSnapshot; + +/** + * A panel for monitoring automated ingest by a cluster, and for controlling + * automated ingest for a single node within the cluster. There can be at most + * one such panel per node. + */ +public final class AutoIngestControlPanel extends JPanel implements Observer { + + private static final long serialVersionUID = 1L; + private static final int GENERIC_COL_MIN_WIDTH = 30; + private static final int GENERIC_COL_MAX_WIDTH = 2000; + private static final int PENDING_TABLE_COL_PREFERRED_WIDTH = 280; + private static final int RUNNING_TABLE_COL_PREFERRED_WIDTH = 175; + private static final int ACTIVITY_TIME_COL_MIN_WIDTH = 250; + private static final int ACTIVITY_TIME_COL_MAX_WIDTH = 450; + private static final int TIME_COL_MIN_WIDTH = 30; + private static final int TIME_COL_MAX_WIDTH = 250; + private static final int TIME_COL_PREFERRED_WIDTH = 140; + private static final int NAME_COL_MIN_WIDTH = 100; + private static final int NAME_COL_MAX_WIDTH = 250; + private static final int NAME_COL_PREFERRED_WIDTH = 140; + private static final int ACTIVITY_COL_MIN_WIDTH = 70; + private static final int ACTIVITY_COL_MAX_WIDTH = 2000; + private static final int ACTIVITY_COL_PREFERRED_WIDTH = 300; + private static final int STATUS_COL_MIN_WIDTH = 55; + private static final int STATUS_COL_MAX_WIDTH = 250; + private static final int STATUS_COL_PREFERRED_WIDTH = 55; + private static final int COMPLETED_TIME_COL_MIN_WIDTH = 30; + private static final int COMPLETED_TIME_COL_MAX_WIDTH = 2000; + private static final int COMPLETED_TIME_COL_PREFERRED_WIDTH = 280; + private static final String UPDATE_TASKS_THREAD_NAME = "AID-update-tasks-%d"; + private static final String LOCAL_HOST_NAME = NetworkUtils.getLocalHostName(); + private static final Logger SYS_LOGGER = AutoIngestSystemLogger.getLogger(); + private static AutoIngestControlPanel instance; + private final DefaultTableModel pendingTableModel; + private final DefaultTableModel runningTableModel; + private final DefaultTableModel completedTableModel; + private AutoIngestManager manager; + private ExecutorService updateExecutor; + private boolean isPaused; + private boolean autoIngestStarted; + private Color pendingTableBackground; + private Color pendingTablelForeground; + + /* + * The enum is used in conjunction with the DefaultTableModel class to + * provide table models for the JTables used to display a view of the + * pending jobs queue, running jobs list, and completed jobs list. The enum + * allows the columns of the table model to be described by either an enum + * ordinal or a column header string. + */ + private enum JobsTableModelColumns { + + CASE(NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.Case")), + DATA_SOURCE(NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.ImageFolder")), + HOST_NAME(NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.HostName")), + CREATED_TIME(NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.CreatedTime")), + STARTED_TIME(NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.StartedTime")), + COMPLETED_TIME(NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.CompletedTime")), + STAGE(NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.Stage")), + STAGE_TIME(NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.StageTime")), + STATUS(NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.Status")), + CASE_DIRECTORY_PATH(NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.CaseFolder")), + IS_LOCAL_JOB(NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.LocalJob")), + MANIFEST_FILE_PATH(NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.ManifestFilePath")); + + private final String header; + + private JobsTableModelColumns(String header) { + this.header = header; + } + + private String getColumnHeader() { + return header; + } + + private static final String[] headers = { + CASE.getColumnHeader(), + DATA_SOURCE.getColumnHeader(), + HOST_NAME.getColumnHeader(), + CREATED_TIME.getColumnHeader(), + STARTED_TIME.getColumnHeader(), + COMPLETED_TIME.getColumnHeader(), + STAGE.getColumnHeader(), + STATUS.getColumnHeader(), + STAGE_TIME.getColumnHeader(), + CASE_DIRECTORY_PATH.getColumnHeader(), + IS_LOCAL_JOB.getColumnHeader(), + MANIFEST_FILE_PATH.getColumnHeader()}; + } + + /** + * Gets the singleton automated ingest control and monitoring panel for this + * cluster node. + * + * @return The panel. + */ + public static AutoIngestControlPanel getInstance() { + if (null == instance) { + /* + * Two stage construction is used here to avoid publishing a + * reference to the panel to the Observable auto ingest manager + * before object construction is complete. + */ + instance = new AutoIngestControlPanel(); + } + return instance; + } + + /** + * Constructs a panel for monitoring automated ingest by a cluster, and for + * controlling automated ingest for a single node within the cluster. + */ + private AutoIngestControlPanel() { + //Disable the main window so they can only use the dashboard (if we used setVisible the taskBar icon would go away) + WindowManager.getDefault().getMainWindow().setEnabled(false); + + manager = AutoIngestManager.getInstance(); + + pendingTableModel = new DefaultTableModel(JobsTableModelColumns.headers, 0) { + private static final long serialVersionUID = 1L; + + @Override + public boolean isCellEditable(int row, int column) { + return false; + } + }; + + runningTableModel = new DefaultTableModel(JobsTableModelColumns.headers, 0) { + private static final long serialVersionUID = 1L; + + @Override + public boolean isCellEditable(int row, int column) { + return false; + } + }; + + completedTableModel = new DefaultTableModel(JobsTableModelColumns.headers, 0) { + private static final long serialVersionUID = 1L; + + @Override + public boolean isCellEditable(int row, int column) { + return false; + } + }; + + initComponents(); // Generated code. + setServicesStatusMessage(); + initPendingJobsTable(); + initRunningJobsTable(); + initCompletedJobsTable(); + initButtons(); + + /* + * Must set this flag, otherwise pop up menus don't close properly. + */ + UIManager.put("PopupMenu.consumeEventOnClose", false); + } + + /** + * Queries the services monitor and sets the text for the services status + * text box. + */ + private void setServicesStatusMessage() { + new SwingWorker() { + + String caseDatabaseServerStatus = ServicesMonitor.ServiceStatus.DOWN.toString(); + String keywordSearchServiceStatus = ServicesMonitor.ServiceStatus.DOWN.toString(); + String messagingStatus = ServicesMonitor.ServiceStatus.DOWN.toString(); + + @Override + protected Void doInBackground() throws Exception { + caseDatabaseServerStatus = getServiceStatus(ServicesMonitor.Service.REMOTE_CASE_DATABASE); + keywordSearchServiceStatus = getServiceStatus(ServicesMonitor.Service.REMOTE_KEYWORD_SEARCH); + messagingStatus = getServiceStatus(ServicesMonitor.Service.MESSAGING); + return null; + } + + /** + * Gets a status string for a given service. + * + * @param service The service to test. + * + * @return The status string. + */ + private String getServiceStatus(ServicesMonitor.Service service) { + String serviceStatus = NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.tbServicesStatusMessage.Message.Unknown"); + try { + ServicesMonitor servicesMonitor = ServicesMonitor.getInstance(); + serviceStatus = servicesMonitor.getServiceStatus(service.toString()); + if (serviceStatus.compareTo(ServicesMonitor.ServiceStatus.UP.toString()) == 0) { + serviceStatus = NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.tbServicesStatusMessage.Message.Up"); + } else { + serviceStatus = NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.tbServicesStatusMessage.Message.Down"); + } + } catch (ServicesMonitor.ServicesMonitorException ex) { + SYS_LOGGER.log(Level.SEVERE, String.format("Dashboard error getting service status for %s", service), ex); + } + return serviceStatus; + } + + @Override + protected void done() { + tbServicesStatusMessage.setText(NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.tbServicesStatusMessage.Message", caseDatabaseServerStatus, keywordSearchServiceStatus, keywordSearchServiceStatus, messagingStatus)); + String upStatus = NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.tbServicesStatusMessage.Message.Up"); + if (caseDatabaseServerStatus.compareTo(upStatus) != 0 + || keywordSearchServiceStatus.compareTo(upStatus) != 0 + || messagingStatus.compareTo(upStatus) != 0) { + tbServicesStatusMessage.setForeground(Color.RED); + } else { + tbServicesStatusMessage.setForeground(Color.BLACK); + } + } + + }.execute(); + } + + /** + * Sets up the JTable that presents a view of the system-wide pending jobs + * queue. + */ + private void initPendingJobsTable() { + /* + * Remove some of the jobs table model columns from the JTable. This + * does not remove the columns from the model, just from this table. + */ + pendingTable.removeColumn(pendingTable.getColumn(JobsTableModelColumns.HOST_NAME.getColumnHeader())); + pendingTable.removeColumn(pendingTable.getColumn(JobsTableModelColumns.STARTED_TIME.getColumnHeader())); + pendingTable.removeColumn(pendingTable.getColumn(JobsTableModelColumns.COMPLETED_TIME.getColumnHeader())); + pendingTable.removeColumn(pendingTable.getColumn(JobsTableModelColumns.STAGE.getColumnHeader())); + pendingTable.removeColumn(pendingTable.getColumn(JobsTableModelColumns.STAGE_TIME.getColumnHeader())); + pendingTable.removeColumn(pendingTable.getColumn(JobsTableModelColumns.CASE_DIRECTORY_PATH.getColumnHeader())); + pendingTable.removeColumn(pendingTable.getColumn(JobsTableModelColumns.IS_LOCAL_JOB.getColumnHeader())); + pendingTable.removeColumn(pendingTable.getColumn(JobsTableModelColumns.STATUS.getColumnHeader())); + pendingTable.removeColumn(pendingTable.getColumn(JobsTableModelColumns.MANIFEST_FILE_PATH.getColumnHeader())); + + /* + * Set up a column to display the cases associated with the jobs. + */ + TableColumn column; + column = pendingTable.getColumn(JobsTableModelColumns.CASE.getColumnHeader()); + column.setMinWidth(GENERIC_COL_MIN_WIDTH); + column.setMaxWidth(GENERIC_COL_MAX_WIDTH); + column.setPreferredWidth(PENDING_TABLE_COL_PREFERRED_WIDTH); + column.setWidth(PENDING_TABLE_COL_PREFERRED_WIDTH); + + /* + * Set up a column to display the image folders associated with the + * jobs. + */ + column = pendingTable.getColumn(JobsTableModelColumns.DATA_SOURCE.getColumnHeader()); + column.setMaxWidth(GENERIC_COL_MAX_WIDTH); + column.setPreferredWidth(PENDING_TABLE_COL_PREFERRED_WIDTH); + column.setWidth(PENDING_TABLE_COL_PREFERRED_WIDTH); + + /* + * Set up a column to display the create times of the jobs. + */ + column = pendingTable.getColumn(JobsTableModelColumns.CREATED_TIME.getColumnHeader()); + column.setCellRenderer(new LongDateCellRenderer()); + column.setMinWidth(TIME_COL_MIN_WIDTH); + column.setMaxWidth(TIME_COL_MAX_WIDTH); + column.setPreferredWidth(TIME_COL_PREFERRED_WIDTH); + column.setWidth(TIME_COL_PREFERRED_WIDTH); + + /** + * Prevent sorting when a column header is clicked. + */ + pendingTable.setAutoCreateRowSorter(false); + + /* + * Create a row selection listener to enable/disable the prioritize + * folder and prioritize case buttons. + */ + pendingTable.getSelectionModel().addListSelectionListener((ListSelectionEvent e) -> { + if (e.getValueIsAdjusting()) { + return; + } + int row = pendingTable.getSelectedRow(); + enablePendingTableButtons((row >= 0) && (row < pendingTable.getRowCount())); + }); + + /* + * Save the background color of the table so it can be restored on + * resume, after being grayed out on pause. Note the assumption that all + * of the tables use the same background color. + */ + pendingTableBackground = pendingTable.getBackground(); + pendingTablelForeground = pendingTable.getForeground(); + } + + /** + * Sets up the JTable that presents a view of the system-wide running jobs + * list. + */ + private void initRunningJobsTable() { + /* + * Remove some of the jobs table model columns from the JTable. This + * does not remove the columns from the model, just from this table. + */ + runningTable.removeColumn(runningTable.getColumn(JobsTableModelColumns.CREATED_TIME.getColumnHeader())); + runningTable.removeColumn(runningTable.getColumn(JobsTableModelColumns.STARTED_TIME.getColumnHeader())); + runningTable.removeColumn(runningTable.getColumn(JobsTableModelColumns.COMPLETED_TIME.getColumnHeader())); + runningTable.removeColumn(runningTable.getColumn(JobsTableModelColumns.STATUS.getColumnHeader())); + runningTable.removeColumn(runningTable.getColumn(JobsTableModelColumns.CASE_DIRECTORY_PATH.getColumnHeader())); + runningTable.removeColumn(runningTable.getColumn(JobsTableModelColumns.IS_LOCAL_JOB.getColumnHeader())); + runningTable.removeColumn(runningTable.getColumn(JobsTableModelColumns.MANIFEST_FILE_PATH.getColumnHeader())); + + /* + * Set up a column to display the cases associated with the jobs. + */ + TableColumn column; + column = runningTable.getColumn(JobsTableModelColumns.CASE.getColumnHeader()); + column.setMinWidth(GENERIC_COL_MIN_WIDTH); + column.setMaxWidth(GENERIC_COL_MAX_WIDTH); + column.setPreferredWidth(RUNNING_TABLE_COL_PREFERRED_WIDTH); + column.setWidth(RUNNING_TABLE_COL_PREFERRED_WIDTH); + + /* + * Set up a column to display the image folders associated with the + * jobs. + */ + column = runningTable.getColumn(JobsTableModelColumns.DATA_SOURCE.getColumnHeader()); + column.setMinWidth(GENERIC_COL_MIN_WIDTH); + column.setMaxWidth(GENERIC_COL_MAX_WIDTH); + column.setPreferredWidth(RUNNING_TABLE_COL_PREFERRED_WIDTH); + column.setWidth(RUNNING_TABLE_COL_PREFERRED_WIDTH); + + /* + * Set up a column to display the host names of the cluster nodes + * processing the jobs. + */ + column = runningTable.getColumn(JobsTableModelColumns.HOST_NAME.getColumnHeader()); + column.setMinWidth(NAME_COL_MIN_WIDTH); + column.setMaxWidth(NAME_COL_MAX_WIDTH); + column.setPreferredWidth(NAME_COL_PREFERRED_WIDTH); + column.setWidth(NAME_COL_PREFERRED_WIDTH); + + /* + * Set up a column to display the ingest activities associated with the + * jobs. + */ + column = runningTable.getColumn(JobsTableModelColumns.STAGE.getColumnHeader()); + column.setMinWidth(ACTIVITY_COL_MIN_WIDTH); + column.setMaxWidth(ACTIVITY_COL_MAX_WIDTH); + column.setPreferredWidth(ACTIVITY_COL_PREFERRED_WIDTH); + column.setWidth(ACTIVITY_COL_PREFERRED_WIDTH); + + /* + * Set up a column to display the ingest activity times associated with + * the jobs. + */ + column = runningTable.getColumn(JobsTableModelColumns.STAGE_TIME.getColumnHeader()); + column.setCellRenderer(new DurationCellRenderer()); + column.setMinWidth(GENERIC_COL_MIN_WIDTH); + column.setMaxWidth(ACTIVITY_TIME_COL_MAX_WIDTH); + column.setPreferredWidth(ACTIVITY_TIME_COL_MIN_WIDTH); + column.setWidth(ACTIVITY_TIME_COL_MIN_WIDTH); + + /* + * Prevent sorting when a column header is clicked. + */ + runningTable.setAutoCreateRowSorter(false); + + /* + * Create a row selection listener to enable/disable the cancel current + * job, cancel current module, and show progress buttons. + */ + runningTable.getSelectionModel().addListSelectionListener((ListSelectionEvent e) -> { + if (e.getValueIsAdjusting()) { + return; + } + updateRunningTableButtonsBasedOnSelectedRow(); + }); + } + + private void updateRunningTableButtonsBasedOnSelectedRow() { + int row = runningTable.getSelectedRow(); + if (row >= 0 && row < runningTable.getRowCount()) { + if ((boolean) runningTableModel.getValueAt(row, JobsTableModelColumns.IS_LOCAL_JOB.ordinal())) { + enableRunningTableButtons(true); + return; + } + } + enableRunningTableButtons(false); + } + + /** + * Sets up the JTable that presents a view of the system-wide competed jobs + * list. + */ + private void initCompletedJobsTable() { + /* + * Remove some of the jobs table model columns from the JTable. This + * does not remove the columns from the model, just from this table. + */ + completedTable.removeColumn(completedTable.getColumn(JobsTableModelColumns.STARTED_TIME.getColumnHeader())); + completedTable.removeColumn(completedTable.getColumn(JobsTableModelColumns.STAGE.getColumnHeader())); + completedTable.removeColumn(completedTable.getColumn(JobsTableModelColumns.STAGE_TIME.getColumnHeader())); + completedTable.removeColumn(completedTable.getColumn(JobsTableModelColumns.IS_LOCAL_JOB.getColumnHeader())); + completedTable.removeColumn(completedTable.getColumn(JobsTableModelColumns.HOST_NAME.getColumnHeader())); + completedTable.removeColumn(completedTable.getColumn(JobsTableModelColumns.CASE_DIRECTORY_PATH.getColumnHeader())); + completedTable.removeColumn(completedTable.getColumn(JobsTableModelColumns.MANIFEST_FILE_PATH.getColumnHeader())); + + /* + * Set up a column to display the cases associated with the jobs. + */ + TableColumn column; + column = completedTable.getColumn(JobsTableModelColumns.CASE.getColumnHeader()); + column.setMinWidth(COMPLETED_TIME_COL_MIN_WIDTH); + column.setMaxWidth(COMPLETED_TIME_COL_MAX_WIDTH); + column.setPreferredWidth(COMPLETED_TIME_COL_PREFERRED_WIDTH); + column.setWidth(COMPLETED_TIME_COL_PREFERRED_WIDTH); + + /* + * Set up a column to display the image folders associated with the + * jobs. + */ + column = completedTable.getColumn(JobsTableModelColumns.DATA_SOURCE.getColumnHeader()); + column.setMinWidth(COMPLETED_TIME_COL_MIN_WIDTH); + column.setMaxWidth(COMPLETED_TIME_COL_MAX_WIDTH); + column.setPreferredWidth(COMPLETED_TIME_COL_PREFERRED_WIDTH); + column.setWidth(COMPLETED_TIME_COL_PREFERRED_WIDTH); + + /* + * Set up a column to display the create times of the jobs. + */ + column = completedTable.getColumn(JobsTableModelColumns.CREATED_TIME.getColumnHeader()); + column.setCellRenderer(new LongDateCellRenderer()); + column.setMinWidth(TIME_COL_MIN_WIDTH); + column.setMaxWidth(TIME_COL_MAX_WIDTH); + column.setPreferredWidth(TIME_COL_PREFERRED_WIDTH); + column.setWidth(TIME_COL_PREFERRED_WIDTH); + + /* + * Set up a column to display the completed times of the jobs. + */ + column = completedTable.getColumn(JobsTableModelColumns.COMPLETED_TIME.getColumnHeader()); + column.setCellRenderer(new LongDateCellRenderer()); + column.setMinWidth(TIME_COL_MIN_WIDTH); + column.setMaxWidth(TIME_COL_MAX_WIDTH); + column.setPreferredWidth(TIME_COL_PREFERRED_WIDTH); + column.setWidth(TIME_COL_PREFERRED_WIDTH); + + /* + * Set up a column to display the statuses of the jobs, with a cell + * renderer that will choose an icon to represent the job status. + */ + column = completedTable.getColumn(JobsTableModelColumns.STATUS.getColumnHeader()); + column.setCellRenderer(new CaseStatusIconCellRenderer()); + column.setMinWidth(STATUS_COL_MIN_WIDTH); + column.setMaxWidth(STATUS_COL_MAX_WIDTH); + column.setPreferredWidth(STATUS_COL_PREFERRED_WIDTH); + column.setWidth(STATUS_COL_PREFERRED_WIDTH); + + /* + * Prevent sorting when a column header is clicked. + */ + completedTable.setAutoCreateRowSorter(false); + + /* + * Create a row selection listener to enable/disable the delete case and + * show log buttons. + */ + completedTable.getSelectionModel() + .addListSelectionListener((ListSelectionEvent e) -> { + if (e.getValueIsAdjusting()) { + return; + } + int row = completedTable.getSelectedRow(); + boolean enabled = row >= 0 && row < completedTable.getRowCount(); + bnDeleteCase.setEnabled(enabled); + bnShowCaseLog.setEnabled(enabled); + bnReprocessJob.setEnabled(enabled); + }); + } + + /** + * Sets the initial state of the buttons on the panel. + */ + private void initButtons() { + bnOptions.setEnabled(true); + bnDeleteCase.setEnabled(false); + enablePendingTableButtons(false); + bnShowCaseLog.setEnabled(false); + bnReprocessJob.setEnabled(false); + bnPause.setText(org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.bnStart.text")); + bnPause.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.bnStart.toolTipText")); + bnPause.setEnabled(true); //initial label for bnPause is 'Start' and it's enabled for user to start the process + bnRefresh.setEnabled(false); //at initial stage, nothing to refresh + enableRunningTableButtons(false); + tbStatusMessage.setText(org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.bnStart.startMessage")); + } + + /** + * Enables or disables buttons related to the running jobs table. + * + * @param enable Enable/disable the buttons. + */ + private void enableRunningTableButtons(Boolean enable) { + bnCancelJob.setEnabled(enable); + bnCancelModule.setEnabled(enable); + bnShowProgress.setEnabled(enable); + } + + /** + * Enables or disables buttons related to pending jobs table. + * + * @param enable Enable/disable the buttons. + */ + private void enablePendingTableButtons(Boolean enable) { + bnPrioritizeCase.setEnabled(enable); + bnPrioritizeJob.setEnabled(enable); + } + + /** + * Starts up the auto ingest manager and adds this panel as an observer, + * subscribes to services monitor events and starts a task to populate the + * auto ingest job tables. The Refresh and Pause buttons are enabled. + */ + private void startUp() { + + /* + * Starts up the auto ingest manager (AIM). + */ + try { + manager.startUp(); + autoIngestStarted = true; + } catch (AutoIngestManager.AutoIngestManagerStartupException ex) { + SYS_LOGGER.log(Level.SEVERE, "Dashboard error starting up auto ingest", ex); + tbStatusMessage.setText(NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.AutoIngestStartupError")); + manager = null; + + JOptionPane.showMessageDialog(this, + NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.AutoIngestStartupFailed.Message"), + NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.AutoIngestStartupFailed.Title"), + JOptionPane.ERROR_MESSAGE); + bnOptions.setEnabled(true); + + /* + * If the AIM cannot be started, there is nothing more to do. + */ + return; + } + + /* + * Subscribe to services monitor events. + */ + ServicesMonitor.getInstance().addSubscriber((PropertyChangeEvent evt) -> { + setServicesStatusMessage(); + }); + + /* + * Register with the AIM as an observer. + */ + manager.addObserver(this); + + /* + * Populate the pending, running, and completed auto ingest job tables. + */ + updateExecutor = Executors.newSingleThreadExecutor(new ThreadFactoryBuilder().setNameFormat(UPDATE_TASKS_THREAD_NAME).build()); + updateExecutor.submit(new UpdateAllJobsTablesTask()); + manager.scanInputDirsNow(); + + //bnPause.setEnabled(true); + bnPause.setText(org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.bnPause.text")); + bnPause.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.bnPause.toolTipText")); + bnRefresh.setEnabled(true); + bnOptions.setEnabled(false); + + tbStatusMessage.setText(org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.bnPause.running")); + } + + /** + * Shuts down auto ingest by shutting down the auto ingest manager and doing + * an application exit. + */ + public void shutdown() { + /* + * Confirm that the user wants to proceed, letting him or her no that if + * there is a currently running job it will be cancelled. TODO (RC): If + * a wait cursor is provided, this could perhaps be made conditional on + * a running job check again. Or the simple check in isLocalJobRunning + * could be used. Was this previously used and I removed it thinking it + * was grabbing the monitor? + */ + Object[] options = { + NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.OK"), + NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.Cancel")}; + int reply = JOptionPane.OK_OPTION; + + if (null != manager && IngestManager.getInstance().isIngestRunning()) { + reply = JOptionPane.showOptionDialog(this, + NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.ExitConsequences"), + NbBundle.getMessage(AutoIngestControlPanel.class, "ConfirmationDialog.ConfirmExitHeader"), + JOptionPane.DEFAULT_OPTION, + JOptionPane.WARNING_MESSAGE, + null, + options, + options[JOptionPane.NO_OPTION]); + } + if (reply == JOptionPane.OK_OPTION) { + /* + * Provide user feedback. Call setCursor on this to ensure it + * appears (if there is time to see it). + */ + this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + tbStatusMessage.setText(org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.ExitingStatus")); + + /* + * Shut down the table refresh task executor. + */ + if (null != updateExecutor) { + updateExecutor.shutdownNow(); + } + + /* + * Stop observing the auto ingest manager (AIM). + */ + if (null != manager) { + manager.deleteObserver(this); + } + + /* + * Shut down the AIM and close. + */ + new SwingWorker() { + + @Override + protected Void doInBackground() throws Exception { + if (null != manager) { + manager.shutDown(); + } + return null; + } + + @Override + protected void done() { + AutoIngestControlPanel.this.setCursor(Cursor.getDefaultCursor()); + LifecycleManager.getDefault().exit(); + } + }.execute(); + } + } + + /** + * @inheritDoc + */ + @NbBundle.Messages({ + "AutoIngestControlPanel.bnPause.paused=Paused", + "AutoIngestControlPanel.PauseDueToDatabaseServiceDown=Paused, unable to communicate with case database service.", + "AutoIngestControlPanel.PauseDueToKeywordSearchServiceDown=Paused, unable to communicate with keyword search service.", + "AutoIngestControlPanel.PauseDueToCoordinationServiceDown=Paused, unable to communicate with coordination service.", + "AutoIngestControlPanel.PauseDueToWriteStateFilesFailure=Paused, unable to write to shared images or cases location.", + "AutoIngestControlPanel.PauseDueToSharedConfigError=Paused, unable to update shared configuration.", + "AutoIngestControlPanel.PauseDueToIngestJobStartFailure=Paused, unable to start ingest job processing.", + "AutoIngestControlPanel.PauseDueToFileExporterError=Paused, unable to load File Exporter settings.", + "AutoIngestControlPanel.bnPause.running=Running", + "AutoIngestControlPanel.bnStart.startMessage=Waiting to start", + "AutoIngestControlPanel.bnStart.text=Start", + "AutoIngestControlPanel.bnStart.toolTipText=Start processing auto ingest jobs" + }) + @Override + public void update(Observable o, Object arg) { + + if (arg instanceof AutoIngestManager.Event) { + switch ((AutoIngestManager.Event) arg) { + case INPUT_SCAN_COMPLETED: + case JOB_STARTED: + case JOB_COMPLETED: + case CASE_DELETED: + updateExecutor.submit(new UpdateAllJobsTablesTask()); + break; + case PAUSED_BY_REQUEST: + EventQueue.invokeLater(() -> { + tbStatusMessage.setText(org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.bnPause.paused")); + bnOptions.setEnabled(true); + bnRefresh.setEnabled(false); + isPaused = true; + }); + break; + case PAUSED_FOR_SYSTEM_ERROR: + EventQueue.invokeLater(() -> { + tbStatusMessage.setText(org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.PauseDueToSystemError")); + bnOptions.setEnabled(true); + bnRefresh.setEnabled(false); + pause(false); + isPaused = true; + setServicesStatusMessage(); + }); + break; + case RESUMED: + EventQueue.invokeLater(() -> { + tbStatusMessage.setText(org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.bnPause.running")); + }); + break; + case CASE_PRIORITIZED: + updateExecutor.submit(new UpdatePendingJobsTableTask()); + break; + case JOB_STATUS_UPDATED: + updateExecutor.submit(new UpdateRunningJobsTablesTask()); + break; + default: + break; + } + } + } + + /** + * Requests a pause of auto ingest processing by the auto ingest manager and + * handles updates to the components that implement the pause and resume + * feature. Note that this feature is needed to get around restrictions on + * changing ingest module selections and settings while an ingest job is + * running, and that the auto ingest manager will not actually pause until + * the current auto ingest job completes. + * + * @param buttonClicked Is this pause request in response to a user gesture + * or a nofification from the auto ingest manager + * (AIM)? + */ + private void pause(boolean buttonClicked) { + /** + * Gray out the cells in the pending table to give a visual indicator of + * the pausing/paused state. + */ + pendingTable.setBackground(Color.LIGHT_GRAY); + pendingTable.setForeground(Color.DARK_GRAY); + + /** + * Change the pause button text and tool tip to make it a resume button. + */ + bnPause.setText(org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.bnResume.text")); + bnPause.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.bnPause.toolTipTextResume")); + + if (buttonClicked) { + /** + * Ask the auto ingest manager to pause when it completes the + * currently running job, if any. + */ + manager.pause(); + bnRefresh.setEnabled(false); + } + } + + /** + * Requests a resume of auto ingest processing by the auto ingest manager + * and handles updates to the components that implement the pause and resume + * feature. Note that this feature is needed to get around restrictions on + * changing ingest module selections and settings while an ingest job is + * running, and that the auto ingest manager will not actually pause until + * the current auto ingest job completes. + */ + private void resume() { + /** + * Change the resume button text and tool tip to make it a pause button. + */ + bnOptions.setEnabled(false); + bnPause.setText(org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.bnPause.text")); + bnPause.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.bnPause.toolTipText")); + tbStatusMessage.setText(org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.bnPause.running")); + bnRefresh.setEnabled(true); + + /** + * Remove the graying out of the pending table. + */ + pendingTable.setBackground(pendingTableBackground); + pendingTable.setForeground(pendingTablelForeground); + + /** + * Ask the auto ingest manager to resume processing. + */ + manager.resume(); + } + + /** + * A runnable task that gets the pending auto ingest jobs list from the auto + * ingest manager and queues a components refresh task for execution in the + * EDT. + */ + private class UpdatePendingJobsTableTask implements Runnable { + + /** + * @inheritDoc + */ + @Override + public void run() { + List pendingJobs = new ArrayList<>(); + manager.getJobs(pendingJobs, null, null); + EventQueue.invokeLater(new RefreshComponentsTask(pendingJobs, null, null)); + } + } + + /** + * A runnable task that gets the running auto ingest jobs list from the auto + * ingest manager and queues a components refresh task for execution in the + * EDT. + */ + private class UpdateRunningJobsTablesTask implements Runnable { + + /** + * @inheritDoc + */ + @Override + public void run() { + List runningJobs = new ArrayList<>(); + manager.getJobs(null, runningJobs, null); + EventQueue.invokeLater(new RefreshComponentsTask(null, runningJobs, null)); + } + } + + /** + * A runnable task that gets the pending, running and completed auto ingest + * jobs lists from the auto ingest manager and queues a components refresh + * task for execution in the EDT. Note that this task is frequently used + * when only the pending and updated lists definitely need to be updated. + * This is because the cost of updating the running jobs list is both very + * small and it is beneficial to keep running job status up to date if there + * is a running job. + */ + private class UpdateAllJobsTablesTask implements Runnable { + + /** + * @inheritDoc + */ + @Override + public void run() { + List pendingJobs = new ArrayList<>(); + List runningJobs = new ArrayList<>(); + List completedJobs = new ArrayList<>(); + manager.getJobs(pendingJobs, runningJobs, completedJobs); + // Sort the completed jobs list by completed date + Collections.sort(completedJobs, new AutoIngestJob.ReverseDateCompletedComparator()); + EventQueue.invokeLater(new RefreshComponentsTask(pendingJobs, runningJobs, completedJobs)); + } + } + + /** + * A runnable task that refreshes the components on this panel to reflect + * the current state of one or more auto ingest job lists obtained from the + * auto ingest manager. + */ + private class RefreshComponentsTask implements Runnable { + + private final List pendingJobs; + private final List runningJobs; + private final List completedJobs; + + /** + * Constructs a runnable task that refreshes the components on this + * panel to reflect the current state of the auto ingest jobs. + * + * @param pendingJobs A list of pending jobs, may be null if the + * pending jobs are unchanged. + * @param runningJobs A list of running jobs, may be null if the + * running jobs are unchanged. + * @param completedJobs A list of completed jobs, may be null if the + * completed jobs are unchanged. + */ + RefreshComponentsTask(List pendingJobs, List runningJobs, List completedJobs) { + this.pendingJobs = pendingJobs; + this.runningJobs = runningJobs; + this.completedJobs = completedJobs; + } + + /** + * @inheritDoc + */ + @Override + public void run() { + /* + * NOTE: There is a problem with our approach of preserving table + * row selections - what if the number of rows has changed as result + * of calling refreshTable(). Then it is possible for what used to + * be (for example) row 1 to now be in some other row or be removed + * from the table. This code will re-set the selection back to what + * it used to be before calling refreshTable(), i.e. row 1 + */ + + if (null != pendingJobs) { + Path currentRow = getSelectedEntry(pendingTable, pendingTableModel); + refreshTable(pendingJobs, pendingTableModel, null); + setSelectedEntry(pendingTable, pendingTableModel, currentRow); + } + + if (null != runningJobs) { + if (!isLocalJobRunning()) { + enableRunningTableButtons(false); + } else { + updateRunningTableButtonsBasedOnSelectedRow(); + } + Path currentRow = getSelectedEntry(runningTable, runningTableModel); + refreshTable(runningJobs, runningTableModel, null); + setSelectedEntry(runningTable, runningTableModel, currentRow); + } + + if (null != completedJobs) { + Path currentRow = getSelectedEntry(completedTable, completedTableModel); + refreshTable(completedJobs, completedTableModel, null); + setSelectedEntry(completedTable, completedTableModel, currentRow); + } + } + + /** + * Checks whether there is a job that is running on local AIN. + * + * @return true is local job is found, false otherwise. + */ + private boolean isLocalJobRunning() { + for (AutoIngestJob job : runningJobs) { + if (isLocalJob(job)) { + return true; + } + } + return false; + } + + /** + * Checks whether or not an automated ingest job is local to this node. + * + * @param job The job. + * + * @return True or fale. + */ + private boolean isLocalJob(AutoIngestJob job) { + return job.getNodeName().equals(LOCAL_HOST_NAME); + } + + /** + * Get a path representing the current selection on the table passed in. + * If there is no selection, return null. + * + * @param table The table to get + * @param tableModel The tableModel of the table to get + * + * @return a path representing the current selection + */ + Path getSelectedEntry(JTable table, DefaultTableModel tableModel) { + try { + int currentlySelectedRow = table.getSelectedRow(); + if (currentlySelectedRow >= 0 && currentlySelectedRow < table.getRowCount()) { + return Paths.get(tableModel.getValueAt(currentlySelectedRow, JobsTableModelColumns.CASE.ordinal()).toString(), + tableModel.getValueAt(currentlySelectedRow, JobsTableModelColumns.DATA_SOURCE.ordinal()).toString()); + } + } catch (Exception ignored) { + return null; + } + return null; + } + + /** + * Set the selection on the table to the passed-in path's item, if that + * item exists in the table. If it does not, clears the table selection. + * + * @param table The table to set + * @param tableModel The tableModel of the table to set + * @param path The path of the item to set + */ + void setSelectedEntry(JTable table, DefaultTableModel tableModel, Path path) { + if (path != null) { + try { + for (int row = 0; row < table.getRowCount(); ++row) { + Path temp = Paths.get(tableModel.getValueAt(row, JobsTableModelColumns.CASE.ordinal()).toString(), + tableModel.getValueAt(row, JobsTableModelColumns.DATA_SOURCE.ordinal()).toString()); + if (temp.compareTo(path) == 0) { // found it + table.setRowSelectionInterval(row, row); + return; + } + } + } catch (Exception ignored) { + table.clearSelection(); + } + } + table.clearSelection(); + } + } + + /** + * Reloads the table model for an auto ingest jobs table, refreshing the + * JTable that uses the model. + * + * @param jobs The list of auto ingest jobs. + * @param tableModel The table model. + * @param comparator An optional comparator (may be null) for sorting the + * table model. + */ + private void refreshTable(List jobs, DefaultTableModel tableModel, Comparator comparator) { + try { + if (comparator != null) { + jobs.sort(comparator); + } + tableModel.setRowCount(0); + for (AutoIngestJob job : jobs) { + AutoIngestJob.StageDetails status = job.getStageDetails(); + tableModel.addRow(new Object[]{ + job.getManifest().getCaseName(), // CASE + job.getManifest().getDataSourcePath().getFileName(), // DATA_SOURCE + job.getNodeName(), // HOST_NAME + job.getManifest().getDateFileCreated(), // CREATED_TIME + job.getStageStartDate(), // STARTED_TIME + job.getCompletedDate(), // COMPLETED_TIME + status.getDescription(), // ACTIVITY + job.hasErrors(), // STATUS + ((Date.from(Instant.now()).getTime()) - (status.getStartDate().getTime())), // ACTIVITY_TIME + job.getCaseDirectoryPath(), // CASE_DIRECTORY_PATH + job.getNodeName().equals(LOCAL_HOST_NAME), // IS_LOCAL_JOB + job.getManifest().getFilePath()}); // MANIFEST_FILE_PATH + } + } catch (Exception ex) { + SYS_LOGGER.log(Level.SEVERE, "Dashboard error refreshing table", ex); + } + } + + /** + * Get the current lists of jobs and update the UI. + */ + private void refreshTables(){ + JobsSnapshot jobsSnapshot = manager.getCurrentJobsSnapshot(); + refreshTable(jobsSnapshot.getCompletedJobs(), completedTableModel, null); + refreshTable(jobsSnapshot.getPendingJobs(), pendingTableModel, null); + refreshTable(jobsSnapshot.getRunningJobs(), runningTableModel, null); + } + + /** + * This method is called from within the constructor to initialize the form. + * WARNING: Do NOT modify this code. The content of this method is always + * regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + pendingScrollPane = new javax.swing.JScrollPane(); + pendingTable = new javax.swing.JTable(); + runningScrollPane = new javax.swing.JScrollPane(); + runningTable = new javax.swing.JTable(); + completedScrollPane = new javax.swing.JScrollPane(); + completedTable = new javax.swing.JTable(); + bnCancelJob = new javax.swing.JButton(); + bnDeleteCase = new javax.swing.JButton(); + lbPending = new javax.swing.JLabel(); + lbRunning = new javax.swing.JLabel(); + lbCompleted = new javax.swing.JLabel(); + bnRefresh = new javax.swing.JButton(); + bnCancelModule = new javax.swing.JButton(); + bnExit = new javax.swing.JButton(); + bnOptions = new javax.swing.JButton(); + bnShowProgress = new javax.swing.JButton(); + bnPause = new javax.swing.JButton(); + bnPrioritizeCase = new javax.swing.JButton(); + bnShowCaseLog = new javax.swing.JButton(); + tbStatusMessage = new javax.swing.JTextField(); + lbStatus = new javax.swing.JLabel(); + bnPrioritizeJob = new javax.swing.JButton(); + lbServicesStatus = new javax.swing.JLabel(); + tbServicesStatusMessage = new javax.swing.JTextField(); + bnOpenLogDir = new javax.swing.JButton(); + bnReprocessJob = new javax.swing.JButton(); + + pendingTable.setModel(pendingTableModel); + pendingTable.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.pendingTable.toolTipText")); // NOI18N + pendingTable.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_ALL_COLUMNS); + pendingTable.setRowHeight(20); + pendingTable.setSelectionModel(new DefaultListSelectionModel() { + private static final long serialVersionUID = 1L; + @Override + public void setSelectionInterval(int index0, int index1) { + if (index0 == pendingTable.getSelectedRow()) { + pendingTable.clearSelection(); + } else { + super.setSelectionInterval(index0, index1); + } + } + }); + pendingTable.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION); + pendingScrollPane.setViewportView(pendingTable); + + runningTable.setModel(runningTableModel); + runningTable.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.runningTable.toolTipText")); // NOI18N + runningTable.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_ALL_COLUMNS); + runningTable.setRowHeight(20); + runningTable.setSelectionModel(new DefaultListSelectionModel() { + private static final long serialVersionUID = 1L; + @Override + public void setSelectionInterval(int index0, int index1) { + if (index0 == runningTable.getSelectedRow()) { + runningTable.clearSelection(); + } else { + super.setSelectionInterval(index0, index1); + } + } + }); + runningTable.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION); + runningScrollPane.setViewportView(runningTable); + + completedTable.setModel(completedTableModel); + completedTable.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.completedTable.toolTipText")); // NOI18N + completedTable.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_ALL_COLUMNS); + completedTable.setRowHeight(20); + completedTable.setSelectionModel(new DefaultListSelectionModel() { + private static final long serialVersionUID = 1L; + @Override + public void setSelectionInterval(int index0, int index1) { + if (index0 == completedTable.getSelectedRow()) { + completedTable.clearSelection(); + } else { + super.setSelectionInterval(index0, index1); + } + } + }); + completedTable.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION); + completedScrollPane.setViewportView(completedTable); + + org.openide.awt.Mnemonics.setLocalizedText(bnCancelJob, org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.bnCancelJob.text")); // NOI18N + bnCancelJob.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.bnCancelJob.toolTipText")); // NOI18N + bnCancelJob.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + bnCancelJobActionPerformed(evt); + } + }); + + org.openide.awt.Mnemonics.setLocalizedText(bnDeleteCase, org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.bnDeleteCase.text")); // NOI18N + bnDeleteCase.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.bnDeleteCase.toolTipText")); // NOI18N + bnDeleteCase.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + bnDeleteCaseActionPerformed(evt); + } + }); + + lbPending.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N + org.openide.awt.Mnemonics.setLocalizedText(lbPending, org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.lbPending.text")); // NOI18N + + lbRunning.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N + org.openide.awt.Mnemonics.setLocalizedText(lbRunning, org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.lbRunning.text")); // NOI18N + + lbCompleted.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N + org.openide.awt.Mnemonics.setLocalizedText(lbCompleted, org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.lbCompleted.text")); // NOI18N + + org.openide.awt.Mnemonics.setLocalizedText(bnRefresh, org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.bnRefresh.text")); // NOI18N + bnRefresh.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.bnRefresh.toolTipText")); // NOI18N + bnRefresh.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + bnRefreshActionPerformed(evt); + } + }); + + org.openide.awt.Mnemonics.setLocalizedText(bnCancelModule, org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.bnCancelModule.text")); // NOI18N + bnCancelModule.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.bnCancelModule.toolTipText")); // NOI18N + bnCancelModule.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + bnCancelModuleActionPerformed(evt); + } + }); + + org.openide.awt.Mnemonics.setLocalizedText(bnExit, org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.bnExit.text")); // NOI18N + bnExit.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.bnExit.toolTipText")); // NOI18N + bnExit.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + bnExitActionPerformed(evt); + } + }); + + org.openide.awt.Mnemonics.setLocalizedText(bnOptions, org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.bnOptions.text")); // NOI18N + bnOptions.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.bnOptions.toolTipText")); // NOI18N + bnOptions.setEnabled(false); + bnOptions.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + bnOptionsActionPerformed(evt); + } + }); + + org.openide.awt.Mnemonics.setLocalizedText(bnShowProgress, org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.bnShowProgress.text")); // NOI18N + bnShowProgress.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.bnShowProgress.toolTipText")); // NOI18N + bnShowProgress.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + bnShowProgressActionPerformed(evt); + } + }); + + org.openide.awt.Mnemonics.setLocalizedText(bnPause, org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.bnPause.text")); // NOI18N + bnPause.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.bnPause.toolTipText")); // NOI18N + bnPause.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + bnPauseActionPerformed(evt); + } + }); + + org.openide.awt.Mnemonics.setLocalizedText(bnPrioritizeCase, org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.bnPrioritizeCase.text")); // NOI18N + bnPrioritizeCase.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.bnPrioritizeCase.toolTipText")); // NOI18N + bnPrioritizeCase.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + bnPrioritizeCaseActionPerformed(evt); + } + }); + + org.openide.awt.Mnemonics.setLocalizedText(bnShowCaseLog, org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.bnShowCaseLog.text")); // NOI18N + bnShowCaseLog.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.bnShowCaseLog.toolTipText")); // NOI18N + bnShowCaseLog.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + bnShowCaseLogActionPerformed(evt); + } + }); + + tbStatusMessage.setEditable(false); + tbStatusMessage.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N + tbStatusMessage.setText(org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.tbStatusMessage.text")); // NOI18N + tbStatusMessage.setBorder(null); + + lbStatus.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N + org.openide.awt.Mnemonics.setLocalizedText(lbStatus, org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.lbStatus.text")); // NOI18N + + org.openide.awt.Mnemonics.setLocalizedText(bnPrioritizeJob, org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.bnPrioritizeJob.text")); // NOI18N + bnPrioritizeJob.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.bnPrioritizeJob.toolTipText")); // NOI18N + bnPrioritizeJob.setActionCommand(org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.bnPrioritizeJob.actionCommand")); // NOI18N + bnPrioritizeJob.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + bnPrioritizeJobActionPerformed(evt); + } + }); + + lbServicesStatus.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N + org.openide.awt.Mnemonics.setLocalizedText(lbServicesStatus, org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.lbServicesStatus.text")); // NOI18N + + tbServicesStatusMessage.setEditable(false); + tbServicesStatusMessage.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N + tbServicesStatusMessage.setText(org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.tbServicesStatusMessage.text")); // NOI18N + tbServicesStatusMessage.setBorder(null); + + org.openide.awt.Mnemonics.setLocalizedText(bnOpenLogDir, org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.bnOpenLogDir.text")); // NOI18N + bnOpenLogDir.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + bnOpenLogDirActionPerformed(evt); + } + }); + + org.openide.awt.Mnemonics.setLocalizedText(bnReprocessJob, org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.bnReprocessJob.text")); // NOI18N + bnReprocessJob.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + bnReprocessJobActionPerformed(evt); + } + }); + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); + this.setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addComponent(lbPending, javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(pendingScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 920, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(bnPrioritizeCase, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(bnPrioritizeJob, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) + .addGroup(layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addComponent(bnPause) + .addGap(18, 18, 18) + .addComponent(bnRefresh, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(18, 18, 18) + .addComponent(bnOptions) + .addGap(18, 18, 18) + .addComponent(bnOpenLogDir) + .addGap(18, 18, 18) + .addComponent(bnExit, javax.swing.GroupLayout.PREFERRED_SIZE, 94, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGroup(layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(runningScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 920, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(completedScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 920, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addComponent(bnCancelJob, javax.swing.GroupLayout.DEFAULT_SIZE, 117, Short.MAX_VALUE) + .addComponent(bnShowProgress, javax.swing.GroupLayout.DEFAULT_SIZE, 116, Short.MAX_VALUE) + .addComponent(bnCancelModule, javax.swing.GroupLayout.DEFAULT_SIZE, 117, Short.MAX_VALUE) + .addComponent(bnDeleteCase, javax.swing.GroupLayout.DEFAULT_SIZE, 117, Short.MAX_VALUE) + .addComponent(bnShowCaseLog, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(bnReprocessJob, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) + .addGroup(layout.createSequentialGroup() + .addComponent(lbStatus) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(tbStatusMessage, javax.swing.GroupLayout.PREFERRED_SIZE, 861, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addComponent(lbCompleted) + .addComponent(lbRunning) + .addGroup(layout.createSequentialGroup() + .addComponent(lbServicesStatus) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(tbServicesStatusMessage, javax.swing.GroupLayout.PREFERRED_SIZE, 861, javax.swing.GroupLayout.PREFERRED_SIZE))) + .addGap(0, 0, Short.MAX_VALUE))) + .addContainerGap()) + ); + + layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {bnCancelJob, bnCancelModule, bnDeleteCase, bnExit, bnOpenLogDir, bnOptions, bnPause, bnRefresh, bnShowProgress}); + + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(lbStatus, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(tbStatusMessage, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(lbServicesStatus, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(tbServicesStatusMessage, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(lbPending, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(pendingScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 215, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGroup(layout.createSequentialGroup() + .addGap(82, 82, 82) + .addComponent(bnPrioritizeCase) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(bnPrioritizeJob))) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(lbRunning) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGap(34, 34, 34) + .addComponent(bnShowProgress) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(bnCancelJob) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(bnCancelModule)) + .addGroup(layout.createSequentialGroup() + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(runningScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 133, javax.swing.GroupLayout.PREFERRED_SIZE))) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGap(68, 68, 68) + .addComponent(bnReprocessJob) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(bnDeleteCase) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(bnShowCaseLog)) + .addGroup(layout.createSequentialGroup() + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(lbCompleted) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(completedScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 179, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(bnExit) + .addComponent(bnOpenLogDir)) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(bnPause) + .addComponent(bnRefresh) + .addComponent(bnOptions))))) + .addContainerGap()) + ); + + layout.linkSize(javax.swing.SwingConstants.VERTICAL, new java.awt.Component[] {bnCancelJob, bnCancelModule, bnDeleteCase, bnExit, bnOpenLogDir, bnOptions, bnRefresh, bnShowProgress}); + + }// //GEN-END:initComponents + + /** + * Handles a click on the refresh button. Requests an immediate scan of the + * input folders for new jobs and queues a refresh of all three of the jobs + * tables. + * + * @param evt - The button click event. + */ + private void bnRefreshActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnRefreshActionPerformed + this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + manager.scanInputDirsAndWait(); + refreshTables(); + this.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); + }//GEN-LAST:event_bnRefreshActionPerformed + + /** + * Handles a click on the delete case button. If an entry is selected that + * can be deleted, pops up a confirmation dialog. Upon confirmation, asks + * AutoIngestManager to delete the entry and asks for an updated view. + * + * @param evt The button click event. + */ + private void bnDeleteCaseActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnDeleteCaseActionPerformed + if (completedTableModel.getRowCount() < 0 || completedTable.getSelectedRow() < 0) { + return; + } + + String caseName = (String) completedTable.getValueAt(completedTable.getSelectedRow(), JobsTableModelColumns.CASE.ordinal()); + Object[] options = { + org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "ConfirmationDialog.Delete"), + org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "ConfirmationDialog.DoNotDelete") + }; + Object[] msgContent = {org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "ConfirmationDialog.DeleteAreYouSure") + "\"" + caseName + "\"?"}; + int reply = JOptionPane.showOptionDialog(this, + msgContent, + org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "ConfirmationDialog.ConfirmDeletionHeader"), + JOptionPane.DEFAULT_OPTION, + JOptionPane.WARNING_MESSAGE, + null, + options, + options[JOptionPane.NO_OPTION]); + if (reply == JOptionPane.YES_OPTION) { + bnDeleteCase.setEnabled(false); + bnShowCaseLog.setEnabled(false); + if (completedTableModel.getRowCount() > 0 && completedTable.getSelectedRow() >= 0) { + Path caseDirectoryPath = (Path) completedTableModel.getValueAt(completedTable.getSelectedRow(), JobsTableModelColumns.CASE_DIRECTORY_PATH.ordinal()); + completedTable.clearSelection(); + this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + CaseDeletionResult result = manager.deleteCase(caseName, caseDirectoryPath); + refreshTables(); + this.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); + if (CaseDeletionResult.FAILED == result) { + JOptionPane.showMessageDialog(this, + String.format("Could not delete case %s. It may be in in use.", caseName), + org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.DeletionFailed"), + JOptionPane.INFORMATION_MESSAGE); + } else if (CaseDeletionResult.PARTIALLY_DELETED == result) { + JOptionPane.showMessageDialog(this, + String.format("Could not delete case %s. See system log for details.", caseName), + org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.DeletionFailed"), + JOptionPane.INFORMATION_MESSAGE); + } + } + } + }//GEN-LAST:event_bnDeleteCaseActionPerformed + + /** + * Handles a click on the cancel auto ingest job button. Cancels the + * selected job. + * + * @param evt The button click event. + */ + private void bnCancelJobActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnCancelJobActionPerformed + Object[] options = { + org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "ConfirmationDialog.CancelJob"), + org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "ConfirmationDialog.DoNotCancelJob")}; + int reply = JOptionPane.showOptionDialog(this, + NbBundle.getMessage(AutoIngestControlPanel.class, "ConfirmationDialog.CancelJobAreYouSure"), + NbBundle.getMessage(AutoIngestControlPanel.class, "ConfirmationDialog.ConfirmCancellationHeader"), + JOptionPane.DEFAULT_OPTION, + JOptionPane.WARNING_MESSAGE, + null, + options, + options[1]); + if (reply == 0) { + /* + * Call setCursor on this to ensure it appears (if there is time to + * see it). + */ + this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + manager.cancelCurrentJob(); + refreshTables(); + this.setCursor(Cursor.getDefaultCursor()); + } + }//GEN-LAST:event_bnCancelJobActionPerformed + + /** + * Handles a click on the show auto ingest job progress button. Displays an + * ingest job progress panel. + * + * @param evt The button click event. + */ + private void bnShowProgressActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnShowProgressActionPerformed + IngestProgressSnapshotDialog dialog = new IngestProgressSnapshotDialog(this.getTopLevelAncestor(), true); + }//GEN-LAST:event_bnShowProgressActionPerformed + + /** + * Handles a click on the pause/resume auto ingest job button. Sends a + * pause/resume request to the auto ingest manager. + * + * @param evt The button click event. + */ + private void bnPauseActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnPauseActionPerformed + + if (!autoIngestStarted) { + //put up a wait cursor during the start up operation + this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + + startUp(); + + this.setCursor(null); + //done for startup + return; + } + if (!isPaused) { + tbStatusMessage.setText(org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.bnPause.pausing")); + pause(true); + } else { + resume(); + } + isPaused = !isPaused; + }//GEN-LAST:event_bnPauseActionPerformed + + /** + * Handles a click on the options button. Displays the options window. + * + * @param evt The button click event. + */ + private void bnOptionsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnOptionsActionPerformed + setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + OptionsDisplayer.getDefault().open(); + setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); + }//GEN-LAST:event_bnOptionsActionPerformed + + /** + * Handles a click on the cancel ingest module button. Cancels the currently + * running data source level ingest module for the selected job. + * + * @param evt The button click event. + */ + private void bnCancelModuleActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnCancelModuleActionPerformed + Object[] options = { + org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "ConfirmationDialog.CancelModule"), + org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "ConfirmationDialog.DoNotCancelModule")}; + int reply = JOptionPane.showOptionDialog(this, + NbBundle.getMessage(AutoIngestControlPanel.class, "ConfirmationDialog.CancelModuleAreYouSure"), + NbBundle.getMessage(AutoIngestControlPanel.class, "ConfirmationDialog.ConfirmCancellationHeader"), + JOptionPane.DEFAULT_OPTION, + JOptionPane.WARNING_MESSAGE, + null, + options, + options[1]); + if (reply == 0) { + /* + * Call setCursor on this to ensure it appears (if there is time to + * see it). + */ + this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + manager.cancelCurrentDataSourceLevelIngestModule(); + refreshTables(); + this.setCursor(Cursor.getDefaultCursor()); + } + }//GEN-LAST:event_bnCancelModuleActionPerformed + + /** + * Handles a click on the exit button. Shuts down auto ingest. + * + * @param evt The button click event. + */ + private void bnExitActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnExitActionPerformed + shutdown(); + }//GEN-LAST:event_bnExitActionPerformed + + /** + * Handle a click on the prioritize case button. Requests prioritization of + * all of the auto ingest jobs for a case. + * + * @param evt The button click event. + */ + private void bnPrioritizeCaseActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnPrioritizeCaseActionPerformed + if (pendingTableModel.getRowCount() > 0 && pendingTable.getSelectedRow() >= 0) { + this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + String caseName = (pendingTableModel.getValueAt(pendingTable.getSelectedRow(), JobsTableModelColumns.CASE.ordinal())).toString(); + manager.prioritizeCase(caseName); + refreshTables(); + pendingTable.clearSelection(); + enablePendingTableButtons(false); + AutoIngestControlPanel.this.setCursor(Cursor.getDefaultCursor()); + } + }//GEN-LAST:event_bnPrioritizeCaseActionPerformed + + /** + * Handles a click on the show log button. Displays the auto ingest job log + * for a case in NotePad. + * + * @param evt The button click event. + */ + private void bnShowCaseLogActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnShowCaseLogActionPerformed + try { + int selectedRow = completedTable.getSelectedRow(); + if (selectedRow != -1) { + Path caseDirectoryPath = (Path) completedTableModel.getValueAt(selectedRow, JobsTableModelColumns.CASE_DIRECTORY_PATH.ordinal()); + if (null != caseDirectoryPath) { + Path pathToLog = AutoIngestJobLogger.getLogPath(caseDirectoryPath); + if (pathToLog.toFile().exists()) { + Desktop.getDesktop().edit(pathToLog.toFile()); + } else { + JOptionPane.showMessageDialog(this, org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.ShowLogFailed.Message"), + org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.ShowLogFailed.Title"), JOptionPane.ERROR_MESSAGE); + } + } else { + MessageNotifyUtil.Message.warn("The case directory for this job has been deleted."); + } + } + } catch (IOException ex) { + SYS_LOGGER.log(Level.SEVERE, "Dashboard error attempting to display case auto ingest log", ex); + Object[] options = {org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "DisplayLogDialog.okay")}; + JOptionPane.showOptionDialog(this, + org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "DisplayLogDialog.cannotFindLog"), + org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "DisplayLogDialog.unableToShowLogFile"), + JOptionPane.DEFAULT_OPTION, + JOptionPane.PLAIN_MESSAGE, + null, + options, + options[0]); + } + }//GEN-LAST:event_bnShowCaseLogActionPerformed + + private void bnPrioritizeJobActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnPrioritizeJobActionPerformed + if (pendingTableModel.getRowCount() > 0 && pendingTable.getSelectedRow() >= 0) { + this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + Path manifestFilePath = (Path) (pendingTableModel.getValueAt(pendingTable.getSelectedRow(), JobsTableModelColumns.MANIFEST_FILE_PATH.ordinal())); + manager.prioritizeJob(manifestFilePath); + refreshTables(); + pendingTable.clearSelection(); + enablePendingTableButtons(false); + AutoIngestControlPanel.this.setCursor(Cursor.getDefaultCursor()); + } + }//GEN-LAST:event_bnPrioritizeJobActionPerformed + + private void bnOpenLogDirActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnOpenLogDirActionPerformed + Path logDirPath = Paths.get(PlatformUtil.getUserDirectory().getAbsolutePath(), "var", "log"); + File logDir = logDirPath.toFile(); + try { + Desktop.getDesktop().open(logDir); + } catch (IOException ex) { + DialogDisplayer.getDefault().notify(new NotifyDescriptor.Message( + String.format("Unable to open log directory %s:\n%s", logDirPath, ex.getLocalizedMessage()), + NotifyDescriptor.ERROR_MESSAGE)); + } + }//GEN-LAST:event_bnOpenLogDirActionPerformed + + private void bnReprocessJobActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnReprocessJobActionPerformed + if (completedTableModel.getRowCount() < 0 || completedTable.getSelectedRow() < 0) { + return; + } + this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + Path manifestPath = (Path) completedTableModel.getValueAt(completedTable.getSelectedRow(), JobsTableModelColumns.MANIFEST_FILE_PATH.ordinal()); + manager.reprocessJob(manifestPath); + refreshTables(); + AutoIngestControlPanel.this.setCursor(Cursor.getDefaultCursor()); + }//GEN-LAST:event_bnReprocessJobActionPerformed + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JButton bnCancelJob; + private javax.swing.JButton bnCancelModule; + private javax.swing.JButton bnDeleteCase; + private javax.swing.JButton bnExit; + private javax.swing.JButton bnOpenLogDir; + private javax.swing.JButton bnOptions; + private javax.swing.JButton bnPause; + private javax.swing.JButton bnPrioritizeCase; + private javax.swing.JButton bnPrioritizeJob; + private javax.swing.JButton bnRefresh; + private javax.swing.JButton bnReprocessJob; + private javax.swing.JButton bnShowCaseLog; + private javax.swing.JButton bnShowProgress; + private javax.swing.JScrollPane completedScrollPane; + private javax.swing.JTable completedTable; + private javax.swing.JLabel lbCompleted; + private javax.swing.JLabel lbPending; + private javax.swing.JLabel lbRunning; + private javax.swing.JLabel lbServicesStatus; + private javax.swing.JLabel lbStatus; + private javax.swing.JScrollPane pendingScrollPane; + private javax.swing.JTable pendingTable; + private javax.swing.JScrollPane runningScrollPane; + private javax.swing.JTable runningTable; + private javax.swing.JTextField tbServicesStatusMessage; + private javax.swing.JTextField tbStatusMessage; + // End of variables declaration//GEN-END:variables + +} \ No newline at end of file diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.form b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.form index b1d90f4479..ab16ecc6c0 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.form +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.form @@ -235,9 +235,6 @@ - - - @@ -248,9 +245,6 @@ - - - @@ -291,9 +285,6 @@ - - - @@ -304,9 +295,6 @@ - - - @@ -317,9 +305,6 @@ - - - @@ -331,9 +316,6 @@ - - - @@ -344,9 +326,6 @@ - - - @@ -357,9 +336,6 @@ - - - @@ -370,9 +346,6 @@ - - - @@ -383,9 +356,6 @@ - - - @@ -423,9 +393,6 @@ - - - @@ -457,9 +424,6 @@ - - - @@ -467,9 +431,6 @@ - - - diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java index 157d371eed..653aedf252 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java @@ -1,7 +1,7 @@ /* * Autopsy Forensic Browser * - * Copyright 2015 Basis Technology Corp. + * Copyright 2015-2017 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -20,9 +20,7 @@ package org.sleuthkit.autopsy.experimental.autoingest; import com.google.common.util.concurrent.ThreadFactoryBuilder; import java.awt.Cursor; -import java.awt.Desktop; import java.awt.EventQueue; -import java.io.IOException; import java.nio.file.Path; import java.nio.file.Paths; import java.time.Instant; @@ -38,7 +36,6 @@ import java.util.logging.Level; import javax.swing.DefaultListSelectionModel; import java.awt.Color; import java.beans.PropertyChangeEvent; -import java.io.File; import java.util.Collections; import java.util.logging.Logger; import javax.swing.JOptionPane; @@ -49,25 +46,12 @@ import javax.swing.UIManager; import javax.swing.event.ListSelectionEvent; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableColumn; -import org.netbeans.api.options.OptionsDisplayer; -import org.openide.DialogDisplayer; import org.openide.LifecycleManager; -import org.openide.NotifyDescriptor; -import org.openide.filesystems.FileObject; -import org.openide.filesystems.FileUtil; import org.openide.util.NbBundle; -import org.openide.util.actions.CallableSystemAction; import org.openide.windows.WindowManager; -import org.sleuthkit.autopsy.casemodule.CaseNewAction; -import org.sleuthkit.autopsy.casemodule.CaseOpenAction; import org.sleuthkit.autopsy.core.ServicesMonitor; -import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil; import org.sleuthkit.autopsy.coreutils.NetworkUtils; -import org.sleuthkit.autopsy.coreutils.PlatformUtil; import org.sleuthkit.autopsy.ingest.IngestManager; -import org.sleuthkit.autopsy.ingest.IngestProgressSnapshotDialog; -import org.sleuthkit.autopsy.experimental.autoingest.AutoIngestManager.CaseDeletionResult; -import org.sleuthkit.autopsy.experimental.autoingest.AutoIngestManager.JobsSnapshot; /** * A panel for monitoring automated ingest by a cluster, and for controlling @@ -105,7 +89,6 @@ public final class AutoIngestDashboard extends JPanel implements Observer { private final DefaultTableModel pendingTableModel; private final DefaultTableModel runningTableModel; private final DefaultTableModel completedTableModel; - private AutoIngestManager manager; private ExecutorService updateExecutor; private boolean isPaused; private boolean autoIngestStarted; @@ -182,11 +165,6 @@ public final class AutoIngestDashboard extends JPanel implements Observer { * controlling automated ingest for a single node within the cluster. */ private AutoIngestDashboard() { - //Disable the main window so they can only use the dashboard (if we used setVisible the taskBar icon would go away) - WindowManager.getDefault().getMainWindow().setEnabled(false); - - manager = AutoIngestManager.getInstance(); - pendingTableModel = new DefaultTableModel(JobsTableModelColumns.headers, 0) { private static final long serialVersionUID = 1L; @@ -590,28 +568,7 @@ public final class AutoIngestDashboard extends JPanel implements Observer { */ private void startUp() { - /* - * Starts up the auto ingest manager (AIM). - */ - try { - manager.startUp(); - autoIngestStarted = true; - } catch (AutoIngestManager.AutoIngestManagerStartupException ex) { - SYS_LOGGER.log(Level.SEVERE, "Dashboard error starting up auto ingest", ex); - tbStatusMessage.setText(NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.AutoIngestStartupError")); - manager = null; - - JOptionPane.showMessageDialog(this, - NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.AutoIngestStartupFailed.Message"), - NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.AutoIngestStartupFailed.Title"), - JOptionPane.ERROR_MESSAGE); - bnOptions.setEnabled(true); - - /* - * If the AIM cannot be started, there is nothing more to do. - */ - return; - } + autoIngestStarted = true; /* * Subscribe to services monitor events. @@ -620,17 +577,11 @@ public final class AutoIngestDashboard extends JPanel implements Observer { setServicesStatusMessage(); }); - /* - * Register with the AIM as an observer. - */ - manager.addObserver(this); - /* * Populate the pending, running, and completed auto ingest job tables. */ updateExecutor = Executors.newSingleThreadExecutor(new ThreadFactoryBuilder().setNameFormat(UPDATE_TASKS_THREAD_NAME).build()); updateExecutor.submit(new UpdateAllJobsTablesTask()); - manager.scanInputDirsNow(); //bnPause.setEnabled(true); bnPause.setText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnPause.text")); @@ -659,7 +610,7 @@ public final class AutoIngestDashboard extends JPanel implements Observer { NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.Cancel")}; int reply = JOptionPane.OK_OPTION; - if (null != manager && IngestManager.getInstance().isIngestRunning()) { + if (IngestManager.getInstance().isIngestRunning()) { reply = JOptionPane.showOptionDialog(this, NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.ExitConsequences"), NbBundle.getMessage(AutoIngestDashboard.class, "ConfirmationDialog.ConfirmExitHeader"), @@ -684,13 +635,6 @@ public final class AutoIngestDashboard extends JPanel implements Observer { updateExecutor.shutdownNow(); } - /* - * Stop observing the auto ingest manager (AIM). - */ - if (null != manager) { - manager.deleteObserver(this); - } - /* * Shut down the AIM and close. */ @@ -698,9 +642,6 @@ public final class AutoIngestDashboard extends JPanel implements Observer { @Override protected Void doInBackground() throws Exception { - if (null != manager) { - manager.shutDown(); - } return null; } @@ -807,7 +748,6 @@ public final class AutoIngestDashboard extends JPanel implements Observer { * Ask the auto ingest manager to pause when it completes the * currently running job, if any. */ - manager.pause(); bnRefresh.setEnabled(false); } } @@ -835,11 +775,6 @@ public final class AutoIngestDashboard extends JPanel implements Observer { */ pendingTable.setBackground(pendingTableBackground); pendingTable.setForeground(pendingTablelForeground); - - /** - * Ask the auto ingest manager to resume processing. - */ - manager.resume(); } /** @@ -855,7 +790,6 @@ public final class AutoIngestDashboard extends JPanel implements Observer { @Override public void run() { List pendingJobs = new ArrayList<>(); - manager.getJobs(pendingJobs, null, null); EventQueue.invokeLater(new RefreshComponentsTask(pendingJobs, null, null)); } } @@ -873,7 +807,6 @@ public final class AutoIngestDashboard extends JPanel implements Observer { @Override public void run() { List runningJobs = new ArrayList<>(); - manager.getJobs(null, runningJobs, null); EventQueue.invokeLater(new RefreshComponentsTask(null, runningJobs, null)); } } @@ -897,7 +830,6 @@ public final class AutoIngestDashboard extends JPanel implements Observer { List pendingJobs = new ArrayList<>(); List runningJobs = new ArrayList<>(); List completedJobs = new ArrayList<>(); - manager.getJobs(pendingJobs, runningJobs, completedJobs); // Sort the completed jobs list by completed date Collections.sort(completedJobs, new AutoIngestJob.ReverseDateCompletedComparator()); EventQueue.invokeLater(new RefreshComponentsTask(pendingJobs, runningJobs, completedJobs)); @@ -1084,10 +1016,6 @@ public final class AutoIngestDashboard extends JPanel implements Observer { * Get the current lists of jobs and update the UI. */ private void refreshTables(){ - JobsSnapshot jobsSnapshot = manager.getCurrentJobsSnapshot(); - refreshTable(jobsSnapshot.getCompletedJobs(), completedTableModel, null); - refreshTable(jobsSnapshot.getPendingJobs(), pendingTableModel, null); - refreshTable(jobsSnapshot.getRunningJobs(), runningTableModel, null); } /** @@ -1182,19 +1110,9 @@ public final class AutoIngestDashboard extends JPanel implements Observer { org.openide.awt.Mnemonics.setLocalizedText(bnCancelJob, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnCancelJob.text")); // NOI18N bnCancelJob.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnCancelJob.toolTipText")); // NOI18N - bnCancelJob.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - bnCancelJobActionPerformed(evt); - } - }); org.openide.awt.Mnemonics.setLocalizedText(bnDeleteCase, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnDeleteCase.text")); // NOI18N bnDeleteCase.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnDeleteCase.toolTipText")); // NOI18N - bnDeleteCase.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - bnDeleteCaseActionPerformed(evt); - } - }); lbPending.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N org.openide.awt.Mnemonics.setLocalizedText(lbPending, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.lbPending.text")); // NOI18N @@ -1207,68 +1125,28 @@ public final class AutoIngestDashboard extends JPanel implements Observer { org.openide.awt.Mnemonics.setLocalizedText(bnRefresh, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnRefresh.text")); // NOI18N bnRefresh.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnRefresh.toolTipText")); // NOI18N - bnRefresh.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - bnRefreshActionPerformed(evt); - } - }); org.openide.awt.Mnemonics.setLocalizedText(bnCancelModule, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnCancelModule.text")); // NOI18N bnCancelModule.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnCancelModule.toolTipText")); // NOI18N - bnCancelModule.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - bnCancelModuleActionPerformed(evt); - } - }); org.openide.awt.Mnemonics.setLocalizedText(bnExit, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnExit.text")); // NOI18N bnExit.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnExit.toolTipText")); // NOI18N - bnExit.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - bnExitActionPerformed(evt); - } - }); org.openide.awt.Mnemonics.setLocalizedText(bnOptions, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnOptions.text")); // NOI18N bnOptions.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnOptions.toolTipText")); // NOI18N bnOptions.setEnabled(false); - bnOptions.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - bnOptionsActionPerformed(evt); - } - }); org.openide.awt.Mnemonics.setLocalizedText(bnShowProgress, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnShowProgress.text")); // NOI18N bnShowProgress.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnShowProgress.toolTipText")); // NOI18N - bnShowProgress.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - bnShowProgressActionPerformed(evt); - } - }); org.openide.awt.Mnemonics.setLocalizedText(bnPause, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnPause.text")); // NOI18N bnPause.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnPause.toolTipText")); // NOI18N - bnPause.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - bnPauseActionPerformed(evt); - } - }); org.openide.awt.Mnemonics.setLocalizedText(bnPrioritizeCase, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnPrioritizeCase.text")); // NOI18N bnPrioritizeCase.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnPrioritizeCase.toolTipText")); // NOI18N - bnPrioritizeCase.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - bnPrioritizeCaseActionPerformed(evt); - } - }); org.openide.awt.Mnemonics.setLocalizedText(bnShowCaseLog, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnShowCaseLog.text")); // NOI18N bnShowCaseLog.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnShowCaseLog.toolTipText")); // NOI18N - bnShowCaseLog.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - bnShowCaseLogActionPerformed(evt); - } - }); tbStatusMessage.setEditable(false); tbStatusMessage.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N @@ -1281,11 +1159,6 @@ public final class AutoIngestDashboard extends JPanel implements Observer { org.openide.awt.Mnemonics.setLocalizedText(bnPrioritizeJob, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnPrioritizeJob.text")); // NOI18N bnPrioritizeJob.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnPrioritizeJob.toolTipText")); // NOI18N bnPrioritizeJob.setActionCommand(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnPrioritizeJob.actionCommand")); // NOI18N - bnPrioritizeJob.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - bnPrioritizeJobActionPerformed(evt); - } - }); lbServicesStatus.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N org.openide.awt.Mnemonics.setLocalizedText(lbServicesStatus, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.lbServicesStatus.text")); // NOI18N @@ -1296,18 +1169,8 @@ public final class AutoIngestDashboard extends JPanel implements Observer { tbServicesStatusMessage.setBorder(null); org.openide.awt.Mnemonics.setLocalizedText(bnOpenLogDir, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnOpenLogDir.text")); // NOI18N - bnOpenLogDir.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - bnOpenLogDirActionPerformed(evt); - } - }); org.openide.awt.Mnemonics.setLocalizedText(bnReprocessJob, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnReprocessJob.text")); // NOI18N - bnReprocessJob.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - bnReprocessJobActionPerformed(evt); - } - }); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); @@ -1427,278 +1290,6 @@ public final class AutoIngestDashboard extends JPanel implements Observer { }// //GEN-END:initComponents - /** - * Handles a click on the refresh button. Requests an immediate scan of the - * input folders for new jobs and queues a refresh of all three of the jobs - * tables. - * - * @param evt - The button click event. - */ - private void bnRefreshActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnRefreshActionPerformed - this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); - manager.scanInputDirsAndWait(); - refreshTables(); - this.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); - }//GEN-LAST:event_bnRefreshActionPerformed - - /** - * Handles a click on the delete case button. If an entry is selected that - * can be deleted, pops up a confirmation dialog. Upon confirmation, asks - * AutoIngestManager to delete the entry and asks for an updated view. - * - * @param evt The button click event. - */ - private void bnDeleteCaseActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnDeleteCaseActionPerformed - if (completedTableModel.getRowCount() < 0 || completedTable.getSelectedRow() < 0) { - return; - } - - String caseName = (String) completedTable.getValueAt(completedTable.getSelectedRow(), JobsTableModelColumns.CASE.ordinal()); - Object[] options = { - org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "ConfirmationDialog.Delete"), - org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "ConfirmationDialog.DoNotDelete") - }; - Object[] msgContent = {org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "ConfirmationDialog.DeleteAreYouSure") + "\"" + caseName + "\"?"}; - int reply = JOptionPane.showOptionDialog(this, - msgContent, - org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "ConfirmationDialog.ConfirmDeletionHeader"), - JOptionPane.DEFAULT_OPTION, - JOptionPane.WARNING_MESSAGE, - null, - options, - options[JOptionPane.NO_OPTION]); - if (reply == JOptionPane.YES_OPTION) { - bnDeleteCase.setEnabled(false); - bnShowCaseLog.setEnabled(false); - if (completedTableModel.getRowCount() > 0 && completedTable.getSelectedRow() >= 0) { - Path caseDirectoryPath = (Path) completedTableModel.getValueAt(completedTable.getSelectedRow(), JobsTableModelColumns.CASE_DIRECTORY_PATH.ordinal()); - completedTable.clearSelection(); - this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); - CaseDeletionResult result = manager.deleteCase(caseName, caseDirectoryPath); - refreshTables(); - this.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); - if (CaseDeletionResult.FAILED == result) { - JOptionPane.showMessageDialog(this, - String.format("Could not delete case %s. It may be in in use.", caseName), - org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.DeletionFailed"), - JOptionPane.INFORMATION_MESSAGE); - } else if (CaseDeletionResult.PARTIALLY_DELETED == result) { - JOptionPane.showMessageDialog(this, - String.format("Could not delete case %s. See system log for details.", caseName), - org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.DeletionFailed"), - JOptionPane.INFORMATION_MESSAGE); - } - } - } - }//GEN-LAST:event_bnDeleteCaseActionPerformed - - /** - * Handles a click on the cancel auto ingest job button. Cancels the - * selected job. - * - * @param evt The button click event. - */ - private void bnCancelJobActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnCancelJobActionPerformed - Object[] options = { - org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "ConfirmationDialog.CancelJob"), - org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "ConfirmationDialog.DoNotCancelJob")}; - int reply = JOptionPane.showOptionDialog(this, - NbBundle.getMessage(AutoIngestDashboard.class, "ConfirmationDialog.CancelJobAreYouSure"), - NbBundle.getMessage(AutoIngestDashboard.class, "ConfirmationDialog.ConfirmCancellationHeader"), - JOptionPane.DEFAULT_OPTION, - JOptionPane.WARNING_MESSAGE, - null, - options, - options[1]); - if (reply == 0) { - /* - * Call setCursor on this to ensure it appears (if there is time to - * see it). - */ - this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); - manager.cancelCurrentJob(); - refreshTables(); - this.setCursor(Cursor.getDefaultCursor()); - } - }//GEN-LAST:event_bnCancelJobActionPerformed - - /** - * Handles a click on the show auto ingest job progress button. Displays an - * ingest job progress panel. - * - * @param evt The button click event. - */ - private void bnShowProgressActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnShowProgressActionPerformed - IngestProgressSnapshotDialog dialog = new IngestProgressSnapshotDialog(this.getTopLevelAncestor(), true); - }//GEN-LAST:event_bnShowProgressActionPerformed - - /** - * Handles a click on the pause/resume auto ingest job button. Sends a - * pause/resume request to the auto ingest manager. - * - * @param evt The button click event. - */ - private void bnPauseActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnPauseActionPerformed - - if (!autoIngestStarted) { - //put up a wait cursor during the start up operation - this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); - - startUp(); - - this.setCursor(null); - //done for startup - return; - } - if (!isPaused) { - tbStatusMessage.setText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnPause.pausing")); - pause(true); - } else { - resume(); - } - isPaused = !isPaused; - }//GEN-LAST:event_bnPauseActionPerformed - - /** - * Handles a click on the options button. Displays the options window. - * - * @param evt The button click event. - */ - private void bnOptionsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnOptionsActionPerformed - setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); - OptionsDisplayer.getDefault().open(); - setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); - }//GEN-LAST:event_bnOptionsActionPerformed - - /** - * Handles a click on the cancel ingest module button. Cancels the currently - * running data source level ingest module for the selected job. - * - * @param evt The button click event. - */ - private void bnCancelModuleActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnCancelModuleActionPerformed - Object[] options = { - org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "ConfirmationDialog.CancelModule"), - org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "ConfirmationDialog.DoNotCancelModule")}; - int reply = JOptionPane.showOptionDialog(this, - NbBundle.getMessage(AutoIngestDashboard.class, "ConfirmationDialog.CancelModuleAreYouSure"), - NbBundle.getMessage(AutoIngestDashboard.class, "ConfirmationDialog.ConfirmCancellationHeader"), - JOptionPane.DEFAULT_OPTION, - JOptionPane.WARNING_MESSAGE, - null, - options, - options[1]); - if (reply == 0) { - /* - * Call setCursor on this to ensure it appears (if there is time to - * see it). - */ - this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); - manager.cancelCurrentDataSourceLevelIngestModule(); - refreshTables(); - this.setCursor(Cursor.getDefaultCursor()); - } - }//GEN-LAST:event_bnCancelModuleActionPerformed - - /** - * Handles a click on the exit button. Shuts down auto ingest. - * - * @param evt The button click event. - */ - private void bnExitActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnExitActionPerformed - shutdown(); - }//GEN-LAST:event_bnExitActionPerformed - - /** - * Handle a click on the prioritize case button. Requests prioritization of - * all of the auto ingest jobs for a case. - * - * @param evt The button click event. - */ - private void bnPrioritizeCaseActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnPrioritizeCaseActionPerformed - if (pendingTableModel.getRowCount() > 0 && pendingTable.getSelectedRow() >= 0) { - this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); - String caseName = (pendingTableModel.getValueAt(pendingTable.getSelectedRow(), JobsTableModelColumns.CASE.ordinal())).toString(); - manager.prioritizeCase(caseName); - refreshTables(); - pendingTable.clearSelection(); - enablePendingTableButtons(false); - AutoIngestDashboard.this.setCursor(Cursor.getDefaultCursor()); - } - }//GEN-LAST:event_bnPrioritizeCaseActionPerformed - - /** - * Handles a click on the show log button. Displays the auto ingest job log - * for a case in NotePad. - * - * @param evt The button click event. - */ - private void bnShowCaseLogActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnShowCaseLogActionPerformed - try { - int selectedRow = completedTable.getSelectedRow(); - if (selectedRow != -1) { - Path caseDirectoryPath = (Path) completedTableModel.getValueAt(selectedRow, JobsTableModelColumns.CASE_DIRECTORY_PATH.ordinal()); - if (null != caseDirectoryPath) { - Path pathToLog = AutoIngestJobLogger.getLogPath(caseDirectoryPath); - if (pathToLog.toFile().exists()) { - Desktop.getDesktop().edit(pathToLog.toFile()); - } else { - JOptionPane.showMessageDialog(this, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.ShowLogFailed.Message"), - org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.ShowLogFailed.Title"), JOptionPane.ERROR_MESSAGE); - } - } else { - MessageNotifyUtil.Message.warn("The case directory for this job has been deleted."); - } - } - } catch (IOException ex) { - SYS_LOGGER.log(Level.SEVERE, "Dashboard error attempting to display case auto ingest log", ex); - Object[] options = {org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "DisplayLogDialog.okay")}; - JOptionPane.showOptionDialog(this, - org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "DisplayLogDialog.cannotFindLog"), - org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "DisplayLogDialog.unableToShowLogFile"), - JOptionPane.DEFAULT_OPTION, - JOptionPane.PLAIN_MESSAGE, - null, - options, - options[0]); - } - }//GEN-LAST:event_bnShowCaseLogActionPerformed - - private void bnPrioritizeJobActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnPrioritizeJobActionPerformed - if (pendingTableModel.getRowCount() > 0 && pendingTable.getSelectedRow() >= 0) { - this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); - Path manifestFilePath = (Path) (pendingTableModel.getValueAt(pendingTable.getSelectedRow(), JobsTableModelColumns.MANIFEST_FILE_PATH.ordinal())); - manager.prioritizeJob(manifestFilePath); - refreshTables(); - pendingTable.clearSelection(); - enablePendingTableButtons(false); - AutoIngestDashboard.this.setCursor(Cursor.getDefaultCursor()); - } - }//GEN-LAST:event_bnPrioritizeJobActionPerformed - - private void bnOpenLogDirActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnOpenLogDirActionPerformed - Path logDirPath = Paths.get(PlatformUtil.getUserDirectory().getAbsolutePath(), "var", "log"); - File logDir = logDirPath.toFile(); - try { - Desktop.getDesktop().open(logDir); - } catch (IOException ex) { - DialogDisplayer.getDefault().notify(new NotifyDescriptor.Message( - String.format("Unable to open log directory %s:\n%s", logDirPath, ex.getLocalizedMessage()), - NotifyDescriptor.ERROR_MESSAGE)); - } - }//GEN-LAST:event_bnOpenLogDirActionPerformed - - private void bnReprocessJobActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnReprocessJobActionPerformed - if (completedTableModel.getRowCount() < 0 || completedTable.getSelectedRow() < 0) { - return; - } - this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); - Path manifestPath = (Path) completedTableModel.getValueAt(completedTable.getSelectedRow(), JobsTableModelColumns.MANIFEST_FILE_PATH.ordinal()); - manager.reprocessJob(manifestPath); - refreshTables(); - AutoIngestDashboard.this.setCursor(Cursor.getDefaultCursor()); - }//GEN-LAST:event_bnReprocessJobActionPerformed - // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton bnCancelJob; private javax.swing.JButton bnCancelModule; @@ -1728,4 +1319,4 @@ public final class AutoIngestDashboard extends JPanel implements Observer { private javax.swing.JTextField tbStatusMessage; // End of variables declaration//GEN-END:variables -} +} \ No newline at end of file diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardOpenAction.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardOpenAction.java new file mode 100755 index 0000000000..0420b5d209 --- /dev/null +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardOpenAction.java @@ -0,0 +1,111 @@ +/* +* Autopsy Forensic Browser +* +* Copyright 2017 Basis Technology Corp. +* Contact: carrier sleuthkit org +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +package org.sleuthkit.autopsy.experimental.autoingest; + +import java.awt.Component; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import javax.swing.ImageIcon; +import javax.swing.JButton; +import org.openide.awt.ActionID; +import org.openide.awt.ActionReference; +import org.openide.awt.ActionRegistration; +import org.openide.util.HelpCtx; +import org.openide.util.NbBundle.Messages; +import org.openide.util.actions.CallableSystemAction; +import org.openide.util.actions.Presenter; +import org.sleuthkit.autopsy.casemodule.Case; +import org.sleuthkit.autopsy.core.RuntimeProperties; +import org.sleuthkit.autopsy.core.UserPreferences; +import static org.sleuthkit.autopsy.core.UserPreferences.SelectedMode.REVIEW; +import org.sleuthkit.autopsy.coreutils.Logger; + +@ActionID(category = "Tools", id = "org.sleuthkit.autopsy.experimental.autoingest.AutoIngestDashboardOpenAction") +@ActionReference(path = "Menu/Tools", position = 104) +@ActionRegistration(displayName = "#CTL_AutoIngestDashboardOpenAction", lazy = false) +@Messages({"CTL_AutoIngestDashboardOpenAction=Auto Ingest Dashboard"}) +public final class AutoIngestDashboardOpenAction extends CallableSystemAction implements Presenter.Toolbar { + + private static final Logger LOGGER = Logger.getLogger(AutoIngestDashboardOpenAction.class.getName()); + private static final String VIEW_IMAGES_VIDEOS = Bundle.CTL_AutoIngestDashboardOpenAction(); + + private final JButton toolbarButton = new JButton(); + private final PropertyChangeListener pcl; + + public AutoIngestDashboardOpenAction() { + super(); + toolbarButton.addActionListener(actionEvent -> performAction()); + pcl = (PropertyChangeEvent evt) -> { + if (evt.getPropertyName().equals(Case.Events.CURRENT_CASE.toString())) { + setEnabled(RuntimeProperties.runningWithGUI() && evt.getNewValue() != null); + } + }; + Case.addPropertyChangeListener(pcl); + this.setEnabled(false); + } + + @Override + public boolean isEnabled() { + UserPreferences.SelectedMode mode = UserPreferences.getMode(); + return (mode == REVIEW); + } + + /** Returns the toolbar component of this action + * + * @return component the toolbar button */ + @Override + public Component getToolbarPresenter() { + ImageIcon icon = new ImageIcon(getClass().getResource("btn_icon_image_gallery_26.png")); //NON-NLS + toolbarButton.setIcon(icon); + toolbarButton.setText(this.getName()); + return toolbarButton; + } + + /** + * Set this action to be enabled/disabled + * + * @param value whether to enable this action or not + */ + @Override + public void setEnabled(boolean value) { + super.setEnabled(value); + toolbarButton.setEnabled(value); + } + + @Override + @SuppressWarnings("fallthrough") + public void performAction() { + AutoIngestDashboardTopComponent.openTopComponent(); + } + + @Override + public String getName() { + return VIEW_IMAGES_VIDEOS; + } + + @Override + public HelpCtx getHelpCtx() { + return HelpCtx.DEFAULT_HELP; + } + + @Override + public boolean asynchronous() { + return false; // run on edt + } +} \ No newline at end of file diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardTopComponent.form b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardTopComponent.form new file mode 100755 index 0000000000..63887aceb0 --- /dev/null +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardTopComponent.form @@ -0,0 +1,28 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
\ No newline at end of file diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardTopComponent.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardTopComponent.java new file mode 100755 index 0000000000..cfb2e7e18f --- /dev/null +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardTopComponent.java @@ -0,0 +1,135 @@ +/* + * Autopsy Forensic Browser + * + * Copyright 2017 Basis Technology Corp. + * Contact: carrier sleuthkit org + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.sleuthkit.autopsy.experimental.autoingest; + +import java.util.logging.Level; +import org.netbeans.api.settings.ConvertAsProperties; +import org.openide.awt.ActionID; +import org.openide.awt.ActionReference; +import org.openide.windows.TopComponent; +import org.openide.util.NbBundle.Messages; +import org.openide.windows.Mode; +import org.openide.windows.WindowManager; +import org.sleuthkit.autopsy.coreutils.Logger; + +/** + * Top component which displays the Auto Ingest Dashboard interface. + */ +@ConvertAsProperties( + dtd = "-//org.sleuthkit.autopsy.experimental.autoingest//AutoIngestDashboard//EN", + autostore = false +) +@TopComponent.Description( + preferredID = "AutoIngestDashboardTopComponent", + //iconBase="SET/PATH/TO/ICON/HERE", + persistenceType = TopComponent.PERSISTENCE_NEVER +) +@TopComponent.Registration(mode = "dashboard", openAtStartup = false) +@Messages({ + "CTL_AutoIngestDashboardAction=Auto Ingest Dashboard", + "CTL_AutoIngestDashboardTopComponent=Auto Ingest Dashboard", + "HINT_AutoIngestDashboardTopComponent=This is an Auto Ingest Dashboard window" +}) +public final class AutoIngestDashboardTopComponent extends TopComponent { + public final static String PREFERRED_ID = "AutoIngestDashboardTopComponent"; // NON-NLS + private static final Logger LOGGER = Logger.getLogger(AutoIngestDashboardTopComponent.class.getName()); + private static boolean topComponentInitialized = false; + + public static void openTopComponent() { + final AutoIngestDashboardTopComponent tc = (AutoIngestDashboardTopComponent) WindowManager.getDefault().findTopComponent(PREFERRED_ID); + if (tc != null) { + topComponentInitialized = true; + WindowManager.getDefault().isTopComponentFloating(tc); + Mode mode = WindowManager.getDefault().findMode("dashboard"); // NON-NLS + if (mode != null) { + mode.dockInto(tc); + } + + AutoIngestDashboard dashboard = AutoIngestDashboard.getInstance(); + tc.add(dashboard); + dashboard.setSize(dashboard.getPreferredSize()); + + tc.open(); + tc.requestActive(); + } + } + + public static void closeTopComponent() { + if (topComponentInitialized) { + final TopComponent etc = WindowManager.getDefault().findTopComponent(PREFERRED_ID); + if (etc != null) { + try { + etc.close(); + } catch (Exception e) { + LOGGER.log(Level.SEVERE, "failed to close " + PREFERRED_ID, e); // NON-NLS + } + } + } + } + + public AutoIngestDashboardTopComponent() { + initComponents(); + setName(Bundle.CTL_AutoIngestDashboardTopComponent()); + setToolTipText(Bundle.HINT_AutoIngestDashboardTopComponent()); + } + + /** + * This method is called from within the constructor to initialize the form. + * WARNING: Do NOT modify this code. The content of this method is always + * regenerated by the Form Editor. + */ + // //GEN-BEGIN:initComponents + private void initComponents() { + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); + this.setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGap(0, 400, Short.MAX_VALUE) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGap(0, 300, Short.MAX_VALUE) + ); + }// //GEN-END:initComponents + + // Variables declaration - do not modify//GEN-BEGIN:variables + // End of variables declaration//GEN-END:variables + @Override + public void componentOpened() { + // TODO add custom code on component opening + } + + @Override + public void componentClosed() { + // TODO add custom code on component closing + } + + void writeProperties(java.util.Properties p) { + // better to version settings since initial version as advocated at + // http://wiki.apidesign.org/wiki/PropertyFiles + p.setProperty("version", "1.0"); + // TODO store your settings + } + + void readProperties(java.util.Properties p) { + String version = p.getProperty("version"); + // TODO read your settings according to their version + } +} \ No newline at end of file diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties index a659557b17..afe8a6354f 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties @@ -298,3 +298,38 @@ AutoIngestCasePanel.bnOpen.text=&Open AutoIngestCasePanel.bnShowLog.toolTipText=Display case log file for selected case AutoIngestCasePanel.bnShowLog.text=&Show Log AutoIngestCasePanel.rbGroupLabel.text=Show cases accessed in the last 10: +AutoIngestControlPanel.tbStatusMessage.text= +AutoIngestControlPanel.bnShowCaseLog.toolTipText=Display case log file for selected case +AutoIngestControlPanel.bnShowCaseLog.text=Show Case &Log +AutoIngestControlPanel.bnDeleteCase.toolTipText=Delete the selected Case in its entirety +AutoIngestControlPanel.bnDeleteCase.text=&Delete Case +AutoIngestControlPanel.bnCancelJob.toolTipText=Cancel processing of the current Job and move on to the next Job. This functionality is only available for jobs running on current AIM node. +AutoIngestControlPanel.bnCancelJob.text=&Cancel Job +AutoIngestControlPanel.completedTable.toolTipText=The Completed table shows all Jobs that have been processed already +AutoIngestControlPanel.runningTable.toolTipText=The Running table displays the currently running Job and information about it +AutoIngestControlPanel.pendingTable.toolTipText=The Pending table displays the order upcoming Jobs will be processed with the top of the list first +AutoIngestControlPanel.bnPrioritizeCase.toolTipText=Move all images associated with a case to top of Pending queue. +AutoIngestControlPanel.bnPrioritizeCase.text=Prioriti&ze Case +AutoIngestControlPanel.bnPause.toolTipText=Suspend processing of Pending Jobs +AutoIngestControlPanel.bnPause.text=Pause +AutoIngestControlPanel.bnShowProgress.toolTipText=Show the progress of the currently running Job. This functionality is only available for jobs running on current AIM node. +AutoIngestControlPanel.bnShowProgress.text=Ingest Progress +AutoIngestControlPanel.bnOptions.toolTipText=Display options panel. All processing must be paused to open the options panel. +AutoIngestControlPanel.bnOptions.text=&Options +AutoIngestControlPanel.bnExit.toolTipText=Exit Application +AutoIngestControlPanel.bnExit.text=&Exit +AutoIngestControlPanel.bnCancelModule.toolTipText=Cancel processing of the current module within the Job and move on to the next module within the Job. This functionality is only available for jobs running on current AIM node. +AutoIngestControlPanel.bnCancelModule.text=Cancel &Module +AutoIngestControlPanel.bnRefresh.toolTipText=Refresh displayed tables +AutoIngestControlPanel.bnRefresh.text=&Refresh +AutoIngestControlPanel.lbCompleted.text=Completed Jobs +AutoIngestControlPanel.lbRunning.text=Running Jobs +AutoIngestControlPanel.lbPending.text=Pending Jobs +AutoIngestControlPanel.bnReprocessJob.text=Reprocess Job +AutoIngestControlPanel.bnOpenLogDir.text=Open System Logs Directory +AutoIngestControlPanel.tbServicesStatusMessage.text= +AutoIngestControlPanel.lbServicesStatus.text=Services Status: +AutoIngestControlPanel.bnPrioritizeJob.actionCommand= +AutoIngestControlPanel.bnPrioritizeJob.toolTipText=Move this folder to the top of the Pending queue. +AutoIngestControlPanel.bnPrioritizeJob.text=Prioritize Job +AutoIngestControlPanel.lbStatus.text=Status: diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/configuration/StartupWindow.java b/Experimental/src/org/sleuthkit/autopsy/experimental/configuration/StartupWindow.java index a88ccfd4f2..7666479ac5 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/configuration/StartupWindow.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/configuration/StartupWindow.java @@ -35,7 +35,7 @@ import org.sleuthkit.autopsy.casemodule.CueBannerPanel; import org.sleuthkit.autopsy.casemodule.StartupWindowInterface; import org.sleuthkit.autopsy.core.UserPreferences; import org.sleuthkit.autopsy.coreutils.NetworkUtils; -import org.sleuthkit.autopsy.experimental.autoingest.AutoIngestDashboard; +import org.sleuthkit.autopsy.experimental.autoingest.AutoIngestControlPanel; import org.sleuthkit.autopsy.experimental.autoingest.AutoIngestCasePanel; /** @@ -80,6 +80,7 @@ public final class StartupWindow extends JDialog implements StartupWindowInterfa public void open() { if (caseManagementPanel != null) { + caseManagementPanel.updateView(); caseManagementPanel.setCursor(Cursor.getDefaultCursor()); } @@ -112,11 +113,11 @@ public final class StartupWindow extends JDialog implements StartupWindowInterfa this.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { - AutoIngestDashboard.getInstance().shutdown(); + AutoIngestControlPanel.getInstance().shutdown(); } }); setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); - add(AutoIngestDashboard.getInstance()); + add(AutoIngestControlPanel.getInstance()); break; case REVIEW: this.setTitle(NbBundle.getMessage(StartupWindow.class, "StartupWindow.ReviewMode") + " (" + LOCAL_HOST_NAME + ")"); @@ -137,4 +138,4 @@ public final class StartupWindow extends JDialog implements StartupWindowInterfa break; } } -} +} \ No newline at end of file diff --git a/branding/core/core.jar/org/netbeans/core/startup/Bundle.properties b/branding/core/core.jar/org/netbeans/core/startup/Bundle.properties deleted file mode 100755 index 9fa4b48338..0000000000 --- a/branding/core/core.jar/org/netbeans/core/startup/Bundle.properties +++ /dev/null @@ -1,11 +0,0 @@ -#Updated by build script -#Thu, 22 Jun 2017 08:50:21 -0400 -LBL_splash_window_title=Starting Autopsy -SPLASH_HEIGHT=314 -SPLASH_WIDTH=538 -SplashProgressBarBounds=0,308,538,6 -SplashRunningTextBounds=0,289,538,18 -SplashRunningTextColor=0x0 -SplashRunningTextFontSize=19 - -currentVersion=Autopsy 4.4.1 diff --git a/branding/modules/org-netbeans-core-windows.jar/org/netbeans/core/windows/view/ui/Bundle.properties b/branding/modules/org-netbeans-core-windows.jar/org/netbeans/core/windows/view/ui/Bundle.properties deleted file mode 100755 index 9207917601..0000000000 --- a/branding/modules/org-netbeans-core-windows.jar/org/netbeans/core/windows/view/ui/Bundle.properties +++ /dev/null @@ -1,4 +0,0 @@ -#Updated by build script -#Thu, 22 Jun 2017 08:50:21 -0400 -CTL_MainWindow_Title=Autopsy 4.4.1 -CTL_MainWindow_Title_No_Project=Autopsy 4.4.1 From 3639dcca2a2437903d53c35c64b02dbf70eb7bda Mon Sep 17 00:00:00 2001 From: Eugene Livis Date: Fri, 18 Aug 2017 15:14:24 -0400 Subject: [PATCH 011/104] Added timeout to Solr queries --- .../src/org/sleuthkit/autopsy/keywordsearch/Server.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Server.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Server.java index 3a55aad646..a004a89e70 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Server.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Server.java @@ -1231,6 +1231,8 @@ public class Server { // the server to access a core needs to be built from a URL with the // core in it, and is only good for core-specific operations private final HttpSolrServer solrCore; + + private final int QUERY_TIMEOUT_MILLISECONDS = 86400000; // 24 Hours = 86,400,000 Milliseconds private Core(String name, CaseType caseType, Index index) { this.name = name; @@ -1240,7 +1242,8 @@ public class Server { this.solrCore = new HttpSolrServer(currentSolrServer.getBaseURL() + "/" + name); //NON-NLS //TODO test these settings - //solrCore.setSoTimeout(1000 * 60); // socket read timeout, make large enough so can index larger files + // socket read timeout, make large enough so can index larger files + solrCore.setSoTimeout(QUERY_TIMEOUT_MILLISECONDS); //solrCore.setConnectionTimeout(1000); solrCore.setDefaultMaxConnectionsPerHost(2); solrCore.setMaxTotalConnections(5); From 7d6dfaa7eac72fc43518aaff914a406f4d6567c1 Mon Sep 17 00:00:00 2001 From: millmanorama Date: Wed, 16 Aug 2017 11:52:08 -0400 Subject: [PATCH 012/104] remove KeywordCachedArtifact --- .../keywordsearch/KeywordCachedArtifact.java | 63 ------------------- .../keywordsearch/KeywordSearchQuery.java | 48 +++++++++----- .../autopsy/keywordsearch/LuceneQuery.java | 8 +-- .../autopsy/keywordsearch/QueryResults.java | 47 ++++++++------ .../autopsy/keywordsearch/RegexQuery.java | 23 +------ .../keywordsearch/TermsComponentQuery.java | 33 +++------- 6 files changed, 74 insertions(+), 148 deletions(-) delete mode 100644 KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordCachedArtifact.java diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordCachedArtifact.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordCachedArtifact.java deleted file mode 100644 index 68f85dd29a..0000000000 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordCachedArtifact.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Autopsy Forensic Browser - * - * Copyright 2011 Basis Technology Corp. - * Contact: carrier sleuthkit org - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.sleuthkit.autopsy.keywordsearch; - -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; -import org.sleuthkit.datamodel.BlackboardArtifact; -import org.sleuthkit.datamodel.BlackboardAttribute; - -/** - * result of writing keyword search result to blackboard (cached artifact and - * attributes) This is mainly to cache the attributes, so that we don't query - * the DB to get them back again. - */ -class KeywordCachedArtifact { - - private BlackboardArtifact artifact; - private Map attributes; - - KeywordCachedArtifact(BlackboardArtifact artifact) { - this.artifact = artifact; - attributes = new HashMap(); - } - - BlackboardArtifact getArtifact() { - return artifact; - } - - Collection getAttributes() { - return attributes.values(); - } - - BlackboardAttribute getAttribute(Integer attrTypeID) { - return attributes.get(attrTypeID); - } - - void add(BlackboardAttribute attribute) { - attributes.put(attribute.getAttributeType().getTypeID(), attribute); - } - - void add(Collection attributes) { - for (BlackboardAttribute attr : attributes) { - this.attributes.put(attr.getAttributeType().getTypeID(), attr); - } - } -} diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchQuery.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchQuery.java index cafd45b3e8..590b01d032 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchQuery.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchQuery.java @@ -18,8 +18,9 @@ */ package org.sleuthkit.autopsy.keywordsearch; +import org.sleuthkit.datamodel.BlackboardArtifact; /** - * Interface for kewyord search queries. + * Interface for kewyord search queries. */ interface KeywordSearchQuery { @@ -30,18 +31,20 @@ interface KeywordSearchQuery { * * @return true if the query passed validation */ - boolean validate(); + boolean validate(); /** * execute query and return results without publishing them return results * for all matching terms * - * @throws KeywordSearchModuleException error while executing Solr term query - * @throws NoOpenCoreException if query failed due to server error, this - * could be a notification to stop processing + * @throws KeywordSearchModuleException error while executing Solr term + * query + * @throws NoOpenCoreException if query failed due to server error, + * this could be a notification to stop + * processing * @return */ - QueryResults performQuery() throws KeywordSearchModuleException, NoOpenCoreException; + QueryResults performQuery() throws KeywordSearchModuleException, NoOpenCoreException; /** * Set an optional filter to narrow down the search Adding multiple filters @@ -49,14 +52,14 @@ interface KeywordSearchQuery { * * @param filter filter to set on the query */ - void addFilter(KeywordQueryFilter filter); + void addFilter(KeywordQueryFilter filter); /** * Set an optional SOLR field to narrow down the search * * @param field field to set on the query */ - void setField(String field); + void setField(String field); /** * Modify the query string to be searched as a substring instead of a whole @@ -64,39 +67,54 @@ interface KeywordSearchQuery { * * @param isSubstring */ - void setSubstringQuery(); + void setSubstringQuery(); /** * escape the query string and use the escaped string in the query */ - void escape(); + void escape(); /** * * @return true if query was escaped */ - boolean isEscaped(); + boolean isEscaped(); /** * * @return true if query is a literal query (non regex) */ - boolean isLiteral(); + boolean isLiteral(); /** * return original keyword/query string * * @return the query String supplied originally */ - String getQueryString(); + String getQueryString(); /** * return escaped keyword/query string if escaping was done * * @return the escaped query string, or original string if no escaping done */ - String getEscapedQueryString(); + String getEscapedQueryString(); - KeywordCachedArtifact writeSingleFileHitsToBlackBoard(Keyword keyword, KeywordHit hit, String snippet, String listName); + /** + * Converts the keyword hits for a given search term into artifacts. + * + * @param foundKeyword The keyword that was found by the search, this may be + * different than the Keyword that was searched if, for + * example, it was a RegexQuery.. + * @param hit The keyword hit. + * @param snippet The document snippet that contains the hit + * @param listName The name of the keyword list that contained the + * keyword for which the hit was found. + * + * + * @return The newly created artifact or Null if there was a problem + * creating it. + */ + BlackboardArtifact writeSingleFileHitsToBlackBoard( Keyword foundKeyword, KeywordHit hit, String snippet, String listName); } diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/LuceneQuery.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/LuceneQuery.java index 9f8686898f..388a17d00f 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/LuceneQuery.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/LuceneQuery.java @@ -20,7 +20,6 @@ package org.sleuthkit.autopsy.keywordsearch; import java.util.ArrayList; import java.util.Collection; -import java.util.Comparator; import java.util.List; import java.util.Map; import java.util.logging.Level; @@ -192,15 +191,13 @@ class LuceneQuery implements KeywordSearchQuery { } @Override - public KeywordCachedArtifact writeSingleFileHitsToBlackBoard(Keyword foundKeyword, KeywordHit hit, String snippet, String listName) { + public BlackboardArtifact writeSingleFileHitsToBlackBoard( Keyword foundKeyword, KeywordHit hit, String snippet, String listName) { final String MODULE_NAME = KeywordSearchModuleFactory.getModuleName(); Collection attributes = new ArrayList<>(); BlackboardArtifact bba; - KeywordCachedArtifact writeResult; try { bba = hit.getContent().newArtifact(ARTIFACT_TYPE.TSK_KEYWORD_HIT); - writeResult = new KeywordCachedArtifact(bba); } catch (TskCoreException e) { logger.log(Level.WARNING, "Error adding bb artifact for keyword hit", e); //NON-NLS return null; @@ -233,8 +230,7 @@ class LuceneQuery implements KeywordSearchQuery { try { bba.addAttributes(attributes); //write out to bb - writeResult.add(attributes); - return writeResult; + return bba; } catch (TskCoreException e) { logger.log(Level.WARNING, "Error adding bb attributes to artifact", e); //NON-NLS return null; diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/QueryResults.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/QueryResults.java index 410ec1a94c..ac74abc115 100755 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/QueryResults.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/QueryResults.java @@ -40,6 +40,7 @@ import org.sleuthkit.datamodel.AbstractFile; import org.sleuthkit.datamodel.BlackboardArtifact; import org.sleuthkit.datamodel.BlackboardAttribute; import org.sleuthkit.datamodel.Content; +import org.sleuthkit.datamodel.TskCoreException; /** * Stores the results from running a Solr query (which could contain multiple @@ -145,11 +146,15 @@ class QueryResults { continue; } } - KeywordCachedArtifact writeResult = keywordSearchQuery.writeSingleFileHitsToBlackBoard(keyword, hit, snippet, keywordSearchQuery.getKeywordList().getName()); + BlackboardArtifact writeResult = keywordSearchQuery.writeSingleFileHitsToBlackBoard( keyword, hit, snippet, keywordSearchQuery.getKeywordList().getName()); if (writeResult != null) { - newArtifacts.add(writeResult.getArtifact()); + newArtifacts.add(writeResult); if (notifyInbox) { - writeSingleFileInboxMessage(writeResult, hit.getContent()); + try { + writeSingleFileInboxMessage(writeResult, hit.getContent()); + } catch (TskCoreException ex) { + logger.log(Level.WARNING, "Error posting ,message to Ingest Inbox", ex); //NON-NLS + } } } else { logger.log(Level.WARNING, "BB artifact for keyword hit not written, file: {0}, hit: {1}", new Object[]{hit.getContent(), keyword.toString()}); //NON-NLS @@ -198,10 +203,10 @@ class QueryResults { /** * Generate an ingest inbox message for given keyword in given file * - * @param written + * @param artifact * @param hitFile */ - private void writeSingleFileInboxMessage(KeywordCachedArtifact written, Content hitContent) { + private void writeSingleFileInboxMessage(BlackboardArtifact artifact, Content hitContent) throws TskCoreException { StringBuilder subjectSb = new StringBuilder(); StringBuilder detailsSb = new StringBuilder(); @@ -211,30 +216,30 @@ class QueryResults { subjectSb.append(NbBundle.getMessage(this.getClass(), "KeywordSearchIngestModule.kwHitLbl")); } String uniqueKey = null; - BlackboardAttribute attr = written.getAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_KEYWORD.getTypeID()); + BlackboardAttribute attr; + + attr = artifact.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_KEYWORD)); if (attr != null) { final String keyword = attr.getValueString(); subjectSb.append(keyword); uniqueKey = keyword.toLowerCase(); + //details + detailsSb.append(""); //NON-NLS + //hit + detailsSb.append(""); //NON-NLS + detailsSb.append(NbBundle.getMessage(this.getClass(), "KeywordSearchIngestModule.kwHitThLbl")); + detailsSb.append(""); //NON-NLS + detailsSb.append(""); //NON-NLS } - //details - detailsSb.append("
").append(EscapeUtil.escapeHtml(keyword)).append("
"); //NON-NLS - //hit - detailsSb.append(""); //NON-NLS - detailsSb.append(NbBundle.getMessage(this.getClass(), "KeywordSearchIngestModule.kwHitThLbl")); - detailsSb.append(""); //NON-NLS - detailsSb.append(""); //NON-NLS - //preview - attr = written.getAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_KEYWORD_PREVIEW.getTypeID()); + attr = artifact.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_KEYWORD_PREVIEW)); if (attr != null) { detailsSb.append(""); //NON-NLS detailsSb.append(NbBundle.getMessage(this.getClass(), "KeywordSearchIngestModule.previewThLbl")); detailsSb.append(""); //NON-NLS detailsSb.append(""); //NON-NLS } - //file detailsSb.append(""); //NON-NLS detailsSb.append(NbBundle.getMessage(this.getClass(), "KeywordSearchIngestModule.fileThLbl")); @@ -247,26 +252,30 @@ class QueryResults { detailsSb.append(""); //NON-NLS //list - attr = written.getAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SET_NAME.getTypeID()); + attr = artifact.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SET_NAME)); if (attr != null) { detailsSb.append(""); //NON-NLS detailsSb.append(NbBundle.getMessage(this.getClass(), "KeywordSearchIngestModule.listThLbl")); detailsSb.append(""); //NON-NLS detailsSb.append(""); //NON-NLS } + //regex if (!keywordSearchQuery.isLiteral()) { - attr = written.getAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_KEYWORD_REGEXP.getTypeID()); + + attr = artifact.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_KEYWORD_REGEXP)); if (attr != null) { detailsSb.append(""); //NON-NLS detailsSb.append(NbBundle.getMessage(this.getClass(), "KeywordSearchIngestModule.regExThLbl")); detailsSb.append(""); //NON-NLS detailsSb.append(""); //NON-NLS } + } + detailsSb.append("
").append(EscapeUtil.escapeHtml(attr.getValueString())).append("
").append(EscapeUtil.escapeHtml(attr.getValueString())).append("
").append(attr.getValueString()).append("
").append(attr.getValueString()).append("
"); //NON-NLS - IngestServices.getInstance().postMessage(IngestMessage.createDataMessage(MODULE_NAME, subjectSb.toString(), detailsSb.toString(), uniqueKey, written.getArtifact())); + IngestServices.getInstance().postMessage(IngestMessage.createDataMessage(MODULE_NAME, subjectSb.toString(), detailsSb.toString(), uniqueKey, artifact)); } } diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/RegexQuery.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/RegexQuery.java index dca12ed5b4..bcd68d37c1 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/RegexQuery.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/RegexQuery.java @@ -372,24 +372,9 @@ final class RegexQuery implements KeywordSearchQuery { return escapedQuery; } - /** - * Converts the keyword hits for a given search term into artifacts. - * - * @param foundKeyword The keyword that was found by the regex search. - * @param hit The keyword hit. - * @param snippet The document snippet that contains the hit - * @param listName The name of the keyword list that contained the - * keyword for which the hit was found. - * - * - * - * @return An object that wraps an artifact and a mapping by id of its - * attributes. - */ - // TODO: Are we actually making meaningful use of the KeywordCachedArtifact - // class? + @Override - public KeywordCachedArtifact writeSingleFileHitsToBlackBoard(Keyword foundKeyword, KeywordHit hit, String snippet, String listName) { + public BlackboardArtifact writeSingleFileHitsToBlackBoard(Keyword foundKeyword, KeywordHit hit, String snippet, String listName) { final String MODULE_NAME = KeywordSearchModuleFactory.getModuleName(); /* @@ -499,9 +484,7 @@ final class RegexQuery implements KeywordSearchQuery { try { newArtifact.addAttributes(attributes); - KeywordCachedArtifact writeResult = new KeywordCachedArtifact(newArtifact); - writeResult.add(attributes); - return writeResult; + return newArtifact; } catch (TskCoreException e) { LOGGER.log(Level.SEVERE, "Error adding bb attributes for terms search artifact", e); //NON-NLS return null; diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/TermsComponentQuery.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/TermsComponentQuery.java index f4413e3f2a..a52a212777 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/TermsComponentQuery.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/TermsComponentQuery.java @@ -96,7 +96,7 @@ final class TermsComponentQuery implements KeywordSearchQuery { + "(?:\\?" // end sentinal: ? //NON-NLS + "(?.)" //longitudinal redundancy check //NON-NLS + "?)?)?)?)?)?");//close nested optional groups //NON-NLS - static final Pattern CREDIT_CARD_TRACK2_PATTERN = Pattern.compile( + static final Pattern CREDIT_CARD_TRACK2_PATTERN = Pattern.compile( /* * Track 2 is numeric plus six punctuation symbolls :;<=>? * @@ -115,7 +115,7 @@ final class TermsComponentQuery implements KeywordSearchQuery { + "(?:[:;<=>?]" //end sentinel //NON-NLS + "(?.)" //longitudinal redundancy check //NON-NLS + "?)?)?)?)?)?"); //close nested optional groups //NON-NLS - static final BlackboardAttribute.Type KEYWORD_SEARCH_DOCUMENT_ID = new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_KEYWORD_SEARCH_DOCUMENT_ID); + static final BlackboardAttribute.Type KEYWORD_SEARCH_DOCUMENT_ID = new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_KEYWORD_SEARCH_DOCUMENT_ID); /** * Constructs an object that implements a regex query that will be performed @@ -315,27 +315,12 @@ final class TermsComponentQuery implements KeywordSearchQuery { } results.addResult(new Keyword(term.getTerm(), false, true, originalKeyword.getListName(), originalKeyword.getOriginalTerm()), new ArrayList<>(termHits)); } - return results; + return results; } - /** - * Converts the keyword hits for a given search term into artifacts. - * - * @param foundKeyword The keyword that was found by the search. - * @param hit The keyword hit. - * @param snippet The document snippet that contains the hit - * @param listName The name of the keyword list that contained the keyword - * for which the hit was found. - * - * - * - * @return An object that wraps an artifact and a mapping by id of its - * attributes. - */ - // TODO: Are we actually making meaningful use of the KeywordCachedArtifact - // class? + @Override - public KeywordCachedArtifact writeSingleFileHitsToBlackBoard(Keyword foundKeyword, KeywordHit hit, String snippet, String listName) { + public BlackboardArtifact writeSingleFileHitsToBlackBoard( Keyword foundKeyword, KeywordHit hit, String snippet, String listName) { /* * Create either a "plain vanilla" keyword hit artifact with keyword and * regex attributes, or a credit card account artifact with attributes @@ -347,7 +332,7 @@ final class TermsComponentQuery implements KeywordSearchQuery { if (originalKeyword.getArtifactAttributeType() != ATTRIBUTE_TYPE.TSK_CARD_NUMBER) { attributes.add(new BlackboardAttribute(ATTRIBUTE_TYPE.TSK_KEYWORD, MODULE_NAME, foundKeyword.getSearchTerm())); attributes.add(new BlackboardAttribute(ATTRIBUTE_TYPE.TSK_KEYWORD_REGEXP, MODULE_NAME, originalKeyword.getSearchTerm())); - + try { newArtifact = hit.getContent().newArtifact(ARTIFACT_TYPE.TSK_KEYWORD_HIT); @@ -442,12 +427,10 @@ final class TermsComponentQuery implements KeywordSearchQuery { // TermsComponentQuery is now being used exclusively for substring searches. attributes.add(new BlackboardAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_KEYWORD_SEARCH_TYPE, MODULE_NAME, KeywordSearch.QueryType.SUBSTRING.ordinal())); - + try { newArtifact.addAttributes(attributes); - KeywordCachedArtifact writeResult = new KeywordCachedArtifact(newArtifact); - writeResult.add(attributes); - return writeResult; + return newArtifact; } catch (TskCoreException e) { LOGGER.log(Level.SEVERE, "Error adding bb attributes for terms search artifact", e); //NON-NLS return null; From 77783d1537aa1e8c6046b8ed12cbffea888671e4 Mon Sep 17 00:00:00 2001 From: millmanorama Date: Tue, 22 Aug 2017 03:02:35 -0400 Subject: [PATCH 013/104] minor cleanup --- .../keywordsearch/KeywordSearchQuery.java | 10 +++----- .../autopsy/keywordsearch/QueryResults.java | 25 +++++++------------ .../autopsy/keywordsearch/RegexQuery.java | 5 ++-- 3 files changed, 15 insertions(+), 25 deletions(-) diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchQuery.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchQuery.java index 590b01d032..12d31db7e6 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchQuery.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchQuery.java @@ -19,6 +19,7 @@ package org.sleuthkit.autopsy.keywordsearch; import org.sleuthkit.datamodel.BlackboardArtifact; + /** * Interface for kewyord search queries. */ @@ -64,8 +65,6 @@ interface KeywordSearchQuery { /** * Modify the query string to be searched as a substring instead of a whole * word - * - * @param isSubstring */ void setSubstringQuery(); @@ -105,9 +104,9 @@ interface KeywordSearchQuery { * * @param foundKeyword The keyword that was found by the search, this may be * different than the Keyword that was searched if, for - * example, it was a RegexQuery.. + * example, it was a RegexQuery. * @param hit The keyword hit. - * @param snippet The document snippet that contains the hit + * @param snippet The document snippet that contains the hit. * @param listName The name of the keyword list that contained the * keyword for which the hit was found. * @@ -115,6 +114,5 @@ interface KeywordSearchQuery { * @return The newly created artifact or Null if there was a problem * creating it. */ - BlackboardArtifact writeSingleFileHitsToBlackBoard( Keyword foundKeyword, KeywordHit hit, String snippet, String listName); - + BlackboardArtifact writeSingleFileHitsToBlackBoard(Keyword foundKeyword, KeywordHit hit, String snippet, String listName); } diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/QueryResults.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/QueryResults.java index ac74abc115..200312c582 100755 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/QueryResults.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/QueryResults.java @@ -61,8 +61,6 @@ class QueryResults { */ private final Map> results = new HashMap<>(); - - QueryResults(KeywordSearchQuery query) { this.keywordSearchQuery = query; } @@ -71,8 +69,6 @@ class QueryResults { results.put(keyword, hits); } - - KeywordSearchQuery getQuery() { return keywordSearchQuery; } @@ -146,14 +142,14 @@ class QueryResults { continue; } } - BlackboardArtifact writeResult = keywordSearchQuery.writeSingleFileHitsToBlackBoard( keyword, hit, snippet, keywordSearchQuery.getKeywordList().getName()); + BlackboardArtifact writeResult = keywordSearchQuery.writeSingleFileHitsToBlackBoard(keyword, hit, snippet, keywordSearchQuery.getKeywordList().getName()); if (writeResult != null) { newArtifacts.add(writeResult); if (notifyInbox) { try { writeSingleFileInboxMessage(writeResult, hit.getContent()); } catch (TskCoreException ex) { - logger.log(Level.WARNING, "Error posting ,message to Ingest Inbox", ex); //NON-NLS + logger.log(Level.WARNING, "Error posting message to Ingest Inbox", ex); //NON-NLS } } } else { @@ -186,7 +182,6 @@ class QueryResults { * SolrObjectID-ChunkID pairs. */ private Collection getOneHitPerObject(Keyword keyword) { - HashMap hits = new HashMap<>(); // create a list of KeywordHits. KeywordHits with lowest chunkID is added the the list. @@ -201,10 +196,12 @@ class QueryResults { } /** - * Generate an ingest inbox message for given keyword in given file + * Generate and post an ingest inbox message for the given keyword in the given content. * - * @param artifact - * @param hitFile + * @param artifact The keyword hit artifact. + * @param hitContent The content that the hit is in. + * + * @throws TskCoreException If there is a problem generating or posting the inbox message. */ private void writeSingleFileInboxMessage(BlackboardArtifact artifact, Content hitContent) throws TskCoreException { StringBuilder subjectSb = new StringBuilder(); @@ -216,9 +213,7 @@ class QueryResults { subjectSb.append(NbBundle.getMessage(this.getClass(), "KeywordSearchIngestModule.kwHitLbl")); } String uniqueKey = null; - BlackboardAttribute attr; - - attr = artifact.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_KEYWORD)); + BlackboardAttribute attr = artifact.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_KEYWORD)); if (attr != null) { final String keyword = attr.getValueString(); subjectSb.append(keyword); @@ -240,6 +235,7 @@ class QueryResults { detailsSb.append("").append(EscapeUtil.escapeHtml(attr.getValueString())).append(""); //NON-NLS detailsSb.append(""); //NON-NLS } + //file detailsSb.append(""); //NON-NLS detailsSb.append(NbBundle.getMessage(this.getClass(), "KeywordSearchIngestModule.fileThLbl")); @@ -262,7 +258,6 @@ class QueryResults { //regex if (!keywordSearchQuery.isLiteral()) { - attr = artifact.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_KEYWORD_REGEXP)); if (attr != null) { detailsSb.append(""); //NON-NLS @@ -270,12 +265,10 @@ class QueryResults { detailsSb.append("").append(attr.getValueString()).append(""); //NON-NLS detailsSb.append(""); //NON-NLS } - } detailsSb.append(""); //NON-NLS IngestServices.getInstance().postMessage(IngestMessage.createDataMessage(MODULE_NAME, subjectSb.toString(), detailsSb.toString(), uniqueKey, artifact)); } - } diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/RegexQuery.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/RegexQuery.java index bcd68d37c1..9d4a7b419b 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/RegexQuery.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/RegexQuery.java @@ -512,7 +512,7 @@ final class RegexQuery implements KeywordSearchQuery { * hit and turns them into artifact attributes. The track 1 data has the * same fields as the track two data, plus the account holder's name. * - * @param attributesMap A map of artifact attribute objects, used to avoid + * @param attributeMap A map of artifact attribute objects, used to avoid * creating duplicate attributes. * @param matcher A matcher for the snippet. */ @@ -525,7 +525,7 @@ final class RegexQuery implements KeywordSearchQuery { * Creates an attribute of the the given type to the given artifact with a * value parsed from the snippet for a credit account number hit. * - * @param attributesMap A map of artifact attribute objects, used to avoid + * @param attributeMap A map of artifact attribute objects, used to avoid * creating duplicate attributes. * @param attrType The type of attribute to create. * @param groupName The group name of the regular expression that was @@ -547,5 +547,4 @@ final class RegexQuery implements KeywordSearchQuery { return null; }); } - } From 79b17fe17a025ca2e08d4dffeeceefaeebd21005 Mon Sep 17 00:00:00 2001 From: esaunders Date: Tue, 22 Aug 2017 10:28:43 -0400 Subject: [PATCH 014/104] Pass weak listener references to event publisher to allow blackboard artifact nodes to be garbage collected. --- .../datamodel/BlackboardArtifactNode.java | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/BlackboardArtifactNode.java b/Core/src/org/sleuthkit/autopsy/datamodel/BlackboardArtifactNode.java index 7317b5781f..47870bb9bf 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/BlackboardArtifactNode.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/BlackboardArtifactNode.java @@ -25,9 +25,11 @@ import java.beans.PropertyChangeListener; import java.text.MessageFormat; import java.util.ArrayList; import java.util.Arrays; +import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.logging.Level; @@ -37,6 +39,7 @@ import org.openide.nodes.Children; import org.openide.nodes.Sheet; import org.openide.util.Lookup; import org.openide.util.NbBundle; +import org.openide.util.WeakListeners; import org.openide.util.lookup.Lookups; import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.casemodule.events.BlackBoardArtifactTagAddedEvent; @@ -64,6 +67,13 @@ import org.sleuthkit.datamodel.TskCoreException; public class BlackboardArtifactNode extends DisplayableItemNode { private static final Logger LOGGER = Logger.getLogger(BlackboardArtifactNode.class.getName()); + private static final Set CASE_EVENTS_OF_INTEREST = new HashSet<>(Arrays.asList(new String[]{ + Case.Events.BLACKBOARD_ARTIFACT_TAG_ADDED.toString(), + Case.Events.BLACKBOARD_ARTIFACT_TAG_DELETED.toString(), + Case.Events.CONTENT_TAG_ADDED.toString(), + Case.Events.CONTENT_TAG_DELETED.toString(), + Case.Events.CURRENT_CASE.toString() + })); private static Cache contentCache = CacheBuilder.newBuilder() .expireAfterWrite(1, TimeUnit.MINUTES). @@ -138,7 +148,7 @@ public class BlackboardArtifactNode extends DisplayableItemNode { this.setName(Long.toString(artifact.getArtifactID())); this.setDisplayName(); this.setIconBaseWithExtension(iconPath); - Case.addPropertyChangeListener(pcl); + Case.addEventSubscriber(CASE_EVENTS_OF_INTEREST, WeakListeners.propertyChange(pcl, null)); } /** @@ -155,11 +165,11 @@ public class BlackboardArtifactNode extends DisplayableItemNode { this.setName(Long.toString(artifact.getArtifactID())); this.setDisplayName(); this.setIconBaseWithExtension(ExtractedContent.getIconFilePath(artifact.getArtifactTypeID())); //NON-NLS - Case.addPropertyChangeListener(pcl); + Case.addEventSubscriber(CASE_EVENTS_OF_INTEREST, WeakListeners.propertyChange(pcl, null)); } private void removeListeners() { - Case.removePropertyChangeListener(pcl); + Case.removeEventSubscriber(CASE_EVENTS_OF_INTEREST, pcl); } @Override From bcefce90802af0c48b845d50f03fabfbbb779614 Mon Sep 17 00:00:00 2001 From: Eugene Livis Date: Tue, 22 Aug 2017 16:25:42 -0400 Subject: [PATCH 015/104] Added re-tries for opening Solr cores --- .../autopsy/keywordsearch/Server.java | 79 ++++++++++++++----- 1 file changed, 59 insertions(+), 20 deletions(-) diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Server.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Server.java index a004a89e70..94a3cc82d0 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Server.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Server.java @@ -189,6 +189,8 @@ public class Server { private static final boolean DEBUG = false;//(Version.getBuildType() == Version.Type.DEVELOPMENT); private static final String SOLR = "solr"; private static final String CORE_PROPERTIES = "core.properties"; + private static final int MAX_NUM_CORE_OPEN_RETRIES = 3; // number of time to re-try loading a Solr core + private static final int TIME_TO_SLEEP_BETWEEN_RETIES_MILLISECODS = 10000; // wait 10 seconds before re-trying public enum CORE_EVT_STATES { @@ -644,7 +646,36 @@ public class Server { void openCoreForCase(Case theCase, Index index) throws KeywordSearchModuleException { currentCoreLock.writeLock().lock(); try { - currentCore = openCore(theCase, index); + // establish connection to Solr server + connectToServer(theCase.getCaseType()); + + int tryNum = 0; + while (tryNum < MAX_NUM_CORE_OPEN_RETRIES) { + tryNum++; + try { + // open Solr core + currentCore = openCore(theCase.getCaseType(), index); + break; + } catch (KeywordSearchModuleException ex) { + if (tryNum == MAX_NUM_CORE_OPEN_RETRIES) { + throw new KeywordSearchModuleException(NbBundle.getMessage(this.getClass(), "Server.openCore.exception.cantOpen.msg"), ex); + } else { + try { + /* + NOTE: It has been noticed that sometimes Solr throws an exception + when trying to open a core on a network drive because it thinks that + some files are missing in the index folder. Same core is observed to + be successfully opened just seconds later by other Autopsy instances. + Therefore this re-try is being added to hopefully mitigate that (see JIRA-2941) + */ + logger.log(Level.WARNING, "Unable to open Solr core in " + index.getIndexPath() + ", re-trying", ex); + Thread.sleep(TIME_TO_SLEEP_BETWEEN_RETIES_MILLISECODS); + } catch (InterruptedException ex2) { + logger.log(Level.SEVERE, "Unexpected interrupt while waiting betwen Solr core re-tries", ex2); + } + } + } + } try { // execute a test query. if it fails, an exception will be thrown @@ -753,7 +784,7 @@ public class Server { /** * Creates/opens a Solr core (index) for a case. * - * @param theCase The case for which the core is to be created/opened. + * @param theCase Type of the current case * @param index The text index that the Solr core should be using. * * @return An object representing the created/opened core. @@ -761,21 +792,7 @@ public class Server { * @throws KeywordSearchModuleException If an error occurs while * creating/opening the core. */ - private Core openCore(Case theCase, Index index) throws KeywordSearchModuleException { - - try { - if (theCase.getCaseType() == CaseType.SINGLE_USER_CASE) { - currentSolrServer = this.localSolrServer; - } else { - String host = UserPreferences.getIndexingServerHost(); - String port = UserPreferences.getIndexingServerPort(); - currentSolrServer = new HttpSolrServer("http://" + host + ":" + port + "/solr"); //NON-NLS - } - connectToSolrServer(currentSolrServer); - - } catch (SolrServerException | IOException ex) { - throw new KeywordSearchModuleException(NbBundle.getMessage(Server.class, "Server.connect.exception.msg", ex.getLocalizedMessage()), ex); - } + private Core openCore(CaseType caseType, Index index) throws KeywordSearchModuleException { try { File dataDir = new File(new File(index.getIndexPath()).getParent()); // "data dir" is the parent of the index directory @@ -798,7 +815,7 @@ public class Server { // In single user mode, if there is a core.properties file already, // we've hit a solr bug. Compensate by deleting it. - if (theCase.getCaseType() == CaseType.SINGLE_USER_CASE) { + if (caseType == CaseType.SINGLE_USER_CASE) { Path corePropertiesFile = Paths.get(solrFolder.toString(), SOLR, coreName, CORE_PROPERTIES); if (corePropertiesFile.toFile().exists()) { try { @@ -822,12 +839,34 @@ public class Server { throw new KeywordSearchModuleException(NbBundle.getMessage(this.getClass(), "Server.openCore.exception.noIndexDir.msg")); } - return new Core(coreName, theCase.getCaseType(), index); + return new Core(coreName, caseType, index); - } catch (SolrServerException | SolrException | IOException ex) { + } catch (Exception ex) { throw new KeywordSearchModuleException(NbBundle.getMessage(this.getClass(), "Server.openCore.exception.cantOpen.msg"), ex); } } + + /** + * Connect to Solr server. + * + * @param caseType Type of the current case + * @throws KeywordSearchModuleException If unable to connect to Solr server + */ + void connectToServer(CaseType caseType) throws KeywordSearchModuleException { + try { + if (caseType == CaseType.SINGLE_USER_CASE) { + currentSolrServer = this.localSolrServer; + } else { + String host = UserPreferences.getIndexingServerHost(); + String port = UserPreferences.getIndexingServerPort(); + currentSolrServer = new HttpSolrServer("http://" + host + ":" + port + "/solr"); //NON-NLS + } + connectToSolrServer(currentSolrServer); + + } catch (SolrServerException | IOException ex) { + throw new KeywordSearchModuleException(NbBundle.getMessage(Server.class, "Server.connect.exception.msg", ex.getLocalizedMessage()), ex); + } + } /** * Commits current core if it exists From b7845f9af04d8966ea973687979633e73c7ac92e Mon Sep 17 00:00:00 2001 From: Eugene Livis Date: Tue, 22 Aug 2017 17:12:56 -0400 Subject: [PATCH 016/104] Minor --- .../src/org/sleuthkit/autopsy/keywordsearch/Server.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Server.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Server.java index 94a3cc82d0..f8e296722c 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Server.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Server.java @@ -662,11 +662,11 @@ public class Server { } else { try { /* - NOTE: It has been noticed that sometimes Solr throws an exception - when trying to open a core on a network drive because it thinks that - some files are missing in the index folder. Same core is observed to + NOTE: It has been noticed that in rare cases Solr throws an exception + when trying to open a core that is stored on a network drive because + it thinks that some files are missing in the index folder. Same core is observed to be successfully opened just seconds later by other Autopsy instances. - Therefore this re-try is being added to hopefully mitigate that (see JIRA-2941) + Therefore a re-try is being added to hopefully mitigate this (see JIRA-2941) */ logger.log(Level.WARNING, "Unable to open Solr core in " + index.getIndexPath() + ", re-trying", ex); Thread.sleep(TIME_TO_SLEEP_BETWEEN_RETIES_MILLISECODS); From 909fda73fbddfec5fde95c340204ad22102ea8c4 Mon Sep 17 00:00:00 2001 From: Eugene Livis Date: Tue, 22 Aug 2017 17:20:49 -0400 Subject: [PATCH 017/104] Minor --- .../src/org/sleuthkit/autopsy/keywordsearch/Server.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Server.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Server.java index f8e296722c..a3ab026a9a 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Server.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Server.java @@ -189,7 +189,7 @@ public class Server { private static final boolean DEBUG = false;//(Version.getBuildType() == Version.Type.DEVELOPMENT); private static final String SOLR = "solr"; private static final String CORE_PROPERTIES = "core.properties"; - private static final int MAX_NUM_CORE_OPEN_RETRIES = 3; // number of time to re-try loading a Solr core + private static final int MAX_NUM_CORE_OPEN_ATTEMPTS = 3; // number of time to attempt loading a Solr core private static final int TIME_TO_SLEEP_BETWEEN_RETIES_MILLISECODS = 10000; // wait 10 seconds before re-trying public enum CORE_EVT_STATES { @@ -650,14 +650,14 @@ public class Server { connectToServer(theCase.getCaseType()); int tryNum = 0; - while (tryNum < MAX_NUM_CORE_OPEN_RETRIES) { + while (tryNum < MAX_NUM_CORE_OPEN_ATTEMPTS) { tryNum++; try { // open Solr core currentCore = openCore(theCase.getCaseType(), index); break; } catch (KeywordSearchModuleException ex) { - if (tryNum == MAX_NUM_CORE_OPEN_RETRIES) { + if (tryNum == MAX_NUM_CORE_OPEN_ATTEMPTS) { throw new KeywordSearchModuleException(NbBundle.getMessage(this.getClass(), "Server.openCore.exception.cantOpen.msg"), ex); } else { try { From 9bdf496abe0ee472296f4f4967a3d4ffe7d8e509 Mon Sep 17 00:00:00 2001 From: millmanorama Date: Wed, 23 Aug 2017 04:44:37 -0400 Subject: [PATCH 018/104] cleanup --- .../KeywordSearchResultFactory.java | 35 +++++++++++-------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchResultFactory.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchResultFactory.java index 65f83551b0..5583cfe96f 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchResultFactory.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchResultFactory.java @@ -36,7 +36,6 @@ import org.netbeans.api.progress.ProgressHandle; import org.openide.nodes.ChildFactory; import org.openide.nodes.Children; import org.openide.nodes.Node; -import org.openide.util.Exceptions; import org.openide.util.NbBundle; import org.openide.util.lookup.Lookups; import org.sleuthkit.autopsy.casemodule.Case; @@ -92,7 +91,7 @@ class KeywordSearchResultFactory extends ChildFactory { * properties are displayed as columns (since we are doing lazy child Node * load we need to preinitialize properties when sending parent Node) * - * @param toSet property set map for a Node + * @param toPopulate property set map for a Node */ @Override protected boolean createKeys(List toPopulate) { @@ -149,6 +148,8 @@ class KeywordSearchResultFactory extends ChildFactory { try { tskCase = Case.getCurrentCase().getSleuthkitCase(); } catch (IllegalStateException ex) { + logger.log(Level.SEVERE, "There was no case open.", ex); //NON-NLS + return false; } int hitNumber = 0; @@ -160,16 +161,20 @@ class KeywordSearchResultFactory extends ChildFactory { */ Map properties = new LinkedHashMap<>(); Content content = null; + String contentName = ""; try { content = tskCase.getContentById(hit.getContentID()); } catch (TskCoreException ex) { - Exceptions.printStackTrace(ex); + logger.log(Level.SEVERE, "There was a error getting content by id.", ex); //NON-NLS + return false; } - String contentName = content.getName(); - if (content instanceof AbstractFile) { - AbstractFsContentNode.fillPropertyMap(properties, (AbstractFile) content); - } else { - properties.put(LOCATION.toString(), contentName); + if (content != null) { + contentName = content.getName(); + if (content instanceof AbstractFile) { + AbstractFsContentNode.fillPropertyMap(properties, (AbstractFile) content); + } else { + properties.put(LOCATION.toString(), contentName); + } } /** @@ -251,14 +256,14 @@ class KeywordSearchResultFactory extends ChildFactory { * NOTE Parameters are defined based on how they are currently used in * practice * - * @param name File name that has hit. - * @param map Contains content metadata, snippets, etc. (property - * map) - * @param id User incremented ID + * @param name File name that has hit. + * @param map Contains content metadata, snippets, etc. + * (property map) + * @param id User incremented ID * @param solrObjectId - * @param content File that had the hit. - * @param query Query used in search - * @param hits Full set of search results (for all files! @@@) + * @param content File that had the hit. + * @param query Query used in search + * @param hits Full set of search results (for all files! @@@) */ KeyValueQueryContent(String name, Map map, int id, long solrObjectId, Content content, KeywordSearchQuery query, QueryResults hits) { super(name, map, id); From 8a7da368ad443d64617a529d2b78e2ca704361e8 Mon Sep 17 00:00:00 2001 From: millmanorama Date: Wed, 23 Aug 2017 04:53:14 -0400 Subject: [PATCH 019/104] more cleanup --- .../KeywordSearchResultFactory.java | 26 ++++++++++--------- .../autopsy/keywordsearch/QueryResults.java | 15 ++++++----- .../autopsy/keywordsearch/SearchRunner.java | 8 ++---- 3 files changed, 24 insertions(+), 25 deletions(-) diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchResultFactory.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchResultFactory.java index 5583cfe96f..b603f7b68c 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchResultFactory.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchResultFactory.java @@ -48,7 +48,6 @@ import org.sleuthkit.autopsy.datamodel.KeyValue; import org.sleuthkit.autopsy.datamodel.KeyValueNode; import org.sleuthkit.autopsy.keywordsearch.KeywordSearchResultFactory.KeyValueQueryContent; import org.sleuthkit.datamodel.AbstractFile; -import org.sleuthkit.datamodel.BlackboardArtifact; import org.sleuthkit.datamodel.BlackboardAttribute; import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_KEYWORD; import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_KEYWORD_PREVIEW; @@ -164,17 +163,20 @@ class KeywordSearchResultFactory extends ChildFactory { String contentName = ""; try { content = tskCase.getContentById(hit.getContentID()); + if (content == null) { + logger.log(Level.SEVERE, "There was a error getting content by id."); //NON-NLS + return false; + } } catch (TskCoreException ex) { logger.log(Level.SEVERE, "There was a error getting content by id.", ex); //NON-NLS return false; } - if (content != null) { - contentName = content.getName(); - if (content instanceof AbstractFile) { - AbstractFsContentNode.fillPropertyMap(properties, (AbstractFile) content); - } else { - properties.put(LOCATION.toString(), contentName); - } + + contentName = content.getName(); + if (content instanceof AbstractFile) { + AbstractFsContentNode.fillPropertyMap(properties, (AbstractFile) content); + } else { + properties.put(LOCATION.toString(), contentName); } /** @@ -238,6 +240,7 @@ class KeywordSearchResultFactory extends ChildFactory { //wrap in KeywordSearchFilterNode for the markup content, might need to override FilterNode for more customization return new KeywordSearchFilterNode(hits, kvNode); + } /** @@ -295,13 +298,12 @@ class KeywordSearchResultFactory extends ChildFactory { * worker for writing results to bb, with progress bar, cancellation, and * central registry of workers to be stopped when case is closed */ - static class BlackboardResultWriter extends SwingWorker { + static class BlackboardResultWriter extends SwingWorker { private static final List writers = new ArrayList<>(); private ProgressHandle progress; private final KeywordSearchQuery query; private final QueryResults hits; - private Collection newArtifacts = new ArrayList<>(); private static final int QUERY_DISPLAY_LEN = 40; BlackboardResultWriter(QueryResults hits, String listName) { @@ -315,13 +317,13 @@ class KeywordSearchResultFactory extends ChildFactory { } @Override - protected Object doInBackground() throws Exception { + protected Void doInBackground() throws Exception { registerWriter(this); //register (synchronized on class) outside of writerLock to prevent deadlock final String queryStr = query.getQueryString(); final String queryDisp = queryStr.length() > QUERY_DISPLAY_LEN ? queryStr.substring(0, QUERY_DISPLAY_LEN - 1) + " ..." : queryStr; try { progress = ProgressHandle.createHandle(NbBundle.getMessage(this.getClass(), "KeywordSearchResultFactory.progress.saving", queryDisp), () -> BlackboardResultWriter.this.cancel(true)); - newArtifacts = hits.writeAllHitsToBlackBoard(progress, null, this, false); + hits.writeAllHitsToBlackBoard(progress, null, this, false); } finally { finalizeWorker(); } diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/QueryResults.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/QueryResults.java index 8058c1d917..48fdb38f10 100755 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/QueryResults.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/QueryResults.java @@ -98,7 +98,7 @@ class QueryResults { * * @return The artifacts that were created. */ - Collection writeAllHitsToBlackBoard(ProgressHandle progress, ProgressContributor subProgress, SwingWorker worker, boolean notifyInbox) { + Collection writeAllHitsToBlackBoard(ProgressHandle progress, ProgressContributor subProgress, SwingWorker worker, boolean notifyInbox) { final Collection newArtifacts = new ArrayList<>(); if (progress != null) { progress.start(getKeywords().size()); @@ -148,10 +148,9 @@ class QueryResults { try { SleuthkitCase tskCase = Case.getCurrentCase().getSleuthkitCase(); content = tskCase.getContentById(hit.getContentID()); - } catch (TskCoreException tskCoreException) { + } catch (TskCoreException | IllegalStateException tskCoreException) { logger.log(Level.SEVERE, "Error adding artifact for keyword hit to blackboard", tskCoreException); //NON-NLS return null; - } catch (IllegalStateException ex) { } BlackboardArtifact writeResult = keywordSearchQuery.writeSingleFileHitsToBlackBoard(content, keyword, hit, snippet, keywordSearchQuery.getKeywordList().getName()); if (writeResult != null) { @@ -207,12 +206,14 @@ class QueryResults { } /** - * Generate and post an ingest inbox message for the given keyword in the given content. + * Generate and post an ingest inbox message for the given keyword in the + * given content. * - * @param artifact The keyword hit artifact. + * @param artifact The keyword hit artifact. * @param hitContent The content that the hit is in. * - * @throws TskCoreException If there is a problem generating or posting the inbox message. + * @throws TskCoreException If there is a problem generating or posting the + * inbox message. */ private void writeSingleFileInboxMessage(BlackboardArtifact artifact, Content hitContent) throws TskCoreException { StringBuilder subjectSb = new StringBuilder(); @@ -247,7 +248,7 @@ class QueryResults { detailsSb.append("").append(EscapeUtil.escapeHtml(attr.getValueString())).append(""); //NON-NLS detailsSb.append(""); //NON-NLS } - + //file detailsSb.append(""); //NON-NLS detailsSb.append(NbBundle.getMessage(this.getClass(), "KeywordSearchIngestModule.fileThLbl")); diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/SearchRunner.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/SearchRunner.java index 1a2ffd1200..c9b95a770b 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/SearchRunner.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/SearchRunner.java @@ -19,7 +19,6 @@ package org.sleuthkit.autopsy.keywordsearch; import java.util.ArrayList; -import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; @@ -46,7 +45,6 @@ import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil; import org.sleuthkit.autopsy.coreutils.StopWatch; import org.sleuthkit.autopsy.ingest.IngestMessage; import org.sleuthkit.autopsy.ingest.IngestServices; -import org.sleuthkit.datamodel.BlackboardArtifact; /** * Singleton keyword search manager: Launches search threads for each job and @@ -482,9 +480,7 @@ public final class SearchRunner { if (!newResults.getKeywords().isEmpty()) { // Write results to BB - //new artifacts created, to report to listeners - Collection newArtifacts = new ArrayList<>(); - + //scale progress bar more more granular, per result sub-progress, within per keyword int totalUnits = newResults.getKeywords().size(); subProgresses[keywordsSearched].start(totalUnits); @@ -496,7 +492,7 @@ public final class SearchRunner { subProgresses[keywordsSearched].progress(keywordList.getName() + ": " + queryDisplayStr, unitProgress); // Create blackboard artifacts - newArtifacts = newResults.writeAllHitsToBlackBoard(null, subProgresses[keywordsSearched], this, keywordList.getIngestMessages()); + newResults.writeAllHitsToBlackBoard(null, subProgresses[keywordsSearched], this, keywordList.getIngestMessages()); } //if has results From bcdf7880c28071b114de7f099283e8ffec141210 Mon Sep 17 00:00:00 2001 From: Eugene Livis Date: Wed, 23 Aug 2017 09:05:28 -0400 Subject: [PATCH 020/104] Fixed typos --- .../src/org/sleuthkit/autopsy/keywordsearch/Server.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Server.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Server.java index a3ab026a9a..0648c53310 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Server.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Server.java @@ -190,7 +190,7 @@ public class Server { private static final String SOLR = "solr"; private static final String CORE_PROPERTIES = "core.properties"; private static final int MAX_NUM_CORE_OPEN_ATTEMPTS = 3; // number of time to attempt loading a Solr core - private static final int TIME_TO_SLEEP_BETWEEN_RETIES_MILLISECODS = 10000; // wait 10 seconds before re-trying + private static final int TIME_TO_SLEEP_BETWEEN_RETRIES_MILLISECONDS = 10000; // wait 10 seconds before re-trying public enum CORE_EVT_STATES { @@ -669,7 +669,7 @@ public class Server { Therefore a re-try is being added to hopefully mitigate this (see JIRA-2941) */ logger.log(Level.WARNING, "Unable to open Solr core in " + index.getIndexPath() + ", re-trying", ex); - Thread.sleep(TIME_TO_SLEEP_BETWEEN_RETIES_MILLISECODS); + Thread.sleep(TIME_TO_SLEEP_BETWEEN_RETRIES_MILLISECONDS); } catch (InterruptedException ex2) { logger.log(Level.SEVERE, "Unexpected interrupt while waiting betwen Solr core re-tries", ex2); } From b77fcb74c0eefa640589c4ba1fd0cc737f246bd9 Mon Sep 17 00:00:00 2001 From: Eugene Livis Date: Wed, 23 Aug 2017 09:06:51 -0400 Subject: [PATCH 021/104] Fixed typos --- .../src/org/sleuthkit/autopsy/keywordsearch/Server.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Server.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Server.java index 0648c53310..95f44161c6 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Server.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Server.java @@ -189,7 +189,7 @@ public class Server { private static final boolean DEBUG = false;//(Version.getBuildType() == Version.Type.DEVELOPMENT); private static final String SOLR = "solr"; private static final String CORE_PROPERTIES = "core.properties"; - private static final int MAX_NUM_CORE_OPEN_ATTEMPTS = 3; // number of time to attempt loading a Solr core + private static final int MAX_NUM_CORE_OPEN_ATTEMPTS = 3; // number of times to attempt loading a Solr core private static final int TIME_TO_SLEEP_BETWEEN_RETRIES_MILLISECONDS = 10000; // wait 10 seconds before re-trying public enum CORE_EVT_STATES { From 160a241780429c70e3a1d25bfbb0014306351acb Mon Sep 17 00:00:00 2001 From: Eugene Livis Date: Thu, 24 Aug 2017 14:19:37 -0400 Subject: [PATCH 022/104] Pulling commons-io version 2.5 instead of 2.4 --- CoreLibs/ivy.xml | 2 +- CoreLibs/nbproject/project.properties | 3 ++ CoreLibs/nbproject/project.xml | 72 +++++++++++++-------------- 3 files changed, 40 insertions(+), 37 deletions(-) diff --git a/CoreLibs/ivy.xml b/CoreLibs/ivy.xml index 8043007b52..bfd9112f9e 100644 --- a/CoreLibs/ivy.xml +++ b/CoreLibs/ivy.xml @@ -24,7 +24,7 @@ Note there is no namespace collision with ver 3 --> - + diff --git a/CoreLibs/nbproject/project.properties b/CoreLibs/nbproject/project.properties index 62c4d535e6..13a62b62ee 100644 --- a/CoreLibs/nbproject/project.properties +++ b/CoreLibs/nbproject/project.properties @@ -10,6 +10,7 @@ file.reference.commons-codec-1.10.jar=release/modules/ext/commons-codec-1.10.jar file.reference.commons-collections4-4.1.jar=release/modules/ext/commons-collections4-4.1.jar file.reference.commons-csv-1.4.jar=release/modules/ext/commons-csv-1.4.jar file.reference.commons-io-2.4.jar=release/modules/ext/commons-io-2.4.jar +file.reference.commons-io-2.5.jar=release/modules/ext/commons-io-2.5.jar file.reference.commons-lang-2.6.jar=release/modules/ext/commons-lang-2.6.jar file.reference.commons-lang3-3.0-javadoc.jar=release/modules/ext/commons-lang3-3.0-javadoc.jar file.reference.commons-lang3-3.0-sources.jar=release/modules/ext/commons-lang3-3.0-sources.jar @@ -74,6 +75,7 @@ file.reference.xmlbeans-2.6.0.jar=release/modules/ext/xmlbeans-2.6.0.jar javac.source=1.8 javac.compilerargs=-Xlint -Xlint:-serial javadoc.reference.commons-csv-1.4.jar=release/modules/ext/commons-csv-1.4-javadoc.jar +javadoc.reference.commons-io-2.5.jar=release/modules/ext/commons-io-2.5-javadoc.jar javadoc.reference.compiler-0.9.1.jar=release/modules/ext/compiler-0.9.1-javadoc.jar javadoc.reference.controlsfx-8.40.11.jar=release/modules/ext/controlsfx-8.40.11-javadoc.jar javadoc.reference.guava-19.0.jar=release/modules/ext/guava-19.0-javadoc.jar @@ -82,6 +84,7 @@ javadoc.reference.jfxtras-controls-8.0-r4.jar=release/modules/ext/jfxtras-contro javadoc.reference.jfxtras-fxml-8.0-r4.jar=release/modules/ext/jfxtras-fxml-8.0-r4-javadoc.jar nbm.needs.restart=true source.reference.commons-csv-1.4.jar=release/modules/ext/commons-csv-1.4-sources.jar +source.reference.commons-io-2.5.jar=release/modules/ext/commons-io-2.5-sources.jar source.reference.compiler-0.9.1.jar=release/modules/ext/compiler-0.9.1-sources.jar source.reference.controlsfx-8.40.11.jar=release/modules/ext/controlsfx-8.40.11-sources.jar source.reference.guava-19.0.jar=release/modules/ext/guava-19.0-sources.jar diff --git a/CoreLibs/nbproject/project.xml b/CoreLibs/nbproject/project.xml index 23a41edaf1..6fcef46ccd 100644 --- a/CoreLibs/nbproject/project.xml +++ b/CoreLibs/nbproject/project.xml @@ -699,18 +699,10 @@ ext/sigar-1.6.4.jar release/modules/ext/sigar-1.6.4.jar - - ext/xmlbeans-2.6.0.jar - release/modules/ext/xmlbeans-2.6.0.jar - ext/jna-3.4.0.jar release/modules/ext/jna-3.4.0.jar - - ext/poi-ooxml-schemas-3.15.jar - release/modules/ext/poi-ooxml-schemas-3.15.jar - ext/gson-1.4.jar release/modules/ext/gson-1.4.jar @@ -731,6 +723,10 @@ ext/imgscalr-lib-4.2.jar release/modules/ext/imgscalr-lib-4.2.jar + + ext/xmlbeans-2.6.0.jar + release/modules/ext/xmlbeans-2.6.0.jar + ext/common-io-3.2.jar release/modules/ext/common-io-3.2.jar @@ -764,12 +760,12 @@ release/modules/ext/joda-time-2.4-javadoc.jar - ext/jcalendarbutton-1.4.6.jar - release/modules/ext/jcalendarbutton-1.4.6.jar + ext/poi-excelant-3.15.jar + release/modules/ext/poi-excelant-3.15.jar - ext/poi-ooxml-3.15.jar - release/modules/ext/poi-ooxml-3.15.jar + ext/jcalendarbutton-1.4.6.jar + release/modules/ext/jcalendarbutton-1.4.6.jar ext/imageio-psd-3.2.jar @@ -779,18 +775,10 @@ ext/stax-api-1.0.1.jar release/modules/ext/stax-api-1.0.1.jar - - ext/commons-collections4-4.1.jar - release/modules/ext/commons-collections4-4.1.jar - ext/servlet-api-2.5.jar release/modules/ext/servlet-api-2.5.jar - - ext/poi-excelant-3.15.jar - release/modules/ext/poi-excelant-3.15.jar - ext/imageio-pcx-3.2.jar release/modules/ext/imageio-pcx-3.2.jar @@ -827,10 +815,6 @@ ext/geronimo-jms_1.1_spec-1.0.jar release/modules/ext/geronimo-jms_1.1_spec-1.0.jar - - ext/poi-scratchpad-3.15.jar - release/modules/ext/poi-scratchpad-3.15.jar - ext/joda-time-2.4-sources.jar release/modules/ext/joda-time-2.4-sources.jar @@ -839,14 +823,26 @@ ext/jfxtras-fxml-8.0-r4.jar release/modules/ext/jfxtras-fxml-8.0-r4.jar + + ext/poi-ooxml-3.15.jar + release/modules/ext/poi-ooxml-3.15.jar + ext/joda-time-2.4.jar release/modules/ext/joda-time-2.4.jar + + ext/commons-collections4-4.1.jar + release/modules/ext/commons-collections4-4.1.jar + ext/commons-logging-1.1.2-javadoc.jar release/modules/ext/commons-logging-1.1.2-javadoc.jar + + ext/commons-codec-1.10.jar + release/modules/ext/commons-codec-1.10.jar + ext/slf4j-simple-1.6.1.jar release/modules/ext/slf4j-simple-1.6.1.jar @@ -855,6 +851,18 @@ ext/guava-19.0.jar release/modules/ext/guava-19.0.jar + + ext/commons-io-2.5.jar + release/modules/ext/commons-io-2.5.jar + + + ext/poi-ooxml-schemas-3.15.jar + release/modules/ext/poi-ooxml-schemas-3.15.jar + + + ext/poi-scratchpad-3.15.jar + release/modules/ext/poi-scratchpad-3.15.jar + ext/imageio-bmp-3.2.jar release/modules/ext/imageio-bmp-3.2.jar @@ -879,10 +887,6 @@ ext/ant-1.8.2.jar release/modules/ext/ant-1.8.2.jar - - ext/commons-codec-1.10.jar - release/modules/ext/commons-codec-1.10.jar - ext/javassist-3.12.1.GA.jar release/modules/ext/javassist-3.12.1.GA.jar @@ -895,14 +899,6 @@ ext/commons-logging-1.1.2.jar release/modules/ext/commons-logging-1.1.2.jar - - ext/commons-io-2.4.jar - release/modules/ext/commons-io-2.4.jar - - - ext/poi-3.15.jar - release/modules/ext/poi-3.15.jar - ext/controlsfx-8.40.11.jar release/modules/ext/controlsfx-8.40.11.jar @@ -915,6 +911,10 @@ ext/javaee-api-5.0-2.jar release/modules/ext/javaee-api-5.0-2.jar + + ext/poi-3.15.jar + release/modules/ext/poi-3.15.jar + ext/common-image-3.2.jar release/modules/ext/common-image-3.2.jar From 12f0ca2695a3b5505ab9e8f53878e032ea26b671 Mon Sep 17 00:00:00 2001 From: Eugene Livis Date: Thu, 24 Aug 2017 15:55:29 -0400 Subject: [PATCH 023/104] Reverted code to retry solr core open --- .../autopsy/keywordsearch/Server.java | 81 +++++-------------- 1 file changed, 21 insertions(+), 60 deletions(-) diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Server.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Server.java index 95f44161c6..0ddf15bd67 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Server.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Server.java @@ -189,8 +189,6 @@ public class Server { private static final boolean DEBUG = false;//(Version.getBuildType() == Version.Type.DEVELOPMENT); private static final String SOLR = "solr"; private static final String CORE_PROPERTIES = "core.properties"; - private static final int MAX_NUM_CORE_OPEN_ATTEMPTS = 3; // number of times to attempt loading a Solr core - private static final int TIME_TO_SLEEP_BETWEEN_RETRIES_MILLISECONDS = 10000; // wait 10 seconds before re-trying public enum CORE_EVT_STATES { @@ -646,36 +644,7 @@ public class Server { void openCoreForCase(Case theCase, Index index) throws KeywordSearchModuleException { currentCoreLock.writeLock().lock(); try { - // establish connection to Solr server - connectToServer(theCase.getCaseType()); - - int tryNum = 0; - while (tryNum < MAX_NUM_CORE_OPEN_ATTEMPTS) { - tryNum++; - try { - // open Solr core - currentCore = openCore(theCase.getCaseType(), index); - break; - } catch (KeywordSearchModuleException ex) { - if (tryNum == MAX_NUM_CORE_OPEN_ATTEMPTS) { - throw new KeywordSearchModuleException(NbBundle.getMessage(this.getClass(), "Server.openCore.exception.cantOpen.msg"), ex); - } else { - try { - /* - NOTE: It has been noticed that in rare cases Solr throws an exception - when trying to open a core that is stored on a network drive because - it thinks that some files are missing in the index folder. Same core is observed to - be successfully opened just seconds later by other Autopsy instances. - Therefore a re-try is being added to hopefully mitigate this (see JIRA-2941) - */ - logger.log(Level.WARNING, "Unable to open Solr core in " + index.getIndexPath() + ", re-trying", ex); - Thread.sleep(TIME_TO_SLEEP_BETWEEN_RETRIES_MILLISECONDS); - } catch (InterruptedException ex2) { - logger.log(Level.SEVERE, "Unexpected interrupt while waiting betwen Solr core re-tries", ex2); - } - } - } - } + currentCore = openCore(theCase, index); try { // execute a test query. if it fails, an exception will be thrown @@ -784,7 +753,7 @@ public class Server { /** * Creates/opens a Solr core (index) for a case. * - * @param theCase Type of the current case + * @param theCase The case for which the core is to be created/opened. * @param index The text index that the Solr core should be using. * * @return An object representing the created/opened core. @@ -792,7 +761,21 @@ public class Server { * @throws KeywordSearchModuleException If an error occurs while * creating/opening the core. */ - private Core openCore(CaseType caseType, Index index) throws KeywordSearchModuleException { + private Core openCore(Case theCase, Index index) throws KeywordSearchModuleException { + + try { + if (theCase.getCaseType() == CaseType.SINGLE_USER_CASE) { + currentSolrServer = this.localSolrServer; + } else { + String host = UserPreferences.getIndexingServerHost(); + String port = UserPreferences.getIndexingServerPort(); + currentSolrServer = new HttpSolrServer("http://" + host + ":" + port + "/solr"); //NON-NLS + } + connectToSolrServer(currentSolrServer); + + } catch (SolrServerException | IOException ex) { + throw new KeywordSearchModuleException(NbBundle.getMessage(Server.class, "Server.connect.exception.msg", ex.getLocalizedMessage()), ex); + } try { File dataDir = new File(new File(index.getIndexPath()).getParent()); // "data dir" is the parent of the index directory @@ -815,7 +798,7 @@ public class Server { // In single user mode, if there is a core.properties file already, // we've hit a solr bug. Compensate by deleting it. - if (caseType == CaseType.SINGLE_USER_CASE) { + if (theCase.getCaseType() == CaseType.SINGLE_USER_CASE) { Path corePropertiesFile = Paths.get(solrFolder.toString(), SOLR, coreName, CORE_PROPERTIES); if (corePropertiesFile.toFile().exists()) { try { @@ -839,34 +822,12 @@ public class Server { throw new KeywordSearchModuleException(NbBundle.getMessage(this.getClass(), "Server.openCore.exception.noIndexDir.msg")); } - return new Core(coreName, caseType, index); + return new Core(coreName, theCase.getCaseType(), index); - } catch (Exception ex) { + } catch (SolrServerException | SolrException | IOException ex) { throw new KeywordSearchModuleException(NbBundle.getMessage(this.getClass(), "Server.openCore.exception.cantOpen.msg"), ex); } } - - /** - * Connect to Solr server. - * - * @param caseType Type of the current case - * @throws KeywordSearchModuleException If unable to connect to Solr server - */ - void connectToServer(CaseType caseType) throws KeywordSearchModuleException { - try { - if (caseType == CaseType.SINGLE_USER_CASE) { - currentSolrServer = this.localSolrServer; - } else { - String host = UserPreferences.getIndexingServerHost(); - String port = UserPreferences.getIndexingServerPort(); - currentSolrServer = new HttpSolrServer("http://" + host + ":" + port + "/solr"); //NON-NLS - } - connectToSolrServer(currentSolrServer); - - } catch (SolrServerException | IOException ex) { - throw new KeywordSearchModuleException(NbBundle.getMessage(Server.class, "Server.connect.exception.msg", ex.getLocalizedMessage()), ex); - } - } /** * Commits current core if it exists @@ -1530,4 +1491,4 @@ public class Server { return port; } } -} +} \ No newline at end of file From 8c6bb9bd949ecb17426c73f715c77f94b6a1b1d2 Mon Sep 17 00:00:00 2001 From: Eugene Livis Date: Thu, 24 Aug 2017 16:13:54 -0400 Subject: [PATCH 024/104] Minor --- .../src/org/sleuthkit/autopsy/keywordsearch/Server.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Server.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Server.java index 0ddf15bd67..458f4e6f24 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Server.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Server.java @@ -824,7 +824,7 @@ public class Server { return new Core(coreName, theCase.getCaseType(), index); - } catch (SolrServerException | SolrException | IOException ex) { + } catch (Exception ex) { throw new KeywordSearchModuleException(NbBundle.getMessage(this.getClass(), "Server.openCore.exception.cantOpen.msg"), ex); } } From 4585ee3ac3d090c5071ad2bd8f951335d7618ded Mon Sep 17 00:00:00 2001 From: Eugene Livis Date: Thu, 24 Aug 2017 16:14:30 -0400 Subject: [PATCH 025/104] Minor --- .../src/org/sleuthkit/autopsy/keywordsearch/Server.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Server.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Server.java index 458f4e6f24..c2072cfa54 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Server.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Server.java @@ -1491,4 +1491,4 @@ public class Server { return port; } } -} \ No newline at end of file +} From 27b0575d7d6c2158d2a0b214e3548d83dd4db645 Mon Sep 17 00:00:00 2001 From: Ann Priestman Date: Fri, 25 Aug 2017 10:01:26 -0400 Subject: [PATCH 026/104] Use commit block instead of addBatch --- .../centralrepository/datamodel/AbstractSqlEamDb.java | 11 ++++++++--- .../optionspanel/ImportHashDatabaseDialog.java | 11 +++++++++++ 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/AbstractSqlEamDb.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/AbstractSqlEamDb.java index e6fa8730a7..f4ca260e79 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/AbstractSqlEamDb.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/AbstractSqlEamDb.java @@ -1527,6 +1527,8 @@ public abstract class AbstractSqlEamDb implements EamDb { PreparedStatement bulkPs = null; try { + conn.setAutoCommit(false); + // FUTURE: have a separate global_files table for each Type. String sql = "INSERT INTO %s(reference_set_id, value, known_status, comment) VALUES (?, ?, ?, ?) " + getConflictClause(); @@ -1538,12 +1540,15 @@ public abstract class AbstractSqlEamDb implements EamDb { bulkPs.setString(2, globalInstance.getMD5Hash()); bulkPs.setString(3, globalInstance.getKnownStatus().name()); bulkPs.setString(4, globalInstance.getComment()); - bulkPs.addBatch(); + //bulkPs.addBatch(); + bulkPs.executeUpdate(); } - bulkPs.executeBatch(); + //bulkPs.executeBatch(); + conn.commit(); } catch (SQLException ex) { - throw new EamDbException("Error inserting bulk artifacts.", ex); // NON-NLS + //conn.rollback(); + throw new EamDbException("Error inserting bulk artifacts.", ex); // NON-NLS } finally { EamDbUtil.closePreparedStatement(bulkPs); EamDbUtil.closeConnection(conn); diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ImportHashDatabaseDialog.java b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ImportHashDatabaseDialog.java index 8a7fb4776f..3fb349d91d 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ImportHashDatabaseDialog.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ImportHashDatabaseDialog.java @@ -629,6 +629,7 @@ final class ImportHashDatabaseDialog extends javax.swing.JDialog { } int numLines = 0; + LOGGER.log(Level.INFO, "Starting import: " + numLines); while ((line = reader.readLine()) != null) { progress.progress(++numLines); @@ -646,9 +647,19 @@ final class ImportHashDatabaseDialog extends javax.swing.JDialog { ""); globalInstances.add(eamGlobalFileInstance); + + if(numLines % 10000 == 0){ + dbManager.bulkInsertReferenceTypeEntries(globalInstances, contentType); + globalInstances.clear(); + } + if(numLines % 1000000 == 0){ + LOGGER.log(Level.INFO, "Database entries processed: " + numLines); + } } dbManager.bulkInsertReferenceTypeEntries(globalInstances, contentType); + LOGGER.log(Level.INFO, "Database entries processed: " + numLines); + } } From 2a7ff9cb4ab673338e7f8119f43c53f3730c3d78 Mon Sep 17 00:00:00 2001 From: Ann Priestman Date: Fri, 25 Aug 2017 12:10:43 -0400 Subject: [PATCH 027/104] Testing old method --- .../centralrepository/datamodel/AbstractSqlEamDb.java | 10 +++++----- .../optionspanel/ImportHashDatabaseDialog.java | 2 +- .../org/netbeans/core/startup/Bundle.properties | 2 +- .../netbeans/core/windows/view/ui/Bundle.properties | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/AbstractSqlEamDb.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/AbstractSqlEamDb.java index f4ca260e79..54d46d3c72 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/AbstractSqlEamDb.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/AbstractSqlEamDb.java @@ -1527,7 +1527,7 @@ public abstract class AbstractSqlEamDb implements EamDb { PreparedStatement bulkPs = null; try { - conn.setAutoCommit(false); + //conn.setAutoCommit(false); // FUTURE: have a separate global_files table for each Type. String sql = "INSERT INTO %s(reference_set_id, value, known_status, comment) VALUES (?, ?, ?, ?) " @@ -1540,12 +1540,12 @@ public abstract class AbstractSqlEamDb implements EamDb { bulkPs.setString(2, globalInstance.getMD5Hash()); bulkPs.setString(3, globalInstance.getKnownStatus().name()); bulkPs.setString(4, globalInstance.getComment()); - //bulkPs.addBatch(); - bulkPs.executeUpdate(); + bulkPs.addBatch(); + //bulkPs.executeUpdate(); } - //bulkPs.executeBatch(); - conn.commit(); + bulkPs.executeBatch(); + //conn.commit(); } catch (SQLException ex) { //conn.rollback(); throw new EamDbException("Error inserting bulk artifacts.", ex); // NON-NLS diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ImportHashDatabaseDialog.java b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ImportHashDatabaseDialog.java index 3fb349d91d..9718104048 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ImportHashDatabaseDialog.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ImportHashDatabaseDialog.java @@ -652,7 +652,7 @@ final class ImportHashDatabaseDialog extends javax.swing.JDialog { dbManager.bulkInsertReferenceTypeEntries(globalInstances, contentType); globalInstances.clear(); } - if(numLines % 1000000 == 0){ + if(numLines % 10000 == 0){ LOGGER.log(Level.INFO, "Database entries processed: " + numLines); } } diff --git a/branding/core/core.jar/org/netbeans/core/startup/Bundle.properties b/branding/core/core.jar/org/netbeans/core/startup/Bundle.properties index 9fa4b48338..5b1698042d 100644 --- a/branding/core/core.jar/org/netbeans/core/startup/Bundle.properties +++ b/branding/core/core.jar/org/netbeans/core/startup/Bundle.properties @@ -1,5 +1,5 @@ #Updated by build script -#Thu, 22 Jun 2017 08:50:21 -0400 +#Fri, 25 Aug 2017 12:02:51 -0400 LBL_splash_window_title=Starting Autopsy SPLASH_HEIGHT=314 SPLASH_WIDTH=538 diff --git a/branding/modules/org-netbeans-core-windows.jar/org/netbeans/core/windows/view/ui/Bundle.properties b/branding/modules/org-netbeans-core-windows.jar/org/netbeans/core/windows/view/ui/Bundle.properties index 9207917601..08d7219915 100644 --- a/branding/modules/org-netbeans-core-windows.jar/org/netbeans/core/windows/view/ui/Bundle.properties +++ b/branding/modules/org-netbeans-core-windows.jar/org/netbeans/core/windows/view/ui/Bundle.properties @@ -1,4 +1,4 @@ #Updated by build script -#Thu, 22 Jun 2017 08:50:21 -0400 +#Fri, 25 Aug 2017 12:02:51 -0400 CTL_MainWindow_Title=Autopsy 4.4.1 CTL_MainWindow_Title_No_Project=Autopsy 4.4.1 From 04fcee7dbf6f1541470ce277843f5acbd53a13fb Mon Sep 17 00:00:00 2001 From: esaunders Date: Mon, 28 Aug 2017 14:09:13 -0400 Subject: [PATCH 028/104] Listeners now only register for event types they are interested in. --- .../sleuthkit/autopsy/casemodule/Case.java | 32 +++++- .../autopsy/casemodule/CaseDeleteAction.java | 3 +- .../casemodule/CasePropertiesAction.java | 3 +- .../casemodule/CollaborationMonitor.java | 10 +- .../autopsy/coreutils/ImageUtils.java | 3 +- .../datamodel/AbstractAbstractFileNode.java | 18 +++- .../datamodel/BlackboardArtifactNode.java | 18 ++-- .../autopsy/datamodel/DataSourcesNode.java | 5 +- .../autopsy/datamodel/DeletedContent.java | 100 ++++++++++-------- .../autopsy/datamodel/EmailExtracted.java | 5 +- .../autopsy/datamodel/ExtractedContent.java | 8 +- .../sleuthkit/autopsy/datamodel/FileSize.java | 85 +++++++-------- .../datamodel/FileTypesByExtension.java | 12 +-- .../datamodel/FileTypesByMimeType.java | 9 +- .../autopsy/datamodel/HashsetHits.java | 5 +- .../autopsy/datamodel/ImageNode.java | 5 +- .../autopsy/datamodel/InterestingHits.java | 96 ++++++++--------- .../autopsy/datamodel/KeywordHits.java | 5 +- .../sleuthkit/autopsy/datamodel/Reports.java | 6 +- .../org/sleuthkit/autopsy/datamodel/Tags.java | 11 +- .../autopsy/datamodel/VolumeNode.java | 5 +- .../autopsy/datamodel/accounts/Accounts.java | 5 +- .../DirectoryTreeTopComponent.java | 3 +- .../autopsy/filesearch/DateSearchFilter.java | 6 +- .../autopsy/filesearch/FileSearchAction.java | 12 +-- .../autopsy/ingest/IngestManager.java | 3 +- .../autopsy/ingest/IngestMessagesToolbar.java | 3 +- .../autopsy/ingest/IngestMonitor.java | 3 +- .../hashdatabase/HashDbPanelSearchAction.java | 12 +-- .../autopsy/report/ReportWizardAction.java | 3 +- .../keywordsearch/DropdownToolbar.java | 3 +- 31 files changed, 284 insertions(+), 213 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/Case.java b/Core/src/org/sleuthkit/autopsy/casemodule/Case.java index 340d847343..c05256dcce 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/Case.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/Case.java @@ -35,6 +35,7 @@ import java.sql.Statement; import java.text.SimpleDateFormat; import java.util.Collection; import java.util.Date; +import java.util.EnumSet; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -50,6 +51,7 @@ import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.ThreadFactory; import java.util.concurrent.TimeUnit; +import java.util.function.Consumer; import java.util.logging.Level; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -377,7 +379,9 @@ public class Case { * * @param eventNames The events the subscriber is interested in. * @param subscriber The subscriber (PropertyChangeListener) to add. + * @deprecated Use addEventTypeSubscriber instead. */ + @Deprecated public static void addEventSubscriber(Set eventNames, PropertyChangeListener subscriber) { eventPublisher.addSubscriber(eventNames, subscriber); } @@ -385,9 +389,23 @@ public class Case { /** * Adds a subscriber to specific case events. * - * @param eventName The event the subscriber is interested in. + * @param eventTypes The events the subscriber is interested in. * @param subscriber The subscriber (PropertyChangeListener) to add. */ + public static void addEventTypeSubscriber(Set eventTypes, PropertyChangeListener subscriber) { + eventTypes.forEach((Events event) -> { + eventPublisher.addSubscriber(event.toString(), subscriber); + }); + } + + /** + * Adds a subscriber to specific case events. + * + * @param eventName The event the subscriber is interested in. + * @param subscriber The subscriber (PropertyChangeListener) to add. + * @deprecated Use addEventTypeSubscriber instead. + */ + @Deprecated public static void addEventSubscriber(String eventName, PropertyChangeListener subscriber) { eventPublisher.addSubscriber(eventName, subscriber); } @@ -412,6 +430,18 @@ public class Case { eventPublisher.removeSubscriber(eventNames, subscriber); } + /** + * Removes a subscriber to specific case events. + * + * @param eventTypes The events the subscriber is no longer interested in. + * @param subscriber The subscriber (PropertyChangeListener) to remove. + */ + public static void removeEventTypeSubscriber(Set eventTypes, PropertyChangeListener subscriber) { + eventTypes.forEach((Events event) -> { + eventPublisher.removeSubscriber(event.toString(), subscriber); + }); + } + /** * Checks if a case display name is valid, i.e., does not include any * characters that cannot be used in file names. diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/CaseDeleteAction.java b/Core/src/org/sleuthkit/autopsy/casemodule/CaseDeleteAction.java index 2df3bfcc33..3ef30f2594 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/CaseDeleteAction.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/CaseDeleteAction.java @@ -20,6 +20,7 @@ package org.sleuthkit.autopsy.casemodule; import java.awt.event.ActionEvent; import java.beans.PropertyChangeEvent; +import java.util.EnumSet; import java.util.concurrent.ExecutionException; import java.util.logging.Level; import javax.swing.Action; @@ -49,7 +50,7 @@ final class CaseDeleteAction extends CallableSystemAction { CaseDeleteAction() { putValue(Action.NAME, NbBundle.getMessage(CaseDeleteAction.class, "CTL_CaseDeleteAction")); this.setEnabled(false); - Case.addEventSubscriber(Case.Events.CURRENT_CASE.toString(), (PropertyChangeEvent evt) -> { + Case.addEventTypeSubscriber(EnumSet.of(Case.Events.CURRENT_CASE), (PropertyChangeEvent evt) -> { setEnabled(null != evt.getNewValue() && UserPreferences.getMode() != UserPreferences.SelectedMode.REVIEW); }); } diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesAction.java b/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesAction.java index 7cd6a93b10..c50c561564 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesAction.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesAction.java @@ -22,6 +22,7 @@ import java.awt.Dimension; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.beans.PropertyChangeEvent; +import java.util.EnumSet; import javax.swing.Action; import javax.swing.JDialog; import javax.swing.SwingUtilities; @@ -42,7 +43,7 @@ final class CasePropertiesAction extends CallableSystemAction { CasePropertiesAction() { putValue(Action.NAME, NbBundle.getMessage(CasePropertiesAction.class, "CTL_CasePropertiesAction")); this.setEnabled(false); - Case.addEventSubscriber(Case.Events.CURRENT_CASE.toString(), (PropertyChangeEvent evt) -> { + Case.addEventTypeSubscriber(EnumSet.of(Case.Events.CURRENT_CASE), (PropertyChangeEvent evt) -> { setEnabled(null != evt.getNewValue()); }); } diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/CollaborationMonitor.java b/Core/src/org/sleuthkit/autopsy/casemodule/CollaborationMonitor.java index 6042c24d12..ab55b67c5b 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/CollaborationMonitor.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/CollaborationMonitor.java @@ -24,9 +24,8 @@ import java.beans.PropertyChangeListener; import java.io.Serializable; import java.time.Duration; import java.time.Instant; -import java.util.Arrays; +import java.util.EnumSet; import java.util.HashMap; -import java.util.HashSet; import java.util.Iterator; import java.util.Map; import java.util.Set; @@ -57,7 +56,8 @@ final class CollaborationMonitor { private static final String EVENT_CHANNEL_NAME = "%s-Collaboration-Monitor-Events"; //NON-NLS private static final String COLLABORATION_MONITOR_EVENT = "COLLABORATION_MONITOR_EVENT"; //NON-NLS - private static final Set CASE_EVENTS_OF_INTEREST = new HashSet<>(Arrays.asList(new String[]{Case.Events.ADDING_DATA_SOURCE.toString(), Case.Events.DATA_SOURCE_ADDED.toString(), Case.Events.ADDING_DATA_SOURCE_FAILED.toString()})); + private static final Set CASE_EVENTS_OF_INTEREST = EnumSet.of(Case.Events.ADDING_DATA_SOURCE, + Case.Events.DATA_SOURCE_ADDED, Case.Events.ADDING_DATA_SOURCE_FAILED); private static final int NUMBER_OF_PERIODIC_TASK_THREADS = 2; private static final String PERIODIC_TASK_THREAD_NAME = "collab-monitor-periodic-tasks-%d"; //NON-NLS private static final long HEARTBEAT_INTERVAL_MINUTES = 1; @@ -113,7 +113,7 @@ final class CollaborationMonitor { */ localTasksManager = new LocalTasksManager(); IngestManager.getInstance().addIngestJobEventListener(localTasksManager); - Case.addEventSubscriber(CASE_EVENTS_OF_INTEREST, localTasksManager); + Case.addEventTypeSubscriber(CASE_EVENTS_OF_INTEREST, localTasksManager); /** * Start periodic tasks that: @@ -141,7 +141,7 @@ final class CollaborationMonitor { } } - Case.removeEventSubscriber(CASE_EVENTS_OF_INTEREST, localTasksManager); + Case.removeEventTypeSubscriber(CASE_EVENTS_OF_INTEREST, localTasksManager); IngestManager.getInstance().removeIngestJobEventListener(localTasksManager); if (null != eventPublisher) { diff --git a/Core/src/org/sleuthkit/autopsy/coreutils/ImageUtils.java b/Core/src/org/sleuthkit/autopsy/coreutils/ImageUtils.java index eb6a16e6e0..eabc56e3bd 100755 --- a/Core/src/org/sleuthkit/autopsy/coreutils/ImageUtils.java +++ b/Core/src/org/sleuthkit/autopsy/coreutils/ImageUtils.java @@ -35,6 +35,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; +import java.util.EnumSet; import java.util.Iterator; import java.util.List; import static java.util.Objects.nonNull; @@ -153,7 +154,7 @@ public class ImageUtils { SUPPORTED_IMAGE_MIME_TYPES.removeIf("application/octet-stream"::equals); //NON-NLS //Clear the file map when the case changes, so we don't accidentaly get images from the old case. - Case.addEventSubscriber(Case.Events.CURRENT_CASE.toString(), evt -> cacheFileMap.clear()); + Case.addEventTypeSubscriber(EnumSet.of(Case.Events.CURRENT_CASE), evt -> cacheFileMap.clear()); } /** diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/AbstractAbstractFileNode.java b/Core/src/org/sleuthkit/autopsy/datamodel/AbstractAbstractFileNode.java index e3c750826d..f3e08622d5 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/AbstractAbstractFileNode.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/AbstractAbstractFileNode.java @@ -21,9 +21,11 @@ package org.sleuthkit.autopsy.datamodel; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.ArrayList; +import java.util.EnumSet; import java.util.List; import org.openide.nodes.Children; import java.util.Map; +import java.util.Set; import java.util.logging.Level; import java.util.stream.Collectors; import org.apache.commons.lang3.StringUtils; @@ -49,6 +51,9 @@ public abstract class AbstractAbstractFileNode extends A private static final Logger LOGGER = Logger.getLogger(AbstractAbstractFileNode.class.getName()); + private static final Set CASE_EVENTS_OF_INTEREST = EnumSet.of(Case.Events.CURRENT_CASE, + Case.Events.CONTENT_TAG_ADDED, Case.Events.CONTENT_TAG_DELETED); + /** * @param type of the AbstractFile data to encapsulate * @param abstractFile file to encapsulate @@ -68,13 +73,14 @@ public abstract class AbstractAbstractFileNode extends A } } } - // Listen for case events so that we can detect when case is closed - Case.addPropertyChangeListener(pcl); + // Listen for case events so that we can detect when the case is closed + // or when tags are added. + Case.addEventTypeSubscriber(CASE_EVENTS_OF_INTEREST, pcl); } private void removeListeners() { IngestManager.getInstance().removeIngestModuleEventListener(pcl); - Case.removePropertyChangeListener(pcl); + Case.removeEventTypeSubscriber(CASE_EVENTS_OF_INTEREST, pcl); } private final PropertyChangeListener pcl = (PropertyChangeEvent evt) -> { @@ -96,7 +102,11 @@ public abstract class AbstractAbstractFileNode extends A // If so, refresh our children. try { Children parentsChildren = getParentNode().getChildren(); - if (parentsChildren != null) { + // We only want to refresh our parents children if we are in the + // data sources branch of the tree. The parent nodes in other + // branches of the tree (e.g. File Types and Deleted Files) do + // not need to be refreshed. + if (parentsChildren instanceof ContentChildren) { ((ContentChildren) parentsChildren).refreshChildren(); parentsChildren.getNodesCount(); } diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/BlackboardArtifactNode.java b/Core/src/org/sleuthkit/autopsy/datamodel/BlackboardArtifactNode.java index 47870bb9bf..2bda34f1c1 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/BlackboardArtifactNode.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/BlackboardArtifactNode.java @@ -25,6 +25,7 @@ import java.beans.PropertyChangeListener; import java.text.MessageFormat; import java.util.ArrayList; import java.util.Arrays; +import java.util.EnumSet; import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; @@ -67,13 +68,10 @@ import org.sleuthkit.datamodel.TskCoreException; public class BlackboardArtifactNode extends DisplayableItemNode { private static final Logger LOGGER = Logger.getLogger(BlackboardArtifactNode.class.getName()); - private static final Set CASE_EVENTS_OF_INTEREST = new HashSet<>(Arrays.asList(new String[]{ - Case.Events.BLACKBOARD_ARTIFACT_TAG_ADDED.toString(), - Case.Events.BLACKBOARD_ARTIFACT_TAG_DELETED.toString(), - Case.Events.CONTENT_TAG_ADDED.toString(), - Case.Events.CONTENT_TAG_DELETED.toString(), - Case.Events.CURRENT_CASE.toString() - })); + private static final Set CASE_EVENTS_OF_INTEREST = EnumSet.of(Case.Events.BLACKBOARD_ARTIFACT_TAG_ADDED, + Case.Events.BLACKBOARD_ARTIFACT_TAG_DELETED, + Case.Events.CONTENT_TAG_ADDED, + Case.Events.CONTENT_TAG_DELETED); private static Cache contentCache = CacheBuilder.newBuilder() .expireAfterWrite(1, TimeUnit.MINUTES). @@ -148,7 +146,7 @@ public class BlackboardArtifactNode extends DisplayableItemNode { this.setName(Long.toString(artifact.getArtifactID())); this.setDisplayName(); this.setIconBaseWithExtension(iconPath); - Case.addEventSubscriber(CASE_EVENTS_OF_INTEREST, WeakListeners.propertyChange(pcl, null)); + Case.addEventTypeSubscriber(CASE_EVENTS_OF_INTEREST, WeakListeners.propertyChange(pcl, null)); } /** @@ -165,11 +163,11 @@ public class BlackboardArtifactNode extends DisplayableItemNode { this.setName(Long.toString(artifact.getArtifactID())); this.setDisplayName(); this.setIconBaseWithExtension(ExtractedContent.getIconFilePath(artifact.getArtifactTypeID())); //NON-NLS - Case.addEventSubscriber(CASE_EVENTS_OF_INTEREST, WeakListeners.propertyChange(pcl, null)); + Case.addEventTypeSubscriber(CASE_EVENTS_OF_INTEREST, WeakListeners.propertyChange(pcl, null)); } private void removeListeners() { - Case.removeEventSubscriber(CASE_EVENTS_OF_INTEREST, pcl); + Case.removeEventTypeSubscriber(CASE_EVENTS_OF_INTEREST, pcl); } @Override diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/DataSourcesNode.java b/Core/src/org/sleuthkit/autopsy/datamodel/DataSourcesNode.java index 7ac9e37398..43ddd069a3 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/DataSourcesNode.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/DataSourcesNode.java @@ -22,6 +22,7 @@ import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.ArrayList; import java.util.Collections; +import java.util.EnumSet; import java.util.List; import java.util.logging.Level; import org.openide.nodes.Sheet; @@ -88,13 +89,13 @@ public class DataSourcesNode extends DisplayableItemNode { @Override protected void addNotify() { - Case.addPropertyChangeListener(pcl); + Case.addEventTypeSubscriber(EnumSet.of(Case.Events.DATA_SOURCE_ADDED), pcl); reloadKeys(); } @Override protected void removeNotify() { - Case.removePropertyChangeListener(pcl); + Case.removeEventTypeSubscriber(EnumSet.of(Case.Events.DATA_SOURCE_ADDED), pcl); currentKeys.clear(); setKeys(Collections.emptySet()); } diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/DeletedContent.java b/Core/src/org/sleuthkit/autopsy/datamodel/DeletedContent.java index 9c738fb3ed..335a04930d 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/DeletedContent.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/DeletedContent.java @@ -22,10 +22,15 @@ import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.ArrayList; import java.util.Arrays; +import java.util.EnumSet; +import java.util.HashSet; import java.util.List; import java.util.Observable; import java.util.Observer; +import java.util.Set; import java.util.logging.Level; +import java.util.stream.Collectors; +import java.util.stream.Stream; import javax.swing.JOptionPane; import javax.swing.SwingUtilities; import org.openide.nodes.AbstractNode; @@ -172,68 +177,69 @@ public class DeletedContent implements AutopsyVisitableItem { * Listens for case and ingest invest. Updates observers when events are * fired. Other nodes are listening to this for changes. */ - private final class DeletedContentsChildrenObservable extends Observable { + private static final class DeletedContentsChildrenObservable extends Observable { + private static final Set CASE_EVENTS_OF_INTEREST = EnumSet.of( + Case.Events.DATA_SOURCE_ADDED, + Case.Events.CURRENT_CASE + ); DeletedContentsChildrenObservable() { IngestManager.getInstance().addIngestJobEventListener(pcl); IngestManager.getInstance().addIngestModuleEventListener(pcl); - Case.addPropertyChangeListener(pcl); + Case.addEventTypeSubscriber(CASE_EVENTS_OF_INTEREST, pcl); } private void removeListeners() { deleteObservers(); IngestManager.getInstance().removeIngestJobEventListener(pcl); IngestManager.getInstance().removeIngestModuleEventListener(pcl); - Case.removePropertyChangeListener(pcl); + Case.removeEventTypeSubscriber(CASE_EVENTS_OF_INTEREST, pcl); } - private final PropertyChangeListener pcl = new PropertyChangeListener() { - @Override - public void propertyChange(PropertyChangeEvent evt) { - String eventType = evt.getPropertyName(); - if (eventType.equals(IngestManager.IngestModuleEvent.CONTENT_CHANGED.toString())) { + private final PropertyChangeListener pcl = (PropertyChangeEvent evt) -> { + String eventType = evt.getPropertyName(); + if (eventType.equals(IngestManager.IngestModuleEvent.CONTENT_CHANGED.toString())) { + /** + * + // @@@ COULD CHECK If the new file is deleted + * before notifying... Checking for a current case is a + * stop gap measure + update(); until a different way of + * handling the closing of cases is worked out. + * Currently, remote events may be received for a case + * that is already closed. + */ + try { + Case.getCurrentCase(); + // new file was added + // @@@ COULD CHECK If the new file is deleted before notifying... + update(); + } catch (IllegalStateException notUsed) { /** - * + // @@@ COULD CHECK If the new file is deleted - * before notifying... Checking for a current case is a - * stop gap measure + update(); until a different way of - * handling the closing of cases is worked out. - * Currently, remote events may be received for a case - * that is already closed. + * Case is closed, do nothing. */ - try { - Case.getCurrentCase(); - // new file was added - // @@@ COULD CHECK If the new file is deleted before notifying... - update(); - } catch (IllegalStateException notUsed) { - /** - * Case is closed, do nothing. - */ - } - } else if (eventType.equals(IngestManager.IngestJobEvent.COMPLETED.toString()) - || eventType.equals(IngestManager.IngestJobEvent.CANCELLED.toString()) - || eventType.equals(Case.Events.DATA_SOURCE_ADDED.toString())) { - /** - * Checking for a current case is a stop gap measure - * until a different way of handling the closing of - * cases is worked out. Currently, remote events may be - * received for a case that is already closed. - */ - try { - Case.getCurrentCase(); - update(); - } catch (IllegalStateException notUsed) { - /** - * Case is closed, do nothing. - */ - } - } else if (eventType.equals(Case.Events.CURRENT_CASE.toString())) { - // case was closed. Remove listeners so that we don't get called with a stale case handle - if (evt.getNewValue() == null) { - removeListeners(); - } - maxFilesDialogShown = false; } + } else if (eventType.equals(IngestManager.IngestJobEvent.COMPLETED.toString()) + || eventType.equals(IngestManager.IngestJobEvent.CANCELLED.toString()) + || eventType.equals(Case.Events.DATA_SOURCE_ADDED.toString())) { + /** + * Checking for a current case is a stop gap measure + * until a different way of handling the closing of + * cases is worked out. Currently, remote events may be + * received for a case that is already closed. + */ + try { + Case.getCurrentCase(); + update(); + } catch (IllegalStateException notUsed) { + /** + * Case is closed, do nothing. + */ + } + } else if (eventType.equals(Case.Events.CURRENT_CASE.toString())) { + // case was closed. Remove listeners so that we don't get called with a stale case handle + if (evt.getNewValue() == null) { + removeListeners(); + } + maxFilesDialogShown = false; } }; diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/EmailExtracted.java b/Core/src/org/sleuthkit/autopsy/datamodel/EmailExtracted.java index ca4602e30a..4f1e190f4b 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/EmailExtracted.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/EmailExtracted.java @@ -23,6 +23,7 @@ import java.beans.PropertyChangeListener; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; +import java.util.EnumSet; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; @@ -285,7 +286,7 @@ public class EmailExtracted implements AutopsyVisitableItem { protected void addNotify() { IngestManager.getInstance().addIngestJobEventListener(pcl); IngestManager.getInstance().addIngestModuleEventListener(pcl); - Case.addPropertyChangeListener(pcl); + Case.addEventTypeSubscriber(EnumSet.of(Case.Events.CURRENT_CASE), pcl); emailResults.update(); emailResults.addObserver(this); } @@ -294,7 +295,7 @@ public class EmailExtracted implements AutopsyVisitableItem { protected void removeNotify() { IngestManager.getInstance().removeIngestJobEventListener(pcl); IngestManager.getInstance().removeIngestModuleEventListener(pcl); - Case.removePropertyChangeListener(pcl); + Case.removeEventTypeSubscriber(EnumSet.of(Case.Events.CURRENT_CASE), pcl); emailResults.deleteObserver(this); } diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/ExtractedContent.java b/Core/src/org/sleuthkit/autopsy/datamodel/ExtractedContent.java index 896cec5322..34dc9bf517 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/ExtractedContent.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/ExtractedContent.java @@ -23,8 +23,10 @@ import java.beans.PropertyChangeListener; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; +import java.util.EnumSet; import java.util.HashMap; import java.util.List; +import java.util.Set; import java.util.logging.Level; import org.openide.nodes.ChildFactory; import org.openide.nodes.Children; @@ -251,14 +253,14 @@ public class ExtractedContent implements AutopsyVisitableItem { protected void addNotify() { IngestManager.getInstance().addIngestJobEventListener(pcl); IngestManager.getInstance().addIngestModuleEventListener(pcl); - Case.addPropertyChangeListener(pcl); + Case.addEventTypeSubscriber(EnumSet.of(Case.Events.CURRENT_CASE), pcl); } @Override protected void removeNotify() { IngestManager.getInstance().removeIngestJobEventListener(pcl); IngestManager.getInstance().removeIngestModuleEventListener(pcl); - Case.removePropertyChangeListener(pcl); + Case.removeEventTypeSubscriber(EnumSet.of(Case.Events.CURRENT_CASE), pcl); typeNodeList.clear(); } @@ -309,7 +311,7 @@ public class ExtractedContent implements AutopsyVisitableItem { */ public class TypeNode extends DisplayableItemNode { - private BlackboardArtifact.Type type; + private final BlackboardArtifact.Type type; private long childCount = 0; TypeNode(BlackboardArtifact.Type type) { diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/FileSize.java b/Core/src/org/sleuthkit/autopsy/datamodel/FileSize.java index 19fd4659e8..bc515b6d29 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/FileSize.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/FileSize.java @@ -22,9 +22,11 @@ import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.ArrayList; import java.util.Arrays; +import java.util.EnumSet; import java.util.List; import java.util.Observable; import java.util.Observer; +import java.util.Set; import java.util.logging.Level; import org.openide.nodes.AbstractNode; import org.openide.nodes.ChildFactory; @@ -168,65 +170,64 @@ public class FileSize implements AutopsyVisitableItem { * Listens for case and ingest invest. Updates observers when events are * fired. Size-based nodes are listening to this for changes. */ - private final class FileSizeRootChildrenObservable extends Observable { + private static final class FileSizeRootChildrenObservable extends Observable { + + private static final Set CASE_EVENTS_OF_INTEREST = EnumSet.of(Case.Events.DATA_SOURCE_ADDED, Case.Events.CURRENT_CASE); FileSizeRootChildrenObservable() { IngestManager.getInstance().addIngestJobEventListener(pcl); IngestManager.getInstance().addIngestModuleEventListener(pcl); - Case.addPropertyChangeListener(pcl); + Case.addEventTypeSubscriber(CASE_EVENTS_OF_INTEREST, pcl); } private void removeListeners() { deleteObservers(); IngestManager.getInstance().removeIngestJobEventListener(pcl); IngestManager.getInstance().removeIngestModuleEventListener(pcl); - Case.removePropertyChangeListener(pcl); + Case.removeEventTypeSubscriber(CASE_EVENTS_OF_INTEREST, pcl); } - private final PropertyChangeListener pcl = new PropertyChangeListener() { - @Override - public void propertyChange(PropertyChangeEvent evt) { - String eventType = evt.getPropertyName(); + private final PropertyChangeListener pcl = (PropertyChangeEvent evt) -> { + String eventType = evt.getPropertyName(); - if (eventType.equals(IngestManager.IngestModuleEvent.CONTENT_CHANGED.toString())) { + if (eventType.equals(IngestManager.IngestModuleEvent.CONTENT_CHANGED.toString())) { + /** + * Checking for a current case is a stop gap measure until a + * different way of handling the closing of cases is worked + * out. Currently, remote events may be received for a case + * that is already closed. + */ + try { + // new file was added + // @@@ could check the size here and only fire off updates if we know the file meets the min size criteria + Case.getCurrentCase(); + update(); + } catch (IllegalStateException notUsed) { /** - * Checking for a current case is a stop gap measure - * until a different way of handling the closing of - * cases is worked out. Currently, remote events may be - * received for a case that is already closed. + * Case is closed, do nothing. */ - try { - // new file was added - // @@@ could check the size here and only fire off updates if we know the file meets the min size criteria - Case.getCurrentCase(); - update(); - } catch (IllegalStateException notUsed) { - /** - * Case is closed, do nothing. - */ - } - } else if (eventType.equals(IngestManager.IngestJobEvent.COMPLETED.toString()) - || eventType.equals(IngestManager.IngestJobEvent.CANCELLED.toString()) - || eventType.equals(Case.Events.DATA_SOURCE_ADDED.toString())) { + } + } else if (eventType.equals(IngestManager.IngestJobEvent.COMPLETED.toString()) + || eventType.equals(IngestManager.IngestJobEvent.CANCELLED.toString()) + || eventType.equals(Case.Events.DATA_SOURCE_ADDED.toString())) { + /** + * Checking for a current case is a stop gap measure until a + * different way of handling the closing of cases is worked + * out. Currently, remote events may be received for a case + * that is already closed. + */ + try { + Case.getCurrentCase(); + update(); + } catch (IllegalStateException notUsed) { /** - * Checking for a current case is a stop gap measure - * until a different way of handling the closing of - * cases is worked out. Currently, remote events may be - * received for a case that is already closed. + * Case is closed, do nothing. */ - try { - Case.getCurrentCase(); - update(); - } catch (IllegalStateException notUsed) { - /** - * Case is closed, do nothing. - */ - } - } else if (eventType.equals(Case.Events.CURRENT_CASE.toString())) { - // case was closed. Remove listeners so that we don't get called with a stale case handle - if (evt.getNewValue() == null) { - removeListeners(); - } + } + } else if (eventType.equals(Case.Events.CURRENT_CASE.toString())) { + // case was closed. Remove listeners so that we don't get called with a stale case handle + if (evt.getNewValue() == null) { + removeListeners(); } } }; diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/FileTypesByExtension.java b/Core/src/org/sleuthkit/autopsy/datamodel/FileTypesByExtension.java index 2e1fba50cc..1f109bd8d5 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/FileTypesByExtension.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/FileTypesByExtension.java @@ -21,10 +21,11 @@ package org.sleuthkit.autopsy.datamodel; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.Arrays; +import java.util.EnumSet; import java.util.List; import java.util.Observable; import java.util.Observer; -import java.util.function.Function; +import java.util.Set; import java.util.logging.Level; import java.util.stream.Collectors; import org.apache.commons.lang.StringUtils; @@ -39,8 +40,6 @@ import org.sleuthkit.autopsy.core.UserPreferences; import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.datamodel.FileTypes.FileTypesKey; import org.sleuthkit.autopsy.ingest.IngestManager; -import org.sleuthkit.datamodel.AbstractFile; -import org.sleuthkit.datamodel.Content; import org.sleuthkit.datamodel.SleuthkitCase; import org.sleuthkit.datamodel.TskCoreException; import org.sleuthkit.datamodel.TskData; @@ -75,9 +74,11 @@ public final class FileTypesByExtension implements AutopsyVisitableItem { private class FileTypesByExtObservable extends Observable { private final PropertyChangeListener pcl; + private final Set CASE_EVENTS_OF_INTEREST; private FileTypesByExtObservable() { super(); + this.CASE_EVENTS_OF_INTEREST = EnumSet.of(Case.Events.DATA_SOURCE_ADDED, Case.Events.CURRENT_CASE); this.pcl = (PropertyChangeEvent evt) -> { String eventType = evt.getPropertyName(); if (eventType.equals(IngestManager.IngestModuleEvent.CONTENT_CHANGED.toString()) @@ -109,15 +110,14 @@ public final class FileTypesByExtension implements AutopsyVisitableItem { IngestManager.getInstance().addIngestJobEventListener(pcl); IngestManager.getInstance().addIngestModuleEventListener(pcl); - Case.addPropertyChangeListener(pcl); - + Case.addEventTypeSubscriber(CASE_EVENTS_OF_INTEREST, pcl); } private void removeListeners() { deleteObservers(); IngestManager.getInstance().removeIngestJobEventListener(pcl); IngestManager.getInstance().removeIngestModuleEventListener(pcl); - Case.removePropertyChangeListener(pcl); + Case.removeEventTypeSubscriber(CASE_EVENTS_OF_INTEREST, pcl); } private void update() { diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/FileTypesByMimeType.java b/Core/src/org/sleuthkit/autopsy/datamodel/FileTypesByMimeType.java index e5bd41b6e8..9fe183a8a8 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/FileTypesByMimeType.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/FileTypesByMimeType.java @@ -24,11 +24,13 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.Collections; +import java.util.EnumSet; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Observable; import java.util.Observer; +import java.util.Set; import java.util.logging.Level; import java.util.stream.Collectors; import org.apache.commons.lang3.StringUtils; @@ -44,7 +46,6 @@ import static org.sleuthkit.autopsy.core.UserPreferences.hideSlackFilesInViewsTr import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.datamodel.FileTypes.FileTypesKey; import org.sleuthkit.autopsy.ingest.IngestManager; -import org.sleuthkit.datamodel.Content; import org.sleuthkit.datamodel.SleuthkitCase; import org.sleuthkit.datamodel.TskCoreException; import org.sleuthkit.datamodel.TskData; @@ -79,6 +80,8 @@ public final class FileTypesByMimeType extends Observable implements AutopsyVisi */ private final PropertyChangeListener pcl; + private static final Set CASE_EVENTS_OF_INTEREST = EnumSet.of(Case.Events.DATA_SOURCE_ADDED, Case.Events.CURRENT_CASE); + /** * Create the base expression used as the where clause in the queries for * files by mime type. Filters out certain kinds of files and directories, @@ -102,7 +105,7 @@ public final class FileTypesByMimeType extends Observable implements AutopsyVisi private void removeListeners() { deleteObservers(); IngestManager.getInstance().removeIngestJobEventListener(pcl); - Case.removePropertyChangeListener(pcl); + Case.removeEventTypeSubscriber(CASE_EVENTS_OF_INTEREST, pcl); } /** @@ -175,7 +178,7 @@ public final class FileTypesByMimeType extends Observable implements AutopsyVisi } }; IngestManager.getInstance().addIngestJobEventListener(pcl); - Case.addPropertyChangeListener(pcl); + Case.addEventTypeSubscriber(CASE_EVENTS_OF_INTEREST, pcl); populateHashMap(); } diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/HashsetHits.java b/Core/src/org/sleuthkit/autopsy/datamodel/HashsetHits.java index 2665894481..df3d239aef 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/HashsetHits.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/HashsetHits.java @@ -24,6 +24,7 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.Collections; +import java.util.EnumSet; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashMap; @@ -252,7 +253,7 @@ public class HashsetHits implements AutopsyVisitableItem { protected void addNotify() { IngestManager.getInstance().addIngestJobEventListener(pcl); IngestManager.getInstance().addIngestModuleEventListener(pcl); - Case.addPropertyChangeListener(pcl); + Case.addEventTypeSubscriber(EnumSet.of(Case.Events.CURRENT_CASE), pcl); hashsetResults.update(); hashsetResults.addObserver(this); } @@ -261,7 +262,7 @@ public class HashsetHits implements AutopsyVisitableItem { protected void removeNotify() { IngestManager.getInstance().removeIngestJobEventListener(pcl); IngestManager.getInstance().removeIngestModuleEventListener(pcl); - Case.removePropertyChangeListener(pcl); + Case.removeEventTypeSubscriber(EnumSet.of(Case.Events.CURRENT_CASE), pcl); hashsetResults.deleteObserver(this); } diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/ImageNode.java b/Core/src/org/sleuthkit/autopsy/datamodel/ImageNode.java index 682a3fa225..4efe1db364 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/ImageNode.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/ImageNode.java @@ -24,6 +24,7 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.Collections; +import java.util.EnumSet; import java.util.List; import java.util.logging.Level; import javax.swing.Action; @@ -79,12 +80,12 @@ public class ImageNode extends AbstractContentNode { // Listen for ingest events so that we can detect new added files (e.g. carved) IngestManager.getInstance().addIngestModuleEventListener(pcl); // Listen for case events so that we can detect when case is closed - Case.addPropertyChangeListener(pcl); + Case.addEventTypeSubscriber(EnumSet.of(Case.Events.CURRENT_CASE), pcl); } private void removeListeners() { IngestManager.getInstance().removeIngestModuleEventListener(pcl); - Case.removePropertyChangeListener(pcl); + Case.removeEventTypeSubscriber(EnumSet.of(Case.Events.CURRENT_CASE), pcl); } /** diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/InterestingHits.java b/Core/src/org/sleuthkit/autopsy/datamodel/InterestingHits.java index d9fecdcdb2..7a0b6b9ad9 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/InterestingHits.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/InterestingHits.java @@ -24,6 +24,7 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.Collections; +import java.util.EnumSet; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashMap; @@ -188,57 +189,54 @@ public class InterestingHits implements AutopsyVisitableItem { * nice methods for its startup and shutdown, so it seemed like a * cleaner place to register the property change listener. */ - private final PropertyChangeListener pcl = new PropertyChangeListener() { - @Override - public void propertyChange(PropertyChangeEvent evt) { - String eventType = evt.getPropertyName(); - if (eventType.equals(IngestManager.IngestModuleEvent.DATA_ADDED.toString())) { + private final PropertyChangeListener pcl = (PropertyChangeEvent evt) -> { + String eventType = evt.getPropertyName(); + if (eventType.equals(IngestManager.IngestModuleEvent.DATA_ADDED.toString())) { + /** + * Checking for a current case is a stop gap measure until a + * different way of handling the closing of cases is worked + * out. Currently, remote events may be received for a case + * that is already closed. + */ + try { + Case.getCurrentCase(); /** - * Checking for a current case is a stop gap measure until a - * different way of handling the closing of cases is worked - * out. Currently, remote events may be received for a case - * that is already closed. + * Even with the check above, it is still possible that + * the case will be closed in a different thread before + * this code executes. If that happens, it is possible + * for the event to have a null oldValue. */ - try { - Case.getCurrentCase(); - /** - * Even with the check above, it is still possible that - * the case will be closed in a different thread before - * this code executes. If that happens, it is possible - * for the event to have a null oldValue. - */ - ModuleDataEvent eventData = (ModuleDataEvent) evt.getOldValue(); - if (null != eventData && (eventData.getBlackboardArtifactType().getTypeID() == BlackboardArtifact.ARTIFACT_TYPE.TSK_INTERESTING_ARTIFACT_HIT.getTypeID() - || eventData.getBlackboardArtifactType().getTypeID() == BlackboardArtifact.ARTIFACT_TYPE.TSK_INTERESTING_FILE_HIT.getTypeID())) { - interestingResults.update(); - } - } catch (IllegalStateException notUsed) { - /** - * Case is closed, do nothing. - */ - } - } else if (eventType.equals(IngestManager.IngestJobEvent.COMPLETED.toString()) - || eventType.equals(IngestManager.IngestJobEvent.CANCELLED.toString())) { - /** - * Checking for a current case is a stop gap measure until a - * different way of handling the closing of cases is worked - * out. Currently, remote events may be received for a case - * that is already closed. - */ - try { - Case.getCurrentCase(); + ModuleDataEvent eventData = (ModuleDataEvent) evt.getOldValue(); + if (null != eventData && (eventData.getBlackboardArtifactType().getTypeID() == BlackboardArtifact.ARTIFACT_TYPE.TSK_INTERESTING_ARTIFACT_HIT.getTypeID() + || eventData.getBlackboardArtifactType().getTypeID() == BlackboardArtifact.ARTIFACT_TYPE.TSK_INTERESTING_FILE_HIT.getTypeID())) { interestingResults.update(); - } catch (IllegalStateException notUsed) { - /** - * Case is closed, do nothing. - */ - } - } else if (eventType.equals(Case.Events.CURRENT_CASE.toString())) { - // case was closed. Remove listeners so that we don't get called with a stale case handle - if (evt.getNewValue() == null) { - removeNotify(); - skCase = null; } + } catch (IllegalStateException notUsed) { + /** + * Case is closed, do nothing. + */ + } + } else if (eventType.equals(IngestManager.IngestJobEvent.COMPLETED.toString()) + || eventType.equals(IngestManager.IngestJobEvent.CANCELLED.toString())) { + /** + * Checking for a current case is a stop gap measure until a + * different way of handling the closing of cases is worked + * out. Currently, remote events may be received for a case + * that is already closed. + */ + try { + Case.getCurrentCase(); + interestingResults.update(); + } catch (IllegalStateException notUsed) { + /** + * Case is closed, do nothing. + */ + } + } else if (eventType.equals(Case.Events.CURRENT_CASE.toString())) { + // case was closed. Remove listeners so that we don't get called with a stale case handle + if (evt.getNewValue() == null) { + removeNotify(); + skCase = null; } } }; @@ -247,7 +245,7 @@ public class InterestingHits implements AutopsyVisitableItem { protected void addNotify() { IngestManager.getInstance().addIngestJobEventListener(pcl); IngestManager.getInstance().addIngestModuleEventListener(pcl); - Case.addPropertyChangeListener(pcl); + Case.addEventTypeSubscriber(EnumSet.of(Case.Events.CURRENT_CASE), pcl); interestingResults.update(); interestingResults.addObserver(this); } @@ -256,7 +254,7 @@ public class InterestingHits implements AutopsyVisitableItem { protected void removeNotify() { IngestManager.getInstance().removeIngestJobEventListener(pcl); IngestManager.getInstance().removeIngestModuleEventListener(pcl); - Case.removePropertyChangeListener(pcl); + Case.removeEventTypeSubscriber(EnumSet.of(Case.Events.CURRENT_CASE), pcl); interestingResults.deleteObserver(this); } diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/KeywordHits.java b/Core/src/org/sleuthkit/autopsy/datamodel/KeywordHits.java index 343074ddc9..75873d135e 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/KeywordHits.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/KeywordHits.java @@ -24,6 +24,7 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.Collections; +import java.util.EnumSet; import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; @@ -455,7 +456,7 @@ public class KeywordHits implements AutopsyVisitableItem { protected void addNotify() { IngestManager.getInstance().addIngestJobEventListener(pcl); IngestManager.getInstance().addIngestModuleEventListener(pcl); - Case.addPropertyChangeListener(pcl); + Case.addEventTypeSubscriber(EnumSet.of(Case.Events.CURRENT_CASE), pcl); keywordResults.update(); super.addNotify(); } @@ -464,7 +465,7 @@ public class KeywordHits implements AutopsyVisitableItem { protected void removeNotify() { IngestManager.getInstance().removeIngestJobEventListener(pcl); IngestManager.getInstance().removeIngestModuleEventListener(pcl); - Case.removePropertyChangeListener(pcl); + Case.removeEventTypeSubscriber(EnumSet.of(Case.Events.CURRENT_CASE), pcl); super.removeNotify(); } diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/Reports.java b/Core/src/org/sleuthkit/autopsy/datamodel/Reports.java index c606984056..14cf3bfbd4 100755 --- a/Core/src/org/sleuthkit/autopsy/datamodel/Reports.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/Reports.java @@ -28,7 +28,9 @@ import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; +import java.util.EnumSet; import java.util.List; +import java.util.Set; import java.util.logging.Level; import javax.swing.AbstractAction; import javax.swing.Action; @@ -103,8 +105,10 @@ public final class Reports implements AutopsyVisitableItem { */ private static final class ReportNodeFactory extends ChildFactory { + private static final Set CASE_EVENTS_OF_INTEREST = EnumSet.of(Case.Events.REPORT_ADDED, Case.Events.REPORT_DELETED); + ReportNodeFactory() { - Case.addPropertyChangeListener((PropertyChangeEvent evt) -> { + Case.addEventTypeSubscriber(CASE_EVENTS_OF_INTEREST, (PropertyChangeEvent evt) -> { String eventType = evt.getPropertyName(); if (eventType.equals(Case.Events.REPORT_ADDED.toString()) || eventType.equals(Case.Events.REPORT_DELETED.toString())) { /** diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/Tags.java b/Core/src/org/sleuthkit/autopsy/datamodel/Tags.java index b8127fe5a7..53722568c2 100755 --- a/Core/src/org/sleuthkit/autopsy/datamodel/Tags.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/Tags.java @@ -21,9 +21,11 @@ package org.sleuthkit.autopsy.datamodel; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.Collections; +import java.util.EnumSet; import java.util.List; import java.util.Observable; import java.util.Observer; +import java.util.Set; import java.util.logging.Level; import org.openide.nodes.ChildFactory; import org.openide.nodes.Children; @@ -118,6 +120,11 @@ public class Tags implements AutopsyVisitableItem { private class TagNameNodeFactory extends ChildFactory.Detachable implements Observer { + private final Set CASE_EVENTS_OF_INTEREST = EnumSet.of(Case.Events.BLACKBOARD_ARTIFACT_TAG_ADDED, + Case.Events.BLACKBOARD_ARTIFACT_TAG_DELETED, + Case.Events.CONTENT_TAG_ADDED, + Case.Events.CONTENT_TAG_DELETED); + private final PropertyChangeListener pcl = new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { @@ -171,7 +178,7 @@ public class Tags implements AutopsyVisitableItem { protected void addNotify() { IngestManager.getInstance().addIngestJobEventListener(pcl); IngestManager.getInstance().addIngestModuleEventListener(pcl); - Case.addPropertyChangeListener(pcl); + Case.addEventTypeSubscriber(CASE_EVENTS_OF_INTEREST, pcl); tagResults.update(); tagResults.addObserver(this); } @@ -180,7 +187,7 @@ public class Tags implements AutopsyVisitableItem { protected void removeNotify() { IngestManager.getInstance().removeIngestJobEventListener(pcl); IngestManager.getInstance().removeIngestModuleEventListener(pcl); - Case.removePropertyChangeListener(pcl); + Case.removeEventTypeSubscriber(CASE_EVENTS_OF_INTEREST, pcl); tagResults.deleteObserver(this); } diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/VolumeNode.java b/Core/src/org/sleuthkit/autopsy/datamodel/VolumeNode.java index ba37cd4f09..ee5a5713a3 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/VolumeNode.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/VolumeNode.java @@ -21,6 +21,7 @@ package org.sleuthkit.autopsy.datamodel; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.ArrayList; +import java.util.EnumSet; import java.util.List; import javax.swing.Action; import org.openide.nodes.Children; @@ -72,12 +73,12 @@ public class VolumeNode extends AbstractContentNode { // Listen for ingest events so that we can detect new added files (e.g. carved) IngestManager.getInstance().addIngestModuleEventListener(pcl); // Listen for case events so that we can detect when case is closed - Case.addPropertyChangeListener(pcl); + Case.addEventTypeSubscriber(EnumSet.of(Case.Events.CURRENT_CASE), pcl); } private void removeListeners() { IngestManager.getInstance().removeIngestModuleEventListener(pcl); - Case.removePropertyChangeListener(pcl); + Case.removeEventTypeSubscriber(EnumSet.of(Case.Events.CURRENT_CASE), pcl); } /* diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/accounts/Accounts.java b/Core/src/org/sleuthkit/autopsy/datamodel/accounts/Accounts.java index 6545ac0bef..e1ba5a2ca8 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/accounts/Accounts.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/accounts/Accounts.java @@ -32,6 +32,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; +import java.util.EnumSet; import java.util.HashSet; import java.util.List; import java.util.Objects; @@ -311,7 +312,7 @@ final public class Accounts implements AutopsyVisitableItem { protected void removeNotify() { IngestManager.getInstance().removeIngestJobEventListener(pcl); IngestManager.getInstance().removeIngestModuleEventListener(pcl); - Case.removePropertyChangeListener(pcl); + Case.removeEventTypeSubscriber(EnumSet.of(Case.Events.CURRENT_CASE), pcl); super.removeNotify(); } @@ -319,7 +320,7 @@ final public class Accounts implements AutopsyVisitableItem { protected void addNotify() { IngestManager.getInstance().addIngestJobEventListener(pcl); IngestManager.getInstance().addIngestModuleEventListener(pcl); - Case.addPropertyChangeListener(pcl); + Case.addEventTypeSubscriber(EnumSet.of(Case.Events.CURRENT_CASE), pcl); super.addNotify(); refreshKeys(); } diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeTopComponent.java b/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeTopComponent.java index bfb98e5220..03c265daee 100644 --- a/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeTopComponent.java +++ b/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeTopComponent.java @@ -26,6 +26,7 @@ import java.beans.PropertyVetoException; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; +import java.util.EnumSet; import java.util.HashSet; import java.util.LinkedList; import java.util.List; @@ -151,7 +152,7 @@ public final class DirectoryTreeTopComponent extends TopComponent implements Dat } } }); - Case.addEventSubscriber(new HashSet<>(Arrays.asList(Case.Events.CURRENT_CASE.toString(), Case.Events.DATA_SOURCE_ADDED.toString())), this); + Case.addEventTypeSubscriber(EnumSet.of(Case.Events.CURRENT_CASE, Case.Events.DATA_SOURCE_ADDED), this); this.em.addPropertyChangeListener(this); IngestManager.getInstance().addIngestJobEventListener(this); IngestManager.getInstance().addIngestModuleEventListener(this); diff --git a/Core/src/org/sleuthkit/autopsy/filesearch/DateSearchFilter.java b/Core/src/org/sleuthkit/autopsy/filesearch/DateSearchFilter.java index f7ae47cc73..205db56998 100644 --- a/Core/src/org/sleuthkit/autopsy/filesearch/DateSearchFilter.java +++ b/Core/src/org/sleuthkit/autopsy/filesearch/DateSearchFilter.java @@ -28,6 +28,7 @@ import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; +import java.util.EnumSet; import java.util.Iterator; import java.util.List; import java.util.Set; @@ -53,6 +54,9 @@ class DateSearchFilter extends AbstractFileSearchFilter { private static final DateFormat DATE_FORMAT = new SimpleDateFormat("MM/dd/yyyy"); private static final String SEPARATOR = "SEPARATOR"; //NON-NLS + private static final Set CASE_EVENTS_OF_INTEREST = EnumSet.of(Case.Events.CURRENT_CASE, + Case.Events.DATA_SOURCE_ADDED, Case.Events.DATA_SOURCE_DELETED); + /** * New DateSearchFilter with the default panel */ @@ -62,7 +66,7 @@ class DateSearchFilter extends AbstractFileSearchFilter { private DateSearchFilter(DateSearchPanel panel) { super(panel); - Case.addPropertyChangeListener(this.new CasePropertyChangeListener()); + Case.addEventTypeSubscriber(CASE_EVENTS_OF_INTEREST, this.new CasePropertyChangeListener()); } @Override diff --git a/Core/src/org/sleuthkit/autopsy/filesearch/FileSearchAction.java b/Core/src/org/sleuthkit/autopsy/filesearch/FileSearchAction.java index 603d9d1623..fb66a4b6d7 100644 --- a/Core/src/org/sleuthkit/autopsy/filesearch/FileSearchAction.java +++ b/Core/src/org/sleuthkit/autopsy/filesearch/FileSearchAction.java @@ -20,7 +20,7 @@ package org.sleuthkit.autopsy.filesearch; import java.awt.event.ActionEvent; import java.beans.PropertyChangeEvent; -import java.beans.PropertyChangeListener; +import java.util.EnumSet; import org.openide.util.HelpCtx; import org.openide.util.NbBundle; import org.openide.util.actions.CallableSystemAction; @@ -35,14 +35,10 @@ final class FileSearchAction extends CallableSystemAction implements FileSearchP FileSearchAction() { super(); setEnabled(Case.isCaseOpen()); - Case.addPropertyChangeListener(new PropertyChangeListener() { - @Override - public void propertyChange(PropertyChangeEvent evt) { - if (evt.getPropertyName().equals(Case.Events.CURRENT_CASE.toString())) { - setEnabled(evt.getNewValue() != null); - } + Case.addEventTypeSubscriber(EnumSet.of(Case.Events.CURRENT_CASE), (PropertyChangeEvent evt) -> { + if (evt.getPropertyName().equals(Case.Events.CURRENT_CASE.toString())) { + setEnabled(evt.getNewValue() != null); } - }); } diff --git a/Core/src/org/sleuthkit/autopsy/ingest/IngestManager.java b/Core/src/org/sleuthkit/autopsy/ingest/IngestManager.java index 99f8e09fd8..e61f8d61f7 100644 --- a/Core/src/org/sleuthkit/autopsy/ingest/IngestManager.java +++ b/Core/src/org/sleuthkit/autopsy/ingest/IngestManager.java @@ -26,6 +26,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Date; +import java.util.EnumSet; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -229,7 +230,7 @@ public class IngestManager { * opened/closed) events. */ private void subscribeToCaseEvents() { - Case.addEventSubscriber(Case.Events.CURRENT_CASE.toString(), (PropertyChangeEvent event) -> { + Case.addEventTypeSubscriber(EnumSet.of(Case.Events.CURRENT_CASE), (PropertyChangeEvent event) -> { if (event.getNewValue() != null) { handleCaseOpened(); } else { diff --git a/Core/src/org/sleuthkit/autopsy/ingest/IngestMessagesToolbar.java b/Core/src/org/sleuthkit/autopsy/ingest/IngestMessagesToolbar.java index 20b791c64d..432cb48810 100644 --- a/Core/src/org/sleuthkit/autopsy/ingest/IngestMessagesToolbar.java +++ b/Core/src/org/sleuthkit/autopsy/ingest/IngestMessagesToolbar.java @@ -25,6 +25,7 @@ import java.awt.Font; import java.awt.Graphics; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; +import java.util.EnumSet; import javax.swing.JButton; import org.openide.util.NbBundle; import org.openide.windows.Mode; @@ -128,7 +129,7 @@ class IngestMessagesToolbar extends javax.swing.JPanel { } }); - Case.addPropertyChangeListener((PropertyChangeEvent evt) -> { + Case.addEventTypeSubscriber(EnumSet.of(Case.Events.CURRENT_CASE), (PropertyChangeEvent evt) -> { if (evt.getPropertyName().equals(Case.Events.CURRENT_CASE.toString())) { setEnabled(evt.getNewValue() != null && RuntimeProperties.runningWithGUI()); } diff --git a/Core/src/org/sleuthkit/autopsy/ingest/IngestMonitor.java b/Core/src/org/sleuthkit/autopsy/ingest/IngestMonitor.java index 771380c415..f6580a3cbc 100644 --- a/Core/src/org/sleuthkit/autopsy/ingest/IngestMonitor.java +++ b/Core/src/org/sleuthkit/autopsy/ingest/IngestMonitor.java @@ -23,6 +23,7 @@ import java.awt.event.ActionListener; import java.beans.PropertyChangeEvent; import java.io.File; import java.io.IOException; +import java.util.EnumSet; import java.util.logging.FileHandler; import java.util.logging.Level; import java.util.logging.SimpleFormatter; @@ -121,7 +122,7 @@ public final class IngestMonitor { MonitorTimerAction() { findRootDirectoryForCurrentCase(); - Case.addEventSubscriber(Case.Events.CURRENT_CASE.toString(), (PropertyChangeEvent evt) -> { + Case.addEventTypeSubscriber(EnumSet.of(Case.Events.CURRENT_CASE), (PropertyChangeEvent evt) -> { if (evt instanceof AutopsyEvent) { AutopsyEvent event = (AutopsyEvent) evt; if (AutopsyEvent.SourceType.LOCAL == event.getSourceType() && event.getPropertyName().equals(Case.Events.CURRENT_CASE.toString())) { diff --git a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashDbPanelSearchAction.java b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashDbPanelSearchAction.java index d7471df562..268f828fc7 100644 --- a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashDbPanelSearchAction.java +++ b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashDbPanelSearchAction.java @@ -23,7 +23,7 @@ import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.beans.PropertyChangeEvent; -import java.beans.PropertyChangeListener; +import java.util.EnumSet; import org.openide.util.HelpCtx; import org.openide.util.NbBundle; import org.openide.util.actions.CallableSystemAction; @@ -43,13 +43,9 @@ class HashDbPanelSearchAction extends CallableSystemAction { HashDbPanelSearchAction() { super(); setEnabled(Case.isCaseOpen()); - Case.addPropertyChangeListener(new PropertyChangeListener() { - - @Override - public void propertyChange(PropertyChangeEvent evt) { - if (evt.getPropertyName().equals(Case.Events.CURRENT_CASE.toString())) { - setEnabled(evt.getNewValue() != null); - } + Case.addEventTypeSubscriber(EnumSet.of(Case.Events.CURRENT_CASE), (PropertyChangeEvent evt) -> { + if (evt.getPropertyName().equals(Case.Events.CURRENT_CASE.toString())) { + setEnabled(evt.getNewValue() != null); } }); } diff --git a/Core/src/org/sleuthkit/autopsy/report/ReportWizardAction.java b/Core/src/org/sleuthkit/autopsy/report/ReportWizardAction.java index 75c8f7c205..49f37008be 100644 --- a/Core/src/org/sleuthkit/autopsy/report/ReportWizardAction.java +++ b/Core/src/org/sleuthkit/autopsy/report/ReportWizardAction.java @@ -27,6 +27,7 @@ import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.beans.PropertyChangeEvent; import java.text.MessageFormat; +import java.util.EnumSet; import java.util.Map; import javax.swing.ImageIcon; import javax.swing.JButton; @@ -81,7 +82,7 @@ public final class ReportWizardAction extends CallableSystemAction implements Pr public ReportWizardAction() { setEnabled(false); - Case.addPropertyChangeListener((PropertyChangeEvent evt) -> { + Case.addEventTypeSubscriber(EnumSet.of(Case.Events.CURRENT_CASE), (PropertyChangeEvent evt) -> { if (evt.getPropertyName().equals(Case.Events.CURRENT_CASE.toString())) { Case newCase = (Case) evt.getNewValue(); setEnabled(newCase != null && RuntimeProperties.runningWithGUI()); diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/DropdownToolbar.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/DropdownToolbar.java index 3272b9dad1..1ad473dd01 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/DropdownToolbar.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/DropdownToolbar.java @@ -23,6 +23,7 @@ import java.awt.event.ActionListener; import java.awt.event.MouseEvent; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; +import java.util.EnumSet; import java.util.logging.Level; import javax.swing.SwingUtilities; import javax.swing.event.PopupMenuEvent; @@ -76,7 +77,7 @@ class DropdownToolbar extends javax.swing.JPanel { private void customizeComponents() { searchSettingsChangeListener = new SearchSettingsChangeListener(); KeywordSearch.getServer().addServerActionListener(searchSettingsChangeListener); - Case.addPropertyChangeListener(searchSettingsChangeListener); + Case.addEventTypeSubscriber(EnumSet.of(Case.Events.CURRENT_CASE), searchSettingsChangeListener); DropdownListSearchPanel listsPanel = DropdownListSearchPanel.getDefault(); listsPanel.addSearchButtonActionListener((ActionEvent e) -> { From eaaeb3dc4df981a3c35eb9e6d19467d27ac1c2e1 Mon Sep 17 00:00:00 2001 From: Ann Priestman Date: Tue, 29 Aug 2017 09:21:31 -0400 Subject: [PATCH 029/104] Improve speed of importing hash database in sqlite --- .../datamodel/AbstractSqlEamDb.java | 13 ++++++++----- .../centralrepository/datamodel/PostgresEamDb.java | 6 ++++-- .../optionspanel/ImportHashDatabaseDialog.java | 7 ++----- 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/AbstractSqlEamDb.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/AbstractSqlEamDb.java index 54d46d3c72..06a1e6ed3f 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/AbstractSqlEamDb.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/AbstractSqlEamDb.java @@ -1524,10 +1524,10 @@ public abstract class AbstractSqlEamDb implements EamDb { @Override public void bulkInsertReferenceTypeEntries(Set globalInstances, EamArtifact.Type contentType) throws EamDbException { Connection conn = connect(); - + PreparedStatement bulkPs = null; try { - //conn.setAutoCommit(false); + conn.setAutoCommit(false); // FUTURE: have a separate global_files table for each Type. String sql = "INSERT INTO %s(reference_set_id, value, known_status, comment) VALUES (?, ?, ?, ?) " @@ -1541,13 +1541,16 @@ public abstract class AbstractSqlEamDb implements EamDb { bulkPs.setString(3, globalInstance.getKnownStatus().name()); bulkPs.setString(4, globalInstance.getComment()); bulkPs.addBatch(); - //bulkPs.executeUpdate(); } bulkPs.executeBatch(); - //conn.commit(); + conn.commit(); } catch (SQLException ex) { - //conn.rollback(); + try{ + conn.rollback(); + } catch (SQLException ex2){ + // We're alredy in an error state + } throw new EamDbException("Error inserting bulk artifacts.", ex); // NON-NLS } finally { EamDbUtil.closePreparedStatement(bulkPs); diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/PostgresEamDb.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/PostgresEamDb.java index 468d12ccb9..208ded1998 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/PostgresEamDb.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/PostgresEamDb.java @@ -72,8 +72,10 @@ public class PostgresEamDb extends AbstractSqlEamDb { public void shutdownConnections() throws EamDbException { try { synchronized(this) { - connectionPool.close(); - connectionPool = null; // force it to be re-created on next connect() + if(connectionPool != null){ + connectionPool.close(); + connectionPool = null; // force it to be re-created on next connect() + } } } catch (SQLException ex) { throw new EamDbException("Failed to close existing database connections.", ex); // NON-NLS diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ImportHashDatabaseDialog.java b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ImportHashDatabaseDialog.java index 9718104048..868c08a164 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ImportHashDatabaseDialog.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ImportHashDatabaseDialog.java @@ -629,7 +629,7 @@ final class ImportHashDatabaseDialog extends javax.swing.JDialog { } int numLines = 0; - LOGGER.log(Level.INFO, "Starting import: " + numLines); + LOGGER.log(Level.INFO, "Importing hash database {0}", file.getName()); while ((line = reader.readLine()) != null) { progress.progress(++numLines); @@ -652,13 +652,10 @@ final class ImportHashDatabaseDialog extends javax.swing.JDialog { dbManager.bulkInsertReferenceTypeEntries(globalInstances, contentType); globalInstances.clear(); } - if(numLines % 10000 == 0){ - LOGGER.log(Level.INFO, "Database entries processed: " + numLines); - } } dbManager.bulkInsertReferenceTypeEntries(globalInstances, contentType); - LOGGER.log(Level.INFO, "Database entries processed: " + numLines); + LOGGER.log(Level.INFO, "Finished importing hash database. Total entries: {0}", numLines); } } From 2c6d6be13270893b48bb318d101d6cfbb103604f Mon Sep 17 00:00:00 2001 From: Ann Priestman Date: Tue, 29 Aug 2017 09:25:29 -0400 Subject: [PATCH 030/104] Revering bundle file dates --- .../core/core.jar/org/netbeans/core/startup/Bundle.properties | 2 +- .../org/netbeans/core/windows/view/ui/Bundle.properties | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/branding/core/core.jar/org/netbeans/core/startup/Bundle.properties b/branding/core/core.jar/org/netbeans/core/startup/Bundle.properties index 5b1698042d..464fb47dd8 100644 --- a/branding/core/core.jar/org/netbeans/core/startup/Bundle.properties +++ b/branding/core/core.jar/org/netbeans/core/startup/Bundle.properties @@ -1,5 +1,5 @@ #Updated by build script -#Fri, 25 Aug 2017 12:02:51 -0400 +#Thu, 22 Jun 2017 08:0:21 -0400 LBL_splash_window_title=Starting Autopsy SPLASH_HEIGHT=314 SPLASH_WIDTH=538 diff --git a/branding/modules/org-netbeans-core-windows.jar/org/netbeans/core/windows/view/ui/Bundle.properties b/branding/modules/org-netbeans-core-windows.jar/org/netbeans/core/windows/view/ui/Bundle.properties index 08d7219915..9207917601 100644 --- a/branding/modules/org-netbeans-core-windows.jar/org/netbeans/core/windows/view/ui/Bundle.properties +++ b/branding/modules/org-netbeans-core-windows.jar/org/netbeans/core/windows/view/ui/Bundle.properties @@ -1,4 +1,4 @@ #Updated by build script -#Fri, 25 Aug 2017 12:02:51 -0400 +#Thu, 22 Jun 2017 08:50:21 -0400 CTL_MainWindow_Title=Autopsy 4.4.1 CTL_MainWindow_Title_No_Project=Autopsy 4.4.1 From ab6ef4766b9f7c97eb3886bcd77575acbad155be Mon Sep 17 00:00:00 2001 From: Ann Priestman Date: Tue, 29 Aug 2017 09:29:44 -0400 Subject: [PATCH 031/104] Fixed typo --- .../core/core.jar/org/netbeans/core/startup/Bundle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/branding/core/core.jar/org/netbeans/core/startup/Bundle.properties b/branding/core/core.jar/org/netbeans/core/startup/Bundle.properties index 464fb47dd8..9fa4b48338 100644 --- a/branding/core/core.jar/org/netbeans/core/startup/Bundle.properties +++ b/branding/core/core.jar/org/netbeans/core/startup/Bundle.properties @@ -1,5 +1,5 @@ #Updated by build script -#Thu, 22 Jun 2017 08:0:21 -0400 +#Thu, 22 Jun 2017 08:50:21 -0400 LBL_splash_window_title=Starting Autopsy SPLASH_HEIGHT=314 SPLASH_WIDTH=538 From d4c08f4fbe96324f5e8fdbd874d43c23706ce53b Mon Sep 17 00:00:00 2001 From: Ann Priestman Date: Tue, 29 Aug 2017 10:06:32 -0400 Subject: [PATCH 032/104] Reverting branding again --- .../core/core.jar/org/netbeans/core/startup/Bundle.properties | 2 +- .../org/netbeans/core/windows/view/ui/Bundle.properties | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/branding/core/core.jar/org/netbeans/core/startup/Bundle.properties b/branding/core/core.jar/org/netbeans/core/startup/Bundle.properties index 4e8c64bd2b..9fa4b48338 100644 --- a/branding/core/core.jar/org/netbeans/core/startup/Bundle.properties +++ b/branding/core/core.jar/org/netbeans/core/startup/Bundle.properties @@ -1,5 +1,5 @@ #Updated by build script -#Tue, 29 Aug 2017 09:47:52 -0400 +#Thu, 22 Jun 2017 08:50:21 -0400 LBL_splash_window_title=Starting Autopsy SPLASH_HEIGHT=314 SPLASH_WIDTH=538 diff --git a/branding/modules/org-netbeans-core-windows.jar/org/netbeans/core/windows/view/ui/Bundle.properties b/branding/modules/org-netbeans-core-windows.jar/org/netbeans/core/windows/view/ui/Bundle.properties index 8752cb9062..9207917601 100644 --- a/branding/modules/org-netbeans-core-windows.jar/org/netbeans/core/windows/view/ui/Bundle.properties +++ b/branding/modules/org-netbeans-core-windows.jar/org/netbeans/core/windows/view/ui/Bundle.properties @@ -1,4 +1,4 @@ #Updated by build script -#Tue, 29 Aug 2017 09:47:52 -0400 +#Thu, 22 Jun 2017 08:50:21 -0400 CTL_MainWindow_Title=Autopsy 4.4.1 CTL_MainWindow_Title_No_Project=Autopsy 4.4.1 From 9f95239cc4afaa5280daa664340a3f1a23279a61 Mon Sep 17 00:00:00 2001 From: Eugene Livis Date: Tue, 29 Aug 2017 12:51:18 -0400 Subject: [PATCH 033/104] Added ability to search for MD5 --- .../autopsy/filesearch/Bundle.properties | 2 + .../autopsy/filesearch/FileSearchPanel.java | 2 + .../autopsy/filesearch/HashSearchFilter.java | 66 +++++++ .../autopsy/filesearch/HashSearchPanel.form | 104 +++++++++++ .../autopsy/filesearch/HashSearchPanel.java | 176 ++++++++++++++++++ 5 files changed, 350 insertions(+) create mode 100755 Core/src/org/sleuthkit/autopsy/filesearch/HashSearchFilter.java create mode 100755 Core/src/org/sleuthkit/autopsy/filesearch/HashSearchPanel.form create mode 100755 Core/src/org/sleuthkit/autopsy/filesearch/HashSearchPanel.java diff --git a/Core/src/org/sleuthkit/autopsy/filesearch/Bundle.properties b/Core/src/org/sleuthkit/autopsy/filesearch/Bundle.properties index c5fd4d48e4..68cfc25429 100644 --- a/Core/src/org/sleuthkit/autopsy/filesearch/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/filesearch/Bundle.properties @@ -56,3 +56,5 @@ SizeSearchPanel.sizeCompareComboBox.lessThan=less than MimeTypePanel.jLabel1.text=*Note: Multiple MIME types can be selected FileSearchPanel.searchButton.text=Search MimeTypePanel.mimeTypeCheckBox.text=MIME Type: +HashSearchPanel.md5CheckBox.text=MD5: +HashSearchPanel.emptyHashMsg.text=Must enter something for hash search. \ No newline at end of file diff --git a/Core/src/org/sleuthkit/autopsy/filesearch/FileSearchPanel.java b/Core/src/org/sleuthkit/autopsy/filesearch/FileSearchPanel.java index 23730c99c1..d7efb0b46f 100644 --- a/Core/src/org/sleuthkit/autopsy/filesearch/FileSearchPanel.java +++ b/Core/src/org/sleuthkit/autopsy/filesearch/FileSearchPanel.java @@ -94,6 +94,8 @@ class FileSearchPanel extends javax.swing.JPanel { this.filterAreas.add(new FilterArea(NbBundle.getMessage(this.getClass(), "FileSearchPanel.filterTitle.metadata"), metadataFilters)); this.filterAreas.add(new FilterArea(NbBundle.getMessage(this.getClass(), "FileSearchPanel.filterTitle.knownStatus"), new KnownStatusSearchFilter())); + + this.filterAreas.add(new FilterArea(NbBundle.getMessage(this.getClass(), "HashSearchPanel.md5CheckBox.text"), new HashSearchFilter())); for (FilterArea fa : this.filterAreas) { fa.setMaximumSize(new Dimension(Integer.MAX_VALUE, fa.getMinimumSize().height)); diff --git a/Core/src/org/sleuthkit/autopsy/filesearch/HashSearchFilter.java b/Core/src/org/sleuthkit/autopsy/filesearch/HashSearchFilter.java new file mode 100755 index 0000000000..951f4b206e --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/filesearch/HashSearchFilter.java @@ -0,0 +1,66 @@ +/* + * Autopsy Forensic Browser + * + * Copyright 2017 Basis Technology Corp. + * Contact: carrier sleuthkit org + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.sleuthkit.autopsy.filesearch; + +import java.awt.event.ActionListener; +import org.openide.util.NbBundle; +import org.sleuthkit.autopsy.filesearch.FileSearchFilter.FilterValidationException; + +/** + * + */ +class HashSearchFilter extends AbstractFileSearchFilter { + + private static final String EMPTY_HASH_MESSAGE = NbBundle + .getMessage(HashSearchFilter.class, "HashSearchPanel.emptyHashMsg.text"); + + public HashSearchFilter() { + this(new HashSearchPanel()); + } + + public HashSearchFilter(HashSearchPanel component) { + super(component); + } + + @Override + public boolean isEnabled() { + return this.getComponent().getHashCheckBox().isSelected(); + } + + @Override + public String getPredicate() throws FilterValidationException { + String md5Hash = this.getComponent().getSearchTextField().getText(); + + if (md5Hash.isEmpty()) { + throw new FilterValidationException(EMPTY_HASH_MESSAGE); + } + + return "md5 = '" + md5Hash.toLowerCase() + "'"; //NON-NLS + } + + @Override + public void addActionListener(ActionListener l) { + getComponent().addActionListener(l); + } + + @Override + public boolean isValid() { + return !this.getComponent().getSearchTextField().getText().isEmpty(); + } +} diff --git a/Core/src/org/sleuthkit/autopsy/filesearch/HashSearchPanel.form b/Core/src/org/sleuthkit/autopsy/filesearch/HashSearchPanel.form new file mode 100755 index 0000000000..dabb115e57 --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/filesearch/HashSearchPanel.form @@ -0,0 +1,104 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Core/src/org/sleuthkit/autopsy/filesearch/HashSearchPanel.java b/Core/src/org/sleuthkit/autopsy/filesearch/HashSearchPanel.java new file mode 100755 index 0000000000..827cc31141 --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/filesearch/HashSearchPanel.java @@ -0,0 +1,176 @@ +/* + * Autopsy Forensic Browser + * + * Copyright 2011-2017 Basis Technology Corp. + * Contact: carrier sleuthkit org + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.sleuthkit.autopsy.filesearch; + +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import javax.swing.JCheckBox; +import javax.swing.JMenuItem; +import javax.swing.JTextField; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; + +/** + * + */ +class HashSearchPanel extends javax.swing.JPanel { + + private static final long serialVersionUID = 1L; + + /** + * Creates new form HashSearchPanel + */ + HashSearchPanel() { + initComponents(); + customizeComponents(); + setComponentsEnabled(); + } + + private void customizeComponents() { + + searchTextField.setComponentPopupMenu(rightClickMenu); + ActionListener actList = new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + JMenuItem jmi = (JMenuItem) e.getSource(); + if (jmi.equals(cutMenuItem)) { + searchTextField.cut(); + } else if (jmi.equals(copyMenuItem)) { + searchTextField.copy(); + } else if (jmi.equals(pasteMenuItem)) { + searchTextField.paste(); + } else if (jmi.equals(selectAllMenuItem)) { + searchTextField.selectAll(); + } + } + }; + cutMenuItem.addActionListener(actList); + copyMenuItem.addActionListener(actList); + pasteMenuItem.addActionListener(actList); + selectAllMenuItem.addActionListener(actList); + this.searchTextField.getDocument().addDocumentListener(new DocumentListener() { + @Override + public void insertUpdate(DocumentEvent e) { + firePropertyChange(FileSearchPanel.EVENT.CHECKED.toString(), null, null); + } + + @Override + public void removeUpdate(DocumentEvent e) { + firePropertyChange(FileSearchPanel.EVENT.CHECKED.toString(), null, null); + } + + @Override + public void changedUpdate(DocumentEvent e) { + firePropertyChange(FileSearchPanel.EVENT.CHECKED.toString(), null, null); + } + }); + + } + + JCheckBox getHashCheckBox() { + return hashCheckBox; + } + + JTextField getSearchTextField() { + return searchTextField; + } + + void setComponentsEnabled() { + boolean enabled = hashCheckBox.isSelected(); + this.searchTextField.setEnabled(enabled); + } + + /** + * This method is called from within the constructor to initialize the form. + * WARNING: Do NOT modify this code. The content of this method is always + * regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + rightClickMenu = new javax.swing.JPopupMenu(); + cutMenuItem = new javax.swing.JMenuItem(); + copyMenuItem = new javax.swing.JMenuItem(); + pasteMenuItem = new javax.swing.JMenuItem(); + selectAllMenuItem = new javax.swing.JMenuItem(); + hashCheckBox = new javax.swing.JCheckBox(); + searchTextField = new javax.swing.JTextField(); + + cutMenuItem.setText(org.openide.util.NbBundle.getMessage(HashSearchPanel.class, "NameSearchPanel.cutMenuItem.text")); // NOI18N + rightClickMenu.add(cutMenuItem); + + copyMenuItem.setText(org.openide.util.NbBundle.getMessage(HashSearchPanel.class, "NameSearchPanel.copyMenuItem.text")); // NOI18N + rightClickMenu.add(copyMenuItem); + + pasteMenuItem.setText(org.openide.util.NbBundle.getMessage(HashSearchPanel.class, "NameSearchPanel.pasteMenuItem.text")); // NOI18N + rightClickMenu.add(pasteMenuItem); + + selectAllMenuItem.setText(org.openide.util.NbBundle.getMessage(HashSearchPanel.class, "NameSearchPanel.selectAllMenuItem.text")); // NOI18N + rightClickMenu.add(selectAllMenuItem); + + hashCheckBox.setFont(hashCheckBox.getFont().deriveFont(hashCheckBox.getFont().getStyle() & ~java.awt.Font.BOLD, 11)); + hashCheckBox.setText(org.openide.util.NbBundle.getMessage(HashSearchPanel.class, "HashSearchPanel.md5CheckBox.text")); // NOI18N + hashCheckBox.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + hashCheckBoxActionPerformed(evt); + } + }); + + searchTextField.setFont(searchTextField.getFont().deriveFont(searchTextField.getFont().getStyle() & ~java.awt.Font.BOLD, 11)); + searchTextField.setText(org.openide.util.NbBundle.getMessage(HashSearchPanel.class, "NameSearchPanel.searchTextField.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() + .addGap(0, 0, 0) + .addComponent(hashCheckBox) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(searchTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 247, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(0, 0, 0)) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(hashCheckBox) + .addComponent(searchTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + ); + }// //GEN-END:initComponents + + private void hashCheckBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_hashCheckBoxActionPerformed + setComponentsEnabled(); + firePropertyChange(FileSearchPanel.EVENT.CHECKED.toString(), null, null); + }//GEN-LAST:event_hashCheckBoxActionPerformed + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JMenuItem copyMenuItem; + private javax.swing.JMenuItem cutMenuItem; + private javax.swing.JCheckBox hashCheckBox; + private javax.swing.JMenuItem pasteMenuItem; + private javax.swing.JPopupMenu rightClickMenu; + private javax.swing.JTextField searchTextField; + private javax.swing.JMenuItem selectAllMenuItem; + // End of variables declaration//GEN-END:variables + + void addActionListener(ActionListener l) { + searchTextField.addActionListener(l); + } +} From 73b13282ad10fef20b487c0794306b215a1513e4 Mon Sep 17 00:00:00 2001 From: Ann Priestman Date: Tue, 29 Aug 2017 13:31:13 -0400 Subject: [PATCH 034/104] Add data source error messages to the log --- .../autopsy/casemodule/AddLocalFilesTask.java | 4 ++++ .../autopsy/datasourceprocessors/AddRawImageTask.java | 11 ++++++++--- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/AddLocalFilesTask.java b/Core/src/org/sleuthkit/autopsy/casemodule/AddLocalFilesTask.java index 6d1785133a..b2d14db118 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/AddLocalFilesTask.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/AddLocalFilesTask.java @@ -20,12 +20,14 @@ package org.sleuthkit.autopsy.casemodule; import java.util.ArrayList; import java.util.List; +import java.util.logging.Level; import org.openide.util.NbBundle; import org.sleuthkit.autopsy.corecomponentinterfaces.DataSourceProcessorCallback; import org.sleuthkit.autopsy.corecomponentinterfaces.DataSourceProcessorProgressMonitor; import org.sleuthkit.datamodel.AbstractFile; import org.sleuthkit.datamodel.Content; import org.sleuthkit.autopsy.casemodule.services.FileManager; +import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.datamodel.LocalFilesDataSource; import org.sleuthkit.datamodel.TskCoreException; import org.sleuthkit.datamodel.TskDataException; @@ -37,6 +39,7 @@ import org.sleuthkit.datamodel.TskDataException; */ class AddLocalFilesTask implements Runnable { + private static final Logger LOGGER = Logger.getLogger(AddLocalFilesTask.class.getName()); private final String deviceId; private final String rootVirtualDirectoryName; private final List localFilePaths; @@ -89,6 +92,7 @@ class AddLocalFilesTask implements Runnable { newDataSources.add(newDataSource.getRootDirectory()); } catch (TskDataException | TskCoreException ex) { errors.add(ex.getMessage()); + LOGGER.log(Level.SEVERE, String.format("Failed to add datasource: %s", ex.getMessage()), ex); } finally { DataSourceProcessorCallback.DataSourceProcessorResult result; if (!errors.isEmpty()) { diff --git a/Core/src/org/sleuthkit/autopsy/datasourceprocessors/AddRawImageTask.java b/Core/src/org/sleuthkit/autopsy/datasourceprocessors/AddRawImageTask.java index c85eedaa06..2e1735f3da 100644 --- a/Core/src/org/sleuthkit/autopsy/datasourceprocessors/AddRawImageTask.java +++ b/Core/src/org/sleuthkit/autopsy/datasourceprocessors/AddRawImageTask.java @@ -24,6 +24,7 @@ import java.io.File; import java.nio.file.Paths; import java.util.ArrayList; import java.util.List; +import java.util.logging.Level; import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.corecomponentinterfaces.DataSourceProcessorCallback; import org.sleuthkit.autopsy.corecomponentinterfaces.DataSourceProcessorProgressMonitor; @@ -129,8 +130,10 @@ final class AddRawImageTask implements Runnable { File imageFile = Paths.get(imageFilePath).toFile(); if (!imageFile.exists()) { - errorMessages.add(Bundle.AddRawImageTask_image_critical_error_adding() + imageFilePath + Bundle.AddRawImageTask_for_device() - + deviceId + Bundle.AddRawImageTask_image_notExisting()); + String errorMessage = Bundle.AddRawImageTask_image_critical_error_adding() + imageFilePath + Bundle.AddRawImageTask_for_device() + + deviceId + Bundle.AddRawImageTask_image_notExisting(); + errorMessages.add(errorMessage); + logger.log(Level.SEVERE, errorMessage); criticalErrorOccurred = true; return; } @@ -173,7 +176,9 @@ final class AddRawImageTask implements Runnable { caseDatabase.addLayoutFiles(dataSource, fileRanges); } catch (TskCoreException ex) { - errorMessages.add(Bundle.AddRawImageTask_image_critical_error_adding() + imageFilePaths + Bundle.AddRawImageTask_for_device() + deviceId + ":" + ex.getLocalizedMessage()); + String errorMessage = Bundle.AddRawImageTask_image_critical_error_adding() + imageFilePaths + Bundle.AddRawImageTask_for_device() + deviceId + ":" + ex.getLocalizedMessage(); + errorMessages.add(errorMessage); + logger.log(Level.SEVERE, errorMessage, ex); criticalErrorOccurred = true; } finally { caseDatabase.releaseExclusiveLock(); From ab6475010879db579f4406a9dab09546f90c6b27 Mon Sep 17 00:00:00 2001 From: Eugene Livis Date: Tue, 29 Aug 2017 15:19:38 -0400 Subject: [PATCH 035/104] Minor changes to panel --- Core/src/org/sleuthkit/autopsy/filesearch/HashSearchPanel.form | 3 --- Core/src/org/sleuthkit/autopsy/filesearch/HashSearchPanel.java | 1 - 2 files changed, 4 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/filesearch/HashSearchPanel.form b/Core/src/org/sleuthkit/autopsy/filesearch/HashSearchPanel.form index dabb115e57..bb410a2aaa 100755 --- a/Core/src/org/sleuthkit/autopsy/filesearch/HashSearchPanel.form +++ b/Core/src/org/sleuthkit/autopsy/filesearch/HashSearchPanel.form @@ -95,9 +95,6 @@ - - - diff --git a/Core/src/org/sleuthkit/autopsy/filesearch/HashSearchPanel.java b/Core/src/org/sleuthkit/autopsy/filesearch/HashSearchPanel.java index 827cc31141..22b8f74314 100755 --- a/Core/src/org/sleuthkit/autopsy/filesearch/HashSearchPanel.java +++ b/Core/src/org/sleuthkit/autopsy/filesearch/HashSearchPanel.java @@ -134,7 +134,6 @@ class HashSearchPanel extends javax.swing.JPanel { }); searchTextField.setFont(searchTextField.getFont().deriveFont(searchTextField.getFont().getStyle() & ~java.awt.Font.BOLD, 11)); - searchTextField.setText(org.openide.util.NbBundle.getMessage(HashSearchPanel.class, "NameSearchPanel.searchTextField.text")); // NOI18N javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); From 8656c0451f31620b143e36e8655d6f610f0cf1ab Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Wed, 30 Aug 2017 10:31:13 -0400 Subject: [PATCH 036/104] 2832 minor clean up of CR config gui after 2934 --- .../centralrepository/optionspanel/EamDbSettingsDialog.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/EamDbSettingsDialog.java b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/EamDbSettingsDialog.java index 6ef345ac4f..03518ce9fc 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/EamDbSettingsDialog.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/EamDbSettingsDialog.java @@ -57,7 +57,8 @@ public class EamDbSettingsDialog extends JDialog { */ @Messages({"EamDbSettingsDialog.title.text=Central Repository Database Configuration", "EamDbSettingsDialog.lbSingleUserSqLite.text=SQLite should only be used by one examiner at a time.", - "EamDbSettingsDialog.lbDatabaseType.text=Database type :"}) + "EamDbSettingsDialog.lbDatabaseType.text=Database type :", + "EamDbSettingsDialog.fcDatabasePath.title=Select location for central_repository.db"}) public EamDbSettingsDialog() { super((JFrame) WindowManager.getDefault().getMainWindow(), @@ -75,6 +76,7 @@ public class EamDbSettingsDialog extends JDialog { initComponents(); fcDatabasePath.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); + fcDatabasePath.setDialogTitle(Bundle.EamDbSettingsDialog_fcDatabasePath_title()); cbDatabaseType.setSelectedItem(selectedPlatform); customizeComponents(); valid(); @@ -301,7 +303,6 @@ public class EamDbSettingsDialog extends JDialog { @Messages({"EamDbSettingsDialog.chooserPath.failedToGetDbPathMsg=Selected database path is invalid. Try again."}) private void bnDatabasePathFileOpenActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnDatabasePathFileOpenActionPerformed - fcDatabasePath.setCurrentDirectory(new File(dbSettingsSqlite.getDbDirectory())); fcDatabasePath.setSelectedFile(new File(dbSettingsSqlite.getDbDirectory())); if (fcDatabasePath.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) { File databaseFile = fcDatabasePath.getSelectedFile(); From 2ecbd096e6faa6307059f2722b0ade9cf43025aa Mon Sep 17 00:00:00 2001 From: Ann Priestman Date: Wed, 30 Aug 2017 11:14:35 -0400 Subject: [PATCH 037/104] Move query out of sleuthkit --- .../datamodel/AbstractContentNode.java | 42 +++++++++++++++---- .../DirectoryTreeFilterChildren.java | 11 ++--- 2 files changed, 38 insertions(+), 15 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/AbstractContentNode.java b/Core/src/org/sleuthkit/autopsy/datamodel/AbstractContentNode.java index 6d642e809b..ada48a2953 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/AbstractContentNode.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/AbstractContentNode.java @@ -18,6 +18,8 @@ */ package org.sleuthkit.autopsy.datamodel; +import java.sql.ResultSet; +import java.sql.SQLException; import java.util.List; import java.util.logging.Level; @@ -25,8 +27,11 @@ import org.openide.util.lookup.Lookups; import org.openide.util.Lookup; import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.coreutils.Logger; +import org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE; import org.sleuthkit.datamodel.Content; +import org.sleuthkit.datamodel.SleuthkitCase; import org.sleuthkit.datamodel.TskCoreException; +import org.sleuthkit.datamodel.TskData; import org.sleuthkit.datamodel.TskException; /** @@ -92,17 +97,38 @@ public abstract class AbstractContentNode extends ContentNode * @return true if has children */ public boolean hasVisibleContentChildren() { - boolean hasChildren = false; - if (content != null) { - try { - if(0 < Case.getCurrentCase().getSleuthkitCase().getVisibleContentChildrenCount(content)){ - hasChildren = true; + return contentHasVisibleContentChildren(content); + } + + /** + * Return true if the given content object has children. Useful for lazy + * loading. + * + * @param c The content object to look for children on + * @return true if has children + */ + public static boolean contentHasVisibleContentChildren(Content c){ + if (c != null) { + String query = "SELECT COUNT(obj_id) AS count FROM " + + " ( SELECT obj_id FROM tsk_objects WHERE par_obj_id = " + c.getId() + " AND type = " + + TskData.ObjectType.ARTIFACT.getObjectType() + + " INTERSECT SELECT artifact_obj_id FROM blackboard_artifacts WHERE obj_id = " + c.getId() + + " AND (artifact_type_id = " + ARTIFACT_TYPE.TSK_EMAIL_MSG.getTypeID() + + " OR artifact_type_id = " + ARTIFACT_TYPE.TSK_MESSAGE.getTypeID() + ") " + + " UNION SELECT obj_id FROM tsk_objects WHERE par_obj_id = " + c.getId() + + " AND type = " + TskData.ObjectType.ABSTRACTFILE.getObjectType() + ")"; //NON-NLS; + + + try (SleuthkitCase.CaseDbQuery dbQuery = Case.getCurrentCase().getSleuthkitCase().executeQuery(query)) { + ResultSet resultSet = dbQuery.getResultSet(); + if(resultSet.next()){ + return (0 < resultSet.getInt("count")); } - } catch (TskCoreException ex) { - logger.log(Level.SEVERE, "Error checking if the node has children, for content: " + content, ex); //NON-NLS + } catch (TskCoreException | SQLException ex) { + logger.log(Level.SEVERE, "Error checking if the node has children, for content: " + c, ex); //NON-NLS } } - return hasChildren; + return false; } /** diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeFilterChildren.java b/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeFilterChildren.java index 58f19e5d7a..cf88e41701 100644 --- a/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeFilterChildren.java +++ b/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeFilterChildren.java @@ -27,6 +27,7 @@ import org.openide.nodes.FilterNode; import org.openide.nodes.Node; import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.datamodel.AbstractAbstractFileNode; +import org.sleuthkit.autopsy.datamodel.AbstractContentNode; import org.sleuthkit.autopsy.datamodel.BlackboardArtifactNode; import org.sleuthkit.autopsy.datamodel.DisplayableItemNode; import org.sleuthkit.autopsy.datamodel.DisplayableItemNodeVisitor; @@ -121,7 +122,7 @@ class DirectoryTreeFilterChildren extends FilterNode.Children { && !((Directory) c).getName().equals(".."))) { ret = false; break; - } else if (0 < Case.getCurrentCase().getSleuthkitCase().getVisibleContentChildrenCount(c)) { + } else if(AbstractContentNode.contentHasVisibleContentChildren(c)){ //fie has children, such as derived files ret = false; break; @@ -205,12 +206,8 @@ class DirectoryTreeFilterChildren extends FilterNode.Children { if ((childContent instanceof AbstractFile) && ((AbstractFile) childContent).isDir()) { return false; } else { - try{ - if(0 < Case.getCurrentCase().getSleuthkitCase().getVisibleContentChildrenCount(childContent)){ - return false; - } - } catch (TskCoreException e){ - logger.log(Level.SEVERE, "Error checking if file node is leaf.", e); //NON-NLS + if(AbstractContentNode.contentHasVisibleContentChildren(childContent)){ + return false; } } } From 9959546fa4f5cd6431fe1d7e639ea9d9519222cb Mon Sep 17 00:00:00 2001 From: Ann Priestman Date: Wed, 30 Aug 2017 11:22:16 -0400 Subject: [PATCH 038/104] Removing unused imports --- .../autopsy/directorytree/DirectoryTreeFilterChildren.java | 2 -- .../autopsy/directorytree/DirectoryTreeFilterNode.java | 1 - 2 files changed, 3 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeFilterChildren.java b/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeFilterChildren.java index cf88e41701..4ca9e458c6 100644 --- a/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeFilterChildren.java +++ b/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeFilterChildren.java @@ -25,7 +25,6 @@ import org.openide.nodes.Children; import org.sleuthkit.autopsy.datamodel.DirectoryNode; import org.openide.nodes.FilterNode; import org.openide.nodes.Node; -import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.datamodel.AbstractAbstractFileNode; import org.sleuthkit.autopsy.datamodel.AbstractContentNode; import org.sleuthkit.autopsy.datamodel.BlackboardArtifactNode; @@ -44,7 +43,6 @@ import org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE; import org.sleuthkit.datamodel.Content; import org.sleuthkit.datamodel.Directory; import org.sleuthkit.datamodel.LayoutFile; -import org.sleuthkit.datamodel.TskCoreException; import org.sleuthkit.datamodel.TskException; import org.sleuthkit.datamodel.VirtualDirectory; import org.sleuthkit.datamodel.Volume; diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeFilterNode.java b/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeFilterNode.java index 846ea1aa06..a515fe17de 100755 --- a/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeFilterNode.java +++ b/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeFilterNode.java @@ -25,7 +25,6 @@ import java.util.logging.Level; import javax.swing.Action; import org.openide.nodes.FilterNode; import org.openide.nodes.Node; -import org.openide.util.Exceptions; import org.openide.util.NbBundle; import org.openide.util.lookup.Lookups; import org.openide.util.lookup.ProxyLookup; From 5bd77f9cd7121d2582d1255470cfe90a5e82ac14 Mon Sep 17 00:00:00 2001 From: Ann Priestman Date: Wed, 30 Aug 2017 14:07:52 -0400 Subject: [PATCH 039/104] Update case display name in central repo if the user changes it --- .../eventlisteners/CaseEventListener.java | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/CaseEventListener.java b/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/CaseEventListener.java index 2bacb9234f..7c4201012f 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/CaseEventListener.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/CaseEventListener.java @@ -241,6 +241,30 @@ public class CaseEventListener implements PropertyChangeListener { } } // CURRENT_CASE break; + + case NAME: { + // The display name of the case has been changed + + if (!EamDb.isEnabled()) { + break; + } + + if(evt.getNewValue() instanceof String){ + String newName = (String)evt.getNewValue(); + try { + // See if the case is in the database. If it is, update the display name. + EamCase existingCase = dbManager.getCaseDetails(Case.getCurrentCase().getName()); + + if (null != existingCase) { + existingCase.setDisplayName(newName); + dbManager.updateCase(existingCase); + } + } catch (EamDbException ex) { + LOGGER.log(Level.SEVERE, "Error connecting to Central Repository database.", ex); //NON-NLS + } + } + } // NAME + break; } } } From 82abde2dda6419a7e4d482eaba751c566c6e386d Mon Sep 17 00:00:00 2001 From: Eugene Livis Date: Wed, 30 Aug 2017 16:08:21 -0400 Subject: [PATCH 040/104] AIm system log changes --- .../autopsy/experimental/autoingest/AutoIngestManager.java | 2 -- .../autopsy/experimental/autoingest/AutoIngestSystemLogger.java | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestManager.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestManager.java index afae397553..0f36d63aea 100644 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestManager.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestManager.java @@ -2646,8 +2646,6 @@ public final class AutoIngestManager extends Observable implements PropertyChang * back into hostNamesToRunningJobs as a result of * processing the job status update. */ - SYS_LOGGER.log(Level.WARNING, "Auto ingest node {0} timed out while processing folder {1}", - new Object[]{job.getNodeName(), job.getManifest().getFilePath().toString()}); hostNamesToRunningJobs.remove(job.getNodeName()); setChanged(); notifyObservers(Event.JOB_COMPLETED); diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestSystemLogger.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestSystemLogger.java index 08b3016eb5..184d5d350a 100644 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestSystemLogger.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestSystemLogger.java @@ -35,7 +35,7 @@ import org.sleuthkit.autopsy.coreutils.PlatformUtil; */ final class AutoIngestSystemLogger { - private static final int LOG_SIZE = 10000000; // In bytes, zero is unlimited, set to roughly 10mb currently + private static final int LOG_SIZE = 50000000; // In bytes, zero is unlimited, set to roughly 10mb currently private static final int LOG_FILE_COUNT = 10; private static final Logger LOGGER = Logger.getLogger("AutoIngest"); //NON-NLS private static final String NEWLINE = System.lineSeparator(); From 0408036295d4fc540847ed0e819f55ebf23a2f70 Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Thu, 31 Aug 2017 11:05:19 -0400 Subject: [PATCH 041/104] 2970 Central Repo options panel only allows applying of enabled CR when config is done --- .../optionspanel/GlobalSettingsPanel.form | 21 +++++++++++++++++-- .../optionspanel/GlobalSettingsPanel.java | 20 ++++++++++++++---- 2 files changed, 35 insertions(+), 6 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/GlobalSettingsPanel.form b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/GlobalSettingsPanel.form index 2e87f1d5a4..aeb4dfd880 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/GlobalSettingsPanel.form +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/GlobalSettingsPanel.form @@ -83,7 +83,11 @@ - + + + + + @@ -108,7 +112,10 @@ - + + + + @@ -152,6 +159,16 @@ + + + + + + + + + + diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/GlobalSettingsPanel.java b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/GlobalSettingsPanel.java index c0be22bf90..5d8e294173 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/GlobalSettingsPanel.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/GlobalSettingsPanel.java @@ -56,7 +56,8 @@ public final class GlobalSettingsPanel extends IngestModuleGlobalSettingsPanel i } @Messages({"GlobalSettingsPanel.title=Central Repository Settings", - "GlobalSettingsPanel.cbUseCentralRepo.text=Use a Central Repository"}) + "GlobalSettingsPanel.cbUseCentralRepo.text=Use a Central Repository", + "GlobalSettingsPanel.lbConfigCentralRepo.text=Central Repository must be configured before it can be used."}) private void customizeComponents() { setName(Bundle.GlobalSettingsPanel_title()); } @@ -83,6 +84,7 @@ public final class GlobalSettingsPanel extends IngestModuleGlobalSettingsPanel i lbDbPlatformValue = new javax.swing.JLabel(); lbDbNameValue = new javax.swing.JLabel(); lbDbLocationValue = new javax.swing.JLabel(); + lbConfigCentralRepo = new javax.swing.JLabel(); pnDatabaseContentButtons = new javax.swing.JPanel(); bnImportDatabase = new javax.swing.JButton(); bnManageTags = new javax.swing.JButton(); @@ -107,6 +109,9 @@ public final class GlobalSettingsPanel extends IngestModuleGlobalSettingsPanel i } }); + lbConfigCentralRepo.setForeground(new java.awt.Color(255, 0, 0)); + org.openide.awt.Mnemonics.setLocalizedText(lbConfigCentralRepo, org.openide.util.NbBundle.getMessage(GlobalSettingsPanel.class, "GlobalSettingsPanel.lbConfigCentralRepo.text")); // NOI18N + javax.swing.GroupLayout pnDatabaseConfigurationLayout = new javax.swing.GroupLayout(pnDatabaseConfiguration); pnDatabaseConfiguration.setLayout(pnDatabaseConfigurationLayout); pnDatabaseConfigurationLayout.setHorizontalGroup( @@ -125,7 +130,10 @@ public final class GlobalSettingsPanel extends IngestModuleGlobalSettingsPanel i .addComponent(lbDbPlatformValue, javax.swing.GroupLayout.PREFERRED_SIZE, 711, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(lbDbNameValue, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 711, javax.swing.GroupLayout.PREFERRED_SIZE)) .addComponent(lbDbLocationValue, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 711, javax.swing.GroupLayout.PREFERRED_SIZE))) - .addComponent(bnDbConfigure)) + .addGroup(pnDatabaseConfigurationLayout.createSequentialGroup() + .addComponent(bnDbConfigure) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(lbConfigCentralRepo, javax.swing.GroupLayout.PREFERRED_SIZE, 361, javax.swing.GroupLayout.PREFERRED_SIZE))) .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); pnDatabaseConfigurationLayout.setVerticalGroup( @@ -144,7 +152,9 @@ public final class GlobalSettingsPanel extends IngestModuleGlobalSettingsPanel i .addComponent(lbDbLocationLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(lbDbLocationValue, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 11, Short.MAX_VALUE) - .addComponent(bnDbConfigure) + .addGroup(pnDatabaseConfigurationLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(bnDbConfigure) + .addComponent(lbConfigCentralRepo)) .addContainerGap()) ); @@ -314,7 +324,7 @@ public final class GlobalSettingsPanel extends IngestModuleGlobalSettingsPanel i * @return true if it's okay, false otherwise. */ public boolean valid() { - return true; + return !(cbUseCentralRepo.isSelected() && lbDbPlatformValue.getText().equals(DISABLED.toString())); } @Override @@ -401,6 +411,7 @@ public final class GlobalSettingsPanel extends IngestModuleGlobalSettingsPanel i lbDbPlatformTypeLabel.setEnabled(enable && !ingestRunning); lbDbPlatformValue.setEnabled(enable && !ingestRunning); tbOops.setEnabled(enable && !ingestRunning); + lbConfigCentralRepo.setVisible(enable && EamDbPlatformEnum.getSelectedPlatform().equals(DISABLED)); } /** @@ -425,6 +436,7 @@ public final class GlobalSettingsPanel extends IngestModuleGlobalSettingsPanel i private javax.swing.JButton bnManageTags; private javax.swing.JButton bnManageTypes; private javax.swing.JCheckBox cbUseCentralRepo; + private javax.swing.JLabel lbConfigCentralRepo; private javax.swing.JLabel lbDbLocationLabel; private javax.swing.JLabel lbDbLocationValue; private javax.swing.JLabel lbDbNameLabel; From bdbb42f1b7edc189891837a77c596aed8a10a105 Mon Sep 17 00:00:00 2001 From: esaunders Date: Thu, 31 Aug 2017 11:15:44 -0400 Subject: [PATCH 042/104] Missed CURRENT_CASE in my first pass for Tags and BlackboardArtifactNode. --- .../autopsy/datamodel/BlackboardArtifactNode.java | 7 ++++--- Core/src/org/sleuthkit/autopsy/datamodel/Tags.java | 3 ++- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/BlackboardArtifactNode.java b/Core/src/org/sleuthkit/autopsy/datamodel/BlackboardArtifactNode.java index 2bda34f1c1..ad96345202 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/BlackboardArtifactNode.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/BlackboardArtifactNode.java @@ -69,9 +69,10 @@ public class BlackboardArtifactNode extends DisplayableItemNode { private static final Logger LOGGER = Logger.getLogger(BlackboardArtifactNode.class.getName()); private static final Set CASE_EVENTS_OF_INTEREST = EnumSet.of(Case.Events.BLACKBOARD_ARTIFACT_TAG_ADDED, - Case.Events.BLACKBOARD_ARTIFACT_TAG_DELETED, - Case.Events.CONTENT_TAG_ADDED, - Case.Events.CONTENT_TAG_DELETED); + Case.Events.BLACKBOARD_ARTIFACT_TAG_DELETED, + Case.Events.CONTENT_TAG_ADDED, + Case.Events.CONTENT_TAG_DELETED, + Case.Events.CURRENT_CASE); private static Cache contentCache = CacheBuilder.newBuilder() .expireAfterWrite(1, TimeUnit.MINUTES). diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/Tags.java b/Core/src/org/sleuthkit/autopsy/datamodel/Tags.java index 53722568c2..64b77ac245 100755 --- a/Core/src/org/sleuthkit/autopsy/datamodel/Tags.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/Tags.java @@ -123,7 +123,8 @@ public class Tags implements AutopsyVisitableItem { private final Set CASE_EVENTS_OF_INTEREST = EnumSet.of(Case.Events.BLACKBOARD_ARTIFACT_TAG_ADDED, Case.Events.BLACKBOARD_ARTIFACT_TAG_DELETED, Case.Events.CONTENT_TAG_ADDED, - Case.Events.CONTENT_TAG_DELETED); + Case.Events.CONTENT_TAG_DELETED, + Case.Events.CURRENT_CASE); private final PropertyChangeListener pcl = new PropertyChangeListener() { @Override From 65038d90e234265fa2e3b054b6a43e1431fc789d Mon Sep 17 00:00:00 2001 From: esaunders Date: Thu, 31 Aug 2017 11:21:47 -0400 Subject: [PATCH 043/104] Remove unused import. --- Core/src/org/sleuthkit/autopsy/casemodule/Case.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/Case.java b/Core/src/org/sleuthkit/autopsy/casemodule/Case.java index c05256dcce..d6226a06d8 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/Case.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/Case.java @@ -35,7 +35,6 @@ import java.sql.Statement; import java.text.SimpleDateFormat; import java.util.Collection; import java.util.Date; -import java.util.EnumSet; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -51,7 +50,6 @@ import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.ThreadFactory; import java.util.concurrent.TimeUnit; -import java.util.function.Consumer; import java.util.logging.Level; import java.util.stream.Collectors; import java.util.stream.Stream; From 36eb41780283dccd9760904ab9f0a1182a203224 Mon Sep 17 00:00:00 2001 From: esaunders Date: Thu, 31 Aug 2017 11:31:39 -0400 Subject: [PATCH 044/104] Remove more unused import. --- Core/src/org/sleuthkit/autopsy/datamodel/DeletedContent.java | 3 --- Core/src/org/sleuthkit/autopsy/datamodel/ExtractedContent.java | 1 - 2 files changed, 4 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/DeletedContent.java b/Core/src/org/sleuthkit/autopsy/datamodel/DeletedContent.java index 335a04930d..a8873decde 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/DeletedContent.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/DeletedContent.java @@ -23,14 +23,11 @@ import java.beans.PropertyChangeListener; import java.util.ArrayList; import java.util.Arrays; import java.util.EnumSet; -import java.util.HashSet; import java.util.List; import java.util.Observable; import java.util.Observer; import java.util.Set; import java.util.logging.Level; -import java.util.stream.Collectors; -import java.util.stream.Stream; import javax.swing.JOptionPane; import javax.swing.SwingUtilities; import org.openide.nodes.AbstractNode; diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/ExtractedContent.java b/Core/src/org/sleuthkit/autopsy/datamodel/ExtractedContent.java index 34dc9bf517..317cb42d10 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/ExtractedContent.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/ExtractedContent.java @@ -26,7 +26,6 @@ import java.util.Comparator; import java.util.EnumSet; import java.util.HashMap; import java.util.List; -import java.util.Set; import java.util.logging.Level; import org.openide.nodes.ChildFactory; import org.openide.nodes.Children; From 289a05c32de806ef097a082903f1baa0b4a9cc56 Mon Sep 17 00:00:00 2001 From: Ann Priestman Date: Thu, 31 Aug 2017 11:44:10 -0400 Subject: [PATCH 045/104] Delete the central repo database if initialization fails --- .../datamodel/PostgresEamDbSettings.java | 24 +++++++++- .../datamodel/SqliteEamDbSettings.java | 24 +++++++++- .../optionspanel/EamDbSettingsDialog.java | 48 ++++++++++++++----- 3 files changed, 82 insertions(+), 14 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/PostgresEamDbSettings.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/PostgresEamDbSettings.java index 32ed226a5f..96a2feb4cf 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/PostgresEamDbSettings.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/PostgresEamDbSettings.java @@ -281,6 +281,27 @@ public final class PostgresEamDbSettings { return true; } + + public boolean deleteDatabase() { + Connection conn = getEphemeralConnection(true); + if (null == conn) { + return false; + } + + String sql = "DROP DATABASE %s"; // NON-NLS + try { + Statement stmt; + stmt = conn.createStatement(); + stmt.execute(String.format(sql, getDbName())); + } catch (SQLException ex) { + LOGGER.log(Level.SEVERE, "Failed to execute drop database statement.", ex); // NON-NLS + return false; + } finally { + EamDbUtil.closeConnection(conn); + } + return true; + + } /** * Initialize the database schema. @@ -463,7 +484,8 @@ public final class PostgresEamDbSettings { } finally { EamDbUtil.closeConnection(conn); } - return true; + return false; // testing temp temp + //return true; } public boolean insertDefaultDatabaseContent() { diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/SqliteEamDbSettings.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/SqliteEamDbSettings.java index 5c02d17ea0..a5221f130a 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/SqliteEamDbSettings.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/SqliteEamDbSettings.java @@ -109,6 +109,18 @@ public final class SqliteEamDbSettings { ModuleSettings.setConfigSetting("CentralRepository", "db.sqlite.bulkThreshold", Integer.toString(getBulkThreshold())); // NON-NLS ModuleSettings.setConfigSetting("CentralRepository", "db.badTags", String.join(",", badTags)); // NON-NLS } + + public boolean dbFileExists() { + //if(dbDirectoryExists()){ + File dbFile = new File(getFileNameWithPath()); + if(! dbFile.exists()){ + return false; + } + // It's unlikely, but make sure the file isn't actually a directory + return ( ! dbFile.isDirectory()); + //} + //return false; + } /** * Verify that the db directory path exists. @@ -148,6 +160,15 @@ public final class SqliteEamDbSettings { return true; } + + /** + * Delete the database + * @return + */ + public boolean deleteDatabase() { + File dbFile = new File(this.getFileNameWithPath()); + return dbFile.delete(); + } /** * Get the full connection URL as a String @@ -408,7 +429,8 @@ public final class SqliteEamDbSettings { } finally { EamDbUtil.closeConnection(conn); } - return true; + //return true; + return false; // temp testing } public boolean insertDefaultDatabaseContent() { diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/EamDbSettingsDialog.java b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/EamDbSettingsDialog.java index 6ef345ac4f..548053bd84 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/EamDbSettingsDialog.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/EamDbSettingsDialog.java @@ -318,26 +318,32 @@ public class EamDbSettingsDialog extends JDialog { switch (selectedPlatform) { case POSTGRESQL: if (dbSettingsPostgres.verifyConnection()) { - if (dbSettingsPostgres.verifyDatabaseExists() - && dbSettingsPostgres.verifyDatabaseSchema()) { - testingStatus = DatabaseTestResult.TESTEDOK; + if (dbSettingsPostgres.verifyDatabaseExists()) { + if( dbSettingsPostgres.verifyDatabaseSchema()) { + testingStatus = DatabaseTestResult.TESTEDOK; + } else { + testingStatus = DatabaseTestResult.SCHEMA_INVALID; + } } else { - testingStatus = DatabaseTestResult.SCHEMA_INVALID; + testingStatus = DatabaseTestResult.DB_DOES_NOT_EXIST; } } else { testingStatus = DatabaseTestResult.CONNECTION_FAILED; } break; case SQLITE: - if (dbSettingsSqlite.dbDirectoryExists() - && dbSettingsSqlite.verifyConnection()) { - if (dbSettingsSqlite.verifyDatabaseSchema()) { - testingStatus = DatabaseTestResult.TESTEDOK; + if (dbSettingsSqlite.dbFileExists()){ + if(dbSettingsSqlite.verifyConnection()) { + if (dbSettingsSqlite.verifyDatabaseSchema()) { + testingStatus = DatabaseTestResult.TESTEDOK; + } else { + testingStatus = DatabaseTestResult.SCHEMA_INVALID; + } } else { testingStatus = DatabaseTestResult.SCHEMA_INVALID; } } else { - testingStatus = DatabaseTestResult.SCHEMA_INVALID; + testingStatus = DatabaseTestResult.DB_DOES_NOT_EXIST; } break; } @@ -348,7 +354,7 @@ public class EamDbSettingsDialog extends JDialog { @Messages({"EamDbSettingsDialog.okButton.createDbError.title=Unable to Create Database", "EamDbSettingsDialog.okButton.createSQLiteDbError.message=Unable to create SQLite Database, please ensure location exists and you have write permissions and try again.", "EamDbSettingsDialog.okButton.createPostgresDbError.message=Unable to create Postgres Database, please ensure address, port, and login credentials are correct for Postgres server and try again."}) - private void createDb() { + private void createDb(boolean removeIncompleteDatabase) { boolean result = false; boolean dbCreated = true; switch (selectedPlatform) { @@ -361,6 +367,11 @@ public class EamDbSettingsDialog extends JDialog { && dbSettingsPostgres.insertDefaultDatabaseContent(); } if (!result) { + // Remove the incomplete database + if(dbCreated && removeIncompleteDatabase){ + dbSettingsPostgres.deleteDatabase(); + } + JOptionPane.showMessageDialog(WindowManager.getDefault().getMainWindow(), Bundle.EamDbSettingsDialog_okButton_createPostgresDbError_message(), Bundle.EamDbSettingsDialog_okButton_createDbError_title(), @@ -378,6 +389,10 @@ public class EamDbSettingsDialog extends JDialog { && dbSettingsSqlite.insertDefaultDatabaseContent(); } if (!result) { + if(dbCreated && removeIncompleteDatabase){ + dbSettingsSqlite.deleteDatabase(); + } + JOptionPane.showMessageDialog(WindowManager.getDefault().getMainWindow(), Bundle.EamDbSettingsDialog_okButton_createSQLiteDbError_message(), Bundle.EamDbSettingsDialog_okButton_createDbError_title(), @@ -394,6 +409,8 @@ public class EamDbSettingsDialog extends JDialog { @Messages({"EamDbSettingsDialog.okButton.errorTitle.text=Restart Required.", "EamDbSettingsDialog.okButton.errorMsg.text=Please restart Autopsy to begin using the new database platform.", "EamDbSettingsDialog.okButton.connectionErrorMsg.text=Failed to connect to Central Repository database.", + "EamDbSettingsDialog.okButton.corruptDatabaseExists.title=Error Loading Database", + "EamDbSettingsDialog.okButton.corruptDatabaseExists.message=Database exists but is not the right format. Manually delete it or choose a different path.", "EamDbSettingsDialog.okButton.createDbDialog.title=Database Does Not Exist", "EamDbSettingsDialog.okButton.createDbDialog.message=Database does not exist, would you like to create it?", "EamDbSettingsDialog.okButton.databaseConnectionFailed.title=Database Connection Failed", @@ -406,13 +423,19 @@ public class EamDbSettingsDialog extends JDialog { Bundle.EamDbSettingsDialog_okButton_databaseConnectionFailed_message(), Bundle.EamDbSettingsDialog_okButton_databaseConnectionFailed_title(), JOptionPane.WARNING_MESSAGE); - } else if (testingStatus == DatabaseTestResult.SCHEMA_INVALID) { + } else if (testingStatus == DatabaseTestResult.SCHEMA_INVALID){ + // There's an existing database or file, but it's not in our format. + JOptionPane.showMessageDialog(WindowManager.getDefault().getMainWindow(), + Bundle.EamDbSettingsDialog_okButton_corruptDatabaseExists_message(), + Bundle.EamDbSettingsDialog_okButton_corruptDatabaseExists_title(), + JOptionPane.WARNING_MESSAGE); + } else if (testingStatus == DatabaseTestResult.DB_DOES_NOT_EXIST) { //database doesn't exist do you want to create if (JOptionPane.YES_OPTION == JOptionPane.showConfirmDialog(WindowManager.getDefault().getMainWindow(), Bundle.EamDbSettingsDialog_okButton_createDbDialog_message(), Bundle.EamDbSettingsDialog_okButton_createDbDialog_title(), JOptionPane.YES_NO_OPTION)) { - createDb(); + createDb(testingStatus == DatabaseTestResult.DB_DOES_NOT_EXIST); } } @@ -750,6 +773,7 @@ public class EamDbSettingsDialog extends JDialog { UNTESTED, CONNECTION_FAILED, SCHEMA_INVALID, + DB_DOES_NOT_EXIST, TESTEDOK; } From 2c744bad486b6fa74b2573ef053a2055d5185ad1 Mon Sep 17 00:00:00 2001 From: Ann Priestman Date: Thu, 31 Aug 2017 13:29:17 -0400 Subject: [PATCH 046/104] Cleanup --- .../centralrepository/datamodel/PostgresEamDbSettings.java | 3 +-- .../centralrepository/datamodel/SqliteEamDbSettings.java | 3 +-- .../centralrepository/optionspanel/EamDbSettingsDialog.java | 2 +- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/PostgresEamDbSettings.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/PostgresEamDbSettings.java index 96a2feb4cf..7220e1dd56 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/PostgresEamDbSettings.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/PostgresEamDbSettings.java @@ -484,8 +484,7 @@ public final class PostgresEamDbSettings { } finally { EamDbUtil.closeConnection(conn); } - return false; // testing temp temp - //return true; + return true; } public boolean insertDefaultDatabaseContent() { diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/SqliteEamDbSettings.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/SqliteEamDbSettings.java index a5221f130a..642ee8dc2e 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/SqliteEamDbSettings.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/SqliteEamDbSettings.java @@ -429,8 +429,7 @@ public final class SqliteEamDbSettings { } finally { EamDbUtil.closeConnection(conn); } - //return true; - return false; // temp testing + return true; } public boolean insertDefaultDatabaseContent() { diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/EamDbSettingsDialog.java b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/EamDbSettingsDialog.java index 548053bd84..799ca884e7 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/EamDbSettingsDialog.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/EamDbSettingsDialog.java @@ -410,7 +410,7 @@ public class EamDbSettingsDialog extends JDialog { "EamDbSettingsDialog.okButton.errorMsg.text=Please restart Autopsy to begin using the new database platform.", "EamDbSettingsDialog.okButton.connectionErrorMsg.text=Failed to connect to Central Repository database.", "EamDbSettingsDialog.okButton.corruptDatabaseExists.title=Error Loading Database", - "EamDbSettingsDialog.okButton.corruptDatabaseExists.message=Database exists but is not the right format. Manually delete it or choose a different path.", + "EamDbSettingsDialog.okButton.corruptDatabaseExists.message=Database exists but is not the right format. Manually delete it or choose a different path (if applicable).", "EamDbSettingsDialog.okButton.createDbDialog.title=Database Does Not Exist", "EamDbSettingsDialog.okButton.createDbDialog.message=Database does not exist, would you like to create it?", "EamDbSettingsDialog.okButton.databaseConnectionFailed.title=Database Connection Failed", From a3d9d7bcc979413b6ae7fc58d9f2dc0602f31f2b Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Thu, 31 Aug 2017 13:59:09 -0400 Subject: [PATCH 047/104] 2970 removed redundant message about config --- .../optionspanel/GlobalSettingsPanel.form | 21 ++----------------- .../optionspanel/GlobalSettingsPanel.java | 15 ++----------- 2 files changed, 4 insertions(+), 32 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/GlobalSettingsPanel.form b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/GlobalSettingsPanel.form index aeb4dfd880..2e87f1d5a4 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/GlobalSettingsPanel.form +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/GlobalSettingsPanel.form @@ -83,11 +83,7 @@ - - - - - + @@ -112,10 +108,7 @@ - - - - + @@ -159,16 +152,6 @@ - - - - - - - - - - diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/GlobalSettingsPanel.java b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/GlobalSettingsPanel.java index 5d8e294173..4f7b726e1d 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/GlobalSettingsPanel.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/GlobalSettingsPanel.java @@ -84,7 +84,6 @@ public final class GlobalSettingsPanel extends IngestModuleGlobalSettingsPanel i lbDbPlatformValue = new javax.swing.JLabel(); lbDbNameValue = new javax.swing.JLabel(); lbDbLocationValue = new javax.swing.JLabel(); - lbConfigCentralRepo = new javax.swing.JLabel(); pnDatabaseContentButtons = new javax.swing.JPanel(); bnImportDatabase = new javax.swing.JButton(); bnManageTags = new javax.swing.JButton(); @@ -109,9 +108,6 @@ public final class GlobalSettingsPanel extends IngestModuleGlobalSettingsPanel i } }); - lbConfigCentralRepo.setForeground(new java.awt.Color(255, 0, 0)); - org.openide.awt.Mnemonics.setLocalizedText(lbConfigCentralRepo, org.openide.util.NbBundle.getMessage(GlobalSettingsPanel.class, "GlobalSettingsPanel.lbConfigCentralRepo.text")); // NOI18N - javax.swing.GroupLayout pnDatabaseConfigurationLayout = new javax.swing.GroupLayout(pnDatabaseConfiguration); pnDatabaseConfiguration.setLayout(pnDatabaseConfigurationLayout); pnDatabaseConfigurationLayout.setHorizontalGroup( @@ -130,10 +126,7 @@ public final class GlobalSettingsPanel extends IngestModuleGlobalSettingsPanel i .addComponent(lbDbPlatformValue, javax.swing.GroupLayout.PREFERRED_SIZE, 711, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(lbDbNameValue, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 711, javax.swing.GroupLayout.PREFERRED_SIZE)) .addComponent(lbDbLocationValue, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 711, javax.swing.GroupLayout.PREFERRED_SIZE))) - .addGroup(pnDatabaseConfigurationLayout.createSequentialGroup() - .addComponent(bnDbConfigure) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(lbConfigCentralRepo, javax.swing.GroupLayout.PREFERRED_SIZE, 361, javax.swing.GroupLayout.PREFERRED_SIZE))) + .addComponent(bnDbConfigure)) .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); pnDatabaseConfigurationLayout.setVerticalGroup( @@ -152,9 +145,7 @@ public final class GlobalSettingsPanel extends IngestModuleGlobalSettingsPanel i .addComponent(lbDbLocationLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(lbDbLocationValue, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 11, Short.MAX_VALUE) - .addGroup(pnDatabaseConfigurationLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(bnDbConfigure) - .addComponent(lbConfigCentralRepo)) + .addComponent(bnDbConfigure) .addContainerGap()) ); @@ -411,7 +402,6 @@ public final class GlobalSettingsPanel extends IngestModuleGlobalSettingsPanel i lbDbPlatformTypeLabel.setEnabled(enable && !ingestRunning); lbDbPlatformValue.setEnabled(enable && !ingestRunning); tbOops.setEnabled(enable && !ingestRunning); - lbConfigCentralRepo.setVisible(enable && EamDbPlatformEnum.getSelectedPlatform().equals(DISABLED)); } /** @@ -436,7 +426,6 @@ public final class GlobalSettingsPanel extends IngestModuleGlobalSettingsPanel i private javax.swing.JButton bnManageTags; private javax.swing.JButton bnManageTypes; private javax.swing.JCheckBox cbUseCentralRepo; - private javax.swing.JLabel lbConfigCentralRepo; private javax.swing.JLabel lbDbLocationLabel; private javax.swing.JLabel lbDbLocationValue; private javax.swing.JLabel lbDbNameLabel; From 2f4a40d95f4e730bc5694de17c02413817f158cd Mon Sep 17 00:00:00 2001 From: Ann Priestman Date: Thu, 31 Aug 2017 14:00:21 -0400 Subject: [PATCH 048/104] Cleanup --- .../datamodel/SqliteEamDbSettings.java | 20 ++++++++++--------- .../optionspanel/EamDbSettingsDialog.java | 8 ++++---- 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/SqliteEamDbSettings.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/SqliteEamDbSettings.java index 642ee8dc2e..3910c00ab1 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/SqliteEamDbSettings.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/SqliteEamDbSettings.java @@ -110,16 +110,18 @@ public final class SqliteEamDbSettings { ModuleSettings.setConfigSetting("CentralRepository", "db.badTags", String.join(",", badTags)); // NON-NLS } + /** + * Verify that the db file exists. + * + * @return true if exists, else false + */ public boolean dbFileExists() { - //if(dbDirectoryExists()){ - File dbFile = new File(getFileNameWithPath()); - if(! dbFile.exists()){ - return false; - } - // It's unlikely, but make sure the file isn't actually a directory - return ( ! dbFile.isDirectory()); - //} - //return false; + File dbFile = new File(getFileNameWithPath()); + if(! dbFile.exists()){ + return false; + } + // It's unlikely, but make sure the file isn't actually a directory + return ( ! dbFile.isDirectory()); } /** diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/EamDbSettingsDialog.java b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/EamDbSettingsDialog.java index 799ca884e7..d34efbb9c9 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/EamDbSettingsDialog.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/EamDbSettingsDialog.java @@ -354,7 +354,7 @@ public class EamDbSettingsDialog extends JDialog { @Messages({"EamDbSettingsDialog.okButton.createDbError.title=Unable to Create Database", "EamDbSettingsDialog.okButton.createSQLiteDbError.message=Unable to create SQLite Database, please ensure location exists and you have write permissions and try again.", "EamDbSettingsDialog.okButton.createPostgresDbError.message=Unable to create Postgres Database, please ensure address, port, and login credentials are correct for Postgres server and try again."}) - private void createDb(boolean removeIncompleteDatabase) { + private void createDb() { boolean result = false; boolean dbCreated = true; switch (selectedPlatform) { @@ -368,7 +368,7 @@ public class EamDbSettingsDialog extends JDialog { } if (!result) { // Remove the incomplete database - if(dbCreated && removeIncompleteDatabase){ + if(dbCreated){ dbSettingsPostgres.deleteDatabase(); } @@ -389,7 +389,7 @@ public class EamDbSettingsDialog extends JDialog { && dbSettingsSqlite.insertDefaultDatabaseContent(); } if (!result) { - if(dbCreated && removeIncompleteDatabase){ + if(dbCreated){ dbSettingsSqlite.deleteDatabase(); } @@ -435,7 +435,7 @@ public class EamDbSettingsDialog extends JDialog { Bundle.EamDbSettingsDialog_okButton_createDbDialog_message(), Bundle.EamDbSettingsDialog_okButton_createDbDialog_title(), JOptionPane.YES_NO_OPTION)) { - createDb(testingStatus == DatabaseTestResult.DB_DOES_NOT_EXIST); + createDb(); } } From 71fcb1db66d545a4b0d7432789dcc560e586c109 Mon Sep 17 00:00:00 2001 From: Eugene Livis Date: Thu, 31 Aug 2017 16:16:25 -0400 Subject: [PATCH 049/104] Lots of additional loging in events of Solr query failures --- .../autopsy/keywordsearch/AccountsText.java | 2 +- .../autopsy/keywordsearch/HighlightedText.java | 8 +++++--- .../sleuthkit/autopsy/keywordsearch/LuceneQuery.java | 4 ++-- .../org/sleuthkit/autopsy/keywordsearch/RawText.java | 2 ++ .../org/sleuthkit/autopsy/keywordsearch/Server.java | 12 ++++++++---- 5 files changed, 18 insertions(+), 10 deletions(-) diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/AccountsText.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/AccountsText.java index d7e4032447..911edc472a 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/AccountsText.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/AccountsText.java @@ -317,7 +317,7 @@ class AccountsText implements IndexedText { // extracted content (minus highlight tags) is HTML-escaped return "
" + highlightedText + "
"; //NON-NLS } catch (Exception ex) { - logger.log(Level.WARNING, "Error getting highlighted text for " + solrObjectId, ex); //NON-NLS + logger.log(Level.SEVERE, "Error getting highlighted text for Solr doc id " + this.solrObjectId + ", chunkID " + this.currentPage , ex); //NON-NLS return Bundle.AccountsText_getMarkup_queryFailedMsg(); } } diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/HighlightedText.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/HighlightedText.java index ad09b66077..b8bb93b240 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/HighlightedText.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/HighlightedText.java @@ -341,6 +341,8 @@ class HighlightedText implements IndexedText { @Override public String getText() { + String chunkID = ""; + String highlightField = ""; try { loadPageInfo(); //inits once SolrQuery q = new SolrQuery(); @@ -348,14 +350,14 @@ class HighlightedText implements IndexedText { String contentIdStr = Long.toString(this.objectId); if (numberPages != 0) { - final String chunkID = Integer.toString(this.currentPage); + chunkID = Integer.toString(this.currentPage); contentIdStr += "0".equals(chunkID) ? "" : "_" + chunkID; } final String filterQuery = Server.Schema.ID.toString() + ":" + KeywordSearchUtil.escapeLuceneQuery(contentIdStr); double indexSchemaVersion = NumberUtils.toDouble(solrServer.getIndexInfo().getSchemaVersion()); //choose field to highlight based on isLiteral and Solr index schema version. - String highlightField = (isLiteral || (indexSchemaVersion < 2.0)) + highlightField = (isLiteral || (indexSchemaVersion < 2.0)) ? LuceneQuery.HIGHLIGHT_FIELD : Server.Schema.CONTENT_STR.toString(); if (isLiteral) { @@ -419,7 +421,7 @@ class HighlightedText implements IndexedText { return "
" + highlightedContent + "
"; //NON-NLS } catch (TskCoreException | KeywordSearchModuleException | NoOpenCoreException ex) { - logger.log(Level.SEVERE, "Error getting highlighted text for " + objectId, ex); //NON-NLS + logger.log(Level.SEVERE, "Error getting highlighted text for Solr doc id " + objectId + ", chunkID " + chunkID + ", highlight query: " + highlightField, ex); //NON-NLS return NbBundle.getMessage(this.getClass(), "HighlightedMatchesSource.getMarkup.queryFailedMsg"); } } diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/LuceneQuery.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/LuceneQuery.java index 3821501574..93a9e40480 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/LuceneQuery.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/LuceneQuery.java @@ -396,10 +396,10 @@ class LuceneQuery implements KeywordSearchQuery { return EscapeUtil.unEscapeHtml(contentHighlights.get(0)).trim(); } } catch (NoOpenCoreException ex) { - logger.log(Level.WARNING, "Error executing Lucene Solr Query: " + query, ex); //NON-NLS + logger.log(Level.SEVERE, "Error executing Lucene Solr Query: " + query +". Solr doc id " + solrObjectId + ", chunkID " + chunkID , ex); //NON-NLS throw ex; } catch (KeywordSearchModuleException ex) { - logger.log(Level.WARNING, "Error executing Lucene Solr Query: " + query, ex); //NON-NLS + logger.log(Level.SEVERE, "Error executing Lucene Solr Query: " + query +". Solr doc id " + solrObjectId + ", chunkID " + chunkID , ex); //NON-NLS return ""; } } diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/RawText.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/RawText.java index 469d25da54..043738ae30 100755 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/RawText.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/RawText.java @@ -264,6 +264,7 @@ class RawText implements IndexedText { //not cached try { String indexedText = solrServer.getSolrContent(this.objectId, chunkId); + if (indexedText == null) indexedText = ""; cachedString = EscapeUtil.escapeHtml(indexedText).trim(); StringBuilder sb = new StringBuilder(cachedString.length() + 20); sb.append("
").append(cachedString).append("
"); //NON-NLS @@ -279,6 +280,7 @@ class RawText implements IndexedText { private String getArtifactText() throws SolrServerException{ try { String indexedText = KeywordSearch.getServer().getSolrContent(this.objectId, 1); + if (indexedText == null) indexedText = ""; indexedText = EscapeUtil.escapeHtml(indexedText).trim(); StringBuilder sb = new StringBuilder(indexedText.length() + 20); sb.append("
").append(indexedText).append("
"); //NON-NLS diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Server.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Server.java index c2072cfa54..2552358de7 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Server.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Server.java @@ -1007,6 +1007,7 @@ public class Server { try { return currentCore.query(sq); } catch (SolrServerException ex) { + logger.log(Level.SEVERE, "Solr query failed: " + sq.getQuery(), ex); //NON-NLS throw new KeywordSearchModuleException(NbBundle.getMessage(this.getClass(), "Server.query.exception.msg", sq.getQuery()), ex); } } finally { @@ -1034,6 +1035,7 @@ public class Server { try { return currentCore.query(sq, method); } catch (SolrServerException | IOException ex) { + logger.log(Level.SEVERE, "Solr query failed: " + sq.getQuery(), ex); //NON-NLS throw new KeywordSearchModuleException(NbBundle.getMessage(this.getClass(), "Server.query2.exception.msg", sq.getQuery()), ex); } } finally { @@ -1060,6 +1062,7 @@ public class Server { try { return currentCore.queryTerms(sq); } catch (SolrServerException | IOException ex) { + logger.log(Level.SEVERE, "Solr terms query failed: " + sq.getQuery(), ex); //NON-NLS throw new KeywordSearchModuleException(NbBundle.getMessage(this.getClass(), "Server.queryTerms.exception.msg", sq.getQuery()), ex); } } finally { @@ -1319,10 +1322,11 @@ public class Server { /** * get the text from the content field for the given file * - * @param contentID - * @param chunkID + * @param contentID Solr document ID + * @param chunkID Chunk ID of the Solr document * - * @return + * @return Text from matching Solr document (as String). Null if no + * matching Solr document found or error while getting content from Solr */ private String getSolrContent(long contentID, int chunkID) { final SolrQuery q = new SolrQuery(); @@ -1352,7 +1356,7 @@ public class Server { } } } catch (SolrServerException ex) { - logger.log(Level.WARNING, "Error getting content from Solr", ex); //NON-NLS + logger.log(Level.SEVERE, "Error getting content from Solr. Solr document id " + contentID + ", chunk id " + chunkID + ", query: " + filterQuery, ex); //NON-NLS return null; } From ba3338eccc417f412c5fc76f73a1b5c1c9b2775c Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Thu, 31 Aug 2017 17:22:35 -0400 Subject: [PATCH 050/104] 2970 allow property change to be fired when cofig was modified --- .../optionspanel/EamDbSettingsDialog.java | 11 +++++++++++ .../optionspanel/GlobalSettingsPanel.java | 5 ++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/EamDbSettingsDialog.java b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/EamDbSettingsDialog.java index 6ef345ac4f..54660c8205 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/EamDbSettingsDialog.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/EamDbSettingsDialog.java @@ -51,6 +51,7 @@ public class EamDbSettingsDialog extends JDialog { private final SqliteEamDbSettings dbSettingsSqlite; private DatabaseTestResult testingStatus; private EamDbPlatformEnum selectedPlatform; + private boolean configurationChanged = false; /** * Creates new form EamDbSettingsDialog @@ -390,6 +391,14 @@ public class EamDbSettingsDialog extends JDialog { testingStatus = DatabaseTestResult.TESTEDOK; valid(); } + /** + * Returns if changes to the central repository configuration were successfully applied + * + * @return true if the database configuration was successfully changed false if it was not + */ + boolean wasConfigurationChanged() { + return configurationChanged; + } @Messages({"EamDbSettingsDialog.okButton.errorTitle.text=Restart Required.", "EamDbSettingsDialog.okButton.errorMsg.text=Please restart Autopsy to begin using the new database platform.", @@ -459,6 +468,7 @@ public class EamDbSettingsDialog extends JDialog { // in case we are still using the same instance. try { EamDb.getInstance().updateSettings(); + configurationChanged = true; } catch (EamDbException ex) { LOGGER.log(Level.SEVERE, Bundle.EamDbSettingsDialog_okButton_connectionErrorMsg_text(), ex); //NON-NLS setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); @@ -473,6 +483,7 @@ public class EamDbSettingsDialog extends JDialog { // in case we are still using the same instance. try { EamDb.getInstance().updateSettings(); + configurationChanged = true; } catch (EamDbException ex) { LOGGER.log(Level.SEVERE, Bundle.EamDbSettingsDialog_okButton_connectionErrorMsg_text(), ex); //NON-NLS setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/GlobalSettingsPanel.java b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/GlobalSettingsPanel.java index 4f7b726e1d..bf5e5cc000 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/GlobalSettingsPanel.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/GlobalSettingsPanel.java @@ -261,6 +261,9 @@ public final class GlobalSettingsPanel extends IngestModuleGlobalSettingsPanel i store(); EamDbSettingsDialog dialog = new EamDbSettingsDialog(); load(); // reload db settings content and update buttons + if (dialog.wasConfigurationChanged()) { + firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null); + } }//GEN-LAST:event_bnDbConfigureActionPerformed private void cbUseCentralRepoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cbUseCentralRepoActionPerformed @@ -315,7 +318,7 @@ public final class GlobalSettingsPanel extends IngestModuleGlobalSettingsPanel i * @return true if it's okay, false otherwise. */ public boolean valid() { - return !(cbUseCentralRepo.isSelected() && lbDbPlatformValue.getText().equals(DISABLED.toString())); + return !cbUseCentralRepo.isSelected() || !lbDbPlatformValue.getText().equals(DISABLED.toString()); } @Override From 5c4964966a6c7383af8b99eee1196cd142a40409 Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Thu, 31 Aug 2017 17:37:28 -0400 Subject: [PATCH 051/104] 2970 cleanup remove unused bundle message --- .../centralrepository/optionspanel/GlobalSettingsPanel.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/GlobalSettingsPanel.java b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/GlobalSettingsPanel.java index bf5e5cc000..bf6e59d8fd 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/GlobalSettingsPanel.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/GlobalSettingsPanel.java @@ -56,8 +56,7 @@ public final class GlobalSettingsPanel extends IngestModuleGlobalSettingsPanel i } @Messages({"GlobalSettingsPanel.title=Central Repository Settings", - "GlobalSettingsPanel.cbUseCentralRepo.text=Use a Central Repository", - "GlobalSettingsPanel.lbConfigCentralRepo.text=Central Repository must be configured before it can be used."}) + "GlobalSettingsPanel.cbUseCentralRepo.text=Use a Central Repository"}) private void customizeComponents() { setName(Bundle.GlobalSettingsPanel_title()); } From 0f87862d66b4684b01ea8daaa96f6b36969951a3 Mon Sep 17 00:00:00 2001 From: Richard Cordovano Date: Fri, 1 Sep 2017 18:12:33 -0400 Subject: [PATCH 052/104] Update version number in project.properties for a beta release --- nbproject/project.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nbproject/project.properties b/nbproject/project.properties index 50957852e4..81a4c5a0c4 100644 --- a/nbproject/project.properties +++ b/nbproject/project.properties @@ -4,7 +4,7 @@ app.title=Autopsy ### lowercase version of above app.name=${branding.token} ### if left unset, version will default to today's date -app.version=4.4.1 +app.version=4.4.2 ### build.type must be one of: DEVELOPMENT, RELEASE #build.type=RELEASE build.type=DEVELOPMENT From 27cdb356b0c8cf38397ad78397ded90edcf3cb1f Mon Sep 17 00:00:00 2001 From: millmanorama Date: Tue, 5 Sep 2017 10:58:14 +0200 Subject: [PATCH 053/104] fix the AccountsText/credit card highlighting. also add the content name to the progress indicator. ome other minor cleanup --- .../autopsy/keywordsearch/AccountsText.java | 22 ++++--- .../autopsy/keywordsearch/Bundle.properties | 3 - .../keywordsearch/ExtractedContentPanel.java | 64 ++++++++----------- .../keywordsearch/ExtractedContentViewer.java | 13 ++-- .../autopsy/keywordsearch/IndexedText.java | 3 +- .../autopsy/keywordsearch/RegexQuery.java | 8 +-- 6 files changed, 49 insertions(+), 64 deletions(-) diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/AccountsText.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/AccountsText.java index d7e4032447..1c1629ce54 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/AccountsText.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/AccountsText.java @@ -73,7 +73,7 @@ class AccountsText implements IndexedText { private final long solrObjectId; private final Collection artifacts; private final Set accountNumbers = new HashSet<>(); - private final String displayName; + private final String title; @GuardedBy("this") private boolean isPageInfoLoaded = false; @@ -105,7 +105,7 @@ class AccountsText implements IndexedText { AccountsText(long objectID, Collection artifacts) { this.solrObjectId = objectID; this.artifacts = artifacts; - displayName = artifacts.size() == 1 + title = artifacts.size() == 1 ? Bundle.AccountsText_creditCardNumber() : Bundle.AccountsText_creditCardNumbers(); } @@ -227,11 +227,17 @@ class AccountsText implements IndexedText { } //add both the canonical form and the form in the text as accountNumbers to highlight. - this.accountNumbers.add(artifact.getAttribute(TSK_KEYWORD).getValueString()); - this.accountNumbers.add(artifact.getAttribute(TSK_CARD_NUMBER).getValueString()); + BlackboardAttribute attribute = artifact.getAttribute(TSK_KEYWORD); + if (attribute != null) { + this.accountNumbers.add(attribute.getValueString()); + } + attribute = artifact.getAttribute(TSK_CARD_NUMBER); + if (attribute != null) { + this.accountNumbers.add(attribute.getValueString()); + } //if the chunk id is present just use that. - Optional chunkID = + Optional chunkID = Optional.ofNullable(artifact.getAttribute(TSK_KEYWORD_SEARCH_DOCUMENT_ID)) .map(BlackboardAttribute::getValueString) .map(String::trim) @@ -245,10 +251,10 @@ class AccountsText implements IndexedText { needsQuery = true; } } - + if (needsQuery) { // Run a query to figure out which chunks for the current object have hits. - Keyword queryKeyword = new Keyword(CCN_REGEX, false, false); + Keyword queryKeyword = new Keyword(CCN_REGEX, false, false); KeywordSearchQuery chunksQuery = KeywordSearchUtil.getQueryForKeyword(queryKeyword, new KeywordList(Arrays.asList(queryKeyword))); chunksQuery.addFilter(new KeywordQueryFilter(KeywordQueryFilter.FilterType.CHUNK, this.solrObjectId)); //load the chunks/pages from the result of the query. @@ -353,7 +359,7 @@ class AccountsText implements IndexedText { @Override public String toString() { - return displayName; + return title; } @Override diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle.properties b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle.properties index 99d88938ce..762afbea92 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle.properties +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle.properties @@ -60,7 +60,6 @@ AbstractKeywordSearchPerformer.search.ingestInProgressBody=Keyword Search AbstractKeywordSearchPerformer.search.emptyKeywordErrorBody=Keyword list is empty, please add at least one keyword to the list AbstractKeywordSearchPerformer.search.noFilesInIdxMsg=No files are in index yet.
Try again later. Index is updated every {0} minutes. AbstractKeywordSearchPerformer.search.noFilesIdxdMsg=No files were indexed.
Re-ingest the image with the Keyword Search Module enabled. -ExtractedContentPanel.setMarkup.panelTxt=Loading text... Please wait ExtractedContentViewer.toolTip=Displays extracted text from files and keyword-search results. Requires Keyword Search ingest to be run on a file to activate this viewer. ExtractedContentViewer.getTitle=Indexed Text ExtractedContentViewer.getSolrContent.knownFileMsg=

{0} is a known file (based on MD5 hash) and does not have text in the index.

@@ -161,8 +160,6 @@ DropdownSearchPanel.copyMenuItem.text=Copy AbstractFileStringContentStream.getSize.exception.msg=Cannot tell how many chars in converted string, until entire string is converted AbstractFileStringContentStream.getSrcInfo.text=File\:{0} ByteContentStream.getSrcInfo.text=File\:{0} -ExtractedContentPanel.SetMarkup.progress.loading=Loading text -ExtractedContentPanel.SetMarkup.progress.displayName=Loading text ExtractedContentViewer.nextPage.exception.msg=No next page. ExtractedContentViewer.previousPage.exception.msg=No previous page. ExtractedContentViewer.hasNextItem.exception.msg=Not supported, not a searchable source. diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/ExtractedContentPanel.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/ExtractedContentPanel.java index a35e022279..24bda9a1f6 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/ExtractedContentPanel.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/ExtractedContentPanel.java @@ -18,17 +18,15 @@ */ package org.sleuthkit.autopsy.keywordsearch; +import com.google.common.base.Strings; import java.awt.ComponentOrientation; import java.awt.EventQueue; -import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; -import java.awt.event.ItemListener; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ExecutionException; import java.util.logging.Level; -import javax.swing.JMenuItem; import javax.swing.JTextPane; import javax.swing.SizeRequirements; import javax.swing.SwingWorker; @@ -45,6 +43,7 @@ import org.openide.util.NbBundle; import org.sleuthkit.autopsy.coreutils.EscapeUtil; import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.coreutils.TextUtil; +import static org.sleuthkit.autopsy.keywordsearch.Bundle.*; /** * Panel displays HTML content sent to ExtractedContentViewer, and provides a @@ -52,7 +51,8 @@ import org.sleuthkit.autopsy.coreutils.TextUtil; */ class ExtractedContentPanel extends javax.swing.JPanel { - private static Logger logger = Logger.getLogger(ExtractedContentPanel.class.getName()); + private static final Logger logger = Logger.getLogger(ExtractedContentPanel.class.getName()); + private String contentName; ExtractedContentPanel() { initComponents(); @@ -124,32 +124,17 @@ class ExtractedContentPanel extends javax.swing.JPanel { extractedTextPane.setEditorKit(editorKit); - sourceComboBox.addItemListener(new ItemListener() { - @Override - public void itemStateChanged(ItemEvent e) { - if (e.getStateChange() == ItemEvent.SELECTED) { - IndexedText source = (IndexedText) e.getItem(); - setMarkup(source); - } + sourceComboBox.addItemListener((ItemEvent e) -> { + if (e.getStateChange() == ItemEvent.SELECTED) { + setMarkup((IndexedText) e.getItem()); } }); - setSources(new ArrayList()); + setSources("",new ArrayList<>()); extractedTextPane.setComponentPopupMenu(rightClickMenu); - ActionListener actList = new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - JMenuItem jmi = (JMenuItem) e.getSource(); - if (jmi.equals(copyMenuItem)) { - extractedTextPane.copy(); - } else if (jmi.equals(selectAllMenuItem)) { - extractedTextPane.selectAll(); - } - } - }; - copyMenuItem.addActionListener(actList); - selectAllMenuItem.addActionListener(actList); + copyMenuItem.addActionListener(actionEvent -> extractedTextPane.copy()); + selectAllMenuItem.addActionListener(actionEvent -> extractedTextPane.selectAll()); } /** @@ -364,8 +349,7 @@ class ExtractedContentPanel extends javax.swing.JPanel { // End of variables declaration//GEN-END:variables void refreshCurrentMarkup() { - IndexedText ms = (IndexedText) sourceComboBox.getSelectedItem(); - setMarkup(ms); + setMarkup(getSelectedSource()); } /** @@ -374,13 +358,12 @@ class ExtractedContentPanel extends javax.swing.JPanel { * * @param sources */ - void setSources(List sources) { + void setSources(String contentName, List sources) { + this.contentName = contentName; sourceComboBox.removeAllItems(); setPanelText(null, false); - for (IndexedText ms : sources) { - sourceComboBox.addItem(ms); - } + sources.forEach(sourceComboBox::addItem); if (!sources.isEmpty()) { sourceComboBox.setSelectedIndex(0); @@ -411,9 +394,8 @@ class ExtractedContentPanel extends javax.swing.JPanel { } private void setPanelText(String text, boolean detectDirection) { - if (text == null) { - text = ""; - } + + text = Strings.nullToEmpty(text); if (detectDirection) { //detect text direction using first 1024 chars and set it @@ -640,9 +622,10 @@ class ExtractedContentPanel extends javax.swing.JPanel { * text). Updates GUI in GUI thread and gets markup in background thread. To * be invoked from GUI thread only. */ + @NbBundle.Messages("ExtractedContentPanel.setMarkup.panelTxt=Loading text... Please wait") private void setMarkup(IndexedText source) { - setPanelText(NbBundle.getMessage(this.getClass(), "ExtractedContentPanel.setMarkup.panelTxt"), false); - new SetMarkupWorker(source).execute(); + setPanelText(ExtractedContentPanel_setMarkup_panelTxt(), false); + new SetMarkupWorker(contentName,source).execute(); } /** @@ -652,18 +635,21 @@ class ExtractedContentPanel extends javax.swing.JPanel { */ private final class SetMarkupWorker extends SwingWorker { + private final String contentName; + private final IndexedText source; private ProgressHandle progress; - SetMarkupWorker(IndexedText source) { + SetMarkupWorker(String contentName,IndexedText source) { + this.contentName = contentName; this.source = source; } @Override + @NbBundle.Messages({"# 0 - Content name","ExtractedContentPanel.SetMarkup.progress.loading=Loading text for {0}"}) protected String doInBackground() throws Exception { - progress = ProgressHandle.createHandle(NbBundle.getMessage(this.getClass(), "ExtractedContentPanel.SetMarkup.progress.loading")); - progress.setDisplayName(NbBundle.getMessage(this.getClass(), "ExtractedContentPanel.SetMarkup.progress.displayName")); + progress = ProgressHandle.createHandle(ExtractedContentPanel_SetMarkup_progress_loading(contentName)); progress.start(); progress.switchToIndeterminate(); diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/ExtractedContentViewer.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/ExtractedContentViewer.java index 47c71a8213..554477215e 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/ExtractedContentViewer.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/ExtractedContentViewer.java @@ -27,13 +27,13 @@ import java.util.Collection; import java.util.List; import java.util.logging.Level; import org.openide.nodes.Node; -import org.openide.util.Exceptions; import org.openide.util.Lookup; import org.openide.util.NbBundle; import org.openide.util.lookup.ServiceProvider; import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.corecomponentinterfaces.DataContentViewer; import org.sleuthkit.autopsy.coreutils.Logger; +import org.sleuthkit.datamodel.AbstractFile; import org.sleuthkit.datamodel.BlackboardArtifact; import static org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_ACCOUNT; import static org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_KEYWORD_HIT; @@ -91,7 +91,7 @@ public class ExtractedContentViewer implements DataContentViewer { } Lookup nodeLookup = node.getLookup(); - Content content = nodeLookup.lookup(Content.class); + AbstractFile content = nodeLookup.lookup(AbstractFile.class); /* * Assemble a collection of all of the indexed text "sources" for the @@ -173,7 +173,7 @@ public class ExtractedContentViewer implements DataContentViewer { } } panel.updateControls(currentSource); - setPanel(sources); + setPanel(content.getName(),sources); } static private IndexedText getRawArtifactText(Lookup nodeLookup) throws TskCoreException { @@ -254,7 +254,7 @@ public class ExtractedContentViewer implements DataContentViewer { @Override public void resetComponent() { - setPanel(new ArrayList<>()); + setPanel("",new ArrayList<>()); panel.resetDisplay(); currentNode = null; currentSource = null; @@ -312,9 +312,10 @@ public class ExtractedContentViewer implements DataContentViewer { * * @param sources */ - private void setPanel(List sources) { + private void setPanel(String contentName, List sources) { + if (panel != null) { - panel.setSources(sources); + panel.setSources(contentName, sources); } } diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/IndexedText.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/IndexedText.java index 7ad2494da4..6bf6a4f3ef 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/IndexedText.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/IndexedText.java @@ -18,8 +18,6 @@ */ package org.sleuthkit.autopsy.keywordsearch; -import java.util.LinkedHashMap; - /** * Interface to provide HTML text to display in ExtractedContentViewer. There is * a SOLR implementation of this that interfaces with SOLR to highlight the @@ -138,4 +136,5 @@ interface IndexedText { * @return the current item number */ int currentItem(); + } diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/RegexQuery.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/RegexQuery.java index 45205b0ca7..8d9ca309e5 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/RegexQuery.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/RegexQuery.java @@ -52,11 +52,8 @@ import org.sleuthkit.datamodel.AbstractFile; import org.sleuthkit.datamodel.Account; import org.sleuthkit.datamodel.BlackboardArtifact; import org.sleuthkit.datamodel.BlackboardAttribute; -import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_CARD_NUMBER; -import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_EMAIL; import org.sleuthkit.datamodel.TskCoreException; import org.sleuthkit.datamodel.TskData; -import org.sleuthkit.datamodel.TskException; /** * The RegexQuery class supports issuing regular expression queries against a @@ -554,7 +551,7 @@ final class RegexQuery implements KeywordSearchQuery { * hit and turns them into artifact attributes. The track 1 data has the * same fields as the track two data, plus the account holder's name. * - * @param attributesMap A map of artifact attribute objects, used to avoid + * @param attributeMap A map of artifact attribute objects, used to avoid * creating duplicate attributes. * @param matcher A matcher for the snippet. */ @@ -567,7 +564,7 @@ final class RegexQuery implements KeywordSearchQuery { * Creates an attribute of the the given type to the given artifact with a * value parsed from the snippet for a credit account number hit. * - * @param attributesMap A map of artifact attribute objects, used to avoid + * @param attributeMap A map of artifact attribute objects, used to avoid * creating duplicate attributes. * @param attrType The type of attribute to create. * @param groupName The group name of the regular expression that was @@ -589,5 +586,4 @@ final class RegexQuery implements KeywordSearchQuery { return null; }); } - } From 16be9d3874e28d2df2682923489e0909e2eaec0b Mon Sep 17 00:00:00 2001 From: millmanorama Date: Thu, 22 Jun 2017 13:31:52 +0200 Subject: [PATCH 054/104] Image Gallery opens un docked --- .../imagegallery/ImageGalleryTopComponent.java | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryTopComponent.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryTopComponent.java index c277da47c9..60cdea5432 100644 --- a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryTopComponent.java +++ b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryTopComponent.java @@ -1,7 +1,7 @@ /* * Autopsy Forensic Browser * - * Copyright 2013-16 Basis Technology Corp. + * Copyright 2011-17 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -18,6 +18,8 @@ */ package org.sleuthkit.autopsy.imagegallery; +import java.util.Collections; +import java.util.List; import java.util.logging.Level; import javafx.application.Platform; import javafx.embed.swing.JFXPanel; @@ -35,6 +37,7 @@ import org.openide.util.Lookup; import org.openide.util.NbBundle.Messages; import org.openide.windows.Mode; import org.openide.windows.TopComponent; +import static org.openide.windows.TopComponent.PROP_UNDOCKING_DISABLED; import org.openide.windows.WindowManager; import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.imagegallery.gui.StatusBar; @@ -200,8 +203,14 @@ public final class ImageGalleryTopComponent extends TopComponent implements Expl // End of variables declaration//GEN-END:variables @Override - public void componentOpened() { + public List availableModes(List modes) { + return Collections.emptyList(); + } + @Override + public void componentOpened() { + WindowManager.getDefault().setTopComponentFloating(this, true); + putClientProperty(PROP_UNDOCKING_DISABLED, true); } @Override From 03285ad4bd0e24662d8960dfb509f9d2be5c15fa Mon Sep 17 00:00:00 2001 From: millmanorama Date: Thu, 22 Jun 2017 17:20:39 +0200 Subject: [PATCH 055/104] attempt to define and use new timeline and ImageGallery modes --- .../timeline/TimeLineTopComponent.java | 13 +++++++---- ImageGallery/manifest.mf | 1 + .../ImageGalleryTopComponent.java | 22 ++++++++++--------- .../imagegallery/ImageGalleryWsmode.xml | 9 ++++++++ .../sleuthkit/autopsy/imagegallery/layer.xml | 10 +++++++++ .../autopsy/imagegallery/timelineWsmode.xml | 9 ++++++++ 6 files changed, 50 insertions(+), 14 deletions(-) create mode 100644 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryWsmode.xml create mode 100644 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/layer.xml create mode 100644 ImageGallery/src/org/sleuthkit/autopsy/imagegallery/timelineWsmode.xml diff --git a/Core/src/org/sleuthkit/autopsy/timeline/TimeLineTopComponent.java b/Core/src/org/sleuthkit/autopsy/timeline/TimeLineTopComponent.java index 4fb092f0c5..97aed20318 100644 --- a/Core/src/org/sleuthkit/autopsy/timeline/TimeLineTopComponent.java +++ b/Core/src/org/sleuthkit/autopsy/timeline/TimeLineTopComponent.java @@ -19,9 +19,9 @@ package org.sleuthkit.autopsy.timeline; import java.beans.PropertyVetoException; -import java.util.Collections; import java.util.List; import java.util.logging.Level; +import java.util.stream.Collectors; import javafx.application.Platform; import javafx.beans.InvalidationListener; import javafx.beans.Observable; @@ -48,7 +48,6 @@ import org.openide.nodes.Node; import org.openide.util.NbBundle; import org.openide.windows.Mode; import org.openide.windows.TopComponent; -import static org.openide.windows.TopComponent.PROP_UNDOCKING_DISABLED; import org.openide.windows.WindowManager; import org.sleuthkit.autopsy.actions.AddBookmarkTagAction; import org.sleuthkit.autopsy.corecomponents.DataContentPanel; @@ -291,7 +290,8 @@ public final class TimeLineTopComponent extends TopComponent implements Explorer @Override public List availableModes(List modes) { - return Collections.emptyList(); + return modes.stream().filter(mode -> mode.getName().equals("timeline")) + .collect(Collectors.toList()); } /** @@ -378,7 +378,12 @@ public final class TimeLineTopComponent extends TopComponent implements Explorer @Override public void componentOpened() { WindowManager.getDefault().setTopComponentFloating(this, true); - putClientProperty(PROP_UNDOCKING_DISABLED, true); + Mode mode = WindowManager.getDefault().findMode("timeline"); // NON-NLS + if (mode != null) { + mode.dockInto(this); + } + +// putClientProperty(PROP_UNDOCKING_DISABLED, true); } @Override diff --git a/ImageGallery/manifest.mf b/ImageGallery/manifest.mf index 9e4c8299d4..52bf6cfe1e 100644 --- a/ImageGallery/manifest.mf +++ b/ImageGallery/manifest.mf @@ -1,5 +1,6 @@ Manifest-Version: 1.0 OpenIDE-Module: org.sleuthkit.autopsy.imagegallery/2 OpenIDE-Module-Implementation-Version: 3 +OpenIDE-Module-Layer: org/sleuthkit/autopsy/imagegallery/layer.xml OpenIDE-Module-Localizing-Bundle: org/sleuthkit/autopsy/imagegallery/Bundle.properties diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryTopComponent.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryTopComponent.java index 60cdea5432..f5b1e60aea 100644 --- a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryTopComponent.java +++ b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryTopComponent.java @@ -18,9 +18,9 @@ */ package org.sleuthkit.autopsy.imagegallery; -import java.util.Collections; import java.util.List; import java.util.logging.Level; +import java.util.stream.Collectors; import javafx.application.Platform; import javafx.embed.swing.JFXPanel; import javafx.scene.Scene; @@ -37,7 +37,6 @@ import org.openide.util.Lookup; import org.openide.util.NbBundle.Messages; import org.openide.windows.Mode; import org.openide.windows.TopComponent; -import static org.openide.windows.TopComponent.PROP_UNDOCKING_DISABLED; import org.openide.windows.WindowManager; import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.imagegallery.gui.StatusBar; @@ -63,7 +62,7 @@ import org.sleuthkit.autopsy.imagegallery.gui.navpanel.HashHitGroupList; preferredID = "ImageGalleryTopComponent", //iconBase = "org/sleuthkit/autopsy/imagegallery/images/lightbulb.png" use this to put icon in window title area, persistenceType = TopComponent.PERSISTENCE_NEVER) -@TopComponent.Registration(mode = "timeline", openAtStartup = false) +@TopComponent.Registration(mode = "ImageGallery", openAtStartup = false) @Messages({ "CTL_ImageGalleryAction=Image/Video Gallery", "CTL_ImageGalleryTopComponent=Image/Video Gallery", @@ -87,11 +86,7 @@ public final class ImageGalleryTopComponent extends TopComponent implements Expl final ImageGalleryTopComponent tc = (ImageGalleryTopComponent) WindowManager.getDefault().findTopComponent(PREFERRED_ID); if (tc != null) { topComponentInitialized = true; - WindowManager.getDefault().isTopComponentFloating(tc); - Mode mode = WindowManager.getDefault().findMode("timeline"); // NON-NLS - if (mode != null) { - mode.dockInto(tc); - } + tc.open(); tc.requestActive(); } @@ -204,13 +199,20 @@ public final class ImageGalleryTopComponent extends TopComponent implements Expl @Override public List availableModes(List modes) { - return Collections.emptyList(); + return modes.stream().filter(mode -> mode.getName().equals("ImageGallery")) + .collect(Collectors.toList()); } @Override public void componentOpened() { + WindowManager.getDefault().setTopComponentFloating(this, true); - putClientProperty(PROP_UNDOCKING_DISABLED, true); + Mode mode = WindowManager.getDefault().findMode("ImageGallery"); // NON-NLS + if (mode != null) { + mode.dockInto(this); + } + +// putClientProperty(PROP_UNDOCKING_DISABLED, true); } @Override diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryWsmode.xml b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryWsmode.xml new file mode 100644 index 0000000000..d89e172a2c --- /dev/null +++ b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryWsmode.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/layer.xml b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/layer.xml new file mode 100644 index 0000000000..f3a4d60368 --- /dev/null +++ b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/layer.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/timelineWsmode.xml b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/timelineWsmode.xml new file mode 100644 index 0000000000..ba1a2155fb --- /dev/null +++ b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/timelineWsmode.xml @@ -0,0 +1,9 @@ + + + + + + + + + From 719b7c67e2f6d213758dc274b06fe09c7323e1db Mon Sep 17 00:00:00 2001 From: millmanorama Date: Thu, 22 Jun 2017 18:06:15 +0200 Subject: [PATCH 056/104] cleanup, make default sizes larger --- .../timeline/TimeLineTopComponent.java | 11 +++---- .../ImageGalleryTopComponent.java | 32 +++---------------- .../imagegallery/ImageGalleryWsmode.xml | 2 +- .../autopsy/imagegallery/timelineWsmode.xml | 2 +- 4 files changed, 11 insertions(+), 36 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/timeline/TimeLineTopComponent.java b/Core/src/org/sleuthkit/autopsy/timeline/TimeLineTopComponent.java index 97aed20318..b9e835eb9f 100644 --- a/Core/src/org/sleuthkit/autopsy/timeline/TimeLineTopComponent.java +++ b/Core/src/org/sleuthkit/autopsy/timeline/TimeLineTopComponent.java @@ -47,6 +47,7 @@ import org.openide.nodes.Children; import org.openide.nodes.Node; import org.openide.util.NbBundle; import org.openide.windows.Mode; +import org.openide.windows.RetainLocation; import org.openide.windows.TopComponent; import org.openide.windows.WindowManager; import org.sleuthkit.autopsy.actions.AddBookmarkTagAction; @@ -72,9 +73,10 @@ import org.sleuthkit.datamodel.TskCoreException; */ @TopComponent.Description( preferredID = "TimeLineTopComponent", - //iconBase="SET/PATH/TO/ICON/HERE", + //iconBase="SET/PATH/TO/ICON/HERE", //use this to put icon in window title area, persistenceType = TopComponent.PERSISTENCE_NEVER) @TopComponent.Registration(mode = "timeline", openAtStartup = false) +@RetainLocation("timeline") public final class TimeLineTopComponent extends TopComponent implements ExplorerManager.Provider { private static final Logger LOGGER = Logger.getLogger(TimeLineTopComponent.class.getName()); @@ -195,6 +197,7 @@ public final class TimeLineTopComponent extends TopComponent implements Explorer * @param controller The TimeLineController for this topcomponent. */ public TimeLineTopComponent(TimeLineController controller) { + putClientProperty(PROP_UNDOCKING_DISABLED, true); initComponents(); associateLookup(ExplorerUtils.createLookup(em, getActionMap())); setName(NbBundle.getMessage(TimeLineTopComponent.class, "CTL_TimeLineTopComponent")); @@ -377,13 +380,9 @@ public final class TimeLineTopComponent extends TopComponent implements Explorer @Override public void componentOpened() { + super.componentOpened(); WindowManager.getDefault().setTopComponentFloating(this, true); - Mode mode = WindowManager.getDefault().findMode("timeline"); // NON-NLS - if (mode != null) { - mode.dockInto(this); - } -// putClientProperty(PROP_UNDOCKING_DISABLED, true); } @Override diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryTopComponent.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryTopComponent.java index f5b1e60aea..a2dbce36da 100644 --- a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryTopComponent.java +++ b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryTopComponent.java @@ -30,12 +30,12 @@ import javafx.scene.layout.BorderPane; import javafx.scene.layout.Priority; import javafx.scene.layout.StackPane; import javafx.scene.layout.VBox; -import org.netbeans.api.settings.ConvertAsProperties; import org.openide.explorer.ExplorerManager; import org.openide.explorer.ExplorerUtils; import org.openide.util.Lookup; import org.openide.util.NbBundle.Messages; import org.openide.windows.Mode; +import org.openide.windows.RetainLocation; import org.openide.windows.TopComponent; import org.openide.windows.WindowManager; import org.sleuthkit.autopsy.coreutils.Logger; @@ -55,13 +55,11 @@ import org.sleuthkit.autopsy.imagegallery.gui.navpanel.HashHitGroupList; * this does not seem to function correctly unless a Netbeans provided explorer * view is present in the TopComponenet, even if it is invisible/ zero sized */ -@ConvertAsProperties( - dtd = "-//org.sleuthkit.autopsy.imagegallery//ImageGallery//EN", - autostore = false) @TopComponent.Description( preferredID = "ImageGalleryTopComponent", //iconBase = "org/sleuthkit/autopsy/imagegallery/images/lightbulb.png" use this to put icon in window title area, persistenceType = TopComponent.PERSISTENCE_NEVER) +@RetainLocation("ImageGallery") @TopComponent.Registration(mode = "ImageGallery", openAtStartup = false) @Messages({ "CTL_ImageGalleryAction=Image/Video Gallery", @@ -131,6 +129,7 @@ public final class ImageGalleryTopComponent extends TopComponent implements Expl private Scene myScene; public ImageGalleryTopComponent() { + putClientProperty(PROP_UNDOCKING_DISABLED, true); setName(Bundle.CTL_ImageGalleryTopComponent()); setToolTipText(Bundle.HINT_ImageGalleryTopComponent()); @@ -205,31 +204,8 @@ public final class ImageGalleryTopComponent extends TopComponent implements Expl @Override public void componentOpened() { - + super.componentOpened(); WindowManager.getDefault().setTopComponentFloating(this, true); - Mode mode = WindowManager.getDefault().findMode("ImageGallery"); // NON-NLS - if (mode != null) { - mode.dockInto(this); - } - -// putClientProperty(PROP_UNDOCKING_DISABLED, true); - } - - @Override - public void componentClosed() { - //TODO: we could do some cleanup here - } - - void writeProperties(java.util.Properties p) { - // better to version settings since initial version as advocated at - // http://wiki.apidesign.org/wiki/PropertyFiles - p.setProperty("version", "1.0"); - // TODO store your settings - } - - void readProperties(java.util.Properties p) { - String version = p.getProperty("version"); - // TODO read your settings according to their version } @Override diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryWsmode.xml b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryWsmode.xml index d89e172a2c..be6afca629 100644 --- a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryWsmode.xml +++ b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryWsmode.xml @@ -2,7 +2,7 @@ - + diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/timelineWsmode.xml b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/timelineWsmode.xml index ba1a2155fb..54ef5cbbe2 100644 --- a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/timelineWsmode.xml +++ b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/timelineWsmode.xml @@ -2,7 +2,7 @@ - + From 2e55e4c028560591bfcefa37de651edaf45b9598 Mon Sep 17 00:00:00 2001 From: millmanorama Date: Fri, 23 Jun 2017 11:07:59 +0200 Subject: [PATCH 057/104] remove unused properties, allow TL and IG to dock, don't refloat them if they are already opened and docked, and the user presses the buttons to open them, remove redundant window icon from TL --- .../autopsy/timeline/Bundle.properties | 4 +- .../autopsy/timeline/Bundle_ja.properties | 1 - .../autopsy/timeline/TimeLineController.java | 8 ++- .../timeline/TimeLineTopComponent.java | 14 ++-- .../ImageGalleryTopComponent.java | 66 +++++++++---------- 5 files changed, 45 insertions(+), 48 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/timeline/Bundle.properties b/Core/src/org/sleuthkit/autopsy/timeline/Bundle.properties index 5b74bea711..4582159030 100644 --- a/Core/src/org/sleuthkit/autopsy/timeline/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/timeline/Bundle.properties @@ -1,7 +1,7 @@ CTL_MakeTimeline=Timeline CTL_TimeLineTopComponentAction=TimeLineTopComponent -CTL_TimeLineTopComponent=Timeline Window -HINT_TimeLineTopComponent=This is a Timeline window +CTL_TimeLineTopComponent=Timeline + Timeline.frameName.text={0} - Autopsy Timeline Timeline.resultsPanel.title=Timeline Results Timeline.runJavaFxThread.progress.creating=Creating timeline . . . diff --git a/Core/src/org/sleuthkit/autopsy/timeline/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/timeline/Bundle_ja.properties index 17f945778a..c631cee729 100644 --- a/Core/src/org/sleuthkit/autopsy/timeline/Bundle_ja.properties +++ b/Core/src/org/sleuthkit/autopsy/timeline/Bundle_ja.properties @@ -1,7 +1,6 @@ CTL_MakeTimeline=\u300c\u30bf\u30a4\u30e0\u30e9\u30a4\u30f3\u300d CTL_TimeLineTopComponent=\u30bf\u30a4\u30e0\u30e9\u30a4\u30f3\u30a6\u30a3\u30f3\u30c9\u30a6 CTL_TimeLineTopComponentAction=\u30bf\u30a4\u30e0\u30e9\u30a4\u30f3\u30c8\u30c3\u30d7\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8 -HINT_TimeLineTopComponent=\u3053\u308c\u306f\u30bf\u30a4\u30e0\u30e9\u30a4\u30f3\u30a6\u30a3\u30f3\u30c9\u30a6\u3067\u3059 OpenTimelineAction.title=\u30bf\u30a4\u30e0\u30e9\u30a4\u30f3 Timeline.frameName.text={0} - Autopsy\u30bf\u30a4\u30e0\u30e9\u30a4\u30f3 Timeline.goToButton.text=\u4e0b\u8a18\u3078\u79fb\u52d5\uff1a diff --git a/Core/src/org/sleuthkit/autopsy/timeline/TimeLineController.java b/Core/src/org/sleuthkit/autopsy/timeline/TimeLineController.java index 2c5a6472ee..3c8062355b 100644 --- a/Core/src/org/sleuthkit/autopsy/timeline/TimeLineController.java +++ b/Core/src/org/sleuthkit/autopsy/timeline/TimeLineController.java @@ -453,8 +453,8 @@ public class TimeLineController { TimeLineController.this.showFullRange(); } else { //prompt user to pick specific event and time range - ShowInTimelineDialog showInTimelineDilaog - = (file == null) + ShowInTimelineDialog showInTimelineDilaog = + (file == null) ? new ShowInTimelineDialog(TimeLineController.this, artifact) : new ShowInTimelineDialog(TimeLineController.this, file); Optional dialogResult = showInTimelineDilaog.showAndWait(); @@ -698,7 +698,9 @@ public class TimeLineController { if (topComponent == null) { topComponent = new TimeLineTopComponent(this); } - topComponent.open(); + if (topComponent.isOpened() == false) { + topComponent.open(); + } topComponent.toFront(); /* * Make this top component active so its ExplorerManager's lookup gets diff --git a/Core/src/org/sleuthkit/autopsy/timeline/TimeLineTopComponent.java b/Core/src/org/sleuthkit/autopsy/timeline/TimeLineTopComponent.java index b9e835eb9f..9b8eac913f 100644 --- a/Core/src/org/sleuthkit/autopsy/timeline/TimeLineTopComponent.java +++ b/Core/src/org/sleuthkit/autopsy/timeline/TimeLineTopComponent.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"); @@ -197,12 +197,10 @@ public final class TimeLineTopComponent extends TopComponent implements Explorer * @param controller The TimeLineController for this topcomponent. */ public TimeLineTopComponent(TimeLineController controller) { - putClientProperty(PROP_UNDOCKING_DISABLED, true); initComponents(); associateLookup(ExplorerUtils.createLookup(em, getActionMap())); setName(NbBundle.getMessage(TimeLineTopComponent.class, "CTL_TimeLineTopComponent")); - setToolTipText(NbBundle.getMessage(TimeLineTopComponent.class, "HINT_TimeLineTopComponent")); - setIcon(WindowManager.getDefault().getMainWindow().getIconImage()); //use the same icon as main application +// setIcon(WindowManager.getDefault().getMainWindow().getIconImage()); //use the same icon as main application getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(AddBookmarkTagAction.BOOKMARK_SHORTCUT, "addBookmarkTag"); //NON-NLS getActionMap().put("addBookmarkTag", new AddBookmarkTagAction()); //NON-NLS @@ -293,7 +291,12 @@ public final class TimeLineTopComponent extends TopComponent implements Explorer @Override public List availableModes(List modes) { - return modes.stream().filter(mode -> mode.getName().equals("timeline")) + /* + * This looks like the right thing to do, but online discussions seems + * to indicate this method is effectively deprecated. A break point + * placed here was never hit. + */ + return modes.stream().filter(mode -> mode.getName().equals("timeline") || mode.getName().equals("ImageGallery")) .collect(Collectors.toList()); } @@ -382,7 +385,6 @@ public final class TimeLineTopComponent extends TopComponent implements Explorer public void componentOpened() { super.componentOpened(); WindowManager.getDefault().setTopComponentFloating(this, true); - } @Override diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryTopComponent.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryTopComponent.java index a2dbce36da..ec5b511b7f 100644 --- a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryTopComponent.java +++ b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryTopComponent.java @@ -63,14 +63,29 @@ import org.sleuthkit.autopsy.imagegallery.gui.navpanel.HashHitGroupList; @TopComponent.Registration(mode = "ImageGallery", openAtStartup = false) @Messages({ "CTL_ImageGalleryAction=Image/Video Gallery", - "CTL_ImageGalleryTopComponent=Image/Video Gallery", - "HINT_ImageGalleryTopComponent=This is a Image/Video Gallery window" + "CTL_ImageGalleryTopComponent=Image/Video Gallery" }) public final class ImageGalleryTopComponent extends TopComponent implements ExplorerManager.Provider, Lookup.Provider { public final static String PREFERRED_ID = "ImageGalleryTopComponent"; // NON-NLS private static final Logger LOGGER = Logger.getLogger(ImageGalleryTopComponent.class.getName()); - private static boolean topComponentInitialized = false; + private static volatile boolean topComponentInitialized = false; + + private final ExplorerManager em = new ExplorerManager(); + private final Lookup lookup = (ExplorerUtils.createLookup(em, getActionMap())); + + private final ImageGalleryController controller = ImageGalleryController.getDefault(); + + private SplitPane splitPane; + private StackPane centralStack; + private BorderPane borderPane = new BorderPane(); + private StackPane fullUIStack; + private MetaDataPane metaDataTable; + private GroupPane groupPane; + private GroupTree groupTree; + private HashHitGroupList hashHitList; + private VBox leftPane; + private Scene myScene; public static void openTopComponent() { //TODO:eventually move to this model, throwing away everything and rebuilding controller groupmanager etc for each case. @@ -81,11 +96,13 @@ public final class ImageGalleryTopComponent extends TopComponent implements Expl // } // } // timeLineController.openTimeLine(); - final ImageGalleryTopComponent tc = (ImageGalleryTopComponent) WindowManager.getDefault().findTopComponent(PREFERRED_ID); + final TopComponent tc = WindowManager.getDefault().findTopComponent(PREFERRED_ID); if (tc != null) { topComponentInitialized = true; - - tc.open(); + if (tc.isOpened() == false) { + tc.open(); + } + tc.toFront(); tc.requestActive(); } } @@ -103,37 +120,8 @@ public final class ImageGalleryTopComponent extends TopComponent implements Expl } } - private final ExplorerManager em = new ExplorerManager(); - - private final Lookup lookup = (ExplorerUtils.createLookup(em, getActionMap())); - - private final ImageGalleryController controller = ImageGalleryController.getDefault(); - - private SplitPane splitPane; - - private StackPane centralStack; - - private BorderPane borderPane = new BorderPane(); - - private StackPane fullUIStack; - - private MetaDataPane metaDataTable; - - private GroupPane groupPane; - - private GroupTree groupTree; - private HashHitGroupList hashHitList; - - private VBox leftPane; - - private Scene myScene; - public ImageGalleryTopComponent() { - putClientProperty(PROP_UNDOCKING_DISABLED, true); - setName(Bundle.CTL_ImageGalleryTopComponent()); - setToolTipText(Bundle.HINT_ImageGalleryTopComponent()); - initComponents(); Platform.runLater(() -> {//initialize jfx ui @@ -198,7 +186,13 @@ public final class ImageGalleryTopComponent extends TopComponent implements Expl @Override public List availableModes(List modes) { - return modes.stream().filter(mode -> mode.getName().equals("ImageGallery")) + /* + * This looks like the right thing to do, but online discussions seems + * to indicate this method is effectively deprecated. A break point + * placed here was never hit. + */ + + return modes.stream().filter(mode -> mode.getName().equals("timeline") || mode.getName().equals("ImageGallery")) .collect(Collectors.toList()); } From 4878e48dc2f926c0a22878a22d53c90a6bbb45af Mon Sep 17 00:00:00 2001 From: millmanorama Date: Fri, 23 Jun 2017 11:28:14 +0200 Subject: [PATCH 058/104] move the timeline mode into core --- Core/src/org/sleuthkit/autopsy/core/layer.xml | 1 + .../src/org/sleuthkit/autopsy/core}/timelineWsmode.xml | 4 ++-- ImageGallery/src/org/sleuthkit/autopsy/imagegallery/layer.xml | 1 - 3 files changed, 3 insertions(+), 3 deletions(-) rename {ImageGallery/src/org/sleuthkit/autopsy/imagegallery => Core/src/org/sleuthkit/autopsy/core}/timelineWsmode.xml (71%) diff --git a/Core/src/org/sleuthkit/autopsy/core/layer.xml b/Core/src/org/sleuthkit/autopsy/core/layer.xml index a5ff7f3ecb..95cfcd481e 100644 --- a/Core/src/org/sleuthkit/autopsy/core/layer.xml +++ b/Core/src/org/sleuthkit/autopsy/core/layer.xml @@ -442,6 +442,7 @@ + diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/timelineWsmode.xml b/Core/src/org/sleuthkit/autopsy/core/timelineWsmode.xml similarity index 71% rename from ImageGallery/src/org/sleuthkit/autopsy/imagegallery/timelineWsmode.xml rename to Core/src/org/sleuthkit/autopsy/core/timelineWsmode.xml index 54ef5cbbe2..2fbb04adf3 100644 --- a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/timelineWsmode.xml +++ b/Core/src/org/sleuthkit/autopsy/core/timelineWsmode.xml @@ -1,8 +1,8 @@ - + - + diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/layer.xml b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/layer.xml index f3a4d60368..aa55613f6f 100644 --- a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/layer.xml +++ b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/layer.xml @@ -4,7 +4,6 @@ - From 21a583b637659b6351d04f6096e8e14006822e6d Mon Sep 17 00:00:00 2001 From: millmanorama Date: Fri, 23 Jun 2017 11:38:10 +0200 Subject: [PATCH 059/104] remove dead code --- .../src/org/sleuthkit/autopsy/timeline/TimeLineTopComponent.java | 1 - 1 file changed, 1 deletion(-) diff --git a/Core/src/org/sleuthkit/autopsy/timeline/TimeLineTopComponent.java b/Core/src/org/sleuthkit/autopsy/timeline/TimeLineTopComponent.java index 9b8eac913f..ad6961006e 100644 --- a/Core/src/org/sleuthkit/autopsy/timeline/TimeLineTopComponent.java +++ b/Core/src/org/sleuthkit/autopsy/timeline/TimeLineTopComponent.java @@ -200,7 +200,6 @@ public final class TimeLineTopComponent extends TopComponent implements Explorer initComponents(); associateLookup(ExplorerUtils.createLookup(em, getActionMap())); setName(NbBundle.getMessage(TimeLineTopComponent.class, "CTL_TimeLineTopComponent")); -// setIcon(WindowManager.getDefault().getMainWindow().getIconImage()); //use the same icon as main application getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(AddBookmarkTagAction.BOOKMARK_SHORTCUT, "addBookmarkTag"); //NON-NLS getActionMap().put("addBookmarkTag", new AddBookmarkTagAction()); //NON-NLS From afc59e4681df440f948176c8c48f25ad1e3f82ee Mon Sep 17 00:00:00 2001 From: millmanorama Date: Thu, 6 Jul 2017 15:52:55 +0200 Subject: [PATCH 060/104] change timeline mode type to editor --- .../src/org/sleuthkit/autopsy/core/timelineWsmode.xml | 11 ++++++----- .../autopsy/imagegallery/ImageGalleryWsmode.xml | 11 ++++++----- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/core/timelineWsmode.xml b/Core/src/org/sleuthkit/autopsy/core/timelineWsmode.xml index 2fbb04adf3..1135086770 100644 --- a/Core/src/org/sleuthkit/autopsy/core/timelineWsmode.xml +++ b/Core/src/org/sleuthkit/autopsy/core/timelineWsmode.xml @@ -1,9 +1,10 @@ - + + - - - - + + + + diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryWsmode.xml b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryWsmode.xml index be6afca629..c40b51e3e3 100644 --- a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryWsmode.xml +++ b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryWsmode.xml @@ -1,9 +1,10 @@ - + + - - - - + + + + From 355174f9cbd7df50ab3e98cb74f27821c6b0ff5e Mon Sep 17 00:00:00 2001 From: millmanorama Date: Wed, 6 Sep 2017 10:18:06 +0200 Subject: [PATCH 061/104] add a mode for AID --- .../experimental/autoingest/AIDWsmode.xml | 10 ++++++ .../AutoIngestDashboardTopComponent.java | 35 +++---------------- .../autopsy/experimental/autoingest/layer.xml | 6 ++++ 3 files changed, 20 insertions(+), 31 deletions(-) create mode 100644 Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AIDWsmode.xml diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AIDWsmode.xml b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AIDWsmode.xml new file mode 100644 index 0000000000..4852cb07c1 --- /dev/null +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AIDWsmode.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardTopComponent.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardTopComponent.java index cfb2e7e18f..d093b19db7 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardTopComponent.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardTopComponent.java @@ -19,28 +19,21 @@ package org.sleuthkit.autopsy.experimental.autoingest; import java.util.logging.Level; -import org.netbeans.api.settings.ConvertAsProperties; -import org.openide.awt.ActionID; -import org.openide.awt.ActionReference; -import org.openide.windows.TopComponent; import org.openide.util.NbBundle.Messages; import org.openide.windows.Mode; +import org.openide.windows.TopComponent; import org.openide.windows.WindowManager; import org.sleuthkit.autopsy.coreutils.Logger; /** * Top component which displays the Auto Ingest Dashboard interface. */ -@ConvertAsProperties( - dtd = "-//org.sleuthkit.autopsy.experimental.autoingest//AutoIngestDashboard//EN", - autostore = false -) @TopComponent.Description( preferredID = "AutoIngestDashboardTopComponent", //iconBase="SET/PATH/TO/ICON/HERE", persistenceType = TopComponent.PERSISTENCE_NEVER ) -@TopComponent.Registration(mode = "dashboard", openAtStartup = false) +@TopComponent.Registration(mode = "AID", openAtStartup = false) @Messages({ "CTL_AutoIngestDashboardAction=Auto Ingest Dashboard", "CTL_AutoIngestDashboardTopComponent=Auto Ingest Dashboard", @@ -48,7 +41,7 @@ import org.sleuthkit.autopsy.coreutils.Logger; }) public final class AutoIngestDashboardTopComponent extends TopComponent { public final static String PREFERRED_ID = "AutoIngestDashboardTopComponent"; // NON-NLS - private static final Logger LOGGER = Logger.getLogger(AutoIngestDashboardTopComponent.class.getName()); + private static final Logger logger = Logger.getLogger(AutoIngestDashboardTopComponent.class.getName()); private static boolean topComponentInitialized = false; public static void openTopComponent() { @@ -77,7 +70,7 @@ public final class AutoIngestDashboardTopComponent extends TopComponent { try { etc.close(); } catch (Exception e) { - LOGGER.log(Level.SEVERE, "failed to close " + PREFERRED_ID, e); // NON-NLS + logger.log(Level.SEVERE, "failed to close " + PREFERRED_ID, e); // NON-NLS } } } @@ -111,25 +104,5 @@ public final class AutoIngestDashboardTopComponent extends TopComponent { // Variables declaration - do not modify//GEN-BEGIN:variables // End of variables declaration//GEN-END:variables - @Override - public void componentOpened() { - // TODO add custom code on component opening - } - @Override - public void componentClosed() { - // TODO add custom code on component closing - } - - void writeProperties(java.util.Properties p) { - // better to version settings since initial version as advocated at - // http://wiki.apidesign.org/wiki/PropertyFiles - p.setProperty("version", "1.0"); - // TODO store your settings - } - - void readProperties(java.util.Properties p) { - String version = p.getProperty("version"); - // TODO read your settings according to their version - } } \ No newline at end of file diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/layer.xml b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/layer.xml index 6711abd865..0333152f32 100644 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/layer.xml +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/layer.xml @@ -31,5 +31,11 @@ + + + + + + From 932f542bf5a2a21ed2a571f476c0901cb0318421 Mon Sep 17 00:00:00 2001 From: millmanorama Date: Wed, 6 Sep 2017 10:50:19 +0200 Subject: [PATCH 062/104] use consistent mode name = dashboard --- .../experimental/autoingest/AIDWsmode.xml | 2 +- .../autoingest/AutoIngestDashboard.java | 21 +++++++++---------- .../AutoIngestDashboardTopComponent.java | 2 +- 3 files changed, 12 insertions(+), 13 deletions(-) diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AIDWsmode.xml b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AIDWsmode.xml index 4852cb07c1..49305ab59f 100644 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AIDWsmode.xml +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AIDWsmode.xml @@ -1,6 +1,6 @@ - + diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java index 653aedf252..c3fce8b201 100644 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java @@ -19,12 +19,15 @@ package org.sleuthkit.autopsy.experimental.autoingest; import com.google.common.util.concurrent.ThreadFactoryBuilder; +import java.awt.Color; import java.awt.Cursor; import java.awt.EventQueue; +import java.beans.PropertyChangeEvent; import java.nio.file.Path; import java.nio.file.Paths; import java.time.Instant; import java.util.ArrayList; +import java.util.Collections; import java.util.Comparator; import java.util.Date; import java.util.List; @@ -33,11 +36,8 @@ import java.util.Observer; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.logging.Level; -import javax.swing.DefaultListSelectionModel; -import java.awt.Color; -import java.beans.PropertyChangeEvent; -import java.util.Collections; import java.util.logging.Logger; +import javax.swing.DefaultListSelectionModel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JTable; @@ -48,7 +48,6 @@ import javax.swing.table.DefaultTableModel; import javax.swing.table.TableColumn; import org.openide.LifecycleManager; import org.openide.util.NbBundle; -import org.openide.windows.WindowManager; import org.sleuthkit.autopsy.core.ServicesMonitor; import org.sleuthkit.autopsy.coreutils.NetworkUtils; import org.sleuthkit.autopsy.ingest.IngestManager; @@ -148,7 +147,7 @@ public final class AutoIngestDashboard extends JPanel implements Observer { * * @return The panel. */ - public static AutoIngestDashboard getInstance() { + synchronized public static AutoIngestDashboard getInstance() { if (null == instance) { /* * Two stage construction is used here to avoid publishing a @@ -583,12 +582,12 @@ public final class AutoIngestDashboard extends JPanel implements Observer { updateExecutor = Executors.newSingleThreadExecutor(new ThreadFactoryBuilder().setNameFormat(UPDATE_TASKS_THREAD_NAME).build()); updateExecutor.submit(new UpdateAllJobsTablesTask()); - //bnPause.setEnabled(true); + //bnPause.setEnabled(true); bnPause.setText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnPause.text")); bnPause.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnPause.toolTipText")); bnRefresh.setEnabled(true); bnOptions.setEnabled(false); - + tbStatusMessage.setText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnPause.running")); } @@ -1011,11 +1010,11 @@ public final class AutoIngestDashboard extends JPanel implements Observer { SYS_LOGGER.log(Level.SEVERE, "Dashboard error refreshing table", ex); } } - + /** * Get the current lists of jobs and update the UI. */ - private void refreshTables(){ + private void refreshTables() { } /** @@ -1319,4 +1318,4 @@ public final class AutoIngestDashboard extends JPanel implements Observer { private javax.swing.JTextField tbStatusMessage; // End of variables declaration//GEN-END:variables -} \ No newline at end of file +} diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardTopComponent.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardTopComponent.java index d093b19db7..5b844fab51 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardTopComponent.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardTopComponent.java @@ -33,7 +33,7 @@ import org.sleuthkit.autopsy.coreutils.Logger; //iconBase="SET/PATH/TO/ICON/HERE", persistenceType = TopComponent.PERSISTENCE_NEVER ) -@TopComponent.Registration(mode = "AID", openAtStartup = false) +@TopComponent.Registration(mode = "dashboard", openAtStartup = false) @Messages({ "CTL_AutoIngestDashboardAction=Auto Ingest Dashboard", "CTL_AutoIngestDashboardTopComponent=Auto Ingest Dashboard", From 9ac1b412f90e911c597fbe0f77f3cbaf25f17396 Mon Sep 17 00:00:00 2001 From: millmanorama Date: Wed, 6 Sep 2017 11:13:05 +0200 Subject: [PATCH 063/104] cleanup AutoIngestDashboardTopComponent opening --- .../AutoIngestDashboardTopComponent.java | 43 +++++++++++++------ .../{AIDWsmode.xml => dashboardWsmode.xml} | 0 .../autopsy/experimental/autoingest/layer.xml | 2 +- 3 files changed, 32 insertions(+), 13 deletions(-) rename Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/{AIDWsmode.xml => dashboardWsmode.xml} (100%) diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardTopComponent.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardTopComponent.java index 5b844fab51..83a02c243d 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardTopComponent.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardTopComponent.java @@ -1,7 +1,7 @@ /* * Autopsy Forensic Browser * - * Copyright 2017 Basis Technology Corp. + * Copyright 2011-2017 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -18,7 +18,9 @@ */ package org.sleuthkit.autopsy.experimental.autoingest; +import java.util.List; import java.util.logging.Level; +import java.util.stream.Collectors; import org.openide.util.NbBundle.Messages; import org.openide.windows.Mode; import org.openide.windows.TopComponent; @@ -36,10 +38,9 @@ import org.sleuthkit.autopsy.coreutils.Logger; @TopComponent.Registration(mode = "dashboard", openAtStartup = false) @Messages({ "CTL_AutoIngestDashboardAction=Auto Ingest Dashboard", - "CTL_AutoIngestDashboardTopComponent=Auto Ingest Dashboard", - "HINT_AutoIngestDashboardTopComponent=This is an Auto Ingest Dashboard window" -}) + "CTL_AutoIngestDashboardTopComponent=Auto Ingest Dashboard"}) public final class AutoIngestDashboardTopComponent extends TopComponent { + public final static String PREFERRED_ID = "AutoIngestDashboardTopComponent"; // NON-NLS private static final Logger logger = Logger.getLogger(AutoIngestDashboardTopComponent.class.getName()); private static boolean topComponentInitialized = false; @@ -57,18 +58,21 @@ public final class AutoIngestDashboardTopComponent extends TopComponent { AutoIngestDashboard dashboard = AutoIngestDashboard.getInstance(); tc.add(dashboard); dashboard.setSize(dashboard.getPreferredSize()); - - tc.open(); + + if (tc.isOpened() == false) { + tc.open(); + } + tc.toFront(); tc.requestActive(); } } public static void closeTopComponent() { if (topComponentInitialized) { - final TopComponent etc = WindowManager.getDefault().findTopComponent(PREFERRED_ID); - if (etc != null) { + final TopComponent tc = WindowManager.getDefault().findTopComponent(PREFERRED_ID); + if (tc != null) { try { - etc.close(); + tc.close(); } catch (Exception e) { logger.log(Level.SEVERE, "failed to close " + PREFERRED_ID, e); // NON-NLS } @@ -79,7 +83,23 @@ public final class AutoIngestDashboardTopComponent extends TopComponent { public AutoIngestDashboardTopComponent() { initComponents(); setName(Bundle.CTL_AutoIngestDashboardTopComponent()); - setToolTipText(Bundle.HINT_AutoIngestDashboardTopComponent()); + } + + @Override + public List availableModes(List modes) { + /* + * This looks like the right thing to do, but online discussions seems + * to indicate this method is effectively deprecated. A break point + * placed here was never hit. + */ + return modes.stream().filter(mode -> mode.getName().equals("dashboard") || mode.getName().equals("ImageGallery")) + .collect(Collectors.toList()); + } + + @Override + public void componentOpened() { + super.componentOpened(); + WindowManager.getDefault().setTopComponentFloating(this, true); } /** @@ -104,5 +124,4 @@ public final class AutoIngestDashboardTopComponent extends TopComponent { // Variables declaration - do not modify//GEN-BEGIN:variables // End of variables declaration//GEN-END:variables - -} \ No newline at end of file +} diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AIDWsmode.xml b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/dashboardWsmode.xml similarity index 100% rename from Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AIDWsmode.xml rename to Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/dashboardWsmode.xml diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/layer.xml b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/layer.xml index 0333152f32..56ad444eb0 100644 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/layer.xml +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/layer.xml @@ -34,7 +34,7 @@ - + From 71a9c902c13b8228c9091fe34d5befc26b04ff9a Mon Sep 17 00:00:00 2001 From: Ann Priestman Date: Wed, 6 Sep 2017 08:13:05 -0400 Subject: [PATCH 064/104] Create a central repo case entry if one does not exist when the user opens the properties panel. --- .../actions/EamCaseEditDetailsDialog.java | 3 +++ .../datamodel/AbstractSqlEamDb.java | 25 +++++++++++++++++++ .../centralrepository/datamodel/EamDb.java | 5 ++++ 3 files changed, 33 insertions(+) diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/actions/EamCaseEditDetailsDialog.java b/Core/src/org/sleuthkit/autopsy/centralrepository/actions/EamCaseEditDetailsDialog.java index 80f9c92b03..5b53be84b3 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/actions/EamCaseEditDetailsDialog.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/actions/EamCaseEditDetailsDialog.java @@ -70,6 +70,9 @@ public class EamCaseEditDetailsDialog extends JDialog { try { this.dbManager = EamDb.getInstance(); this.eamCase = this.dbManager.getCaseDetails(Case.getCurrentCase().getName()); + if(this.eamCase == null){ + dbManager.newCaseFromCurrentCase(); + } initComponents(); loadData(); customizeComponents(); diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/AbstractSqlEamDb.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/AbstractSqlEamDb.java index e6fa8730a7..4d6d32824d 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/AbstractSqlEamDb.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/AbstractSqlEamDb.java @@ -35,6 +35,7 @@ import java.util.Map; import java.util.Set; import java.util.logging.Level; import javafx.animation.KeyValue; +import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.datamodel.TskData; @@ -254,6 +255,30 @@ public abstract class AbstractSqlEamDb implements EamDb { } } + /** + * Creates new Case in the database from the currently open case + */ + @Override + public void newCaseFromCurrentCase() throws EamDbException{ + Case curCase = Case.getCurrentCase(); + if(curCase == null){ + throw new EamDbException("No case open"); + } + + EamCase curCeCase = new EamCase( + -1, + curCase.getName(), // unique case ID + EamOrganization.getDefault(), + curCase.getDisplayName(), + curCase.getCreatedDate(), + curCase.getNumber(), + curCase.getExaminer(), + null, + null, + null); + newCase(curCeCase); + } + /** * Updates an existing Case in the database * diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamDb.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamDb.java index d0264eab54..22a25f9fe9 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamDb.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamDb.java @@ -146,6 +146,11 @@ public interface EamDb { * @param eamCase The case to add */ void newCase(EamCase eamCase) throws EamDbException; + + /** + * Creates new Case in the database from the currently open case + */ + void newCaseFromCurrentCase() throws EamDbException; /** * Updates an existing Case in the database From 0331ba4d64cf3de5dff1d4b4895cd2fae9cec7ef Mon Sep 17 00:00:00 2001 From: Ann Priestman Date: Wed, 6 Sep 2017 09:05:33 -0400 Subject: [PATCH 065/104] Temporarily hide hash sets and organizations --- .../centralrepository/actions/EamCaseEditDetailsDialog.java | 3 +++ .../centralrepository/optionspanel/GlobalSettingsPanel.java | 3 +++ 2 files changed, 6 insertions(+) diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/actions/EamCaseEditDetailsDialog.java b/Core/src/org/sleuthkit/autopsy/centralrepository/actions/EamCaseEditDetailsDialog.java index 80f9c92b03..5b7e2386f2 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/actions/EamCaseEditDetailsDialog.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/actions/EamCaseEditDetailsDialog.java @@ -82,6 +82,9 @@ public class EamCaseEditDetailsDialog extends JDialog { private void customizeComponents() { setTextBoxListeners(); setTextAreaListeners(); + + // The organization functions of central repo are not being included in the current release. + this.pnOrganization.setVisible(false); } diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/GlobalSettingsPanel.java b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/GlobalSettingsPanel.java index c0be22bf90..bfe3bfe941 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/GlobalSettingsPanel.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/GlobalSettingsPanel.java @@ -59,6 +59,9 @@ public final class GlobalSettingsPanel extends IngestModuleGlobalSettingsPanel i "GlobalSettingsPanel.cbUseCentralRepo.text=Use a Central Repository"}) private void customizeComponents() { setName(Bundle.GlobalSettingsPanel_title()); + + // The hash set functions of central repo are not being included in the current release. + bnImportDatabase.setVisible(false); } private void addIngestJobEventsListener() { From 69f4751b4153908cf16cc32e52a998458c2b4e1d Mon Sep 17 00:00:00 2001 From: Ann Priestman Date: Wed, 6 Sep 2017 09:13:57 -0400 Subject: [PATCH 066/104] Make examiner field read only --- .../centralrepository/actions/EamCaseEditDetailsDialog.form | 3 +++ .../centralrepository/actions/EamCaseEditDetailsDialog.java | 2 ++ 2 files changed, 5 insertions(+) diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/actions/EamCaseEditDetailsDialog.form b/Core/src/org/sleuthkit/autopsy/centralrepository/actions/EamCaseEditDetailsDialog.form index 3b99a41a0b..0ef78a860c 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/actions/EamCaseEditDetailsDialog.form +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/actions/EamCaseEditDetailsDialog.form @@ -406,6 +406,9 @@
+ + + diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/actions/EamCaseEditDetailsDialog.java b/Core/src/org/sleuthkit/autopsy/centralrepository/actions/EamCaseEditDetailsDialog.java index 80f9c92b03..6ef774fdd2 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/actions/EamCaseEditDetailsDialog.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/actions/EamCaseEditDetailsDialog.java @@ -323,6 +323,8 @@ public class EamCaseEditDetailsDialog extends JDialog { org.openide.awt.Mnemonics.setLocalizedText(lbExaminerNameLabel, org.openide.util.NbBundle.getMessage(EamCaseEditDetailsDialog.class, "EamCaseEditDetailsDialog.lbExaminerNameLabel.text")); // NOI18N + tfExaminerNameText.setEditable(false); + org.openide.awt.Mnemonics.setLocalizedText(lbExaminerEmailLabel, org.openide.util.NbBundle.getMessage(EamCaseEditDetailsDialog.class, "EamCaseEditDetailsDialog.lbExaminerEmailLabel.text")); // NOI18N org.openide.awt.Mnemonics.setLocalizedText(lbExaminerPhoneLabel, org.openide.util.NbBundle.getMessage(EamCaseEditDetailsDialog.class, "EamCaseEditDetailsDialog.lbExaminerPhoneLabel.text")); // NOI18N From ef0fdb4805132d84e0eb183776c611ede8d2393c Mon Sep 17 00:00:00 2001 From: Ann Priestman Date: Wed, 6 Sep 2017 12:12:17 -0400 Subject: [PATCH 067/104] Force hash set name/version combination to be unique. Force organization name to be unique. --- .../centralrepository/datamodel/PostgresEamDbSettings.java | 6 ++++-- .../centralrepository/datamodel/SqliteEamDbSettings.java | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/PostgresEamDbSettings.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/PostgresEamDbSettings.java index 32ed226a5f..d56a9097ad 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/PostgresEamDbSettings.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/PostgresEamDbSettings.java @@ -305,7 +305,8 @@ public final class PostgresEamDbSettings { createOrganizationsTable.append("org_name text NOT NULL,"); createOrganizationsTable.append("poc_name text NOT NULL,"); createOrganizationsTable.append("poc_email text NOT NULL,"); - createOrganizationsTable.append("poc_phone text NOT NULL"); + createOrganizationsTable.append("poc_phone text NOT NULL,"); + createOrganizationsTable.append("CONSTRAINT org_name_unique UNIQUE (org_name)"); createOrganizationsTable.append(")"); // NOTE: The organizations will only have a small number of rows, so @@ -346,7 +347,8 @@ public final class PostgresEamDbSettings { createReferenceSetsTable.append("set_name text NOT NULL,"); createReferenceSetsTable.append("version text NOT NULL,"); createReferenceSetsTable.append("import_date text NOT NULL,"); - createReferenceSetsTable.append("foreign key (org_id) references organizations(id) ON UPDATE SET NULL ON DELETE SET NULL"); + createReferenceSetsTable.append("foreign key (org_id) references organizations(id) ON UPDATE SET NULL ON DELETE SET NULL,"); + createReferenceSetsTable.append("CONSTRAINT hash_set_unique UNIQUE (set_name, version)"); createReferenceSetsTable.append(")"); String referenceSetsIdx1 = "CREATE INDEX IF NOT EXISTS reference_sets_org_id ON reference_sets (org_id)"; diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/SqliteEamDbSettings.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/SqliteEamDbSettings.java index 5c02d17ea0..24c078d283 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/SqliteEamDbSettings.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/SqliteEamDbSettings.java @@ -244,7 +244,8 @@ public final class SqliteEamDbSettings { createOrganizationsTable.append("org_name text NOT NULL,"); createOrganizationsTable.append("poc_name text NOT NULL,"); createOrganizationsTable.append("poc_email text NOT NULL,"); - createOrganizationsTable.append("poc_phone text NOT NULL"); + createOrganizationsTable.append("poc_phone text NOT NULL,"); + createOrganizationsTable.append("CONSTRAINT org_name_unique UNIQUE (org_name)"); createOrganizationsTable.append(")"); // NOTE: The organizations will only have a small number of rows, so @@ -286,7 +287,8 @@ public final class SqliteEamDbSettings { createReferenceSetsTable.append("set_name text NOT NULL,"); createReferenceSetsTable.append("version text NOT NULL,"); createReferenceSetsTable.append("import_date text NOT NULL,"); - createReferenceSetsTable.append("foreign key (org_id) references organizations(id) ON UPDATE SET NULL ON DELETE SET NULL"); + createReferenceSetsTable.append("foreign key (org_id) references organizations(id) ON UPDATE SET NULL ON DELETE SET NULL,"); + createReferenceSetsTable.append("CONSTRAINT hash_set_unique UNIQUE (set_name, version)"); createReferenceSetsTable.append(")"); String referenceSetsIdx1 = "CREATE INDEX IF NOT EXISTS reference_sets_org_id ON reference_sets (org_id)"; From b6f49ba739e83fbf14984ef36b9e52dc98c3cb7d Mon Sep 17 00:00:00 2001 From: Ann Priestman Date: Wed, 6 Sep 2017 12:22:23 -0400 Subject: [PATCH 068/104] Finish implementation --- .../centralrepository/actions/EamCaseEditDetailsDialog.java | 2 +- .../autopsy/centralrepository/datamodel/AbstractSqlEamDb.java | 3 ++- .../sleuthkit/autopsy/centralrepository/datamodel/EamDb.java | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/actions/EamCaseEditDetailsDialog.java b/Core/src/org/sleuthkit/autopsy/centralrepository/actions/EamCaseEditDetailsDialog.java index 5b53be84b3..7f14e6c48d 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/actions/EamCaseEditDetailsDialog.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/actions/EamCaseEditDetailsDialog.java @@ -71,7 +71,7 @@ public class EamCaseEditDetailsDialog extends JDialog { this.dbManager = EamDb.getInstance(); this.eamCase = this.dbManager.getCaseDetails(Case.getCurrentCase().getName()); if(this.eamCase == null){ - dbManager.newCaseFromCurrentCase(); + this.eamCase = dbManager.newCaseFromCurrentCase(); } initComponents(); loadData(); diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/AbstractSqlEamDb.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/AbstractSqlEamDb.java index 4d6d32824d..8e9b508995 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/AbstractSqlEamDb.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/AbstractSqlEamDb.java @@ -259,7 +259,7 @@ public abstract class AbstractSqlEamDb implements EamDb { * Creates new Case in the database from the currently open case */ @Override - public void newCaseFromCurrentCase() throws EamDbException{ + public EamCase newCaseFromCurrentCase() throws EamDbException{ Case curCase = Case.getCurrentCase(); if(curCase == null){ throw new EamDbException("No case open"); @@ -277,6 +277,7 @@ public abstract class AbstractSqlEamDb implements EamDb { null, null); newCase(curCeCase); + return curCeCase; } /** diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamDb.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamDb.java index 22a25f9fe9..85579bcdf5 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamDb.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamDb.java @@ -150,7 +150,7 @@ public interface EamDb { /** * Creates new Case in the database from the currently open case */ - void newCaseFromCurrentCase() throws EamDbException; + EamCase newCaseFromCurrentCase() throws EamDbException; /** * Updates an existing Case in the database From bf8ccd98dec0031097314e02074180b3f8c25be0 Mon Sep 17 00:00:00 2001 From: "U-BASIS\\dgrove" Date: Wed, 6 Sep 2017 13:31:32 -0400 Subject: [PATCH 069/104] Latest changes for AID 2.0 --- .../datamodel/SqliteEamDb.java | 810 ++++++++++++- .../CoordinationService.java | 19 + .../autoingest/AutoIngestControlPanel.java | 13 +- .../autoingest/AutoIngestDashboard.form | 254 +--- .../autoingest/AutoIngestDashboard.java | 367 +++--- .../AutoIngestDashboardOpenAction.java | 85 +- .../autoingest/AutoIngestJob.java | 141 +-- .../autoingest/AutoIngestManager.java | 432 +++---- .../autoingest/AutoIngestMonitor.java | 1017 +++++++++++++++++ .../autoingest/AutopsyManifestFileParser.java | 111 +- .../experimental/autoingest/Bundle.properties | 22 +- .../autoingest/ManifestNodeData.java | 245 +++- .../autoingest/ManifestNodeDataException.java | 46 + 13 files changed, 2671 insertions(+), 891 deletions(-) create mode 100755 Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMonitor.java create mode 100755 Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/ManifestNodeDataException.java diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/SqliteEamDb.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/SqliteEamDb.java index 39ca1b3332..7c6123d7c7 100755 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/SqliteEamDb.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/SqliteEamDb.java @@ -23,12 +23,16 @@ import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; import java.util.List; +import java.util.Set; +import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.logging.Level; import org.apache.commons.dbcp2.BasicDataSource; import org.sleuthkit.autopsy.coreutils.Logger; /** - * Sqlite implementation of the Central Repository database + * Sqlite implementation of the Central Repository database. + * All methods in AbstractSqlEamDb that read or write to the database should + * be overriden here and use appropriate locking. */ public class SqliteEamDb extends AbstractSqlEamDb { @@ -39,6 +43,10 @@ public class SqliteEamDb extends AbstractSqlEamDb { private BasicDataSource connectionPool = null; private final SqliteEamDbSettings dbSettings; + + // While the Sqlite database should only be used for single users, it is still + // possible for multiple threads to attempt to write to the database simultaneously. + private final ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock(true); /** * Get the singleton instance of SqliteEamDb @@ -96,35 +104,42 @@ public class SqliteEamDb extends AbstractSqlEamDb { @Override public void reset() throws EamDbException { - Connection conn = connect(); + try{ + acquireExclusiveLock(); + + Connection conn = connect(); - try { - Statement dropContent = conn.createStatement(); - dropContent.executeUpdate("DELETE FROM organizations"); - dropContent.executeUpdate("DELETE FROM cases"); - dropContent.executeUpdate("DELETE FROM data_sources"); - dropContent.executeUpdate("DELETE FROM reference_sets"); - dropContent.executeUpdate("DELETE FROM artifact_types"); - dropContent.executeUpdate("DELETE FROM db_info"); + try { - String instancesTemplate = "DELETE FROM %s_instances"; - String referencesTemplate = "DELETE FROM global_files"; - for (EamArtifact.Type type : DEFAULT_CORRELATION_TYPES) { - dropContent.executeUpdate(String.format(instancesTemplate, type.getDbTableName())); - // FUTURE: support other reference types - if (type.getId() == EamArtifact.FILES_TYPE_ID) { - dropContent.executeUpdate(String.format(referencesTemplate, type.getDbTableName())); + Statement dropContent = conn.createStatement(); + dropContent.executeUpdate("DELETE FROM organizations"); + dropContent.executeUpdate("DELETE FROM cases"); + dropContent.executeUpdate("DELETE FROM data_sources"); + dropContent.executeUpdate("DELETE FROM reference_sets"); + dropContent.executeUpdate("DELETE FROM artifact_types"); + dropContent.executeUpdate("DELETE FROM db_info"); + + String instancesTemplate = "DELETE FROM %s_instances"; + String referencesTemplate = "DELETE FROM global_files"; + for (EamArtifact.Type type : DEFAULT_CORRELATION_TYPES) { + dropContent.executeUpdate(String.format(instancesTemplate, type.getDbTableName())); + // FUTURE: support other reference types + if (type.getId() == EamArtifact.FILES_TYPE_ID) { + dropContent.executeUpdate(String.format(referencesTemplate, type.getDbTableName())); + } } + + dropContent.executeUpdate("VACUUM"); + } catch (SQLException ex) { + LOGGER.log(Level.WARNING, "Failed to reset database.", ex); + } finally { + EamDbUtil.closeConnection(conn); } - dropContent.executeUpdate("VACUUM"); - } catch (SQLException ex) { - LOGGER.log(Level.WARNING, "Failed to reset database.", ex); + dbSettings.insertDefaultDatabaseContent(); } finally { - EamDbUtil.closeConnection(conn); + releaseExclusiveLock(); } - - dbSettings.insertDefaultDatabaseContent(); } /** @@ -192,5 +207,752 @@ public class SqliteEamDb extends AbstractSqlEamDb { public void setBadTags(List badTags) { dbSettings.setBadTags(badTags); } + + /** + * Add a new name/value pair in the db_info table. + * + * @param name Key to set + * @param value Value to set + * + * @throws EamDbException + */ + @Override + public void newDbInfo(String name, String value) throws EamDbException { + try{ + acquireExclusiveLock(); + super.newDbInfo(name, value); + } finally { + releaseExclusiveLock(); + } + } + + /** + * Get the value for the given name from the name/value db_info table. + * + * @param name Name to search for + * + * @return value associated with name. + * + * @throws EamDbException + */ + @Override + public String getDbInfo(String name) throws EamDbException { + try{ + acquireSharedLock(); + return super.getDbInfo(name); + } finally { + releaseSharedLock(); + } + } + + /** + * Update the value for a name in the name/value db_info table. + * + * @param name Name to find + * @param value Value to assign to name. + * + * @throws EamDbException + */ + @Override + public void updateDbInfo(String name, String value) throws EamDbException { + try{ + acquireExclusiveLock(); + super.updateDbInfo(name, value); + } finally { + releaseExclusiveLock(); + } + } + + /** + * Creates new Case in the database + * + * Expects the Organization for this case to already exist in the database. + * + * @param eamCase The case to add + */ + @Override + public void newCase(EamCase eamCase) throws EamDbException { + try{ + acquireExclusiveLock(); + super.newCase(eamCase); + } finally { + releaseExclusiveLock(); + } + } + + /** + * Updates an existing Case in the database + * + * @param eamCase The case to update + */ + @Override + public void updateCase(EamCase eamCase) throws EamDbException { + try{ + acquireExclusiveLock(); + super.updateCase(eamCase); + } finally { + releaseExclusiveLock(); + } + } + + /** + * Retrieves Case details based on Case UUID + * + * @param caseUUID unique identifier for a case + * + * @return The retrieved case + */ + @Override + public EamCase getCaseDetails(String caseUUID) throws EamDbException { + try{ + acquireSharedLock(); + return super.getCaseDetails(caseUUID); + } finally { + releaseSharedLock(); + } + } + + /** + * Retrieves cases that are in DB. + * + * @return List of cases + */ + @Override + public List getCases() throws EamDbException { + try{ + acquireSharedLock(); + return super.getCases(); + } finally { + releaseSharedLock(); + } + } + + /** + * Creates new Data Source in the database + * + * @param eamDataSource the data source to add + */ + @Override + public void newDataSource(EamDataSource eamDataSource) throws EamDbException { + try{ + acquireExclusiveLock(); + super.newDataSource(eamDataSource); + } finally { + releaseExclusiveLock(); + } + } + + /** + * Updates a Data Source in the database + * + * @param eamDataSource the data source to update + */ + @Override + public void updateDataSource(EamDataSource eamDataSource) throws EamDbException { + try{ + acquireExclusiveLock(); + super.updateDataSource(eamDataSource); + } finally { + releaseExclusiveLock(); + } + } + + /** + * Retrieves Data Source details based on data source device ID + * + * @param dataSourceDeviceId the data source device ID number + * + * @return The data source + */ + @Override + public EamDataSource getDataSourceDetails(String dataSourceDeviceId) throws EamDbException { + try{ + acquireSharedLock(); + return super.getDataSourceDetails(dataSourceDeviceId); + } finally { + releaseSharedLock(); + } + } + + /** + * Return a list of data sources in the DB + * + * @return list of data sources in the DB + */ + @Override + public List getDataSources() throws EamDbException { + try{ + acquireSharedLock(); + return super.getDataSources(); + } finally { + releaseSharedLock(); + } + } + + /** + * Inserts new Artifact(s) into the database. Should add associated Case and + * Data Source first. + * + * @param eamArtifact The artifact to add + */ + @Override + public void addArtifact(EamArtifact eamArtifact) throws EamDbException { + try{ + acquireExclusiveLock(); + super.addArtifact(eamArtifact); + } finally { + releaseExclusiveLock(); + } + } + + /** + * Retrieves eamArtifact instances from the database that are associated + * with the eamArtifactType and eamArtifactValue of the given eamArtifact. + * + * @param eamArtifact The type/value to look up (artifact with 0 instances) + * + * @return List of artifact instances for a given type/value + */ + @Override + public List getArtifactInstancesByTypeValue(EamArtifact.Type aType, String value) throws EamDbException { + try{ + acquireSharedLock(); + return super.getArtifactInstancesByTypeValue(aType, value); + } finally { + releaseSharedLock(); + } + } + + /** + * Retrieves eamArtifact instances from the database that are associated + * with the aType and filePath + * + * @param aType EamArtifact.Type to search for + * @param filePath File path to search for + * + * @return List of 0 or more EamArtifactInstances + * + * @throws EamDbException + */ + @Override + public List getArtifactInstancesByPath(EamArtifact.Type aType, String filePath) throws EamDbException { + try{ + acquireSharedLock(); + return super.getArtifactInstancesByPath(aType, filePath); + } finally { + releaseSharedLock(); + } + } + + /** + * Retrieves number of artifact instances in the database that are + * associated with the ArtifactType and artifactValue of the given artifact. + * + * @param eamArtifact Artifact with artifactType and artifactValue to search + * for + * + * @return Number of artifact instances having ArtifactType and + * ArtifactValue. + */ + @Override + public Long getCountArtifactInstancesByTypeValue(EamArtifact.Type aType, String value) throws EamDbException { + try{ + acquireSharedLock(); + return super.getCountArtifactInstancesByTypeValue(aType, value); + } finally { + releaseSharedLock(); + } + } + + /** + * Using the ArtifactType and ArtifactValue from the given eamArtfact, + * compute the ratio of: (The number of unique case_id/datasource_id tuples + * where Type/Value is found) divided by (The total number of unique + * case_id/datasource_id tuples in the database) expressed as a percentage. + * + * @param eamArtifact Artifact with artifactType and artifactValue to search + * for + * + * @return Int between 0 and 100 + */ + @Override + public int getCommonalityPercentageForTypeValue(EamArtifact.Type aType, String value) throws EamDbException { + try{ + acquireSharedLock(); + return super.getCommonalityPercentageForTypeValue(aType, value); + } finally { + releaseSharedLock(); + } + } + + /** + * Retrieves number of unique caseDisplayName / dataSource tuples in the + * database that are associated with the artifactType and artifactValue of + * the given artifact. + * + * @param eamArtifact Artifact with artifactType and artifactValue to search + * for + * + * @return Number of unique tuples + */ + @Override + public Long getCountUniqueCaseDataSourceTuplesHavingTypeValue(EamArtifact.Type aType, String value) throws EamDbException { + try{ + acquireSharedLock(); + return super.getCountUniqueCaseDataSourceTuplesHavingTypeValue(aType, value); + } finally { + releaseSharedLock(); + } + } + + /** + * Retrieves number of unique caseDisplayName/dataSource tuples in the + * database. + * + * @return Number of unique tuples + */ + @Override + public Long getCountUniqueCaseDataSourceTuples() throws EamDbException { + try{ + acquireSharedLock(); + return super.getCountUniqueCaseDataSourceTuples(); + } finally { + releaseSharedLock(); + } + } + + /** + * Retrieves number of eamArtifact instances in the database that are + * associated with the caseDisplayName and dataSource of the given + * eamArtifact instance. + * + * @param caseUUID Case ID to search for + * @param dataSourceID Data source ID to search for + * + * @return Number of artifact instances having caseDisplayName and + * dataSource + */ + @Override + public Long getCountArtifactInstancesByCaseDataSource(String caseUUID, String dataSourceID) throws EamDbException { + try{ + acquireSharedLock(); + return super.getCountArtifactInstancesByCaseDataSource(caseUUID, dataSourceID); + } finally { + releaseSharedLock(); + } + } + + /** + * Executes a bulk insert of the eamArtifacts added from the + * prepareBulkArtifact() method + */ + @Override + public void bulkInsertArtifacts() throws EamDbException { + try{ + acquireExclusiveLock(); + super.bulkInsertArtifacts(); + } finally { + releaseExclusiveLock(); + } + } + + /** + * Executes a bulk insert of the cases + */ + @Override + public void bulkInsertCases(List cases) throws EamDbException { + try{ + acquireExclusiveLock(); + super.bulkInsertCases(cases); + } finally { + releaseExclusiveLock(); + } + } + + /** + * Sets an eamArtifact instance as knownStatus = "Bad". If eamArtifact + * exists, it is updated. If eamArtifact does not exist nothing happens + * + * @param eamArtifact Artifact containing exactly one (1) ArtifactInstance. + */ + @Override + public void setArtifactInstanceKnownBad(EamArtifact eamArtifact) throws EamDbException { + try{ + acquireExclusiveLock(); + super.setArtifactInstanceKnownBad(eamArtifact); + } finally { + releaseExclusiveLock(); + } + } + + /** + * Gets list of matching eamArtifact instances that have knownStatus = + * "Bad". + * + * @param aType EamArtifact.Type to search for + * @param value Value to search for + * + * @return List with 0 or more matching eamArtifact instances. + */ + @Override + public List getArtifactInstancesKnownBad(EamArtifact.Type aType, String value) throws EamDbException { + try{ + acquireSharedLock(); + return super.getArtifactInstancesKnownBad(aType, value); + } finally { + releaseSharedLock(); + } + } + + /** + * Count matching eamArtifacts instances that have knownStatus = "Bad". + * + * @param aType EamArtifact.Type to search for + * @param value Value to search for + * + * @return Number of matching eamArtifacts + */ + @Override + public Long getCountArtifactInstancesKnownBad(EamArtifact.Type aType, String value) throws EamDbException { + try{ + acquireSharedLock(); + return super.getCountArtifactInstancesKnownBad(aType, value); + } finally { + releaseSharedLock(); + } + } + + /** + * Gets list of distinct case display names, where each case has 1+ Artifact + * Instance matching eamArtifact with knownStatus = "Bad". + * + * @param aType EamArtifact.Type to search for + * @param value Value to search for + * + * @return List of cases containing this artifact with instances marked as + * bad + * + * @throws EamDbException + */ + @Override + public List getListCasesHavingArtifactInstancesKnownBad(EamArtifact.Type aType, String value) throws EamDbException { + try{ + acquireSharedLock(); + return super.getListCasesHavingArtifactInstancesKnownBad(aType, value); + } finally { + releaseSharedLock(); + } + } + + /** + * Is the artifact known as bad according to the reference entries? + * + * @param aType EamArtifact.Type to search for + * @param value Value to search for + * + * @return Global known status of the artifact + */ + @Override + public boolean isArtifactlKnownBadByReference(EamArtifact.Type aType, String value) throws EamDbException { + try{ + acquireSharedLock(); + return super.isArtifactlKnownBadByReference(aType, value); + } finally { + releaseSharedLock(); + } + } + + /** + * Add a new organization + * + * @param eamOrg The organization to add + * + * @throws EamDbException + */ + @Override + public void newOrganization(EamOrganization eamOrg) throws EamDbException { + try{ + acquireExclusiveLock(); + super.newOrganization(eamOrg); + } finally { + releaseExclusiveLock(); + } + } + + /** + * Get all organizations + * + * @return A list of all organizations + * + * @throws EamDbException + */ + @Override + public List getOrganizations() throws EamDbException { + try{ + acquireSharedLock(); + return super.getOrganizations(); + } finally { + releaseSharedLock(); + } + } + + /** + * Get an organization having the given ID + * + * @param orgID The id to look up + * + * @return The organization with the given ID + * + * @throws EamDbException + */ + @Override + public EamOrganization getOrganizationByID(int orgID) throws EamDbException { + try{ + acquireSharedLock(); + return super.getOrganizationByID(orgID); + } finally { + releaseSharedLock(); + } + } + + /** + * Add a new Global Set + * + * @param eamGlobalSet The global set to add + * + * @return The ID of the new global set + * + * @throws EamDbException + */ + @Override + public int newReferencelSet(EamGlobalSet eamGlobalSet) throws EamDbException { + try{ + acquireExclusiveLock(); + return super.newReferencelSet(eamGlobalSet); + } finally { + releaseExclusiveLock(); + } + } + + /** + * Get a reference set by ID + * + * @param referenceSetID The ID to look up + * + * @return The global set associated with the ID + * + * @throws EamDbException + */ + @Override + public EamGlobalSet getReferenceSetByID(int referenceSetID) throws EamDbException { + try{ + acquireSharedLock(); + return super.getReferenceSetByID(referenceSetID); + } finally { + releaseSharedLock(); + } + } + + /** + * Add a new reference instance + * + * @param eamGlobalFileInstance The reference instance to add + * @param correlationType Correlation Type that this Reference + * Instance is + * + * @throws EamDbException + */ + @Override + public void addReferenceInstance(EamGlobalFileInstance eamGlobalFileInstance, EamArtifact.Type correlationType) throws EamDbException { + try{ + acquireExclusiveLock(); + super.addReferenceInstance(eamGlobalFileInstance, correlationType); + } finally { + releaseExclusiveLock(); + } + } + + /** + * Insert the bulk collection of Reference Type Instances + * + * @throws EamDbException + */ + @Override + public void bulkInsertReferenceTypeEntries(Set globalInstances, EamArtifact.Type contentType) throws EamDbException { + try{ + acquireExclusiveLock(); + super.bulkInsertReferenceTypeEntries(globalInstances, contentType); + } finally { + releaseExclusiveLock(); + } + } + + /** + * Get all reference entries having a given correlation type and value + * + * @param aType Type to use for matching + * @param aValue Value to use for matching + * + * @return List of all global file instances with a type and value + * + * @throws EamDbException + */ + @Override + public List getReferenceInstancesByTypeValue(EamArtifact.Type aType, String aValue) throws EamDbException { + try{ + acquireSharedLock(); + return super.getReferenceInstancesByTypeValue(aType, aValue); + } finally { + releaseSharedLock(); + } + } + + /** + * Add a new EamArtifact.Type to the db. + * + * @param newType New type to add. + * + * @return ID of this new Correlation Type + * + * @throws EamDbException + */ + @Override + public int newCorrelationType(EamArtifact.Type newType) throws EamDbException { + try{ + acquireExclusiveLock(); + return super.newCorrelationType(newType); + } finally { + releaseExclusiveLock(); + } + } + + /** + * Get the list of EamArtifact.Type's that will be used to correlate + * artifacts. + * + * @return List of EamArtifact.Type's. If none are defined in the database, + * the default list will be returned. + * + * @throws EamDbException + */ + @Override + public List getCorrelationTypes() throws EamDbException { + try{ + acquireSharedLock(); + return super.getCorrelationTypes(); + } finally { + releaseSharedLock(); + } + } + + /** + * Get the list of enabled EamArtifact.Type's that will be used to correlate + * artifacts. + * + * @return List of enabled EamArtifact.Type's. If none are defined in the + * database, the default list will be returned. + * + * @throws EamDbException + */ + @Override + public List getEnabledCorrelationTypes() throws EamDbException { + try{ + acquireSharedLock(); + return super.getEnabledCorrelationTypes(); + } finally { + releaseSharedLock(); + } + } + + /** + * Get the list of supported EamArtifact.Type's that can be used to + * correlate artifacts. + * + * @return List of supported EamArtifact.Type's. If none are defined in the + * database, the default list will be returned. + * + * @throws EamDbException + */ + @Override + public List getSupportedCorrelationTypes() throws EamDbException { + try{ + acquireSharedLock(); + return super.getSupportedCorrelationTypes(); + } finally { + releaseSharedLock(); + } + } + + /** + * Update a EamArtifact.Type. + * + * @param aType EamArtifact.Type to update. + * + * @throws EamDbException + */ + @Override + public void updateCorrelationType(EamArtifact.Type aType) throws EamDbException { + try{ + acquireExclusiveLock(); + super.updateCorrelationType(aType); + } finally { + releaseExclusiveLock(); + } + } + + /** + * Get the EamArtifact.Type that has the given Type.Id. + * + * @param typeId Type.Id of Correlation Type to get + * + * @return EamArtifact.Type or null if it doesn't exist. + * + * @throws EamDbException + */ + @Override + public EamArtifact.Type getCorrelationTypeById(int typeId) throws EamDbException { + try{ + acquireSharedLock(); + return super.getCorrelationTypeById(typeId); + } finally { + releaseSharedLock(); + } + } + + /** + * Acquire the lock that provides exclusive access to the case database. + * Call this method in a try block with a call to + * the lock release method in an associated finally block. + */ + private void acquireExclusiveLock() { + rwLock.writeLock().lock(); + } -} + /** + * Release the lock that provides exclusive access to the database. + * This method should always be called in the finally + * block of a try block in which the lock was acquired. + */ + private void releaseExclusiveLock() { + rwLock.writeLock().unlock(); + } + + /** + * Acquire the lock that provides shared access to the case database. + * Call this method in a try block with a call to the + * lock release method in an associated finally block. + */ + private void acquireSharedLock() { + rwLock.readLock().lock(); + } + + /** + * Release the lock that provides shared access to the database. + * This method should always be called in the finally block + * of a try block in which the lock was acquired. + */ + private void releaseSharedLock() { + rwLock.readLock().unlock(); + } + +} \ No newline at end of file diff --git a/Core/src/org/sleuthkit/autopsy/coordinationservice/CoordinationService.java b/Core/src/org/sleuthkit/autopsy/coordinationservice/CoordinationService.java index 36b6dc37e3..bc78ee764e 100755 --- a/Core/src/org/sleuthkit/autopsy/coordinationservice/CoordinationService.java +++ b/Core/src/org/sleuthkit/autopsy/coordinationservice/CoordinationService.java @@ -21,9 +21,12 @@ package org.sleuthkit.autopsy.coordinationservice; import java.io.IOException; import java.util.Collection; import java.util.Iterator; +import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.TimeUnit; +import java.util.logging.Level; +import java.util.logging.Logger; import javax.annotation.concurrent.GuardedBy; import javax.annotation.concurrent.ThreadSafe; import org.apache.curator.RetryPolicy; @@ -148,6 +151,7 @@ public final class CoordinationService { * Create the top-level root and category nodes. */ String rootNode = rootNodeName; + if (!rootNode.startsWith("/")) { rootNode = "/" + rootNode; } @@ -354,6 +358,21 @@ public final class CoordinationService { } } } + + //DLG: header + //DLG: throw exception + //DLG: throw new CoordinationServiceException(String.format("Failed to set data for %s", fullNodePath), ex); + public List getNodeList(CategoryNode category) { + List list = null; + + try { + list = curator.getChildren().forPath(categoryNodeToPath.get(category.getDisplayName())); + } catch (Exception ex) { + Logger.getLogger(CoordinationService.class.getName()).log(Level.SEVERE, null, ex); + } + + return list; + } /** * Creates a node path within a given category. diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestControlPanel.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestControlPanel.java index d48cd31c7f..ece449814a 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestControlPanel.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestControlPanel.java @@ -1061,19 +1061,20 @@ public final class AutoIngestControlPanel extends JPanel implements Observer { tableModel.setRowCount(0); for (AutoIngestJob job : jobs) { AutoIngestJob.StageDetails status = job.getStageDetails(); + ManifestNodeData nodeData = job.getNodeData(); tableModel.addRow(new Object[]{ - job.getManifest().getCaseName(), // CASE - job.getManifest().getDataSourcePath().getFileName(), // DATA_SOURCE + nodeData.getCaseName(), // CASE + nodeData.getDataSourcePath().getFileName(), // DATA_SOURCE job.getNodeName(), // HOST_NAME - job.getManifest().getDateFileCreated(), // CREATED_TIME + nodeData.getManifestFileDate(), // CREATED_TIME job.getStageStartDate(), // STARTED_TIME - job.getCompletedDate(), // COMPLETED_TIME + nodeData.getCompletedDate(), // COMPLETED_TIME status.getDescription(), // ACTIVITY - job.hasErrors(), // STATUS + nodeData.getErrorsOccurred(), // STATUS ((Date.from(Instant.now()).getTime()) - (status.getStartDate().getTime())), // ACTIVITY_TIME job.getCaseDirectoryPath(), // CASE_DIRECTORY_PATH job.getNodeName().equals(LOCAL_HOST_NAME), // IS_LOCAL_JOB - job.getManifest().getFilePath()}); // MANIFEST_FILE_PATH + nodeData.getManifestFilePath()}); // MANIFEST_FILE_PATH } } catch (Exception ex) { SYS_LOGGER.log(Level.SEVERE, "Dashboard error refreshing table", ex); diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.form b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.form index ab16ecc6c0..d2cd3176c8 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.form +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.form @@ -19,62 +19,31 @@ - - - - - - - - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - + @@ -92,61 +61,20 @@ - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + @@ -226,26 +154,6 @@ - - - - - - - - - - - - - - - - - - - - @@ -285,47 +193,9 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + @@ -336,26 +206,9 @@ - - - - - - - - - - - - - - - - - - - - + + + @@ -381,19 +234,6 @@ - - - - - - - - - - - - - @@ -418,19 +258,5 @@ - - - - - - - - - - - - - - diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java index 653aedf252..2c7a1a9d86 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java @@ -48,9 +48,9 @@ import javax.swing.table.DefaultTableModel; import javax.swing.table.TableColumn; import org.openide.LifecycleManager; import org.openide.util.NbBundle; -import org.openide.windows.WindowManager; import org.sleuthkit.autopsy.core.ServicesMonitor; import org.sleuthkit.autopsy.coreutils.NetworkUtils; +import org.sleuthkit.autopsy.experimental.autoingest.AutoIngestMonitor.JobsSnapshot; import org.sleuthkit.autopsy.ingest.IngestManager; /** @@ -89,6 +89,7 @@ public final class AutoIngestDashboard extends JPanel implements Observer { private final DefaultTableModel pendingTableModel; private final DefaultTableModel runningTableModel; private final DefaultTableModel completedTableModel; + private AutoIngestMonitor autoIngestMonitor; private ExecutorService updateExecutor; private boolean isPaused; private boolean autoIngestStarted; @@ -152,7 +153,7 @@ public final class AutoIngestDashboard extends JPanel implements Observer { if (null == instance) { /* * Two stage construction is used here to avoid publishing a - * reference to the panel to the Observable auto ingest manager + * reference to the panel to the Observable auto ingest monitor * before object construction is complete. */ instance = new AutoIngestDashboard(); @@ -165,6 +166,8 @@ public final class AutoIngestDashboard extends JPanel implements Observer { * controlling automated ingest for a single node within the cluster. */ private AutoIngestDashboard() { + autoIngestMonitor = AutoIngestMonitor.getInstance(); + pendingTableModel = new DefaultTableModel(JobsTableModelColumns.headers, 0) { private static final long serialVersionUID = 1L; @@ -325,7 +328,6 @@ public final class AutoIngestDashboard extends JPanel implements Observer { return; } int row = pendingTable.getSelectedRow(); - enablePendingTableButtons((row >= 0) && (row < pendingTable.getRowCount())); }); /* @@ -409,28 +411,6 @@ public final class AutoIngestDashboard extends JPanel implements Observer { * Prevent sorting when a column header is clicked. */ runningTable.setAutoCreateRowSorter(false); - - /* - * Create a row selection listener to enable/disable the cancel current - * job, cancel current module, and show progress buttons. - */ - runningTable.getSelectionModel().addListSelectionListener((ListSelectionEvent e) -> { - if (e.getValueIsAdjusting()) { - return; - } - updateRunningTableButtonsBasedOnSelectedRow(); - }); - } - - private void updateRunningTableButtonsBasedOnSelectedRow() { - int row = runningTable.getSelectedRow(); - if (row >= 0 && row < runningTable.getRowCount()) { - if ((boolean) runningTableModel.getValueAt(row, JobsTableModelColumns.IS_LOCAL_JOB.ordinal())) { - enableRunningTableButtons(true); - return; - } - } - enableRunningTableButtons(false); } /** @@ -517,9 +497,6 @@ public final class AutoIngestDashboard extends JPanel implements Observer { } int row = completedTable.getSelectedRow(); boolean enabled = row >= 0 && row < completedTable.getRowCount(); - bnDeleteCase.setEnabled(enabled); - bnShowCaseLog.setEnabled(enabled); - bnReprocessJob.setEnabled(enabled); }); } @@ -527,48 +504,41 @@ public final class AutoIngestDashboard extends JPanel implements Observer { * Sets the initial state of the buttons on the panel. */ private void initButtons() { - bnOptions.setEnabled(true); - bnDeleteCase.setEnabled(false); - enablePendingTableButtons(false); - bnShowCaseLog.setEnabled(false); - bnReprocessJob.setEnabled(false); bnPause.setText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnStart.text")); bnPause.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnStart.toolTipText")); bnPause.setEnabled(true); //initial label for bnPause is 'Start' and it's enabled for user to start the process bnRefresh.setEnabled(false); //at initial stage, nothing to refresh - enableRunningTableButtons(false); tbStatusMessage.setText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnStart.startMessage")); } /** - * Enables or disables buttons related to the running jobs table. - * - * @param enable Enable/disable the buttons. - */ - private void enableRunningTableButtons(Boolean enable) { - bnCancelJob.setEnabled(enable); - bnCancelModule.setEnabled(enable); - bnShowProgress.setEnabled(enable); - } - - /** - * Enables or disables buttons related to pending jobs table. - * - * @param enable Enable/disable the buttons. - */ - private void enablePendingTableButtons(Boolean enable) { - bnPrioritizeCase.setEnabled(enable); - bnPrioritizeJob.setEnabled(enable); - } - - /** - * Starts up the auto ingest manager and adds this panel as an observer, + * Starts up the auto ingest monitor and adds this panel as an observer, * subscribes to services monitor events and starts a task to populate the * auto ingest job tables. The Refresh and Pause buttons are enabled. */ private void startUp() { - autoIngestStarted = true; + /* + * Starts up the auto ingest monitor (AIM). + */ + try { + autoIngestMonitor.startUp(); + autoIngestStarted = true; + } catch (AutoIngestMonitor.AutoIngestMonitorStartupException ex) { + SYS_LOGGER.log(Level.SEVERE, "Dashboard error starting up auto ingest", ex); + tbStatusMessage.setText(NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.AutoIngestStartupError")); + autoIngestMonitor = null; + + JOptionPane.showMessageDialog(this, + NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.AutoIngestStartupFailed.Message"), + NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.AutoIngestStartupFailed.Title"), + JOptionPane.ERROR_MESSAGE); + + /* + * If the AIM cannot be started, there is nothing more to do. + */ + return; + } /* * Subscribe to services monitor events. @@ -577,23 +547,28 @@ public final class AutoIngestDashboard extends JPanel implements Observer { setServicesStatusMessage(); }); + /* + * Register with the AIM as an observer. + */ + autoIngestMonitor.addObserver(this); + /* * Populate the pending, running, and completed auto ingest job tables. */ updateExecutor = Executors.newSingleThreadExecutor(new ThreadFactoryBuilder().setNameFormat(UPDATE_TASKS_THREAD_NAME).build()); updateExecutor.submit(new UpdateAllJobsTablesTask()); + autoIngestMonitor.scanInputDirsNow(); //bnPause.setEnabled(true); bnPause.setText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnPause.text")); bnPause.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnPause.toolTipText")); bnRefresh.setEnabled(true); - bnOptions.setEnabled(false); tbStatusMessage.setText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnPause.running")); } /** - * Shuts down auto ingest by shutting down the auto ingest manager and doing + * Shuts down auto ingest by shutting down the auto ingest monitor and doing * an application exit. */ public void shutdown() { @@ -674,8 +649,8 @@ public final class AutoIngestDashboard extends JPanel implements Observer { @Override public void update(Observable o, Object arg) { - if (arg instanceof AutoIngestManager.Event) { - switch ((AutoIngestManager.Event) arg) { + if (arg instanceof AutoIngestMonitor.Event) { + switch ((AutoIngestMonitor.Event) arg) { case INPUT_SCAN_COMPLETED: case JOB_STARTED: case JOB_COMPLETED: @@ -685,7 +660,6 @@ public final class AutoIngestDashboard extends JPanel implements Observer { case PAUSED_BY_REQUEST: EventQueue.invokeLater(() -> { tbStatusMessage.setText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnPause.paused")); - bnOptions.setEnabled(true); bnRefresh.setEnabled(false); isPaused = true; }); @@ -693,7 +667,6 @@ public final class AutoIngestDashboard extends JPanel implements Observer { case PAUSED_FOR_SYSTEM_ERROR: EventQueue.invokeLater(() -> { tbStatusMessage.setText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.PauseDueToSystemError")); - bnOptions.setEnabled(true); bnRefresh.setEnabled(false); pause(false); isPaused = true; @@ -718,15 +691,15 @@ public final class AutoIngestDashboard extends JPanel implements Observer { } /** - * Requests a pause of auto ingest processing by the auto ingest manager and + * Requests a pause of auto ingest processing by the auto ingest monitor and * handles updates to the components that implement the pause and resume * feature. Note that this feature is needed to get around restrictions on * changing ingest module selections and settings while an ingest job is - * running, and that the auto ingest manager will not actually pause until + * running, and that the auto ingest monitor will not actually pause until * the current auto ingest job completes. * * @param buttonClicked Is this pause request in response to a user gesture - * or a nofification from the auto ingest manager + * or a nofification from the auto ingest monitor * (AIM)? */ private void pause(boolean buttonClicked) { @@ -745,7 +718,7 @@ public final class AutoIngestDashboard extends JPanel implements Observer { if (buttonClicked) { /** - * Ask the auto ingest manager to pause when it completes the + * Ask the auto ingest monitor to pause when it completes the * currently running job, if any. */ bnRefresh.setEnabled(false); @@ -753,18 +726,17 @@ public final class AutoIngestDashboard extends JPanel implements Observer { } /** - * Requests a resume of auto ingest processing by the auto ingest manager + * Requests a resume of auto ingest processing by the auto ingest monitor * and handles updates to the components that implement the pause and resume * feature. Note that this feature is needed to get around restrictions on * changing ingest module selections and settings while an ingest job is - * running, and that the auto ingest manager will not actually pause until + * running, and that the auto ingest monitor will not actually pause until * the current auto ingest job completes. */ private void resume() { /** * Change the resume button text and tool tip to make it a pause button. */ - bnOptions.setEnabled(false); bnPause.setText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnPause.text")); bnPause.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnPause.toolTipText")); tbStatusMessage.setText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnPause.running")); @@ -779,7 +751,7 @@ public final class AutoIngestDashboard extends JPanel implements Observer { /** * A runnable task that gets the pending auto ingest jobs list from the auto - * ingest manager and queues a components refresh task for execution in the + * ingest monitor and queues a components refresh task for execution in the * EDT. */ private class UpdatePendingJobsTableTask implements Runnable { @@ -790,13 +762,14 @@ public final class AutoIngestDashboard extends JPanel implements Observer { @Override public void run() { List pendingJobs = new ArrayList<>(); + autoIngestMonitor.getJobs(pendingJobs, null, null); EventQueue.invokeLater(new RefreshComponentsTask(pendingJobs, null, null)); } } /** * A runnable task that gets the running auto ingest jobs list from the auto - * ingest manager and queues a components refresh task for execution in the + * ingest monitor and queues a components refresh task for execution in the * EDT. */ private class UpdateRunningJobsTablesTask implements Runnable { @@ -807,13 +780,14 @@ public final class AutoIngestDashboard extends JPanel implements Observer { @Override public void run() { List runningJobs = new ArrayList<>(); + autoIngestMonitor.getJobs(null, runningJobs, null); EventQueue.invokeLater(new RefreshComponentsTask(null, runningJobs, null)); } } /** * A runnable task that gets the pending, running and completed auto ingest - * jobs lists from the auto ingest manager and queues a components refresh + * jobs lists from the auto ingest monitor and queues a components refresh * task for execution in the EDT. Note that this task is frequently used * when only the pending and updated lists definitely need to be updated. * This is because the cost of updating the running jobs list is both very @@ -830,6 +804,7 @@ public final class AutoIngestDashboard extends JPanel implements Observer { List pendingJobs = new ArrayList<>(); List runningJobs = new ArrayList<>(); List completedJobs = new ArrayList<>(); + autoIngestMonitor.getJobs(pendingJobs, runningJobs, completedJobs); // Sort the completed jobs list by completed date Collections.sort(completedJobs, new AutoIngestJob.ReverseDateCompletedComparator()); EventQueue.invokeLater(new RefreshComponentsTask(pendingJobs, runningJobs, completedJobs)); @@ -839,7 +814,7 @@ public final class AutoIngestDashboard extends JPanel implements Observer { /** * A runnable task that refreshes the components on this panel to reflect * the current state of one or more auto ingest job lists obtained from the - * auto ingest manager. + * auto ingest monitor. */ private class RefreshComponentsTask implements Runnable { @@ -885,11 +860,6 @@ public final class AutoIngestDashboard extends JPanel implements Observer { } if (null != runningJobs) { - if (!isLocalJobRunning()) { - enableRunningTableButtons(false); - } else { - updateRunningTableButtonsBasedOnSelectedRow(); - } Path currentRow = getSelectedEntry(runningTable, runningTableModel); refreshTable(runningJobs, runningTableModel, null); setSelectedEntry(runningTable, runningTableModel, currentRow); @@ -992,20 +962,26 @@ public final class AutoIngestDashboard extends JPanel implements Observer { } tableModel.setRowCount(0); for (AutoIngestJob job : jobs) { + if(job.getNodeData().getVersion() < 2) { + // Ignore version '1' nodes since they don't carry enough + // data to populate the table. + continue; + } AutoIngestJob.StageDetails status = job.getStageDetails(); + ManifestNodeData nodeData = job.getNodeData(); tableModel.addRow(new Object[]{ - job.getManifest().getCaseName(), // CASE - job.getManifest().getDataSourcePath().getFileName(), // DATA_SOURCE + nodeData.getCaseName(), // CASE + nodeData.getDataSourcePath().getFileName(), // DATA_SOURCE job.getNodeName(), // HOST_NAME - job.getManifest().getDateFileCreated(), // CREATED_TIME + nodeData.getManifestFileDate(), // CREATED_TIME job.getStageStartDate(), // STARTED_TIME - job.getCompletedDate(), // COMPLETED_TIME + nodeData.getCompletedDate(), // COMPLETED_TIME status.getDescription(), // ACTIVITY - job.hasErrors(), // STATUS + nodeData.getErrorsOccurred(), // STATUS ((Date.from(Instant.now()).getTime()) - (status.getStartDate().getTime())), // ACTIVITY_TIME job.getCaseDirectoryPath(), // CASE_DIRECTORY_PATH job.getNodeName().equals(LOCAL_HOST_NAME), // IS_LOCAL_JOB - job.getManifest().getFilePath()}); // MANIFEST_FILE_PATH + nodeData.getManifestFilePath()}); // MANIFEST_FILE_PATH } } catch (Exception ex) { SYS_LOGGER.log(Level.SEVERE, "Dashboard error refreshing table", ex); @@ -1016,6 +992,10 @@ public final class AutoIngestDashboard extends JPanel implements Observer { * Get the current lists of jobs and update the UI. */ private void refreshTables(){ + JobsSnapshot jobsSnapshot = autoIngestMonitor.getCurrentJobsSnapshot(); + refreshTable(jobsSnapshot.getCompletedJobs(), completedTableModel, null); + refreshTable(jobsSnapshot.getPendingJobs(), pendingTableModel, null); + refreshTable(jobsSnapshot.getRunningJobs(), runningTableModel, null); } /** @@ -1033,26 +1013,15 @@ public final class AutoIngestDashboard extends JPanel implements Observer { runningTable = new javax.swing.JTable(); completedScrollPane = new javax.swing.JScrollPane(); completedTable = new javax.swing.JTable(); - bnCancelJob = new javax.swing.JButton(); - bnDeleteCase = new javax.swing.JButton(); lbPending = new javax.swing.JLabel(); lbRunning = new javax.swing.JLabel(); lbCompleted = new javax.swing.JLabel(); bnRefresh = new javax.swing.JButton(); - bnCancelModule = new javax.swing.JButton(); - bnExit = new javax.swing.JButton(); - bnOptions = new javax.swing.JButton(); - bnShowProgress = new javax.swing.JButton(); bnPause = new javax.swing.JButton(); - bnPrioritizeCase = new javax.swing.JButton(); - bnShowCaseLog = new javax.swing.JButton(); tbStatusMessage = new javax.swing.JTextField(); lbStatus = new javax.swing.JLabel(); - bnPrioritizeJob = new javax.swing.JButton(); lbServicesStatus = new javax.swing.JLabel(); tbServicesStatusMessage = new javax.swing.JTextField(); - bnOpenLogDir = new javax.swing.JButton(); - bnReprocessJob = new javax.swing.JButton(); pendingTable.setModel(pendingTableModel); pendingTable.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.pendingTable.toolTipText")); // NOI18N @@ -1108,12 +1077,6 @@ public final class AutoIngestDashboard extends JPanel implements Observer { completedTable.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION); completedScrollPane.setViewportView(completedTable); - org.openide.awt.Mnemonics.setLocalizedText(bnCancelJob, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnCancelJob.text")); // NOI18N - bnCancelJob.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnCancelJob.toolTipText")); // NOI18N - - org.openide.awt.Mnemonics.setLocalizedText(bnDeleteCase, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnDeleteCase.text")); // NOI18N - bnDeleteCase.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnDeleteCase.toolTipText")); // NOI18N - lbPending.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N org.openide.awt.Mnemonics.setLocalizedText(lbPending, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.lbPending.text")); // NOI18N @@ -1125,28 +1088,19 @@ public final class AutoIngestDashboard extends JPanel implements Observer { org.openide.awt.Mnemonics.setLocalizedText(bnRefresh, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnRefresh.text")); // NOI18N bnRefresh.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnRefresh.toolTipText")); // NOI18N - - org.openide.awt.Mnemonics.setLocalizedText(bnCancelModule, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnCancelModule.text")); // NOI18N - bnCancelModule.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnCancelModule.toolTipText")); // NOI18N - - org.openide.awt.Mnemonics.setLocalizedText(bnExit, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnExit.text")); // NOI18N - bnExit.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnExit.toolTipText")); // NOI18N - - org.openide.awt.Mnemonics.setLocalizedText(bnOptions, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnOptions.text")); // NOI18N - bnOptions.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnOptions.toolTipText")); // NOI18N - bnOptions.setEnabled(false); - - org.openide.awt.Mnemonics.setLocalizedText(bnShowProgress, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnShowProgress.text")); // NOI18N - bnShowProgress.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnShowProgress.toolTipText")); // NOI18N + bnRefresh.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + bnRefreshActionPerformed(evt); + } + }); org.openide.awt.Mnemonics.setLocalizedText(bnPause, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnPause.text")); // NOI18N bnPause.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnPause.toolTipText")); // NOI18N - - org.openide.awt.Mnemonics.setLocalizedText(bnPrioritizeCase, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnPrioritizeCase.text")); // NOI18N - bnPrioritizeCase.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnPrioritizeCase.toolTipText")); // NOI18N - - org.openide.awt.Mnemonics.setLocalizedText(bnShowCaseLog, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnShowCaseLog.text")); // NOI18N - bnShowCaseLog.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnShowCaseLog.toolTipText")); // NOI18N + bnPause.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + bnPauseActionPerformed(evt); + } + }); tbStatusMessage.setEditable(false); tbStatusMessage.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N @@ -1156,10 +1110,6 @@ public final class AutoIngestDashboard extends JPanel implements Observer { lbStatus.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N org.openide.awt.Mnemonics.setLocalizedText(lbStatus, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.lbStatus.text")); // NOI18N - org.openide.awt.Mnemonics.setLocalizedText(bnPrioritizeJob, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnPrioritizeJob.text")); // NOI18N - bnPrioritizeJob.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnPrioritizeJob.toolTipText")); // NOI18N - bnPrioritizeJob.setActionCommand(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnPrioritizeJob.actionCommand")); // NOI18N - lbServicesStatus.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N org.openide.awt.Mnemonics.setLocalizedText(lbServicesStatus, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.lbServicesStatus.text")); // NOI18N @@ -1168,10 +1118,6 @@ public final class AutoIngestDashboard extends JPanel implements Observer { tbServicesStatusMessage.setText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.tbServicesStatusMessage.text")); // NOI18N tbServicesStatusMessage.setBorder(null); - org.openide.awt.Mnemonics.setLocalizedText(bnOpenLogDir, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnOpenLogDir.text")); // NOI18N - - org.openide.awt.Mnemonics.setLocalizedText(bnReprocessJob, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnReprocessJob.text")); // NOI18N - javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup( @@ -1179,53 +1125,29 @@ public final class AutoIngestDashboard extends JPanel implements Observer { .addGroup(layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addComponent(lbPending, javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(pendingScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 920, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGroup(layout.createSequentialGroup() - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) - .addComponent(lbPending, javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(pendingScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 920, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addComponent(bnPause) + .addGap(18, 18, 18) + .addComponent(bnRefresh, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addComponent(runningScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 920, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(completedScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 920, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGroup(layout.createSequentialGroup() + .addComponent(lbStatus) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(bnPrioritizeCase, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(bnPrioritizeJob, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) + .addComponent(tbStatusMessage, javax.swing.GroupLayout.PREFERRED_SIZE, 861, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addComponent(lbCompleted) + .addComponent(lbRunning) .addGroup(layout.createSequentialGroup() - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addComponent(bnPause) - .addGap(18, 18, 18) - .addComponent(bnRefresh, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE) - .addGap(18, 18, 18) - .addComponent(bnOptions) - .addGap(18, 18, 18) - .addComponent(bnOpenLogDir) - .addGap(18, 18, 18) - .addComponent(bnExit, javax.swing.GroupLayout.PREFERRED_SIZE, 94, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addGroup(layout.createSequentialGroup() - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(runningScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 920, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(completedScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 920, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) - .addComponent(bnCancelJob, javax.swing.GroupLayout.DEFAULT_SIZE, 117, Short.MAX_VALUE) - .addComponent(bnShowProgress, javax.swing.GroupLayout.DEFAULT_SIZE, 116, Short.MAX_VALUE) - .addComponent(bnCancelModule, javax.swing.GroupLayout.DEFAULT_SIZE, 117, Short.MAX_VALUE) - .addComponent(bnDeleteCase, javax.swing.GroupLayout.DEFAULT_SIZE, 117, Short.MAX_VALUE) - .addComponent(bnShowCaseLog, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(bnReprocessJob, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) - .addGroup(layout.createSequentialGroup() - .addComponent(lbStatus) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addComponent(tbStatusMessage, javax.swing.GroupLayout.PREFERRED_SIZE, 861, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addComponent(lbCompleted) - .addComponent(lbRunning) - .addGroup(layout.createSequentialGroup() - .addComponent(lbServicesStatus) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addComponent(tbServicesStatusMessage, javax.swing.GroupLayout.PREFERRED_SIZE, 861, javax.swing.GroupLayout.PREFERRED_SIZE))) - .addGap(0, 0, Short.MAX_VALUE))) - .addContainerGap()) + .addComponent(lbServicesStatus) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(tbServicesStatusMessage, javax.swing.GroupLayout.PREFERRED_SIZE, 861, javax.swing.GroupLayout.PREFERRED_SIZE))) + .addContainerGap(140, Short.MAX_VALUE)) ); - layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {bnCancelJob, bnCancelModule, bnDeleteCase, bnExit, bnOpenLogDir, bnOptions, bnPause, bnRefresh, bnShowProgress}); + layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {bnPause, bnRefresh}); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) @@ -1239,71 +1161,62 @@ public final class AutoIngestDashboard extends JPanel implements Observer { .addComponent(tbServicesStatusMessage, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(lbPending, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(pendingScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 215, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addGroup(layout.createSequentialGroup() - .addGap(82, 82, 82) - .addComponent(bnPrioritizeCase) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(bnPrioritizeJob))) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(pendingScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 215, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(lbRunning) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addGap(34, 34, 34) - .addComponent(bnShowProgress) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(bnCancelJob) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(bnCancelModule)) - .addGroup(layout.createSequentialGroup() - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(runningScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 133, javax.swing.GroupLayout.PREFERRED_SIZE))) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addGap(68, 68, 68) - .addComponent(bnReprocessJob) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(bnDeleteCase) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(bnShowCaseLog)) - .addGroup(layout.createSequentialGroup() - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(lbCompleted) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(completedScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 179, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(bnExit) - .addComponent(bnOpenLogDir)) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(bnPause) - .addComponent(bnRefresh) - .addComponent(bnOptions))))) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(runningScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 133, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(lbCompleted) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(completedScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 179, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(bnPause) + .addComponent(bnRefresh)) .addContainerGap()) ); - - layout.linkSize(javax.swing.SwingConstants.VERTICAL, new java.awt.Component[] {bnCancelJob, bnCancelModule, bnDeleteCase, bnExit, bnOpenLogDir, bnOptions, bnRefresh, bnShowProgress}); - }// //GEN-END:initComponents + private void bnPauseActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnPauseActionPerformed + + if (!autoIngestStarted) { + //put up a wait cursor during the start up operation + this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + + startUp(); + + this.setCursor(null); + //done for startup + return; + } + if (!isPaused) { + tbStatusMessage.setText(org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.bnPause.pausing")); + pause(true); + } else { + resume(); + } + isPaused = !isPaused; + }//GEN-LAST:event_bnPauseActionPerformed + + /** + * Handles a click on the refresh button. Requests an immediate scan of the + * input folders for new jobs and queues a refresh of all three of the jobs + * tables. + * + * @param evt - The button click event. + */ + private void bnRefreshActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnRefreshActionPerformed + this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + autoIngestMonitor.scanInputDirsAndWait(); + refreshTables(); + this.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); + }//GEN-LAST:event_bnRefreshActionPerformed + // Variables declaration - do not modify//GEN-BEGIN:variables - private javax.swing.JButton bnCancelJob; - private javax.swing.JButton bnCancelModule; - private javax.swing.JButton bnDeleteCase; - private javax.swing.JButton bnExit; - private javax.swing.JButton bnOpenLogDir; - private javax.swing.JButton bnOptions; private javax.swing.JButton bnPause; - private javax.swing.JButton bnPrioritizeCase; - private javax.swing.JButton bnPrioritizeJob; private javax.swing.JButton bnRefresh; - private javax.swing.JButton bnReprocessJob; - private javax.swing.JButton bnShowCaseLog; - private javax.swing.JButton bnShowProgress; private javax.swing.JScrollPane completedScrollPane; private javax.swing.JTable completedTable; private javax.swing.JLabel lbCompleted; diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardOpenAction.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardOpenAction.java index 0420b5d209..7e1b1907af 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardOpenAction.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardOpenAction.java @@ -1,37 +1,29 @@ /* -* Autopsy Forensic Browser -* -* Copyright 2017 Basis Technology Corp. -* Contact: carrier sleuthkit org -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ + * Autopsy Forensic Browser + * + * Copyright 2017 Basis Technology Corp. + * Contact: carrier sleuthkit org + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.sleuthkit.autopsy.experimental.autoingest; -import java.awt.Component; -import java.beans.PropertyChangeEvent; -import java.beans.PropertyChangeListener; -import javax.swing.ImageIcon; -import javax.swing.JButton; import org.openide.awt.ActionID; import org.openide.awt.ActionReference; import org.openide.awt.ActionRegistration; import org.openide.util.HelpCtx; import org.openide.util.NbBundle.Messages; import org.openide.util.actions.CallableSystemAction; -import org.openide.util.actions.Presenter; -import org.sleuthkit.autopsy.casemodule.Case; -import org.sleuthkit.autopsy.core.RuntimeProperties; import org.sleuthkit.autopsy.core.UserPreferences; import static org.sleuthkit.autopsy.core.UserPreferences.SelectedMode.REVIEW; import org.sleuthkit.autopsy.coreutils.Logger; @@ -40,25 +32,10 @@ import org.sleuthkit.autopsy.coreutils.Logger; @ActionReference(path = "Menu/Tools", position = 104) @ActionRegistration(displayName = "#CTL_AutoIngestDashboardOpenAction", lazy = false) @Messages({"CTL_AutoIngestDashboardOpenAction=Auto Ingest Dashboard"}) -public final class AutoIngestDashboardOpenAction extends CallableSystemAction implements Presenter.Toolbar { +public final class AutoIngestDashboardOpenAction extends CallableSystemAction { private static final Logger LOGGER = Logger.getLogger(AutoIngestDashboardOpenAction.class.getName()); - private static final String VIEW_IMAGES_VIDEOS = Bundle.CTL_AutoIngestDashboardOpenAction(); - - private final JButton toolbarButton = new JButton(); - private final PropertyChangeListener pcl; - - public AutoIngestDashboardOpenAction() { - super(); - toolbarButton.addActionListener(actionEvent -> performAction()); - pcl = (PropertyChangeEvent evt) -> { - if (evt.getPropertyName().equals(Case.Events.CURRENT_CASE.toString())) { - setEnabled(RuntimeProperties.runningWithGUI() && evt.getNewValue() != null); - } - }; - Case.addPropertyChangeListener(pcl); - this.setEnabled(false); - } + private static final String DISPLAY_NAME = Bundle.CTL_AutoIngestDashboardOpenAction(); @Override public boolean isEnabled() { @@ -66,28 +43,6 @@ public final class AutoIngestDashboardOpenAction extends CallableSystemAction im return (mode == REVIEW); } - /** Returns the toolbar component of this action - * - * @return component the toolbar button */ - @Override - public Component getToolbarPresenter() { - ImageIcon icon = new ImageIcon(getClass().getResource("btn_icon_image_gallery_26.png")); //NON-NLS - toolbarButton.setIcon(icon); - toolbarButton.setText(this.getName()); - return toolbarButton; - } - - /** - * Set this action to be enabled/disabled - * - * @param value whether to enable this action or not - */ - @Override - public void setEnabled(boolean value) { - super.setEnabled(value); - toolbarButton.setEnabled(value); - } - @Override @SuppressWarnings("fallthrough") public void performAction() { @@ -96,7 +51,7 @@ public final class AutoIngestDashboardOpenAction extends CallableSystemAction im @Override public String getName() { - return VIEW_IMAGES_VIDEOS; + return DISPLAY_NAME; } @Override diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestJob.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestJob.java index 8372205fc6..f616853b05 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestJob.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestJob.java @@ -1,7 +1,7 @@ /* * Autopsy Forensic Browser * - * Copyright 2015 Basis Technology Corp. + * Copyright 2015-2017 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -41,12 +41,10 @@ public final class AutoIngestJob implements Comparable, Serializa private static final long serialVersionUID = 1L; private static final String LOCAL_HOST_NAME = NetworkUtils.getLocalHostName(); - private final Manifest manifest; + private final ManifestNodeData nodeData; private final String nodeName; @GuardedBy("this") - private String caseDirectoryPath; - @GuardedBy("this") - private Integer priority; + private String caseDirectoryPath; // DLG: Replace with ManifestNodeData.caseDirectoryPath @GuardedBy("this") private Stage stage; @GuardedBy("this") @@ -56,54 +54,44 @@ public final class AutoIngestJob implements Comparable, Serializa @GuardedBy("this") transient private IngestJob ingestJob; @GuardedBy("this") - transient private boolean cancelled; + transient private boolean canceled; @GuardedBy("this") transient private boolean completed; - @GuardedBy("this") - private Date completedDate; - @GuardedBy("this") - private boolean errorsOccurred; /** * Constructs an automated ingest job for a manifest. The manifest specifies * a co-located data source and a case to which the data source is to be * added. + * + * Note: Manifest objects will be phased out and no longer be part of the + * AutoIngestJob class. * - * @param manifest The manifest + * @param nodeData The node data. * @param caseDirectoryPath The path to the case directory for the job, may * be null. - * @param priority The priority of the job. The higher the number, - * the higher the priority. * @param nodeName If the job is in progress, the node doing the * processing, otherwise the locla host. * @param stage The processing stage for display purposes. - * @param completedDate The date when the job was completed. Use the - * epoch (January 1, 1970, 00:00:00 GMT) to - * indicate the the job is not completed, i.e., new - * Date(0L). */ - AutoIngestJob(Manifest manifest, Path caseDirectoryPath, int priority, String nodeName, Stage stage, Date completedDate, boolean errorsOccurred) { - this.manifest = manifest; + AutoIngestJob(ManifestNodeData nodeData, Path caseDirectoryPath, String nodeName, Stage stage) { + this.nodeData = nodeData; if (null != caseDirectoryPath) { this.caseDirectoryPath = caseDirectoryPath.toString(); } else { this.caseDirectoryPath = ""; } - this.priority = priority; this.nodeName = nodeName; this.stage = stage; - this.stageStartDate = manifest.getDateFileCreated(); - this.completedDate = completedDate; - this.errorsOccurred = errorsOccurred; + this.stageStartDate = nodeData.getManifestFileDate(); } /** - * Gets the auto ingest jobmanifest. + * Gets the auto ingest job node data. * - * @return The manifest. + * @return The node data. */ - Manifest getManifest() { - return this.manifest; + ManifestNodeData getNodeData() { + return this.nodeData; } /** @@ -140,32 +128,12 @@ public final class AutoIngestJob implements Comparable, Serializa } } - /** - * Sets the priority of the job. A higher number indicates a higher - * priority. - * - * @param priority The priority. - */ - synchronized void setPriority(Integer priority) { - this.priority = priority; - } - - /** - * Gets the priority of the job. A higher number indicates a higher - * priority. - * - * @return The priority. - */ - synchronized Integer getPriority() { - return this.priority; - } - synchronized void setStage(Stage newStage) { setStage(newStage, Date.from(Instant.now())); } synchronized void setStage(Stage newState, Date stateStartedDate) { - if (Stage.CANCELLING == this.stage && Stage.COMPLETED != newState) { + if (Stage.CANCELING == this.stage && Stage.COMPLETED != newState) { return; } this.stage = newState; @@ -183,7 +151,7 @@ public final class AutoIngestJob implements Comparable, Serializa synchronized StageDetails getStageDetails() { String description; Date startDate; - if (Stage.CANCELLING != this.stage && null != this.ingestJob) { + if (Stage.CANCELING != this.stage && null != this.ingestJob) { IngestJob.ProgressSnapshot progress = this.ingestJob.getSnapshot(); IngestJob.DataSourceIngestModuleHandle ingestModuleHandle = progress.runningDataSourceIngestModule(); if (null != ingestModuleHandle) { @@ -196,7 +164,7 @@ public final class AutoIngestJob implements Comparable, Serializa if (!ingestModuleHandle.isCancelled()) { description = ingestModuleHandle.displayName(); } else { - description = String.format(Stage.CANCELLING_MODULE.getDisplayText(), ingestModuleHandle.displayName()); + description = String.format(Stage.CANCELING_MODULE.getDisplayText(), ingestModuleHandle.displayName()); } } else { /** @@ -230,9 +198,9 @@ public final class AutoIngestJob implements Comparable, Serializa } synchronized void cancel() { - setStage(Stage.CANCELLING); - cancelled = true; - errorsOccurred = true; + setStage(Stage.CANCELING); + canceled = true; + nodeData.setErrorsOccurred(true); if (null != dataSourceProcessor) { dataSourceProcessor.cancel(); } @@ -241,8 +209,8 @@ public final class AutoIngestJob implements Comparable, Serializa } } - synchronized boolean isCancelled() { - return cancelled; + synchronized boolean isCanceled() { + return canceled; } synchronized void setCompleted() { @@ -254,44 +222,6 @@ public final class AutoIngestJob implements Comparable, Serializa return completed; } - /** - * Sets the date the job was completed, with or without cancellation or - * errors. - * - * @param completedDate The completion date. - */ - synchronized void setCompletedDate(Date completedDate) { - this.completedDate = completedDate; - } - - /** - * Gets the date the job was completed, with or without cancellation or - * errors. - * - * @return True or false. - */ - synchronized Date getCompletedDate() { - return completedDate; - } - - /** - * Sets whether or not erros occurred during the processing of the job. - * - * @param errorsOccurred True or false; - */ - synchronized void setErrorsOccurred(boolean errorsOccurred) { - this.errorsOccurred = errorsOccurred; - } - - /** - * Queries whether or not erros occurred during the processing of the job. - * - * @return True or false. - */ - synchronized boolean hasErrors() { - return this.errorsOccurred; - } - String getNodeName() { return nodeName; } @@ -304,7 +234,11 @@ public final class AutoIngestJob implements Comparable, Serializa if (obj == this) { return true; } - return this.getManifest().getFilePath().equals(((AutoIngestJob) obj).getManifest().getFilePath()); + + Path manifestPath1 = this.getNodeData().getManifestFilePath(); + Path manifestPath2 = ((AutoIngestJob)obj).getNodeData().getManifestFilePath(); + + return manifestPath1.equals(manifestPath2); } @Override @@ -315,7 +249,10 @@ public final class AutoIngestJob implements Comparable, Serializa @Override public int compareTo(AutoIngestJob o) { - return -this.getManifest().getDateFileCreated().compareTo(o.getManifest().getDateFileCreated()); + Date date1 = this.getNodeData().getManifestFileDate(); + Date date2 = o.getNodeData().getManifestFileDate(); + + return -date1.compareTo(date2); } /** @@ -337,7 +274,10 @@ public final class AutoIngestJob implements Comparable, Serializa @Override public int compare(AutoIngestJob job, AutoIngestJob anotherJob) { - return -(job.getPriority().compareTo(anotherJob.getPriority())); + Integer priority1 = job.getNodeData().getPriority(); + Integer priority2 = anotherJob.getNodeData().getPriority(); + + return -priority1.compareTo(priority2); } } @@ -356,7 +296,10 @@ public final class AutoIngestJob implements Comparable, Serializa } else if (o2.getNodeName().equalsIgnoreCase(LOCAL_HOST_NAME)) { return 1; // o2 is for current case, float to top } else { - return o1.getManifest().getCaseName().compareToIgnoreCase(o2.getManifest().getCaseName()); + String caseName1 = o1.getNodeData().getCaseName(); + String caseName2 = o2.getNodeData().getCaseName(); + + return caseName1.compareToIgnoreCase(caseName2); } } } @@ -373,8 +316,8 @@ public final class AutoIngestJob implements Comparable, Serializa ANALYZING_DATA_SOURCE("Analyzing data source"), ANALYZING_FILES("Analyzing files"), EXPORTING_FILES("Exporting files"), - CANCELLING_MODULE("Cancelling module"), - CANCELLING("Cancelling"), + CANCELING_MODULE("Canceling module"), + CANCELING("Canceling"), COMPLETED("Completed"); private final String displayText; diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestManager.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestManager.java index afae397553..4f119a82ca 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestManager.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestManager.java @@ -289,10 +289,10 @@ public final class AutoIngestManager extends Observable implements PropertyChang String hostName = event.getJob().getNodeName(); hostNamesToLastMsgTime.put(hostName, Instant.now()); synchronized (jobsLock) { - Path manifestFilePath = event.getJob().getManifest().getFilePath(); + Path manifestFilePath = event.getJob().getNodeData().getManifestFilePath(); for (Iterator iterator = pendingJobs.iterator(); iterator.hasNext();) { AutoIngestJob pendingJob = iterator.next(); - if (pendingJob.getManifest().getFilePath().equals(manifestFilePath)) { + if (pendingJob.getNodeData().getManifestFilePath().equals(manifestFilePath)) { iterator.remove(); break; } @@ -531,27 +531,29 @@ public final class AutoIngestManager extends Observable implements PropertyChang int maxPriority = 0; synchronized (jobsLock) { for (AutoIngestJob job : pendingJobs) { - if (job.getPriority() > maxPriority) { - maxPriority = job.getPriority(); + if (job.getNodeData().getPriority() > maxPriority) { + maxPriority = job.getNodeData().getPriority(); } - if (job.getManifest().getCaseName().equals(caseName)) { + if (job.getNodeData().getCaseName().equals(caseName)) { prioritizedJobs.add(job); } } if (!prioritizedJobs.isEmpty()) { ++maxPriority; for (AutoIngestJob job : prioritizedJobs) { - String manifestNodePath = job.getManifest().getFilePath().toString(); + String manifestNodePath = job.getNodeData().getManifestFilePath().toString(); try { ManifestNodeData nodeData = new ManifestNodeData(coordinationService.getNodeData(CoordinationService.CategoryNode.MANIFESTS, manifestNodePath)); nodeData.setPriority(maxPriority); coordinationService.setNodeData(CoordinationService.CategoryNode.MANIFESTS, manifestNodePath, nodeData.toArray()); + } catch (ManifestNodeDataException ex) { + SYS_LOGGER.log(Level.WARNING, String.format("Unable to use node data for %s", manifestNodePath), ex); } catch (CoordinationServiceException ex) { SYS_LOGGER.log(Level.SEVERE, String.format("Coordination service error while prioritizing %s", manifestNodePath), ex); } catch (InterruptedException ex) { SYS_LOGGER.log(Level.SEVERE, "Unexpected interrupt while updating coordination service node data for {0}", manifestNodePath); } - job.setPriority(maxPriority); + job.getNodeData().setPriority(maxPriority); } } @@ -579,33 +581,35 @@ public final class AutoIngestManager extends Observable implements PropertyChang AutoIngestJob prioritizedJob = null; synchronized (jobsLock) { for (AutoIngestJob job : pendingJobs) { - if (job.getPriority() > maxPriority) { - maxPriority = job.getPriority(); + if (job.getNodeData().getPriority() > maxPriority) { + maxPriority = job.getNodeData().getPriority(); } - if (job.getManifest().getFilePath().equals(manifestPath)) { + if (job.getNodeData().getManifestFilePath().equals(manifestPath)) { prioritizedJob = job; } } if (null != prioritizedJob) { ++maxPriority; - String manifestNodePath = prioritizedJob.getManifest().getFilePath().toString(); + String manifestNodePath = prioritizedJob.getNodeData().getManifestFilePath().toString(); try { ManifestNodeData nodeData = new ManifestNodeData(coordinationService.getNodeData(CoordinationService.CategoryNode.MANIFESTS, manifestNodePath)); nodeData.setPriority(maxPriority); coordinationService.setNodeData(CoordinationService.CategoryNode.MANIFESTS, manifestNodePath, nodeData.toArray()); + } catch (ManifestNodeDataException ex) { + SYS_LOGGER.log(Level.WARNING, String.format("Unable to use node data for %s", manifestPath), ex); } catch (CoordinationServiceException ex) { SYS_LOGGER.log(Level.SEVERE, String.format("Coordination service error while prioritizing %s", manifestNodePath), ex); } catch (InterruptedException ex) { SYS_LOGGER.log(Level.SEVERE, "Unexpected interrupt while updating coordination service node data for {0}", manifestNodePath); } - prioritizedJob.setPriority(maxPriority); + prioritizedJob.getNodeData().setPriority(maxPriority); } Collections.sort(pendingJobs, new AutoIngestJob.PriorityComparator()); } if (null != prioritizedJob) { - final String caseName = prioritizedJob.getManifest().getCaseName(); + final String caseName = prioritizedJob.getNodeData().getCaseName(); new Thread(() -> { eventPublisher.publishRemotely(new AutoIngestCasePrioritizedEvent(LOCAL_HOST_NAME, caseName)); }).start(); @@ -623,7 +627,7 @@ public final class AutoIngestManager extends Observable implements PropertyChang synchronized (jobsLock) { for (Iterator iterator = completedJobs.iterator(); iterator.hasNext();) { AutoIngestJob job = iterator.next(); - if (job.getManifest().getFilePath().equals(manifestPath)) { + if (job.getNodeData().getManifestFilePath().equals(manifestPath)) { completedJob = job; iterator.remove(); break; @@ -632,9 +636,14 @@ public final class AutoIngestManager extends Observable implements PropertyChang if (null != completedJob && null != completedJob.getCaseDirectoryPath()) { try { - ManifestNodeData nodeData = new ManifestNodeData(PENDING, DEFAULT_JOB_PRIORITY, 0, new Date(0), true); + ManifestNodeData nodeData = completedJob.getNodeData(); + nodeData.setStatus(PENDING); + nodeData.setPriority(DEFAULT_JOB_PRIORITY); + nodeData.setNumberOfCrashes(0); + nodeData.setCompletedDate(new Date(0)); + nodeData.setErrorsOccurred(true); coordinationService.setNodeData(CoordinationService.CategoryNode.MANIFESTS, manifestPath.toString(), nodeData.toArray()); - pendingJobs.add(new AutoIngestJob(completedJob.getManifest(), completedJob.getCaseDirectoryPath(), DEFAULT_JOB_PRIORITY, LOCAL_HOST_NAME, AutoIngestJob.Stage.PENDING, new Date(0), true)); + pendingJobs.add(new AutoIngestJob(nodeData, completedJob.getCaseDirectoryPath(), LOCAL_HOST_NAME, AutoIngestJob.Stage.PENDING)); } catch (CoordinationServiceException ex) { SYS_LOGGER.log(Level.SEVERE, String.format("Coordination service error while reprocessing %s", manifestPath), ex); completedJobs.add(completedJob); @@ -727,6 +736,8 @@ public final class AutoIngestManager extends Observable implements PropertyChang ManifestNodeData nodeData = new ManifestNodeData(coordinationService.getNodeData(CoordinationService.CategoryNode.MANIFESTS, manifestPath.toString())); nodeData.setStatus(ManifestNodeData.ProcessingStatus.DELETED); coordinationService.setNodeData(CoordinationService.CategoryNode.MANIFESTS, manifestPath.toString(), nodeData.toArray()); + } catch (ManifestNodeDataException ex) { + SYS_LOGGER.log(Level.WARNING, String.format("Unable to use node data for %s", manifestPath), ex); } catch (InterruptedException | CoordinationServiceException ex) { SYS_LOGGER.log(Level.SEVERE, String.format("Error attempting to set delete flag on manifest data for %s for case %s at %s", manifestPath, caseName, caseDirectoryPath), ex); return CaseDeletionResult.PARTIALLY_DELETED; @@ -783,7 +794,7 @@ public final class AutoIngestManager extends Observable implements PropertyChang private void removeJobs(Set manifestPaths, List jobs) { for (Iterator iterator = jobs.iterator(); iterator.hasNext();) { AutoIngestJob job = iterator.next(); - Path manifestPath = job.getManifest().getFilePath(); + Path manifestPath = job.getNodeData().getManifestFilePath(); if (manifestPaths.contains(manifestPath)) { iterator.remove(); } @@ -804,7 +815,7 @@ public final class AutoIngestManager extends Observable implements PropertyChang synchronized (jobsLock) { if (null != currentJob) { currentJob.cancel(); - SYS_LOGGER.log(Level.INFO, "Cancelling automated ingest for manifest {0}", currentJob.getManifest().getFilePath()); + SYS_LOGGER.log(Level.INFO, "Cancelling automated ingest for manifest {0}", currentJob.getNodeData().getManifestFilePath()); } } } @@ -823,9 +834,9 @@ public final class AutoIngestManager extends Observable implements PropertyChang if (null != ingestJob) { IngestJob.DataSourceIngestModuleHandle moduleHandle = ingestJob.getSnapshot().runningDataSourceIngestModule(); if (null != moduleHandle) { - currentJob.setStage(AutoIngestJob.Stage.CANCELLING_MODULE); + currentJob.setStage(AutoIngestJob.Stage.CANCELING_MODULE); moduleHandle.cancel(); - SYS_LOGGER.log(Level.INFO, "Cancelling {0} module for manifest {1}", new Object[]{moduleHandle.displayName(), currentJob.getManifest().getFilePath()}); + SYS_LOGGER.log(Level.INFO, "Cancelling {0} module for manifest {1}", new Object[]{moduleHandle.displayName(), currentJob.getNodeData().getManifestFilePath()}); } } } @@ -1015,28 +1026,32 @@ public final class AutoIngestManager extends Observable implements PropertyChang try { byte[] rawData = coordinationService.getNodeData(CoordinationService.CategoryNode.MANIFESTS, manifestPath.toString()); if (null != rawData) { - ManifestNodeData nodeData = new ManifestNodeData(rawData); - if (nodeData.coordSvcNodeDataWasSet()) { - ProcessingStatus processingStatus = nodeData.getStatus(); - switch (processingStatus) { - case PENDING: - addPendingJob(manifest, nodeData); - break; - case PROCESSING: - doRecoveryIfCrashed(manifest); - break; - case COMPLETED: - addCompletedJob(manifest, nodeData); - break; - case DELETED: - // Do nothing - we dont'want to add it to any job list or do recovery - break; - default: - SYS_LOGGER.log(Level.SEVERE, "Unknown ManifestNodeData.ProcessingStatus"); - break; + try { + ManifestNodeData nodeData = new ManifestNodeData(rawData); + if (nodeData.coordSvcNodeDataWasSet()) { + ProcessingStatus processingStatus = nodeData.getStatus(); + switch (processingStatus) { + case PENDING: + addPendingJob(nodeData); + break; + case PROCESSING: + doRecoveryIfCrashed(nodeData); + break; + case COMPLETED: + addCompletedJob(nodeData); + break; + case DELETED: + // Do nothing - we dont'want to add it to any job list or do recovery + break; + default: + SYS_LOGGER.log(Level.SEVERE, "Unknown ManifestNodeData.ProcessingStatus"); + break; + } + } else { + addNewPendingJob(manifest); } - } else { - addNewPendingJob(manifest); + } catch(ManifestNodeDataException ex) { + SYS_LOGGER.log(Level.WARNING, String.format("Unable to use node data for %s", manifestPath), ex); } } else { addNewPendingJob(manifest); @@ -1060,13 +1075,14 @@ public final class AutoIngestManager extends Observable implements PropertyChang /** * Adds a job to process a manifest to the pending jobs queue. * - * @param manifest The manifest. * @param nodeData The data stored in the coordination service node for * the manifest. */ - private void addPendingJob(Manifest manifest, ManifestNodeData nodeData) { - Path caseDirectory = PathUtils.findCaseDirectory(rootOutputDirectory, manifest.getCaseName()); - newPendingJobsList.add(new AutoIngestJob(manifest, caseDirectory, nodeData.getPriority(), LOCAL_HOST_NAME, AutoIngestJob.Stage.PENDING, new Date(0), false)); + private void addPendingJob(ManifestNodeData nodeData) { + Path caseDirectory = PathUtils.findCaseDirectory(rootOutputDirectory, nodeData.getCaseName()); + nodeData.setCompletedDate(new Date(0)); + nodeData.setErrorsOccurred(false); + newPendingJobsList.add(new AutoIngestJob(nodeData, caseDirectory, LOCAL_HOST_NAME, AutoIngestJob.Stage.PENDING)); } /** @@ -1084,9 +1100,9 @@ public final class AutoIngestManager extends Observable implements PropertyChang // Is use of Curator.create().forPath() possible instead? try (Lock manifestLock = coordinationService.tryGetExclusiveLock(CoordinationService.CategoryNode.MANIFESTS, manifest.getFilePath().toString())) { if (null != manifestLock) { - ManifestNodeData newNodeData = new ManifestNodeData(PENDING, DEFAULT_JOB_PRIORITY, 0, new Date(0), false); + ManifestNodeData newNodeData = new ManifestNodeData(manifest, PENDING, DEFAULT_JOB_PRIORITY, 0, new Date(0), false); coordinationService.setNodeData(CoordinationService.CategoryNode.MANIFESTS, manifest.getFilePath().toString(), newNodeData.toArray()); - newPendingJobsList.add(new AutoIngestJob(manifest, null, DEFAULT_JOB_PRIORITY, LOCAL_HOST_NAME, AutoIngestJob.Stage.PENDING, new Date(0), false)); + newPendingJobsList.add(new AutoIngestJob(newNodeData, null, LOCAL_HOST_NAME, AutoIngestJob.Stage.PENDING)); } } catch (CoordinationServiceException ex) { SYS_LOGGER.log(Level.SEVERE, String.format("Error attempting to set node data for %s", manifest.getFilePath()), ex); @@ -1101,92 +1117,75 @@ public final class AutoIngestManager extends Observable implements PropertyChang * the node that was processing the job crashed and the processing * status was not updated. * - * @param manifest + * @param nodeData * * @throws InterruptedException if the thread running the input * directory scan task is interrupted while * blocked, i.e., if auto ingest is * shutting down. */ - private void doRecoveryIfCrashed(Manifest manifest) throws InterruptedException { - String manifestPath = manifest.getFilePath().toString(); - try { - Lock manifestLock = coordinationService.tryGetExclusiveLock(CoordinationService.CategoryNode.MANIFESTS, manifestPath); - if (null != manifestLock) { - try { - ManifestNodeData nodeData = new ManifestNodeData(coordinationService.getNodeData(CoordinationService.CategoryNode.MANIFESTS, manifestPath)); - if (nodeData.coordSvcNodeDataWasSet() && ProcessingStatus.PROCESSING == nodeData.getStatus()) { - SYS_LOGGER.log(Level.SEVERE, "Attempting crash recovery for {0}", manifestPath); - int numberOfCrashes = nodeData.getNumberOfCrashes(); - ++numberOfCrashes; - nodeData.setNumberOfCrashes(numberOfCrashes); - if (numberOfCrashes <= AutoIngestUserPreferences.getMaxNumTimesToProcessImage()) { - nodeData.setStatus(PENDING); - Path caseDirectoryPath = PathUtils.findCaseDirectory(rootOutputDirectory, manifest.getCaseName()); - newPendingJobsList.add(new AutoIngestJob(manifest, caseDirectoryPath, nodeData.getPriority(), LOCAL_HOST_NAME, AutoIngestJob.Stage.PENDING, new Date(0), true)); - if (null != caseDirectoryPath) { - try { - AutoIngestAlertFile.create(caseDirectoryPath); - } catch (AutoIngestAlertFileException ex) { - SYS_LOGGER.log(Level.SEVERE, String.format("Error creating alert file for crashed job for %s", manifestPath), ex); - } - try { - new AutoIngestJobLogger(manifest.getFilePath(), manifest.getDataSourceFileName(), caseDirectoryPath).logCrashRecoveryWithRetry(); - } catch (AutoIngestJobLoggerException ex) { - SYS_LOGGER.log(Level.SEVERE, String.format("Error creating case auto ingest log entry for crashed job for %s", manifestPath), ex); - } - } - } else { - nodeData.setStatus(COMPLETED); - Path caseDirectoryPath = PathUtils.findCaseDirectory(rootOutputDirectory, manifest.getCaseName()); - newCompletedJobsList.add(new AutoIngestJob(manifest, caseDirectoryPath, nodeData.getPriority(), LOCAL_HOST_NAME, AutoIngestJob.Stage.COMPLETED, new Date(), true)); - if (null != caseDirectoryPath) { - try { - AutoIngestAlertFile.create(caseDirectoryPath); - } catch (AutoIngestAlertFileException ex) { - SYS_LOGGER.log(Level.SEVERE, String.format("Error creating alert file for crashed job for %s", manifestPath), ex); - } - try { - new AutoIngestJobLogger(manifest.getFilePath(), manifest.getDataSourceFileName(), caseDirectoryPath).logCrashRecoveryNoRetry(); - } catch (AutoIngestJobLoggerException ex) { - SYS_LOGGER.log(Level.SEVERE, String.format("Error creating case auto ingest log entry for crashed job for %s", manifestPath), ex); - } - } - } - try { - coordinationService.setNodeData(CoordinationService.CategoryNode.MANIFESTS, manifestPath, nodeData.toArray()); - } catch (CoordinationServiceException ex) { - SYS_LOGGER.log(Level.SEVERE, String.format("Error attempting to set node data for %s", manifestPath), ex); - } - } - } catch (CoordinationServiceException ex) { - SYS_LOGGER.log(Level.SEVERE, String.format("Error attempting to get node data for %s", manifestPath), ex); - } finally { + private void doRecoveryIfCrashed(ManifestNodeData nodeData) throws InterruptedException { + String manifestPath = nodeData.getManifestFilePath().toString(); + if (nodeData.coordSvcNodeDataWasSet() && ProcessingStatus.PROCESSING == nodeData.getStatus()) { + SYS_LOGGER.log(Level.SEVERE, "Attempting crash recovery for {0}", manifestPath); + int numberOfCrashes = nodeData.getNumberOfCrashes(); + ++numberOfCrashes; + nodeData.setNumberOfCrashes(numberOfCrashes); + nodeData.setCompletedDate(new Date(0)); + nodeData.setErrorsOccurred(true); + if (numberOfCrashes <= AutoIngestUserPreferences.getMaxNumTimesToProcessImage()) { + nodeData.setStatus(PENDING); + Path caseDirectoryPath = PathUtils.findCaseDirectory(rootOutputDirectory, nodeData.getCaseName()); + newPendingJobsList.add(new AutoIngestJob(nodeData, caseDirectoryPath, LOCAL_HOST_NAME, AutoIngestJob.Stage.PENDING)); + if (null != caseDirectoryPath) { try { - manifestLock.release(); - } catch (CoordinationServiceException ex) { - SYS_LOGGER.log(Level.SEVERE, String.format("Error attempting to release exclusive lock for %s", manifestPath), ex); + AutoIngestAlertFile.create(caseDirectoryPath); + } catch (AutoIngestAlertFileException ex) { + SYS_LOGGER.log(Level.SEVERE, String.format("Error creating alert file for crashed job for %s", manifestPath), ex); + } + try { + new AutoIngestJobLogger(nodeData.getManifestFilePath(), nodeData.getDataSourceFileName(), caseDirectoryPath).logCrashRecoveryWithRetry(); + } catch (AutoIngestJobLoggerException ex) { + SYS_LOGGER.log(Level.SEVERE, String.format("Error creating case auto ingest log entry for crashed job for %s", manifestPath), ex); + } + } + } else { + nodeData.setStatus(COMPLETED); + Path caseDirectoryPath = PathUtils.findCaseDirectory(rootOutputDirectory, nodeData.getCaseName()); + newCompletedJobsList.add(new AutoIngestJob(nodeData, caseDirectoryPath, LOCAL_HOST_NAME, AutoIngestJob.Stage.COMPLETED)); + if (null != caseDirectoryPath) { + try { + AutoIngestAlertFile.create(caseDirectoryPath); + } catch (AutoIngestAlertFileException ex) { + SYS_LOGGER.log(Level.SEVERE, String.format("Error creating alert file for crashed job for %s", manifestPath), ex); + } + try { + new AutoIngestJobLogger(nodeData.getManifestFilePath(), nodeData.getDataSourceFileName(), caseDirectoryPath).logCrashRecoveryNoRetry(); + } catch (AutoIngestJobLoggerException ex) { + SYS_LOGGER.log(Level.SEVERE, String.format("Error creating case auto ingest log entry for crashed job for %s", manifestPath), ex); } } } - } catch (CoordinationServiceException ex) { - SYS_LOGGER.log(Level.SEVERE, String.format("Error attempting to get exclusive lock for %s", manifestPath), ex); + try { + coordinationService.setNodeData(CoordinationService.CategoryNode.MANIFESTS, manifestPath, nodeData.toArray()); + } catch (CoordinationServiceException ex) { + SYS_LOGGER.log(Level.SEVERE, String.format("Error attempting to set node data for %s", manifestPath), ex); + } } } /** * Adds a job to process a manifest to the completed jobs list. * - * @param manifest The manifest. * @param nodeData The data stored in the coordination service node for * the manifest. */ - private void addCompletedJob(Manifest manifest, ManifestNodeData nodeData) { - Path caseDirectoryPath = PathUtils.findCaseDirectory(rootOutputDirectory, manifest.getCaseName()); + private void addCompletedJob(ManifestNodeData nodeData) { + Path caseDirectoryPath = PathUtils.findCaseDirectory(rootOutputDirectory, nodeData.getCaseName()); if (null != caseDirectoryPath) { - newCompletedJobsList.add(new AutoIngestJob(manifest, caseDirectoryPath, nodeData.getPriority(), LOCAL_HOST_NAME, AutoIngestJob.Stage.COMPLETED, nodeData.getCompletedDate(), nodeData.getErrorsOccurred())); + newCompletedJobsList.add(new AutoIngestJob(nodeData, caseDirectoryPath, LOCAL_HOST_NAME, AutoIngestJob.Stage.COMPLETED)); } else { - SYS_LOGGER.log(Level.WARNING, String.format("Job completed for %s, but cannot find case directory, ignoring job", manifest.getFilePath())); + SYS_LOGGER.log(Level.WARNING, String.format("Job completed for %s, but cannot find case directory, ignoring job", nodeData.getManifestFilePath())); } } @@ -1219,9 +1218,8 @@ public final class AutoIngestManager extends Observable implements PropertyChang * visited. Checks if the task thread has been interrupted because auto * ingest is shutting down and terminates the scan if that is the case. * - * @param dirPath The directory about to be visited. - * @param dirAttrs The basic file attributes of the directory about to - * be visited. + * @param dirPath The directory about to be visited. + * @param unused Unused. * * @return TERMINATE if the task thread has been interrupted, CONTINUE * if it has not. @@ -1516,10 +1514,12 @@ public final class AutoIngestManager extends Observable implements PropertyChang Lock manifestLock = JobProcessingTask.this.dequeueAndLockNextJob(); while (null != manifestLock) { try { - if (currentJob.isCancelled() || jobProcessingTaskFuture.isCancelled()) { + if (currentJob.isCanceled() || jobProcessingTaskFuture.isCancelled()) { return; } processJob(); + } catch (ManifestNodeDataException ex) { + SYS_LOGGER.log(Level.WARNING, String.format("Unable to use node data"), ex); } finally { manifestLock.release(); } @@ -1567,13 +1567,13 @@ public final class AutoIngestManager extends Observable implements PropertyChang synchronized (jobsLock) { manifestLock = dequeueAndLockNextJob(true); if (null != manifestLock) { - SYS_LOGGER.log(Level.INFO, "Dequeued job for {0}", currentJob.getManifest().getFilePath()); + SYS_LOGGER.log(Level.INFO, "Dequeued job for {0}", currentJob.getNodeData().getManifestFilePath()); } else { SYS_LOGGER.log(Level.INFO, "No ready job"); SYS_LOGGER.log(Level.INFO, "Checking pending jobs queue for ready job, not enforcing max jobs per case"); manifestLock = dequeueAndLockNextJob(false); if (null != manifestLock) { - SYS_LOGGER.log(Level.INFO, "Dequeued job for {0}", currentJob.getManifest().getFilePath()); + SYS_LOGGER.log(Level.INFO, "Dequeued job for {0}", currentJob.getNodeData().getManifestFilePath()); } else { SYS_LOGGER.log(Level.INFO, "No ready job"); } @@ -1606,7 +1606,7 @@ public final class AutoIngestManager extends Observable implements PropertyChang Iterator iterator = pendingJobs.iterator(); while (iterator.hasNext()) { AutoIngestJob job = iterator.next(); - Path manifestPath = job.getManifest().getFilePath(); + Path manifestPath = job.getNodeData().getManifestFilePath(); manifestLock = coordinationService.tryGetExclusiveLock(CoordinationService.CategoryNode.MANIFESTS, manifestPath.toString()); if (null == manifestLock) { /* @@ -1618,33 +1618,37 @@ public final class AutoIngestManager extends Observable implements PropertyChang continue; } - ManifestNodeData nodeData = new ManifestNodeData(coordinationService.getNodeData(CoordinationService.CategoryNode.MANIFESTS, manifestPath.toString())); - if (!nodeData.getStatus().equals(PENDING)) { - /* - * Due to a timing issue or a missed event, a - * non-pending job has ended up on the pending queue. - * Skip the job and remove it from the queue. - */ - iterator.remove(); - continue; - } - - if (enforceMaxJobsPerCase) { - int currentJobsForCase = 0; - for (AutoIngestJob runningJob : hostNamesToRunningJobs.values()) { - if (0 == job.getManifest().getCaseName().compareTo(runningJob.getManifest().getCaseName())) { - ++currentJobsForCase; - } - } - if (currentJobsForCase >= AutoIngestUserPreferences.getMaxConcurrentJobsForOneCase()) { - manifestLock.release(); - manifestLock = null; + try { + ManifestNodeData nodeData = new ManifestNodeData(coordinationService.getNodeData(CoordinationService.CategoryNode.MANIFESTS, manifestPath.toString())); + if (!nodeData.getStatus().equals(PENDING)) { + /* + * Due to a timing issue or a missed event, a + * non-pending job has ended up on the pending queue. + * Skip the job and remove it from the queue. + */ + iterator.remove(); continue; } + + if (enforceMaxJobsPerCase) { + int currentJobsForCase = 0; + for (AutoIngestJob runningJob : hostNamesToRunningJobs.values()) { + if (0 == job.getNodeData().getCaseName().compareTo(runningJob.getNodeData().getCaseName())) { + ++currentJobsForCase; + } + } + if (currentJobsForCase >= AutoIngestUserPreferences.getMaxConcurrentJobsForOneCase()) { + manifestLock.release(); + manifestLock = null; + continue; + } + } + iterator.remove(); + currentJob = job; + break; + } catch (ManifestNodeDataException ex) { + SYS_LOGGER.log(Level.WARNING, String.format("Unable to use node data for %s", manifestPath), ex); } - iterator.remove(); - currentJob = job; - break; } } return manifestLock; @@ -1688,19 +1692,18 @@ public final class AutoIngestManager extends Observable implements PropertyChang * i.e., if auto ingest is * shutting down. */ - private void processJob() throws CoordinationServiceException, SharedConfigurationException, ServicesMonitorException, DatabaseServerDownException, KeywordSearchServerDownException, CaseManagementException, AnalysisStartupException, FileExportException, AutoIngestAlertFileException, AutoIngestJobLoggerException, InterruptedException, AutoIngestDataSourceProcessor.AutoIngestDataSourceProcessorException { - Manifest manifest = currentJob.getManifest(); - String manifestPath = manifest.getFilePath().toString(); - ManifestNodeData nodeData = new ManifestNodeData(coordinationService.getNodeData(CoordinationService.CategoryNode.MANIFESTS, manifestPath)); + private void processJob() throws CoordinationServiceException, SharedConfigurationException, ServicesMonitorException, DatabaseServerDownException, KeywordSearchServerDownException, CaseManagementException, AnalysisStartupException, FileExportException, AutoIngestAlertFileException, AutoIngestJobLoggerException, InterruptedException, AutoIngestDataSourceProcessor.AutoIngestDataSourceProcessorException, ManifestNodeDataException { + Path manifestPath = currentJob.getNodeData().getManifestFilePath(); + ManifestNodeData nodeData = new ManifestNodeData(coordinationService.getNodeData(CoordinationService.CategoryNode.MANIFESTS, manifestPath.toString())); nodeData.setStatus(PROCESSING); - coordinationService.setNodeData(CoordinationService.CategoryNode.MANIFESTS, manifestPath, nodeData.toArray()); + coordinationService.setNodeData(CoordinationService.CategoryNode.MANIFESTS, manifestPath.toString(), nodeData.toArray()); SYS_LOGGER.log(Level.INFO, "Started processing of {0}", manifestPath); currentJob.setStage(AutoIngestJob.Stage.STARTING); setChanged(); notifyObservers(Event.JOB_STARTED); eventPublisher.publishRemotely(new AutoIngestJobStartedEvent(currentJob)); try { - if (currentJob.isCancelled() || jobProcessingTaskFuture.isCancelled()) { + if (currentJob.isCanceled() || jobProcessingTaskFuture.isCancelled()) { return; } attemptJob(); @@ -1710,26 +1713,26 @@ public final class AutoIngestManager extends Observable implements PropertyChang currentJob.cancel(); } - nodeData = new ManifestNodeData(coordinationService.getNodeData(CoordinationService.CategoryNode.MANIFESTS, manifestPath)); - if (currentJob.isCompleted() || currentJob.isCancelled()) { + nodeData = new ManifestNodeData(coordinationService.getNodeData(CoordinationService.CategoryNode.MANIFESTS, manifestPath.toString())); + if (currentJob.isCompleted() || currentJob.isCanceled()) { nodeData.setStatus(COMPLETED); Date completedDate = new Date(); - currentJob.setCompletedDate(completedDate); - nodeData.setCompletedDate(currentJob.getCompletedDate()); - nodeData.setErrorsOccurred(currentJob.hasErrors()); + currentJob.getNodeData().setCompletedDate(completedDate); + nodeData.setCompletedDate(currentJob.getNodeData().getCompletedDate()); + nodeData.setErrorsOccurred(currentJob.getNodeData().getErrorsOccurred()); } else { // The job may get retried nodeData.setStatus(PENDING); } - coordinationService.setNodeData(CoordinationService.CategoryNode.MANIFESTS, manifestPath, nodeData.toArray()); + coordinationService.setNodeData(CoordinationService.CategoryNode.MANIFESTS, manifestPath.toString(), nodeData.toArray()); - boolean retry = (!currentJob.isCancelled() && !currentJob.isCompleted()); + boolean retry = (!currentJob.isCanceled() && !currentJob.isCompleted()); SYS_LOGGER.log(Level.INFO, "Completed processing of {0}, retry = {1}", new Object[]{manifestPath, retry}); - if (currentJob.isCancelled()) { + if (currentJob.isCanceled()) { Path caseDirectoryPath = currentJob.getCaseDirectoryPath(); if (null != caseDirectoryPath) { AutoIngestAlertFile.create(caseDirectoryPath); // Do this first, it is more important than the case log - AutoIngestJobLogger jobLogger = new AutoIngestJobLogger(manifest.getFilePath(), manifest.getDataSourceFileName(), caseDirectoryPath); + AutoIngestJobLogger jobLogger = new AutoIngestJobLogger(nodeData.getManifestFilePath(), nodeData.getDataSourceFileName(), caseDirectoryPath); jobLogger.logJobCancelled(); } } @@ -1778,16 +1781,16 @@ public final class AutoIngestManager extends Observable implements PropertyChang */ private void attemptJob() throws CoordinationServiceException, SharedConfigurationException, ServicesMonitorException, DatabaseServerDownException, KeywordSearchServerDownException, CaseManagementException, AnalysisStartupException, FileExportException, AutoIngestAlertFileException, AutoIngestJobLoggerException, InterruptedException, AutoIngestDataSourceProcessor.AutoIngestDataSourceProcessorException { updateConfiguration(); - if (currentJob.isCancelled() || jobProcessingTaskFuture.isCancelled()) { + if (currentJob.isCanceled() || jobProcessingTaskFuture.isCancelled()) { return; } verifyRequiredSevicesAreRunning(); - if (currentJob.isCancelled() || jobProcessingTaskFuture.isCancelled()) { + if (currentJob.isCanceled() || jobProcessingTaskFuture.isCancelled()) { return; } Case caseForJob = openCase(); try { - if (currentJob.isCancelled() || jobProcessingTaskFuture.isCancelled()) { + if (currentJob.isCanceled() || jobProcessingTaskFuture.isCancelled()) { return; } runIngestForJob(caseForJob); @@ -1796,8 +1799,8 @@ public final class AutoIngestManager extends Observable implements PropertyChang try { Case.closeCurrentCase(); } catch (CaseActionException ex) { - Manifest manifest = currentJob.getManifest(); - throw new CaseManagementException(String.format("Error closing case %s for %s", manifest.getCaseName(), manifest.getFilePath()), ex); + ManifestNodeData nodeData = currentJob.getNodeData(); + throw new CaseManagementException(String.format("Error closing case %s for %s", nodeData.getCaseName(), nodeData.getManifestFilePath()), ex); } } } @@ -1815,8 +1818,7 @@ public final class AutoIngestManager extends Observable implements PropertyChang */ private void updateConfiguration() throws SharedConfigurationException, InterruptedException { if (AutoIngestUserPreferences.getSharedConfigEnabled()) { - Manifest manifest = currentJob.getManifest(); - Path manifestPath = manifest.getFilePath(); + Path manifestPath = currentJob.getNodeData().getManifestFilePath(); SYS_LOGGER.log(Level.INFO, "Downloading shared configuration for {0}", manifestPath); currentJob.setStage(AutoIngestJob.Stage.UPDATING_SHARED_CONFIG); new SharedConfiguration().downloadConfiguration(); @@ -1834,8 +1836,7 @@ public final class AutoIngestManager extends Observable implements PropertyChang * down. */ private void verifyRequiredSevicesAreRunning() throws ServicesMonitorException, DatabaseServerDownException, KeywordSearchServerDownException { - Manifest manifest = currentJob.getManifest(); - Path manifestPath = manifest.getFilePath(); + Path manifestPath = currentJob.getNodeData().getManifestFilePath(); SYS_LOGGER.log(Level.INFO, "Checking services availability for {0}", manifestPath); currentJob.setStage(AutoIngestJob.Stage.CHECKING_SERVICES); if (!isServiceUp(ServicesMonitor.Service.REMOTE_CASE_DATABASE.toString())) { @@ -1881,9 +1882,9 @@ public final class AutoIngestManager extends Observable implements PropertyChang * if auto ingest is shutting down. */ private Case openCase() throws CoordinationServiceException, CaseManagementException, InterruptedException { - Manifest manifest = currentJob.getManifest(); - String caseName = manifest.getCaseName(); - SYS_LOGGER.log(Level.INFO, "Opening case {0} for {1}", new Object[]{caseName, manifest.getFilePath()}); + ManifestNodeData nodeData = currentJob.getNodeData(); + String caseName = nodeData.getCaseName(); + SYS_LOGGER.log(Level.INFO, "Opening case {0} for {1}", new Object[]{caseName, nodeData.getManifestFilePath()}); currentJob.setStage(AutoIngestJob.Stage.OPENING_CASE); /* * Acquire and hold a case name lock so that only one node at as @@ -1909,20 +1910,20 @@ public final class AutoIngestManager extends Observable implements PropertyChang } currentJob.setCaseDirectoryPath(caseDirectoryPath); Case caseForJob = Case.getCurrentCase(); - SYS_LOGGER.log(Level.INFO, "Opened case {0} for {1}", new Object[]{caseForJob.getName(), manifest.getFilePath()}); + SYS_LOGGER.log(Level.INFO, "Opened case {0} for {1}", new Object[]{caseForJob.getName(), nodeData.getManifestFilePath()}); return caseForJob; } catch (CaseActionException ex) { - throw new CaseManagementException(String.format("Error creating or opening case %s for %s", caseName, manifest.getFilePath()), ex); + throw new CaseManagementException(String.format("Error creating or opening case %s for %s", caseName, nodeData.getManifestFilePath()), ex); } catch (IllegalStateException ex) { /* * Deal with the unfortunate fact that * Case.getCurrentCase throws IllegalStateException. */ - throw new CaseManagementException(String.format("Error getting current case %s for %s", caseName, manifest.getFilePath()), ex); + throw new CaseManagementException(String.format("Error getting current case %s for %s", caseName, nodeData.getManifestFilePath()), ex); } } else { - throw new CaseManagementException(String.format("Timed out acquiring case name lock for %s for %s", caseName, manifest.getFilePath())); + throw new CaseManagementException(String.format("Timed out acquiring case name lock for %s for %s", caseName, nodeData.getManifestFilePath())); } } } @@ -1953,10 +1954,9 @@ public final class AutoIngestManager extends Observable implements PropertyChang * ingest is shutting down. */ private void runIngestForJob(Case caseForJob) throws CoordinationServiceException, AnalysisStartupException, FileExportException, AutoIngestAlertFileException, AutoIngestJobLoggerException, InterruptedException, AutoIngestDataSourceProcessor.AutoIngestDataSourceProcessorException { - Manifest manifest = currentJob.getManifest(); - String manifestPath = manifest.getFilePath().toString(); + Path manifestPath = currentJob.getNodeData().getManifestFilePath(); try { - if (currentJob.isCancelled() || jobProcessingTaskFuture.isCancelled()) { + if (currentJob.isCanceled() || jobProcessingTaskFuture.isCancelled()) { return; } ingestDataSource(caseForJob); @@ -1993,7 +1993,7 @@ public final class AutoIngestManager extends Observable implements PropertyChang * ingest is shutting down. */ private void ingestDataSource(Case caseForJob) throws AnalysisStartupException, FileExportException, AutoIngestAlertFileException, AutoIngestJobLoggerException, InterruptedException, AutoIngestDataSourceProcessor.AutoIngestDataSourceProcessorException { - if (currentJob.isCancelled() || jobProcessingTaskFuture.isCancelled()) { + if (currentJob.isCanceled() || jobProcessingTaskFuture.isCancelled()) { return; } @@ -2003,7 +2003,7 @@ public final class AutoIngestManager extends Observable implements PropertyChang return; } - if (currentJob.isCancelled() || jobProcessingTaskFuture.isCancelled()) { + if (currentJob.isCanceled() || jobProcessingTaskFuture.isCancelled()) { return; } @@ -2013,7 +2013,7 @@ public final class AutoIngestManager extends Observable implements PropertyChang return; } - if (currentJob.isCancelled() || jobProcessingTaskFuture.isCancelled()) { + if (currentJob.isCanceled() || jobProcessingTaskFuture.isCancelled()) { return; } @@ -2027,7 +2027,7 @@ public final class AutoIngestManager extends Observable implements PropertyChang Thread.sleep(AutoIngestUserPreferences.getSecondsToSleepBetweenCases() * 1000); } - if (currentJob.isCancelled() || jobProcessingTaskFuture.isCancelled()) { + if (currentJob.isCanceled() || jobProcessingTaskFuture.isCancelled()) { return; } @@ -2051,22 +2051,22 @@ public final class AutoIngestManager extends Observable implements PropertyChang * if auto ingest is shutting down. */ private DataSource identifyDataSource(Case caseForJob) throws AutoIngestAlertFileException, AutoIngestJobLoggerException, InterruptedException { - Manifest manifest = currentJob.getManifest(); - Path manifestPath = manifest.getFilePath(); + ManifestNodeData nodeData = currentJob.getNodeData(); + Path manifestPath = nodeData.getManifestFilePath(); SYS_LOGGER.log(Level.INFO, "Identifying data source for {0} ", manifestPath); currentJob.setStage(AutoIngestJob.Stage.IDENTIFYING_DATA_SOURCE); Path caseDirectoryPath = currentJob.getCaseDirectoryPath(); - AutoIngestJobLogger jobLogger = new AutoIngestJobLogger(manifestPath, manifest.getDataSourceFileName(), caseDirectoryPath); - Path dataSourcePath = manifest.getDataSourcePath(); + AutoIngestJobLogger jobLogger = new AutoIngestJobLogger(manifestPath, nodeData.getDataSourceFileName(), caseDirectoryPath); + Path dataSourcePath = nodeData.getDataSourcePath(); File dataSource = dataSourcePath.toFile(); if (!dataSource.exists()) { SYS_LOGGER.log(Level.SEVERE, "Missing data source for {0}", manifestPath); - currentJob.setErrorsOccurred(true); + currentJob.getNodeData().setErrorsOccurred(true); AutoIngestAlertFile.create(caseDirectoryPath); // Do this first, it is more important than the case log jobLogger.logMissingDataSource(); return null; } - String deviceId = manifest.getDeviceId(); + String deviceId = nodeData.getDeviceId(); return new DataSource(deviceId, dataSourcePath); } @@ -2087,15 +2087,15 @@ public final class AutoIngestManager extends Observable implements PropertyChang * ingest is shutting down. */ private void runDataSourceProcessor(Case caseForJob, DataSource dataSource) throws InterruptedException, AutoIngestAlertFileException, AutoIngestJobLoggerException, AutoIngestDataSourceProcessor.AutoIngestDataSourceProcessorException { - Manifest manifest = currentJob.getManifest(); - Path manifestPath = manifest.getFilePath(); + ManifestNodeData nodeData = currentJob.getNodeData(); + Path manifestPath = nodeData.getManifestFilePath(); SYS_LOGGER.log(Level.INFO, "Adding data source for {0} ", manifestPath); currentJob.setStage(AutoIngestJob.Stage.ADDING_DATA_SOURCE); UUID taskId = UUID.randomUUID(); DataSourceProcessorCallback callBack = new AddDataSourceCallback(caseForJob, dataSource, taskId); DataSourceProcessorProgressMonitor progressMonitor = new DoNothingDSPProgressMonitor(); Path caseDirectoryPath = currentJob.getCaseDirectoryPath(); - AutoIngestJobLogger jobLogger = new AutoIngestJobLogger(manifestPath, manifest.getDataSourceFileName(), caseDirectoryPath); + AutoIngestJobLogger jobLogger = new AutoIngestJobLogger(manifestPath, nodeData.getDataSourceFileName(), caseDirectoryPath); try { caseForJob.notifyAddingDataSource(taskId); @@ -2120,7 +2120,7 @@ public final class AutoIngestManager extends Observable implements PropertyChang if (validDataSourceProcessorsMap.isEmpty()) { // This should never happen. We should add all unsupported data sources as logical files. AutoIngestAlertFile.create(caseDirectoryPath); - currentJob.setErrorsOccurred(true); + currentJob.getNodeData().setErrorsOccurred(true); jobLogger.logFailedToIdentifyDataSource(); SYS_LOGGER.log(Level.WARNING, "Unsupported data source {0} for {1}", new Object[]{dataSource.getPath(), manifestPath}); // NON-NLS return; @@ -2146,7 +2146,7 @@ public final class AutoIngestManager extends Observable implements PropertyChang // if a DSP fails even if a later one succeeds since we expected to be able to process // the data source which each DSP on the list. AutoIngestAlertFile.create(caseDirectoryPath); - currentJob.setErrorsOccurred(true); + currentJob.getNodeData().setErrorsOccurred(true); jobLogger.logDataSourceProcessorError(selectedProcessor.getDataSourceType()); SYS_LOGGER.log(Level.SEVERE, "Exception while processing {0} with data source processor {1}", new Object[]{dataSource.getPath(), selectedProcessor.getDataSourceType()}); } @@ -2180,17 +2180,17 @@ public final class AutoIngestManager extends Observable implements PropertyChang * ingest is shutting down. */ private void logDataSourceProcessorResult(DataSource dataSource) throws AutoIngestAlertFileException, AutoIngestJobLoggerException, InterruptedException { - Manifest manifest = currentJob.getManifest(); - Path manifestPath = manifest.getFilePath(); + ManifestNodeData nodeData = currentJob.getNodeData(); + Path manifestPath = nodeData.getManifestFilePath(); Path caseDirectoryPath = currentJob.getCaseDirectoryPath(); - AutoIngestJobLogger jobLogger = new AutoIngestJobLogger(manifestPath, manifest.getDataSourceFileName(), caseDirectoryPath); + AutoIngestJobLogger jobLogger = new AutoIngestJobLogger(manifestPath, nodeData.getDataSourceFileName(), caseDirectoryPath); DataSourceProcessorResult resultCode = dataSource.getResultDataSourceProcessorResultCode(); if (null != resultCode) { switch (resultCode) { case NO_ERRORS: jobLogger.logDataSourceAdded(); if (dataSource.getContent().isEmpty()) { - currentJob.setErrorsOccurred(true); + currentJob.getNodeData().setErrorsOccurred(true); AutoIngestAlertFile.create(caseDirectoryPath); // Do this first, it is more important than the case log jobLogger.logNoDataSourceContent(); } @@ -2202,7 +2202,7 @@ public final class AutoIngestManager extends Observable implements PropertyChang } jobLogger.logDataSourceAdded(); if (dataSource.getContent().isEmpty()) { - currentJob.setErrorsOccurred(true); + currentJob.getNodeData().setErrorsOccurred(true); AutoIngestAlertFile.create(caseDirectoryPath); // Do this first, it is more important than the case log jobLogger.logNoDataSourceContent(); } @@ -2212,7 +2212,7 @@ public final class AutoIngestManager extends Observable implements PropertyChang for (String errorMessage : dataSource.getDataSourceProcessorErrorMessages()) { SYS_LOGGER.log(Level.SEVERE, "Critical error running data source processor for {0}: {1}", new Object[]{manifestPath, errorMessage}); } - currentJob.setErrorsOccurred(true); + currentJob.getNodeData().setErrorsOccurred(true); AutoIngestAlertFile.create(caseDirectoryPath); // Do this first, it is more important than the case log jobLogger.logFailedToAddDataSource(); break; @@ -2226,7 +2226,7 @@ public final class AutoIngestManager extends Observable implements PropertyChang * cancelCurrentJob. */ SYS_LOGGER.log(Level.WARNING, "Cancellation while waiting for data source processor for {0}", manifestPath); - currentJob.setErrorsOccurred(true); + currentJob.getNodeData().setErrorsOccurred(true); AutoIngestAlertFile.create(caseDirectoryPath); // Do this first, it is more important than the case log jobLogger.logDataSourceProcessorCancelled(); } @@ -2252,12 +2252,12 @@ public final class AutoIngestManager extends Observable implements PropertyChang * ingest is shutting down. */ private void analyze(DataSource dataSource) throws AnalysisStartupException, AutoIngestAlertFileException, AutoIngestJobLoggerException, InterruptedException { - Manifest manifest = currentJob.getManifest(); - Path manifestPath = manifest.getFilePath(); + ManifestNodeData nodeData = currentJob.getNodeData(); + Path manifestPath = nodeData.getManifestFilePath(); SYS_LOGGER.log(Level.INFO, "Starting ingest modules analysis for {0} ", manifestPath); currentJob.setStage(AutoIngestJob.Stage.ANALYZING_DATA_SOURCE); Path caseDirectoryPath = currentJob.getCaseDirectoryPath(); - AutoIngestJobLogger jobLogger = new AutoIngestJobLogger(manifestPath, manifest.getDataSourceFileName(), caseDirectoryPath); + AutoIngestJobLogger jobLogger = new AutoIngestJobLogger(manifestPath, nodeData.getDataSourceFileName(), caseDirectoryPath); IngestJobEventListener ingestJobEventListener = new IngestJobEventListener(); IngestManager.getInstance().addIngestJobEventListener(ingestJobEventListener); try { @@ -2282,7 +2282,7 @@ public final class AutoIngestManager extends Observable implements PropertyChang List cancelledModules = snapshot.getCancelledDataSourceIngestModules(); if (!cancelledModules.isEmpty()) { SYS_LOGGER.log(Level.WARNING, String.format("Ingest module(s) cancelled for %s", manifestPath)); - currentJob.setErrorsOccurred(true); + currentJob.getNodeData().setErrorsOccurred(true); AutoIngestAlertFile.create(caseDirectoryPath); // Do this first, it is more important than the case log for (String module : snapshot.getCancelledDataSourceIngestModules()) { SYS_LOGGER.log(Level.WARNING, String.format("%s ingest module cancelled for %s", module, manifestPath)); @@ -2291,8 +2291,8 @@ public final class AutoIngestManager extends Observable implements PropertyChang } jobLogger.logAnalysisCompleted(); } else { - currentJob.setStage(AutoIngestJob.Stage.CANCELLING); - currentJob.setErrorsOccurred(true); + currentJob.setStage(AutoIngestJob.Stage.CANCELING); + currentJob.getNodeData().setErrorsOccurred(true); AutoIngestAlertFile.create(caseDirectoryPath); // Do this first, it is more important than the case log jobLogger.logAnalysisCancelled(); CancellationReason cancellationReason = snapshot.getCancellationReason(); @@ -2305,13 +2305,13 @@ public final class AutoIngestManager extends Observable implements PropertyChang for (IngestModuleError error : ingestJobStartResult.getModuleErrors()) { SYS_LOGGER.log(Level.SEVERE, String.format("%s ingest module startup error for %s", error.getModuleDisplayName(), manifestPath), error.getThrowable()); } - currentJob.setErrorsOccurred(true); + currentJob.getNodeData().setErrorsOccurred(true); AutoIngestAlertFile.create(caseDirectoryPath); // Do this first, it is more important than the case log jobLogger.logIngestModuleStartupErrors(); throw new AnalysisStartupException(String.format("Error(s) during ingest module startup for %s", manifestPath)); } else { SYS_LOGGER.log(Level.SEVERE, String.format("Ingest manager ingest job start error for %s", manifestPath), ingestJobStartResult.getStartupException()); - currentJob.setErrorsOccurred(true); + currentJob.getNodeData().setErrorsOccurred(true); AutoIngestAlertFile.create(caseDirectoryPath); // Do this first, it is more important than the case log jobLogger.logAnalysisStartupError(); throw new AnalysisStartupException("Ingest manager error starting job", ingestJobStartResult.getStartupException()); @@ -2320,7 +2320,7 @@ public final class AutoIngestManager extends Observable implements PropertyChang for (String warning : settingsWarnings) { SYS_LOGGER.log(Level.SEVERE, "Ingest job settings error for {0}: {1}", new Object[]{manifestPath, warning}); } - currentJob.setErrorsOccurred(true); + currentJob.getNodeData().setErrorsOccurred(true); AutoIngestAlertFile.create(caseDirectoryPath); // Do this first, it is more important than the case log jobLogger.logIngestJobSettingsErrors(); throw new AnalysisStartupException("Error(s) in ingest job settings"); @@ -2351,16 +2351,16 @@ public final class AutoIngestManager extends Observable implements PropertyChang * ingest is shutting down. */ private void exportFiles(DataSource dataSource) throws FileExportException, AutoIngestAlertFileException, AutoIngestJobLoggerException, InterruptedException { - Manifest manifest = currentJob.getManifest(); - Path manifestPath = manifest.getFilePath(); + ManifestNodeData nodeData = currentJob.getNodeData(); + Path manifestPath = nodeData.getManifestFilePath(); SYS_LOGGER.log(Level.INFO, "Exporting files for {0}", manifestPath); currentJob.setStage(AutoIngestJob.Stage.EXPORTING_FILES); Path caseDirectoryPath = currentJob.getCaseDirectoryPath(); - AutoIngestJobLogger jobLogger = new AutoIngestJobLogger(manifestPath, manifest.getDataSourceFileName(), caseDirectoryPath); + AutoIngestJobLogger jobLogger = new AutoIngestJobLogger(manifestPath, nodeData.getDataSourceFileName(), caseDirectoryPath); try { FileExporter fileExporter = new FileExporter(); if (fileExporter.isEnabled()) { - fileExporter.process(manifest.getDeviceId(), dataSource.getContent(), currentJob::isCancelled); + fileExporter.process(nodeData.getDeviceId(), dataSource.getContent(), currentJob::isCanceled); jobLogger.logFileExportCompleted(); } else { SYS_LOGGER.log(Level.WARNING, "Exporting files not enabled for {0}", manifestPath); @@ -2368,7 +2368,7 @@ public final class AutoIngestManager extends Observable implements PropertyChang } } catch (FileExportException ex) { SYS_LOGGER.log(Level.SEVERE, String.format("Error doing file export for %s", manifestPath), ex); - currentJob.setErrorsOccurred(true); + currentJob.getNodeData().setErrorsOccurred(true); AutoIngestAlertFile.create(caseDirectoryPath); // Do this first, it is more important than the case log jobLogger.logFileExportError(); } @@ -2615,8 +2615,8 @@ public final class AutoIngestManager extends Observable implements PropertyChang boolean isError = false; if (getErrorState().equals(ErrorState.NONE)) { if (currentJob != null) { - message = "Processing " + currentJob.getManifest().getDataSourceFileName() - + " for case " + currentJob.getManifest().getCaseName(); + message = "Processing " + currentJob.getNodeData().getDataSourceFileName() + + " for case " + currentJob.getNodeData().getCaseName(); } else { message = "Paused or waiting for next case"; } @@ -2647,7 +2647,7 @@ public final class AutoIngestManager extends Observable implements PropertyChang * processing the job status update. */ SYS_LOGGER.log(Level.WARNING, "Auto ingest node {0} timed out while processing folder {1}", - new Object[]{job.getNodeName(), job.getManifest().getFilePath().toString()}); + new Object[]{job.getNodeName(), job.getNodeData().getManifestFilePath().toString()}); hostNamesToRunningJobs.remove(job.getNodeName()); setChanged(); notifyObservers(Event.JOB_COMPLETED); diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMonitor.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMonitor.java new file mode 100755 index 0000000000..8be3358838 --- /dev/null +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMonitor.java @@ -0,0 +1,1017 @@ +/* + * Autopsy Forensic Browser + * + * Copyright 2017 Basis Technology Corp. + * Contact: carrier sleuthkit org + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.sleuthkit.autopsy.experimental.autoingest; + +import com.google.common.util.concurrent.ThreadFactoryBuilder; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.io.IOException; +import static java.nio.file.FileVisitOption.FOLLOW_LINKS; +import java.nio.file.FileVisitResult; +import static java.nio.file.FileVisitResult.CONTINUE; +import static java.nio.file.FileVisitResult.TERMINATE; +import java.nio.file.FileVisitor; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.attribute.BasicFileAttributes; +import java.sql.SQLException; +import java.time.Duration; +import java.time.Instant; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Date; +import java.util.EnumSet; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Observable; +import java.util.Set; +import java.util.concurrent.Callable; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.TimeUnit; +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.annotation.concurrent.GuardedBy; +import org.openide.util.Exceptions; +import org.openide.util.Lookup; +import org.sleuthkit.autopsy.coordinationservice.CoordinationService; +import org.sleuthkit.autopsy.coordinationservice.CoordinationService.CoordinationServiceException; +import org.sleuthkit.autopsy.core.UserPreferencesException; +import org.sleuthkit.autopsy.coreutils.NetworkUtils; +import org.sleuthkit.autopsy.events.AutopsyEvent; +import org.sleuthkit.autopsy.events.AutopsyEventException; +import org.sleuthkit.autopsy.events.AutopsyEventPublisher; +import org.sleuthkit.autopsy.experimental.autoingest.AutoIngestJob.Stage; +import static org.sleuthkit.autopsy.experimental.autoingest.ManifestNodeData.ProcessingStatus.COMPLETED; +import static org.sleuthkit.autopsy.experimental.autoingest.ManifestNodeData.ProcessingStatus.DELETED; +import static org.sleuthkit.autopsy.experimental.autoingest.ManifestNodeData.ProcessingStatus.PENDING; +import static org.sleuthkit.autopsy.experimental.autoingest.ManifestNodeData.ProcessingStatus.PROCESSING; +import org.sleuthkit.autopsy.experimental.configuration.AutoIngestUserPreferences; + +/** + * + * @author dgrove + */ +public final class AutoIngestMonitor extends Observable implements PropertyChangeListener { + + private static final int NUM_INPUT_SCAN_SCHEDULING_THREADS = 1; + private static final String INPUT_SCAN_SCHEDULER_THREAD_NAME = "AIM-input-scan-scheduler-%d"; + private static final String INPUT_SCAN_THREAD_NAME = "AIM-input-scan-%d"; + private static int DEFAULT_JOB_PRIORITY = 0; + private static final String AUTO_INGEST_THREAD_NAME = "AIM-job-processing-%d"; + private static final String LOCAL_HOST_NAME = NetworkUtils.getLocalHostName(); + private static final String EVENT_CHANNEL_NAME = "Auto-Ingest-Manager-Events"; + private static final Set EVENT_LIST = new HashSet<>(Arrays.asList(new String[]{ + Event.JOB_STATUS_UPDATED.toString(), + Event.JOB_COMPLETED.toString(), + Event.CASE_PRIORITIZED.toString(), + Event.JOB_STARTED.toString()})); + private static final long JOB_STATUS_EVENT_INTERVAL_SECONDS = 10; + private static final String JOB_STATUS_PUBLISHING_THREAD_NAME = "AIM-job-status-event-publisher-%d"; + private static final long MAX_MISSED_JOB_STATUS_UPDATES = 10; + private static final java.util.logging.Logger SYS_LOGGER = AutoIngestSystemLogger.getLogger(); + + private static AutoIngestMonitor instance; + private final AutopsyEventPublisher eventPublisher; + private final Object scanMonitor; + private final ScheduledThreadPoolExecutor inputScanSchedulingExecutor; + private final ExecutorService inputScanExecutor; + private final ExecutorService jobProcessingExecutor; + private final ScheduledThreadPoolExecutor jobStatusPublishingExecutor; + private final ConcurrentHashMap hostNamesToLastMsgTime; + private final ConcurrentHashMap hostNamesToRunningJobs; + private final Object jobsLock; + @GuardedBy("jobsLock") private final Map> casesToManifests; + @GuardedBy("jobsLock") private List pendingJobs; + @GuardedBy("jobsLock") private AutoIngestJob currentJob; + @GuardedBy("jobsLock") private List completedJobs; + private CoordinationService coordinationService; + private Path rootInputDirectory; + private Path rootOutputDirectory; + private volatile State state; + private volatile ErrorState errorState; + + /** + * Gets a singleton auto ingest monitor responsible for processing auto + * ingest jobs defined by manifest files that can be added to any level of a + * designated input directory tree. + * + * @return A singleton AutoIngestMonitor instance. + */ + synchronized static AutoIngestMonitor getInstance() { + if (instance == null) { + instance = new AutoIngestMonitor(); + } + return instance; + } + + /** + * Constructs an auto ingest monitor responsible for processing auto ingest + * jobs defined by manifest files that can be added to any level of a + * designated input directory tree. + */ + public AutoIngestMonitor() { + SYS_LOGGER.log(Level.INFO, "Initializing auto ingest"); + state = State.IDLE; + eventPublisher = new AutopsyEventPublisher(); + scanMonitor = new Object(); + inputScanSchedulingExecutor = new ScheduledThreadPoolExecutor(NUM_INPUT_SCAN_SCHEDULING_THREADS, new ThreadFactoryBuilder().setNameFormat(INPUT_SCAN_SCHEDULER_THREAD_NAME).build()); + inputScanExecutor = Executors.newSingleThreadExecutor(new ThreadFactoryBuilder().setNameFormat(INPUT_SCAN_THREAD_NAME).build()); + jobProcessingExecutor = Executors.newSingleThreadExecutor(new ThreadFactoryBuilder().setNameFormat(AUTO_INGEST_THREAD_NAME).build()); + jobStatusPublishingExecutor = new ScheduledThreadPoolExecutor(1, new ThreadFactoryBuilder().setNameFormat(JOB_STATUS_PUBLISHING_THREAD_NAME).build()); + hostNamesToRunningJobs = new ConcurrentHashMap<>(); + hostNamesToLastMsgTime = new ConcurrentHashMap<>(); + jobsLock = new Object(); + casesToManifests = new HashMap<>(); + pendingJobs = new ArrayList<>(); + completedJobs = new ArrayList<>(); + rootOutputDirectory = Paths.get(AutoIngestUserPreferences.getAutoModeResultsFolder()); + errorState = ErrorState.NONE; + } + + /** + * Starts up auto ingest. + * + * @throws AutoIngestMonitorStartupException if there is a problem starting + * auto ingest. + */ + void startUp() throws AutoIngestMonitor.AutoIngestMonitorStartupException { + SYS_LOGGER.log(Level.INFO, "Auto ingest starting"); + try { + coordinationService = CoordinationService.getInstance(); + } catch (CoordinationServiceException ex) { + throw new AutoIngestMonitorStartupException("Failed to get coordination service", ex); + } + try { + eventPublisher.openRemoteEventChannel(EVENT_CHANNEL_NAME); + SYS_LOGGER.log(Level.INFO, "Opened auto ingest event channel"); + } catch (AutopsyEventException ex) { + SYS_LOGGER.log(Level.SEVERE, "Failed to open auto ingest event channel", ex); + throw new AutoIngestMonitorStartupException("Failed to open auto ingest event channel", ex); + } + rootInputDirectory = Paths.get(AutoIngestUserPreferences.getAutoModeImageFolder()); + rootOutputDirectory = Paths.get(AutoIngestUserPreferences.getAutoModeResultsFolder()); + inputScanSchedulingExecutor.scheduleAtFixedRate(new InputDirScanSchedulingTask(), 0, AutoIngestUserPreferences.getMinutesOfInputScanInterval(), TimeUnit.MINUTES); + jobStatusPublishingExecutor.scheduleAtFixedRate(new PeriodicJobStatusEventTask(), JOB_STATUS_EVENT_INTERVAL_SECONDS, JOB_STATUS_EVENT_INTERVAL_SECONDS, TimeUnit.SECONDS); + eventPublisher.addSubscriber(EVENT_LIST, instance); + state = State.RUNNING; + errorState = ErrorState.NONE; + } + + /** + * Gets the error state of the autop ingest monitor. + * + * @return The error state, may be NONE. + */ + ErrorState getErrorState() { + return errorState; + } + + /** + * Handles auto ingest events published by other auto ingest nodes. + * + * @param event An auto ingest event from another node. + */ + @Override + public void propertyChange(PropertyChangeEvent event) { + if (event instanceof AutopsyEvent) { + if (((AutopsyEvent) event).getSourceType() == AutopsyEvent.SourceType.REMOTE) { + if (event instanceof AutoIngestJobStartedEvent) { + handleRemoteJobStartedEvent((AutoIngestJobStartedEvent) event); + } else if (event instanceof AutoIngestJobStatusEvent) { + handleRemoteJobStatusEvent((AutoIngestJobStatusEvent) event); + } else if (event instanceof AutoIngestJobCompletedEvent) { + handleRemoteJobCompletedEvent((AutoIngestJobCompletedEvent) event); + } else if (event instanceof AutoIngestCasePrioritizedEvent) { + handleRemoteCasePrioritizationEvent((AutoIngestCasePrioritizedEvent) event); + } else if (event instanceof AutoIngestCaseDeletedEvent) { + handleRemoteCaseDeletedEvent((AutoIngestCaseDeletedEvent) event); + } + } + } + } + + /** + * Processes a job started event from another node by removing the job from + * the pending queue, if it is present, and adding the job in the event to + * the collection of jobs running on other hosts. + *

+ * Note that the processing stage of the job will be whatever it was when + * the job was serialized for inclusion in the event message. + * + * @param event A job started from another auto ingest node. + */ + private void handleRemoteJobStartedEvent(AutoIngestJobStartedEvent event) { + String hostName = event.getJob().getNodeName(); + hostNamesToLastMsgTime.put(hostName, Instant.now()); + synchronized (jobsLock) { + Path manifestFilePath = event.getJob().getNodeData().getManifestFilePath(); + for (Iterator iterator = pendingJobs.iterator(); iterator.hasNext();) { + AutoIngestJob pendingJob = iterator.next(); + if (pendingJob.getNodeData().getManifestFilePath().equals(manifestFilePath)) { + iterator.remove(); + break; + } + } + } + hostNamesToRunningJobs.put(event.getJob().getNodeName(), event.getJob()); + setChanged(); + notifyObservers(Event.JOB_STARTED); + } + + /** + * Processes a job status event from another node by adding the job in the + * event to the collection of jobs running on other hosts. + *

+ * Note that the processing stage of the job will be whatever it was when + * the job was serialized for inclusion in the event message. + * + * @param event An job status event from another auto ingest node. + */ + private void handleRemoteJobStatusEvent(AutoIngestJobStatusEvent event) { + String hostName = event.getJob().getNodeName(); + hostNamesToLastMsgTime.put(hostName, Instant.now()); + hostNamesToRunningJobs.put(hostName, event.getJob()); + setChanged(); + notifyObservers(Event.JOB_STATUS_UPDATED); + } + + /** + * Processes a job completed event from another node by removing the job in + * the event from the collection of jobs running on other hosts and adding + * it to the list of completed jobs. + *

+ * Note that the processing stage of the job will be whatever it was when + * the job was serialized for inclusion in the event message. + * + * @param event An job completed event from another auto ingest node. + */ + private void handleRemoteJobCompletedEvent(AutoIngestJobCompletedEvent event) { + String hostName = event.getJob().getNodeName(); + hostNamesToLastMsgTime.put(hostName, Instant.now()); + hostNamesToRunningJobs.remove(hostName); + if (event.shouldRetry() == false) { + synchronized (jobsLock) { + completedJobs.add(event.getJob()); + } + } + //scanInputDirsNow(); + setChanged(); + notifyObservers(Event.JOB_COMPLETED); + } + + /** + * Processes a job/case prioritization event from another node by triggering + * an immediate input directory scan. + * + * @param event A prioritization event from another auto ingest node. + */ + private void handleRemoteCasePrioritizationEvent(AutoIngestCasePrioritizedEvent event) { + String hostName = event.getNodeName(); + hostNamesToLastMsgTime.put(hostName, Instant.now()); + scanInputDirsNow(); + setChanged(); + notifyObservers(Event.CASE_PRIORITIZED); + } + + /** + * Processes a case deletin event from another node by triggering an + * immediate input directory scan. + * + * @param event A case deleted event from another auto ingest node. + */ + private void handleRemoteCaseDeletedEvent(AutoIngestCaseDeletedEvent event) { + String hostName = event.getNodeName(); + hostNamesToLastMsgTime.put(hostName, Instant.now()); + scanInputDirsNow(); + setChanged(); + notifyObservers(Event.CASE_DELETED); + } + + /** + * Gets snapshots of the pending jobs queue, running jobs list, and + * completed jobs list. Any of these collection can be excluded by passing a + * null for the correspioding in/out list parameter. + * + * @param pendingJobs A list to be populated with pending jobs, can be + * null. + * @param runningJobs A list to be populated with running jobs, can be + * null. + * @param completedJobs A list to be populated with competed jobs, can be + * null. + */ + void getJobs(List pendingJobs, List runningJobs, List completedJobs) { + synchronized (jobsLock) { + if (null != pendingJobs) { + pendingJobs.clear(); + pendingJobs.addAll(this.pendingJobs); + } + if (null != runningJobs) { + runningJobs.clear(); + if (null != currentJob) { + runningJobs.add(currentJob); + } + for (AutoIngestJob job : hostNamesToRunningJobs.values()) { + runningJobs.add(job); + runningJobs.sort(new AutoIngestJob.AlphabeticalComparator()); + } + } + if (null != completedJobs) { + completedJobs.clear(); + completedJobs.addAll(this.completedJobs); + } + } + } + + /** + * An instance of this runnable is responsible for periodically sending auto + * ingest job status event to remote auto ingest nodes and timing out stale + * remote jobs. The auto ingest job status event is sent only if auto ingest + * monitor has a currently running auto ingest job. + */ + private final class PeriodicJobStatusEventTask implements Runnable { + + private final long MAX_SECONDS_WITHOUT_UPDATE = JOB_STATUS_EVENT_INTERVAL_SECONDS * MAX_MISSED_JOB_STATUS_UPDATES; + + private PeriodicJobStatusEventTask() { + SYS_LOGGER.log(Level.INFO, "Periodic status publishing task started"); + } + + @Override + public void run() { + + try { + synchronized (jobsLock) { + if (currentJob != null) { + setChanged(); + notifyObservers(AutoIngestMonitor.Event.JOB_STATUS_UPDATED); + eventPublisher.publishRemotely(new AutoIngestJobStatusEvent(currentJob)); + } + + if (AutoIngestUserPreferences.getStatusDatabaseLoggingEnabled()) { + String message; + boolean isError = false; + if (getErrorState().equals(AutoIngestMonitor.ErrorState.NONE)) { + if (currentJob != null) { + message = "Processing " + currentJob.getNodeData().getDataSourceFileName() + + " for case " + currentJob.getNodeData().getCaseName(); + } else { + message = "Paused or waiting for next case"; + } + } else { + message = getErrorState().toString(); + isError = true; + } + try { + StatusDatabaseLogger.logToStatusDatabase(message, isError); + } catch (SQLException | UserPreferencesException ex) { + SYS_LOGGER.log(Level.WARNING, "Failed to update status database", ex); + } + } + } + + // check whether any remote nodes have timed out + for (AutoIngestJob job : hostNamesToRunningJobs.values()) { + if (isStale(hostNamesToLastMsgTime.get(job.getNodeName()))) { + // remove the job from remote job running map. + /* + * NOTE: there is theoretically a check-then-act race + * condition but I don't it's worth introducing another + * lock because of it. If a job status update is + * received after we check the last message fileTime + * stamp (i.e. "check") but before we remove the remote + * job (i.e. "act") then the remote job will get added + * back into hostNamesToRunningJobs as a result of + * processing the job status update. + */ + SYS_LOGGER.log(Level.WARNING, "Auto ingest node {0} timed out while processing folder {1}", + new Object[]{job.getNodeName(), job.getNodeData().getManifestFilePath().toString()}); + hostNamesToRunningJobs.remove(job.getNodeName()); + setChanged(); + notifyObservers(AutoIngestMonitor.Event.JOB_COMPLETED); + } + } + + } catch (Exception ex) { + SYS_LOGGER.log(Level.SEVERE, "Unexpected exception in PeriodicJobStatusEventTask", ex); //NON-NLS + } + } + + /** + * Determines whether or not the fileTime since the last message from + * node is greater than the maximum acceptable interval between + * messages. + * + * @return True or false. + */ + boolean isStale(Instant lastUpdateTime) { + return (Duration.between(lastUpdateTime, Instant.now()).toMillis() / 1000 > MAX_SECONDS_WITHOUT_UPDATE); + } + } + + /** + * Triggers an immediate scan of the input directories. + */ + void scanInputDirsNow() { + if (State.RUNNING != state) { + return; + } + inputScanExecutor.submit(new InputDirScanTask()); + } + + /** + * Start a scan of the input directories and wait for scan to complete. + */ + void scanInputDirsAndWait() { + if (State.RUNNING != state) { + return; + } + SYS_LOGGER.log(Level.INFO, "Starting input scan of {0}", rootInputDirectory); + InputDirScanner scanner = new InputDirScanner(); + scanner.scan(); + SYS_LOGGER.log(Level.INFO, "Completed input scan of {0}", rootInputDirectory); + } + + /** + * Bumps the priority of all pending ingest jobs for a specified case. + * + * @param caseName The name of the case to be prioritized. + */ + void prioritizeCase(final String caseName) { + + if (state != State.RUNNING) { + return; + } + + List prioritizedJobs = new ArrayList<>(); + int maxPriority = 0; + synchronized (jobsLock) { + for (AutoIngestJob job : pendingJobs) { + if (job.getNodeData().getPriority() > maxPriority) { + maxPriority = job.getNodeData().getPriority(); + } + if (job.getNodeData().getCaseName().equals(caseName)) { + prioritizedJobs.add(job); + } + } + if (!prioritizedJobs.isEmpty()) { + ++maxPriority; + for (AutoIngestJob job : prioritizedJobs) { + String manifestNodePath = job.getNodeData().getManifestFilePath().toString(); + try { + ManifestNodeData nodeData = new ManifestNodeData(coordinationService.getNodeData(CoordinationService.CategoryNode.MANIFESTS, manifestNodePath)); + nodeData.setPriority(maxPriority); + coordinationService.setNodeData(CoordinationService.CategoryNode.MANIFESTS, manifestNodePath, nodeData.toArray()); + } catch (ManifestNodeDataException ex) { + SYS_LOGGER.log(Level.WARNING, String.format("Unable to use node data for %s", manifestNodePath), ex); + } catch (CoordinationServiceException ex) { + SYS_LOGGER.log(Level.SEVERE, String.format("Coordination service error while prioritizing %s", manifestNodePath), ex); + } catch (InterruptedException ex) { + SYS_LOGGER.log(Level.SEVERE, "Unexpected interrupt while updating coordination service node data for {0}", manifestNodePath); + } + job.getNodeData().setPriority(maxPriority); + } + } + + Collections.sort(pendingJobs, new AutoIngestJob.PriorityComparator()); + } + + if (!prioritizedJobs.isEmpty()) { + new Thread(() -> { + eventPublisher.publishRemotely(new AutoIngestCasePrioritizedEvent(LOCAL_HOST_NAME, caseName)); + }).start(); + } + } + + /** + * Bumps the priority of an auto ingest job. + * + * @param manifestPath The manifest file path for the job to be prioritized. + */ + void prioritizeJob(Path manifestPath) { + if (state != State.RUNNING) { + return; + } + + int maxPriority = 0; + AutoIngestJob prioritizedJob = null; + synchronized (jobsLock) { + for (AutoIngestJob job : pendingJobs) { + if (job.getNodeData().getPriority() > maxPriority) { + maxPriority = job.getNodeData().getPriority(); + } + if (job.getNodeData().getManifestFilePath().equals(manifestPath)) { + prioritizedJob = job; + } + } + if (null != prioritizedJob) { + ++maxPriority; + String manifestNodePath = prioritizedJob.getNodeData().getManifestFilePath().toString(); + try { + ManifestNodeData nodeData = new ManifestNodeData(coordinationService.getNodeData(CoordinationService.CategoryNode.MANIFESTS, manifestNodePath)); + nodeData.setPriority(maxPriority); + coordinationService.setNodeData(CoordinationService.CategoryNode.MANIFESTS, manifestNodePath, nodeData.toArray()); + } catch (ManifestNodeDataException ex) { + SYS_LOGGER.log(Level.WARNING, String.format("Unable to use node data for %s", manifestPath), ex); + } catch (CoordinationServiceException ex) { + SYS_LOGGER.log(Level.SEVERE, String.format("Coordination service error while prioritizing %s", manifestNodePath), ex); + } catch (InterruptedException ex) { + SYS_LOGGER.log(Level.SEVERE, "Unexpected interrupt while updating coordination service node data for {0}", manifestNodePath); + } + prioritizedJob.getNodeData().setPriority(maxPriority); + } + + Collections.sort(pendingJobs, new AutoIngestJob.PriorityComparator()); + } + + if (null != prioritizedJob) { + final String caseName = prioritizedJob.getNodeData().getCaseName(); + new Thread(() -> { + eventPublisher.publishRemotely(new AutoIngestCasePrioritizedEvent(LOCAL_HOST_NAME, caseName)); + }).start(); + } + } + + /** + * Get the current snapshot of the job lists. + * + * @return Snapshot of jobs lists + */ + JobsSnapshot getCurrentJobsSnapshot() { + synchronized (jobsLock) { + List runningJobs = new ArrayList<>(); + getJobs(null, runningJobs, null); + return new JobsSnapshot(pendingJobs, runningJobs, completedJobs); + } + } + + /** + * A task that submits an input directory scan task to the input directory + * scan task executor. + */ + private final class InputDirScanSchedulingTask implements Runnable { + + /** + * Constructs a task that submits an input directory scan task to the + * input directory scan task executor. + */ + private InputDirScanSchedulingTask() { + SYS_LOGGER.log(Level.INFO, "Periodic input scan scheduling task started"); + } + + /** + * Submits an input directory scan task to the input directory scan task + * executor. + */ + @Override + public void run() { + scanInputDirsNow(); + } + } + + /** + * A task that scans the input directory tree and refreshes the pending jobs + * queue and the completed jobs list. Crashed job recovery is perfomed as + * needed. + */ + private final class InputDirScanTask implements Callable { + + /** + * Scans the input directory tree and refreshes the pending jobs queue + * and the completed jobs list. Crashed job recovery is performed as + * needed. + */ + @Override + public Void call() throws Exception { + if (Thread.currentThread().isInterrupted()) { + return null; + } + SYS_LOGGER.log(Level.INFO, "Starting input scan of {0}", rootInputDirectory); + InputDirScanner scanner = new InputDirScanner(); + scanner.scan(); + SYS_LOGGER.log(Level.INFO, "Completed input scan of {0}", rootInputDirectory); + setChanged(); + notifyObservers(Event.INPUT_SCAN_COMPLETED); + return null; + } + + } + + /** + * A FileVisitor that searches the input directories for manifest files. The + * search results are used to refresh the pending jobs queue and the + * completed jobs list. Crashed job recovery is performed as needed. + */ + private final class InputDirScanner { // DLG: Replace with task that calls regularly / reusable by refresh + + private final List newPendingJobsList = new ArrayList<>(); + private final List newCompletedJobsList = new ArrayList<>(); + + /** + * Searches the input directories for manifest files. The search results + * are used to refresh the pending jobs queue and the completed jobs + * list. + */ + private void scan() { + synchronized (jobsLock) { + if (Thread.currentThread().isInterrupted()) { + return; + } + try { + newPendingJobsList.clear(); + newCompletedJobsList.clear(); + + List manifestList = coordinationService.getNodeList( + CoordinationService.CategoryNode.MANIFESTS); + + for(int i=0; i < manifestList.size(); i++) { + visitFile(Paths.get(manifestList.get(i))); // DLG: Just call CoordinationService + } + + Collections.sort(newPendingJobsList, new AutoIngestJob.PriorityComparator()); + AutoIngestMonitor.this.pendingJobs = newPendingJobsList; + AutoIngestMonitor.this.completedJobs = newCompletedJobsList; + + } catch (Exception ex) { + /* + * NOTE: Need to catch all exceptions here. Otherwise + * uncaught exceptions will propagate up to the calling + * thread and may stop it from running. + */ + SYS_LOGGER.log(Level.SEVERE, String.format("Error scanning the input directory %s", rootInputDirectory), ex); + } + } + synchronized (scanMonitor) { + scanMonitor.notify(); + } + } + + private FileVisitResult visitFile(Path filePath) throws IOException { + if (Thread.currentThread().isInterrupted()) { + return TERMINATE; + } + + Manifest manifest = parseManifestFile(filePath); // DLG: No longer use this + + if (Thread.currentThread().isInterrupted()) { + return TERMINATE; + } + + if(manifest != null) { + String caseName = manifest.getCaseName(); + Path manifestPath = manifest.getFilePath(); + + if (casesToManifests.containsKey(caseName)) { + Set manifestPathSet = casesToManifests.get(caseName); + manifestPathSet.add(manifestPath); + } else { + Set manifestPathSet = new HashSet<>(); + manifestPathSet.add(manifestPath); + casesToManifests.put(caseName, manifestPathSet); + } + + /* + * Add a job to the pending jobs queue, the completed jobs list, + * or do crashed job recovery, as required. + */ + try { + addJob(manifest); + } catch (CoordinationService.CoordinationServiceException ex) { + SYS_LOGGER.log(Level.SEVERE, String.format("Error getting node data for %s", manifestPath), ex); + return CONTINUE; + } catch (InterruptedException ex) { + Thread.currentThread().interrupt(); + return TERMINATE; + } + } + + if (!Thread.currentThread().isInterrupted()) { + return CONTINUE; + } + + return TERMINATE; + } + + private Manifest parseManifestFile(Path filePath) throws IOException { + Manifest manifest = null; + + for (ManifestFileParser parser : Lookup.getDefault().lookupAll(ManifestFileParser.class)) { + if (parser.fileIsManifest(filePath)) { + try { + manifest = parser.parse(filePath); + break; + } catch (ManifestFileParser.ManifestFileParserException ex) { + SYS_LOGGER.log(Level.SEVERE, String.format("Error attempting to parse %s with parser %s", filePath, parser.getClass().getCanonicalName()), ex); + } + } + } + + return manifest; + } + + /** + * Add a job to the pending jobs queue, the completed jobs list, + * or do crashed job recovery, as required. + */ + private void addJob(Manifest manifest) throws CoordinationService.CoordinationServiceException, InterruptedException { + Path manifestPath = manifest.getFilePath(); + + byte[] rawData = coordinationService.getNodeData(CoordinationService.CategoryNode.MANIFESTS, manifestPath.toString()); + if (null != rawData) { + try { + ManifestNodeData nodeData = new ManifestNodeData(rawData); + if (nodeData.coordSvcNodeDataWasSet()) { + ManifestNodeData.ProcessingStatus processingStatus = nodeData.getStatus(); + switch (processingStatus) { + case PENDING: + addPendingJob(nodeData); + break; + case PROCESSING: + doRecoveryIfCrashed(nodeData); + break; + case COMPLETED: + addCompletedJob(nodeData); + break; + case DELETED: + // Do nothing - we dont'want to add it to any job list or do recovery + break; + default: + SYS_LOGGER.log(Level.SEVERE, "Unknown ManifestNodeData.ProcessingStatus"); + break; + } + } else { + addNewPendingJob(manifest); + } + } catch(ManifestNodeDataException ex) { + SYS_LOGGER.log(Level.WARNING, String.format("Unable to use node data for %s", manifestPath), ex); + } + } else { + addNewPendingJob(manifest); + } + } + + /** + * Adds a job to process a manifest to the pending jobs queue. + * + * @param nodeData The data stored in the coordination service node for + * the manifest. + */ + private void addPendingJob(ManifestNodeData nodeData) { + Path caseDirectory = PathUtils.findCaseDirectory(rootOutputDirectory, nodeData.getCaseName()); + nodeData.setCompletedDate(new Date(0)); + nodeData.setErrorsOccurred(false); + newPendingJobsList.add(new AutoIngestJob(nodeData, caseDirectory, LOCAL_HOST_NAME, AutoIngestJob.Stage.PENDING)); + } + + /** + * Adds a job to process a manifest to the pending jobs queue. + * + * @param manifest The manifest. + * + * @throws InterruptedException if the thread running the input + * directory scan task is interrupted while + * blocked, i.e., if auto ingest is + * shutting down. + */ + private void addNewPendingJob(Manifest manifest) throws InterruptedException { + // TODO (JIRA-1960): This is something of a hack, grabbing the lock to create the node. + // Is use of Curator.create().forPath() possible instead? + try (CoordinationService.Lock manifestLock = coordinationService.tryGetExclusiveLock(CoordinationService.CategoryNode.MANIFESTS, manifest.getFilePath().toString())) { + if (null != manifestLock) { + ManifestNodeData newNodeData = new ManifestNodeData(manifest, PENDING, DEFAULT_JOB_PRIORITY, 0, new Date(0), false); + coordinationService.setNodeData(CoordinationService.CategoryNode.MANIFESTS, manifest.getFilePath().toString(), newNodeData.toArray()); + newPendingJobsList.add(new AutoIngestJob(newNodeData, null, LOCAL_HOST_NAME, AutoIngestJob.Stage.PENDING)); + } + } catch (CoordinationService.CoordinationServiceException ex) { + SYS_LOGGER.log(Level.SEVERE, String.format("Error attempting to set node data for %s", manifest.getFilePath()), ex); + } + } + + /** + * Does crash recovery for a manifest, if required. The criterion for + * crash recovery is a manifest with coordination service node data + * indicating it is being processed for which an exclusive lock on the + * node can be acquired. If this condition is true, it is probable that + * the node that was processing the job crashed and the processing + * status was not updated. + * + * @param nodeData + * + * @throws InterruptedException if the thread running the input + * directory scan task is interrupted while + * blocked, i.e., if auto ingest is + * shutting down. + */ + private void doRecoveryIfCrashed(ManifestNodeData nodeData) throws InterruptedException { + String manifestPath = nodeData.getManifestFilePath().toString(); + if (nodeData.coordSvcNodeDataWasSet() && ManifestNodeData.ProcessingStatus.PROCESSING == nodeData.getStatus()) { + SYS_LOGGER.log(Level.SEVERE, "Attempting crash recovery for {0}", manifestPath); + int numberOfCrashes = nodeData.getNumberOfCrashes(); + ++numberOfCrashes; + nodeData.setNumberOfCrashes(numberOfCrashes); + nodeData.setCompletedDate(new Date(0)); + nodeData.setErrorsOccurred(true); + if (numberOfCrashes <= AutoIngestUserPreferences.getMaxNumTimesToProcessImage()) { + nodeData.setStatus(PENDING); + Path caseDirectoryPath = PathUtils.findCaseDirectory(rootOutputDirectory, nodeData.getCaseName()); + newPendingJobsList.add(new AutoIngestJob(nodeData, caseDirectoryPath, LOCAL_HOST_NAME, AutoIngestJob.Stage.PENDING)); + if (null != caseDirectoryPath) { + try { + AutoIngestAlertFile.create(caseDirectoryPath); + } catch (AutoIngestAlertFile.AutoIngestAlertFileException ex) { + SYS_LOGGER.log(Level.SEVERE, String.format("Error creating alert file for crashed job for %s", manifestPath), ex); + } + try { + new AutoIngestJobLogger(nodeData.getManifestFilePath(), nodeData.getDataSourceFileName(), caseDirectoryPath).logCrashRecoveryWithRetry(); + } catch (AutoIngestJobLogger.AutoIngestJobLoggerException ex) { + SYS_LOGGER.log(Level.SEVERE, String.format("Error creating case auto ingest log entry for crashed job for %s", manifestPath), ex); + } + } + } else { + nodeData.setStatus(COMPLETED); + Path caseDirectoryPath = PathUtils.findCaseDirectory(rootOutputDirectory, nodeData.getCaseName()); + newCompletedJobsList.add(new AutoIngestJob(nodeData, caseDirectoryPath, LOCAL_HOST_NAME, AutoIngestJob.Stage.COMPLETED)); + if (null != caseDirectoryPath) { + try { + AutoIngestAlertFile.create(caseDirectoryPath); + } catch (AutoIngestAlertFile.AutoIngestAlertFileException ex) { + SYS_LOGGER.log(Level.SEVERE, String.format("Error creating alert file for crashed job for %s", manifestPath), ex); + } + try { + new AutoIngestJobLogger(nodeData.getManifestFilePath(), nodeData.getDataSourceFileName(), caseDirectoryPath).logCrashRecoveryNoRetry(); + } catch (AutoIngestJobLogger.AutoIngestJobLoggerException ex) { + SYS_LOGGER.log(Level.SEVERE, String.format("Error creating case auto ingest log entry for crashed job for %s", manifestPath), ex); + } + } + } + try { + coordinationService.setNodeData(CoordinationService.CategoryNode.MANIFESTS, manifestPath, nodeData.toArray()); + } catch (CoordinationService.CoordinationServiceException ex) { + SYS_LOGGER.log(Level.SEVERE, String.format("Error attempting to set node data for %s", manifestPath), ex); + } + } + } + + /** + * Adds a job to process a manifest to the completed jobs list. + * + * @param nodeData The data stored in the coordination service node for + * the manifest. + */ + private void addCompletedJob(ManifestNodeData nodeData) { + Path caseDirectoryPath = PathUtils.findCaseDirectory(rootOutputDirectory, nodeData.getCaseName()); + if (null != caseDirectoryPath) { + newCompletedJobsList.add(new AutoIngestJob(nodeData, caseDirectoryPath, LOCAL_HOST_NAME, AutoIngestJob.Stage.COMPLETED)); + } else { + SYS_LOGGER.log(Level.WARNING, String.format("Job completed for %s, but cannot find case directory, ignoring job", nodeData.getManifestFilePath())); + } + } + } + + /* + * The possible states of an auto ingest monitor. + */ + private enum State { + IDLE, + RUNNING, + SHUTTING_DOWN; + } + + /* + * Events published by an auto ingest monitor. The events are published + * locally to auto ingest monitor clients that register as observers and are + * broadcast to other auto ingest nodes. + */ + enum Event { + + INPUT_SCAN_COMPLETED, + JOB_STARTED, + JOB_STATUS_UPDATED, + JOB_COMPLETED, + CASE_PRIORITIZED, + CASE_DELETED, + PAUSED_BY_REQUEST, + PAUSED_FOR_SYSTEM_ERROR, + RESUMED + } + + /** + * The current auto ingest error state. + */ + private enum ErrorState { + NONE("None"), + COORDINATION_SERVICE_ERROR("Coordination service error"), + SHARED_CONFIGURATION_DOWNLOAD_ERROR("Shared configuration download error"), + SERVICES_MONITOR_COMMUNICATION_ERROR("Services monitor communication error"), + DATABASE_SERVER_ERROR("Database server error"), + KEYWORD_SEARCH_SERVER_ERROR("Keyword search server error"), + CASE_MANAGEMENT_ERROR("Case management error"), + ANALYSIS_STARTUP_ERROR("Analysis startup error"), + FILE_EXPORT_ERROR("File export error"), + ALERT_FILE_ERROR("Alert file error"), + JOB_LOGGER_ERROR("Job logger error"), + DATA_SOURCE_PROCESSOR_ERROR("Data source processor error"), + UNEXPECTED_EXCEPTION("Unknown error"); + + private final String desc; + + private ErrorState(String desc) { + this.desc = desc; + } + + @Override + public String toString() { + return desc; + } + } + + /** + * A snapshot of the pending jobs queue, running jobs list, and completed + * jobs list. + */ + static final class JobsSnapshot { + + private final List pendingJobs; + private final List runningJobs; + private final List completedJobs; + + /** + * Constructs a snapshot of the pending jobs queue, running jobs list, + * and completed jobs list. + * + * @param pendingJobs The pending jobs queue. + * @param runningJobs The running jobs list. + * @param completedJobs The cmopleted jobs list. + */ + private JobsSnapshot(List pendingJobs, List runningJobs, List completedJobs) { + this.pendingJobs = new ArrayList<>(pendingJobs); + this.runningJobs = new ArrayList<>(runningJobs); + this.completedJobs = new ArrayList<>(completedJobs); + } + + /** + * Gets the snapshot of the pending jobs queue. + * + * @return The jobs collection. + */ + List getPendingJobs() { + return Collections.unmodifiableList(this.pendingJobs); + } + + /** + * Gets the snapshot of the running jobs list. + * + * @return The jobs collection. + */ + List getRunningJobs() { + return Collections.unmodifiableList(this.runningJobs); + } + + /** + * Gets the snapshot of the completed jobs list. + * + * @return The jobs collection. + */ + List getCompletedJobs() { + return Collections.unmodifiableList(this.completedJobs); + } + + } + + static final class AutoIngestMonitorStartupException extends Exception { + + private static final long serialVersionUID = 1L; + + private AutoIngestMonitorStartupException(String message) { + super(message); + } + + private AutoIngestMonitorStartupException(String message, Throwable cause) { + super(message, cause); + } + + } +} diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutopsyManifestFileParser.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutopsyManifestFileParser.java index f25182b018..4a5a3c86c5 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutopsyManifestFileParser.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutopsyManifestFileParser.java @@ -18,8 +18,11 @@ */ package org.sleuthkit.autopsy.experimental.autoingest; +import java.io.File; import java.io.IOException; import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Arrays; import java.util.HashMap; import javax.annotation.concurrent.Immutable; import javax.xml.parsers.DocumentBuilder; @@ -38,21 +41,36 @@ import org.xml.sax.SAXException; @ServiceProvider(service = ManifestFileParser.class) public final class AutopsyManifestFileParser implements ManifestFileParser { - private static final String MANIFEST_FILE_NAME_SIGNATURE = "_Manifest.xml"; - private static final String ROOT_ELEM_TAG_NAME = "AutopsyManifest"; - private static final String CASE_NAME_XPATH = "/AutopsyManifest/CaseName/text()"; - private static final String DEVICE_ID_XPATH = "/AutopsyManifest/DeviceId/text()"; - private static final String DATA_SOURCE_NAME_XPATH = "/AutopsyManifest/DataSource/text()"; + private static final String MANIFEST_FILE_NAME_SIGNATURE = "_MANIFEST.XML"; + private static final String NMEC_MANIFEST_ELEM_TAG_NAME = "NMEC_Manifest"; + private static final String MANIFEST_ELEM_TAG_NAME = "Manifest"; + private static final String CASE_NAME_XPATH = "/Collection/Name/text()"; + private static final String DEVICE_ID_XPATH = "/Collection/Image/ID/text()"; + private static final String IMAGE_NAME_XPATH = "/Collection/Image/Name/text()"; + private static final String IMAGE_FULL_NAME_XPATH = "/Collection/Image/FullName/text()"; + private static final String IMAGE_RELATIVE_PATH_XPATH = "/Collection/Image/RelativePath/text()"; + private String actualRootElementTag = ""; + + + /** + * Determine whether the given file is a supported manifest file. + * + * @param filePath + * + * @return true if this is a supported manifest file, otherwise false + */ @Override public boolean fileIsManifest(Path filePath) { boolean fileIsManifest = false; try { Path fileName = filePath.getFileName(); - if (fileName.toString().endsWith(MANIFEST_FILE_NAME_SIGNATURE)) { + if (fileName.toString().toUpperCase().endsWith(MANIFEST_FILE_NAME_SIGNATURE)) { Document doc = this.createManifestDOM(filePath); Element docElement = doc.getDocumentElement(); - fileIsManifest = docElement.getTagName().equals(ROOT_ELEM_TAG_NAME); + actualRootElementTag = docElement.getTagName(); + fileIsManifest = actualRootElementTag.equals(MANIFEST_ELEM_TAG_NAME) || + actualRootElementTag.equals(NMEC_MANIFEST_ELEM_TAG_NAME); } } catch (Exception unused) { fileIsManifest = false; @@ -60,28 +78,95 @@ public final class AutopsyManifestFileParser implements ManifestFileParser { return fileIsManifest; } + /** + * Parse the given manifest file and create a Manifest object. + * + * @param filePath Fully qualified path to manifest file + * + * @return A Manifest object representing the parsed manifest file. + * + * @throws ManifestFileParserException + */ @Override public Manifest parse(Path filePath) throws ManifestFileParserException { try { Document doc = this.createManifestDOM(filePath); - XPath xpath = XPathFactory.newInstance().newXPath(); - XPathExpression expr = xpath.compile(CASE_NAME_XPATH); + XPath xpath = XPathFactory.newInstance().newXPath(); + XPathExpression expr = xpath.compile(constructXPathExpression(CASE_NAME_XPATH)); String caseName = (String) expr.evaluate(doc, XPathConstants.STRING); - expr = xpath.compile(DEVICE_ID_XPATH); + expr = xpath.compile(constructXPathExpression(DEVICE_ID_XPATH)); String deviceId = (String) expr.evaluate(doc, XPathConstants.STRING); - expr = xpath.compile(DATA_SOURCE_NAME_XPATH); - String dataSourceName = (String) expr.evaluate(doc, XPathConstants.STRING); - Path dataSourcePath = filePath.getParent().resolve(dataSourceName); + Path dataSourcePath = determineDataSourcePath(filePath, doc); return new Manifest(filePath, caseName, deviceId, dataSourcePath, new HashMap<>()); } catch (Exception ex) { throw new ManifestFileParserException(String.format("Error parsing manifest %s", filePath), ex); } } + /** + * Create a new DOM document object for the given manifest file. + * + * @param manifestFilePath Fully qualified path to manifest file. + * + * @return DOM document object + * + * @throws ParserConfigurationException + * @throws SAXException + * @throws IOException + */ private Document createManifestDOM(Path manifestFilePath) throws ParserConfigurationException, SAXException, IOException { DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder(); return docBuilder.parse(manifestFilePath.toFile()); } + /** + * Creates an XPath expression string relative to the actual root + * element of the manifest for the given path. + * + * @param path + * @return XPath expression string. + */ + private String constructXPathExpression(String path) { + return "/" + actualRootElementTag + path; + } + + /** + * Attempt to find a valid (existing) data source for the manifest file. + * + * @param manifestFilePath Fully qualified path to manifest file. + * @param doc DOM document object for the manifest file. + * @return Path to an existing data source. + * @throws ManifestFileParserException if an error occurred while parsing manifest file. + */ + private Path determineDataSourcePath(Path manifestFilePath, Document doc) throws ManifestFileParserException { + String dataSourcePath = ""; + try { + for (String element : Arrays.asList(IMAGE_NAME_XPATH, IMAGE_FULL_NAME_XPATH, IMAGE_RELATIVE_PATH_XPATH)) { + XPath xpath = XPathFactory.newInstance().newXPath(); + XPathExpression expr = xpath.compile(constructXPathExpression(element)); + String fileName = (String) expr.evaluate(doc, XPathConstants.STRING); + if (fileName.contains("\\")) { + fileName = fileName.substring(fileName.lastIndexOf("\\") + 1); + } + try { + dataSourcePath = manifestFilePath.getParent().resolve(fileName).toString(); + } catch (Exception ignore) { + // NOTE: exceptions can be thrown by resolve() method based on contents of the manifest file. + // For example if file name is "test .txt" and in one of the path fields they only enter "test " + // i.e. the file name without extension. + // We should continue on to the next XML path field + continue; + } + if (new File(dataSourcePath).exists()) { + // found the data source + return Paths.get(dataSourcePath); + } + // keep trying other XML fields + } + return Paths.get(dataSourcePath); + } catch (Exception ex) { + throw new ManifestFileParserException(String.format("Error parsing manifest %s", manifestFilePath), ex); + } + } } diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties index afe8a6354f..d9df6782ff 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties @@ -3,9 +3,6 @@ AutoIngestDashboard.bnRefresh.text=&Refresh AutoIngestDashboard.lbCompleted.text=Completed Jobs AutoIngestDashboard.lbRunning.text=Running Jobs AutoIngestDashboard.lbPending.text=Pending Jobs -AutoIngestDashboard.bnCancelModule.text=Cancel &Module -AutoIngestDashboard.bnExit.text=&Exit -AutoIngestDashboard.bnOptions.text=&Options AutoIngestDashboard.JobsTableModel.ColumnHeader.Case=Case AutoIngestDashboard.JobsTableModel.ColumnHeader.ImageFolder=Data Source AutoIngestDashboard.JobsTableModel.ColumnHeader.HostName=Host Name @@ -15,7 +12,6 @@ AutoIngestDashboard.JobsTableModel.ColumnHeader.CompletedTime=Job Completed AutoIngestDashboard.JobsTableModel.ColumnHeader.Stage=Stage AutoIngestDashboard.JobsTableModel.ColumnHeader.Status=Status AutoIngestDashboard.JobsTableModel.ColumnHeader.ManifestFilePath= Manifest File Path -AutoIngestDashboard.bnShowProgress.text=Ingest Progress AutoIngestDashboard.bnResume.text=Resume AutoIngestDashboard.bnPause.text=Pause AutoIngestDashboard.bnPause.confirmHeader=Are you sure you want to pause? @@ -24,11 +20,7 @@ AutoIngestDashboard.bnPause.toolTipText=Suspend processing of Pending Jobs AutoIngestDashboard.bnPause.toolTipTextResume=Resume processing of Pending Jobs AutoIngestDashboard.bnPause.pausing=Pausing after current job completes... AutoIngestDashboard.bnRefresh.toolTipText=Refresh displayed tables -AutoIngestDashboard.bnShowProgress.toolTipText=Show the progress of the currently running Job. This functionality is only available for jobs running on current AIM node. -AutoIngestDashboard.bnCancelModule.toolTipText=Cancel processing of the current module within the Job and move on to the next module within the Job. This functionality is only available for jobs running on current AIM node. -AutoIngestDashboard.bnExit.toolTipText=Exit Application AutoIngestDashboard.Cancelling=Cancelling... -AutoIngestDashboard.bnOptions.toolTipText=Display options panel. All processing must be paused to open the options panel. AutoIngestDashboard.pendingTable.toolTipText=The Pending table displays the order upcoming Jobs will be processed with the top of the list first AutoIngestDashboard.runningTable.toolTipText=The Running table displays the currently running Job and information about it AutoIngestDashboard.completedTable.toolTipText=The Completed table shows all Jobs that have been processed already @@ -163,20 +155,12 @@ CopyFilesPanel.ConfirmCopyAdd=exists. Do you really want to copy more files to t CopyFilesPanel.ConfirmCopyYes=Copy CopyFilesPanel.ConfirmCopyNo=Do not copy ConfirmationDialog.ConfirmUnlockHeader=Confirm Case Unlock -AutoIngestDashboard.bnPrioritizeCase.toolTipText=Move all images associated with a case to top of Pending queue. -AutoIngestDashboard.bnPrioritizeCase.text=Prioriti&ze Case -AutoIngestDashboard.bnShowCaseLog.toolTipText=Display case log file for selected case -AutoIngestDashboard.bnShowCaseLog.text=Show Case &Log CopyFilesPanel.bnCancelPendingJob.text=Ca&ncel CopyFilesPanel.tbDestinationCase.text= CopyFilesPanel.cbThrottleNetwork.text=&Throttle Network CopyFilesPanel.cbThrottleNetwork.toolTipText=Select this box if a low-bandwidth network connection is involved in this copy job.
\nSelecting this box will artificially limit the transfer speed by inserting strategic delays.
\nThis helps copy files across low-bandwidth networks where the transfer would
\notherwise fail. Only select this if you are having problems copying across the network. CopyFilesPanel.bnShowCurrentLog.text=Show &Log CopyFilesPanel.bnShowCurrentLog.text=Show &Log -AutoIngestDashboard.bnCancelJob.toolTipText=Cancel processing of the current Job and move on to the next Job. This functionality is only available for jobs running on current AIM node. -AutoIngestDashboard.bnCancelJob.text=&Cancel Job -AutoIngestDashboard.bnDeleteCase.toolTipText=Delete the selected Case in its entirety -AutoIngestDashboard.bnDeleteCase.text=&Delete Case CopyFilesPanel.lbCaseName.text=Case Name CaseStatusIconCellRenderer.tooltiptext.ok=Images processed successfully CaseStatusIconCellRenderer.tooltiptext.warning=An error occurred or processing was canceled for at least one image - please check the log @@ -283,12 +267,7 @@ FileExporterSettingsPanel.BrowseReportTooltip_1=Browse for the Reports Folder FileExporterSettingsPanel.NewRuleTooltip_1=Clear the rule editor to begin a new rule FileExporterSettingsPanel.DeleteTooltip_1=Delete the selected rule FileExporterSettingsPanel.SaveTooltip_1=Save the current rule -AutoIngestDashboard.bnOpenLogDir.text=Open System Logs Directory -AutoIngestDashboard.bnPrioritizeJob.text=Prioritize Job -AutoIngestDashboard.bnPrioritizeJob.toolTipText=Move this folder to the top of the Pending queue. -AutoIngestDashboard.bnReprocessJob.text=Reprocess Job AutoIngestDashboard.bnPrioritizeFolder.label= -AutoIngestDashboard.bnPrioritizeJob.actionCommand= AutoIngestCasePanel.rbDays.text=Days AutoIngestCasePanel.rbWeeks.text=Weeks AutoIngestCasePanel.rbMonths.text=Months @@ -333,3 +312,4 @@ AutoIngestControlPanel.bnPrioritizeJob.actionCommand= sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -18,8 +18,12 @@ */ package org.sleuthkit.autopsy.experimental.autoingest; +import java.io.Serializable; import java.nio.ByteBuffer; +import java.nio.file.Path; +import java.nio.file.Paths; import java.util.Date; +import javax.lang.model.type.TypeKind; /** * A coordination service node data transfer object for an auto ingest job @@ -27,15 +31,28 @@ import java.util.Date; * the auto ingest job for the manifest has crashed during processing, and the * date the auto ingest job for the manifest was completed. */ -final class ManifestNodeData { +final class ManifestNodeData implements Serializable { + private static final int NODE_DATA_VERSION = 2; + private static final int MAX_POSSIBLE_NODE_DATA_SIZE = 65831; + private static final int DEFAULT_PRIORITY = 0; private final boolean coordSvcNodeDataWasSet; + private ProcessingStatus status; private int priority; private int numberOfCrashes; private long completedDate; private boolean errorsOccurred; + + // These are not used by version '1' nodes. + private int version; + private String deviceId; + private String caseName; + private long manifestFileDate; + private String manifestFilePath; + private String dataSourcePath; + //DLG: Add caseDirectoryPath from AutoIngestJob /** * Constructs a coordination service node data data transfer object for an @@ -44,7 +61,7 @@ final class ManifestNodeData { * * @param nodeData The raw bytes received from the coordination service. */ - ManifestNodeData(byte[] nodeData) { + ManifestNodeData(byte[] nodeData) throws ManifestNodeDataException { ByteBuffer buffer = ByteBuffer.wrap(nodeData); this.coordSvcNodeDataWasSet = buffer.hasRemaining(); if (this.coordSvcNodeDataWasSet) { @@ -70,26 +87,58 @@ final class ManifestNodeData { this.completedDate = 0L; this.errorsOccurred = false; } + + if(buffer.hasRemaining()) { + // Version is greater than 1 + this.version = buffer.getInt(); + if(this.version > NODE_DATA_VERSION) { + throw new ManifestNodeDataException(String.format( + "Node data version %d is not suppored.", + this.version)); + } + this.deviceId = getStringFromBuffer(buffer, TypeKind.BYTE); + this.caseName = getStringFromBuffer(buffer, TypeKind.BYTE); + this.manifestFileDate = buffer.getLong(); + this.manifestFilePath = getStringFromBuffer(buffer, TypeKind.SHORT); + this.dataSourcePath = getStringFromBuffer(buffer, TypeKind.SHORT); + } + else { + this.version = 1; + this.deviceId = ""; + this.caseName = ""; + this.manifestFileDate = 0L; + this.manifestFilePath = ""; + this.dataSourcePath = ""; + } } /** * Constructs a coordination service node data data transfer object for an * auto ingest manifest from values provided by the auto ingest system. * + * @param manifest The manifest * @param status The processing status of the manifest. * @param priority The priority of the manifest. * @param numberOfCrashes The number of times auto ingest jobs for the * manifest have crashed during processing. * @param completedDate The date the auto ingest job for the manifest was * completed. + * @param errorsOccurred Boolean to determine if errors have occurred. */ - ManifestNodeData(ProcessingStatus status, int priority, int numberOfCrashes, Date completedDate, boolean errorOccurred) { + ManifestNodeData(Manifest manifest, ProcessingStatus status, int priority, int numberOfCrashes, Date completedDate, boolean errorOccurred) { this.coordSvcNodeDataWasSet = false; this.status = status; this.priority = priority; this.numberOfCrashes = numberOfCrashes; this.completedDate = completedDate.getTime(); this.errorsOccurred = errorOccurred; + + this.version = NODE_DATA_VERSION; + this.deviceId = manifest.getDeviceId(); + this.caseName = manifest.getCaseName(); + this.manifestFileDate = manifest.getDateFileCreated().getTime(); + this.manifestFilePath = manifest.getFilePath().toString(); + this.dataSourcePath = manifest.getDataSourcePath().toString(); } /** @@ -204,6 +253,135 @@ final class ManifestNodeData { void setErrorsOccurred(boolean errorsOccurred) { this.errorsOccurred = errorsOccurred; } + + /** + * Get the node data version. + * + * @return The node data version. + */ + int getVersion() { + return this.version; + } + + /** + * Set the node data version. + * + * @param version The node data version. + */ + void setVersion(int version) { + this.version = version; + } + + /** + * Get the device ID. + * + * @return The device ID. + */ + String getDeviceId() { + return this.deviceId; + } + + /** + * Set the device ID. + * + * @param deviceId The device ID. + */ + void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + /** + * Get the case name. + * + * @return The case name. + */ + String getCaseName() { + return this.caseName; + } + + /** + * Set the case name. + * + * @param caseName The case name. + */ + void setCaseName(String caseName) { + this.caseName = caseName; + } + + /** + * Gets the date the manifest was created. + * + * @return The date the manifest was created. The epoch (January 1, 1970, + * 00:00:00 GMT) indicates the date is not set, i.e., Date.getTime() + * returns 0L. + */ + Date getManifestFileDate() { + return new Date(this.manifestFileDate); + } + + /** + * Sets the date the manifest was created. + * + * @param manifestFileDate The date the manifest was created. Use the epoch + * (January 1, 1970, 00:00:00 GMT) to indicate the + * date is not set, i.e., new Date(0L). + */ + void setManifestFileDate(Date manifestFileDate) { + this.manifestFileDate = manifestFileDate.getTime(); + } + + /** + * Get the manifest file path. + * + * @return The manifest file path. + */ + Path getManifestFilePath() { + return Paths.get(this.manifestFilePath); + } + + /** + * Set the manifest file path. + * + * @param manifestFilePath The manifest file path. + */ + void setManifestFilePath(Path manifestFilePath) { + if (manifestFilePath != null) { + this.manifestFilePath = manifestFilePath.toString(); + } else { + this.manifestFilePath = ""; + } + } + + /** + * Get the data source path. + * + * @return The data source path. + */ + Path getDataSourcePath() { + return Paths.get(dataSourcePath); + } + + /** + * Get the file name portion of the data source path. + * + * @return The data source file name. + */ + public String getDataSourceFileName() { + return Paths.get(dataSourcePath).getFileName().toString(); + } + + /** + * Set the data source path. + * + * @param dataSourcePath The data source path. + */ + void setDataSourcePath(Path dataSourcePath) { + if (dataSourcePath != null) { + this.dataSourcePath = dataSourcePath.toString(); + } else { + this.dataSourcePath = ""; + } + } /** * Gets the node data as raw bytes that can be sent to the coordination @@ -212,13 +390,68 @@ final class ManifestNodeData { * @return The manifest node data as a byte array. */ byte[] toArray() { - ByteBuffer buffer = ByteBuffer.allocate(Integer.BYTES * 4 + Long.BYTES); + ByteBuffer buffer = ByteBuffer.allocate(MAX_POSSIBLE_NODE_DATA_SIZE); + + // Write data (compatible with version 0) buffer.putInt(this.status.ordinal()); buffer.putInt(this.priority); buffer.putInt(this.numberOfCrashes); buffer.putLong(this.completedDate); buffer.putInt(this.errorsOccurred ? 1 : 0); - return buffer.array(); + + if(this.version > 0) { + // Write version + buffer.putInt(this.version); + + // Write data + putStringIntoBuffer(deviceId, buffer, TypeKind.BYTE); + putStringIntoBuffer(caseName, buffer, TypeKind.BYTE); + buffer.putLong(this.manifestFileDate); + putStringIntoBuffer(manifestFilePath, buffer, TypeKind.SHORT); + putStringIntoBuffer(dataSourcePath, buffer, TypeKind.SHORT); + } + + // Prepare the array + byte[] array = new byte[buffer.position()]; + buffer.rewind(); + buffer.get(array, 0, array.length); + + return array; + } + + private String getStringFromBuffer(ByteBuffer buffer, TypeKind lengthType) { + int length = 0; + String output = ""; + + switch(lengthType) { + case BYTE: + length = buffer.get(); + break; + case SHORT: + length = buffer.getShort(); + break; + } + + if(length > 0) { + byte[] array = new byte[length]; + buffer.get(array, 0, length); + output = new String(array); + } + + return output; + } + + private void putStringIntoBuffer(String stringValue, ByteBuffer buffer, TypeKind lengthType) { + switch(lengthType) { + case BYTE: + buffer.put((byte)stringValue.length()); + break; + case SHORT: + buffer.putShort((short)stringValue.length()); + break; + } + + buffer.put(stringValue.getBytes()); } /** diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/ManifestNodeDataException.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/ManifestNodeDataException.java new file mode 100755 index 0000000000..8dbd9f6d7d --- /dev/null +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/ManifestNodeDataException.java @@ -0,0 +1,46 @@ +/* + * Autopsy Forensic Browser + * + * Copyright 2017 Basis Technology Corp. + * Contact: carrier sleuthkit org + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.sleuthkit.autopsy.experimental.autoingest; + +/** + * Exception thrown when a manifest node contains incompatible data. + */ +public class ManifestNodeDataException extends Exception { + + /** + * Constructs an exception thrown when a manifest node contains incompatible + * data. + * + * @param message An error message. + */ + public ManifestNodeDataException(String message) { + super(message); + } + + /** + * Constructs an exception thrown when a manifest node contains incompatible + * data. + * + * @param message An error message. + * @param cause An exception that caused this exception to be thrown. + */ + public ManifestNodeDataException(String message, Throwable cause) { + super(message, cause); + } +} From a1fe4cb35129f2284ec4217e3976cf24cb7312c4 Mon Sep 17 00:00:00 2001 From: Richard Cordovano Date: Wed, 6 Sep 2017 13:50:19 -0400 Subject: [PATCH 070/104] Update CoordinationService.getNodeList --- .../CoordinationService.java | 30 +++++++++++-------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/coordinationservice/CoordinationService.java b/Core/src/org/sleuthkit/autopsy/coordinationservice/CoordinationService.java index bc78ee764e..2664a32787 100755 --- a/Core/src/org/sleuthkit/autopsy/coordinationservice/CoordinationService.java +++ b/Core/src/org/sleuthkit/autopsy/coordinationservice/CoordinationService.java @@ -61,7 +61,7 @@ public final class CoordinationService { @GuardedBy("CoordinationService.class") private static CoordinationService instance; private final CuratorFramework curator; - @GuardedBy("categoryNodeToPath") + @GuardedBy("categoryNodeToPath") private final Map categoryNodeToPath; /** @@ -151,7 +151,7 @@ public final class CoordinationService { * Create the top-level root and category nodes. */ String rootNode = rootNodeName; - + if (!rootNode.startsWith("/")) { rootNode = "/" + rootNode; } @@ -358,20 +358,24 @@ public final class CoordinationService { } } } - - //DLG: header - //DLG: throw exception - //DLG: throw new CoordinationServiceException(String.format("Failed to set data for %s", fullNodePath), ex); - public List getNodeList(CategoryNode category) { - List list = null; - + + /** + * Gets a list of the child nodes of a category in the namespace. + * + * @param category The desired category in the namespace. + * + * @return A list of child node names. + * + * @throws CoordinationServiceException If there is an error getting the + * node list. + */ + public List getNodeList(CategoryNode category) throws CoordinationServiceException { try { - list = curator.getChildren().forPath(categoryNodeToPath.get(category.getDisplayName())); + List list = curator.getChildren().forPath(categoryNodeToPath.get(category.getDisplayName())); + return list; } catch (Exception ex) { - Logger.getLogger(CoordinationService.class.getName()).log(Level.SEVERE, null, ex); + throw new CoordinationServiceException(String.format("Failed to get node list for %s", category.getDisplayName()), ex); } - - return list; } /** From d0f7ce26bfa3d76ce580b06ea3b9a4e2bcc2de41 Mon Sep 17 00:00:00 2001 From: Richard Cordovano Date: Wed, 6 Sep 2017 20:37:06 -0400 Subject: [PATCH 071/104] Some AID 2,0 modifications --- .../autoingest/AutoIngestDashboard.java | 29 +- .../AutoIngestDashboardTopComponent.form | 2 +- .../AutoIngestDashboardTopComponent.java | 2 +- .../autoingest/AutoIngestMonitor.java | 976 +++++------------- 4 files changed, 249 insertions(+), 760 deletions(-) diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java index 2c7a1a9d86..230d504f95 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java @@ -1,7 +1,7 @@ /* * Autopsy Forensic Browser * - * Copyright 2015-2017 Basis Technology Corp. + * Copyright 2011-2017 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -166,7 +166,7 @@ public final class AutoIngestDashboard extends JPanel implements Observer { * controlling automated ingest for a single node within the cluster. */ private AutoIngestDashboard() { - autoIngestMonitor = AutoIngestMonitor.getInstance(); + autoIngestMonitor = AutoIngestMonitor.createMonitor(); pendingTableModel = new DefaultTableModel(JobsTableModelColumns.headers, 0) { private static final long serialVersionUID = 1L; @@ -524,7 +524,7 @@ public final class AutoIngestDashboard extends JPanel implements Observer { try { autoIngestMonitor.startUp(); autoIngestStarted = true; - } catch (AutoIngestMonitor.AutoIngestMonitorStartupException ex) { + } catch (AutoIngestMonitor.AutoIngestMonitorException ex) { SYS_LOGGER.log(Level.SEVERE, "Dashboard error starting up auto ingest", ex); tbStatusMessage.setText(NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.AutoIngestStartupError")); autoIngestMonitor = null; @@ -557,7 +557,7 @@ public final class AutoIngestDashboard extends JPanel implements Observer { */ updateExecutor = Executors.newSingleThreadExecutor(new ThreadFactoryBuilder().setNameFormat(UPDATE_TASKS_THREAD_NAME).build()); updateExecutor.submit(new UpdateAllJobsTablesTask()); - autoIngestMonitor.scanInputDirsNow(); + autoIngestMonitor.queryCoordinationService(); //bnPause.setEnabled(true); bnPause.setText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnPause.text")); @@ -657,27 +657,6 @@ public final class AutoIngestDashboard extends JPanel implements Observer { case CASE_DELETED: updateExecutor.submit(new UpdateAllJobsTablesTask()); break; - case PAUSED_BY_REQUEST: - EventQueue.invokeLater(() -> { - tbStatusMessage.setText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnPause.paused")); - bnRefresh.setEnabled(false); - isPaused = true; - }); - break; - case PAUSED_FOR_SYSTEM_ERROR: - EventQueue.invokeLater(() -> { - tbStatusMessage.setText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.PauseDueToSystemError")); - bnRefresh.setEnabled(false); - pause(false); - isPaused = true; - setServicesStatusMessage(); - }); - break; - case RESUMED: - EventQueue.invokeLater(() -> { - tbStatusMessage.setText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnPause.running")); - }); - break; case CASE_PRIORITIZED: updateExecutor.submit(new UpdatePendingJobsTableTask()); break; diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardTopComponent.form b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardTopComponent.form index 63887aceb0..5f3eab1a5f 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardTopComponent.form +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardTopComponent.form @@ -25,4 +25,4 @@ - \ No newline at end of file + diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardTopComponent.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardTopComponent.java index cfb2e7e18f..5f2fa268a0 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardTopComponent.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardTopComponent.java @@ -1,7 +1,7 @@ /* * Autopsy Forensic Browser * - * Copyright 2017 Basis Technology Corp. + * Copyright 2011 - 2017 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMonitor.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMonitor.java index 8be3358838..e85915a2b4 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMonitor.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMonitor.java @@ -1,7 +1,7 @@ /* * Autopsy Forensic Browser * - * Copyright 2017 Basis Technology Corp. + * Copyright 2011-2017 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -21,438 +21,234 @@ package org.sleuthkit.autopsy.experimental.autoingest; import com.google.common.util.concurrent.ThreadFactoryBuilder; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; -import java.io.IOException; -import static java.nio.file.FileVisitOption.FOLLOW_LINKS; -import java.nio.file.FileVisitResult; -import static java.nio.file.FileVisitResult.CONTINUE; -import static java.nio.file.FileVisitResult.TERMINATE; -import java.nio.file.FileVisitor; -import java.nio.file.Files; import java.nio.file.Path; -import java.nio.file.Paths; -import java.nio.file.attribute.BasicFileAttributes; -import java.sql.SQLException; -import java.time.Duration; -import java.time.Instant; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; -import java.util.Date; -import java.util.EnumSet; -import java.util.HashMap; import java.util.HashSet; -import java.util.Iterator; import java.util.List; -import java.util.Map; import java.util.Observable; import java.util.Set; -import java.util.concurrent.Callable; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.TimeUnit; import java.util.logging.Level; -import java.util.logging.Logger; import javax.annotation.concurrent.GuardedBy; -import org.openide.util.Exceptions; -import org.openide.util.Lookup; import org.sleuthkit.autopsy.coordinationservice.CoordinationService; import org.sleuthkit.autopsy.coordinationservice.CoordinationService.CoordinationServiceException; -import org.sleuthkit.autopsy.core.UserPreferencesException; +import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.coreutils.NetworkUtils; -import org.sleuthkit.autopsy.events.AutopsyEvent; import org.sleuthkit.autopsy.events.AutopsyEventException; import org.sleuthkit.autopsy.events.AutopsyEventPublisher; -import org.sleuthkit.autopsy.experimental.autoingest.AutoIngestJob.Stage; -import static org.sleuthkit.autopsy.experimental.autoingest.ManifestNodeData.ProcessingStatus.COMPLETED; -import static org.sleuthkit.autopsy.experimental.autoingest.ManifestNodeData.ProcessingStatus.DELETED; -import static org.sleuthkit.autopsy.experimental.autoingest.ManifestNodeData.ProcessingStatus.PENDING; -import static org.sleuthkit.autopsy.experimental.autoingest.ManifestNodeData.ProcessingStatus.PROCESSING; -import org.sleuthkit.autopsy.experimental.configuration.AutoIngestUserPreferences; /** - * - * @author dgrove + * An auto ingest monitor responsible for monitoring and reporting the + * processing of auto ingest jobs. */ public final class AutoIngestMonitor extends Observable implements PropertyChangeListener { - - private static final int NUM_INPUT_SCAN_SCHEDULING_THREADS = 1; - private static final String INPUT_SCAN_SCHEDULER_THREAD_NAME = "AIM-input-scan-scheduler-%d"; - private static final String INPUT_SCAN_THREAD_NAME = "AIM-input-scan-%d"; - private static int DEFAULT_JOB_PRIORITY = 0; - private static final String AUTO_INGEST_THREAD_NAME = "AIM-job-processing-%d"; + + private static final Logger LOGGER = Logger.getLogger(AutoIngestMonitor.class.getName()); + private static final int NUM_COORD_SVC_QUERY_THREADS = 1; + private static final String COORD_SVC_QUERY_THREAD_NAME = "AIM-coord-svc-query-thread-%d"; //NON-NLS + private static final int CORRD_SVC_QUERY_INERVAL_MINS = 5; private static final String LOCAL_HOST_NAME = NetworkUtils.getLocalHostName(); - private static final String EVENT_CHANNEL_NAME = "Auto-Ingest-Manager-Events"; + private static final String EVENT_CHANNEL_NAME = "Auto-Ingest-Manager-Events"; //NON-NLS private static final Set EVENT_LIST = new HashSet<>(Arrays.asList(new String[]{ Event.JOB_STATUS_UPDATED.toString(), Event.JOB_COMPLETED.toString(), Event.CASE_PRIORITIZED.toString(), Event.JOB_STARTED.toString()})); - private static final long JOB_STATUS_EVENT_INTERVAL_SECONDS = 10; - private static final String JOB_STATUS_PUBLISHING_THREAD_NAME = "AIM-job-status-event-publisher-%d"; - private static final long MAX_MISSED_JOB_STATUS_UPDATES = 10; - private static final java.util.logging.Logger SYS_LOGGER = AutoIngestSystemLogger.getLogger(); - - private static AutoIngestMonitor instance; private final AutopsyEventPublisher eventPublisher; - private final Object scanMonitor; - private final ScheduledThreadPoolExecutor inputScanSchedulingExecutor; - private final ExecutorService inputScanExecutor; - private final ExecutorService jobProcessingExecutor; - private final ScheduledThreadPoolExecutor jobStatusPublishingExecutor; - private final ConcurrentHashMap hostNamesToLastMsgTime; - private final ConcurrentHashMap hostNamesToRunningJobs; - private final Object jobsLock; - @GuardedBy("jobsLock") private final Map> casesToManifests; - @GuardedBy("jobsLock") private List pendingJobs; - @GuardedBy("jobsLock") private AutoIngestJob currentJob; - @GuardedBy("jobsLock") private List completedJobs; private CoordinationService coordinationService; - private Path rootInputDirectory; - private Path rootOutputDirectory; - private volatile State state; - private volatile ErrorState errorState; + private final ScheduledThreadPoolExecutor coordSvcQueryExecutor; + private final Object jobsLock; + @GuardedBy("jobsLock") + private JobsSnapshot jobsSnapshot; /** - * Gets a singleton auto ingest monitor responsible for processing auto - * ingest jobs defined by manifest files that can be added to any level of a - * designated input directory tree. + * Creates an auto ingest monitor responsible for monitoring and reporting + * the processing of auto ingest jobs. * - * @return A singleton AutoIngestMonitor instance. + * @return The auto ingest monitor. + * + * @throws AutoIngestMonitorException If the monitor cannot be created. */ - synchronized static AutoIngestMonitor getInstance() { - if (instance == null) { - instance = new AutoIngestMonitor(); - } - return instance; + static AutoIngestMonitor createMonitor() throws AutoIngestMonitorException { + AutoIngestMonitor monitor = new AutoIngestMonitor(); + monitor.startUp(); + return monitor; } - + /** - * Constructs an auto ingest monitor responsible for processing auto ingest - * jobs defined by manifest files that can be added to any level of a - * designated input directory tree. + * Constructs an auto ingest monitor responsible for monitoring and + * reporting the processing of auto ingest jobs. */ - public AutoIngestMonitor() { - SYS_LOGGER.log(Level.INFO, "Initializing auto ingest"); - state = State.IDLE; + private AutoIngestMonitor() { eventPublisher = new AutopsyEventPublisher(); - scanMonitor = new Object(); - inputScanSchedulingExecutor = new ScheduledThreadPoolExecutor(NUM_INPUT_SCAN_SCHEDULING_THREADS, new ThreadFactoryBuilder().setNameFormat(INPUT_SCAN_SCHEDULER_THREAD_NAME).build()); - inputScanExecutor = Executors.newSingleThreadExecutor(new ThreadFactoryBuilder().setNameFormat(INPUT_SCAN_THREAD_NAME).build()); - jobProcessingExecutor = Executors.newSingleThreadExecutor(new ThreadFactoryBuilder().setNameFormat(AUTO_INGEST_THREAD_NAME).build()); - jobStatusPublishingExecutor = new ScheduledThreadPoolExecutor(1, new ThreadFactoryBuilder().setNameFormat(JOB_STATUS_PUBLISHING_THREAD_NAME).build()); - hostNamesToRunningJobs = new ConcurrentHashMap<>(); - hostNamesToLastMsgTime = new ConcurrentHashMap<>(); + coordSvcQueryExecutor = new ScheduledThreadPoolExecutor(NUM_COORD_SVC_QUERY_THREADS, new ThreadFactoryBuilder().setNameFormat(COORD_SVC_QUERY_THREAD_NAME).build()); jobsLock = new Object(); - casesToManifests = new HashMap<>(); - pendingJobs = new ArrayList<>(); - completedJobs = new ArrayList<>(); - rootOutputDirectory = Paths.get(AutoIngestUserPreferences.getAutoModeResultsFolder()); - errorState = ErrorState.NONE; } /** - * Starts up auto ingest. + * Starts up the auto ingest monitor. * - * @throws AutoIngestMonitorStartupException if there is a problem starting - * auto ingest. + * @throws AutoIngestMonitorException If there is a problem starting the + * auto ingest monitor. */ - void startUp() throws AutoIngestMonitor.AutoIngestMonitorStartupException { - SYS_LOGGER.log(Level.INFO, "Auto ingest starting"); + private void startUp() throws AutoIngestMonitor.AutoIngestMonitorException { try { coordinationService = CoordinationService.getInstance(); } catch (CoordinationServiceException ex) { - throw new AutoIngestMonitorStartupException("Failed to get coordination service", ex); + throw new AutoIngestMonitorException("Failed to get coordination service", ex); //NON-NLS } try { eventPublisher.openRemoteEventChannel(EVENT_CHANNEL_NAME); - SYS_LOGGER.log(Level.INFO, "Opened auto ingest event channel"); } catch (AutopsyEventException ex) { - SYS_LOGGER.log(Level.SEVERE, "Failed to open auto ingest event channel", ex); - throw new AutoIngestMonitorStartupException("Failed to open auto ingest event channel", ex); + throw new AutoIngestMonitorException("Failed to open auto ingest event channel", ex); //NON-NLS } - rootInputDirectory = Paths.get(AutoIngestUserPreferences.getAutoModeImageFolder()); - rootOutputDirectory = Paths.get(AutoIngestUserPreferences.getAutoModeResultsFolder()); - inputScanSchedulingExecutor.scheduleAtFixedRate(new InputDirScanSchedulingTask(), 0, AutoIngestUserPreferences.getMinutesOfInputScanInterval(), TimeUnit.MINUTES); - jobStatusPublishingExecutor.scheduleAtFixedRate(new PeriodicJobStatusEventTask(), JOB_STATUS_EVENT_INTERVAL_SECONDS, JOB_STATUS_EVENT_INTERVAL_SECONDS, TimeUnit.SECONDS); - eventPublisher.addSubscriber(EVENT_LIST, instance); - state = State.RUNNING; - errorState = ErrorState.NONE; + coordSvcQueryExecutor.scheduleAtFixedRate(new CoordinationServiceQueryTask(), 0, CORRD_SVC_QUERY_INERVAL_MINS, TimeUnit.MINUTES); + eventPublisher.addSubscriber(EVENT_LIST, this); } /** - * Gets the error state of the autop ingest monitor. - * - * @return The error state, may be NONE. + * Shuts down the auto ingest ingest monitor. */ - ErrorState getErrorState() { - return errorState; + void shutDown() { + try { + eventPublisher.removeSubscriber(EVENT_LIST, this); + coordSvcQueryExecutor.shutdownNow(); + while (!coordSvcQueryExecutor.awaitTermination(30, TimeUnit.SECONDS)) { + LOGGER.log(Level.WARNING, "Auto ingest monitor waited at least thirty seconds for coordination service executor to shut down, continuing to wait"); //NON-NLS + } + eventPublisher.closeRemoteEventChannel(); + } catch (InterruptedException ex) { + LOGGER.log(Level.WARNING, "Auto ingest monitor interrupted during shut down", ex); //NON-NLS + } } /** - * Handles auto ingest events published by other auto ingest nodes. + * Handles auto ingest job events published by the auto ingest nodes in an + * auto ingest cluster. * * @param event An auto ingest event from another node. */ @Override public void propertyChange(PropertyChangeEvent event) { - if (event instanceof AutopsyEvent) { - if (((AutopsyEvent) event).getSourceType() == AutopsyEvent.SourceType.REMOTE) { - if (event instanceof AutoIngestJobStartedEvent) { - handleRemoteJobStartedEvent((AutoIngestJobStartedEvent) event); - } else if (event instanceof AutoIngestJobStatusEvent) { - handleRemoteJobStatusEvent((AutoIngestJobStatusEvent) event); - } else if (event instanceof AutoIngestJobCompletedEvent) { - handleRemoteJobCompletedEvent((AutoIngestJobCompletedEvent) event); - } else if (event instanceof AutoIngestCasePrioritizedEvent) { - handleRemoteCasePrioritizationEvent((AutoIngestCasePrioritizedEvent) event); - } else if (event instanceof AutoIngestCaseDeletedEvent) { - handleRemoteCaseDeletedEvent((AutoIngestCaseDeletedEvent) event); - } - } + if (event instanceof AutoIngestJobStartedEvent) { + handleJobStartedEvent((AutoIngestJobStartedEvent) event); + } else if (event instanceof AutoIngestJobStatusEvent) { + handleJobStatusEvent((AutoIngestJobStatusEvent) event); + } else if (event instanceof AutoIngestJobCompletedEvent) { + handleJobCompletedEvent((AutoIngestJobCompletedEvent) event); + } else if (event instanceof AutoIngestCasePrioritizedEvent) { + handleCasePrioritizationEvent((AutoIngestCasePrioritizedEvent) event); + } else if (event instanceof AutoIngestCaseDeletedEvent) { + handleCaseDeletedEvent((AutoIngestCaseDeletedEvent) event); } } /** - * Processes a job started event from another node by removing the job from - * the pending queue, if it is present, and adding the job in the event to - * the collection of jobs running on other hosts. - *

- * Note that the processing stage of the job will be whatever it was when - * the job was serialized for inclusion in the event message. + * Handles an auto ingest job started event. * - * @param event A job started from another auto ingest node. + * @param event A auto ingest job started event. */ - private void handleRemoteJobStartedEvent(AutoIngestJobStartedEvent event) { - String hostName = event.getJob().getNodeName(); - hostNamesToLastMsgTime.put(hostName, Instant.now()); - synchronized (jobsLock) { - Path manifestFilePath = event.getJob().getNodeData().getManifestFilePath(); - for (Iterator iterator = pendingJobs.iterator(); iterator.hasNext();) { - AutoIngestJob pendingJob = iterator.next(); - if (pendingJob.getNodeData().getManifestFilePath().equals(manifestFilePath)) { - iterator.remove(); - break; - } - } - } - hostNamesToRunningJobs.put(event.getJob().getNodeName(), event.getJob()); + private void handleJobStartedEvent(AutoIngestJobStartedEvent event) { + // DLG: Remove job from event from pending queue, if present + // DLG: Add job to running jobs list setChanged(); notifyObservers(Event.JOB_STARTED); } /** - * Processes a job status event from another node by adding the job in the - * event to the collection of jobs running on other hosts. - *

- * Note that the processing stage of the job will be whatever it was when - * the job was serialized for inclusion in the event message. + * Handles an auto ingest job status event. * - * @param event An job status event from another auto ingest node. + * @param event A auto ingest job status event. */ - private void handleRemoteJobStatusEvent(AutoIngestJobStatusEvent event) { - String hostName = event.getJob().getNodeName(); - hostNamesToLastMsgTime.put(hostName, Instant.now()); - hostNamesToRunningJobs.put(hostName, event.getJob()); + private void handleJobStatusEvent(AutoIngestJobStatusEvent event) { + // DLG: Replace job in running list with job from event setChanged(); notifyObservers(Event.JOB_STATUS_UPDATED); } /** - * Processes a job completed event from another node by removing the job in - * the event from the collection of jobs running on other hosts and adding - * it to the list of completed jobs. - *

- * Note that the processing stage of the job will be whatever it was when - * the job was serialized for inclusion in the event message. + * Handles an auto ingest job completed event. * - * @param event An job completed event from another auto ingest node. + * @param event A auto ingest job completed event. */ - private void handleRemoteJobCompletedEvent(AutoIngestJobCompletedEvent event) { - String hostName = event.getJob().getNodeName(); - hostNamesToLastMsgTime.put(hostName, Instant.now()); - hostNamesToRunningJobs.remove(hostName); - if (event.shouldRetry() == false) { - synchronized (jobsLock) { - completedJobs.add(event.getJob()); - } - } - //scanInputDirsNow(); + private void handleJobCompletedEvent(AutoIngestJobCompletedEvent event) { + // DLG: Remove job from event from running list, if present + // DLG: Add job to completed list setChanged(); notifyObservers(Event.JOB_COMPLETED); } /** - * Processes a job/case prioritization event from another node by triggering - * an immediate input directory scan. + * Handles an auto ingest job/case prioritization event. * - * @param event A prioritization event from another auto ingest node. + * @param event A job/case prioritization event. */ - private void handleRemoteCasePrioritizationEvent(AutoIngestCasePrioritizedEvent event) { - String hostName = event.getNodeName(); - hostNamesToLastMsgTime.put(hostName, Instant.now()); - scanInputDirsNow(); + private void handleCasePrioritizationEvent(AutoIngestCasePrioritizedEvent event) { + // DLG: Replace job in pending queue with job from event setChanged(); notifyObservers(Event.CASE_PRIORITIZED); } /** - * Processes a case deletin event from another node by triggering an - * immediate input directory scan. + * Handles a case deletion event. * - * @param event A case deleted event from another auto ingest node. + * @param event A job/case prioritization event. */ - private void handleRemoteCaseDeletedEvent(AutoIngestCaseDeletedEvent event) { - String hostName = event.getNodeName(); - hostNamesToLastMsgTime.put(hostName, Instant.now()); - scanInputDirsNow(); - setChanged(); - notifyObservers(Event.CASE_DELETED); + private void handleCaseDeletedEvent(AutoIngestCaseDeletedEvent event) { + coordSvcQueryExecutor.submit(new CoordinationServiceQueryTask()); } /** - * Gets snapshots of the pending jobs queue, running jobs list, and - * completed jobs list. Any of these collection can be excluded by passing a - * null for the correspioding in/out list parameter. + * Gets the auto ingest monitor's current snapshot of the pending jobs + * queue, running jobs list, and completed jobs list for an auto ingest + * cluster. * - * @param pendingJobs A list to be populated with pending jobs, can be - * null. - * @param runningJobs A list to be populated with running jobs, can be - * null. - * @param completedJobs A list to be populated with competed jobs, can be - * null. + * @return The snapshot. */ - void getJobs(List pendingJobs, List runningJobs, List completedJobs) { + JobsSnapshot getJobsSnapshot() { synchronized (jobsLock) { - if (null != pendingJobs) { - pendingJobs.clear(); - pendingJobs.addAll(this.pendingJobs); - } - if (null != runningJobs) { - runningJobs.clear(); - if (null != currentJob) { - runningJobs.add(currentJob); - } - for (AutoIngestJob job : hostNamesToRunningJobs.values()) { - runningJobs.add(job); - runningJobs.sort(new AutoIngestJob.AlphabeticalComparator()); - } - } - if (null != completedJobs) { - completedJobs.clear(); - completedJobs.addAll(this.completedJobs); - } + return jobsSnapshot; } } /** - * An instance of this runnable is responsible for periodically sending auto - * ingest job status event to remote auto ingest nodes and timing out stale - * remote jobs. The auto ingest job status event is sent only if auto ingest - * monitor has a currently running auto ingest job. + * Makes the auto ingest monitor's refresh its current snapshot of the + * pending jobs queue, running jobs list, and completed jobs list for an + * auto ingest cluster. + * + * @return The refreshed snapshot. */ - private final class PeriodicJobStatusEventTask implements Runnable { - - private final long MAX_SECONDS_WITHOUT_UPDATE = JOB_STATUS_EVENT_INTERVAL_SECONDS * MAX_MISSED_JOB_STATUS_UPDATES; - - private PeriodicJobStatusEventTask() { - SYS_LOGGER.log(Level.INFO, "Periodic status publishing task started"); + JobsSnapshot refreshJobsSnapshot() { + JobsSnapshot newJobsSnapshot = queryCoordinationService(); + synchronized (jobsLock) { + jobsSnapshot = newJobsSnapshot; + return jobsSnapshot; } + } - @Override - public void run() { - - try { - synchronized (jobsLock) { - if (currentJob != null) { - setChanged(); - notifyObservers(AutoIngestMonitor.Event.JOB_STATUS_UPDATED); - eventPublisher.publishRemotely(new AutoIngestJobStatusEvent(currentJob)); - } - - if (AutoIngestUserPreferences.getStatusDatabaseLoggingEnabled()) { - String message; - boolean isError = false; - if (getErrorState().equals(AutoIngestMonitor.ErrorState.NONE)) { - if (currentJob != null) { - message = "Processing " + currentJob.getNodeData().getDataSourceFileName() - + " for case " + currentJob.getNodeData().getCaseName(); - } else { - message = "Paused or waiting for next case"; - } - } else { - message = getErrorState().toString(); - isError = true; - } - try { - StatusDatabaseLogger.logToStatusDatabase(message, isError); - } catch (SQLException | UserPreferencesException ex) { - SYS_LOGGER.log(Level.WARNING, "Failed to update status database", ex); - } - } - } - - // check whether any remote nodes have timed out - for (AutoIngestJob job : hostNamesToRunningJobs.values()) { - if (isStale(hostNamesToLastMsgTime.get(job.getNodeName()))) { - // remove the job from remote job running map. - /* - * NOTE: there is theoretically a check-then-act race - * condition but I don't it's worth introducing another - * lock because of it. If a job status update is - * received after we check the last message fileTime - * stamp (i.e. "check") but before we remove the remote - * job (i.e. "act") then the remote job will get added - * back into hostNamesToRunningJobs as a result of - * processing the job status update. - */ - SYS_LOGGER.log(Level.WARNING, "Auto ingest node {0} timed out while processing folder {1}", - new Object[]{job.getNodeName(), job.getNodeData().getManifestFilePath().toString()}); - hostNamesToRunningJobs.remove(job.getNodeName()); - setChanged(); - notifyObservers(AutoIngestMonitor.Event.JOB_COMPLETED); - } - } - - } catch (Exception ex) { - SYS_LOGGER.log(Level.SEVERE, "Unexpected exception in PeriodicJobStatusEventTask", ex); //NON-NLS + /** + * Gets a new snapshot of the pending jobs queue, running jobs list, and + * completed jobs list for an auto ingest cluster. + * + * @return The snapshot. + */ + private JobsSnapshot queryCoordinationService() { + JobsSnapshot newJobsSnapshot = new JobsSnapshot(); + List nodeList; + try { + nodeList = coordinationService.getNodeList(CoordinationService.CategoryNode.MANIFESTS); + for (String node : nodeList) { + // DLG: Do not need a lock here + // DLG: Get the node data and construct a AutoIngestJobNodeData object (rename ManifestNodeData => AutoIngestJobData) + // DLG: Construct an AutoIngestJob object from the } + return newJobsSnapshot; + } catch (CoordinationServiceException ex) { + LOGGER.log(Level.SEVERE, "Failed to get node list from coordination service", ex); } - - /** - * Determines whether or not the fileTime since the last message from - * node is greater than the maximum acceptable interval between - * messages. - * - * @return True or false. - */ - boolean isStale(Instant lastUpdateTime) { - return (Duration.between(lastUpdateTime, Instant.now()).toMillis() / 1000 > MAX_SECONDS_WITHOUT_UPDATE); - } - } - - /** - * Triggers an immediate scan of the input directories. - */ - void scanInputDirsNow() { - if (State.RUNNING != state) { - return; - } - inputScanExecutor.submit(new InputDirScanTask()); - } - - /** - * Start a scan of the input directories and wait for scan to complete. - */ - void scanInputDirsAndWait() { - if (State.RUNNING != state) { - return; - } - SYS_LOGGER.log(Level.INFO, "Starting input scan of {0}", rootInputDirectory); - InputDirScanner scanner = new InputDirScanner(); - scanner.scan(); - SYS_LOGGER.log(Level.INFO, "Completed input scan of {0}", rootInputDirectory); } /** @@ -461,11 +257,6 @@ public final class AutoIngestMonitor extends Observable implements PropertyChang * @param caseName The name of the case to be prioritized. */ void prioritizeCase(final String caseName) { - - if (state != State.RUNNING) { - return; - } - List prioritizedJobs = new ArrayList<>(); int maxPriority = 0; synchronized (jobsLock) { @@ -486,11 +277,8 @@ public final class AutoIngestMonitor extends Observable implements PropertyChang nodeData.setPriority(maxPriority); coordinationService.setNodeData(CoordinationService.CategoryNode.MANIFESTS, manifestNodePath, nodeData.toArray()); } catch (ManifestNodeDataException ex) { - SYS_LOGGER.log(Level.WARNING, String.format("Unable to use node data for %s", manifestNodePath), ex); } catch (CoordinationServiceException ex) { - SYS_LOGGER.log(Level.SEVERE, String.format("Coordination service error while prioritizing %s", manifestNodePath), ex); } catch (InterruptedException ex) { - SYS_LOGGER.log(Level.SEVERE, "Unexpected interrupt while updating coordination service node data for {0}", manifestNodePath); } job.getNodeData().setPriority(maxPriority); } @@ -512,10 +300,6 @@ public final class AutoIngestMonitor extends Observable implements PropertyChang * @param manifestPath The manifest file path for the job to be prioritized. */ void prioritizeJob(Path manifestPath) { - if (state != State.RUNNING) { - return; - } - int maxPriority = 0; AutoIngestJob prioritizedJob = null; synchronized (jobsLock) { @@ -535,11 +319,8 @@ public final class AutoIngestMonitor extends Observable implements PropertyChang nodeData.setPriority(maxPriority); coordinationService.setNodeData(CoordinationService.CategoryNode.MANIFESTS, manifestNodePath, nodeData.toArray()); } catch (ManifestNodeDataException ex) { - SYS_LOGGER.log(Level.WARNING, String.format("Unable to use node data for %s", manifestPath), ex); } catch (CoordinationServiceException ex) { - SYS_LOGGER.log(Level.SEVERE, String.format("Coordination service error while prioritizing %s", manifestNodePath), ex); } catch (InterruptedException ex) { - SYS_LOGGER.log(Level.SEVERE, "Unexpected interrupt while updating coordination service node data for {0}", manifestNodePath); } prioritizedJob.getNodeData().setPriority(maxPriority); } @@ -556,354 +337,34 @@ public final class AutoIngestMonitor extends Observable implements PropertyChang } /** - * Get the current snapshot of the job lists. - * - * @return Snapshot of jobs lists + * A task that queries the coordination service for auto ingest manifest + * node data and converts it to auto ingest jobs for publication top its + * observers. */ - JobsSnapshot getCurrentJobsSnapshot() { - synchronized (jobsLock) { - List runningJobs = new ArrayList<>(); - getJobs(null, runningJobs, null); - return new JobsSnapshot(pendingJobs, runningJobs, completedJobs); - } - } - - /** - * A task that submits an input directory scan task to the input directory - * scan task executor. - */ - private final class InputDirScanSchedulingTask implements Runnable { + private final class CoordinationServiceQueryTask implements Runnable { /** - * Constructs a task that submits an input directory scan task to the - * input directory scan task executor. - */ - private InputDirScanSchedulingTask() { - SYS_LOGGER.log(Level.INFO, "Periodic input scan scheduling task started"); - } - - /** - * Submits an input directory scan task to the input directory scan task - * executor. + * Queries the coordination service for auto ingest manifest node data + * and converts it to auto ingest jobs for publication top its + * observers. */ @Override public void run() { - scanInputDirsNow(); - } - } - - /** - * A task that scans the input directory tree and refreshes the pending jobs - * queue and the completed jobs list. Crashed job recovery is perfomed as - * needed. - */ - private final class InputDirScanTask implements Callable { - - /** - * Scans the input directory tree and refreshes the pending jobs queue - * and the completed jobs list. Crashed job recovery is performed as - * needed. - */ - @Override - public Void call() throws Exception { if (Thread.currentThread().isInterrupted()) { - return null; - } - SYS_LOGGER.log(Level.INFO, "Starting input scan of {0}", rootInputDirectory); - InputDirScanner scanner = new InputDirScanner(); - scanner.scan(); - SYS_LOGGER.log(Level.INFO, "Completed input scan of {0}", rootInputDirectory); - setChanged(); - notifyObservers(Event.INPUT_SCAN_COMPLETED); - return null; - } - - } - - /** - * A FileVisitor that searches the input directories for manifest files. The - * search results are used to refresh the pending jobs queue and the - * completed jobs list. Crashed job recovery is performed as needed. - */ - private final class InputDirScanner { // DLG: Replace with task that calls regularly / reusable by refresh - - private final List newPendingJobsList = new ArrayList<>(); - private final List newCompletedJobsList = new ArrayList<>(); - - /** - * Searches the input directories for manifest files. The search results - * are used to refresh the pending jobs queue and the completed jobs - * list. - */ - private void scan() { - synchronized (jobsLock) { - if (Thread.currentThread().isInterrupted()) { - return; + JobsSnapshot newJobsSnapshot = queryCoordinationService(); + synchronized (jobsLock) { + jobsSnapshot = newJobsSnapshot; } - try { - newPendingJobsList.clear(); - newCompletedJobsList.clear(); - - List manifestList = coordinationService.getNodeList( - CoordinationService.CategoryNode.MANIFESTS); - - for(int i=0; i < manifestList.size(); i++) { - visitFile(Paths.get(manifestList.get(i))); // DLG: Just call CoordinationService - } - - Collections.sort(newPendingJobsList, new AutoIngestJob.PriorityComparator()); - AutoIngestMonitor.this.pendingJobs = newPendingJobsList; - AutoIngestMonitor.this.completedJobs = newCompletedJobsList; - - } catch (Exception ex) { - /* - * NOTE: Need to catch all exceptions here. Otherwise - * uncaught exceptions will propagate up to the calling - * thread and may stop it from running. - */ - SYS_LOGGER.log(Level.SEVERE, String.format("Error scanning the input directory %s", rootInputDirectory), ex); - } - } - synchronized (scanMonitor) { - scanMonitor.notify(); - } - } - - private FileVisitResult visitFile(Path filePath) throws IOException { - if (Thread.currentThread().isInterrupted()) { - return TERMINATE; - } - - Manifest manifest = parseManifestFile(filePath); // DLG: No longer use this - - if (Thread.currentThread().isInterrupted()) { - return TERMINATE; - } - - if(manifest != null) { - String caseName = manifest.getCaseName(); - Path manifestPath = manifest.getFilePath(); - - if (casesToManifests.containsKey(caseName)) { - Set manifestPathSet = casesToManifests.get(caseName); - manifestPathSet.add(manifestPath); - } else { - Set manifestPathSet = new HashSet<>(); - manifestPathSet.add(manifestPath); - casesToManifests.put(caseName, manifestPathSet); - } - - /* - * Add a job to the pending jobs queue, the completed jobs list, - * or do crashed job recovery, as required. - */ - try { - addJob(manifest); - } catch (CoordinationService.CoordinationServiceException ex) { - SYS_LOGGER.log(Level.SEVERE, String.format("Error getting node data for %s", manifestPath), ex); - return CONTINUE; - } catch (InterruptedException ex) { - Thread.currentThread().interrupt(); - return TERMINATE; - } - } - - if (!Thread.currentThread().isInterrupted()) { - return CONTINUE; - } - - return TERMINATE; - } - - private Manifest parseManifestFile(Path filePath) throws IOException { - Manifest manifest = null; - - for (ManifestFileParser parser : Lookup.getDefault().lookupAll(ManifestFileParser.class)) { - if (parser.fileIsManifest(filePath)) { - try { - manifest = parser.parse(filePath); - break; - } catch (ManifestFileParser.ManifestFileParserException ex) { - SYS_LOGGER.log(Level.SEVERE, String.format("Error attempting to parse %s with parser %s", filePath, parser.getClass().getCanonicalName()), ex); - } - } - } - - return manifest; - } - - /** - * Add a job to the pending jobs queue, the completed jobs list, - * or do crashed job recovery, as required. - */ - private void addJob(Manifest manifest) throws CoordinationService.CoordinationServiceException, InterruptedException { - Path manifestPath = manifest.getFilePath(); - - byte[] rawData = coordinationService.getNodeData(CoordinationService.CategoryNode.MANIFESTS, manifestPath.toString()); - if (null != rawData) { - try { - ManifestNodeData nodeData = new ManifestNodeData(rawData); - if (nodeData.coordSvcNodeDataWasSet()) { - ManifestNodeData.ProcessingStatus processingStatus = nodeData.getStatus(); - switch (processingStatus) { - case PENDING: - addPendingJob(nodeData); - break; - case PROCESSING: - doRecoveryIfCrashed(nodeData); - break; - case COMPLETED: - addCompletedJob(nodeData); - break; - case DELETED: - // Do nothing - we dont'want to add it to any job list or do recovery - break; - default: - SYS_LOGGER.log(Level.SEVERE, "Unknown ManifestNodeData.ProcessingStatus"); - break; - } - } else { - addNewPendingJob(manifest); - } - } catch(ManifestNodeDataException ex) { - SYS_LOGGER.log(Level.WARNING, String.format("Unable to use node data for %s", manifestPath), ex); - } - } else { - addNewPendingJob(manifest); + setChanged(); + notifyObservers(Event.INPUT_SCAN_COMPLETED); // RJCTODO: Change this event name } } - /** - * Adds a job to process a manifest to the pending jobs queue. - * - * @param nodeData The data stored in the coordination service node for - * the manifest. - */ - private void addPendingJob(ManifestNodeData nodeData) { - Path caseDirectory = PathUtils.findCaseDirectory(rootOutputDirectory, nodeData.getCaseName()); - nodeData.setCompletedDate(new Date(0)); - nodeData.setErrorsOccurred(false); - newPendingJobsList.add(new AutoIngestJob(nodeData, caseDirectory, LOCAL_HOST_NAME, AutoIngestJob.Stage.PENDING)); - } - - /** - * Adds a job to process a manifest to the pending jobs queue. - * - * @param manifest The manifest. - * - * @throws InterruptedException if the thread running the input - * directory scan task is interrupted while - * blocked, i.e., if auto ingest is - * shutting down. - */ - private void addNewPendingJob(Manifest manifest) throws InterruptedException { - // TODO (JIRA-1960): This is something of a hack, grabbing the lock to create the node. - // Is use of Curator.create().forPath() possible instead? - try (CoordinationService.Lock manifestLock = coordinationService.tryGetExclusiveLock(CoordinationService.CategoryNode.MANIFESTS, manifest.getFilePath().toString())) { - if (null != manifestLock) { - ManifestNodeData newNodeData = new ManifestNodeData(manifest, PENDING, DEFAULT_JOB_PRIORITY, 0, new Date(0), false); - coordinationService.setNodeData(CoordinationService.CategoryNode.MANIFESTS, manifest.getFilePath().toString(), newNodeData.toArray()); - newPendingJobsList.add(new AutoIngestJob(newNodeData, null, LOCAL_HOST_NAME, AutoIngestJob.Stage.PENDING)); - } - } catch (CoordinationService.CoordinationServiceException ex) { - SYS_LOGGER.log(Level.SEVERE, String.format("Error attempting to set node data for %s", manifest.getFilePath()), ex); - } - } - - /** - * Does crash recovery for a manifest, if required. The criterion for - * crash recovery is a manifest with coordination service node data - * indicating it is being processed for which an exclusive lock on the - * node can be acquired. If this condition is true, it is probable that - * the node that was processing the job crashed and the processing - * status was not updated. - * - * @param nodeData - * - * @throws InterruptedException if the thread running the input - * directory scan task is interrupted while - * blocked, i.e., if auto ingest is - * shutting down. - */ - private void doRecoveryIfCrashed(ManifestNodeData nodeData) throws InterruptedException { - String manifestPath = nodeData.getManifestFilePath().toString(); - if (nodeData.coordSvcNodeDataWasSet() && ManifestNodeData.ProcessingStatus.PROCESSING == nodeData.getStatus()) { - SYS_LOGGER.log(Level.SEVERE, "Attempting crash recovery for {0}", manifestPath); - int numberOfCrashes = nodeData.getNumberOfCrashes(); - ++numberOfCrashes; - nodeData.setNumberOfCrashes(numberOfCrashes); - nodeData.setCompletedDate(new Date(0)); - nodeData.setErrorsOccurred(true); - if (numberOfCrashes <= AutoIngestUserPreferences.getMaxNumTimesToProcessImage()) { - nodeData.setStatus(PENDING); - Path caseDirectoryPath = PathUtils.findCaseDirectory(rootOutputDirectory, nodeData.getCaseName()); - newPendingJobsList.add(new AutoIngestJob(nodeData, caseDirectoryPath, LOCAL_HOST_NAME, AutoIngestJob.Stage.PENDING)); - if (null != caseDirectoryPath) { - try { - AutoIngestAlertFile.create(caseDirectoryPath); - } catch (AutoIngestAlertFile.AutoIngestAlertFileException ex) { - SYS_LOGGER.log(Level.SEVERE, String.format("Error creating alert file for crashed job for %s", manifestPath), ex); - } - try { - new AutoIngestJobLogger(nodeData.getManifestFilePath(), nodeData.getDataSourceFileName(), caseDirectoryPath).logCrashRecoveryWithRetry(); - } catch (AutoIngestJobLogger.AutoIngestJobLoggerException ex) { - SYS_LOGGER.log(Level.SEVERE, String.format("Error creating case auto ingest log entry for crashed job for %s", manifestPath), ex); - } - } - } else { - nodeData.setStatus(COMPLETED); - Path caseDirectoryPath = PathUtils.findCaseDirectory(rootOutputDirectory, nodeData.getCaseName()); - newCompletedJobsList.add(new AutoIngestJob(nodeData, caseDirectoryPath, LOCAL_HOST_NAME, AutoIngestJob.Stage.COMPLETED)); - if (null != caseDirectoryPath) { - try { - AutoIngestAlertFile.create(caseDirectoryPath); - } catch (AutoIngestAlertFile.AutoIngestAlertFileException ex) { - SYS_LOGGER.log(Level.SEVERE, String.format("Error creating alert file for crashed job for %s", manifestPath), ex); - } - try { - new AutoIngestJobLogger(nodeData.getManifestFilePath(), nodeData.getDataSourceFileName(), caseDirectoryPath).logCrashRecoveryNoRetry(); - } catch (AutoIngestJobLogger.AutoIngestJobLoggerException ex) { - SYS_LOGGER.log(Level.SEVERE, String.format("Error creating case auto ingest log entry for crashed job for %s", manifestPath), ex); - } - } - } - try { - coordinationService.setNodeData(CoordinationService.CategoryNode.MANIFESTS, manifestPath, nodeData.toArray()); - } catch (CoordinationService.CoordinationServiceException ex) { - SYS_LOGGER.log(Level.SEVERE, String.format("Error attempting to set node data for %s", manifestPath), ex); - } - } - } - - /** - * Adds a job to process a manifest to the completed jobs list. - * - * @param nodeData The data stored in the coordination service node for - * the manifest. - */ - private void addCompletedJob(ManifestNodeData nodeData) { - Path caseDirectoryPath = PathUtils.findCaseDirectory(rootOutputDirectory, nodeData.getCaseName()); - if (null != caseDirectoryPath) { - newCompletedJobsList.add(new AutoIngestJob(nodeData, caseDirectoryPath, LOCAL_HOST_NAME, AutoIngestJob.Stage.COMPLETED)); - } else { - SYS_LOGGER.log(Level.WARNING, String.format("Job completed for %s, but cannot find case directory, ignoring job", nodeData.getManifestFilePath())); - } - } - } - - /* - * The possible states of an auto ingest monitor. - */ - private enum State { - IDLE, - RUNNING, - SHUTTING_DOWN; } /* * Events published by an auto ingest monitor. The events are published - * locally to auto ingest monitor clients that register as observers and are - * broadcast to other auto ingest nodes. + * locally to auto ingest monitor clients that register as observers. */ enum Event { @@ -912,104 +373,153 @@ public final class AutoIngestMonitor extends Observable implements PropertyChang JOB_STATUS_UPDATED, JOB_COMPLETED, CASE_PRIORITIZED, - CASE_DELETED, - PAUSED_BY_REQUEST, - PAUSED_FOR_SYSTEM_ERROR, - RESUMED - } - - /** - * The current auto ingest error state. - */ - private enum ErrorState { - NONE("None"), - COORDINATION_SERVICE_ERROR("Coordination service error"), - SHARED_CONFIGURATION_DOWNLOAD_ERROR("Shared configuration download error"), - SERVICES_MONITOR_COMMUNICATION_ERROR("Services monitor communication error"), - DATABASE_SERVER_ERROR("Database server error"), - KEYWORD_SEARCH_SERVER_ERROR("Keyword search server error"), - CASE_MANAGEMENT_ERROR("Case management error"), - ANALYSIS_STARTUP_ERROR("Analysis startup error"), - FILE_EXPORT_ERROR("File export error"), - ALERT_FILE_ERROR("Alert file error"), - JOB_LOGGER_ERROR("Job logger error"), - DATA_SOURCE_PROCESSOR_ERROR("Data source processor error"), - UNEXPECTED_EXCEPTION("Unknown error"); - - private final String desc; - - private ErrorState(String desc) { - this.desc = desc; - } - - @Override - public String toString() { - return desc; - } + CASE_DELETED } /** * A snapshot of the pending jobs queue, running jobs list, and completed - * jobs list. + * jobs list for an auto ingest cluster. */ static final class JobsSnapshot { - private final List pendingJobs; - private final List runningJobs; - private final List completedJobs; + private final Set pendingJobs = new HashSet<>(); + private final Set runningJobs = new HashSet<>(); + private final Set completedJobs = new HashSet<>(); /** - * Constructs a snapshot of the pending jobs queue, running jobs list, - * and completed jobs list. + * Gets the snapshot of the pending jobs queue for an auto ingest + * cluster. * - * @param pendingJobs The pending jobs queue. - * @param runningJobs The running jobs list. - * @param completedJobs The cmopleted jobs list. - */ - private JobsSnapshot(List pendingJobs, List runningJobs, List completedJobs) { - this.pendingJobs = new ArrayList<>(pendingJobs); - this.runningJobs = new ArrayList<>(runningJobs); - this.completedJobs = new ArrayList<>(completedJobs); - } - - /** - * Gets the snapshot of the pending jobs queue. - * - * @return The jobs collection. + * @return The pending jobs queue. */ List getPendingJobs() { - return Collections.unmodifiableList(this.pendingJobs); + return new ArrayList<>(this.pendingJobs); } /** - * Gets the snapshot of the running jobs list. + * Gets the snapshot of the running jobs list for an auto ingest + * cluster. * - * @return The jobs collection. + * @return The running jobs list. */ List getRunningJobs() { - return Collections.unmodifiableList(this.runningJobs); + return new ArrayList<>(this.runningJobs); } /** - * Gets the snapshot of the completed jobs list. + * Gets the snapshot of the completed jobs list for an auto ingest + * cluster. * - * @return The jobs collection. + * @return The completed jobs list. */ List getCompletedJobs() { - return Collections.unmodifiableList(this.completedJobs); + return new ArrayList<>(this.completedJobs); + } + + /** + * Adds an auto job to the snapshot of the pending jobs queue for an + * auto ingest cluster. If an equivalent job already exists, it is + * removed. + * + * @param job The job. + */ + private void addOrReplacePendingJob(AutoIngestJob job) { + addOrReplaceJob(this.pendingJobs, job); + } + + /** + * Removes a job, if present, in the snapshot of the pending jobs queue + * for an auto ingest cluster. + * + * @param job The auot ingest job. + */ + private void removePendingJob(AutoIngestJob job) { + this.pendingJobs.remove(job); + } + + /** + * Adds an auto job to the snapshot of the running jobs list for an auto + * ingest cluster. If an equivalent job already exists, it is removed. + * + * @param job The job. + */ + private void addOrReplaceRunningJob(AutoIngestJob job) { + addOrReplaceJob(this.runningJobs, job); + } + + /** + * Removes a job, if present, in the snapshot of the running jobs list + * for an auto ingest cluster. + * + * @param job The auot ingest job. + */ + private void removeRunningJob(AutoIngestJob job) { + this.runningJobs.remove(job); + } + + /** + * Adds an auto job to the snapshot of the completed jobs list for an + * auto ingest cluster. If an equivalent job already exists, it is + * removed. + * + * @param job The job. + */ + private void addOrReplaceCompletedJob(AutoIngestJob job) { + addOrReplaceJob(this.completedJobs, job); + } + + /** + * Removes a job, if present, in the snapshot of the completed jobs list + * for an auto ingest cluster. + * + * @param job The auot ingest job. + */ + private void removeCompletedJob(AutoIngestJob job) { + this.pendingJobs.remove(job); + } + + /** + * Adds a job to a set. If an equivalent job already exists, it is + * removed. + * + * @param jobSet A set of auto ingest jobs. + * @param job The auto ingest job to add. + */ + private static void addOrReplaceJob(Set jobSet, AutoIngestJob job) { + if (jobSet.contains(job)) { + jobSet.remove(job); + } + jobSet.add(job); } } - static final class AutoIngestMonitorStartupException extends Exception { + /** + * Exception type thrown when there is an error completing an auto ingest + * monitor operation. + */ + static final class AutoIngestMonitorException extends Exception { private static final long serialVersionUID = 1L; - private AutoIngestMonitorStartupException(String message) { + /** + * Constructs an instance of the exception type thrown when there is an + * error completing an auto ingest monitor operation. + * + * @param message The exception message. + */ + private AutoIngestMonitorException(String message) { super(message); } - private AutoIngestMonitorStartupException(String message, Throwable cause) { + /** + * Constructs an instance of the exception type thrown when there is an + * error completing an auto ingest monitor operation. + * + * @param message The exception message. + * @param cause A Throwable cause for the error. + */ + private AutoIngestMonitorException(String message, Throwable cause) { super(message, cause); } From 1abff452d317b57e2d4a1985be3b676a6e95c166 Mon Sep 17 00:00:00 2001 From: Richard Cordovano Date: Thu, 7 Sep 2017 00:30:05 -0400 Subject: [PATCH 072/104] Some AID 2,0 modifications --- .../autoingest/AutoIngestDashboard.form | 83 +- .../autoingest/AutoIngestDashboard.java | 891 ++++++------------ .../AutoIngestDashboardTopComponent.java | 21 +- .../autoingest/AutoIngestJob.java | 2 + .../autoingest/AutoIngestManager.java | 2 +- .../autoingest/AutoIngestMonitor.java | 134 +-- .../experimental/autoingest/Bundle.properties | 10 +- 7 files changed, 376 insertions(+), 767 deletions(-) diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.form b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.form index d2cd3176c8..624f9db37d 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.form +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.form @@ -23,18 +23,8 @@ - - - - - - - - - - @@ -42,6 +32,11 @@ + + + + + @@ -50,10 +45,6 @@ - - - - @@ -73,8 +64,8 @@ - - + + @@ -184,56 +175,20 @@ - + - + - + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -258,5 +213,19 @@ + + + + + + + + + + + + + + diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java index 230d504f95..6717cb5e97 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java @@ -1,7 +1,7 @@ /* * Autopsy Forensic Browser * - * Copyright 2011-2017 Basis Technology Corp. + * Copyright 2011 - 2017 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -24,8 +24,6 @@ import java.awt.EventQueue; import java.nio.file.Path; import java.nio.file.Paths; import java.time.Instant; -import java.util.ArrayList; -import java.util.Comparator; import java.util.Date; import java.util.List; import java.util.Observable; @@ -36,9 +34,6 @@ import java.util.logging.Level; import javax.swing.DefaultListSelectionModel; import java.awt.Color; import java.beans.PropertyChangeEvent; -import java.util.Collections; -import java.util.logging.Logger; -import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JTable; import javax.swing.SwingWorker; @@ -46,21 +41,19 @@ import javax.swing.UIManager; import javax.swing.event.ListSelectionEvent; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableColumn; -import org.openide.LifecycleManager; +import org.openide.util.Exceptions; import org.openide.util.NbBundle; import org.sleuthkit.autopsy.core.ServicesMonitor; -import org.sleuthkit.autopsy.coreutils.NetworkUtils; +import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.experimental.autoingest.AutoIngestMonitor.JobsSnapshot; -import org.sleuthkit.autopsy.ingest.IngestManager; /** - * A panel for monitoring automated ingest by a cluster, and for controlling - * automated ingest for a single node within the cluster. There can be at most - * one such panel per node. + * A panel for monitoring an automated ingest cluster. */ public final class AutoIngestDashboard extends JPanel implements Observer { private static final long serialVersionUID = 1L; + private static final Logger LOGGER = Logger.getLogger(AutoIngestDashboard.class.getName()); private static final int GENERIC_COL_MIN_WIDTH = 30; private static final int GENERIC_COL_MAX_WIDTH = 2000; private static final int PENDING_TABLE_COL_PREFERRED_WIDTH = 280; @@ -83,91 +76,37 @@ public final class AutoIngestDashboard extends JPanel implements Observer { private static final int COMPLETED_TIME_COL_MAX_WIDTH = 2000; private static final int COMPLETED_TIME_COL_PREFERRED_WIDTH = 280; private static final String UPDATE_TASKS_THREAD_NAME = "AID-update-tasks-%d"; - private static final String LOCAL_HOST_NAME = NetworkUtils.getLocalHostName(); - private static final Logger SYS_LOGGER = AutoIngestSystemLogger.getLogger(); - private static AutoIngestDashboard instance; private final DefaultTableModel pendingTableModel; private final DefaultTableModel runningTableModel; private final DefaultTableModel completedTableModel; private AutoIngestMonitor autoIngestMonitor; private ExecutorService updateExecutor; - private boolean isPaused; - private boolean autoIngestStarted; - private Color pendingTableBackground; - private Color pendingTablelForeground; - - /* - * The enum is used in conjunction with the DefaultTableModel class to - * provide table models for the JTables used to display a view of the - * pending jobs queue, running jobs list, and completed jobs list. The enum - * allows the columns of the table model to be described by either an enum - * ordinal or a column header string. - */ - private enum JobsTableModelColumns { - - CASE(NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.Case")), - DATA_SOURCE(NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.ImageFolder")), - HOST_NAME(NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.HostName")), - CREATED_TIME(NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.CreatedTime")), - STARTED_TIME(NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.StartedTime")), - COMPLETED_TIME(NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.CompletedTime")), - STAGE(NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.Stage")), - STAGE_TIME(NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.StageTime")), - STATUS(NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.Status")), - CASE_DIRECTORY_PATH(NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.CaseFolder")), - IS_LOCAL_JOB(NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.LocalJob")), - MANIFEST_FILE_PATH(NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.ManifestFilePath")); - - private final String header; - - private JobsTableModelColumns(String header) { - this.header = header; - } - - private String getColumnHeader() { - return header; - } - - private static final String[] headers = { - CASE.getColumnHeader(), - DATA_SOURCE.getColumnHeader(), - HOST_NAME.getColumnHeader(), - CREATED_TIME.getColumnHeader(), - STARTED_TIME.getColumnHeader(), - COMPLETED_TIME.getColumnHeader(), - STAGE.getColumnHeader(), - STATUS.getColumnHeader(), - STAGE_TIME.getColumnHeader(), - CASE_DIRECTORY_PATH.getColumnHeader(), - IS_LOCAL_JOB.getColumnHeader(), - MANIFEST_FILE_PATH.getColumnHeader()}; - } + // DLG: The Viking code needs to be updated, too. See VikingStartupWindow, + // which should be using the AutoIngestControlPanel, not the AutoIngestDashboard. + // Viking will not compile with this code. /** - * Gets the singleton automated ingest control and monitoring panel for this - * cluster node. + * Creates a dashboard panel for monitoring an automated ingest cluster. * - * @return The panel. + * @return The dashboard panel. + * + * @throws AutoIngestDashboardException If there is a problem creating the + * dashboard panel. */ - public static AutoIngestDashboard getInstance() { - if (null == instance) { - /* - * Two stage construction is used here to avoid publishing a - * reference to the panel to the Observable auto ingest monitor - * before object construction is complete. - */ - instance = new AutoIngestDashboard(); + public static AutoIngestDashboard createDashboard() throws AutoIngestDashboardException { + AutoIngestDashboard dashBoard = new AutoIngestDashboard(); + try { + dashBoard.startUp(); + } catch (AutoIngestMonitor.AutoIngestMonitorException ex) { + throw new AutoIngestDashboardException("Error starting up auto ingest dashboard", ex); } - return instance; + return dashBoard; } /** - * Constructs a panel for monitoring automated ingest by a cluster, and for - * controlling automated ingest for a single node within the cluster. + * Constructs a panel for monitoring an automated ingest cluster. */ private AutoIngestDashboard() { - autoIngestMonitor = AutoIngestMonitor.createMonitor(); - pendingTableModel = new DefaultTableModel(JobsTableModelColumns.headers, 0) { private static final long serialVersionUID = 1L; @@ -195,12 +134,11 @@ public final class AutoIngestDashboard extends JPanel implements Observer { } }; - initComponents(); // Generated code. + initComponents(); setServicesStatusMessage(); initPendingJobsTable(); initRunningJobsTable(); initCompletedJobsTable(); - initButtons(); /* * Must set this flag, otherwise pop up menus don't close properly. @@ -214,7 +152,6 @@ public final class AutoIngestDashboard extends JPanel implements Observer { */ private void setServicesStatusMessage() { new SwingWorker() { - String caseDatabaseServerStatus = ServicesMonitor.ServiceStatus.DOWN.toString(); String keywordSearchServiceStatus = ServicesMonitor.ServiceStatus.DOWN.toString(); String messagingStatus = ServicesMonitor.ServiceStatus.DOWN.toString(); @@ -245,7 +182,7 @@ public final class AutoIngestDashboard extends JPanel implements Observer { serviceStatus = NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.tbServicesStatusMessage.Message.Down"); } } catch (ServicesMonitor.ServicesMonitorException ex) { - SYS_LOGGER.log(Level.SEVERE, String.format("Dashboard error getting service status for %s", service), ex); + LOGGER.log(Level.SEVERE, String.format("Dashboard error getting service status for %s", service), ex); } return serviceStatus; } @@ -267,8 +204,8 @@ public final class AutoIngestDashboard extends JPanel implements Observer { } /** - * Sets up the JTable that presents a view of the system-wide pending jobs - * queue. + * Sets up the JTable that presents a view of the pending jobs queue for an + * auto ingest cluster. */ private void initPendingJobsTable() { /* @@ -281,7 +218,6 @@ public final class AutoIngestDashboard extends JPanel implements Observer { pendingTable.removeColumn(pendingTable.getColumn(JobsTableModelColumns.STAGE.getColumnHeader())); pendingTable.removeColumn(pendingTable.getColumn(JobsTableModelColumns.STAGE_TIME.getColumnHeader())); pendingTable.removeColumn(pendingTable.getColumn(JobsTableModelColumns.CASE_DIRECTORY_PATH.getColumnHeader())); - pendingTable.removeColumn(pendingTable.getColumn(JobsTableModelColumns.IS_LOCAL_JOB.getColumnHeader())); pendingTable.removeColumn(pendingTable.getColumn(JobsTableModelColumns.STATUS.getColumnHeader())); pendingTable.removeColumn(pendingTable.getColumn(JobsTableModelColumns.MANIFEST_FILE_PATH.getColumnHeader())); @@ -296,8 +232,7 @@ public final class AutoIngestDashboard extends JPanel implements Observer { column.setWidth(PENDING_TABLE_COL_PREFERRED_WIDTH); /* - * Set up a column to display the image folders associated with the - * jobs. + * Set up a column to display the data sources associated with the jobs. */ column = pendingTable.getColumn(JobsTableModelColumns.DATA_SOURCE.getColumnHeader()); column.setMaxWidth(GENERIC_COL_MAX_WIDTH); @@ -330,18 +265,11 @@ public final class AutoIngestDashboard extends JPanel implements Observer { int row = pendingTable.getSelectedRow(); }); - /* - * Save the background color of the table so it can be restored on - * resume, after being grayed out on pause. Note the assumption that all - * of the tables use the same background color. - */ - pendingTableBackground = pendingTable.getBackground(); - pendingTablelForeground = pendingTable.getForeground(); } /** - * Sets up the JTable that presents a view of the system-wide running jobs - * list. + * Sets up the JTable that presents a view of the running jobs list for an + * auto ingest cluster. */ private void initRunningJobsTable() { /* @@ -353,7 +281,6 @@ public final class AutoIngestDashboard extends JPanel implements Observer { runningTable.removeColumn(runningTable.getColumn(JobsTableModelColumns.COMPLETED_TIME.getColumnHeader())); runningTable.removeColumn(runningTable.getColumn(JobsTableModelColumns.STATUS.getColumnHeader())); runningTable.removeColumn(runningTable.getColumn(JobsTableModelColumns.CASE_DIRECTORY_PATH.getColumnHeader())); - runningTable.removeColumn(runningTable.getColumn(JobsTableModelColumns.IS_LOCAL_JOB.getColumnHeader())); runningTable.removeColumn(runningTable.getColumn(JobsTableModelColumns.MANIFEST_FILE_PATH.getColumnHeader())); /* @@ -414,8 +341,8 @@ public final class AutoIngestDashboard extends JPanel implements Observer { } /** - * Sets up the JTable that presents a view of the system-wide competed jobs - * list. + * Sets up the JTable that presents a view of the completed jobs list for an + * auto ingest cluster. */ private void initCompletedJobsTable() { /* @@ -425,7 +352,6 @@ public final class AutoIngestDashboard extends JPanel implements Observer { completedTable.removeColumn(completedTable.getColumn(JobsTableModelColumns.STARTED_TIME.getColumnHeader())); completedTable.removeColumn(completedTable.getColumn(JobsTableModelColumns.STAGE.getColumnHeader())); completedTable.removeColumn(completedTable.getColumn(JobsTableModelColumns.STAGE_TIME.getColumnHeader())); - completedTable.removeColumn(completedTable.getColumn(JobsTableModelColumns.IS_LOCAL_JOB.getColumnHeader())); completedTable.removeColumn(completedTable.getColumn(JobsTableModelColumns.HOST_NAME.getColumnHeader())); completedTable.removeColumn(completedTable.getColumn(JobsTableModelColumns.CASE_DIRECTORY_PATH.getColumnHeader())); completedTable.removeColumn(completedTable.getColumn(JobsTableModelColumns.MANIFEST_FILE_PATH.getColumnHeader())); @@ -500,433 +426,44 @@ public final class AutoIngestDashboard extends JPanel implements Observer { }); } - /** - * Sets the initial state of the buttons on the panel. - */ - private void initButtons() { - bnPause.setText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnStart.text")); - bnPause.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnStart.toolTipText")); - bnPause.setEnabled(true); //initial label for bnPause is 'Start' and it's enabled for user to start the process - bnRefresh.setEnabled(false); //at initial stage, nothing to refresh - tbStatusMessage.setText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnStart.startMessage")); - } - /** * Starts up the auto ingest monitor and adds this panel as an observer, * subscribes to services monitor events and starts a task to populate the - * auto ingest job tables. The Refresh and Pause buttons are enabled. + * auto ingest job tables. */ - private void startUp() { - - /* - * Starts up the auto ingest monitor (AIM). - */ - try { - autoIngestMonitor.startUp(); - autoIngestStarted = true; - } catch (AutoIngestMonitor.AutoIngestMonitorException ex) { - SYS_LOGGER.log(Level.SEVERE, "Dashboard error starting up auto ingest", ex); - tbStatusMessage.setText(NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.AutoIngestStartupError")); - autoIngestMonitor = null; - - JOptionPane.showMessageDialog(this, - NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.AutoIngestStartupFailed.Message"), - NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.AutoIngestStartupFailed.Title"), - JOptionPane.ERROR_MESSAGE); - - /* - * If the AIM cannot be started, there is nothing more to do. - */ - return; - } - - /* - * Subscribe to services monitor events. - */ + private void startUp() throws AutoIngestMonitor.AutoIngestMonitorException { + autoIngestMonitor = AutoIngestMonitor.createMonitor(); + autoIngestMonitor.addObserver(this); + updateExecutor = Executors.newSingleThreadExecutor(new ThreadFactoryBuilder().setNameFormat(UPDATE_TASKS_THREAD_NAME).build()); + updateExecutor.submit(new GetJobsSnapshotTask()); ServicesMonitor.getInstance().addSubscriber((PropertyChangeEvent evt) -> { setServicesStatusMessage(); }); - - /* - * Register with the AIM as an observer. - */ - autoIngestMonitor.addObserver(this); - - /* - * Populate the pending, running, and completed auto ingest job tables. - */ - updateExecutor = Executors.newSingleThreadExecutor(new ThreadFactoryBuilder().setNameFormat(UPDATE_TASKS_THREAD_NAME).build()); - updateExecutor.submit(new UpdateAllJobsTablesTask()); - autoIngestMonitor.queryCoordinationService(); - - //bnPause.setEnabled(true); - bnPause.setText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnPause.text")); - bnPause.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnPause.toolTipText")); - bnRefresh.setEnabled(true); - - tbStatusMessage.setText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnPause.running")); } - /** - * Shuts down auto ingest by shutting down the auto ingest monitor and doing - * an application exit. - */ - public void shutdown() { - /* - * Confirm that the user wants to proceed, letting him or her no that if - * there is a currently running job it will be cancelled. TODO (RC): If - * a wait cursor is provided, this could perhaps be made conditional on - * a running job check again. Or the simple check in isLocalJobRunning - * could be used. Was this previously used and I removed it thinking it - * was grabbing the monitor? - */ - Object[] options = { - NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.OK"), - NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.Cancel")}; - int reply = JOptionPane.OK_OPTION; - - if (IngestManager.getInstance().isIngestRunning()) { - reply = JOptionPane.showOptionDialog(this, - NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.ExitConsequences"), - NbBundle.getMessage(AutoIngestDashboard.class, "ConfirmationDialog.ConfirmExitHeader"), - JOptionPane.DEFAULT_OPTION, - JOptionPane.WARNING_MESSAGE, - null, - options, - options[JOptionPane.NO_OPTION]); - } - if (reply == JOptionPane.OK_OPTION) { - /* - * Provide user feedback. Call setCursor on this to ensure it - * appears (if there is time to see it). - */ - this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); - tbStatusMessage.setText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.ExitingStatus")); - - /* - * Shut down the table refresh task executor. - */ - if (null != updateExecutor) { - updateExecutor.shutdownNow(); - } - - /* - * Shut down the AIM and close. - */ - new SwingWorker() { - - @Override - protected Void doInBackground() throws Exception { - return null; - } - - @Override - protected void done() { - AutoIngestDashboard.this.setCursor(Cursor.getDefaultCursor()); - LifecycleManager.getDefault().exit(); - } - }.execute(); - } - } - - /** - * @inheritDoc - */ - @NbBundle.Messages({ - "AutoIngestDashboard.bnPause.paused=Paused", - "AutoIngestDashboard.PauseDueToDatabaseServiceDown=Paused, unable to communicate with case database service.", - "AutoIngestDashboard.PauseDueToKeywordSearchServiceDown=Paused, unable to communicate with keyword search service.", - "AutoIngestDashboard.PauseDueToCoordinationServiceDown=Paused, unable to communicate with coordination service.", - "AutoIngestDashboard.PauseDueToWriteStateFilesFailure=Paused, unable to write to shared images or cases location.", - "AutoIngestDashboard.PauseDueToSharedConfigError=Paused, unable to update shared configuration.", - "AutoIngestDashboard.PauseDueToIngestJobStartFailure=Paused, unable to start ingest job processing.", - "AutoIngestDashboard.PauseDueToFileExporterError=Paused, unable to load File Exporter settings.", - "AutoIngestDashboard.bnPause.running=Running", - "AutoIngestDashboard.bnStart.startMessage=Waiting to start", - "AutoIngestDashboard.bnStart.text=Start", - "AutoIngestDashboard.bnStart.toolTipText=Start processing auto ingest jobs" - }) @Override - public void update(Observable o, Object arg) { - - if (arg instanceof AutoIngestMonitor.Event) { - switch ((AutoIngestMonitor.Event) arg) { - case INPUT_SCAN_COMPLETED: - case JOB_STARTED: - case JOB_COMPLETED: - case CASE_DELETED: - updateExecutor.submit(new UpdateAllJobsTablesTask()); - break; - case CASE_PRIORITIZED: - updateExecutor.submit(new UpdatePendingJobsTableTask()); - break; - case JOB_STATUS_UPDATED: - updateExecutor.submit(new UpdateRunningJobsTablesTask()); - break; - default: - break; - } - } + public void update(Observable observable, Object argument) { + updateExecutor.submit(new GetJobsSnapshotTask()); } /** - * Requests a pause of auto ingest processing by the auto ingest monitor and - * handles updates to the components that implement the pause and resume - * feature. Note that this feature is needed to get around restrictions on - * changing ingest module selections and settings while an ingest job is - * running, and that the auto ingest monitor will not actually pause until - * the current auto ingest job completes. + * Reloads the table models using a jobs snapshot and refreshes the JTables + * that use the models. * - * @param buttonClicked Is this pause request in response to a user gesture - * or a nofification from the auto ingest monitor - * (AIM)? + * @param jobsSnapshot The jobs snapshot. */ - private void pause(boolean buttonClicked) { - /** - * Gray out the cells in the pending table to give a visual indicator of - * the pausing/paused state. - */ - pendingTable.setBackground(Color.LIGHT_GRAY); - pendingTable.setForeground(Color.DARK_GRAY); - - /** - * Change the pause button text and tool tip to make it a resume button. - */ - bnPause.setText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnResume.text")); - bnPause.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnPause.toolTipTextResume")); - - if (buttonClicked) { - /** - * Ask the auto ingest monitor to pause when it completes the - * currently running job, if any. - */ - bnRefresh.setEnabled(false); - } + private void refreshTables(JobsSnapshot jobsSnapshot) { + List pendingJobs = jobsSnapshot.getPendingJobs(); + List runningJobs = jobsSnapshot.getRunningJobs(); + List completedJobs = jobsSnapshot.getCompletedJobs(); + // DLG: Do the appropriate sorts. + refreshTable(pendingJobs, pendingTable, pendingTableModel); + refreshTable(runningJobs, runningTable, runningTableModel); + refreshTable(completedJobs, completedTable, completedTableModel); } /** - * Requests a resume of auto ingest processing by the auto ingest monitor - * and handles updates to the components that implement the pause and resume - * feature. Note that this feature is needed to get around restrictions on - * changing ingest module selections and settings while an ingest job is - * running, and that the auto ingest monitor will not actually pause until - * the current auto ingest job completes. - */ - private void resume() { - /** - * Change the resume button text and tool tip to make it a pause button. - */ - bnPause.setText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnPause.text")); - bnPause.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnPause.toolTipText")); - tbStatusMessage.setText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnPause.running")); - bnRefresh.setEnabled(true); - - /** - * Remove the graying out of the pending table. - */ - pendingTable.setBackground(pendingTableBackground); - pendingTable.setForeground(pendingTablelForeground); - } - - /** - * A runnable task that gets the pending auto ingest jobs list from the auto - * ingest monitor and queues a components refresh task for execution in the - * EDT. - */ - private class UpdatePendingJobsTableTask implements Runnable { - - /** - * @inheritDoc - */ - @Override - public void run() { - List pendingJobs = new ArrayList<>(); - autoIngestMonitor.getJobs(pendingJobs, null, null); - EventQueue.invokeLater(new RefreshComponentsTask(pendingJobs, null, null)); - } - } - - /** - * A runnable task that gets the running auto ingest jobs list from the auto - * ingest monitor and queues a components refresh task for execution in the - * EDT. - */ - private class UpdateRunningJobsTablesTask implements Runnable { - - /** - * @inheritDoc - */ - @Override - public void run() { - List runningJobs = new ArrayList<>(); - autoIngestMonitor.getJobs(null, runningJobs, null); - EventQueue.invokeLater(new RefreshComponentsTask(null, runningJobs, null)); - } - } - - /** - * A runnable task that gets the pending, running and completed auto ingest - * jobs lists from the auto ingest monitor and queues a components refresh - * task for execution in the EDT. Note that this task is frequently used - * when only the pending and updated lists definitely need to be updated. - * This is because the cost of updating the running jobs list is both very - * small and it is beneficial to keep running job status up to date if there - * is a running job. - */ - private class UpdateAllJobsTablesTask implements Runnable { - - /** - * @inheritDoc - */ - @Override - public void run() { - List pendingJobs = new ArrayList<>(); - List runningJobs = new ArrayList<>(); - List completedJobs = new ArrayList<>(); - autoIngestMonitor.getJobs(pendingJobs, runningJobs, completedJobs); - // Sort the completed jobs list by completed date - Collections.sort(completedJobs, new AutoIngestJob.ReverseDateCompletedComparator()); - EventQueue.invokeLater(new RefreshComponentsTask(pendingJobs, runningJobs, completedJobs)); - } - } - - /** - * A runnable task that refreshes the components on this panel to reflect - * the current state of one or more auto ingest job lists obtained from the - * auto ingest monitor. - */ - private class RefreshComponentsTask implements Runnable { - - private final List pendingJobs; - private final List runningJobs; - private final List completedJobs; - - /** - * Constructs a runnable task that refreshes the components on this - * panel to reflect the current state of the auto ingest jobs. - * - * @param pendingJobs A list of pending jobs, may be null if the - * pending jobs are unchanged. - * @param runningJobs A list of running jobs, may be null if the - * running jobs are unchanged. - * @param completedJobs A list of completed jobs, may be null if the - * completed jobs are unchanged. - */ - RefreshComponentsTask(List pendingJobs, List runningJobs, List completedJobs) { - this.pendingJobs = pendingJobs; - this.runningJobs = runningJobs; - this.completedJobs = completedJobs; - } - - /** - * @inheritDoc - */ - @Override - public void run() { - /* - * NOTE: There is a problem with our approach of preserving table - * row selections - what if the number of rows has changed as result - * of calling refreshTable(). Then it is possible for what used to - * be (for example) row 1 to now be in some other row or be removed - * from the table. This code will re-set the selection back to what - * it used to be before calling refreshTable(), i.e. row 1 - */ - - if (null != pendingJobs) { - Path currentRow = getSelectedEntry(pendingTable, pendingTableModel); - refreshTable(pendingJobs, pendingTableModel, null); - setSelectedEntry(pendingTable, pendingTableModel, currentRow); - } - - if (null != runningJobs) { - Path currentRow = getSelectedEntry(runningTable, runningTableModel); - refreshTable(runningJobs, runningTableModel, null); - setSelectedEntry(runningTable, runningTableModel, currentRow); - } - - if (null != completedJobs) { - Path currentRow = getSelectedEntry(completedTable, completedTableModel); - refreshTable(completedJobs, completedTableModel, null); - setSelectedEntry(completedTable, completedTableModel, currentRow); - } - } - - /** - * Checks whether there is a job that is running on local AIN. - * - * @return true is local job is found, false otherwise. - */ - private boolean isLocalJobRunning() { - for (AutoIngestJob job : runningJobs) { - if (isLocalJob(job)) { - return true; - } - } - return false; - } - - /** - * Checks whether or not an automated ingest job is local to this node. - * - * @param job The job. - * - * @return True or fale. - */ - private boolean isLocalJob(AutoIngestJob job) { - return job.getNodeName().equals(LOCAL_HOST_NAME); - } - - /** - * Get a path representing the current selection on the table passed in. - * If there is no selection, return null. - * - * @param table The table to get - * @param tableModel The tableModel of the table to get - * - * @return a path representing the current selection - */ - Path getSelectedEntry(JTable table, DefaultTableModel tableModel) { - try { - int currentlySelectedRow = table.getSelectedRow(); - if (currentlySelectedRow >= 0 && currentlySelectedRow < table.getRowCount()) { - return Paths.get(tableModel.getValueAt(currentlySelectedRow, JobsTableModelColumns.CASE.ordinal()).toString(), - tableModel.getValueAt(currentlySelectedRow, JobsTableModelColumns.DATA_SOURCE.ordinal()).toString()); - } - } catch (Exception ignored) { - return null; - } - return null; - } - - /** - * Set the selection on the table to the passed-in path's item, if that - * item exists in the table. If it does not, clears the table selection. - * - * @param table The table to set - * @param tableModel The tableModel of the table to set - * @param path The path of the item to set - */ - void setSelectedEntry(JTable table, DefaultTableModel tableModel, Path path) { - if (path != null) { - try { - for (int row = 0; row < table.getRowCount(); ++row) { - Path temp = Paths.get(tableModel.getValueAt(row, JobsTableModelColumns.CASE.ordinal()).toString(), - tableModel.getValueAt(row, JobsTableModelColumns.DATA_SOURCE.ordinal()).toString()); - if (temp.compareTo(path) == 0) { // found it - table.setRowSelectionInterval(row, row); - return; - } - } - } catch (Exception ignored) { - table.clearSelection(); - } - } - table.clearSelection(); - } - } - - /** - * Reloads the table model for an auto ingest jobs table, refreshing the + * Reloads the table model for an auto ingest jobs table and refreshes the * JTable that uses the model. * * @param jobs The list of auto ingest jobs. @@ -934,14 +471,12 @@ public final class AutoIngestDashboard extends JPanel implements Observer { * @param comparator An optional comparator (may be null) for sorting the * table model. */ - private void refreshTable(List jobs, DefaultTableModel tableModel, Comparator comparator) { + private void refreshTable(List jobs, JTable table, DefaultTableModel tableModel) { try { - if (comparator != null) { - jobs.sort(comparator); - } + Path currentRow = getSelectedEntry(table, tableModel); tableModel.setRowCount(0); for (AutoIngestJob job : jobs) { - if(job.getNodeData().getVersion() < 2) { + if (job.getNodeData().getVersion() < 2) { // Ignore version '1' nodes since they don't carry enough // data to populate the table. continue; @@ -959,22 +494,60 @@ public final class AutoIngestDashboard extends JPanel implements Observer { nodeData.getErrorsOccurred(), // STATUS ((Date.from(Instant.now()).getTime()) - (status.getStartDate().getTime())), // ACTIVITY_TIME job.getCaseDirectoryPath(), // CASE_DIRECTORY_PATH - job.getNodeName().equals(LOCAL_HOST_NAME), // IS_LOCAL_JOB nodeData.getManifestFilePath()}); // MANIFEST_FILE_PATH } + setSelectedEntry(table, tableModel, currentRow); } catch (Exception ex) { - SYS_LOGGER.log(Level.SEVERE, "Dashboard error refreshing table", ex); + LOGGER.log(Level.SEVERE, "Error refreshing table " + table.toString(), ex); } } - + /** - * Get the current lists of jobs and update the UI. + * Gets a path representing the current selection in a table. + * + * @param table The table. + * @param tableModel The table model of the table. + * + * @return A path representing the current selection, or null if there is no + * selection. */ - private void refreshTables(){ - JobsSnapshot jobsSnapshot = autoIngestMonitor.getCurrentJobsSnapshot(); - refreshTable(jobsSnapshot.getCompletedJobs(), completedTableModel, null); - refreshTable(jobsSnapshot.getPendingJobs(), pendingTableModel, null); - refreshTable(jobsSnapshot.getRunningJobs(), runningTableModel, null); + Path getSelectedEntry(JTable table, DefaultTableModel tableModel) { + try { + int currentlySelectedRow = table.getSelectedRow(); + if (currentlySelectedRow >= 0 && currentlySelectedRow < table.getRowCount()) { + return Paths.get(tableModel.getValueAt(currentlySelectedRow, JobsTableModelColumns.CASE.ordinal()).toString(), + tableModel.getValueAt(currentlySelectedRow, JobsTableModelColumns.DATA_SOURCE.ordinal()).toString()); + } + } catch (Exception ignored) { + return null; + } + return null; + } + + /** + * Sets the selection of the table to the passed-in path's item, if that + * item exists in the table. If it does not, clears the table selection. + * + * @param table The table. + * @param tableModel The table model of the table. + * @param path The path of the item to set + */ + void setSelectedEntry(JTable table, DefaultTableModel tableModel, Path path) { + if (path != null) { + try { + for (int row = 0; row < table.getRowCount(); ++row) { + Path temp = Paths.get(tableModel.getValueAt(row, JobsTableModelColumns.CASE.ordinal()).toString(), + tableModel.getValueAt(row, JobsTableModelColumns.DATA_SOURCE.ordinal()).toString()); + if (temp.compareTo(path) == 0) { // found it + table.setRowSelectionInterval(row, row); + return; + } + } + } catch (Exception ignored) { + table.clearSelection(); + } + } + table.clearSelection(); } /** @@ -995,12 +568,10 @@ public final class AutoIngestDashboard extends JPanel implements Observer { lbPending = new javax.swing.JLabel(); lbRunning = new javax.swing.JLabel(); lbCompleted = new javax.swing.JLabel(); - bnRefresh = new javax.swing.JButton(); - bnPause = new javax.swing.JButton(); - tbStatusMessage = new javax.swing.JTextField(); - lbStatus = new javax.swing.JLabel(); + refreshButton = new javax.swing.JButton(); lbServicesStatus = new javax.swing.JLabel(); tbServicesStatusMessage = new javax.swing.JTextField(); + prioritizeButton = new javax.swing.JButton(); pendingTable.setModel(pendingTableModel); pendingTable.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.pendingTable.toolTipText")); // NOI18N @@ -1065,30 +636,15 @@ public final class AutoIngestDashboard extends JPanel implements Observer { lbCompleted.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N org.openide.awt.Mnemonics.setLocalizedText(lbCompleted, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.lbCompleted.text")); // NOI18N - org.openide.awt.Mnemonics.setLocalizedText(bnRefresh, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnRefresh.text")); // NOI18N - bnRefresh.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnRefresh.toolTipText")); // NOI18N - bnRefresh.addActionListener(new java.awt.event.ActionListener() { + org.openide.awt.Mnemonics.setLocalizedText(refreshButton, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.refreshButton.text")); // NOI18N + refreshButton.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.refreshButton.toolTipText")); // NOI18N + refreshButton.setEnabled(false); + refreshButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { - bnRefreshActionPerformed(evt); + refreshButtonActionPerformed(evt); } }); - org.openide.awt.Mnemonics.setLocalizedText(bnPause, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnPause.text")); // NOI18N - bnPause.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnPause.toolTipText")); // NOI18N - bnPause.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - bnPauseActionPerformed(evt); - } - }); - - tbStatusMessage.setEditable(false); - tbStatusMessage.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N - tbStatusMessage.setText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.tbStatusMessage.text")); // NOI18N - tbStatusMessage.setBorder(null); - - lbStatus.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N - org.openide.awt.Mnemonics.setLocalizedText(lbStatus, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.lbStatus.text")); // NOI18N - lbServicesStatus.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N org.openide.awt.Mnemonics.setLocalizedText(lbServicesStatus, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.lbServicesStatus.text")); // NOI18N @@ -1097,6 +653,15 @@ public final class AutoIngestDashboard extends JPanel implements Observer { tbServicesStatusMessage.setText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.tbServicesStatusMessage.text")); // NOI18N tbServicesStatusMessage.setBorder(null); + org.openide.awt.Mnemonics.setLocalizedText(prioritizeButton, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.prioritizeButton.text")); // NOI18N + prioritizeButton.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.prioritizeButton.toolTipText")); // NOI18N + prioritizeButton.setEnabled(false); + prioritizeButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + prioritizeButtonActionPerformed(evt); + } + }); + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup( @@ -1107,34 +672,24 @@ public final class AutoIngestDashboard extends JPanel implements Observer { .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) .addComponent(lbPending, javax.swing.GroupLayout.Alignment.LEADING) .addComponent(pendingScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 920, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addGroup(layout.createSequentialGroup() - .addComponent(bnPause) - .addGap(18, 18, 18) - .addComponent(bnRefresh, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE)) .addComponent(runningScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 920, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(completedScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 920, javax.swing.GroupLayout.PREFERRED_SIZE) - .addGroup(layout.createSequentialGroup() - .addComponent(lbStatus) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addComponent(tbStatusMessage, javax.swing.GroupLayout.PREFERRED_SIZE, 861, javax.swing.GroupLayout.PREFERRED_SIZE)) .addComponent(lbCompleted) .addComponent(lbRunning) .addGroup(layout.createSequentialGroup() .addComponent(lbServicesStatus) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addComponent(tbServicesStatusMessage, javax.swing.GroupLayout.PREFERRED_SIZE, 861, javax.swing.GroupLayout.PREFERRED_SIZE))) + .addComponent(tbServicesStatusMessage, javax.swing.GroupLayout.PREFERRED_SIZE, 861, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGroup(layout.createSequentialGroup() + .addComponent(refreshButton, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(prioritizeButton, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE))) .addContainerGap(140, Short.MAX_VALUE)) ); - - layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {bnPause, bnRefresh}); - layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(lbStatus, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(tbStatusMessage, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(lbServicesStatus, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(tbServicesStatusMessage, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) @@ -1152,63 +707,187 @@ public final class AutoIngestDashboard extends JPanel implements Observer { .addComponent(completedScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 179, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(bnPause) - .addComponent(bnRefresh)) + .addComponent(refreshButton) + .addComponent(prioritizeButton)) .addContainerGap()) ); }// //GEN-END:initComponents - private void bnPauseActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnPauseActionPerformed - - if (!autoIngestStarted) { - //put up a wait cursor during the start up operation - this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); - - startUp(); - - this.setCursor(null); - //done for startup - return; - } - if (!isPaused) { - tbStatusMessage.setText(org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.bnPause.pausing")); - pause(true); - } else { - resume(); - } - isPaused = !isPaused; - }//GEN-LAST:event_bnPauseActionPerformed - /** - * Handles a click on the refresh button. Requests an immediate scan of the - * input folders for new jobs and queues a refresh of all three of the jobs - * tables. - * - * @param evt - The button click event. + * Handles a click on the Refresh button. Requests a refreshed jobs snapshot + * from the auto ingest monitor and uses it to refresh the UI components of + * the panel. + * + * @param evt The button click event. */ - private void bnRefreshActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnRefreshActionPerformed - this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); - autoIngestMonitor.scanInputDirsAndWait(); - refreshTables(); - this.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); - }//GEN-LAST:event_bnRefreshActionPerformed + private void refreshButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_refreshButtonActionPerformed + setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + JobsSnapshot jobsSnapshot = autoIngestMonitor.refreshJobsSnapshot(); + refreshTables(jobsSnapshot); + setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); + }//GEN-LAST:event_refreshButtonActionPerformed + + private void prioritizeButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_prioritizeButtonActionPerformed + if (pendingTableModel.getRowCount() > 0 && pendingTable.getSelectedRow() >= 0) { + setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + Path manifestFilePath = (Path) (pendingTableModel.getValueAt(pendingTable.getSelectedRow(), JobsTableModelColumns.MANIFEST_FILE_PATH.ordinal())); + JobsSnapshot jobsSnapshot; + try { + jobsSnapshot = autoIngestMonitor.prioritizeJob(manifestFilePath); + refreshTables(jobsSnapshot); + } catch (AutoIngestMonitor.AutoIngestMonitorException ex) { + // DLG: Log the exception and do a popup with a user-friendly + // message explaining that the operation failed + } + setCursor(Cursor.getDefaultCursor()); + } + }//GEN-LAST:event_prioritizeButtonActionPerformed // Variables declaration - do not modify//GEN-BEGIN:variables - private javax.swing.JButton bnPause; - private javax.swing.JButton bnRefresh; private javax.swing.JScrollPane completedScrollPane; private javax.swing.JTable completedTable; private javax.swing.JLabel lbCompleted; private javax.swing.JLabel lbPending; private javax.swing.JLabel lbRunning; private javax.swing.JLabel lbServicesStatus; - private javax.swing.JLabel lbStatus; private javax.swing.JScrollPane pendingScrollPane; private javax.swing.JTable pendingTable; + private javax.swing.JButton prioritizeButton; + private javax.swing.JButton refreshButton; private javax.swing.JScrollPane runningScrollPane; private javax.swing.JTable runningTable; private javax.swing.JTextField tbServicesStatusMessage; - private javax.swing.JTextField tbStatusMessage; // End of variables declaration//GEN-END:variables -} \ No newline at end of file + /* + * The enum is used in conjunction with the DefaultTableModel class to + * provide table models for the JTables used to display a view of the + * pending jobs queue, running jobs list, and completed jobs list for an + * auto ingest cluster. The enum allows the columns of the table model to be + * described by either an enum ordinal or a column header string. + */ + private enum JobsTableModelColumns { + + // DLG: Go through the bundles.properties file and delete and unused key-value pairs. + CASE(NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.Case")), + DATA_SOURCE(NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.ImageFolder")), + HOST_NAME(NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.HostName")), + CREATED_TIME(NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.CreatedTime")), + STARTED_TIME(NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.StartedTime")), + COMPLETED_TIME(NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.CompletedTime")), + STAGE(NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.Stage")), + STAGE_TIME(NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.StageTime")), + STATUS(NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.Status")), + CASE_DIRECTORY_PATH(NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.CaseFolder")), + MANIFEST_FILE_PATH(NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.ManifestFilePath")); + + private final String header; + + private JobsTableModelColumns(String header) { + this.header = header; + } + + private String getColumnHeader() { + return header; + } + + private static final String[] headers = { + CASE.getColumnHeader(), + DATA_SOURCE.getColumnHeader(), + HOST_NAME.getColumnHeader(), + CREATED_TIME.getColumnHeader(), + STARTED_TIME.getColumnHeader(), + COMPLETED_TIME.getColumnHeader(), + STAGE.getColumnHeader(), + STATUS.getColumnHeader(), + STAGE_TIME.getColumnHeader(), + CASE_DIRECTORY_PATH.getColumnHeader(), + MANIFEST_FILE_PATH.getColumnHeader()}; + } + + /** + * A task that gets the current snapshot of the pending, running and + * completed auto ingest jobs lists for an auto ingest cluster from the auto + * ingest monitor, sorts them, and queues a UI components refresh task for + * execution in the EDT. + */ + private class GetJobsSnapshotTask implements Runnable { + + @Override + public void run() { + AutoIngestMonitor.JobsSnapshot jobsSnapshot = autoIngestMonitor.getJobsSnapshot(); + List pendingJobs = jobsSnapshot.getPendingJobs(); + List runningJobs = jobsSnapshot.getRunningJobs(); + List completedJobs = jobsSnapshot.getCompletedJobs(); + // DLG: Do the appropriate sorts in this background task. + EventQueue.invokeLater(new RefreshComponentsTask(pendingJobs, runningJobs, completedJobs)); + } + } + + /** + * A task that refreshes the UI components on this panel to reflect a + * snapshot of the pending, running and completed auto ingest jobs lists of + * an auto ingest cluster. + */ + private class RefreshComponentsTask implements Runnable { + + private final List pendingJobs; + private final List runningJobs; + private final List completedJobs; + + /** + * Constructs a task that refreshes the UI components on this panel to + * reflect a snapshot of the pending, running and completed auto ingest + * jobs lists of an auto ingest cluster. + * + * @param pendingJobs The pending jobs list. + * @param runningJobs The running jobs list. + * @param completedJobs The completed jobs list. + */ + RefreshComponentsTask(List pendingJobs, List runningJobs, List completedJobs) { + this.pendingJobs = pendingJobs; + this.runningJobs = runningJobs; + this.completedJobs = completedJobs; + } + + @Override + public void run() { + refreshTable(pendingJobs, pendingTable, pendingTableModel); + refreshTable(runningJobs, runningTable, runningTableModel); + refreshTable(completedJobs, completedTable, completedTableModel); + refreshButton.setEnabled(true); + } + } + + /** + * Exception type thrown when there is an error completing an auto ingest + * dashboard operation. + */ + static final class AutoIngestDashboardException extends Exception { + + private static final long serialVersionUID = 1L; + + /** + * Constructs an instance of the exception type thrown when there is an + * error completing an auto ingest dashboard operation. + * + * @param message The exception message. + */ + private AutoIngestDashboardException(String message) { + super(message); + } + + /** + * Constructs an instance of the exception type thrown when there is an + * error completing an auto ingest dashboard operation. + * + * @param message The exception message. + * @param cause A Throwable cause for the error. + */ + private AutoIngestDashboardException(String message, Throwable cause) { + super(message, cause); + } + + } + +} diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardTopComponent.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardTopComponent.java index 5f2fa268a0..1e28f58cb2 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardTopComponent.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardTopComponent.java @@ -22,6 +22,7 @@ import java.util.logging.Level; import org.netbeans.api.settings.ConvertAsProperties; import org.openide.awt.ActionID; import org.openide.awt.ActionReference; +import org.openide.util.Exceptions; import org.openide.windows.TopComponent; import org.openide.util.NbBundle.Messages; import org.openide.windows.Mode; @@ -47,6 +48,7 @@ import org.sleuthkit.autopsy.coreutils.Logger; "HINT_AutoIngestDashboardTopComponent=This is an Auto Ingest Dashboard window" }) public final class AutoIngestDashboardTopComponent extends TopComponent { + public final static String PREFERRED_ID = "AutoIngestDashboardTopComponent"; // NON-NLS private static final Logger LOGGER = Logger.getLogger(AutoIngestDashboardTopComponent.class.getName()); private static boolean topComponentInitialized = false; @@ -61,12 +63,17 @@ public final class AutoIngestDashboardTopComponent extends TopComponent { mode.dockInto(tc); } - AutoIngestDashboard dashboard = AutoIngestDashboard.getInstance(); - tc.add(dashboard); - dashboard.setSize(dashboard.getPreferredSize()); - - tc.open(); - tc.requestActive(); + AutoIngestDashboard dashboard; + try { + dashboard = AutoIngestDashboard.createDashboard(); + tc.add(dashboard); + dashboard.setSize(dashboard.getPreferredSize()); + tc.open(); + tc.requestActive(); + } catch (AutoIngestDashboard.AutoIngestDashboardException ex) { + // DLG: Catch the exeption, log it, and pop up an error dialog + // with a user-friendly message + } } } @@ -132,4 +139,4 @@ public final class AutoIngestDashboardTopComponent extends TopComponent { String version = p.getProperty("version"); // TODO read your settings according to their version } -} \ No newline at end of file +} diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestJob.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestJob.java index f616853b05..3d61ca3fcb 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestJob.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestJob.java @@ -255,6 +255,8 @@ public final class AutoIngestJob implements Comparable, Serializa return -date1.compareTo(date2); } + // DLG: Add a toString override + /** * Custom comparator that allows us to sort List on reverse * chronological date modified (descending) diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestManager.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestManager.java index 4f119a82ca..9ac5688dc7 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestManager.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestManager.java @@ -2685,7 +2685,7 @@ public final class AutoIngestManager extends Observable implements PropertyChang * locally to auto ingest manager clients that register as observers and are * broadcast to other auto ingest nodes. */ - enum Event { + public enum Event { INPUT_SCAN_COMPLETED, JOB_STARTED, diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMonitor.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMonitor.java index e85915a2b4..ecca4a3750 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMonitor.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMonitor.java @@ -53,10 +53,10 @@ public final class AutoIngestMonitor extends Observable implements PropertyChang private static final String LOCAL_HOST_NAME = NetworkUtils.getLocalHostName(); private static final String EVENT_CHANNEL_NAME = "Auto-Ingest-Manager-Events"; //NON-NLS private static final Set EVENT_LIST = new HashSet<>(Arrays.asList(new String[]{ - Event.JOB_STATUS_UPDATED.toString(), - Event.JOB_COMPLETED.toString(), - Event.CASE_PRIORITIZED.toString(), - Event.JOB_STARTED.toString()})); + AutoIngestManager.Event.JOB_STATUS_UPDATED.toString(), + AutoIngestManager.Event.JOB_COMPLETED.toString(), + AutoIngestManager.Event.CASE_PRIORITIZED.toString(), + AutoIngestManager.Event.JOB_STARTED.toString()})); private final AutopsyEventPublisher eventPublisher; private CoordinationService coordinationService; private final ScheduledThreadPoolExecutor coordSvcQueryExecutor; @@ -155,7 +155,7 @@ public final class AutoIngestMonitor extends Observable implements PropertyChang // DLG: Remove job from event from pending queue, if present // DLG: Add job to running jobs list setChanged(); - notifyObservers(Event.JOB_STARTED); + notifyObservers(); } /** @@ -166,7 +166,7 @@ public final class AutoIngestMonitor extends Observable implements PropertyChang private void handleJobStatusEvent(AutoIngestJobStatusEvent event) { // DLG: Replace job in running list with job from event setChanged(); - notifyObservers(Event.JOB_STATUS_UPDATED); + notifyObservers(); } /** @@ -178,7 +178,7 @@ public final class AutoIngestMonitor extends Observable implements PropertyChang // DLG: Remove job from event from running list, if present // DLG: Add job to completed list setChanged(); - notifyObservers(Event.JOB_COMPLETED); + notifyObservers(); } /** @@ -189,7 +189,7 @@ public final class AutoIngestMonitor extends Observable implements PropertyChang private void handleCasePrioritizationEvent(AutoIngestCasePrioritizedEvent event) { // DLG: Replace job in pending queue with job from event setChanged(); - notifyObservers(Event.CASE_PRIORITIZED); + notifyObservers(); } /** @@ -236,61 +236,18 @@ public final class AutoIngestMonitor extends Observable implements PropertyChang * @return The snapshot. */ private JobsSnapshot queryCoordinationService() { - JobsSnapshot newJobsSnapshot = new JobsSnapshot(); - List nodeList; try { - nodeList = coordinationService.getNodeList(CoordinationService.CategoryNode.MANIFESTS); + JobsSnapshot newJobsSnapshot = new JobsSnapshot(); + List nodeList = coordinationService.getNodeList(CoordinationService.CategoryNode.MANIFESTS); for (String node : nodeList) { // DLG: Do not need a lock here // DLG: Get the node data and construct a AutoIngestJobNodeData object (rename ManifestNodeData => AutoIngestJobData) - // DLG: Construct an AutoIngestJob object from the + // DLG: Construct an AutoIngestJob object from the AutoIngestJobNodeData object, need new AutoIngestJob constructor } return newJobsSnapshot; } catch (CoordinationServiceException ex) { LOGGER.log(Level.SEVERE, "Failed to get node list from coordination service", ex); - } - } - - /** - * Bumps the priority of all pending ingest jobs for a specified case. - * - * @param caseName The name of the case to be prioritized. - */ - void prioritizeCase(final String caseName) { - List prioritizedJobs = new ArrayList<>(); - int maxPriority = 0; - synchronized (jobsLock) { - for (AutoIngestJob job : pendingJobs) { - if (job.getNodeData().getPriority() > maxPriority) { - maxPriority = job.getNodeData().getPriority(); - } - if (job.getNodeData().getCaseName().equals(caseName)) { - prioritizedJobs.add(job); - } - } - if (!prioritizedJobs.isEmpty()) { - ++maxPriority; - for (AutoIngestJob job : prioritizedJobs) { - String manifestNodePath = job.getNodeData().getManifestFilePath().toString(); - try { - ManifestNodeData nodeData = new ManifestNodeData(coordinationService.getNodeData(CoordinationService.CategoryNode.MANIFESTS, manifestNodePath)); - nodeData.setPriority(maxPriority); - coordinationService.setNodeData(CoordinationService.CategoryNode.MANIFESTS, manifestNodePath, nodeData.toArray()); - } catch (ManifestNodeDataException ex) { - } catch (CoordinationServiceException ex) { - } catch (InterruptedException ex) { - } - job.getNodeData().setPriority(maxPriority); - } - } - - Collections.sort(pendingJobs, new AutoIngestJob.PriorityComparator()); - } - - if (!prioritizedJobs.isEmpty()) { - new Thread(() -> { - eventPublisher.publishRemotely(new AutoIngestCasePrioritizedEvent(LOCAL_HOST_NAME, caseName)); - }).start(); + return new JobsSnapshot(); } } @@ -299,40 +256,51 @@ public final class AutoIngestMonitor extends Observable implements PropertyChang * * @param manifestPath The manifest file path for the job to be prioritized. */ - void prioritizeJob(Path manifestPath) { - int maxPriority = 0; + JobsSnapshot prioritizeJob(Path manifestFilePath) throws AutoIngestMonitorException { + int highestPriority = 0; AutoIngestJob prioritizedJob = null; synchronized (jobsLock) { - for (AutoIngestJob job : pendingJobs) { - if (job.getNodeData().getPriority() > maxPriority) { - maxPriority = job.getNodeData().getPriority(); + /* + * Get the highest known priority and make sure the job is still in + * the pending jobs queue. + */ + for (AutoIngestJob job : jobsSnapshot.getPendingJobs()) { + if (job.getNodeData().getPriority() > highestPriority) { + highestPriority = job.getNodeData().getPriority(); } - if (job.getNodeData().getManifestFilePath().equals(manifestPath)) { + if (job.getNodeData().getManifestFilePath().equals(manifestFilePath)) { prioritizedJob = job; } } + + /* + * If the job was still in the pending jobs queue, bump its + * priority. + */ if (null != prioritizedJob) { - ++maxPriority; + ++highestPriority; String manifestNodePath = prioritizedJob.getNodeData().getManifestFilePath().toString(); try { ManifestNodeData nodeData = new ManifestNodeData(coordinationService.getNodeData(CoordinationService.CategoryNode.MANIFESTS, manifestNodePath)); - nodeData.setPriority(maxPriority); + nodeData.setPriority(highestPriority); coordinationService.setNodeData(CoordinationService.CategoryNode.MANIFESTS, manifestNodePath, nodeData.toArray()); - } catch (ManifestNodeDataException ex) { - } catch (CoordinationServiceException ex) { - } catch (InterruptedException ex) { + } catch (ManifestNodeDataException | CoordinationServiceException | InterruptedException ex) { + throw new AutoIngestMonitorException("Error bumping priority for job " + prioritizedJob.toString(), ex); } - prioritizedJob.getNodeData().setPriority(maxPriority); + prioritizedJob.getNodeData().setPriority(highestPriority); + } + + /* + * Publish a prioritization event. + */ + if (null != prioritizedJob) { + final String caseName = prioritizedJob.getNodeData().getCaseName(); + new Thread(() -> { + eventPublisher.publishRemotely(new AutoIngestCasePrioritizedEvent(LOCAL_HOST_NAME, caseName)); + }).start(); } - Collections.sort(pendingJobs, new AutoIngestJob.PriorityComparator()); - } - - if (null != prioritizedJob) { - final String caseName = prioritizedJob.getNodeData().getCaseName(); - new Thread(() -> { - eventPublisher.publishRemotely(new AutoIngestCasePrioritizedEvent(LOCAL_HOST_NAME, caseName)); - }).start(); + return jobsSnapshot; } } @@ -356,26 +324,12 @@ public final class AutoIngestMonitor extends Observable implements PropertyChang jobsSnapshot = newJobsSnapshot; } setChanged(); - notifyObservers(Event.INPUT_SCAN_COMPLETED); // RJCTODO: Change this event name + notifyObservers(); } } } - /* - * Events published by an auto ingest monitor. The events are published - * locally to auto ingest monitor clients that register as observers. - */ - enum Event { - - INPUT_SCAN_COMPLETED, - JOB_STARTED, - JOB_STATUS_UPDATED, - JOB_COMPLETED, - CASE_PRIORITIZED, - CASE_DELETED - } - /** * A snapshot of the pending jobs queue, running jobs list, and completed * jobs list for an auto ingest cluster. diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties index d9df6782ff..58269dc456 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties @@ -1,5 +1,4 @@ CTL_OpenAction=Open Case... -AutoIngestDashboard.bnRefresh.text=&Refresh AutoIngestDashboard.lbCompleted.text=Completed Jobs AutoIngestDashboard.lbRunning.text=Running Jobs AutoIngestDashboard.lbPending.text=Pending Jobs @@ -13,13 +12,10 @@ AutoIngestDashboard.JobsTableModel.ColumnHeader.Stage=Stage AutoIngestDashboard.JobsTableModel.ColumnHeader.Status=Status AutoIngestDashboard.JobsTableModel.ColumnHeader.ManifestFilePath= Manifest File Path AutoIngestDashboard.bnResume.text=Resume -AutoIngestDashboard.bnPause.text=Pause AutoIngestDashboard.bnPause.confirmHeader=Are you sure you want to pause? AutoIngestDashboard.bnPause.warningText=Pause will occur after the current job completes processing. This could take a long time. Continue? -AutoIngestDashboard.bnPause.toolTipText=Suspend processing of Pending Jobs AutoIngestDashboard.bnPause.toolTipTextResume=Resume processing of Pending Jobs AutoIngestDashboard.bnPause.pausing=Pausing after current job completes... -AutoIngestDashboard.bnRefresh.toolTipText=Refresh displayed tables AutoIngestDashboard.Cancelling=Cancelling... AutoIngestDashboard.pendingTable.toolTipText=The Pending table displays the order upcoming Jobs will be processed with the top of the list first AutoIngestDashboard.runningTable.toolTipText=The Running table displays the currently running Job and information about it @@ -183,7 +179,6 @@ CaseImportPanel.Error=Error CaseImportPanel.Complete=Complete CaseImportPanel.Blank= CaseImportPanel.DeleteWarning=Make sure no important files are in the case source directory -AutoIngestDashboard.lbStatus.text=Status: SingleUserCaseImporter.NonUniqueOutputFolder=Output folder not unique. Skipping SingleUserCaseImporter.WillImport=Will import: SingleUserCaseImporter.None=None @@ -208,7 +203,6 @@ ReviewModeCasePanel.LastAccessedTimeHeaderText=Last Accessed Time CopyFilesPanel.bnOptions.text=&Options AutoIngestDashboard.lbServicesStatus.text=Services Status: AutoIngestDashboard.tbServicesStatusMessage.text= -AutoIngestDashboard.tbStatusMessage.text= FileExporterSettingsPanel.ChooseRootDirectory=Choose a root directory for file output FileExporterSettingsPanel.ChooseReportDirectory=Choose a report directory FileExporterSettingsPanel.RuleName=Rule Name @@ -313,3 +307,7 @@ AutoIngestControlPanel.bnPrioritizeJob.toolTipText=Move this folder to the top o AutoIngestControlPanel.bnPrioritizeJob.text=Prioritize Job AutoIngestControlPanel.lbStatus.text=Status: AutoIngestControlPanel.PauseDueToSystemError=Paused due to system error, please consult the auto ingest system log +AutoIngestDashboard.prioritizeButton.toolTipText=Prioritizes the selected job +AutoIngestDashboard.prioritizeButton.text=&Prioritize +AutoIngestDashboard.refreshButton.toolTipText=Refresh displayed tables +AutoIngestDashboard.refreshButton.text=&Refresh From 8dba95e30f4bf732fd8b9a2fac16d18a93ff98cd Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Thu, 7 Sep 2017 10:22:54 -0400 Subject: [PATCH 073/104] 2933 removed warning about null artifacts in central repo ingest listener --- .../centralrepository/eventlisteners/IngestEventsListener.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/IngestEventsListener.java b/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/IngestEventsListener.java index 5f1ff75a24..641a294a4f 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/IngestEventsListener.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/IngestEventsListener.java @@ -91,8 +91,7 @@ public class IngestEventsListener { final ModuleDataEvent mde = (ModuleDataEvent) evt.getOldValue(); Collection bbArtifacts = mde.getArtifacts(); - if (null == bbArtifacts) { - LOGGER.log(Level.WARNING, "Error getting artifacts from Module Data Event. getArtifacts() returned null."); + if (null == bbArtifacts) { //the ModuleDataEvents don't always have a collection of artifacts set return; } List eamArtifacts = new ArrayList<>(); From 60f704b00881b90cb6af6697f18890ba363b5129 Mon Sep 17 00:00:00 2001 From: Richard Cordovano Date: Thu, 7 Sep 2017 12:06:36 -0400 Subject: [PATCH 074/104] Fix AutoIngestDashboard.form corruption --- .../autoingest/AutoIngestDashboard.form | 149 --------- .../autoingest/AutoIngestDashboard.java | 287 +++++++++--------- 2 files changed, 142 insertions(+), 294 deletions(-) diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.form b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.form index 3bfd080078..92273301ed 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.form +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.form @@ -145,29 +145,6 @@ -<<<<<<< HEAD -======= - - - - - - - - - - - - - - - - - - - - ->>>>>>> upstream/develop @@ -204,7 +181,6 @@ -<<<<<<< HEAD @@ -212,119 +188,6 @@ -======= - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ->>>>>>> upstream/develop @@ -355,26 +218,14 @@ -<<<<<<< HEAD -======= - - - - - - ->>>>>>> upstream/develop -<<<<<<< HEAD -======= ->>>>>>> upstream/develop \ No newline at end of file diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java index 160f4690c8..f364955663 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java @@ -1,7 +1,7 @@ /* * Autopsy Forensic Browser * - * Copyright 2011 - 2017 Basis Technology Corp. + * Copyright 2011-2017 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -19,7 +19,6 @@ package org.sleuthkit.autopsy.experimental.autoingest; import com.google.common.util.concurrent.ThreadFactoryBuilder; -import java.awt.Color; import java.awt.Cursor; import java.awt.EventQueue; import java.nio.file.Path; @@ -42,19 +41,17 @@ import javax.swing.UIManager; import javax.swing.event.ListSelectionEvent; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableColumn; -import org.openide.util.Exceptions; import org.openide.util.NbBundle; import org.sleuthkit.autopsy.core.ServicesMonitor; import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.experimental.autoingest.AutoIngestMonitor.JobsSnapshot; /** - * A panel for monitoring an automated ingest cluster. + * A dashboard for monitoring an automated ingest cluster. */ public final class AutoIngestDashboard extends JPanel implements Observer { private static final long serialVersionUID = 1L; - private static final Logger LOGGER = Logger.getLogger(AutoIngestDashboard.class.getName()); private static final int GENERIC_COL_MIN_WIDTH = 30; private static final int GENERIC_COL_MAX_WIDTH = 2000; private static final int PENDING_TABLE_COL_PREFERRED_WIDTH = 280; @@ -77,6 +74,7 @@ public final class AutoIngestDashboard extends JPanel implements Observer { private static final int COMPLETED_TIME_COL_MAX_WIDTH = 2000; private static final int COMPLETED_TIME_COL_PREFERRED_WIDTH = 280; private static final String UPDATE_TASKS_THREAD_NAME = "AID-update-tasks-%d"; + private static final Logger logger = Logger.getLogger(AutoIngestDashboard.class.getName()); private final DefaultTableModel pendingTableModel; private final DefaultTableModel runningTableModel; private final DefaultTableModel completedTableModel; @@ -85,14 +83,13 @@ public final class AutoIngestDashboard extends JPanel implements Observer { // DLG: The Viking code needs to be updated, too. See VikingStartupWindow, // which should be using the AutoIngestControlPanel, not the AutoIngestDashboard. - // Viking will not compile with this code. /** - * Creates a dashboard panel for monitoring an automated ingest cluster. + * Creates a dashboard for monitoring an automated ingest cluster. * - * @return The dashboard panel. + * @return The dashboard. * * @throws AutoIngestDashboardException If there is a problem creating the - * dashboard panel. + * dashboard. */ public static AutoIngestDashboard createDashboard() throws AutoIngestDashboardException { AutoIngestDashboard dashBoard = new AutoIngestDashboard(); @@ -183,7 +180,7 @@ public final class AutoIngestDashboard extends JPanel implements Observer { serviceStatus = NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.tbServicesStatusMessage.Message.Down"); } } catch (ServicesMonitor.ServicesMonitorException ex) { - LOGGER.log(Level.SEVERE, String.format("Dashboard error getting service status for %s", service), ex); + logger.log(Level.SEVERE, String.format("Dashboard error getting service status for %s", service), ex); } return serviceStatus; } @@ -499,7 +496,7 @@ public final class AutoIngestDashboard extends JPanel implements Observer { } setSelectedEntry(table, tableModel, currentRow); } catch (Exception ex) { - LOGGER.log(Level.SEVERE, "Error refreshing table " + table.toString(), ex); + logger.log(Level.SEVERE, "Error refreshing table " + table.toString(), ex); } } @@ -551,6 +548,137 @@ public final class AutoIngestDashboard extends JPanel implements Observer { table.clearSelection(); } + /* + * The enum is used in conjunction with the DefaultTableModel class to + * provide table models for the JTables used to display a view of the + * pending jobs queue, running jobs list, and completed jobs list for an + * auto ingest cluster. The enum allows the columns of the table model to be + * described by either an enum ordinal or a column header string. + */ + private enum JobsTableModelColumns { + + // DLG: Go through the bundles.properties file and delete and unused key-value pairs. + CASE(NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.Case")), + DATA_SOURCE(NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.ImageFolder")), + HOST_NAME(NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.HostName")), + CREATED_TIME(NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.CreatedTime")), + STARTED_TIME(NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.StartedTime")), + COMPLETED_TIME(NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.CompletedTime")), + STAGE(NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.Stage")), + STAGE_TIME(NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.StageTime")), + STATUS(NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.Status")), + CASE_DIRECTORY_PATH(NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.CaseFolder")), + MANIFEST_FILE_PATH(NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.ManifestFilePath")); + + private final String header; + + private JobsTableModelColumns(String header) { + this.header = header; + } + + private String getColumnHeader() { + return header; + } + + private static final String[] headers = { + CASE.getColumnHeader(), + DATA_SOURCE.getColumnHeader(), + HOST_NAME.getColumnHeader(), + CREATED_TIME.getColumnHeader(), + STARTED_TIME.getColumnHeader(), + COMPLETED_TIME.getColumnHeader(), + STAGE.getColumnHeader(), + STATUS.getColumnHeader(), + STAGE_TIME.getColumnHeader(), + CASE_DIRECTORY_PATH.getColumnHeader(), + MANIFEST_FILE_PATH.getColumnHeader()}; + } + + /** + * A task that gets the current snapshot of the pending, running and + * completed auto ingest jobs lists for an auto ingest cluster from the auto + * ingest monitor, sorts them, and queues a UI components refresh task for + * execution in the EDT. + */ + private class GetJobsSnapshotTask implements Runnable { + + @Override + public void run() { + AutoIngestMonitor.JobsSnapshot jobsSnapshot = autoIngestMonitor.getJobsSnapshot(); + List pendingJobs = jobsSnapshot.getPendingJobs(); + List runningJobs = jobsSnapshot.getRunningJobs(); + List completedJobs = jobsSnapshot.getCompletedJobs(); + // DLG: Do the appropriate sorts in this background task. + EventQueue.invokeLater(new RefreshComponentsTask(pendingJobs, runningJobs, completedJobs)); + } + } + + /** + * A task that refreshes the UI components on this panel to reflect a + * snapshot of the pending, running and completed auto ingest jobs lists of + * an auto ingest cluster. + */ + private class RefreshComponentsTask implements Runnable { + + private final List pendingJobs; + private final List runningJobs; + private final List completedJobs; + + /** + * Constructs a task that refreshes the UI components on this panel to + * reflect a snapshot of the pending, running and completed auto ingest + * jobs lists of an auto ingest cluster. + * + * @param pendingJobs The pending jobs list. + * @param runningJobs The running jobs list. + * @param completedJobs The completed jobs list. + */ + RefreshComponentsTask(List pendingJobs, List runningJobs, List completedJobs) { + this.pendingJobs = pendingJobs; + this.runningJobs = runningJobs; + this.completedJobs = completedJobs; + } + + @Override + public void run() { + refreshTable(pendingJobs, pendingTable, pendingTableModel); + refreshTable(runningJobs, runningTable, runningTableModel); + refreshTable(completedJobs, completedTable, completedTableModel); + refreshButton.setEnabled(true); + } + } + + /** + * Exception type thrown when there is an error completing an auto ingest + * dashboard operation. + */ + static final class AutoIngestDashboardException extends Exception { + + private static final long serialVersionUID = 1L; + + /** + * Constructs an instance of the exception type thrown when there is an + * error completing an auto ingest dashboard operation. + * + * @param message The exception message. + */ + private AutoIngestDashboardException(String message) { + super(message); + } + + /** + * Constructs an instance of the exception type thrown when there is an + * error completing an auto ingest dashboard operation. + * + * @param message The exception message. + * @param cause A Throwable cause for the error. + */ + private AutoIngestDashboardException(String message, Throwable cause) { + super(message, cause); + } + + } + /** * 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 @@ -744,7 +872,7 @@ public final class AutoIngestDashboard extends JPanel implements Observer { } }//GEN-LAST:event_prioritizeButtonActionPerformed - // Variables declaration - do not modify + // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JScrollPane completedScrollPane; private javax.swing.JTable completedTable; private javax.swing.JLabel lbCompleted; @@ -758,137 +886,6 @@ public final class AutoIngestDashboard extends JPanel implements Observer { private javax.swing.JScrollPane runningScrollPane; private javax.swing.JTable runningTable; private javax.swing.JTextField tbServicesStatusMessage; - // End of variables declaration + // End of variables declaration//GEN-END:variables - /* - * The enum is used in conjunction with the DefaultTableModel class to - * provide table models for the JTables used to display a view of the - * pending jobs queue, running jobs list, and completed jobs list for an - * auto ingest cluster. The enum allows the columns of the table model to be - * described by either an enum ordinal or a column header string. - */ - private enum JobsTableModelColumns { - - // DLG: Go through the bundles.properties file and delete and unused key-value pairs. - CASE(NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.Case")), - DATA_SOURCE(NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.ImageFolder")), - HOST_NAME(NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.HostName")), - CREATED_TIME(NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.CreatedTime")), - STARTED_TIME(NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.StartedTime")), - COMPLETED_TIME(NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.CompletedTime")), - STAGE(NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.Stage")), - STAGE_TIME(NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.StageTime")), - STATUS(NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.Status")), - CASE_DIRECTORY_PATH(NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.CaseFolder")), - MANIFEST_FILE_PATH(NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.ManifestFilePath")); - - private final String header; - - private JobsTableModelColumns(String header) { - this.header = header; - } - - private String getColumnHeader() { - return header; - } - - private static final String[] headers = { - CASE.getColumnHeader(), - DATA_SOURCE.getColumnHeader(), - HOST_NAME.getColumnHeader(), - CREATED_TIME.getColumnHeader(), - STARTED_TIME.getColumnHeader(), - COMPLETED_TIME.getColumnHeader(), - STAGE.getColumnHeader(), - STATUS.getColumnHeader(), - STAGE_TIME.getColumnHeader(), - CASE_DIRECTORY_PATH.getColumnHeader(), - MANIFEST_FILE_PATH.getColumnHeader()}; - } - - /** - * A task that gets the current snapshot of the pending, running and - * completed auto ingest jobs lists for an auto ingest cluster from the auto - * ingest monitor, sorts them, and queues a UI components refresh task for - * execution in the EDT. - */ - private class GetJobsSnapshotTask implements Runnable { - - @Override - public void run() { - AutoIngestMonitor.JobsSnapshot jobsSnapshot = autoIngestMonitor.getJobsSnapshot(); - List pendingJobs = jobsSnapshot.getPendingJobs(); - List runningJobs = jobsSnapshot.getRunningJobs(); - List completedJobs = jobsSnapshot.getCompletedJobs(); - // DLG: Do the appropriate sorts in this background task. - EventQueue.invokeLater(new RefreshComponentsTask(pendingJobs, runningJobs, completedJobs)); - } - } - - /** - * A task that refreshes the UI components on this panel to reflect a - * snapshot of the pending, running and completed auto ingest jobs lists of - * an auto ingest cluster. - */ - private class RefreshComponentsTask implements Runnable { - - private final List pendingJobs; - private final List runningJobs; - private final List completedJobs; - - /** - * Constructs a task that refreshes the UI components on this panel to - * reflect a snapshot of the pending, running and completed auto ingest - * jobs lists of an auto ingest cluster. - * - * @param pendingJobs The pending jobs list. - * @param runningJobs The running jobs list. - * @param completedJobs The completed jobs list. - */ - RefreshComponentsTask(List pendingJobs, List runningJobs, List completedJobs) { - this.pendingJobs = pendingJobs; - this.runningJobs = runningJobs; - this.completedJobs = completedJobs; - } - - @Override - public void run() { - refreshTable(pendingJobs, pendingTable, pendingTableModel); - refreshTable(runningJobs, runningTable, runningTableModel); - refreshTable(completedJobs, completedTable, completedTableModel); - refreshButton.setEnabled(true); - } - } - - /** - * Exception type thrown when there is an error completing an auto ingest - * dashboard operation. - */ - static final class AutoIngestDashboardException extends Exception { - - private static final long serialVersionUID = 1L; - - /** - * Constructs an instance of the exception type thrown when there is an - * error completing an auto ingest dashboard operation. - * - * @param message The exception message. - */ - private AutoIngestDashboardException(String message) { - super(message); - } - - /** - * Constructs an instance of the exception type thrown when there is an - * error completing an auto ingest dashboard operation. - * - * @param message The exception message. - * @param cause A Throwable cause for the error. - */ - private AutoIngestDashboardException(String message, Throwable cause) { - super(message, cause); - } - - } - -} +} \ No newline at end of file From 8ff52277fa75f44217b4e9589fd8b170e3c2f51a Mon Sep 17 00:00:00 2001 From: Richard Cordovano Date: Thu, 7 Sep 2017 12:18:17 -0400 Subject: [PATCH 075/104] Remove large fixed gap from left edge of AID 2.0 --- .../autoingest/AutoIngestDashboard.form | 41 ++++++++++--------- .../autoingest/AutoIngestDashboard.java | 32 ++++++++------- 2 files changed, 39 insertions(+), 34 deletions(-) diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.form b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.form index 92273301ed..fe512ffc15 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.form +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.form @@ -19,26 +19,29 @@ - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + - + @@ -228,4 +231,4 @@ - \ No newline at end of file + diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java index f364955663..ae690a06f5 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java @@ -798,22 +798,24 @@ public final class AutoIngestDashboard extends JPanel implements Observer { .addGroup(layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) - .addComponent(lbPending, javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(pendingScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 920, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addComponent(runningScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 920, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(completedScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 920, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(lbCompleted) - .addComponent(lbRunning) .addGroup(layout.createSequentialGroup() - .addComponent(lbServicesStatus) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addComponent(tbServicesStatusMessage, javax.swing.GroupLayout.PREFERRED_SIZE, 861, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addGroup(layout.createSequentialGroup() - .addComponent(refreshButton, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(prioritizeButton, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE))) - .addContainerGap(140, Short.MAX_VALUE)) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(lbPending) + .addComponent(lbCompleted) + .addComponent(lbRunning) + .addGroup(layout.createSequentialGroup() + .addComponent(lbServicesStatus) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(tbServicesStatusMessage, javax.swing.GroupLayout.PREFERRED_SIZE, 861, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGroup(layout.createSequentialGroup() + .addComponent(refreshButton, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(prioritizeButton, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE))) + .addGap(0, 0, Short.MAX_VALUE)) + .addComponent(pendingScrollPane, javax.swing.GroupLayout.Alignment.TRAILING) + .addComponent(runningScrollPane) + .addComponent(completedScrollPane)) + .addContainerGap()) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) From 9dfaf678e7db8d44800a9e5f6a0c29cfead46f33 Mon Sep 17 00:00:00 2001 From: Richard Cordovano Date: Thu, 7 Sep 2017 12:25:58 -0400 Subject: [PATCH 076/104] Fix corruption of AutoIngestDashboardTopComponent.form --- .../autoingest/AutoIngestDashboardTopComponent.form | 6 +----- .../autoingest/AutoIngestDashboardTopComponent.java | 2 +- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardTopComponent.form b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardTopComponent.form index ad8445c7b3..63887aceb0 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardTopComponent.form +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardTopComponent.form @@ -25,8 +25,4 @@ -<<<<<<< HEAD - -======= - ->>>>>>> upstream/develop + \ No newline at end of file diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardTopComponent.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardTopComponent.java index 6d6a9f6e43..6897e695e4 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardTopComponent.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardTopComponent.java @@ -66,7 +66,7 @@ public final class AutoIngestDashboardTopComponent extends TopComponent { tc.toFront(); tc.requestActive(); } catch (AutoIngestDashboard.AutoIngestDashboardException ex) { - // DLG: Catch the exeption, log it, and pop up an error dialog + // DLG: Catch the exception, log it, and pop up an error dialog // with a user-friendly message } } From e3601f9bec9e5f8d7020ebe7695c3c899eb1c4be Mon Sep 17 00:00:00 2001 From: Richard Cordovano Date: Thu, 7 Sep 2017 12:30:47 -0400 Subject: [PATCH 077/104] Fix AID 2.0 Refresh button enabling --- .../autopsy/experimental/autoingest/AutoIngestDashboard.form | 1 - .../autopsy/experimental/autoingest/AutoIngestDashboard.java | 4 +--- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.form b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.form index fe512ffc15..c4eb2e3d6d 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.form +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.form @@ -186,7 +186,6 @@ - diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java index ae690a06f5..5c685a5f16 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java @@ -454,7 +454,7 @@ public final class AutoIngestDashboard extends JPanel implements Observer { List pendingJobs = jobsSnapshot.getPendingJobs(); List runningJobs = jobsSnapshot.getRunningJobs(); List completedJobs = jobsSnapshot.getCompletedJobs(); - // DLG: Do the appropriate sorts. + // DLG: Do the appropriate sorts for each table. refreshTable(pendingJobs, pendingTable, pendingTableModel); refreshTable(runningJobs, runningTable, runningTableModel); refreshTable(completedJobs, completedTable, completedTableModel); @@ -644,7 +644,6 @@ public final class AutoIngestDashboard extends JPanel implements Observer { refreshTable(pendingJobs, pendingTable, pendingTableModel); refreshTable(runningJobs, runningTable, runningTableModel); refreshTable(completedJobs, completedTable, completedTableModel); - refreshButton.setEnabled(true); } } @@ -767,7 +766,6 @@ public final class AutoIngestDashboard extends JPanel implements Observer { org.openide.awt.Mnemonics.setLocalizedText(refreshButton, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.refreshButton.text")); // NOI18N refreshButton.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.refreshButton.toolTipText")); // NOI18N - refreshButton.setEnabled(false); refreshButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { refreshButtonActionPerformed(evt); From 44c8dfe47a5fc0a67eaff793280355eafb8f7a81 Mon Sep 17 00:00:00 2001 From: Richard Cordovano Date: Thu, 7 Sep 2017 14:28:32 -0400 Subject: [PATCH 078/104] Additional updates to AID 2.0 --- .../autoingest/AutoIngestControlPanel.java | 40 +++--- .../autoingest/AutoIngestDashboard.form | 10 +- .../autoingest/AutoIngestDashboard.java | 97 ++++--------- .../AutoIngestDashboardTopComponent.java | 23 +-- .../autoingest/AutoIngestJob.java | 22 +-- .../autoingest/AutoIngestMonitor.java | 57 ++++---- .../experimental/autoingest/Bundle.properties | 2 +- .../autoingest/ManifestNodeData.java | 135 ++++++++++-------- .../netbeans/core/startup/Bundle.properties | 4 +- .../core/windows/view/ui/Bundle.properties | 6 +- 10 files changed, 195 insertions(+), 201 deletions(-) diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestControlPanel.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestControlPanel.java index ece449814a..8c9baf5970 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestControlPanel.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestControlPanel.java @@ -53,13 +53,8 @@ import org.netbeans.api.options.OptionsDisplayer; import org.openide.DialogDisplayer; import org.openide.LifecycleManager; import org.openide.NotifyDescriptor; -import org.openide.filesystems.FileObject; -import org.openide.filesystems.FileUtil; import org.openide.util.NbBundle; -import org.openide.util.actions.CallableSystemAction; import org.openide.windows.WindowManager; -import org.sleuthkit.autopsy.casemodule.CaseNewAction; -import org.sleuthkit.autopsy.casemodule.CaseOpenAction; import org.sleuthkit.autopsy.core.ServicesMonitor; import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil; import org.sleuthkit.autopsy.coreutils.NetworkUtils; @@ -69,6 +64,11 @@ import org.sleuthkit.autopsy.ingest.IngestProgressSnapshotDialog; import org.sleuthkit.autopsy.experimental.autoingest.AutoIngestManager.CaseDeletionResult; import org.sleuthkit.autopsy.experimental.autoingest.AutoIngestManager.JobsSnapshot; +/* + * DLG: sort out bundle key value pairs, this class is depending on some for + * AuotIngestDashboard, whivh may not exist or may go away. It should have all + * of its own key value pairs defined using the @Messages annotatino. + */ /** * A panel for monitoring automated ingest by a cluster, and for controlling * automated ingest for a single node within the cluster. There can be at most @@ -183,8 +183,8 @@ public final class AutoIngestControlPanel extends JPanel implements Observer { */ private AutoIngestControlPanel() { //Disable the main window so they can only use the dashboard (if we used setVisible the taskBar icon would go away) - WindowManager.getDefault().getMainWindow().setEnabled(false); - + WindowManager.getDefault().getMainWindow().setEnabled(false); + manager = AutoIngestManager.getInstance(); pendingTableModel = new DefaultTableModel(JobsTableModelColumns.headers, 0) { @@ -632,12 +632,12 @@ public final class AutoIngestControlPanel extends JPanel implements Observer { updateExecutor.submit(new UpdateAllJobsTablesTask()); manager.scanInputDirsNow(); - //bnPause.setEnabled(true); + //bnPause.setEnabled(true); bnPause.setText(org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.bnPause.text")); bnPause.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.bnPause.toolTipText")); bnRefresh.setEnabled(true); bnOptions.setEnabled(false); - + tbStatusMessage.setText(org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.bnPause.running")); } @@ -743,7 +743,7 @@ public final class AutoIngestControlPanel extends JPanel implements Observer { break; case PAUSED_BY_REQUEST: EventQueue.invokeLater(() -> { - tbStatusMessage.setText(org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.bnPause.paused")); + tbStatusMessage.setText(Bundle.AutoIngestControlPanel_bnPause_paused()); bnOptions.setEnabled(true); bnRefresh.setEnabled(false); isPaused = true; @@ -751,7 +751,7 @@ public final class AutoIngestControlPanel extends JPanel implements Observer { break; case PAUSED_FOR_SYSTEM_ERROR: EventQueue.invokeLater(() -> { - tbStatusMessage.setText(org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.PauseDueToSystemError")); + tbStatusMessage.setText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.PauseDueToSystemError")); bnOptions.setEnabled(true); bnRefresh.setEnabled(false); pause(false); @@ -799,8 +799,8 @@ public final class AutoIngestControlPanel extends JPanel implements Observer { /** * Change the pause button text and tool tip to make it a resume button. */ - bnPause.setText(org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.bnResume.text")); - bnPause.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.bnPause.toolTipTextResume")); + bnPause.setText(org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.bnResume.text")); + bnPause.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.bnPause.toolTipTextResume")); if (buttonClicked) { /** @@ -825,9 +825,9 @@ public final class AutoIngestControlPanel extends JPanel implements Observer { * Change the resume button text and tool tip to make it a pause button. */ bnOptions.setEnabled(false); - bnPause.setText(org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.bnPause.text")); - bnPause.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.bnPause.toolTipText")); - tbStatusMessage.setText(org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.bnPause.running")); + bnPause.setText(org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.bnPause.text")); + bnPause.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.bnPause.toolTipText")); + tbStatusMessage.setText(org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.bnPause.running")); bnRefresh.setEnabled(true); /** @@ -1080,11 +1080,11 @@ public final class AutoIngestControlPanel extends JPanel implements Observer { SYS_LOGGER.log(Level.SEVERE, "Dashboard error refreshing table", ex); } } - + /** * Get the current lists of jobs and update the UI. */ - private void refreshTables(){ + private void refreshTables() { JobsSnapshot jobsSnapshot = manager.getCurrentJobsSnapshot(); refreshTable(jobsSnapshot.getCompletedJobs(), completedTableModel, null); refreshTable(jobsSnapshot.getPendingJobs(), pendingTableModel, null); @@ -1540,7 +1540,7 @@ public final class AutoIngestControlPanel extends JPanel implements Observer { * @param evt The button click event. */ private void bnPauseActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnPauseActionPerformed - + if (!autoIngestStarted) { //put up a wait cursor during the start up operation this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); @@ -1729,4 +1729,4 @@ public final class AutoIngestControlPanel extends JPanel implements Observer { private javax.swing.JTextField tbStatusMessage; // End of variables declaration//GEN-END:variables -} \ No newline at end of file +} diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.form b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.form index c4eb2e3d6d..55b760a38c 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.form +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.form @@ -37,12 +37,12 @@ - + @@ -55,13 +55,13 @@ - + - + - + - + diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java index 5c685a5f16..55e41e5a65 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java @@ -18,7 +18,6 @@ */ package org.sleuthkit.autopsy.experimental.autoingest; -import com.google.common.util.concurrent.ThreadFactoryBuilder; import java.awt.Cursor; import java.awt.EventQueue; import java.nio.file.Path; @@ -28,8 +27,6 @@ import java.util.Date; import java.util.List; import java.util.Observable; import java.util.Observer; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; import java.util.logging.Level; import javax.swing.DefaultListSelectionModel; import java.awt.Color; @@ -73,16 +70,14 @@ public final class AutoIngestDashboard extends JPanel implements Observer { private static final int COMPLETED_TIME_COL_MIN_WIDTH = 30; private static final int COMPLETED_TIME_COL_MAX_WIDTH = 2000; private static final int COMPLETED_TIME_COL_PREFERRED_WIDTH = 280; - private static final String UPDATE_TASKS_THREAD_NAME = "AID-update-tasks-%d"; private static final Logger logger = Logger.getLogger(AutoIngestDashboard.class.getName()); private final DefaultTableModel pendingTableModel; private final DefaultTableModel runningTableModel; private final DefaultTableModel completedTableModel; private AutoIngestMonitor autoIngestMonitor; - private ExecutorService updateExecutor; // DLG: The Viking code needs to be updated, too. See VikingStartupWindow, - // which should be using the AutoIngestControlPanel, not the AutoIngestDashboard. + // which should be using the AutoIngestControlPanel, not the AutoIngestDashboard. /** * Creates a dashboard for monitoring an automated ingest cluster. * @@ -253,16 +248,16 @@ public final class AutoIngestDashboard extends JPanel implements Observer { pendingTable.setAutoCreateRowSorter(false); /* - * Create a row selection listener to enable/disable the prioritize - * folder and prioritize case buttons. + * Create a row selection listener to enable/disable the Prioritize + * button. */ pendingTable.getSelectionModel().addListSelectionListener((ListSelectionEvent e) -> { if (e.getValueIsAdjusting()) { return; } int row = pendingTable.getSelectedRow(); + this.prioritizeButton.setEnabled(row >= 0 && row < pendingTable.getRowCount()); }); - } /** @@ -409,19 +404,6 @@ public final class AutoIngestDashboard extends JPanel implements Observer { * Prevent sorting when a column header is clicked. */ completedTable.setAutoCreateRowSorter(false); - - /* - * Create a row selection listener to enable/disable the delete case and - * show log buttons. - */ - completedTable.getSelectionModel() - .addListSelectionListener((ListSelectionEvent e) -> { - if (e.getValueIsAdjusting()) { - return; - } - int row = completedTable.getSelectedRow(); - boolean enabled = row >= 0 && row < completedTable.getRowCount(); - }); } /** @@ -430,18 +412,19 @@ public final class AutoIngestDashboard extends JPanel implements Observer { * auto ingest job tables. */ private void startUp() throws AutoIngestMonitor.AutoIngestMonitorException { - autoIngestMonitor = AutoIngestMonitor.createMonitor(); - autoIngestMonitor.addObserver(this); - updateExecutor = Executors.newSingleThreadExecutor(new ThreadFactoryBuilder().setNameFormat(UPDATE_TASKS_THREAD_NAME).build()); - updateExecutor.submit(new GetJobsSnapshotTask()); + setServicesStatusMessage(); ServicesMonitor.getInstance().addSubscriber((PropertyChangeEvent evt) -> { setServicesStatusMessage(); }); + autoIngestMonitor = new AutoIngestMonitor(); + autoIngestMonitor.addObserver(this); + autoIngestMonitor.startUp(); } @Override public void update(Observable observable, Object argument) { - updateExecutor.submit(new GetJobsSnapshotTask()); + JobsSnapshot jobsSnapshot = (JobsSnapshot) argument; + EventQueue.invokeLater(new RefreshComponentsTask(jobsSnapshot)); } /** @@ -580,6 +563,15 @@ public final class AutoIngestDashboard extends JPanel implements Observer { return header; } + /* + * DLG: We need to add the AutoIngestJob object for the row to the + * table. As a model you can look in AutoIngestControlPanel to see how a + * boolean is stored in a hidden IS_LOCAL_JOB column and do something + * similar for the job. Once youy hjave done that, you can change the + * button event handler for the Prioritize button to make it pass the + * AutoIngestJob to the AutoIngestMonitor instead of the manifest file + * path. + */ private static final String[] headers = { CASE.getColumnHeader(), DATA_SOURCE.getColumnHeader(), @@ -594,25 +586,6 @@ public final class AutoIngestDashboard extends JPanel implements Observer { MANIFEST_FILE_PATH.getColumnHeader()}; } - /** - * A task that gets the current snapshot of the pending, running and - * completed auto ingest jobs lists for an auto ingest cluster from the auto - * ingest monitor, sorts them, and queues a UI components refresh task for - * execution in the EDT. - */ - private class GetJobsSnapshotTask implements Runnable { - - @Override - public void run() { - AutoIngestMonitor.JobsSnapshot jobsSnapshot = autoIngestMonitor.getJobsSnapshot(); - List pendingJobs = jobsSnapshot.getPendingJobs(); - List runningJobs = jobsSnapshot.getRunningJobs(); - List completedJobs = jobsSnapshot.getCompletedJobs(); - // DLG: Do the appropriate sorts in this background task. - EventQueue.invokeLater(new RefreshComponentsTask(pendingJobs, runningJobs, completedJobs)); - } - } - /** * A task that refreshes the UI components on this panel to reflect a * snapshot of the pending, running and completed auto ingest jobs lists of @@ -620,30 +593,22 @@ public final class AutoIngestDashboard extends JPanel implements Observer { */ private class RefreshComponentsTask implements Runnable { - private final List pendingJobs; - private final List runningJobs; - private final List completedJobs; + private final JobsSnapshot jobsSnapshot; /** * Constructs a task that refreshes the UI components on this panel to * reflect a snapshot of the pending, running and completed auto ingest * jobs lists of an auto ingest cluster. * - * @param pendingJobs The pending jobs list. - * @param runningJobs The running jobs list. - * @param completedJobs The completed jobs list. + * @param jobsSnapshot The jobs snapshot. */ - RefreshComponentsTask(List pendingJobs, List runningJobs, List completedJobs) { - this.pendingJobs = pendingJobs; - this.runningJobs = runningJobs; - this.completedJobs = completedJobs; + RefreshComponentsTask(JobsSnapshot jobsSnapshot) { + this.jobsSnapshot = jobsSnapshot; } @Override public void run() { - refreshTable(pendingJobs, pendingTable, pendingTableModel); - refreshTable(runningJobs, runningTable, runningTableModel); - refreshTable(completedJobs, completedTable, completedTableModel); + refreshTables(jobsSnapshot); } } @@ -677,7 +642,7 @@ public final class AutoIngestDashboard extends JPanel implements Observer { } } - + /** * 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 @@ -810,10 +775,10 @@ public final class AutoIngestDashboard extends JPanel implements Observer { .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(prioritizeButton, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE))) .addGap(0, 0, Short.MAX_VALUE)) - .addComponent(pendingScrollPane, javax.swing.GroupLayout.Alignment.TRAILING) .addComponent(runningScrollPane) .addComponent(completedScrollPane)) .addContainerGap()) + .addComponent(pendingScrollPane) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) @@ -824,13 +789,13 @@ public final class AutoIngestDashboard extends JPanel implements Observer { .addComponent(tbServicesStatusMessage, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(lbPending, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGap(1, 1, 1) .addComponent(pendingScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 215, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(lbRunning) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGap(1, 1, 1) .addComponent(runningScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 133, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(lbCompleted) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(completedScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 179, javax.swing.GroupLayout.PREFERRED_SIZE) @@ -888,4 +853,4 @@ public final class AutoIngestDashboard extends JPanel implements Observer { private javax.swing.JTextField tbServicesStatusMessage; // End of variables declaration//GEN-END:variables -} \ No newline at end of file +} diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardTopComponent.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardTopComponent.java index 6897e695e4..cf82192fcf 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardTopComponent.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardTopComponent.java @@ -26,6 +26,7 @@ import org.openide.windows.Mode; import org.openide.windows.TopComponent; import org.openide.windows.WindowManager; import org.sleuthkit.autopsy.coreutils.Logger; +import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil; /** * Top component which displays the Auto Ingest Dashboard interface. @@ -41,11 +42,18 @@ import org.sleuthkit.autopsy.coreutils.Logger; "CTL_AutoIngestDashboardTopComponent=Auto Ingest Dashboard"}) public final class AutoIngestDashboardTopComponent extends TopComponent { + private static final long serialVersionUID = 1L; public final static String PREFERRED_ID = "AutoIngestDashboardTopComponent"; // NON-NLS private static final Logger logger = Logger.getLogger(AutoIngestDashboardTopComponent.class.getName()); private static boolean topComponentInitialized = false; + @Messages({ + "AutoIngestDashboardTopComponent.exceptionMessage.failedToCreateDashboard=Failed to create Auto Ingest Dashboard.",}) public static void openTopComponent() { + /* + * DLG: Please make the top component initial size big enough to show + * the whole dashboard. + */ final AutoIngestDashboardTopComponent tc = (AutoIngestDashboardTopComponent) WindowManager.getDefault().findTopComponent(PREFERRED_ID); if (tc != null) { topComponentInitialized = true; @@ -60,14 +68,14 @@ public final class AutoIngestDashboardTopComponent extends TopComponent { dashboard = AutoIngestDashboard.createDashboard(); tc.add(dashboard); dashboard.setSize(dashboard.getPreferredSize()); - if (tc.isOpened() == false) { - tc.open(); - } - tc.toFront(); - tc.requestActive(); + if (tc.isOpened() == false) { + tc.open(); + } + tc.toFront(); + tc.requestActive(); } catch (AutoIngestDashboard.AutoIngestDashboardException ex) { - // DLG: Catch the exception, log it, and pop up an error dialog - // with a user-friendly message + logger.log(Level.SEVERE, "Unable to create auto ingest dashboard", ex); + MessageNotifyUtil.Message.error(Bundle.AutoIngestDashboardTopComponent_exceptionMessage_failedToCreateDashboard()); } } } @@ -129,5 +137,4 @@ public final class AutoIngestDashboardTopComponent extends TopComponent { // Variables declaration - do not modify//GEN-BEGIN:variables // End of variables declaration//GEN-END:variables - } diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestJob.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestJob.java index 3d61ca3fcb..39a4128ac7 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestJob.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestJob.java @@ -62,7 +62,7 @@ public final class AutoIngestJob implements Comparable, Serializa * Constructs an automated ingest job for a manifest. The manifest specifies * a co-located data source and a case to which the data source is to be * added. - * + * * Note: Manifest objects will be phased out and no longer be part of the * AutoIngestJob class. * @@ -73,6 +73,13 @@ public final class AutoIngestJob implements Comparable, Serializa * processing, otherwise the locla host. * @param stage The processing stage for display purposes. */ + /* + * DLG: We need a contrucotr that takes just the node data. When we have + * added the case dierectory path, the host name and the stage data to the + * ZK nodes, we probably cna use that constructor only. I'm thinking this + * because we will creater node data with initial values when we first + * discover the nodes, and then we will continue to update it. + */ AutoIngestJob(ManifestNodeData nodeData, Path caseDirectoryPath, String nodeName, Stage stage) { this.nodeData = nodeData; if (null != caseDirectoryPath) { @@ -234,10 +241,10 @@ public final class AutoIngestJob implements Comparable, Serializa if (obj == this) { return true; } - + Path manifestPath1 = this.getNodeData().getManifestFilePath(); - Path manifestPath2 = ((AutoIngestJob)obj).getNodeData().getManifestFilePath(); - + Path manifestPath2 = ((AutoIngestJob) obj).getNodeData().getManifestFilePath(); + return manifestPath1.equals(manifestPath2); } @@ -251,12 +258,11 @@ public final class AutoIngestJob implements Comparable, Serializa public int compareTo(AutoIngestJob o) { Date date1 = this.getNodeData().getManifestFileDate(); Date date2 = o.getNodeData().getManifestFileDate(); - + return -date1.compareTo(date2); } // DLG: Add a toString override - /** * Custom comparator that allows us to sort List on reverse * chronological date modified (descending) @@ -278,7 +284,7 @@ public final class AutoIngestJob implements Comparable, Serializa public int compare(AutoIngestJob job, AutoIngestJob anotherJob) { Integer priority1 = job.getNodeData().getPriority(); Integer priority2 = anotherJob.getNodeData().getPriority(); - + return -priority1.compareTo(priority2); } @@ -300,7 +306,7 @@ public final class AutoIngestJob implements Comparable, Serializa } else { String caseName1 = o1.getNodeData().getCaseName(); String caseName2 = o2.getNodeData().getCaseName(); - + return caseName1.compareToIgnoreCase(caseName2); } } diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMonitor.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMonitor.java index ecca4a3750..190e684c94 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMonitor.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMonitor.java @@ -64,28 +64,15 @@ public final class AutoIngestMonitor extends Observable implements PropertyChang @GuardedBy("jobsLock") private JobsSnapshot jobsSnapshot; - /** - * Creates an auto ingest monitor responsible for monitoring and reporting - * the processing of auto ingest jobs. - * - * @return The auto ingest monitor. - * - * @throws AutoIngestMonitorException If the monitor cannot be created. - */ - static AutoIngestMonitor createMonitor() throws AutoIngestMonitorException { - AutoIngestMonitor monitor = new AutoIngestMonitor(); - monitor.startUp(); - return monitor; - } - /** * Constructs an auto ingest monitor responsible for monitoring and * reporting the processing of auto ingest jobs. */ - private AutoIngestMonitor() { + AutoIngestMonitor() { eventPublisher = new AutopsyEventPublisher(); coordSvcQueryExecutor = new ScheduledThreadPoolExecutor(NUM_COORD_SVC_QUERY_THREADS, new ThreadFactoryBuilder().setNameFormat(COORD_SVC_QUERY_THREAD_NAME).build()); jobsLock = new Object(); + jobsSnapshot = new JobsSnapshot(); } /** @@ -94,7 +81,7 @@ public final class AutoIngestMonitor extends Observable implements PropertyChang * @throws AutoIngestMonitorException If there is a problem starting the * auto ingest monitor. */ - private void startUp() throws AutoIngestMonitor.AutoIngestMonitorException { + void startUp() throws AutoIngestMonitor.AutoIngestMonitorException { try { coordinationService = CoordinationService.getInstance(); } catch (CoordinationServiceException ex) { @@ -152,10 +139,12 @@ public final class AutoIngestMonitor extends Observable implements PropertyChang * @param event A auto ingest job started event. */ private void handleJobStartedEvent(AutoIngestJobStartedEvent event) { - // DLG: Remove job from event from pending queue, if present - // DLG: Add job to running jobs list - setChanged(); - notifyObservers(); + synchronized (jobsLock) { + // DLG: Remove job from pending queue, if present + // DLG: Add job to running jobs list + setChanged(); + notifyObservers(jobsSnapshot); + } } /** @@ -164,9 +153,11 @@ public final class AutoIngestMonitor extends Observable implements PropertyChang * @param event A auto ingest job status event. */ private void handleJobStatusEvent(AutoIngestJobStatusEvent event) { - // DLG: Replace job in running list with job from event - setChanged(); - notifyObservers(); + synchronized (jobsLock) { + // DLG: Replace job in running list with job from event + setChanged(); + notifyObservers(jobsSnapshot); + } } /** @@ -175,10 +166,12 @@ public final class AutoIngestMonitor extends Observable implements PropertyChang * @param event A auto ingest job completed event. */ private void handleJobCompletedEvent(AutoIngestJobCompletedEvent event) { - // DLG: Remove job from event from running list, if present - // DLG: Add job to completed list - setChanged(); - notifyObservers(); + synchronized (jobsLock) { + // DLG: Remove job from event from running list, if present + // DLG: Add job to completed list + setChanged(); + notifyObservers(jobsSnapshot); + } } /** @@ -187,9 +180,11 @@ public final class AutoIngestMonitor extends Observable implements PropertyChang * @param event A job/case prioritization event. */ private void handleCasePrioritizationEvent(AutoIngestCasePrioritizedEvent event) { - // DLG: Replace job in pending queue with job from event - setChanged(); - notifyObservers(); + synchronized (jobsLock) { + // DLG: Replace job in pending queue with job from event + setChanged(); + notifyObservers(jobsSnapshot); + } } /** @@ -289,7 +284,7 @@ public final class AutoIngestMonitor extends Observable implements PropertyChang } prioritizedJob.getNodeData().setPriority(highestPriority); } - + /* * Publish a prioritization event. */ diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties index 339efda395..9445774fc7 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties @@ -202,7 +202,7 @@ ReviewModeCasePanel.OutputFolderHeaderText=Output Folder ReviewModeCasePanel.LastAccessedTimeHeaderText=Last Accessed Time CopyFilesPanel.bnOptions.text=&Options AutoIngestDashboard.lbServicesStatus.text=Services Status: -AutoIngestDashboard.tbServicesStatusMessage.text= +AutoIngestDashboard.tbServicesStatusMessage.text=Connecting... FileExporterSettingsPanel.ChooseRootDirectory=Choose a root directory for file output FileExporterSettingsPanel.ChooseReportDirectory=Choose a report directory FileExporterSettingsPanel.RuleName=Rule Name diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/ManifestNodeData.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/ManifestNodeData.java index 7dddb8d92e..4813cbf887 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/ManifestNodeData.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/ManifestNodeData.java @@ -1,7 +1,7 @@ /* * Autopsy Forensic Browser * - * Copyright 2015-2017 Basis Technology Corp. + * Copyright 2011-2017 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -26,34 +26,56 @@ import java.util.Date; import javax.lang.model.type.TypeKind; /** - * A coordination service node data transfer object for an auto ingest job - * manifest. The data include: processing status, priority, the number of times - * the auto ingest job for the manifest has crashed during processing, and the - * date the auto ingest job for the manifest was completed. + * A coordination service node data transfer object for an auto ingest job. */ final class ManifestNodeData implements Serializable { - private static final int NODE_DATA_VERSION = 2; + private static final long serialVersionUID = 1L; + private static final int NODE_DATA_VERSION = 1; private static final int MAX_POSSIBLE_NODE_DATA_SIZE = 65831; - private static final int DEFAULT_PRIORITY = 0; + + /* + * Version 0 fields. + */ private final boolean coordSvcNodeDataWasSet; - private ProcessingStatus status; private int priority; private int numberOfCrashes; private long completedDate; private boolean errorsOccurred; - - // These are not used by version '1' nodes. + + /* + * Version 1 fields. + */ private int version; private String deviceId; private String caseName; private long manifestFileDate; private String manifestFilePath; private String dataSourcePath; - //DLG: Add caseDirectoryPath from AutoIngestJob + //DLG: Add caseDirectoryPath from AutoIngestJob + /* + * DLG: Rename class to AutoIngestJobNodeData - Add String + * caseDirectoryPath. Needed to locate case auto ingest log and later, for + * case deletion + * + * Add String processingStage, long processingStageStartDate, String + * processingHost fields. These three fields are needed to populate running + * jobs table; use of auto ingest job data is not enough, because there + * would be no data until a status event was received by the auto ingest + * monitor. + * + * Update the AutoIngestManager code that creates ZK nodes for auto ingest + * jobs to write the new fields described above to new nodes + * + * Update the AutoIngestManager code that publishes auto ingest status + * events for the current job to update the the processing status fields + * described above in addition to publishing AutoIngestJobStatusEvents. + * Probably also need to write this data initially when a jo becomes the + * current job. + */ /** * Constructs a coordination service node data data transfer object for an * auto ingest manifest from the raw bytes obtained from the coordination @@ -72,7 +94,7 @@ final class ManifestNodeData implements Serializable { this.status = ProcessingStatus.PROCESSING; } else if (ProcessingStatus.COMPLETED.ordinal() == rawStatus) { this.status = ProcessingStatus.COMPLETED; - }else if (ProcessingStatus.DELETED.ordinal() == rawStatus) { + } else if (ProcessingStatus.DELETED.ordinal() == rawStatus) { this.status = ProcessingStatus.DELETED; } this.priority = buffer.getInt(); @@ -87,11 +109,11 @@ final class ManifestNodeData implements Serializable { this.completedDate = 0L; this.errorsOccurred = false; } - - if(buffer.hasRemaining()) { + + if (buffer.hasRemaining()) { // Version is greater than 1 this.version = buffer.getInt(); - if(this.version > NODE_DATA_VERSION) { + if (this.version > NODE_DATA_VERSION) { throw new ManifestNodeDataException(String.format( "Node data version %d is not suppored.", this.version)); @@ -101,8 +123,7 @@ final class ManifestNodeData implements Serializable { this.manifestFileDate = buffer.getLong(); this.manifestFilePath = getStringFromBuffer(buffer, TypeKind.SHORT); this.dataSourcePath = getStringFromBuffer(buffer, TypeKind.SHORT); - } - else { + } else { this.version = 1; this.deviceId = ""; this.caseName = ""; @@ -132,7 +153,7 @@ final class ManifestNodeData implements Serializable { this.numberOfCrashes = numberOfCrashes; this.completedDate = completedDate.getTime(); this.errorsOccurred = errorOccurred; - + this.version = NODE_DATA_VERSION; this.deviceId = manifest.getDeviceId(); this.caseName = manifest.getCaseName(); @@ -253,55 +274,55 @@ final class ManifestNodeData implements Serializable { void setErrorsOccurred(boolean errorsOccurred) { this.errorsOccurred = errorsOccurred; } - + /** * Get the node data version. - * + * * @return The node data version. */ int getVersion() { return this.version; } - + /** * Set the node data version. - * + * * @param version The node data version. */ void setVersion(int version) { this.version = version; } - + /** * Get the device ID. - * + * * @return The device ID. */ String getDeviceId() { return this.deviceId; } - + /** * Set the device ID. - * + * * @param deviceId The device ID. */ void setDeviceId(String deviceId) { this.deviceId = deviceId; } - + /** * Get the case name. - * + * * @return The case name. */ String getCaseName() { return this.caseName; } - + /** * Set the case name. - * + * * @param caseName The case name. */ void setCaseName(String caseName) { @@ -329,32 +350,32 @@ final class ManifestNodeData implements Serializable { void setManifestFileDate(Date manifestFileDate) { this.manifestFileDate = manifestFileDate.getTime(); } - + /** * Get the manifest file path. - * + * * @return The manifest file path. */ Path getManifestFilePath() { return Paths.get(this.manifestFilePath); } - + /** * Set the manifest file path. - * + * * @param manifestFilePath The manifest file path. */ void setManifestFilePath(Path manifestFilePath) { if (manifestFilePath != null) { - this.manifestFilePath = manifestFilePath.toString(); + this.manifestFilePath = manifestFilePath.toString(); } else { this.manifestFilePath = ""; } } - + /** * Get the data source path. - * + * * @return The data source path. */ Path getDataSourcePath() { @@ -363,21 +384,21 @@ final class ManifestNodeData implements Serializable { /** * Get the file name portion of the data source path. - * + * * @return The data source file name. */ public String getDataSourceFileName() { return Paths.get(dataSourcePath).getFileName().toString(); } - + /** * Set the data source path. - * + * * @param dataSourcePath The data source path. */ void setDataSourcePath(Path dataSourcePath) { if (dataSourcePath != null) { - this.dataSourcePath = dataSourcePath.toString(); + this.dataSourcePath = dataSourcePath.toString(); } else { this.dataSourcePath = ""; } @@ -391,15 +412,15 @@ final class ManifestNodeData implements Serializable { */ byte[] toArray() { ByteBuffer buffer = ByteBuffer.allocate(MAX_POSSIBLE_NODE_DATA_SIZE); - + // Write data (compatible with version 0) buffer.putInt(this.status.ordinal()); buffer.putInt(this.priority); buffer.putInt(this.numberOfCrashes); buffer.putLong(this.completedDate); buffer.putInt(this.errorsOccurred ? 1 : 0); - - if(this.version > 0) { + + if (this.version > 0) { // Write version buffer.putInt(this.version); @@ -410,20 +431,20 @@ final class ManifestNodeData implements Serializable { putStringIntoBuffer(manifestFilePath, buffer, TypeKind.SHORT); putStringIntoBuffer(dataSourcePath, buffer, TypeKind.SHORT); } - + // Prepare the array byte[] array = new byte[buffer.position()]; buffer.rewind(); buffer.get(array, 0, array.length); - + return array; } - + private String getStringFromBuffer(ByteBuffer buffer, TypeKind lengthType) { int length = 0; String output = ""; - - switch(lengthType) { + + switch (lengthType) { case BYTE: length = buffer.get(); break; @@ -431,26 +452,26 @@ final class ManifestNodeData implements Serializable { length = buffer.getShort(); break; } - - if(length > 0) { + + if (length > 0) { byte[] array = new byte[length]; buffer.get(array, 0, length); output = new String(array); } - + return output; } - + private void putStringIntoBuffer(String stringValue, ByteBuffer buffer, TypeKind lengthType) { - switch(lengthType) { + switch (lengthType) { case BYTE: - buffer.put((byte)stringValue.length()); + buffer.put((byte) stringValue.length()); break; case SHORT: - buffer.putShort((short)stringValue.length()); + buffer.putShort((short) stringValue.length()); break; } - + buffer.put(stringValue.getBytes()); } diff --git a/branding/core/core.jar/org/netbeans/core/startup/Bundle.properties b/branding/core/core.jar/org/netbeans/core/startup/Bundle.properties index 5d5b0cd16d..2922cd2054 100644 --- a/branding/core/core.jar/org/netbeans/core/startup/Bundle.properties +++ b/branding/core/core.jar/org/netbeans/core/startup/Bundle.properties @@ -1,5 +1,5 @@ #Updated by build script -#Thu, 22 Jun 2017 08:50:21 -0400 +#Thu, 07 Sep 2017 13:53:53 -0400 LBL_splash_window_title=Starting Autopsy SPLASH_HEIGHT=314 SPLASH_WIDTH=538 @@ -8,4 +8,4 @@ SplashRunningTextBounds=0,289,538,18 SplashRunningTextColor=0x0 SplashRunningTextFontSize=19 -currentVersion=Autopsy 4.4.1 \ No newline at end of file +currentVersion=Autopsy 4.4.2 diff --git a/branding/modules/org-netbeans-core-windows.jar/org/netbeans/core/windows/view/ui/Bundle.properties b/branding/modules/org-netbeans-core-windows.jar/org/netbeans/core/windows/view/ui/Bundle.properties index ed34d34298..2ac51b0cbd 100644 --- a/branding/modules/org-netbeans-core-windows.jar/org/netbeans/core/windows/view/ui/Bundle.properties +++ b/branding/modules/org-netbeans-core-windows.jar/org/netbeans/core/windows/view/ui/Bundle.properties @@ -1,4 +1,4 @@ #Updated by build script -#Thu, 22 Jun 2017 08:50:21 -0400 -CTL_MainWindow_Title=Autopsy 4.4.1 -CTL_MainWindow_Title_No_Project=Autopsy 4.4.1 \ No newline at end of file +#Thu, 07 Sep 2017 13:53:53 -0400 +CTL_MainWindow_Title=Autopsy 4.4.2 +CTL_MainWindow_Title_No_Project=Autopsy 4.4.2 From 55dd19b39c24a8736b8ba962f8dbcadd8c46a23c Mon Sep 17 00:00:00 2001 From: millmanorama Date: Sun, 20 Aug 2017 18:30:07 -0400 Subject: [PATCH 079/104] WIP --- .../autopsy/keywordsearch/KeywordHit.java | 30 +++++++++++-------- .../KeywordSearchResultFactory.java | 18 ++++++----- .../autopsy/keywordsearch/LuceneQuery.java | 8 +++-- .../autopsy/keywordsearch/RegexQuery.java | 9 +++--- .../keywordsearch/TermsComponentQuery.java | 23 +++++++------- 5 files changed, 50 insertions(+), 38 deletions(-) diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordHit.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordHit.java index 87ddac3d22..1d588dcf58 100755 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordHit.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordHit.java @@ -19,6 +19,7 @@ package org.sleuthkit.autopsy.keywordsearch; import java.util.Comparator; +import java.util.Optional; import org.apache.commons.lang3.StringUtils; import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.datamodel.BlackboardArtifact; @@ -26,10 +27,10 @@ import org.sleuthkit.datamodel.SleuthkitCase; import org.sleuthkit.datamodel.TskCoreException; /** - * Stores the fact that file or an artifact associated with a file had a keyword - * hit. All instances make both the document id of the Solr document where the - * keyword was found and the object Id available to clients. Artifact keyword - * hits also make the artifact available to clients. + * Represents the fact that a file or an artifact associated with a file had a + * keyword hit. All instances make both the document id of the Solr document + * where the keyword was found and the object Id of the file available to + * clients. Artifact keyword hits also make the artifact available to clients. */ class KeywordHit implements Comparable { @@ -38,7 +39,7 @@ class KeywordHit implements Comparable { private final int chunkId; private final String snippet; private final long contentID; - private final BlackboardArtifact artifact; + private final boolean hitOnArtifact; private final String hit; public String getHit() { @@ -67,18 +68,18 @@ class KeywordHit implements Comparable { this.solrObjectId = Long.parseLong(solrDocumentId); this.chunkId = 0; } + hitOnArtifact = this.solrObjectId < 0; /* * If the high order bit of the object id is set (ie, it is negative), * the hit was in an artifact, look up the artifact. */ - if (this.solrObjectId < 0) { + if (hitOnArtifact) { SleuthkitCase caseDb = Case.getCurrentCase().getSleuthkitCase(); - this.artifact = caseDb.getBlackboardArtifact(this.solrObjectId); + BlackboardArtifact artifact = caseDb.getBlackboardArtifact(this.solrObjectId); contentID = artifact.getObjectID(); } else { //else the object id is for content. - this.artifact = null; contentID = this.solrObjectId; } } @@ -113,17 +114,20 @@ class KeywordHit implements Comparable { * @return */ boolean isArtifactHit() { - return (null != this.artifact); + return hitOnArtifact; } /** * If this hit is in the indexed text of an artifact, get that artifact. * - * @return The artifact whose indexed text this hit is in, or null if it is - * not an artifacts hit. + * @return The artifact whose indexed text this hit is in. */ - BlackboardArtifact getArtifact() { - return this.artifact; + Optional getArtifactID() { + if (hitOnArtifact) { + return Optional.of(solrObjectId); + } else { + return Optional.empty(); + } } @Override diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchResultFactory.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchResultFactory.java index b603f7b68c..bcc08a3726 100755 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchResultFactory.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchResultFactory.java @@ -140,7 +140,7 @@ class KeywordSearchResultFactory extends ChildFactory { queryResults = queryRequest.performQuery(); } catch (KeywordSearchModuleException | NoOpenCoreException ex) { logger.log(Level.SEVERE, "Could not perform the query " + queryRequest.getQueryString(), ex); //NON-NLS - MessageNotifyUtil.Notify.error(Bundle.KeywordSearchResultFactory_query_exception_msg() + queryRequest.getQueryString(), ex.getCause().getMessage()); + MessageNotifyUtil.Notify.error(org.sleuthkit.autopsy.keywordsearch.Bundle.KeywordSearchResultFactory_query_exception_msg() + queryRequest.getQueryString(), ex.getCause().getMessage()); return false; } SleuthkitCase tskCase = null; @@ -186,12 +186,16 @@ class KeywordSearchResultFactory extends ChildFactory { properties.put(TSK_KEYWORD_PREVIEW.getDisplayName(), hit.getSnippet()); } - String hitName = hit.isArtifactHit() - ? hit.getArtifact().getDisplayName() + " Artifact" //NON-NLS - : contentName; - - hitNumber++; - tempList.add(new KeyValueQueryContent(hitName, properties, hitNumber, hit.getSolrObjectId(), content, queryRequest, queryResults)); + try { + String hitName = hit.isArtifactHit() + ? tskCase.getBlackboardArtifact(hit.getArtifactID().get()).getDisplayName() + " Artifact" //NON-NLS + : contentName; + hitNumber++; + tempList.add(new KeyValueQueryContent(hitName, properties, hitNumber, hit.getSolrObjectId(), content, queryRequest, queryResults)); + } catch (TskCoreException ex) { + Exceptions.printStackTrace(ex); + return false; + } } // Add all the nodes to toPopulate at once. Minimizes node creation diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/LuceneQuery.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/LuceneQuery.java index 3821501574..f89dae123d 100755 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/LuceneQuery.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/LuceneQuery.java @@ -225,9 +225,11 @@ class LuceneQuery implements KeywordSearchQuery { } } - if (hit.isArtifactHit()) { - attributes.add(new BlackboardAttribute(ATTRIBUTE_TYPE.TSK_ASSOCIATED_ARTIFACT, MODULE_NAME, hit.getArtifact().getArtifactID())); - } + + hit.getArtifactID().ifPresent(artifactID + -> attributes.add(new BlackboardAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_ASSOCIATED_ARTIFACT, MODULE_NAME, artifactID)) + ); + try { bba.addAttributes(attributes); //write out to bb diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/RegexQuery.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/RegexQuery.java index 6b91c9c2fb..a422d9f9c3 100755 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/RegexQuery.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/RegexQuery.java @@ -417,7 +417,7 @@ final class RegexQuery implements KeywordSearchQuery { final BlackboardAttribute ccnAttribute = parsedTrackAttributeMap.get(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_CARD_NUMBER)); if (ccnAttribute == null || StringUtils.isBlank(ccnAttribute.getValueString())) { if (hit.isArtifactHit()) { - LOGGER.log(Level.SEVERE, String.format("Failed to parse credit card account number for artifact keyword hit: term = %s, snippet = '%s', artifact id = %d", foundKeyword.getSearchTerm(), hit.getSnippet(), hit.getArtifact().getArtifactID())); //NON-NLS + LOGGER.log(Level.SEVERE, String.format("Failed to parse credit card account number for artifact keyword hit: term = %s, snippet = '%s', artifact id = %d", foundKeyword.getSearchTerm(), hit.getSnippet(), hit.getArtifactID().get())); //NON-NLS } else { LOGGER.log(Level.SEVERE, String.format("Failed to parse credit card account number for content keyword hit: term = %s, snippet = '%s', object id = %d", foundKeyword.getSearchTerm(), hit.getSnippet(), hit.getContentID())); //NON-NLS } @@ -480,9 +480,10 @@ final class RegexQuery implements KeywordSearchQuery { if (snippet != null) { attributes.add(new BlackboardAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_KEYWORD_PREVIEW, MODULE_NAME, snippet)); } - if (hit.isArtifactHit()) { - attributes.add(new BlackboardAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_ASSOCIATED_ARTIFACT, MODULE_NAME, hit.getArtifact().getArtifactID())); - } + + hit.getArtifactID().ifPresent(artifactID + -> attributes.add(new BlackboardAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_ASSOCIATED_ARTIFACT, MODULE_NAME, artifactID)) + ); attributes.add(new BlackboardAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_KEYWORD_SEARCH_TYPE, MODULE_NAME, KeywordSearch.QueryType.REGEX.ordinal())); diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/TermsComponentQuery.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/TermsComponentQuery.java index 62c7dd601d..f37be9952e 100755 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/TermsComponentQuery.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/TermsComponentQuery.java @@ -359,7 +359,7 @@ final class TermsComponentQuery implements KeywordSearchQuery { final BlackboardAttribute ccnAttribute = parsedTrackAttributeMap.get(new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_CARD_NUMBER)); if (ccnAttribute == null || StringUtils.isBlank(ccnAttribute.getValueString())) { if (hit.isArtifactHit()) { - LOGGER.log(Level.SEVERE, String.format("Failed to parse credit card account number for artifact keyword hit: term = %s, snippet = '%s', artifact id = %d", searchTerm, hit.getSnippet(), hit.getArtifact().getArtifactID())); //NON-NLS + LOGGER.log(Level.SEVERE, String.format("Failed to parse credit card account number for artifact keyword hit: term = %s, snippet = '%s', artifact id = %d", searchTerm, hit.getSnippet(), hit.getArtifactID().get())); //NON-NLS } else { LOGGER.log(Level.SEVERE, String.format("Failed to parse credit card account number for content keyword hit: term = %s, snippet = '%s', object id = %d", searchTerm, hit.getSnippet(), hit.getContentID())); //NON-NLS } @@ -398,7 +398,7 @@ final class TermsComponentQuery implements KeywordSearchQuery { * hit. */ if (content instanceof AbstractFile) { - AbstractFile file = (AbstractFile)content; + AbstractFile file = (AbstractFile) content; if (file.getType() == TskData.TSK_DB_FILES_TYPE_ENUM.UNUSED_BLOCKS || file.getType() == TskData.TSK_DB_FILES_TYPE_ENUM.UNALLOC_BLOCKS) { attributes.add(new BlackboardAttribute(KEYWORD_SEARCH_DOCUMENT_ID, MODULE_NAME, hit.getSolrDocumentId())); @@ -422,9 +422,10 @@ final class TermsComponentQuery implements KeywordSearchQuery { if (snippet != null) { attributes.add(new BlackboardAttribute(ATTRIBUTE_TYPE.TSK_KEYWORD_PREVIEW, MODULE_NAME, snippet)); } - if (hit.isArtifactHit()) { - attributes.add(new BlackboardAttribute(ATTRIBUTE_TYPE.TSK_ASSOCIATED_ARTIFACT, MODULE_NAME, hit.getArtifact().getArtifactID())); - } + + hit.getArtifactID().ifPresent( + artifactID -> attributes.add(new BlackboardAttribute(ATTRIBUTE_TYPE.TSK_ASSOCIATED_ARTIFACT, MODULE_NAME, artifactID)) + ); // TermsComponentQuery is now being used exclusively for substring searches. attributes.add(new BlackboardAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_KEYWORD_SEARCH_TYPE, MODULE_NAME, KeywordSearch.QueryType.SUBSTRING.ordinal())); @@ -472,12 +473,12 @@ final class TermsComponentQuery implements KeywordSearchQuery { * Creates an attribute of the the given type to the given artifact with a * value parsed from the snippet for a credit account number hit. * - * @param attributesMap A map of artifact attribute objects, used to avoid - * creating duplicate attributes. - * @param attrType The type of attribute to create. - * @param groupName The group name of the regular expression that was - * used to parse the attribute data. - * @param matcher A matcher for the snippet. + * @param attributeMap A map of artifact attribute objects, used to avoid + * creating duplicate attributes. + * @param attrType The type of attribute to create. + * @param groupName The group name of the regular expression that was + * used to parse the attribute data. + * @param matcher A matcher for the snippet. */ static private void addAttributeIfNotAlreadyCaptured(Map attributeMap, ATTRIBUTE_TYPE attrType, String groupName, Matcher matcher) { BlackboardAttribute.Type type = new BlackboardAttribute.Type(attrType); From 81e22212e8a165f302e9e477d0cfb4942f4ec52d Mon Sep 17 00:00:00 2001 From: millmanorama Date: Thu, 7 Sep 2017 16:38:33 +0200 Subject: [PATCH 080/104] do direct db query for contentID intead of getting the entire artifact. --- .../autopsy/keywordsearch/KeywordHit.java | 15 ++++++++++--- .../KeywordSearchResultFactory.java | 22 +++++++++++-------- 2 files changed, 25 insertions(+), 12 deletions(-) diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordHit.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordHit.java index 1d588dcf58..13e0f60314 100755 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordHit.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordHit.java @@ -18,11 +18,12 @@ */ package org.sleuthkit.autopsy.keywordsearch; +import java.sql.ResultSet; +import java.sql.SQLException; import java.util.Comparator; import java.util.Optional; import org.apache.commons.lang3.StringUtils; import org.sleuthkit.autopsy.casemodule.Case; -import org.sleuthkit.datamodel.BlackboardArtifact; import org.sleuthkit.datamodel.SleuthkitCase; import org.sleuthkit.datamodel.TskCoreException; @@ -76,8 +77,16 @@ class KeywordHit implements Comparable { */ if (hitOnArtifact) { SleuthkitCase caseDb = Case.getCurrentCase().getSleuthkitCase(); - BlackboardArtifact artifact = caseDb.getBlackboardArtifact(this.solrObjectId); - contentID = artifact.getObjectID(); + try (SleuthkitCase.CaseDbQuery executeQuery = caseDb.executeQuery("select obj_id from blackboard_artifacts where artifact_id = " + this.solrObjectId); + ResultSet resultSet = executeQuery.getResultSet();) { + if (resultSet.next()) { + contentID = resultSet.getLong("obj_id"); + } else { + throw new TskCoreException("Failed to get obj_id for artifact with artifact_id =" + this.solrObjectId + ". No matching artifact was found."); + } + } catch (SQLException ex) { + throw new TskCoreException("Error getting obj_id for artifact with artifact_id =" + this.solrObjectId, ex); + } } else { //else the object id is for content. contentID = this.solrObjectId; diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchResultFactory.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchResultFactory.java index bcc08a3726..fb467cca00 100755 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchResultFactory.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchResultFactory.java @@ -186,16 +186,20 @@ class KeywordSearchResultFactory extends ChildFactory { properties.put(TSK_KEYWORD_PREVIEW.getDisplayName(), hit.getSnippet()); } - try { - String hitName = hit.isArtifactHit() - ? tskCase.getBlackboardArtifact(hit.getArtifactID().get()).getDisplayName() + " Artifact" //NON-NLS - : contentName; - hitNumber++; - tempList.add(new KeyValueQueryContent(hitName, properties, hitNumber, hit.getSolrObjectId(), content, queryRequest, queryResults)); - } catch (TskCoreException ex) { - Exceptions.printStackTrace(ex); - return false; + String hitName; + if (hit.isArtifactHit()) { + try { + hitName = tskCase.getBlackboardArtifact(hit.getArtifactID().get()).getDisplayName() + " Artifact"; //NON-NLS + } catch (TskCoreException ex) { + logger.log(Level.SEVERE, "Error getting blckboard artifact by id", ex); + return false; + } + } else { + hitName = contentName; } + hitNumber++; + tempList.add(new KeyValueQueryContent(hitName, properties, hitNumber, hit.getSolrObjectId(), content, queryRequest, queryResults)); + } // Add all the nodes to toPopulate at once. Minimizes node creation From 8d32e244814f481839079023964f8ddb1b5127f6 Mon Sep 17 00:00:00 2001 From: Ann Priestman Date: Fri, 8 Sep 2017 08:37:13 -0400 Subject: [PATCH 081/104] Don't allow a user to run correlation engine if the case is multiuser but the central repo database is sqlite --- .../ingestmodule/IngestModule.java | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/ingestmodule/IngestModule.java b/Core/src/org/sleuthkit/autopsy/centralrepository/ingestmodule/IngestModule.java index 3eb5b1de37..a2b2e2199b 100755 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/ingestmodule/IngestModule.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/ingestmodule/IngestModule.java @@ -39,6 +39,7 @@ import org.sleuthkit.autopsy.centralrepository.datamodel.EamArtifact; import org.sleuthkit.autopsy.centralrepository.datamodel.EamArtifactInstance; import org.sleuthkit.autopsy.centralrepository.datamodel.EamDataSource; import org.sleuthkit.autopsy.centralrepository.datamodel.EamDb; +import org.sleuthkit.autopsy.centralrepository.datamodel.EamDbPlatformEnum; import org.sleuthkit.datamodel.AbstractFile; import org.sleuthkit.datamodel.BlackboardArtifact; import org.sleuthkit.datamodel.BlackboardAttribute; @@ -164,6 +165,11 @@ class IngestModule implements FileIngestModule { */ return; } + + // If either of these are null, then the ingest module never got through startup + if((eamCase == null) || (eamDataSource == null)){ + return; + } EamDb dbManager; try { @@ -210,6 +216,13 @@ class IngestModule implements FileIngestModule { } return; } + + // Don't allow sqlite central repo databases to be used for multi user cases + if((Case.getCurrentCase().getCaseType() == Case.CaseType.MULTI_USER_CASE) + && (EamDbPlatformEnum.getSelectedPlatform() == EamDbPlatformEnum.SQLITE)){ + LOGGER.log(Level.SEVERE, "Cannot run correlation engine on a multi-user case with a SQLite Central Repository."); + throw new IngestModuleException("Cannot run on a multi-user case with a SQLite Central Repository."); // NON-NLS + } jobId = context.getJobId(); eamCase = new EamCase(Case.getCurrentCase().getName(), Case.getCurrentCase().getDisplayName()); @@ -231,7 +244,7 @@ class IngestModule implements FileIngestModule { LOGGER.log(Level.SEVERE, "Error connecting to Central Repository database.", ex); // NON-NLS throw new IngestModuleException("Error connecting to Central Repository database.", ex); // NON-NLS } - + try { filesType = dbManager.getCorrelationTypeById(EamArtifact.FILES_TYPE_ID); } catch (EamDbException ex) { From aadb79331fb259983fec5fb7020ad40e16f1202d Mon Sep 17 00:00:00 2001 From: millmanorama Date: Fri, 8 Sep 2017 16:25:00 +0200 Subject: [PATCH 082/104] Cleanup KeywordHit.java --- .../autopsy/keywordsearch/KeywordHit.java | 54 ++++++++++++------- 1 file changed, 36 insertions(+), 18 deletions(-) diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordHit.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordHit.java index 13e0f60314..1cfcab98ab 100755 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordHit.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordHit.java @@ -31,10 +31,13 @@ import org.sleuthkit.datamodel.TskCoreException; * Represents the fact that a file or an artifact associated with a file had a * keyword hit. All instances make both the document id of the Solr document * where the keyword was found and the object Id of the file available to - * clients. Artifact keyword hits also make the artifact available to clients. + * clients. Keyword hits on the indexed text of an artifact also make the + * artifact available to clients. */ class KeywordHit implements Comparable { + private static final String GET_CONTENT_ID_FROM_ARTIFACT_ID = "SELECT obj_id FROM blackboard_artifacts WHERE artifact_id = "; + private final String solrDocumentId; private final long solrObjectId; private final int chunkId; @@ -43,41 +46,52 @@ class KeywordHit implements Comparable { private final boolean hitOnArtifact; private final String hit; - public String getHit() { - return hit; - } - + /** + * Constructor + * + * @param solrDocumentId The ID of the document this hit is in. + * @param snippet A small amount of text from the document containing + * the hit. + * @param hit The exact text from the document that was the hit. + * For some searches (ie substring,regex) this will be + * different than the search term. + * + * @throws TskCoreException If there is a problem getting the underlying + * content associated with a hit on the text of an + * artifact.. + */ KeywordHit(String solrDocumentId, String snippet, String hit) throws TskCoreException { this.snippet = StringUtils.stripToEmpty(snippet); this.hit = hit; this.solrDocumentId = solrDocumentId; - /** + /* * Parse the Solr document id to get the Solr object id and chunk id. - * The Solr object id will either be a file id or an artifact id from - * the case database. + * The Solr object id will either be the object id of a file id or an + * artifact id from the case database. * * For every object (file or artifact) there will at least two Solr * documents. One contains object metadata (chunk #1) and the second and * subsequent documents contain chunks of the text. */ - final int separatorIndex = solrDocumentId.indexOf(Server.CHUNK_ID_SEPARATOR); - if (-1 != separatorIndex) { - this.solrObjectId = Long.parseLong(solrDocumentId.substring(0, separatorIndex)); - this.chunkId = Integer.parseInt(solrDocumentId.substring(separatorIndex + 1)); - } else { + String[] split = solrDocumentId.split(Server.CHUNK_ID_SEPARATOR); + if (split.length == 1) { + //chunk 0 has only the bare document id without the chunk id. this.solrObjectId = Long.parseLong(solrDocumentId); this.chunkId = 0; + } else { + this.solrObjectId = Long.parseLong(split[0]); + this.chunkId = Integer.parseInt(split[1]); } + + //artifacts have negative obj ids hitOnArtifact = this.solrObjectId < 0; - /* - * If the high order bit of the object id is set (ie, it is negative), - * the hit was in an artifact, look up the artifact. - */ if (hitOnArtifact) { + // If the hit was in an artifact, look up the artifact. SleuthkitCase caseDb = Case.getCurrentCase().getSleuthkitCase(); - try (SleuthkitCase.CaseDbQuery executeQuery = caseDb.executeQuery("select obj_id from blackboard_artifacts where artifact_id = " + this.solrObjectId); + try (SleuthkitCase.CaseDbQuery executeQuery = + caseDb.executeQuery(GET_CONTENT_ID_FROM_ARTIFACT_ID + this.solrObjectId); ResultSet resultSet = executeQuery.getResultSet();) { if (resultSet.next()) { contentID = resultSet.getLong("obj_id"); @@ -93,6 +107,10 @@ class KeywordHit implements Comparable { } } + String getHit() { + return hit; + } + String getSolrDocumentId() { return this.solrDocumentId; } From 03d4e139fc8a942863763e50155f0aff52d5b95a Mon Sep 17 00:00:00 2001 From: "U-BASIS\\dgrove" Date: Fri, 8 Sep 2017 11:00:50 -0400 Subject: [PATCH 083/104] Fixes for bundle messages. --- .../autoingest/AutoIngestControlPanel.java | 171 +++++++++++------- .../autoingest/AutoIngestDashboard.form | 8 +- .../autoingest/AutoIngestDashboard.java | 33 +++- .../AutoIngestDashboardTopComponent.java | 2 +- .../autoingest/AutoIngestJob.java | 14 +- ...deData.java => AutoIngestJobNodeData.java} | 35 +++- ...va => AutoIngestJobNodeDataException.java} | 6 +- .../autoingest/AutoIngestManager.java | 64 +++---- .../autoingest/AutoIngestMonitor.java | 6 +- .../experimental/autoingest/Bundle.properties | 40 ---- 10 files changed, 206 insertions(+), 173 deletions(-) rename Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/{ManifestNodeData.java => AutoIngestJobNodeData.java} (90%) rename Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/{ManifestNodeDataException.java => AutoIngestJobNodeDataException.java} (86%) diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestControlPanel.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestControlPanel.java index 8c9baf5970..df71bb1483 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestControlPanel.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestControlPanel.java @@ -54,6 +54,7 @@ import org.openide.DialogDisplayer; import org.openide.LifecycleManager; import org.openide.NotifyDescriptor; import org.openide.util.NbBundle; +import org.openide.util.NbBundle.Messages; import org.openide.windows.WindowManager; import org.sleuthkit.autopsy.core.ServicesMonitor; import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil; @@ -64,11 +65,6 @@ import org.sleuthkit.autopsy.ingest.IngestProgressSnapshotDialog; import org.sleuthkit.autopsy.experimental.autoingest.AutoIngestManager.CaseDeletionResult; import org.sleuthkit.autopsy.experimental.autoingest.AutoIngestManager.JobsSnapshot; -/* - * DLG: sort out bundle key value pairs, this class is depending on some for - * AuotIngestDashboard, whivh may not exist or may go away. It should have all - * of its own key value pairs defined using the @Messages annotatino. - */ /** * A panel for monitoring automated ingest by a cluster, and for controlling * automated ingest for a single node within the cluster. There can be at most @@ -119,20 +115,33 @@ public final class AutoIngestControlPanel extends JPanel implements Observer { * allows the columns of the table model to be described by either an enum * ordinal or a column header string. */ + @Messages({ + "AutoIngestControlPanel.JobsTableModel.ColumnHeader.Case=Case", + "AutoIngestControlPanel.JobsTableModel.ColumnHeader.ImageFolder=Data Source", + "AutoIngestControlPanel.JobsTableModel.ColumnHeader.HostName=Host Name", + "AutoIngestControlPanel.JobsTableModel.ColumnHeader.CreatedTime=Job Created", + "AutoIngestControlPanel.JobsTableModel.ColumnHeader.StartedTime=Stage Started", + "AutoIngestControlPanel.JobsTableModel.ColumnHeader.CompletedTime=Job Completed", + "AutoIngestControlPanel.JobsTableModel.ColumnHeader.Stage=Stage", + "AutoIngestControlPanel.JobsTableModel.ColumnHeader.Status=Status", + "AutoIngestControlPanel.JobsTableModel.ColumnHeader.CaseFolder=Case Folder", + "AutoIngestControlPanel.JobsTableModel.ColumnHeader.LocalJob= Local Job?", + "AutoIngestControlPanel.JobsTableModel.ColumnHeader.ManifestFilePath= Manifest File Path" + }) private enum JobsTableModelColumns { - CASE(NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.Case")), - DATA_SOURCE(NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.ImageFolder")), - HOST_NAME(NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.HostName")), - CREATED_TIME(NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.CreatedTime")), - STARTED_TIME(NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.StartedTime")), - COMPLETED_TIME(NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.CompletedTime")), - STAGE(NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.Stage")), - STAGE_TIME(NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.StageTime")), - STATUS(NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.Status")), - CASE_DIRECTORY_PATH(NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.CaseFolder")), - IS_LOCAL_JOB(NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.LocalJob")), - MANIFEST_FILE_PATH(NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.ManifestFilePath")); + CASE(NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.JobsTableModel.ColumnHeader.Case")), + DATA_SOURCE(NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.JobsTableModel.ColumnHeader.ImageFolder")), + HOST_NAME(NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.JobsTableModel.ColumnHeader.HostName")), + CREATED_TIME(NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.JobsTableModel.ColumnHeader.CreatedTime")), + STARTED_TIME(NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.JobsTableModel.ColumnHeader.StartedTime")), + COMPLETED_TIME(NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.JobsTableModel.ColumnHeader.CompletedTime")), + STAGE(NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.JobsTableModel.ColumnHeader.Stage")), + STAGE_TIME(NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.JobsTableModel.ColumnHeader.StageTime")), + STATUS(NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.JobsTableModel.ColumnHeader.Status")), + CASE_DIRECTORY_PATH(NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.JobsTableModel.ColumnHeader.CaseFolder")), + IS_LOCAL_JOB(NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.JobsTableModel.ColumnHeader.LocalJob")), + MANIFEST_FILE_PATH(NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.JobsTableModel.ColumnHeader.ManifestFilePath")); private final String header; @@ -182,37 +191,49 @@ public final class AutoIngestControlPanel extends JPanel implements Observer { * controlling automated ingest for a single node within the cluster. */ private AutoIngestControlPanel() { - //Disable the main window so they can only use the dashboard (if we used setVisible the taskBar icon would go away) - WindowManager.getDefault().getMainWindow().setEnabled(false); + //DLG: Temporary code for troubleshooting. Remove when done! + manager = null; + pendingTableModel = null; + runningTableModel = null; + completedTableModel = null; + ////////////////////////////////////////////////////////////// + try { + + //Disable the main window so they can only use the dashboard (if we used setVisible the taskBar icon would go away) + WindowManager.getDefault().getMainWindow().setEnabled(false); - manager = AutoIngestManager.getInstance(); + manager = AutoIngestManager.getInstance(); - pendingTableModel = new DefaultTableModel(JobsTableModelColumns.headers, 0) { - private static final long serialVersionUID = 1L; + pendingTableModel = new DefaultTableModel(JobsTableModelColumns.headers, 0) { + private static final long serialVersionUID = 1L; - @Override - public boolean isCellEditable(int row, int column) { - return false; - } - }; + @Override + public boolean isCellEditable(int row, int column) { + return false; + } + }; - runningTableModel = new DefaultTableModel(JobsTableModelColumns.headers, 0) { - private static final long serialVersionUID = 1L; + runningTableModel = new DefaultTableModel(JobsTableModelColumns.headers, 0) { + private static final long serialVersionUID = 1L; - @Override - public boolean isCellEditable(int row, int column) { - return false; - } - }; + @Override + public boolean isCellEditable(int row, int column) { + return false; + } + }; - completedTableModel = new DefaultTableModel(JobsTableModelColumns.headers, 0) { - private static final long serialVersionUID = 1L; + completedTableModel = new DefaultTableModel(JobsTableModelColumns.headers, 0) { + private static final long serialVersionUID = 1L; - @Override - public boolean isCellEditable(int row, int column) { - return false; - } - }; + @Override + public boolean isCellEditable(int row, int column) { + return false; + } + }; + } catch (Throwable ex) { + //DLG: Temporary code for troubleshooting. + SYS_LOGGER.log(Level.SEVERE, "AutoIngestControlPanel() error:", ex); + } initComponents(); // Generated code. setServicesStatusMessage(); @@ -231,6 +252,12 @@ public final class AutoIngestControlPanel extends JPanel implements Observer { * Queries the services monitor and sets the text for the services status * text box. */ + @Messages({ + "AutoIngestControlPanel.tbServicesStatusMessage.Message=Case databases {0}, keyword search {1}, coordination {2}, messaging {3} ", + "AutoIngestControlPanel.tbServicesStatusMessage.Message.Up=up", + "AutoIngestControlPanel.tbServicesStatusMessage.Message.Down=down", + "AutoIngestControlPanel.tbServicesStatusMessage.Message.Unknown=unknown" + }) private void setServicesStatusMessage() { new SwingWorker() { @@ -254,14 +281,14 @@ public final class AutoIngestControlPanel extends JPanel implements Observer { * @return The status string. */ private String getServiceStatus(ServicesMonitor.Service service) { - String serviceStatus = NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.tbServicesStatusMessage.Message.Unknown"); + String serviceStatus = NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.tbServicesStatusMessage.Message.Unknown"); try { ServicesMonitor servicesMonitor = ServicesMonitor.getInstance(); serviceStatus = servicesMonitor.getServiceStatus(service.toString()); if (serviceStatus.compareTo(ServicesMonitor.ServiceStatus.UP.toString()) == 0) { - serviceStatus = NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.tbServicesStatusMessage.Message.Up"); + serviceStatus = NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.tbServicesStatusMessage.Message.Up"); } else { - serviceStatus = NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.tbServicesStatusMessage.Message.Down"); + serviceStatus = NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.tbServicesStatusMessage.Message.Down"); } } catch (ServicesMonitor.ServicesMonitorException ex) { SYS_LOGGER.log(Level.SEVERE, String.format("Dashboard error getting service status for %s", service), ex); @@ -271,8 +298,8 @@ public final class AutoIngestControlPanel extends JPanel implements Observer { @Override protected void done() { - tbServicesStatusMessage.setText(NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.tbServicesStatusMessage.Message", caseDatabaseServerStatus, keywordSearchServiceStatus, keywordSearchServiceStatus, messagingStatus)); - String upStatus = NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.tbServicesStatusMessage.Message.Up"); + tbServicesStatusMessage.setText(NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.tbServicesStatusMessage.Message", caseDatabaseServerStatus, keywordSearchServiceStatus, keywordSearchServiceStatus, messagingStatus)); + String upStatus = NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.tbServicesStatusMessage.Message.Up"); if (caseDatabaseServerStatus.compareTo(upStatus) != 0 || keywordSearchServiceStatus.compareTo(upStatus) != 0 || messagingStatus.compareTo(upStatus) != 0) { @@ -554,12 +581,12 @@ public final class AutoIngestControlPanel extends JPanel implements Observer { enablePendingTableButtons(false); bnShowCaseLog.setEnabled(false); bnReprocessJob.setEnabled(false); - bnPause.setText(org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.bnStart.text")); - bnPause.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.bnStart.toolTipText")); + bnPause.setText(org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.bnStart.text")); + bnPause.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.bnStart.toolTipText")); bnPause.setEnabled(true); //initial label for bnPause is 'Start' and it's enabled for user to start the process bnRefresh.setEnabled(false); //at initial stage, nothing to refresh enableRunningTableButtons(false); - tbStatusMessage.setText(org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.bnStart.startMessage")); + tbStatusMessage.setText(org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.bnStart.startMessage")); } /** @@ -598,12 +625,12 @@ public final class AutoIngestControlPanel extends JPanel implements Observer { autoIngestStarted = true; } catch (AutoIngestManager.AutoIngestManagerStartupException ex) { SYS_LOGGER.log(Level.SEVERE, "Dashboard error starting up auto ingest", ex); - tbStatusMessage.setText(NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.AutoIngestStartupError")); + tbStatusMessage.setText(NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.AutoIngestStartupError")); manager = null; JOptionPane.showMessageDialog(this, - NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.AutoIngestStartupFailed.Message"), - NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.AutoIngestStartupFailed.Title"), + NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.AutoIngestStartupFailed.Message"), + NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.AutoIngestStartupFailed.Title"), JOptionPane.ERROR_MESSAGE); bnOptions.setEnabled(true); @@ -633,12 +660,12 @@ public final class AutoIngestControlPanel extends JPanel implements Observer { manager.scanInputDirsNow(); //bnPause.setEnabled(true); - bnPause.setText(org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.bnPause.text")); - bnPause.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.bnPause.toolTipText")); + bnPause.setText(org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.bnPause.text")); + bnPause.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.bnPause.toolTipText")); bnRefresh.setEnabled(true); bnOptions.setEnabled(false); - tbStatusMessage.setText(org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.bnPause.running")); + tbStatusMessage.setText(org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.bnPause.running")); } /** @@ -655,13 +682,13 @@ public final class AutoIngestControlPanel extends JPanel implements Observer { * was grabbing the monitor? */ Object[] options = { - NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.OK"), - NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.Cancel")}; + NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.OK"), + NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.Cancel")}; int reply = JOptionPane.OK_OPTION; if (null != manager && IngestManager.getInstance().isIngestRunning()) { reply = JOptionPane.showOptionDialog(this, - NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.ExitConsequences"), + NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.ExitConsequences"), NbBundle.getMessage(AutoIngestControlPanel.class, "ConfirmationDialog.ConfirmExitHeader"), JOptionPane.DEFAULT_OPTION, JOptionPane.WARNING_MESSAGE, @@ -675,7 +702,7 @@ public final class AutoIngestControlPanel extends JPanel implements Observer { * appears (if there is time to see it). */ this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); - tbStatusMessage.setText(org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.ExitingStatus")); + tbStatusMessage.setText(org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.ExitingStatus")); /* * Shut down the table refresh task executor. @@ -716,7 +743,7 @@ public final class AutoIngestControlPanel extends JPanel implements Observer { /** * @inheritDoc */ - @NbBundle.Messages({ + @Messages({ "AutoIngestControlPanel.bnPause.paused=Paused", "AutoIngestControlPanel.PauseDueToDatabaseServiceDown=Paused, unable to communicate with case database service.", "AutoIngestControlPanel.PauseDueToKeywordSearchServiceDown=Paused, unable to communicate with keyword search service.", @@ -751,7 +778,7 @@ public final class AutoIngestControlPanel extends JPanel implements Observer { break; case PAUSED_FOR_SYSTEM_ERROR: EventQueue.invokeLater(() -> { - tbStatusMessage.setText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.PauseDueToSystemError")); + tbStatusMessage.setText(org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.PauseDueToSystemError")); bnOptions.setEnabled(true); bnRefresh.setEnabled(false); pause(false); @@ -1061,7 +1088,7 @@ public final class AutoIngestControlPanel extends JPanel implements Observer { tableModel.setRowCount(0); for (AutoIngestJob job : jobs) { AutoIngestJob.StageDetails status = job.getStageDetails(); - ManifestNodeData nodeData = job.getNodeData(); + AutoIngestJobNodeData nodeData = job.getNodeData(); tableModel.addRow(new Object[]{ nodeData.getCaseName(), // CASE nodeData.getDataSourcePath().getFileName(), // DATA_SOURCE @@ -1449,6 +1476,9 @@ public final class AutoIngestControlPanel extends JPanel implements Observer { * * @param evt The button click event. */ + @Messages({ + "AutoIngestControlPanel.DeletionFailed=Deletion failed for job" + }) private void bnDeleteCaseActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnDeleteCaseActionPerformed if (completedTableModel.getRowCount() < 0 || completedTable.getSelectedRow() < 0) { return; @@ -1481,12 +1511,12 @@ public final class AutoIngestControlPanel extends JPanel implements Observer { if (CaseDeletionResult.FAILED == result) { JOptionPane.showMessageDialog(this, String.format("Could not delete case %s. It may be in in use.", caseName), - org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.DeletionFailed"), + org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.DeletionFailed"), JOptionPane.INFORMATION_MESSAGE); } else if (CaseDeletionResult.PARTIALLY_DELETED == result) { JOptionPane.showMessageDialog(this, String.format("Could not delete case %s. See system log for details.", caseName), - org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.DeletionFailed"), + org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.DeletionFailed"), JOptionPane.INFORMATION_MESSAGE); } } @@ -1539,6 +1569,9 @@ public final class AutoIngestControlPanel extends JPanel implements Observer { * * @param evt The button click event. */ + @Messages({ + "AutoIngestControlPanel.bnPause.pausing=Pausing after current job completes..." + }) private void bnPauseActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnPauseActionPerformed if (!autoIngestStarted) { @@ -1552,7 +1585,7 @@ public final class AutoIngestControlPanel extends JPanel implements Observer { return; } if (!isPaused) { - tbStatusMessage.setText(org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.bnPause.pausing")); + tbStatusMessage.setText(org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.bnPause.pausing")); pause(true); } else { resume(); @@ -1634,6 +1667,10 @@ public final class AutoIngestControlPanel extends JPanel implements Observer { * * @param evt The button click event. */ + @Messages({ + "AutoIngestControlPanel.ShowLogFailed.Title=Unable to display case log", + "AutoIngestControlPanel.ShowLogFailed.Message=Case log file does not exist" + }) private void bnShowCaseLogActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnShowCaseLogActionPerformed try { int selectedRow = completedTable.getSelectedRow(); @@ -1644,8 +1681,8 @@ public final class AutoIngestControlPanel extends JPanel implements Observer { if (pathToLog.toFile().exists()) { Desktop.getDesktop().edit(pathToLog.toFile()); } else { - JOptionPane.showMessageDialog(this, org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.ShowLogFailed.Message"), - org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestDashboard.ShowLogFailed.Title"), JOptionPane.ERROR_MESSAGE); + JOptionPane.showMessageDialog(this, org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.ShowLogFailed.Message"), + org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.ShowLogFailed.Title"), JOptionPane.ERROR_MESSAGE); } } else { MessageNotifyUtil.Message.warn("The case directory for this job has been deleted."); diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.form b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.form index 55b760a38c..502fab6f16 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.form +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.form @@ -16,10 +16,11 @@ - + - - + + + @@ -42,7 +43,6 @@ - diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java index 55e41e5a65..79c9b4d533 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java @@ -31,6 +31,7 @@ import java.util.logging.Level; import javax.swing.DefaultListSelectionModel; import java.awt.Color; import java.beans.PropertyChangeEvent; +import java.util.Collections; import javax.swing.JPanel; import javax.swing.JTable; import javax.swing.SwingWorker; @@ -39,8 +40,10 @@ import javax.swing.event.ListSelectionEvent; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableColumn; import org.openide.util.NbBundle; +import org.openide.util.NbBundle.Messages; import org.sleuthkit.autopsy.core.ServicesMonitor; import org.sleuthkit.autopsy.coreutils.Logger; +import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil; import org.sleuthkit.autopsy.experimental.autoingest.AutoIngestMonitor.JobsSnapshot; /** @@ -437,7 +440,11 @@ public final class AutoIngestDashboard extends JPanel implements Observer { List pendingJobs = jobsSnapshot.getPendingJobs(); List runningJobs = jobsSnapshot.getRunningJobs(); List completedJobs = jobsSnapshot.getCompletedJobs(); - // DLG: Do the appropriate sorts for each table. + + // DLG: DONE! Do the appropriate sorts for each table. + Collections.sort(pendingJobs, new AutoIngestJob.PriorityComparator()); + runningJobs.sort(new AutoIngestJob.AlphabeticalComparator()); + refreshTable(pendingJobs, pendingTable, pendingTableModel); refreshTable(runningJobs, runningTable, runningTableModel); refreshTable(completedJobs, completedTable, completedTableModel); @@ -463,7 +470,7 @@ public final class AutoIngestDashboard extends JPanel implements Observer { continue; } AutoIngestJob.StageDetails status = job.getStageDetails(); - ManifestNodeData nodeData = job.getNodeData(); + AutoIngestJobNodeData nodeData = job.getNodeData(); tableModel.addRow(new Object[]{ nodeData.getCaseName(), // CASE nodeData.getDataSourcePath().getFileName(), // DATA_SOURCE @@ -540,7 +547,7 @@ public final class AutoIngestDashboard extends JPanel implements Observer { */ private enum JobsTableModelColumns { - // DLG: Go through the bundles.properties file and delete and unused key-value pairs. + // DLG: Go through the bundles.properties file and delete any unused key-value pairs. CASE(NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.Case")), DATA_SOURCE(NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.ImageFolder")), HOST_NAME(NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.HostName")), @@ -758,10 +765,11 @@ public final class AutoIngestDashboard extends JPanel implements Observer { this.setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addContainerGap() - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addComponent(pendingScrollPane) + .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(lbPending) .addComponent(lbCompleted) @@ -775,10 +783,9 @@ public final class AutoIngestDashboard extends JPanel implements Observer { .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(prioritizeButton, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE))) .addGap(0, 0, Short.MAX_VALUE)) - .addComponent(runningScrollPane) - .addComponent(completedScrollPane)) + .addComponent(runningScrollPane, javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(completedScrollPane, javax.swing.GroupLayout.Alignment.LEADING)) .addContainerGap()) - .addComponent(pendingScrollPane) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) @@ -821,6 +828,9 @@ public final class AutoIngestDashboard extends JPanel implements Observer { setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); }//GEN-LAST:event_refreshButtonActionPerformed + @Messages({ + "AutoIngestDashboard.PrioritizeError=Failed to prioritize job \"%s\"." + }) private void prioritizeButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_prioritizeButtonActionPerformed if (pendingTableModel.getRowCount() > 0 && pendingTable.getSelectedRow() >= 0) { setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); @@ -830,8 +840,11 @@ public final class AutoIngestDashboard extends JPanel implements Observer { jobsSnapshot = autoIngestMonitor.prioritizeJob(manifestFilePath); refreshTables(jobsSnapshot); } catch (AutoIngestMonitor.AutoIngestMonitorException ex) { - // DLG: Log the exception and do a popup with a user-friendly + // DLG: DONE! Log the exception and do a popup with a user-friendly // message explaining that the operation failed + String errorMessage = String.format(NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.PrioritizeError"), manifestFilePath); + logger.log(Level.SEVERE, errorMessage, ex); + MessageNotifyUtil.Message.error(errorMessage); } setCursor(Cursor.getDefaultCursor()); } diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardTopComponent.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardTopComponent.java index cf82192fcf..24369b9da2 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardTopComponent.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardTopComponent.java @@ -67,7 +67,7 @@ public final class AutoIngestDashboardTopComponent extends TopComponent { try { dashboard = AutoIngestDashboard.createDashboard(); tc.add(dashboard); - dashboard.setSize(dashboard.getPreferredSize()); + dashboard.setSize(992, 744); if (tc.isOpened() == false) { tc.open(); } diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestJob.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestJob.java index 39a4128ac7..1bd4194ebd 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestJob.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestJob.java @@ -41,10 +41,10 @@ public final class AutoIngestJob implements Comparable, Serializa private static final long serialVersionUID = 1L; private static final String LOCAL_HOST_NAME = NetworkUtils.getLocalHostName(); - private final ManifestNodeData nodeData; + private final AutoIngestJobNodeData nodeData; private final String nodeName; @GuardedBy("this") - private String caseDirectoryPath; // DLG: Replace with ManifestNodeData.caseDirectoryPath + private String caseDirectoryPath; // DLG: Replace with AutoIngestJobNodeData.caseDirectoryPath @GuardedBy("this") private Stage stage; @GuardedBy("this") @@ -80,7 +80,7 @@ public final class AutoIngestJob implements Comparable, Serializa * because we will creater node data with initial values when we first * discover the nodes, and then we will continue to update it. */ - AutoIngestJob(ManifestNodeData nodeData, Path caseDirectoryPath, String nodeName, Stage stage) { + AutoIngestJob(AutoIngestJobNodeData nodeData, Path caseDirectoryPath, String nodeName, Stage stage) { this.nodeData = nodeData; if (null != caseDirectoryPath) { this.caseDirectoryPath = caseDirectoryPath.toString(); @@ -97,7 +97,7 @@ public final class AutoIngestJob implements Comparable, Serializa * * @return The node data. */ - ManifestNodeData getNodeData() { + AutoIngestJobNodeData getNodeData() { return this.nodeData; } @@ -263,6 +263,12 @@ public final class AutoIngestJob implements Comparable, Serializa } // DLG: Add a toString override + @Override + public String toString() { + // DLG: FINISH ME! + return ""; + } + /** * Custom comparator that allows us to sort List on reverse * chronological date modified (descending) diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/ManifestNodeData.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestJobNodeData.java similarity index 90% rename from Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/ManifestNodeData.java rename to Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestJobNodeData.java index 4813cbf887..25ea226a7f 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/ManifestNodeData.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestJobNodeData.java @@ -28,11 +28,11 @@ import javax.lang.model.type.TypeKind; /** * A coordination service node data transfer object for an auto ingest job. */ -final class ManifestNodeData implements Serializable { +final class AutoIngestJobNodeData implements Serializable { private static final long serialVersionUID = 1L; private static final int NODE_DATA_VERSION = 1; - private static final int MAX_POSSIBLE_NODE_DATA_SIZE = 65831; + private static final int MAX_POSSIBLE_NODE_DATA_SIZE = 131493; private static final int DEFAULT_PRIORITY = 0; /* @@ -51,9 +51,13 @@ final class ManifestNodeData implements Serializable { private int version; private String deviceId; private String caseName; + private String caseDirectoryPath; private long manifestFileDate; private String manifestFilePath; private String dataSourcePath; + private String processingStage; + private long processingStageStartDate; + private String processingHost; //DLG: Add caseDirectoryPath from AutoIngestJob /* @@ -83,7 +87,7 @@ final class ManifestNodeData implements Serializable { * * @param nodeData The raw bytes received from the coordination service. */ - ManifestNodeData(byte[] nodeData) throws ManifestNodeDataException { + AutoIngestJobNodeData(byte[] nodeData) throws AutoIngestJobNodeDataException { ByteBuffer buffer = ByteBuffer.wrap(nodeData); this.coordSvcNodeDataWasSet = buffer.hasRemaining(); if (this.coordSvcNodeDataWasSet) { @@ -111,25 +115,34 @@ final class ManifestNodeData implements Serializable { } if (buffer.hasRemaining()) { - // Version is greater than 1 + /* + * There are more than 24 bytes in the buffer, so we assume the + * version is greater than '0'. + */ this.version = buffer.getInt(); if (this.version > NODE_DATA_VERSION) { - throw new ManifestNodeDataException(String.format( - "Node data version %d is not suppored.", - this.version)); + throw new AutoIngestJobNodeDataException(String.format("Node data version %d is not suppored.", this.version)); } this.deviceId = getStringFromBuffer(buffer, TypeKind.BYTE); this.caseName = getStringFromBuffer(buffer, TypeKind.BYTE); + //DLG: this.caseDirectoryPath = getStringFromBuffer(buffer, TypeKind.SHORT); this.manifestFileDate = buffer.getLong(); this.manifestFilePath = getStringFromBuffer(buffer, TypeKind.SHORT); this.dataSourcePath = getStringFromBuffer(buffer, TypeKind.SHORT); + //DLG: this.processingStage = getStringFromBuffer(buffer, TypeKind.BYTE); + //DLG: this.processingStageStartDate = buffer.getLong(); + //DLG: this.processingHost = getStringFromBuffer(buffer, TypeKind.SHORT); } else { - this.version = 1; + this.version = 0; this.deviceId = ""; this.caseName = ""; + this.caseDirectoryPath = ""; this.manifestFileDate = 0L; this.manifestFilePath = ""; this.dataSourcePath = ""; + this.processingStage = ""; + this.processingStageStartDate = 0L; + this.processingHost = ""; } } @@ -146,7 +159,7 @@ final class ManifestNodeData implements Serializable { * completed. * @param errorsOccurred Boolean to determine if errors have occurred. */ - ManifestNodeData(Manifest manifest, ProcessingStatus status, int priority, int numberOfCrashes, Date completedDate, boolean errorOccurred) { + AutoIngestJobNodeData(Manifest manifest, ProcessingStatus status, int priority, int numberOfCrashes, Date completedDate, boolean errorOccurred) { this.coordSvcNodeDataWasSet = false; this.status = status; this.priority = priority; @@ -427,9 +440,13 @@ final class ManifestNodeData implements Serializable { // Write data putStringIntoBuffer(deviceId, buffer, TypeKind.BYTE); putStringIntoBuffer(caseName, buffer, TypeKind.BYTE); + //DLG: putStringIntoBuffer(caseDirectoryPath, buffer, TypeKind.SHORT); buffer.putLong(this.manifestFileDate); putStringIntoBuffer(manifestFilePath, buffer, TypeKind.SHORT); putStringIntoBuffer(dataSourcePath, buffer, TypeKind.SHORT); + //DLG: putStringIntoBuffer(processingStage, buffer, TypeKind.BYTE); + //DLG: buffer.putLong(this.processingStageStartDate); + //DLG: putStringIntoBuffer(processingHost, buffer, TypeKind.SHORT); } // Prepare the array diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/ManifestNodeDataException.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestJobNodeDataException.java similarity index 86% rename from Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/ManifestNodeDataException.java rename to Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestJobNodeDataException.java index 8dbd9f6d7d..6618062e50 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/ManifestNodeDataException.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestJobNodeDataException.java @@ -21,7 +21,7 @@ package org.sleuthkit.autopsy.experimental.autoingest; /** * Exception thrown when a manifest node contains incompatible data. */ -public class ManifestNodeDataException extends Exception { +public class AutoIngestJobNodeDataException extends Exception { /** * Constructs an exception thrown when a manifest node contains incompatible @@ -29,7 +29,7 @@ public class ManifestNodeDataException extends Exception { * * @param message An error message. */ - public ManifestNodeDataException(String message) { + public AutoIngestJobNodeDataException(String message) { super(message); } @@ -40,7 +40,7 @@ public class ManifestNodeDataException extends Exception { * @param message An error message. * @param cause An exception that caused this exception to be thrown. */ - public ManifestNodeDataException(String message, Throwable cause) { + public AutoIngestJobNodeDataException(String message, Throwable cause) { super(message, cause); } } diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestManager.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestManager.java index 763681d198..0281446fba 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestManager.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestManager.java @@ -84,11 +84,11 @@ import org.sleuthkit.autopsy.experimental.autoingest.AutoIngestAlertFile.AutoIng import org.sleuthkit.autopsy.experimental.autoingest.AutoIngestJobLogger.AutoIngestJobLoggerException; import org.sleuthkit.autopsy.experimental.autoingest.FileExporter.FileExportException; import org.sleuthkit.autopsy.experimental.autoingest.ManifestFileParser.ManifestFileParserException; -import org.sleuthkit.autopsy.experimental.autoingest.ManifestNodeData.ProcessingStatus; -import static org.sleuthkit.autopsy.experimental.autoingest.ManifestNodeData.ProcessingStatus.COMPLETED; -import static org.sleuthkit.autopsy.experimental.autoingest.ManifestNodeData.ProcessingStatus.DELETED; -import static org.sleuthkit.autopsy.experimental.autoingest.ManifestNodeData.ProcessingStatus.PENDING; -import static org.sleuthkit.autopsy.experimental.autoingest.ManifestNodeData.ProcessingStatus.PROCESSING; +import org.sleuthkit.autopsy.experimental.autoingest.AutoIngestJobNodeData.ProcessingStatus; +import static org.sleuthkit.autopsy.experimental.autoingest.AutoIngestJobNodeData.ProcessingStatus.COMPLETED; +import static org.sleuthkit.autopsy.experimental.autoingest.AutoIngestJobNodeData.ProcessingStatus.DELETED; +import static org.sleuthkit.autopsy.experimental.autoingest.AutoIngestJobNodeData.ProcessingStatus.PENDING; +import static org.sleuthkit.autopsy.experimental.autoingest.AutoIngestJobNodeData.ProcessingStatus.PROCESSING; import org.sleuthkit.autopsy.experimental.configuration.AutoIngestUserPreferences; import org.sleuthkit.autopsy.experimental.configuration.SharedConfiguration; import org.sleuthkit.autopsy.experimental.configuration.SharedConfiguration.SharedConfigurationException; @@ -543,10 +543,10 @@ public final class AutoIngestManager extends Observable implements PropertyChang for (AutoIngestJob job : prioritizedJobs) { String manifestNodePath = job.getNodeData().getManifestFilePath().toString(); try { - ManifestNodeData nodeData = new ManifestNodeData(coordinationService.getNodeData(CoordinationService.CategoryNode.MANIFESTS, manifestNodePath)); + AutoIngestJobNodeData nodeData = new AutoIngestJobNodeData(coordinationService.getNodeData(CoordinationService.CategoryNode.MANIFESTS, manifestNodePath)); nodeData.setPriority(maxPriority); coordinationService.setNodeData(CoordinationService.CategoryNode.MANIFESTS, manifestNodePath, nodeData.toArray()); - } catch (ManifestNodeDataException ex) { + } catch (AutoIngestJobNodeDataException ex) { SYS_LOGGER.log(Level.WARNING, String.format("Unable to use node data for %s", manifestNodePath), ex); } catch (CoordinationServiceException ex) { SYS_LOGGER.log(Level.SEVERE, String.format("Coordination service error while prioritizing %s", manifestNodePath), ex); @@ -592,10 +592,10 @@ public final class AutoIngestManager extends Observable implements PropertyChang ++maxPriority; String manifestNodePath = prioritizedJob.getNodeData().getManifestFilePath().toString(); try { - ManifestNodeData nodeData = new ManifestNodeData(coordinationService.getNodeData(CoordinationService.CategoryNode.MANIFESTS, manifestNodePath)); + AutoIngestJobNodeData nodeData = new AutoIngestJobNodeData(coordinationService.getNodeData(CoordinationService.CategoryNode.MANIFESTS, manifestNodePath)); nodeData.setPriority(maxPriority); coordinationService.setNodeData(CoordinationService.CategoryNode.MANIFESTS, manifestNodePath, nodeData.toArray()); - } catch (ManifestNodeDataException ex) { + } catch (AutoIngestJobNodeDataException ex) { SYS_LOGGER.log(Level.WARNING, String.format("Unable to use node data for %s", manifestPath), ex); } catch (CoordinationServiceException ex) { SYS_LOGGER.log(Level.SEVERE, String.format("Coordination service error while prioritizing %s", manifestNodePath), ex); @@ -636,7 +636,7 @@ public final class AutoIngestManager extends Observable implements PropertyChang if (null != completedJob && null != completedJob.getCaseDirectoryPath()) { try { - ManifestNodeData nodeData = completedJob.getNodeData(); + AutoIngestJobNodeData nodeData = completedJob.getNodeData(); nodeData.setStatus(PENDING); nodeData.setPriority(DEFAULT_JOB_PRIORITY); nodeData.setNumberOfCrashes(0); @@ -733,10 +733,10 @@ public final class AutoIngestManager extends Observable implements PropertyChang */ for (Path manifestPath : manifestPaths) { try { - ManifestNodeData nodeData = new ManifestNodeData(coordinationService.getNodeData(CoordinationService.CategoryNode.MANIFESTS, manifestPath.toString())); - nodeData.setStatus(ManifestNodeData.ProcessingStatus.DELETED); + AutoIngestJobNodeData nodeData = new AutoIngestJobNodeData(coordinationService.getNodeData(CoordinationService.CategoryNode.MANIFESTS, manifestPath.toString())); + nodeData.setStatus(AutoIngestJobNodeData.ProcessingStatus.DELETED); coordinationService.setNodeData(CoordinationService.CategoryNode.MANIFESTS, manifestPath.toString(), nodeData.toArray()); - } catch (ManifestNodeDataException ex) { + } catch (AutoIngestJobNodeDataException ex) { SYS_LOGGER.log(Level.WARNING, String.format("Unable to use node data for %s", manifestPath), ex); } catch (InterruptedException | CoordinationServiceException ex) { SYS_LOGGER.log(Level.SEVERE, String.format("Error attempting to set delete flag on manifest data for %s for case %s at %s", manifestPath, caseName, caseDirectoryPath), ex); @@ -1027,7 +1027,7 @@ public final class AutoIngestManager extends Observable implements PropertyChang byte[] rawData = coordinationService.getNodeData(CoordinationService.CategoryNode.MANIFESTS, manifestPath.toString()); if (null != rawData) { try { - ManifestNodeData nodeData = new ManifestNodeData(rawData); + AutoIngestJobNodeData nodeData = new AutoIngestJobNodeData(rawData); if (nodeData.coordSvcNodeDataWasSet()) { ProcessingStatus processingStatus = nodeData.getStatus(); switch (processingStatus) { @@ -1050,7 +1050,7 @@ public final class AutoIngestManager extends Observable implements PropertyChang } else { addNewPendingJob(manifest); } - } catch(ManifestNodeDataException ex) { + } catch(AutoIngestJobNodeDataException ex) { SYS_LOGGER.log(Level.WARNING, String.format("Unable to use node data for %s", manifestPath), ex); } } else { @@ -1078,7 +1078,7 @@ public final class AutoIngestManager extends Observable implements PropertyChang * @param nodeData The data stored in the coordination service node for * the manifest. */ - private void addPendingJob(ManifestNodeData nodeData) { + private void addPendingJob(AutoIngestJobNodeData nodeData) { Path caseDirectory = PathUtils.findCaseDirectory(rootOutputDirectory, nodeData.getCaseName()); nodeData.setCompletedDate(new Date(0)); nodeData.setErrorsOccurred(false); @@ -1100,7 +1100,7 @@ public final class AutoIngestManager extends Observable implements PropertyChang // Is use of Curator.create().forPath() possible instead? try (Lock manifestLock = coordinationService.tryGetExclusiveLock(CoordinationService.CategoryNode.MANIFESTS, manifest.getFilePath().toString())) { if (null != manifestLock) { - ManifestNodeData newNodeData = new ManifestNodeData(manifest, PENDING, DEFAULT_JOB_PRIORITY, 0, new Date(0), false); + AutoIngestJobNodeData newNodeData = new AutoIngestJobNodeData(manifest, PENDING, DEFAULT_JOB_PRIORITY, 0, new Date(0), false); coordinationService.setNodeData(CoordinationService.CategoryNode.MANIFESTS, manifest.getFilePath().toString(), newNodeData.toArray()); newPendingJobsList.add(new AutoIngestJob(newNodeData, null, LOCAL_HOST_NAME, AutoIngestJob.Stage.PENDING)); } @@ -1124,7 +1124,7 @@ public final class AutoIngestManager extends Observable implements PropertyChang * blocked, i.e., if auto ingest is * shutting down. */ - private void doRecoveryIfCrashed(ManifestNodeData nodeData) throws InterruptedException { + private void doRecoveryIfCrashed(AutoIngestJobNodeData nodeData) throws InterruptedException { String manifestPath = nodeData.getManifestFilePath().toString(); if (nodeData.coordSvcNodeDataWasSet() && ProcessingStatus.PROCESSING == nodeData.getStatus()) { SYS_LOGGER.log(Level.SEVERE, "Attempting crash recovery for {0}", manifestPath); @@ -1180,7 +1180,7 @@ public final class AutoIngestManager extends Observable implements PropertyChang * @param nodeData The data stored in the coordination service node for * the manifest. */ - private void addCompletedJob(ManifestNodeData nodeData) { + private void addCompletedJob(AutoIngestJobNodeData nodeData) { Path caseDirectoryPath = PathUtils.findCaseDirectory(rootOutputDirectory, nodeData.getCaseName()); if (null != caseDirectoryPath) { newCompletedJobsList.add(new AutoIngestJob(nodeData, caseDirectoryPath, LOCAL_HOST_NAME, AutoIngestJob.Stage.COMPLETED)); @@ -1518,7 +1518,7 @@ public final class AutoIngestManager extends Observable implements PropertyChang return; } processJob(); - } catch (ManifestNodeDataException ex) { + } catch (AutoIngestJobNodeDataException ex) { SYS_LOGGER.log(Level.WARNING, String.format("Unable to use node data"), ex); } finally { manifestLock.release(); @@ -1619,7 +1619,7 @@ public final class AutoIngestManager extends Observable implements PropertyChang } try { - ManifestNodeData nodeData = new ManifestNodeData(coordinationService.getNodeData(CoordinationService.CategoryNode.MANIFESTS, manifestPath.toString())); + AutoIngestJobNodeData nodeData = new AutoIngestJobNodeData(coordinationService.getNodeData(CoordinationService.CategoryNode.MANIFESTS, manifestPath.toString())); if (!nodeData.getStatus().equals(PENDING)) { /* * Due to a timing issue or a missed event, a @@ -1646,7 +1646,7 @@ public final class AutoIngestManager extends Observable implements PropertyChang iterator.remove(); currentJob = job; break; - } catch (ManifestNodeDataException ex) { + } catch (AutoIngestJobNodeDataException ex) { SYS_LOGGER.log(Level.WARNING, String.format("Unable to use node data for %s", manifestPath), ex); } } @@ -1692,9 +1692,9 @@ public final class AutoIngestManager extends Observable implements PropertyChang * i.e., if auto ingest is * shutting down. */ - private void processJob() throws CoordinationServiceException, SharedConfigurationException, ServicesMonitorException, DatabaseServerDownException, KeywordSearchServerDownException, CaseManagementException, AnalysisStartupException, FileExportException, AutoIngestAlertFileException, AutoIngestJobLoggerException, InterruptedException, AutoIngestDataSourceProcessor.AutoIngestDataSourceProcessorException, ManifestNodeDataException { + private void processJob() throws CoordinationServiceException, SharedConfigurationException, ServicesMonitorException, DatabaseServerDownException, KeywordSearchServerDownException, CaseManagementException, AnalysisStartupException, FileExportException, AutoIngestAlertFileException, AutoIngestJobLoggerException, InterruptedException, AutoIngestDataSourceProcessor.AutoIngestDataSourceProcessorException, AutoIngestJobNodeDataException { Path manifestPath = currentJob.getNodeData().getManifestFilePath(); - ManifestNodeData nodeData = new ManifestNodeData(coordinationService.getNodeData(CoordinationService.CategoryNode.MANIFESTS, manifestPath.toString())); + AutoIngestJobNodeData nodeData = new AutoIngestJobNodeData(coordinationService.getNodeData(CoordinationService.CategoryNode.MANIFESTS, manifestPath.toString())); nodeData.setStatus(PROCESSING); coordinationService.setNodeData(CoordinationService.CategoryNode.MANIFESTS, manifestPath.toString(), nodeData.toArray()); SYS_LOGGER.log(Level.INFO, "Started processing of {0}", manifestPath); @@ -1713,7 +1713,7 @@ public final class AutoIngestManager extends Observable implements PropertyChang currentJob.cancel(); } - nodeData = new ManifestNodeData(coordinationService.getNodeData(CoordinationService.CategoryNode.MANIFESTS, manifestPath.toString())); + nodeData = new AutoIngestJobNodeData(coordinationService.getNodeData(CoordinationService.CategoryNode.MANIFESTS, manifestPath.toString())); if (currentJob.isCompleted() || currentJob.isCanceled()) { nodeData.setStatus(COMPLETED); Date completedDate = new Date(); @@ -1799,7 +1799,7 @@ public final class AutoIngestManager extends Observable implements PropertyChang try { Case.closeCurrentCase(); } catch (CaseActionException ex) { - ManifestNodeData nodeData = currentJob.getNodeData(); + AutoIngestJobNodeData nodeData = currentJob.getNodeData(); throw new CaseManagementException(String.format("Error closing case %s for %s", nodeData.getCaseName(), nodeData.getManifestFilePath()), ex); } } @@ -1882,7 +1882,7 @@ public final class AutoIngestManager extends Observable implements PropertyChang * if auto ingest is shutting down. */ private Case openCase() throws CoordinationServiceException, CaseManagementException, InterruptedException { - ManifestNodeData nodeData = currentJob.getNodeData(); + AutoIngestJobNodeData nodeData = currentJob.getNodeData(); String caseName = nodeData.getCaseName(); SYS_LOGGER.log(Level.INFO, "Opening case {0} for {1}", new Object[]{caseName, nodeData.getManifestFilePath()}); currentJob.setStage(AutoIngestJob.Stage.OPENING_CASE); @@ -2051,7 +2051,7 @@ public final class AutoIngestManager extends Observable implements PropertyChang * if auto ingest is shutting down. */ private DataSource identifyDataSource(Case caseForJob) throws AutoIngestAlertFileException, AutoIngestJobLoggerException, InterruptedException { - ManifestNodeData nodeData = currentJob.getNodeData(); + AutoIngestJobNodeData nodeData = currentJob.getNodeData(); Path manifestPath = nodeData.getManifestFilePath(); SYS_LOGGER.log(Level.INFO, "Identifying data source for {0} ", manifestPath); currentJob.setStage(AutoIngestJob.Stage.IDENTIFYING_DATA_SOURCE); @@ -2087,7 +2087,7 @@ public final class AutoIngestManager extends Observable implements PropertyChang * ingest is shutting down. */ private void runDataSourceProcessor(Case caseForJob, DataSource dataSource) throws InterruptedException, AutoIngestAlertFileException, AutoIngestJobLoggerException, AutoIngestDataSourceProcessor.AutoIngestDataSourceProcessorException { - ManifestNodeData nodeData = currentJob.getNodeData(); + AutoIngestJobNodeData nodeData = currentJob.getNodeData(); Path manifestPath = nodeData.getManifestFilePath(); SYS_LOGGER.log(Level.INFO, "Adding data source for {0} ", manifestPath); currentJob.setStage(AutoIngestJob.Stage.ADDING_DATA_SOURCE); @@ -2180,7 +2180,7 @@ public final class AutoIngestManager extends Observable implements PropertyChang * ingest is shutting down. */ private void logDataSourceProcessorResult(DataSource dataSource) throws AutoIngestAlertFileException, AutoIngestJobLoggerException, InterruptedException { - ManifestNodeData nodeData = currentJob.getNodeData(); + AutoIngestJobNodeData nodeData = currentJob.getNodeData(); Path manifestPath = nodeData.getManifestFilePath(); Path caseDirectoryPath = currentJob.getCaseDirectoryPath(); AutoIngestJobLogger jobLogger = new AutoIngestJobLogger(manifestPath, nodeData.getDataSourceFileName(), caseDirectoryPath); @@ -2252,7 +2252,7 @@ public final class AutoIngestManager extends Observable implements PropertyChang * ingest is shutting down. */ private void analyze(DataSource dataSource) throws AnalysisStartupException, AutoIngestAlertFileException, AutoIngestJobLoggerException, InterruptedException { - ManifestNodeData nodeData = currentJob.getNodeData(); + AutoIngestJobNodeData nodeData = currentJob.getNodeData(); Path manifestPath = nodeData.getManifestFilePath(); SYS_LOGGER.log(Level.INFO, "Starting ingest modules analysis for {0} ", manifestPath); currentJob.setStage(AutoIngestJob.Stage.ANALYZING_DATA_SOURCE); @@ -2351,7 +2351,7 @@ public final class AutoIngestManager extends Observable implements PropertyChang * ingest is shutting down. */ private void exportFiles(DataSource dataSource) throws FileExportException, AutoIngestAlertFileException, AutoIngestJobLoggerException, InterruptedException { - ManifestNodeData nodeData = currentJob.getNodeData(); + AutoIngestJobNodeData nodeData = currentJob.getNodeData(); Path manifestPath = nodeData.getManifestFilePath(); SYS_LOGGER.log(Level.INFO, "Exporting files for {0}", manifestPath); currentJob.setStage(AutoIngestJob.Stage.EXPORTING_FILES); diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMonitor.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMonitor.java index 190e684c94..ddfbccaeac 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMonitor.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMonitor.java @@ -236,7 +236,7 @@ public final class AutoIngestMonitor extends Observable implements PropertyChang List nodeList = coordinationService.getNodeList(CoordinationService.CategoryNode.MANIFESTS); for (String node : nodeList) { // DLG: Do not need a lock here - // DLG: Get the node data and construct a AutoIngestJobNodeData object (rename ManifestNodeData => AutoIngestJobData) + // DLG: Get the node data and construct a AutoIngestJobNodeData object (rename AutoIngestJobNodeData => AutoIngestJobData) // DLG: Construct an AutoIngestJob object from the AutoIngestJobNodeData object, need new AutoIngestJob constructor } return newJobsSnapshot; @@ -276,10 +276,10 @@ public final class AutoIngestMonitor extends Observable implements PropertyChang ++highestPriority; String manifestNodePath = prioritizedJob.getNodeData().getManifestFilePath().toString(); try { - ManifestNodeData nodeData = new ManifestNodeData(coordinationService.getNodeData(CoordinationService.CategoryNode.MANIFESTS, manifestNodePath)); + AutoIngestJobNodeData nodeData = new AutoIngestJobNodeData(coordinationService.getNodeData(CoordinationService.CategoryNode.MANIFESTS, manifestNodePath)); nodeData.setPriority(highestPriority); coordinationService.setNodeData(CoordinationService.CategoryNode.MANIFESTS, manifestNodePath, nodeData.toArray()); - } catch (ManifestNodeDataException | CoordinationServiceException | InterruptedException ex) { + } catch (AutoIngestJobNodeDataException | CoordinationServiceException | InterruptedException ex) { throw new AutoIngestMonitorException("Error bumping priority for job " + prioritizedJob.toString(), ex); } prioritizedJob.getNodeData().setPriority(highestPriority); diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties index 9445774fc7..31fa2c11f0 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties @@ -271,47 +271,7 @@ AutoIngestCasePanel.bnOpen.text=&Open AutoIngestCasePanel.bnShowLog.toolTipText=Display case log file for selected case AutoIngestCasePanel.bnShowLog.text=&Show Log AutoIngestCasePanel.rbGroupLabel.text=Show cases accessed in the last 10: -AutoIngestControlPanel.tbStatusMessage.text= -AutoIngestControlPanel.bnShowCaseLog.toolTipText=Display case log file for selected case -AutoIngestControlPanel.bnShowCaseLog.text=Show Case &Log -AutoIngestControlPanel.bnDeleteCase.toolTipText=Delete the selected Case in its entirety -AutoIngestControlPanel.bnDeleteCase.text=&Delete Case -AutoIngestControlPanel.bnCancelJob.toolTipText=Cancel processing of the current Job and move on to the next Job. This functionality is only available for jobs running on current AIM node. -AutoIngestControlPanel.bnCancelJob.text=&Cancel Job -AutoIngestControlPanel.completedTable.toolTipText=The Completed table shows all Jobs that have been processed already -AutoIngestControlPanel.runningTable.toolTipText=The Running table displays the currently running Job and information about it -AutoIngestControlPanel.pendingTable.toolTipText=The Pending table displays the order upcoming Jobs will be processed with the top of the list first -AutoIngestControlPanel.bnPrioritizeCase.toolTipText=Move all images associated with a case to top of Pending queue. -AutoIngestControlPanel.bnPrioritizeCase.text=Prioriti&ze Case -AutoIngestControlPanel.bnPause.toolTipText=Suspend processing of Pending Jobs -AutoIngestControlPanel.bnPause.text=Pause -AutoIngestControlPanel.bnShowProgress.toolTipText=Show the progress of the currently running Job. This functionality is only available for jobs running on current AIM node. -AutoIngestControlPanel.bnShowProgress.text=Ingest Progress -AutoIngestControlPanel.bnOptions.toolTipText=Display options panel. All processing must be paused to open the options panel. -AutoIngestControlPanel.bnOptions.text=&Options -AutoIngestControlPanel.bnExit.toolTipText=Exit Application -AutoIngestControlPanel.bnExit.text=&Exit -AutoIngestControlPanel.bnCancelModule.toolTipText=Cancel processing of the current module within the Job and move on to the next module within the Job. This functionality is only available for jobs running on current AIM node. -AutoIngestControlPanel.bnCancelModule.text=Cancel &Module -AutoIngestControlPanel.bnRefresh.toolTipText=Refresh displayed tables -AutoIngestControlPanel.bnRefresh.text=&Refresh -AutoIngestControlPanel.lbCompleted.text=Completed Jobs -AutoIngestControlPanel.lbRunning.text=Running Jobs -AutoIngestControlPanel.lbPending.text=Pending Jobs -AutoIngestControlPanel.bnReprocessJob.text=Reprocess Job -AutoIngestControlPanel.bnOpenLogDir.text=Open System Logs Directory -AutoIngestControlPanel.tbServicesStatusMessage.text= -AutoIngestControlPanel.lbServicesStatus.text=Services Status: -AutoIngestControlPanel.bnPrioritizeJob.actionCommand= -AutoIngestControlPanel.bnPrioritizeJob.toolTipText=Move this folder to the top of the Pending queue. -AutoIngestControlPanel.bnPrioritizeJob.text=Prioritize Job -<<<<<<< HEAD -AutoIngestControlPanel.lbStatus.text=Status: -AutoIngestControlPanel.PauseDueToSystemError=Paused due to system error, please consult the auto ingest system log AutoIngestDashboard.prioritizeButton.toolTipText=Prioritizes the selected job AutoIngestDashboard.prioritizeButton.text=&Prioritize AutoIngestDashboard.refreshButton.toolTipText=Refresh displayed tables AutoIngestDashboard.refreshButton.text=&Refresh -======= -AutoIngestControlPanel.lbStatus.text=Status: ->>>>>>> upstream/develop From 7b75d1513f9730cea1c09a445a061d6fb4f0e506 Mon Sep 17 00:00:00 2001 From: "U-BASIS\\dgrove" Date: Fri, 8 Sep 2017 11:05:15 -0400 Subject: [PATCH 084/104] Fixed constructor. --- .../autoingest/AutoIngestControlPanel.java | 59 ++++++++----------- 1 file changed, 24 insertions(+), 35 deletions(-) diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestControlPanel.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestControlPanel.java index df71bb1483..00f5456560 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestControlPanel.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestControlPanel.java @@ -191,49 +191,38 @@ public final class AutoIngestControlPanel extends JPanel implements Observer { * controlling automated ingest for a single node within the cluster. */ private AutoIngestControlPanel() { - //DLG: Temporary code for troubleshooting. Remove when done! - manager = null; - pendingTableModel = null; - runningTableModel = null; - completedTableModel = null; - ////////////////////////////////////////////////////////////// - try { - //Disable the main window so they can only use the dashboard (if we used setVisible the taskBar icon would go away) - WindowManager.getDefault().getMainWindow().setEnabled(false); + //Disable the main window so they can only use the dashboard (if we used setVisible the taskBar icon would go away) + WindowManager.getDefault().getMainWindow().setEnabled(false); - manager = AutoIngestManager.getInstance(); + manager = AutoIngestManager.getInstance(); - pendingTableModel = new DefaultTableModel(JobsTableModelColumns.headers, 0) { - private static final long serialVersionUID = 1L; + pendingTableModel = new DefaultTableModel(JobsTableModelColumns.headers, 0) { + private static final long serialVersionUID = 1L; - @Override - public boolean isCellEditable(int row, int column) { - return false; - } - }; + @Override + public boolean isCellEditable(int row, int column) { + return false; + } + }; - runningTableModel = new DefaultTableModel(JobsTableModelColumns.headers, 0) { - private static final long serialVersionUID = 1L; + runningTableModel = new DefaultTableModel(JobsTableModelColumns.headers, 0) { + private static final long serialVersionUID = 1L; - @Override - public boolean isCellEditable(int row, int column) { - return false; - } - }; + @Override + public boolean isCellEditable(int row, int column) { + return false; + } + }; - completedTableModel = new DefaultTableModel(JobsTableModelColumns.headers, 0) { - private static final long serialVersionUID = 1L; + completedTableModel = new DefaultTableModel(JobsTableModelColumns.headers, 0) { + private static final long serialVersionUID = 1L; - @Override - public boolean isCellEditable(int row, int column) { - return false; - } - }; - } catch (Throwable ex) { - //DLG: Temporary code for troubleshooting. - SYS_LOGGER.log(Level.SEVERE, "AutoIngestControlPanel() error:", ex); - } + @Override + public boolean isCellEditable(int row, int column) { + return false; + } + }; initComponents(); // Generated code. setServicesStatusMessage(); From 9b6984da0494366576f7c861513b81b186d6e34d Mon Sep 17 00:00:00 2001 From: Richard Cordovano Date: Fri, 8 Sep 2017 12:21:15 -0400 Subject: [PATCH 085/104] Minor simplification of CE module shutdown method --- .../ingestmodule/IngestModule.java | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/ingestmodule/IngestModule.java b/Core/src/org/sleuthkit/autopsy/centralrepository/ingestmodule/IngestModule.java index a2b2e2199b..3dd23ccfc6 100755 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/ingestmodule/IngestModule.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/ingestmodule/IngestModule.java @@ -1,7 +1,7 @@ /* * Central Repository * - * Copyright 2015-2017 Basis Technology Corp. + * Copyright 2011-2017 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -156,21 +156,10 @@ class IngestModule implements FileIngestModule { @Override public void shutDown() { - if (EamDb.isEnabled() == false) { - /* - * Not signaling an error for now. This is a workaround for the way - * all newly didscovered ingest modules are automatically anabled. - * - * TODO (JIRA-2731): Add isEnabled API for ingest modules. - */ + if ((EamDb.isEnabled() == false) || (eamCase == null) || (eamDataSource == null)) { return; } - // If either of these are null, then the ingest module never got through startup - if((eamCase == null) || (eamDataSource == null)){ - return; - } - EamDb dbManager; try { dbManager = EamDb.getInstance(); From fa6ddf952c700bb0e8425d208a3c2f3d6176f070 Mon Sep 17 00:00:00 2001 From: Ann Priestman Date: Fri, 8 Sep 2017 12:35:49 -0400 Subject: [PATCH 086/104] Change to pass the current Case into newCase. --- .../actions/EamCaseEditDetailsDialog.java | 2 +- .../datamodel/AbstractSqlEamDb.java | 21 ++++++++++--------- .../centralrepository/datamodel/EamDb.java | 7 +++++-- .../datamodel/SqliteEamDb.java | 16 ++++++++++++++ 4 files changed, 33 insertions(+), 13 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/actions/EamCaseEditDetailsDialog.java b/Core/src/org/sleuthkit/autopsy/centralrepository/actions/EamCaseEditDetailsDialog.java index 7f14e6c48d..253cba3a93 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/actions/EamCaseEditDetailsDialog.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/actions/EamCaseEditDetailsDialog.java @@ -71,7 +71,7 @@ public class EamCaseEditDetailsDialog extends JDialog { this.dbManager = EamDb.getInstance(); this.eamCase = this.dbManager.getCaseDetails(Case.getCurrentCase().getName()); if(this.eamCase == null){ - this.eamCase = dbManager.newCaseFromCurrentCase(); + this.eamCase = dbManager.newCase(Case.getCurrentCase()); } initComponents(); loadData(); diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/AbstractSqlEamDb.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/AbstractSqlEamDb.java index 8e9b508995..bc16cbdd32 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/AbstractSqlEamDb.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/AbstractSqlEamDb.java @@ -256,23 +256,24 @@ public abstract class AbstractSqlEamDb implements EamDb { } /** - * Creates new Case in the database from the currently open case + * Creates new Case in the database from the given case + * + * @param case The case to add */ @Override - public EamCase newCaseFromCurrentCase() throws EamDbException{ - Case curCase = Case.getCurrentCase(); - if(curCase == null){ - throw new EamDbException("No case open"); + public EamCase newCase(Case autopsyCase) throws EamDbException{ + if(autopsyCase == null){ + throw new EamDbException("Case is null"); } EamCase curCeCase = new EamCase( -1, - curCase.getName(), // unique case ID + autopsyCase.getName(), // unique case ID EamOrganization.getDefault(), - curCase.getDisplayName(), - curCase.getCreatedDate(), - curCase.getNumber(), - curCase.getExaminer(), + autopsyCase.getDisplayName(), + autopsyCase.getCreatedDate(), + autopsyCase.getNumber(), + autopsyCase.getExaminer(), null, null, null); diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamDb.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamDb.java index 85579bcdf5..4d89314ffe 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamDb.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamDb.java @@ -20,6 +20,7 @@ package org.sleuthkit.autopsy.centralrepository.datamodel; import java.util.List; import java.util.Set; +import org.sleuthkit.autopsy.casemodule.Case; /** * Main interface for interacting with the database @@ -148,9 +149,11 @@ public interface EamDb { void newCase(EamCase eamCase) throws EamDbException; /** - * Creates new Case in the database from the currently open case + * Creates new Case in the database from the given case + * + * @param case The case to add */ - EamCase newCaseFromCurrentCase() throws EamDbException; + EamCase newCase(Case autopsyCase) throws EamDbException; /** * Updates an existing Case in the database diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/SqliteEamDb.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/SqliteEamDb.java index 4c65eaba12..aaf540bc7d 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/SqliteEamDb.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/SqliteEamDb.java @@ -28,6 +28,7 @@ import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.logging.Level; import org.apache.commons.dbcp2.BasicDataSource; import org.sleuthkit.autopsy.coreutils.Logger; +import org.sleuthkit.autopsy.casemodule.Case; /** * Sqlite implementation of the Central Repository database. @@ -263,6 +264,21 @@ public class SqliteEamDb extends AbstractSqlEamDb { } } + /** + * Creates new Case in the database from the given case + * + * @param case The case to add + */ + @Override + public EamCase newCase(Case autopsyCase) throws EamDbException { + try{ + acquireExclusiveLock(); + return super.newCase(autopsyCase); + } finally { + releaseExclusiveLock(); + } + } + /** * Creates new Case in the database * From 26a307b93cefeb296fdca1b168b15e9fd1b158ea Mon Sep 17 00:00:00 2001 From: "U-BASIS\\dgrove" Date: Fri, 8 Sep 2017 12:45:42 -0400 Subject: [PATCH 087/104] Added bundle messages to 'initComponents()'. --- .../autoingest/AutoIngestControlPanel.java | 65 ++++++++++++++++--- 1 file changed, 56 insertions(+), 9 deletions(-) diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestControlPanel.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestControlPanel.java index 00f5456560..72d323401b 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestControlPanel.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestControlPanel.java @@ -98,7 +98,7 @@ public final class AutoIngestControlPanel extends JPanel implements Observer { private static final String LOCAL_HOST_NAME = NetworkUtils.getLocalHostName(); private static final Logger SYS_LOGGER = AutoIngestSystemLogger.getLogger(); private static AutoIngestControlPanel instance; - private final DefaultTableModel pendingTableModel; + private DefaultTableModel pendingTableModel; //DLG: Make this 'final'! private final DefaultTableModel runningTableModel; private final DefaultTableModel completedTableModel; private AutoIngestManager manager; @@ -123,6 +123,7 @@ public final class AutoIngestControlPanel extends JPanel implements Observer { "AutoIngestControlPanel.JobsTableModel.ColumnHeader.StartedTime=Stage Started", "AutoIngestControlPanel.JobsTableModel.ColumnHeader.CompletedTime=Job Completed", "AutoIngestControlPanel.JobsTableModel.ColumnHeader.Stage=Stage", + "AutoIngestControlPanel.JobsTableModel.ColumnHeader.StageTime=Time in Stage", "AutoIngestControlPanel.JobsTableModel.ColumnHeader.Status=Status", "AutoIngestControlPanel.JobsTableModel.ColumnHeader.CaseFolder=Case Folder", "AutoIngestControlPanel.JobsTableModel.ColumnHeader.LocalJob= Local Job?", @@ -194,17 +195,26 @@ public final class AutoIngestControlPanel extends JPanel implements Observer { //Disable the main window so they can only use the dashboard (if we used setVisible the taskBar icon would go away) WindowManager.getDefault().getMainWindow().setEnabled(false); - + manager = AutoIngestManager.getInstance(); + + try { + pendingTableModel = new DefaultTableModel(JobsTableModelColumns.headers, 0) { + private static final long serialVersionUID = 1L; - pendingTableModel = new DefaultTableModel(JobsTableModelColumns.headers, 0) { - private static final long serialVersionUID = 1L; + @Override + public boolean isCellEditable(int row, int column) { + return false; + } + }; + } catch (Throwable ex) { + //DLG: Temporary code for troubleshooting. + SYS_LOGGER.log(Level.SEVERE, "AutoIngestControlPanel() error:", ex); + //DLG: Temporary code for troubleshooting. Remove when done! + pendingTableModel = null; + ////////////////////////////////////////////////////////////// + } - @Override - public boolean isCellEditable(int row, int column) { - return false; - } - }; runningTableModel = new DefaultTableModel(JobsTableModelColumns.headers, 0) { private static final long serialVersionUID = 1L; @@ -1112,6 +1122,43 @@ public final class AutoIngestControlPanel extends JPanel implements Observer { * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ + @Messages({ + "AutoIngestControlPanel.pendingTable.toolTipText=The Pending table displays the order upcoming Jobs will be processed with the top of the list first", + "AutoIngestControlPanel.runningTable.toolTipText=The Running table displays the currently running Job and information about it", + "AutoIngestControlPanel.completedTable.toolTipText=The Completed table shows all Jobs that have been processed already", + "AutoIngestControlPanel.bnCancelJob.text=&Cancel Job", + "AutoIngestControlPanel.bnCancelJob.toolTipText=Cancel processing of the current Job and move on to the next Job. This functionality is only available for jobs running on current AIM node.", + "AutoIngestControlPanel.bnDeleteCase.text=&Delete Case", + "AutoIngestControlPanel.bnDeleteCase.toolTipText=Delete the selected Case in its entirety", + "AutoIngestControlPanel.lbPending.text=Pending Jobs", + "AutoIngestControlPanel.lbRunning.text=Running Jobs", + "AutoIngestControlPanel.lbCompleted.text=Completed Jobs", + "AutoIngestControlPanel.bnRefresh.text=&Refresh", + "AutoIngestControlPanel.bnRefresh.toolTipText=Refresh displayed tables", + "AutoIngestControlPanel.bnCancelModule.text=Cancel &Module", + "AutoIngestControlPanel.bnCancelModule.toolTipText=Cancel processing of the current module within the Job and move on to the next module within the Job. This functionality is only available for jobs running on current AIM node.", + "AutoIngestControlPanel.bnExit.text=&Exit", + "AutoIngestControlPanel.bnExit.toolTipText=Exit Application", + "AutoIngestControlPanel.bnOptions.text=&Options", + "AutoIngestControlPanel.bnOptions.toolTipText=Display options panel. All processing must be paused to open the options panel.", + "AutoIngestControlPanel.bnShowProgress.text=Ingest Progress", + "AutoIngestControlPanel.bnShowProgress.toolTipText=Show the progress of the currently running Job. This functionality is only available for jobs running on current AIM node.", + "AutoIngestControlPanel.bnPause.text=Pause", + "AutoIngestControlPanel.bnPause.toolTipText=Suspend processing of Pending Jobs", + "AutoIngestControlPanel.bnPrioritizeCase.text=Prioritize Case", + "AutoIngestControlPanel.bnPrioritizeCase.toolTipText=Move all images associated with a case to top of Pending queue.", + "AutoIngestControlPanel.bnShowCaseLog.text=Show Case &Log", + "AutoIngestControlPanel.bnShowCaseLog.toolTipText=Display case log file for selected case", + "AutoIngestControlPanel.tbStatusMessage.text=", + "AutoIngestControlPanel.lbStatus.text=Status:", + "AutoIngestControlPanel.bnPrioritizeJob.text=Prioritize Job", + "AutoIngestControlPanel.bnPrioritizeJob.toolTipText=Move this folder to the top of the Pending queue.", + "AutoIngestControlPanel.bnPrioritizeJob.actionCommand=", + "AutoIngestControlPanel.lbServicesStatus.text=Services Status:", + "AutoIngestControlPanel.tbServicesStatusMessage.text=", + "AutoIngestControlPanel.bnOpenLogDir.text=Open System Logs Directory", + "AutoIngestControlPanel.bnReprocessJob.text=Reprocess Job" + }) @SuppressWarnings("unchecked") // //GEN-BEGIN:initComponents private void initComponents() { From 8c548b23fcf1b562e673db72b4582a3329f606e2 Mon Sep 17 00:00:00 2001 From: Richard Cordovano Date: Fri, 8 Sep 2017 13:00:39 -0400 Subject: [PATCH 088/104] Update KeywordHit.java --- .../src/org/sleuthkit/autopsy/keywordsearch/KeywordHit.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordHit.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordHit.java index 1cfcab98ab..5ca6fd7139 100755 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordHit.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordHit.java @@ -30,7 +30,7 @@ import org.sleuthkit.datamodel.TskCoreException; /** * Represents the fact that a file or an artifact associated with a file had a * keyword hit. All instances make both the document id of the Solr document - * where the keyword was found and the object Id of the file available to + * where the keyword was found and the object id of the file available to * clients. Keyword hits on the indexed text of an artifact also make the * artifact available to clients. */ From 721dacc5e8297af3b92f94173a00ae6201cbabd9 Mon Sep 17 00:00:00 2001 From: Richard Cordovano Date: Fri, 8 Sep 2017 13:03:50 -0400 Subject: [PATCH 089/104] Update KeywordHit.java --- .../src/org/sleuthkit/autopsy/keywordsearch/KeywordHit.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordHit.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordHit.java index 5ca6fd7139..8a173b8919 100755 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordHit.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordHit.java @@ -49,16 +49,16 @@ class KeywordHit implements Comparable { /** * Constructor * - * @param solrDocumentId The ID of the document this hit is in. + * @param solrDocumentId The id of the document this hit is in. * @param snippet A small amount of text from the document containing * the hit. * @param hit The exact text from the document that was the hit. - * For some searches (ie substring,regex) this will be + * For some searches (ie substring, regex) this will be * different than the search term. * * @throws TskCoreException If there is a problem getting the underlying * content associated with a hit on the text of an - * artifact.. + * artifact. */ KeywordHit(String solrDocumentId, String snippet, String hit) throws TskCoreException { this.snippet = StringUtils.stripToEmpty(snippet); From ac9c94dc27b0b2e2882f488b4d796fc9ba7e6c39 Mon Sep 17 00:00:00 2001 From: "U-BASIS\\dgrove" Date: Fri, 8 Sep 2017 13:07:16 -0400 Subject: [PATCH 090/104] Additional messages added/moved. --- .../autoingest/AutoIngestControlPanel.java | 120 +++++++++--------- 1 file changed, 61 insertions(+), 59 deletions(-) diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestControlPanel.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestControlPanel.java index 72d323401b..19d503b6e9 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestControlPanel.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestControlPanel.java @@ -70,6 +70,48 @@ import org.sleuthkit.autopsy.experimental.autoingest.AutoIngestManager.JobsSnaps * automated ingest for a single node within the cluster. There can be at most * one such panel per node. */ +@Messages({ + "AutoIngestControlPanel.bnPause.paused=Paused", + "AutoIngestControlPanel.bnPause.running=Running", + "AutoIngestControlPanel.bnPause.text=Pause", + "AutoIngestControlPanel.bnPause.toolTipText=Suspend processing of Pending Jobs", + "AutoIngestControlPanel.bnStart.startMessage=Waiting to start", + "AutoIngestControlPanel.bnStart.text=Start", + "AutoIngestControlPanel.bnStart.toolTipText=Start processing auto ingest jobs", + "AutoIngestControlPanel.pendingTable.toolTipText=The Pending table displays the order upcoming Jobs will be processed with the top of the list first", + "AutoIngestControlPanel.runningTable.toolTipText=The Running table displays the currently running Job and information about it", + "AutoIngestControlPanel.completedTable.toolTipText=The Completed table shows all Jobs that have been processed already", + "AutoIngestControlPanel.bnCancelJob.text=&Cancel Job", + "AutoIngestControlPanel.bnCancelJob.toolTipText=Cancel processing of the current Job and move on to the next Job. This functionality is only available for jobs running on current AIM node.", + "AutoIngestControlPanel.bnDeleteCase.text=&Delete Case", + "AutoIngestControlPanel.bnDeleteCase.toolTipText=Delete the selected Case in its entirety", + "AutoIngestControlPanel.lbPending.text=Pending Jobs", + "AutoIngestControlPanel.lbRunning.text=Running Jobs", + "AutoIngestControlPanel.lbCompleted.text=Completed Jobs", + "AutoIngestControlPanel.bnRefresh.text=&Refresh", + "AutoIngestControlPanel.bnRefresh.toolTipText=Refresh displayed tables", + "AutoIngestControlPanel.bnCancelModule.text=Cancel &Module", + "AutoIngestControlPanel.bnCancelModule.toolTipText=Cancel processing of the current module within the Job and move on to the next module within the Job. This functionality is only available for jobs running on current AIM node.", + "AutoIngestControlPanel.bnExit.text=&Exit", + "AutoIngestControlPanel.bnExit.toolTipText=Exit Application", + "AutoIngestControlPanel.bnOptions.text=&Options", + "AutoIngestControlPanel.bnOptions.toolTipText=Display options panel. All processing must be paused to open the options panel.", + "AutoIngestControlPanel.bnShowProgress.text=Ingest Progress", + "AutoIngestControlPanel.bnShowProgress.toolTipText=Show the progress of the currently running Job. This functionality is only available for jobs running on current AIM node.", + "AutoIngestControlPanel.bnPrioritizeCase.text=Prioritize Case", + "AutoIngestControlPanel.bnPrioritizeCase.toolTipText=Move all images associated with a case to top of Pending queue.", + "AutoIngestControlPanel.bnShowCaseLog.text=Show Case &Log", + "AutoIngestControlPanel.bnShowCaseLog.toolTipText=Display case log file for selected case", + "AutoIngestControlPanel.tbStatusMessage.text=", + "AutoIngestControlPanel.lbStatus.text=Status:", + "AutoIngestControlPanel.bnPrioritizeJob.text=Prioritize Job", + "AutoIngestControlPanel.bnPrioritizeJob.toolTipText=Move this folder to the top of the Pending queue.", + "AutoIngestControlPanel.bnPrioritizeJob.actionCommand=", + "AutoIngestControlPanel.lbServicesStatus.text=Services Status:", + "AutoIngestControlPanel.tbServicesStatusMessage.text=", + "AutoIngestControlPanel.bnOpenLogDir.text=Open System Logs Directory", + "AutoIngestControlPanel.bnReprocessJob.text=Reprocess Job" +}) public final class AutoIngestControlPanel extends JPanel implements Observer { private static final long serialVersionUID = 1L; @@ -98,7 +140,7 @@ public final class AutoIngestControlPanel extends JPanel implements Observer { private static final String LOCAL_HOST_NAME = NetworkUtils.getLocalHostName(); private static final Logger SYS_LOGGER = AutoIngestSystemLogger.getLogger(); private static AutoIngestControlPanel instance; - private DefaultTableModel pendingTableModel; //DLG: Make this 'final'! + private final DefaultTableModel pendingTableModel; private final DefaultTableModel runningTableModel; private final DefaultTableModel completedTableModel; private AutoIngestManager manager; @@ -198,23 +240,14 @@ public final class AutoIngestControlPanel extends JPanel implements Observer { manager = AutoIngestManager.getInstance(); - try { - pendingTableModel = new DefaultTableModel(JobsTableModelColumns.headers, 0) { - private static final long serialVersionUID = 1L; - - @Override - public boolean isCellEditable(int row, int column) { - return false; - } - }; - } catch (Throwable ex) { - //DLG: Temporary code for troubleshooting. - SYS_LOGGER.log(Level.SEVERE, "AutoIngestControlPanel() error:", ex); - //DLG: Temporary code for troubleshooting. Remove when done! - pendingTableModel = null; - ////////////////////////////////////////////////////////////// - } + pendingTableModel = new DefaultTableModel(JobsTableModelColumns.headers, 0) { + private static final long serialVersionUID = 1L; + @Override + public boolean isCellEditable(int row, int column) { + return false; + } + }; runningTableModel = new DefaultTableModel(JobsTableModelColumns.headers, 0) { private static final long serialVersionUID = 1L; @@ -614,6 +647,11 @@ public final class AutoIngestControlPanel extends JPanel implements Observer { * subscribes to services monitor events and starts a task to populate the * auto ingest job tables. The Refresh and Pause buttons are enabled. */ + @Messages({ + "AutoIngestControlPanel.AutoIngestStartupError=Failed to start automated ingest. Verify Multi-user Settings.", + "AutoIngestControlPanel.AutoIngestStartupFailed.Message=Failed to start automated ingest.\nPlease see auto ingest system log for details.", + "AutoIngestControlPanel.AutoIngestStartupFailed.Title=Automated Ingest Error", + }) private void startUp() { /* @@ -671,6 +709,12 @@ public final class AutoIngestControlPanel extends JPanel implements Observer { * Shuts down auto ingest by shutting down the auto ingest manager and doing * an application exit. */ + @Messages({ + "AutoIngestControlPanel.OK=OK", + "AutoIngestControlPanel.Cancel=Cancel", + "AutoIngestControlPanel.ExitConsequences=This will cancel any currently running job on this host. Exiting while a job is running potentially leaves the case in an inconsistent or corrupted state.", + "AutoIngestControlPanel.ExitingStatus=Exiting..." + }) public void shutdown() { /* * Confirm that the user wants to proceed, letting him or her no that if @@ -743,7 +787,6 @@ public final class AutoIngestControlPanel extends JPanel implements Observer { * @inheritDoc */ @Messages({ - "AutoIngestControlPanel.bnPause.paused=Paused", "AutoIngestControlPanel.PauseDueToDatabaseServiceDown=Paused, unable to communicate with case database service.", "AutoIngestControlPanel.PauseDueToKeywordSearchServiceDown=Paused, unable to communicate with keyword search service.", "AutoIngestControlPanel.PauseDueToCoordinationServiceDown=Paused, unable to communicate with coordination service.", @@ -751,10 +794,6 @@ public final class AutoIngestControlPanel extends JPanel implements Observer { "AutoIngestControlPanel.PauseDueToSharedConfigError=Paused, unable to update shared configuration.", "AutoIngestControlPanel.PauseDueToIngestJobStartFailure=Paused, unable to start ingest job processing.", "AutoIngestControlPanel.PauseDueToFileExporterError=Paused, unable to load File Exporter settings.", - "AutoIngestControlPanel.bnPause.running=Running", - "AutoIngestControlPanel.bnStart.startMessage=Waiting to start", - "AutoIngestControlPanel.bnStart.text=Start", - "AutoIngestControlPanel.bnStart.toolTipText=Start processing auto ingest jobs" }) @Override public void update(Observable o, Object arg) { @@ -1122,43 +1161,6 @@ public final class AutoIngestControlPanel extends JPanel implements Observer { * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ - @Messages({ - "AutoIngestControlPanel.pendingTable.toolTipText=The Pending table displays the order upcoming Jobs will be processed with the top of the list first", - "AutoIngestControlPanel.runningTable.toolTipText=The Running table displays the currently running Job and information about it", - "AutoIngestControlPanel.completedTable.toolTipText=The Completed table shows all Jobs that have been processed already", - "AutoIngestControlPanel.bnCancelJob.text=&Cancel Job", - "AutoIngestControlPanel.bnCancelJob.toolTipText=Cancel processing of the current Job and move on to the next Job. This functionality is only available for jobs running on current AIM node.", - "AutoIngestControlPanel.bnDeleteCase.text=&Delete Case", - "AutoIngestControlPanel.bnDeleteCase.toolTipText=Delete the selected Case in its entirety", - "AutoIngestControlPanel.lbPending.text=Pending Jobs", - "AutoIngestControlPanel.lbRunning.text=Running Jobs", - "AutoIngestControlPanel.lbCompleted.text=Completed Jobs", - "AutoIngestControlPanel.bnRefresh.text=&Refresh", - "AutoIngestControlPanel.bnRefresh.toolTipText=Refresh displayed tables", - "AutoIngestControlPanel.bnCancelModule.text=Cancel &Module", - "AutoIngestControlPanel.bnCancelModule.toolTipText=Cancel processing of the current module within the Job and move on to the next module within the Job. This functionality is only available for jobs running on current AIM node.", - "AutoIngestControlPanel.bnExit.text=&Exit", - "AutoIngestControlPanel.bnExit.toolTipText=Exit Application", - "AutoIngestControlPanel.bnOptions.text=&Options", - "AutoIngestControlPanel.bnOptions.toolTipText=Display options panel. All processing must be paused to open the options panel.", - "AutoIngestControlPanel.bnShowProgress.text=Ingest Progress", - "AutoIngestControlPanel.bnShowProgress.toolTipText=Show the progress of the currently running Job. This functionality is only available for jobs running on current AIM node.", - "AutoIngestControlPanel.bnPause.text=Pause", - "AutoIngestControlPanel.bnPause.toolTipText=Suspend processing of Pending Jobs", - "AutoIngestControlPanel.bnPrioritizeCase.text=Prioritize Case", - "AutoIngestControlPanel.bnPrioritizeCase.toolTipText=Move all images associated with a case to top of Pending queue.", - "AutoIngestControlPanel.bnShowCaseLog.text=Show Case &Log", - "AutoIngestControlPanel.bnShowCaseLog.toolTipText=Display case log file for selected case", - "AutoIngestControlPanel.tbStatusMessage.text=", - "AutoIngestControlPanel.lbStatus.text=Status:", - "AutoIngestControlPanel.bnPrioritizeJob.text=Prioritize Job", - "AutoIngestControlPanel.bnPrioritizeJob.toolTipText=Move this folder to the top of the Pending queue.", - "AutoIngestControlPanel.bnPrioritizeJob.actionCommand=", - "AutoIngestControlPanel.lbServicesStatus.text=Services Status:", - "AutoIngestControlPanel.tbServicesStatusMessage.text=", - "AutoIngestControlPanel.bnOpenLogDir.text=Open System Logs Directory", - "AutoIngestControlPanel.bnReprocessJob.text=Reprocess Job" - }) @SuppressWarnings("unchecked") // //GEN-BEGIN:initComponents private void initComponents() { From 7eb441a88dd7d4f23190cd8176596d01ae9faf2d Mon Sep 17 00:00:00 2001 From: "U-BASIS\\dgrove" Date: Fri, 8 Sep 2017 13:10:57 -0400 Subject: [PATCH 091/104] Minor fix. --- .../experimental/autoingest/AutoIngestControlPanel.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestControlPanel.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestControlPanel.java index 19d503b6e9..366f34b9df 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestControlPanel.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestControlPanel.java @@ -71,10 +71,12 @@ import org.sleuthkit.autopsy.experimental.autoingest.AutoIngestManager.JobsSnaps * one such panel per node. */ @Messages({ - "AutoIngestControlPanel.bnPause.paused=Paused", - "AutoIngestControlPanel.bnPause.running=Running", "AutoIngestControlPanel.bnPause.text=Pause", + "AutoIngestControlPanel.bnPause.confirmHeader=Are you sure you want to pause?", + "AutoIngestControlPanel.bnPause.warningText=Pause will occur after the current job completes processing. This could take a long time. Continue?", "AutoIngestControlPanel.bnPause.toolTipText=Suspend processing of Pending Jobs", + "AutoIngestControlPanel.bnPause.toolTipTextResume=Resume processing of Pending Jobs", + "AutoIngestControlPanel.bnPause.pausing=Pausing after current job completes...", "AutoIngestControlPanel.bnStart.startMessage=Waiting to start", "AutoIngestControlPanel.bnStart.text=Start", "AutoIngestControlPanel.bnStart.toolTipText=Start processing auto ingest jobs", From ded1a2ea8de1e0cdff6221e774131ba8e29ca8e1 Mon Sep 17 00:00:00 2001 From: "U-BASIS\\dgrove" Date: Fri, 8 Sep 2017 13:30:52 -0400 Subject: [PATCH 092/104] Minor fix. --- .../experimental/autoingest/AutoIngestControlPanel.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestControlPanel.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestControlPanel.java index 366f34b9df..d2acc3347e 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestControlPanel.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestControlPanel.java @@ -72,6 +72,7 @@ import org.sleuthkit.autopsy.experimental.autoingest.AutoIngestManager.JobsSnaps */ @Messages({ "AutoIngestControlPanel.bnPause.text=Pause", + "AutoIngestControlPanel.bnPause.paused=Paused", "AutoIngestControlPanel.bnPause.confirmHeader=Are you sure you want to pause?", "AutoIngestControlPanel.bnPause.warningText=Pause will occur after the current job completes processing. This could take a long time. Continue?", "AutoIngestControlPanel.bnPause.toolTipText=Suspend processing of Pending Jobs", @@ -810,7 +811,7 @@ public final class AutoIngestControlPanel extends JPanel implements Observer { break; case PAUSED_BY_REQUEST: EventQueue.invokeLater(() -> { - tbStatusMessage.setText(Bundle.AutoIngestControlPanel_bnPause_paused()); + tbStatusMessage.setText(org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.bnPause.paused")); bnOptions.setEnabled(true); bnRefresh.setEnabled(false); isPaused = true; @@ -1609,9 +1610,6 @@ public final class AutoIngestControlPanel extends JPanel implements Observer { * * @param evt The button click event. */ - @Messages({ - "AutoIngestControlPanel.bnPause.pausing=Pausing after current job completes..." - }) private void bnPauseActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnPauseActionPerformed if (!autoIngestStarted) { From 7174fc02dbe12e8714628a9963e0e1a9ecaaf6e9 Mon Sep 17 00:00:00 2001 From: "U-BASIS\\dgrove" Date: Fri, 8 Sep 2017 13:45:26 -0400 Subject: [PATCH 093/104] Missing message. --- .../autopsy/experimental/autoingest/AutoIngestControlPanel.java | 1 + 1 file changed, 1 insertion(+) diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestControlPanel.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestControlPanel.java index d2acc3347e..18e8b4f929 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestControlPanel.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestControlPanel.java @@ -73,6 +73,7 @@ import org.sleuthkit.autopsy.experimental.autoingest.AutoIngestManager.JobsSnaps @Messages({ "AutoIngestControlPanel.bnPause.text=Pause", "AutoIngestControlPanel.bnPause.paused=Paused", + "AutoIngestControlPanel.bnPause.running=Running", "AutoIngestControlPanel.bnPause.confirmHeader=Are you sure you want to pause?", "AutoIngestControlPanel.bnPause.warningText=Pause will occur after the current job completes processing. This could take a long time. Continue?", "AutoIngestControlPanel.bnPause.toolTipText=Suspend processing of Pending Jobs", From 708543eab3d94236da7ba8bb6de78558e114db81 Mon Sep 17 00:00:00 2001 From: "U-BASIS\\dgrove" Date: Fri, 8 Sep 2017 14:06:35 -0400 Subject: [PATCH 094/104] More messages from Bundle.properties --- .../autoingest/AutoIngestControlPanel.java | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestControlPanel.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestControlPanel.java index 18e8b4f929..72a81b2835 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestControlPanel.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestControlPanel.java @@ -89,6 +89,7 @@ import org.sleuthkit.autopsy.experimental.autoingest.AutoIngestManager.JobsSnaps "AutoIngestControlPanel.bnCancelJob.toolTipText=Cancel processing of the current Job and move on to the next Job. This functionality is only available for jobs running on current AIM node.", "AutoIngestControlPanel.bnDeleteCase.text=&Delete Case", "AutoIngestControlPanel.bnDeleteCase.toolTipText=Delete the selected Case in its entirety", + "AutoIngestControlPanel.bnResume.text=Resume", "AutoIngestControlPanel.lbPending.text=Pending Jobs", "AutoIngestControlPanel.lbRunning.text=Running Jobs", "AutoIngestControlPanel.lbCompleted.text=Completed Jobs", @@ -110,11 +111,24 @@ import org.sleuthkit.autopsy.experimental.autoingest.AutoIngestManager.JobsSnaps "AutoIngestControlPanel.lbStatus.text=Status:", "AutoIngestControlPanel.bnPrioritizeJob.text=Prioritize Job", "AutoIngestControlPanel.bnPrioritizeJob.toolTipText=Move this folder to the top of the Pending queue.", - "AutoIngestControlPanel.bnPrioritizeJob.actionCommand=", + "AutoIngestControlPanel.bnPrioritizeJob.actionCommand=", "AutoIngestControlPanel.lbServicesStatus.text=Services Status:", "AutoIngestControlPanel.tbServicesStatusMessage.text=", "AutoIngestControlPanel.bnOpenLogDir.text=Open System Logs Directory", - "AutoIngestControlPanel.bnReprocessJob.text=Reprocess Job" + "AutoIngestControlPanel.bnReprocessJob.text=Reprocess Job", + "AutoIngestControlPanel.bnPrioritizeFolder.label=", + "AutoIngestControlPanel.Cancelling=Cancelling...", + "AutoIngestControlPanel.AutoIngestStartupWarning.Title=Automated Ingest Warning", + "AutoIngestControlPanel.AutoIngestStartupWarning.Message=Failed to establish remote communications with other automated ingest nodes.\nAuto ingest dashboard will only be able to display local ingest job events.\nPlease verify Multi-User settings (Options->Multi-User). See application log for details.", + "AutoIngestControlPanel.UpdatingSharedConfig=Updating shared configuration", + "AutoIngestControlPanel.SharedConfigurationDisabled=Shared configuration disabled", + "AutoIngestControlPanel.EnableConfigurationSettings=Enable shared configuration from the options panel before uploading", + "AutoIngestControlPanel.ErrorUploadingConfiguration=Error uploading configuration", + "AutoIngestControlPanel.UploadSuccessTitle=Success", + "AutoIngestControlPanel.UploadSuccess=Shared configuration successfully uploaded", + "AutoIngestControlPanel.UploadFailedTitle=Failed", + "AutoIngestControlPanel.ConfigLocked=The shared configuration directory is locked because upload from another node is in progress. \nIf this is an error, you can unlock the directory and then retry the upload.", + "AutoIngestControlPanel.ConfigLockedTitle=Configuration directory locked" }) public final class AutoIngestControlPanel extends JPanel implements Observer { From bd13254124d1ff77fc3bb90bc699bcdd97dc8a98 Mon Sep 17 00:00:00 2001 From: Richard Cordovano Date: Fri, 8 Sep 2017 14:11:51 -0400 Subject: [PATCH 095/104] Make Case.getName and CaseMetaData.getName docs consistent --- Core/src/org/sleuthkit/autopsy/casemodule/Case.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/Case.java b/Core/src/org/sleuthkit/autopsy/casemodule/Case.java index d6226a06d8..1becc449d5 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/Case.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/Case.java @@ -1129,7 +1129,7 @@ public class Case { } /** - * Gets the immutable case name. + * Gets the unique and immutable case name. * * @return The case name. */ From b82643ad40fca6120e37b3098c8a855d539a519b Mon Sep 17 00:00:00 2001 From: Richard Cordovano Date: Fri, 8 Sep 2017 16:05:20 -0400 Subject: [PATCH 096/104] Correct errors in AutoIngestMonitor$CoordinationServiceQueryTask.run --- .../autopsy/experimental/autoingest/AutoIngestMonitor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMonitor.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMonitor.java index ddfbccaeac..ec70e778da 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMonitor.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMonitor.java @@ -313,7 +313,7 @@ public final class AutoIngestMonitor extends Observable implements PropertyChang */ @Override public void run() { - if (Thread.currentThread().isInterrupted()) { + if (!Thread.currentThread().isInterrupted()) { JobsSnapshot newJobsSnapshot = queryCoordinationService(); synchronized (jobsLock) { jobsSnapshot = newJobsSnapshot; From 826b1fb4632b7151e39dddbd4bcfa529ebe93eea Mon Sep 17 00:00:00 2001 From: Richard Cordovano Date: Fri, 8 Sep 2017 16:53:09 -0400 Subject: [PATCH 097/104] Correct errors in AutoIngestMonitor.run --- .../autopsy/experimental/autoingest/AutoIngestMonitor.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMonitor.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMonitor.java index ec70e778da..9b5a0df78d 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMonitor.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMonitor.java @@ -317,9 +317,9 @@ public final class AutoIngestMonitor extends Observable implements PropertyChang JobsSnapshot newJobsSnapshot = queryCoordinationService(); synchronized (jobsLock) { jobsSnapshot = newJobsSnapshot; + setChanged(); + notifyObservers(jobsSnapshot); } - setChanged(); - notifyObservers(); } } From cdc723507cdc47a5eec3a1bbc69d0808424dd786 Mon Sep 17 00:00:00 2001 From: millmanorama Date: Sat, 9 Sep 2017 13:17:10 +0200 Subject: [PATCH 098/104] cleanup ImageFilePanel --- .../autopsy/casemodule/ImageFilePanel.java | 188 ++++++++---------- 1 file changed, 78 insertions(+), 110 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/ImageFilePanel.java b/Core/src/org/sleuthkit/autopsy/casemodule/ImageFilePanel.java index 4373959707..ebab01ea79 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/ImageFilePanel.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/ImageFilePanel.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"); @@ -20,22 +20,24 @@ package org.sleuthkit.autopsy.casemodule; import java.io.File; import java.util.Calendar; +import java.util.LinkedList; import java.util.List; +import java.util.MissingResourceException; +import java.util.Optional; import java.util.SimpleTimeZone; import java.util.TimeZone; +import java.util.logging.Level; import javax.swing.JFileChooser; +import javax.swing.JPanel; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; -import javax.swing.JPanel; import javax.swing.filechooser.FileFilter; - import org.openide.util.NbBundle; import org.sleuthkit.autopsy.corecomponentinterfaces.DataSourceProcessor; -import org.sleuthkit.autopsy.coreutils.ModuleSettings; -import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil; -import java.util.logging.Level; import org.sleuthkit.autopsy.coreutils.DriveUtils; import org.sleuthkit.autopsy.coreutils.Logger; +import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil; +import org.sleuthkit.autopsy.coreutils.ModuleSettings; import org.sleuthkit.autopsy.coreutils.PathValidator; /** @@ -43,68 +45,70 @@ import org.sleuthkit.autopsy.coreutils.PathValidator; */ public class ImageFilePanel extends JPanel implements DocumentListener { - private final String PROP_LASTIMAGE_PATH = "LBL_LastImage_PATH"; //NON-NLS private static final Logger logger = Logger.getLogger(ImageFilePanel.class.getName()); - private final JFileChooser fc = new JFileChooser(); + private static final String PROP_LASTIMAGE_PATH = "LBL_LastImage_PATH"; //NON-NLS - // Externally supplied name is used to store settings + private final JFileChooser fileChooser = new JFileChooser(); + + /** + * Externally supplied name is used to store settings + */ private final String contextName; /** * Creates new form ImageFilePanel * - * @param context a string context name used to read/store last - * used settings - * @param fileChooserFilters a list of filters to be used with the - * FileChooser + * @param context A string context name used to read/store last + * used settings. + * @param fileChooserFilters A list of filters to be used with the + * FileChooser. */ private ImageFilePanel(String context, List fileChooserFilters) { + this.contextName = context; + initComponents(); - fc.setDragEnabled(false); - fc.setFileSelectionMode(JFileChooser.FILES_ONLY); - fc.setMultiSelectionEnabled(false); + // load and add all timezone + for (String id : SimpleTimeZone.getAvailableIDs()) { + timeZoneComboBox.addItem(timeZoneToString(TimeZone.getTimeZone(id))); + } + // set the selected timezone to the current timezone + timeZoneComboBox.setSelectedItem(timeZoneToString(Calendar.getInstance().getTimeZone())); errorLabel.setVisible(false); - boolean firstFilter = true; - for (FileFilter filter : fileChooserFilters) { - if (firstFilter) { // set the first on the list as the default selection - fc.setFileFilter(filter); - firstFilter = false; - } else { - fc.addChoosableFileFilter(filter); - } - } - - this.contextName = context; + fileChooser.setDragEnabled(false); + fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY); + fileChooser.setMultiSelectionEnabled(false); + LinkedList filters = new LinkedList<>(fileChooserFilters); + Optional.of(filters.poll()).ifPresent(fileChooser::setFileFilter); + filters.forEach(fileChooser::addChoosableFileFilter); } /** * Creates and returns an instance of a ImageFilePanel. + * + * @param context A string context name used to read/store last + * used settings. + * @param fileChooserFilters A list of filters to be used with the + * FileChooser. + * * @return instance of the ImageFilePanel */ public static synchronized ImageFilePanel createInstance(String context, List fileChooserFilters) { ImageFilePanel instance = new ImageFilePanel(context, fileChooserFilters); - instance.postInit(); - instance.createTimeZoneList(); + // post-constructor initialization of listener support without leaking references of uninitialized objects + instance.pathTextField.getDocument().addDocumentListener(instance); return instance; } - //post-constructor initialization to properly initialize listener support - //without leaking references of uninitialized objects - private void postInit() { - pathTextField.getDocument().addDocumentListener(this); - } - /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ - @SuppressWarnings("unchecked") // //GEN-BEGIN:initComponents private void initComponents() { @@ -187,29 +191,21 @@ public class ImageFilePanel extends JPanel implements DocumentListener { .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); }// //GEN-END:initComponents - @SuppressWarnings("deprecation") + 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 File currentDir = new File(oldText); if (currentDir.exists()) { - fc.setCurrentDirectory(currentDir); + fileChooser.setCurrentDirectory(currentDir); } - int retval = fc.showOpenDialog(this); + int retval = fileChooser.showOpenDialog(this); if (retval == JFileChooser.APPROVE_OPTION) { - String path = fc.getSelectedFile().getPath(); - pathTextField.setText(path); + pathTextField.setText(fileChooser.getSelectedFile().getPath()); } - try { - firePropertyChange(DataSourceProcessor.DSP_PANEL_EVENT.FOCUS_NEXT.toString(), false, true); - } catch (Exception e) { - logger.log(Level.SEVERE, "ImageFilePanel listener threw exception", e); //NON-NLS - MessageNotifyUtil.Notify.show(NbBundle.getMessage(this.getClass(), "ImageFilePanel.moduleErr"), - NbBundle.getMessage(this.getClass(), "ImageFilePanel.moduleErr.msg"), - MessageNotifyUtil.MessageType.ERROR); - } + updateHelper(); }//GEN-LAST:event_browseButtonActionPerformed // Variables declaration - do not modify//GEN-BEGIN:variables @@ -234,6 +230,7 @@ public class ImageFilePanel extends JPanel implements DocumentListener { /** * Set the path of the image file. + * * @param s path of the image file */ public void setContentPath(String s) { @@ -305,41 +302,40 @@ public class ImageFilePanel extends JPanel implements DocumentListener { } } } - /** - * Creates the drop down list for the time zones and then makes the local + * Populates the drop down list for the time zones and then makes the local * machine time zone to be selected. */ - public void createTimeZoneList() { - // load and add all timezone - String[] ids = SimpleTimeZone.getAvailableIDs(); - for (String id : ids) { - TimeZone zone = TimeZone.getTimeZone(id); - int offset = zone.getRawOffset() / 1000; - int hour = offset / 3600; - int minutes = (offset % 3600) / 60; - String item = String.format("(GMT%+d:%02d) %s", hour, minutes, id); //NON-NLS - /* - * DateFormat dfm = new SimpleDateFormat("z"); - * dfm.setTimeZone(zone); boolean hasDaylight = - * zone.useDaylightTime(); String first = dfm.format(new Date(2010, - * 1, 1)); String second = dfm.format(new Date(2011, 6, 6)); int mid - * = hour * -1; String result = first + Integer.toString(mid); - * if(hasDaylight){ result = result + second; } - * timeZoneComboBox.addItem(item + " (" + result + ")"); - */ - timeZoneComboBox.addItem(item); - } - // get the current timezone - TimeZone thisTimeZone = Calendar.getInstance().getTimeZone(); - int thisOffset = thisTimeZone.getRawOffset() / 1000; - int thisHour = thisOffset / 3600; - int thisMinutes = (thisOffset % 3600) / 60; - String formatted = String.format("(GMT%+d:%02d) %s", thisHour, thisMinutes, thisTimeZone.getID()); //NON-NLS + /** + * Get a string representation of a TimeZone for use in the drop down list. + * + * @param zone The TimeZone to make a string for + * + * @return A string representation of a TimeZone for use in the drop down + * list. + */ + static private String timeZoneToString(TimeZone zone) { + int offset = zone.getRawOffset() / 1000; + int hour = offset / 3600; + int minutes = (offset % 3600) / 60; + String item = String.format("(GMT%+d:%02d) %s", hour, minutes, zone.getID()); //NON-NLS + return item; + } - // set the selected timezone - timeZoneComboBox.setSelectedItem(formatted); + @Override + public void insertUpdate(DocumentEvent e) { + updateHelper(); + } + + @Override + public void removeUpdate(DocumentEvent e) { + updateHelper(); + } + + @Override + public void changedUpdate(DocumentEvent e) { + updateHelper(); } /** @@ -347,42 +343,14 @@ public class ImageFilePanel extends JPanel implements DocumentListener { * it's DocumentEventListener. Each update function fires a property change * to be caught by the parent panel. * - * @param e the event, which is ignored */ - @Override - public void insertUpdate(DocumentEvent e) { - + private void updateHelper() throws MissingResourceException { try { firePropertyChange(DataSourceProcessor.DSP_PANEL_EVENT.UPDATE_UI.toString(), false, true); } catch (Exception ee) { logger.log(Level.SEVERE, "ImageFilePanel listener threw exception", ee); //NON-NLS - MessageNotifyUtil.Notify.show(NbBundle.getMessage(this.getClass(), "ImageFilePanel.moduleErr"), - NbBundle.getMessage(this.getClass(), "ImageFilePanel.moduleErr.msg"), - MessageNotifyUtil.MessageType.ERROR); - } - } - - @Override - public void removeUpdate(DocumentEvent e) { - try { - firePropertyChange(DataSourceProcessor.DSP_PANEL_EVENT.UPDATE_UI.toString(), false, true); - } catch (Exception ee) { - logger.log(Level.SEVERE, "ImageFilePanel listener threw exception", ee); //NON-NLS - MessageNotifyUtil.Notify.show(NbBundle.getMessage(this.getClass(), "ImageFilePanel.moduleErr"), - NbBundle.getMessage(this.getClass(), "ImageFilePanel.moduleErr.msg"), - MessageNotifyUtil.MessageType.ERROR); - } - } - - @Override - public void changedUpdate(DocumentEvent e) { - - try { - firePropertyChange(DataSourceProcessor.DSP_PANEL_EVENT.UPDATE_UI.toString(), false, true); - } catch (Exception ee) { - logger.log(Level.SEVERE, "ImageFilePanel listener threw exception", ee); //NON-NLS - MessageNotifyUtil.Notify.show(NbBundle.getMessage(this.getClass(), "ImageFilePanel.moduleErr"), - NbBundle.getMessage(this.getClass(), "ImageFilePanel.moduleErr.msg"), + MessageNotifyUtil.Notify.show(NbBundle.getMessage(ImageFilePanel.class, "ImageFilePanel.moduleErr"), + NbBundle.getMessage(ImageFilePanel.class, "ImageFilePanel.moduleErr.msg"), MessageNotifyUtil.MessageType.ERROR); } } From a50284ea730aba256ce2b4f61f3f46baff60a9ad Mon Sep 17 00:00:00 2001 From: millmanorama Date: Sat, 9 Sep 2017 13:25:55 +0200 Subject: [PATCH 099/104] minor cleanup --- .../autopsy/casemodule/ImageFilePanel.java | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/ImageFilePanel.java b/Core/src/org/sleuthkit/autopsy/casemodule/ImageFilePanel.java index ebab01ea79..c28c4ab279 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/ImageFilePanel.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/ImageFilePanel.java @@ -20,10 +20,8 @@ package org.sleuthkit.autopsy.casemodule; import java.io.File; import java.util.Calendar; -import java.util.LinkedList; import java.util.List; import java.util.MissingResourceException; -import java.util.Optional; import java.util.SimpleTimeZone; import java.util.TimeZone; import java.util.logging.Level; @@ -67,7 +65,8 @@ public class ImageFilePanel extends JPanel implements DocumentListener { this.contextName = context; initComponents(); - // load and add all timezone + + // Populate the drop down list of time zones for (String id : SimpleTimeZone.getAvailableIDs()) { timeZoneComboBox.addItem(timeZoneToString(TimeZone.getTimeZone(id))); } @@ -80,9 +79,11 @@ public class ImageFilePanel extends JPanel implements DocumentListener { fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY); fileChooser.setMultiSelectionEnabled(false); - LinkedList filters = new LinkedList<>(fileChooserFilters); - Optional.of(filters.poll()).ifPresent(fileChooser::setFileFilter); - filters.forEach(fileChooser::addChoosableFileFilter); + fileChooserFilters.forEach(fileChooser::addChoosableFileFilter); + if (fileChooserFilters.isEmpty() == false) { + fileChooser.setFileFilter(fileChooserFilters.get(0)); + } + } /** @@ -302,10 +303,6 @@ public class ImageFilePanel extends JPanel implements DocumentListener { } } } - /** - * Populates the drop down list for the time zones and then makes the local - * machine time zone to be selected. - */ /** * Get a string representation of a TimeZone for use in the drop down list. From 9984503bfe92a0b49bd6eda7559a999cdc7408b6 Mon Sep 17 00:00:00 2001 From: millmanorama Date: Sat, 9 Sep 2017 14:04:18 +0200 Subject: [PATCH 100/104] more cleanup --- .../autopsy/casemodule/Bundle.properties | 3 - .../autopsy/casemodule/ImageFilePanel.java | 70 +++++++------------ 2 files changed, 27 insertions(+), 46 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties b/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties index cdf46e4d8c..d806a605c2 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties @@ -145,8 +145,6 @@ GeneralFilter.executableDesc.text=Executables (*.exe) ImageDSProcessor.dsType.text=Disk Image or VM File GeneralFilter.graphicImageDesc.text=Images (*.png, *.jpg, *.jpeg, *.gif, *.bmp) ImageDSProcessor.allDesc.text=All Supported Types -ImageFilePanel.moduleErr=Module Error -ImageFilePanel.moduleErr.msg=A module caused an error listening to ImageFilePanel updates. See log to determine which module. Some data could be incomplete. LocalDiskDSProcessor.dsType.text=Local Disk LocalDiskPanel.localDiskModel.loading.msg=Loading local disks... LocalDiskPanel.localDiskModel.nodrives.msg=No Accessible Drives @@ -197,7 +195,6 @@ UpdateRecentCases.menuItem.clearRecentCases.text=Clear Recent Cases UpdateRecentCases.menuItem.empty=-Empty- AddImageWizardIngestConfigPanel.CANCEL_BUTTON.text=Cancel ImageFilePanel.errorLabel.text=Error Label -DataSourceOnCDriveError.text=Warning\: Path to multi-user data source is on "C\:" drive NewCaseVisualPanel1.CaseFolderOnCDriveError.text=Warning: Path to multi-user case folder is on \"C:\" drive LocalFilesPanel.errorLabel.text=Error Label CollaborationMonitor.addingDataSourceStatus.msg={0} adding data source diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/ImageFilePanel.java b/Core/src/org/sleuthkit/autopsy/casemodule/ImageFilePanel.java index c28c4ab279..0fe51144eb 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/ImageFilePanel.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/ImageFilePanel.java @@ -21,7 +21,6 @@ package org.sleuthkit.autopsy.casemodule; import java.io.File; import java.util.Calendar; import java.util.List; -import java.util.MissingResourceException; import java.util.SimpleTimeZone; import java.util.TimeZone; import java.util.logging.Level; @@ -30,7 +29,9 @@ import javax.swing.JPanel; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import javax.swing.filechooser.FileFilter; +import org.apache.commons.lang3.StringUtils; import org.openide.util.NbBundle; +import static org.sleuthkit.autopsy.casemodule.Bundle.*; import org.sleuthkit.autopsy.corecomponentinterfaces.DataSourceProcessor; import org.sleuthkit.autopsy.coreutils.DriveUtils; import org.sleuthkit.autopsy.coreutils.Logger; @@ -39,7 +40,9 @@ import org.sleuthkit.autopsy.coreutils.ModuleSettings; import org.sleuthkit.autopsy.coreutils.PathValidator; /** - * ImageTypePanel for adding an image file such as .img, .E0x, .00x, etc. + * Panel for adding an image file such as .img, .E0x, .00x, etc. Allows the user + * to select a file as well as choose the timezone and whether to ignore orphan + * files in FAT32. */ public class ImageFilePanel extends JPanel implements DocumentListener { @@ -63,7 +66,6 @@ public class ImageFilePanel extends JPanel implements DocumentListener { */ private ImageFilePanel(String context, List fileChooserFilters) { this.contextName = context; - initComponents(); // Populate the drop down list of time zones @@ -78,12 +80,10 @@ public class ImageFilePanel extends JPanel implements DocumentListener { fileChooser.setDragEnabled(false); fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY); fileChooser.setMultiSelectionEnabled(false); - fileChooserFilters.forEach(fileChooser::addChoosableFileFilter); if (fileChooserFilters.isEmpty() == false) { fileChooser.setFileFilter(fileChooserFilters.get(0)); } - } /** @@ -97,11 +97,9 @@ public class ImageFilePanel extends JPanel implements DocumentListener { * @return instance of the ImageFilePanel */ public static synchronized ImageFilePanel createInstance(String context, List fileChooserFilters) { - ImageFilePanel instance = new ImageFilePanel(context, fileChooserFilters); // post-constructor initialization of listener support without leaking references of uninitialized objects instance.pathTextField.getDocument().addDocumentListener(instance); - return instance; } @@ -194,16 +192,15 @@ public class ImageFilePanel extends JPanel implements DocumentListener { }// //GEN-END:initComponents private void browseButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_browseButtonActionPerformed - String oldText = pathTextField.getText(); + String oldText = getContentPaths(); // set the current directory of the FileChooser if the ImagePath Field is valid File currentDir = new File(oldText); if (currentDir.exists()) { fileChooser.setCurrentDirectory(currentDir); } - int retval = fileChooser.showOpenDialog(this); - if (retval == JFileChooser.APPROVE_OPTION) { - pathTextField.setText(fileChooser.getSelectedFile().getPath()); + if (fileChooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) { + setContentPath(fileChooser.getSelectedFile().getPath()); } updateHelper(); @@ -240,7 +237,7 @@ public class ImageFilePanel extends JPanel implements DocumentListener { public String getTimeZone() { String tz = timeZoneComboBox.getSelectedItem().toString(); - return tz.substring(tz.indexOf(")") + 2).trim(); + return tz.substring(tz.indexOf(')') + 2).trim(); } public boolean getNoFatOrphans() { @@ -257,34 +254,23 @@ public class ImageFilePanel extends JPanel implements DocumentListener { * * @return true if a proper image has been selected, false otherwise */ + @NbBundle.Messages("DataSourceOnCDriveError.text=Warning: Path to multi-user data source is on \"C:\" drive") public boolean validatePanel() { errorLabel.setVisible(false); String path = getContentPaths(); - if (path == null || path.isEmpty()) { + if (StringUtils.isBlank(path)) { return false; } // display warning if there is one (but don't disable "next" button) - warnIfPathIsInvalid(path); - - boolean isExist = new File(path).isFile(); - boolean isPhysicalDrive = DriveUtils.isPhysicalDrive(path); - boolean isPartition = DriveUtils.isPartition(path); - - return (isExist || isPhysicalDrive || isPartition); - } - - /** - * Validates path to selected data source and displays warning if it is - * invalid. - * - * @param path Absolute path to the selected data source - */ - private void warnIfPathIsInvalid(String path) { - if (!PathValidator.isValid(path, Case.getCurrentCase().getCaseType())) { + if (false == PathValidator.isValid(path, Case.getCurrentCase().getCaseType())) { errorLabel.setVisible(true); - errorLabel.setText(NbBundle.getMessage(this.getClass(), "DataSourceOnCDriveError.text")); + errorLabel.setText(Bundle.DataSourceOnCDriveError_text()); } + + return new File(path).isFile() + || DriveUtils.isPhysicalDrive(path) + || DriveUtils.isPartition(path); } public void storeSettings() { @@ -297,10 +283,8 @@ public class ImageFilePanel extends JPanel implements DocumentListener { public void readSettings() { String lastImagePath = ModuleSettings.getConfigSetting(contextName, PROP_LASTIMAGE_PATH); - if (null != lastImagePath) { - if (!lastImagePath.isEmpty()) { - pathTextField.setText(lastImagePath); - } + if (StringUtils.isNotBlank(lastImagePath)) { + setContentPath(lastImagePath); } } @@ -316,8 +300,7 @@ public class ImageFilePanel extends JPanel implements DocumentListener { int offset = zone.getRawOffset() / 1000; int hour = offset / 3600; int minutes = (offset % 3600) / 60; - String item = String.format("(GMT%+d:%02d) %s", hour, minutes, zone.getID()); //NON-NLS - return item; + return String.format("(GMT%+d:%02d) %s", hour, minutes, zone.getID()); //NON-NLS } @Override @@ -341,14 +324,15 @@ public class ImageFilePanel extends JPanel implements DocumentListener { * to be caught by the parent panel. * */ - private void updateHelper() throws MissingResourceException { + @NbBundle.Messages({"ImageFilePanel.moduleErr=Module Error", + "ImageFilePanel.moduleErr.msg=A module caused an error listening to ImageFilePanel updates." + + " See log to determine which module. Some data could be incomplete.\n"}) + private void updateHelper() { try { firePropertyChange(DataSourceProcessor.DSP_PANEL_EVENT.UPDATE_UI.toString(), false, true); - } catch (Exception ee) { - logger.log(Level.SEVERE, "ImageFilePanel listener threw exception", ee); //NON-NLS - MessageNotifyUtil.Notify.show(NbBundle.getMessage(ImageFilePanel.class, "ImageFilePanel.moduleErr"), - NbBundle.getMessage(ImageFilePanel.class, "ImageFilePanel.moduleErr.msg"), - MessageNotifyUtil.MessageType.ERROR); + } catch (Exception e) { + logger.log(Level.SEVERE, "ImageFilePanel listener threw exception", e); //NON-NLS + MessageNotifyUtil.Notify.error(ImageFilePanel_moduleErr(), ImageFilePanel_moduleErr_msg()); } } From cba65e8f4bdf463891299c626278ccab15436184 Mon Sep 17 00:00:00 2001 From: millmanorama Date: Sun, 10 Sep 2017 10:05:18 +0200 Subject: [PATCH 101/104] clean up GeneralFilter.java --- .../autopsy/casemodule/Bundle.properties | 5 -- .../autopsy/casemodule/GeneralFilter.java | 48 ++++++++----------- 2 files changed, 21 insertions(+), 32 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties b/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties index d806a605c2..85dd7443ae 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties @@ -138,12 +138,7 @@ IntervalErrorReport.TotalIssues=total issue(s) IntervalErrorReport.ErrorText=Database Connection Error CasePropertiesAction.window.title=Case Properties CueBannerPanel.title.text=Open Recent Case -GeneralFilter.rawImageDesc.text=Raw Images (*.img, *.dd, *.001, *.aa, *.raw, *.bin) -GeneralFilter.encaseImageDesc.text=Encase Images (*.e01) -GeneralFilter.virtualMachineImageDesc.text=Virtual Machines (*.vmdk, *.vhd) -GeneralFilter.executableDesc.text=Executables (*.exe) ImageDSProcessor.dsType.text=Disk Image or VM File -GeneralFilter.graphicImageDesc.text=Images (*.png, *.jpg, *.jpeg, *.gif, *.bmp) ImageDSProcessor.allDesc.text=All Supported Types LocalDiskDSProcessor.dsType.text=Local Disk LocalDiskPanel.localDiskModel.loading.msg=Loading local disks... diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/GeneralFilter.java b/Core/src/org/sleuthkit/autopsy/casemodule/GeneralFilter.java index f848722953..7d06ae23c3 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/GeneralFilter.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/GeneralFilter.java @@ -1,7 +1,7 @@ /* * Autopsy Forensic Browser * - * Copyright 2011 Basis Technology Corp. + * Copyright 2011-2017 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -18,12 +18,11 @@ */ package org.sleuthkit.autopsy.casemodule; -import org.openide.util.NbBundle; - import java.io.File; -import java.util.List; import java.util.Arrays; +import java.util.List; import javax.swing.filechooser.FileFilter; +import org.openide.util.NbBundle; /** * FileFilter helper class. Matches files based on extension @@ -31,25 +30,28 @@ import javax.swing.filechooser.FileFilter; public class GeneralFilter extends FileFilter { // Extensions & Descriptions for commonly used filters - public static final List RAW_IMAGE_EXTS = Arrays.asList(new String[]{".img", ".dd", ".001", ".aa", ".raw", ".bin"}); //NON-NLS - public static final String RAW_IMAGE_DESC = NbBundle.getMessage(GeneralFilter.class, "GeneralFilter.rawImageDesc.text"); + public static final List RAW_IMAGE_EXTS = Arrays.asList(".img", ".dd", ".001", ".aa", ".raw", ".bin"); //NON-NLS + @NbBundle.Messages("GeneralFilter.rawImageDesc.text=Raw Images (*.img, *.dd, *.001, *.aa, *.raw, *.bin)") + public static final String RAW_IMAGE_DESC = Bundle.GeneralFilter_rawImageDesc_text(); - public static final List ENCASE_IMAGE_EXTS = Arrays.asList(new String[]{".e01"}); //NON-NLS - public static final String ENCASE_IMAGE_DESC = NbBundle.getMessage(GeneralFilter.class, - "GeneralFilter.encaseImageDesc.text"); + public static final List ENCASE_IMAGE_EXTS = Arrays.asList(".e01"); //NON-NLS + @NbBundle.Messages("GeneralFilter.encaseImageDesc.text=Encase Images (*.e01)") + public static final String ENCASE_IMAGE_DESC = Bundle.GeneralFilter_encaseImageDesc_text(); - public static final List VIRTUAL_MACHINE_EXTS = Arrays.asList(new String[]{".vmdk", ".vhd"}); //NON-NLS - public static final String VIRTUAL_MACHINE_DESC = NbBundle.getMessage(GeneralFilter.class, - "GeneralFilter.virtualMachineImageDesc.text"); + public static final List VIRTUAL_MACHINE_EXTS = Arrays.asList(".vmdk", ".vhd"); //NON-NLS + @NbBundle.Messages("GeneralFilter.virtualMachineImageDesc.text=Virtual Machines (*.vmdk, *.vhd)") + public static final String VIRTUAL_MACHINE_DESC = Bundle.GeneralFilter_virtualMachineImageDesc_text(); - public static final List EXECUTABLE_EXTS = Arrays.asList(new String[]{".exe"}); //NON-NLS - public static final String EXECUTABLE_DESC = NbBundle.getMessage(GeneralFilter.class, "GeneralFilter.executableDesc.text"); + public static final List EXECUTABLE_EXTS = Arrays.asList(".exe"); //NON-NLS + @NbBundle.Messages("GeneralFilter.executableDesc.text=Executables (*.exe)") + public static final String EXECUTABLE_DESC = Bundle.GeneralFilter_executableDesc_text(); - public static final List GRAPHIC_IMAGE_EXTS = Arrays.asList(new String[]{".png", ".jpeg", ".jpg", ".gif", ".bmp"}); //NON-NLS - public static final String GRAPHIC_IMG_DECR = NbBundle.getMessage(GeneralFilter.class, "GeneralFilter.graphicImageDesc.text"); + public static final List GRAPHIC_IMAGE_EXTS = Arrays.asList(".png", ".jpeg", ".jpg", ".gif", ".bmp"); //NON-NLS + @NbBundle.Messages("GeneralFilter.graphicImageDesc.text=Images (*.png, *.jpg, *.jpeg, *.gif, *.bmp)") + public static final String GRAPHIC_IMG_DECR = Bundle.GeneralFilter_graphicImageDesc_text(); - private List extensions; - private String desc; + private final List extensions; + private final String desc; public GeneralFilter(List ext, String desc) { super(); @@ -69,15 +71,8 @@ public class GeneralFilter extends FileFilter { if (f.isDirectory()) { return true; } else { - Boolean result = false; String name = f.getName().toLowerCase(); - - for (String ext : extensions) { - if (name.endsWith(ext)) { - result = result || true; - } - } - return result; + return extensions.stream().anyMatch(name::endsWith); } } @@ -90,5 +85,4 @@ public class GeneralFilter extends FileFilter { public String getDescription() { return desc; } - } From 0afe9b19c20d2c62e70fea66e8ca65a2be6f2e9b Mon Sep 17 00:00:00 2001 From: millmanorama Date: Sun, 10 Sep 2017 10:50:53 +0200 Subject: [PATCH 102/104] ask user to use .000 file if it is detected when they have selected a .001 file. --- .../autopsy/casemodule/ImageFilePanel.java | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/ImageFilePanel.java b/Core/src/org/sleuthkit/autopsy/casemodule/ImageFilePanel.java index 0fe51144eb..bc647f780a 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/ImageFilePanel.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/ImageFilePanel.java @@ -25,6 +25,7 @@ import java.util.SimpleTimeZone; import java.util.TimeZone; import java.util.logging.Level; import javax.swing.JFileChooser; +import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; @@ -191,6 +192,9 @@ public class ImageFilePanel extends JPanel implements DocumentListener { ); }// //GEN-END:initComponents + @NbBundle.Messages({"ImageFilePanel.000.confirmationMessage=The selected file" + + " has extenson .001 but there is a .000 file in the sequence of raw images." + + "\nShould the .000 file be used as the start, instead of the selected .001 file?\n"}) private void browseButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_browseButtonActionPerformed String oldText = getContentPaths(); // set the current directory of the FileChooser if the ImagePath Field is valid @@ -200,7 +204,19 @@ public class ImageFilePanel extends JPanel implements DocumentListener { } if (fileChooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) { - setContentPath(fileChooser.getSelectedFile().getPath()); + String path = fileChooser.getSelectedFile().getPath(); + if (path.endsWith(".001")) { + String zeroX3_path = StringUtils.removeEnd(path, ".001") + ".000"; + if (new File(zeroX3_path).exists()) { + int showConfirmDialog = JOptionPane.showConfirmDialog(this, + Bundle.ImageFilePanel_000_confirmationMessage(), + "Choose .001 file?", JOptionPane.YES_NO_OPTION); + if (showConfirmDialog == JOptionPane.YES_OPTION) { + path = zeroX3_path; + } + } + } + setContentPath(path); } updateHelper(); @@ -267,7 +283,7 @@ public class ImageFilePanel extends JPanel implements DocumentListener { errorLabel.setVisible(true); errorLabel.setText(Bundle.DataSourceOnCDriveError_text()); } - + return new File(path).isFile() || DriveUtils.isPhysicalDrive(path) || DriveUtils.isPartition(path); From b4251bf98051d8a3ce0c549bc28820911c956ce0 Mon Sep 17 00:00:00 2001 From: Richard Cordovano Date: Mon, 11 Sep 2017 09:41:35 -0400 Subject: [PATCH 103/104] Update KeywordHit.java Clarify a comment --- .../src/org/sleuthkit/autopsy/keywordsearch/KeywordHit.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordHit.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordHit.java index 8a173b8919..e51c1c2620 100755 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordHit.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordHit.java @@ -88,7 +88,7 @@ class KeywordHit implements Comparable { hitOnArtifact = this.solrObjectId < 0; if (hitOnArtifact) { - // If the hit was in an artifact, look up the artifact. + // If the hit was in an artifact, look up the source content for the artifact. SleuthkitCase caseDb = Case.getCurrentCase().getSleuthkitCase(); try (SleuthkitCase.CaseDbQuery executeQuery = caseDb.executeQuery(GET_CONTENT_ID_FROM_ARTIFACT_ID + this.solrObjectId); From 1b6fce712f670a7cf72b696a5cdef066dfabc1c1 Mon Sep 17 00:00:00 2001 From: Jonathan Millman Date: Mon, 11 Sep 2017 15:44:21 +0200 Subject: [PATCH 104/104] Update KeywordSearchResultFactory.java --- .../autopsy/keywordsearch/KeywordSearchResultFactory.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchResultFactory.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchResultFactory.java index fb467cca00..ac7cfae557 100755 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchResultFactory.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchResultFactory.java @@ -140,7 +140,7 @@ class KeywordSearchResultFactory extends ChildFactory { queryResults = queryRequest.performQuery(); } catch (KeywordSearchModuleException | NoOpenCoreException ex) { logger.log(Level.SEVERE, "Could not perform the query " + queryRequest.getQueryString(), ex); //NON-NLS - MessageNotifyUtil.Notify.error(org.sleuthkit.autopsy.keywordsearch.Bundle.KeywordSearchResultFactory_query_exception_msg() + queryRequest.getQueryString(), ex.getCause().getMessage()); + MessageNotifyUtil.Notify.error(Bundle.KeywordSearchResultFactory_query_exception_msg() + queryRequest.getQueryString(), ex.getCause().getMessage()); return false; } SleuthkitCase tskCase = null;