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 index 6d1785133a..b2d14db118 --- 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/casemodule/Bundle.properties b/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties old mode 100644 new mode 100755 index cdf46e4d8c..85dd7443ae --- a/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties @@ -138,15 +138,8 @@ 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 -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 +190,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/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 index 340d847343..1becc449d5 --- a/Core/src/org/sleuthkit/autopsy/casemodule/Case.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/Case.java @@ -377,7 +377,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 +387,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 +428,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. @@ -1101,7 +1129,7 @@ public class Case { } /** - * Gets the immutable case name. + * Gets the unique and immutable case name. * * @return The case name. */ 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 index 2df3bfcc33..3ef30f2594 --- 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/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 index 7cd6a93b10..c50c561564 --- 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/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 index 6042c24d12..ab55b67c5b --- 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/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 index f848722953..7d06ae23c3 --- 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; } - } 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 index 4373959707..bc647f780a --- 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"); @@ -23,88 +23,92 @@ import java.util.Calendar; import java.util.List; 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; -import javax.swing.JPanel; 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.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; /** - * 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 { - 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); + + // Populate the drop down list of time zones + 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); - } + fileChooser.setDragEnabled(false); + fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY); + fileChooser.setMultiSelectionEnabled(false); + fileChooserFilters.forEach(fileChooser::addChoosableFileFilter); + if (fileChooserFilters.isEmpty() == false) { + fileChooser.setFileFilter(fileChooserFilters.get(0)); } - - this.contextName = context; - } /** * 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,35 @@ public class ImageFilePanel extends JPanel implements DocumentListener { .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); }// //GEN-END:initComponents - @SuppressWarnings("deprecation") + + @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 = 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()) { - fc.setCurrentDirectory(currentDir); + fileChooser.setCurrentDirectory(currentDir); } - int retval = fc.showOpenDialog(this); - if (retval == JFileChooser.APPROVE_OPTION) { - String path = fc.getSelectedFile().getPath(); - pathTextField.setText(path); + if (fileChooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) { + 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); } - 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 +244,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) { @@ -242,7 +253,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() { @@ -259,34 +270,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() { @@ -299,47 +299,39 @@ 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); } } /** - * Creates 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. + * + * @param zone The TimeZone to make a string for + * + * @return A string representation of a TimeZone for use in the drop down + * list. */ - 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 + static private String timeZoneToString(TimeZone zone) { + int offset = zone.getRawOffset() / 1000; + int hour = offset / 3600; + int minutes = (offset % 3600) / 60; + return String.format("(GMT%+d:%02d) %s", hour, minutes, zone.getID()); //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 + @Override + public void insertUpdate(DocumentEvent e) { + updateHelper(); + } - // set the selected timezone - timeZoneComboBox.setSelectedItem(formatted); + @Override + public void removeUpdate(DocumentEvent e) { + updateHelper(); + } + + @Override + public void changedUpdate(DocumentEvent e) { + updateHelper(); } /** @@ -347,43 +339,16 @@ 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) { - + @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(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.MessageType.ERROR); + } catch (Exception e) { + logger.log(Level.SEVERE, "ImageFilePanel listener threw exception", e); //NON-NLS + MessageNotifyUtil.Notify.error(ImageFilePanel_moduleErr(), ImageFilePanel_moduleErr_msg()); } } 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 index 3b99a41a0b..0ef78a860c --- 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 old mode 100644 new mode 100755 index 80f9c92b03..6bbdeac316 --- 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){ + this.eamCase = dbManager.newCase(Case.getCurrentCase()); + } initComponents(); loadData(); customizeComponents(); @@ -82,6 +85,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); } @@ -323,6 +329,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 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 index e6fa8730a7..475f6459d5 --- 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,32 @@ public abstract class AbstractSqlEamDb implements EamDb { } } + /** + * Creates new Case in the database from the given case + * + * @param case The case to add + */ + @Override + public EamCase newCase(Case autopsyCase) throws EamDbException{ + if(autopsyCase == null){ + throw new EamDbException("Case is null"); + } + + EamCase curCeCase = new EamCase( + -1, + autopsyCase.getName(), // unique case ID + EamOrganization.getDefault(), + autopsyCase.getDisplayName(), + autopsyCase.getCreatedDate(), + autopsyCase.getNumber(), + autopsyCase.getExaminer(), + null, + null, + null); + newCase(curCeCase); + return curCeCase; + } + /** * Updates an existing Case in the database * @@ -1524,9 +1551,11 @@ 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); + // FUTURE: have a separate global_files table for each Type. String sql = "INSERT INTO %s(reference_set_id, value, known_status, comment) VALUES (?, ?, ?, ?) " + getConflictClause(); @@ -1542,8 +1571,14 @@ public abstract class AbstractSqlEamDb implements EamDb { } bulkPs.executeBatch(); + conn.commit(); } catch (SQLException ex) { - throw new EamDbException("Error inserting bulk artifacts.", ex); // NON-NLS + 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); EamDbUtil.closeConnection(conn); 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 index d0264eab54..4d89314ffe --- 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 @@ -146,6 +147,13 @@ public interface EamDb { * @param eamCase The case to add */ void newCase(EamCase eamCase) throws EamDbException; + + /** + * Creates new Case in the database from the given case + * + * @param case The case to add + */ + EamCase newCase(Case autopsyCase) throws EamDbException; /** * Updates an existing Case in the database 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 index 468d12ccb9..208ded1998 --- 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/datamodel/PostgresEamDbSettings.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/PostgresEamDbSettings.java old mode 100644 new mode 100755 index 32ed226a5f..e35ba6b026 --- 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. @@ -305,7 +326,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 +368,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/SqliteEamDb.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/SqliteEamDb.java old mode 100644 new mode 100755 index 4c65eaba12..01d2083af4 --- 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 * @@ -955,4 +971,4 @@ public class SqliteEamDb extends AbstractSqlEamDb { rwLock.readLock().unlock(); } -} +} \ No newline at end of file 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 index 5c02d17ea0..bfff0dc778 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/SqliteEamDbSettings.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/SqliteEamDbSettings.java @@ -109,6 +109,20 @@ 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 } + + /** + * Verify that the db file exists. + * + * @return true if exists, else false + */ + public boolean dbFileExists() { + 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()); + } /** * Verify that the db directory path exists. @@ -148,6 +162,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 @@ -244,7 +267,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 +310,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)"; 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 index 2bacb9234f..7c4201012f --- 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; } } } 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 index 5f1ff75a24..641a294a4f --- 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<>(); 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 index 3eb5b1de37..3dd23ccfc6 --- 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"); @@ -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; @@ -155,16 +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; } - + EamDb dbManager; try { dbManager = EamDb.getInstance(); @@ -210,6 +205,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 +233,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) { 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 index 6ef345ac4f..f6abcf896d --- a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/EamDbSettingsDialog.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/EamDbSettingsDialog.java @@ -51,13 +51,15 @@ public class EamDbSettingsDialog extends JDialog { private final SqliteEamDbSettings dbSettingsSqlite; private DatabaseTestResult testingStatus; private EamDbPlatformEnum selectedPlatform; + private boolean configurationChanged = false; /** * Creates new form EamDbSettingsDialog */ @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 +77,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 +304,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(); @@ -318,26 +320,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; } @@ -361,6 +369,11 @@ public class EamDbSettingsDialog extends JDialog { && dbSettingsPostgres.insertDefaultDatabaseContent(); } if (!result) { + // Remove the incomplete database + if(dbCreated){ + dbSettingsPostgres.deleteDatabase(); + } + JOptionPane.showMessageDialog(WindowManager.getDefault().getMainWindow(), Bundle.EamDbSettingsDialog_okButton_createPostgresDbError_message(), Bundle.EamDbSettingsDialog_okButton_createDbError_title(), @@ -378,6 +391,10 @@ public class EamDbSettingsDialog extends JDialog { && dbSettingsSqlite.insertDefaultDatabaseContent(); } if (!result) { + if(dbCreated){ + dbSettingsSqlite.deleteDatabase(); + } + JOptionPane.showMessageDialog(WindowManager.getDefault().getMainWindow(), Bundle.EamDbSettingsDialog_okButton_createSQLiteDbError_message(), Bundle.EamDbSettingsDialog_okButton_createDbError_title(), @@ -390,10 +407,20 @@ 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.", "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 (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", @@ -406,7 +433,13 @@ 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(), @@ -459,6 +492,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 +507,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)); @@ -750,6 +785,7 @@ public class EamDbSettingsDialog extends JDialog { UNTESTED, CONNECTION_FAILED, SCHEMA_INVALID, + DB_DOES_NOT_EXIST, TESTEDOK; } 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 index c0be22bf90..7e231d7cd2 --- 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() { @@ -260,6 +263,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 @@ -314,7 +320,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 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 index 149074b9fa..2eccb89ec9 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ImportHashDatabaseDialog.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ImportHashDatabaseDialog.java @@ -72,7 +72,7 @@ final class ImportHashDatabaseDialog extends javax.swing.JDialog { private final JFileChooser fileChooser = new JFileChooser(); private final static String LAST_FILE_PATH_KEY = "CentralRepositoryImport_Path"; // NON-NLS - private final int HASH_IMPORT_THRESHOLD = 5000; + private final int HASH_IMPORT_THRESHOLD = 10000; private EamOrganization selectedOrg = null; private List orgs = null; private final Collection textBoxes; @@ -631,6 +631,7 @@ final class ImportHashDatabaseDialog extends javax.swing.JDialog { } int numLines = 0; + LOGGER.log(Level.INFO, "Importing hash database {0}", file.getName()); while ((line = reader.readLine()) != null) { progress.progress(++numLines); @@ -648,7 +649,7 @@ final class ImportHashDatabaseDialog extends javax.swing.JDialog { ""); globalInstances.add(eamGlobalFileInstance); - + if(numLines % HASH_IMPORT_THRESHOLD == 0){ dbManager.bulkInsertReferenceTypeEntries(globalInstances, contentType); globalInstances.clear(); @@ -656,6 +657,8 @@ final class ImportHashDatabaseDialog extends javax.swing.JDialog { } dbManager.bulkInsertReferenceTypeEntries(globalInstances, contentType); + LOGGER.log(Level.INFO, "Finished importing hash database. Total entries: {0}", numLines); + } } 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 index 36b6dc37e3..2664a32787 --- 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; @@ -58,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; /** @@ -148,6 +151,7 @@ public final class CoordinationService { * Create the top-level root and category nodes. */ String rootNode = rootNodeName; + if (!rootNode.startsWith("/")) { rootNode = "/" + rootNode; } @@ -355,6 +359,25 @@ public final class CoordinationService { } } + /** + * 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 list = curator.getChildren().forPath(categoryNodeToPath.get(category.getDisplayName())); + return list; + } catch (Exception ex) { + throw new CoordinationServiceException(String.format("Failed to get node list for %s", category.getDisplayName()), ex); + } + } + /** * Creates a node path within a given category. * 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 index a5ff7f3ecb..95cfcd481e --- 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/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/core/timelineWsmode.xml b/Core/src/org/sleuthkit/autopsy/core/timelineWsmode.xml new file mode 100644 index 0000000000..1135086770 --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/core/timelineWsmode.xml @@ -0,0 +1,10 @@ + + + + + + + + + + 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/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/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 index a1d85d50df..44982682e9 --- a/Core/src/org/sleuthkit/autopsy/datamodel/AbstractAbstractFileNode.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/AbstractAbstractFileNode.java @@ -21,8 +21,10 @@ 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 java.util.Map; +import java.util.Set; import java.util.logging.Level; import java.util.stream.Collectors; import org.apache.commons.lang3.StringUtils; @@ -53,6 +55,9 @@ public abstract class AbstractAbstractFileNode extends A @NbBundle.Messages("AbstractAbstractFileNode.addFileProperty.desc=no description") private static final String NO_DESCR = AbstractAbstractFileNode_addFileProperty_desc(); + 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 abstractFile file to wrap */ @@ -67,13 +72,14 @@ public abstract class AbstractAbstractFileNode extends A IngestManager.getInstance().addIngestModuleEventListener(pcl); } } - // 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) -> { @@ -95,7 +101,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/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 index 82a8130c23..ada48a2953 --- a/Core/src/org/sleuthkit/autopsy/datamodel/AbstractContentNode.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/AbstractContentNode.java @@ -18,14 +18,20 @@ */ package org.sleuthkit.autopsy.datamodel; +import java.sql.ResultSet; +import java.sql.SQLException; import java.util.List; 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.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; /** @@ -84,6 +90,47 @@ 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() { + 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 | SQLException ex) { + logger.log(Level.SEVERE, "Error checking if the node has children, for content: " + c, ex); //NON-NLS + } + } + return false; + } + /** * Return true if the underlying content object has children Useful for lazy * loading. @@ -103,7 +150,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/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 index 0e1c7cb8aa..33104bf47c --- a/Core/src/org/sleuthkit/autopsy/datamodel/BlackboardArtifactNode.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/BlackboardArtifactNode.java @@ -25,31 +25,29 @@ import java.beans.PropertyChangeListener; import java.text.MessageFormat; import java.util.ArrayList; import java.util.Arrays; -import java.util.Collection; +import java.util.EnumSet; 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; import java.util.stream.Collectors; import javax.swing.Action; -import org.openide.nodes.Children; -import org.openide.nodes.Node; 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; import org.sleuthkit.autopsy.casemodule.events.BlackBoardArtifactTagDeletedEvent; import org.sleuthkit.autopsy.casemodule.events.ContentTagAddedEvent; import org.sleuthkit.autopsy.casemodule.events.ContentTagDeletedEvent; -import static org.sleuthkit.autopsy.datamodel.DataModelActionsFactory.VIEW_IN_NEW_WINDOW; import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil; import static org.sleuthkit.autopsy.datamodel.DisplayableItemNode.findLinked; -import org.sleuthkit.autopsy.directorytree.NewWindowViewAction; import org.sleuthkit.autopsy.timeline.actions.ViewArtifactInTimelineAction; import org.sleuthkit.autopsy.timeline.actions.ViewFileInTimelineAction; import org.sleuthkit.datamodel.AbstractFile; @@ -68,6 +66,11 @@ import org.sleuthkit.datamodel.TskCoreException; public class BlackboardArtifactNode extends AbstractContentNode { 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.CURRENT_CASE); private static Cache contentCache = CacheBuilder.newBuilder() .expireAfterWrite(1, TimeUnit.MINUTES). @@ -76,7 +79,7 @@ public class BlackboardArtifactNode extends AbstractContentNode> customProperties; - + /* * Artifact types which should have the full unique path of the associated * content as a property. @@ -128,8 +131,9 @@ public class BlackboardArtifactNode extends AbstractContentNode map, BlackboardAttribute attribute ) { + private void addEmailMsgProperty(Map map, BlackboardAttribute attribute) { final int attributeTypeID = attribute.getAttributeType().getTypeID(); @@ -523,23 +522,19 @@ public class BlackboardArtifactNode extends AbstractContentNode 160) { value = value.substring(0, 160) + "..."; } map.put(attribute.getAttributeType().getDisplayName(), value); - } - else if (attribute.getAttributeType().getValueType() == BlackboardAttribute.TSK_BLACKBOARD_ATTRIBUTE_VALUE_TYPE.DATETIME) { + } else if (attribute.getAttributeType().getValueType() == BlackboardAttribute.TSK_BLACKBOARD_ATTRIBUTE_VALUE_TYPE.DATETIME) { map.put(attribute.getAttributeType().getDisplayName(), ContentUtils.getStringTime(attribute.getValueLong(), associated)); - } - else { + } else { map.put(attribute.getAttributeType().getDisplayName(), attribute.getDisplayString()); } @@ -586,6 +581,6 @@ public class BlackboardArtifactNode extends AbstractContentNode T accept(ContentNodeVisitor v) { - return v.visit(this); + return v.visit(this); } } 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 index 7ac9e37398..43ddd069a3 --- 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 old mode 100644 new mode 100755 index 0b6ced4f16..9b6f36a56b --- a/Core/src/org/sleuthkit/autopsy/datamodel/DeletedContent.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/DeletedContent.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 javax.swing.JOptionPane; import javax.swing.SwingUtilities; @@ -173,68 +175,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/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 index ad740a5011..7ffcfc077c --- 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/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 index 896cec5322..317cb42d10 --- a/Core/src/org/sleuthkit/autopsy/datamodel/ExtractedContent.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/ExtractedContent.java @@ -23,6 +23,7 @@ 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.logging.Level; @@ -251,14 +252,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 +310,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 old mode 100644 new mode 100755 index 54811f12c0..007c59ad41 --- 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; @@ -169,65 +171,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/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 index d8ef2a2f5e..305da8e953 --- 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 old mode 100644 new mode 100755 index e5bd41b6e8..9fe183a8a8 --- 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/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 index 2665894481..df3d239aef --- 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 old mode 100644 new mode 100755 index 682a3fa225..4efe1db364 --- 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/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 index d9fecdcdb2..7a0b6b9ad9 --- 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/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 index 343074ddc9..75873d135e --- 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/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/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/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/Tags.java b/Core/src/org/sleuthkit/autopsy/datamodel/Tags.java index b8127fe5a7..64b77ac245 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,12 @@ 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, + Case.Events.CURRENT_CASE); + private final PropertyChangeListener pcl = new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { @@ -171,7 +179,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 +188,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/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 index ba37cd4f09..ee5a5713a3 --- 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 old mode 100644 new mode 100755 index 6545ac0bef..e1ba5a2ca8 --- 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/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 index c85eedaa06..2e1735f3da --- 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(); 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 index 9fbd6425dc..4ca9e458c6 --- a/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeFilterChildren.java +++ b/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeFilterChildren.java @@ -26,6 +26,7 @@ import org.sleuthkit.autopsy.datamodel.DirectoryNode; import org.openide.nodes.FilterNode; import org.openide.nodes.Node; 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; @@ -42,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; @@ -120,7 +120,7 @@ class DirectoryTreeFilterChildren extends FilterNode.Children { && !((Directory) c).getName().equals(".."))) { ret = false; break; - } else if (c.hasChildren()) { + } else if(AbstractContentNode.contentHasVisibleContentChildren(c)){ //fie has children, such as derived files ret = false; break; @@ -204,12 +204,8 @@ class DirectoryTreeFilterChildren extends FilterNode.Children { if ((childContent instanceof AbstractFile) && ((AbstractFile) childContent).isDir()) { return false; } else { - try { - if (childContent.hasChildren()) { - 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; } } } @@ -244,7 +240,6 @@ class DirectoryTreeFilterChildren extends FilterNode.Children { @Override public Boolean visit(VirtualDirectoryNode vdn) { return visitDeep(vdn); - //return ! vdn.hasContentChildren(); } @Override @@ -286,7 +281,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..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; @@ -36,6 +35,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 +120,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 +134,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--; + } } } } 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 index bfb98e5220..03c265daee --- 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/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 index c5fd4d48e4..68cfc25429 --- 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/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 index f7ae47cc73..205db56998 --- 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/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 index 603d9d1623..fb66a4b6d7 --- 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/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 index 23730c99c1..d7efb0b46f --- 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/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/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..bb410a2aaa --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/filesearch/HashSearchPanel.form @@ -0,0 +1,101 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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..22b8f74314 --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/filesearch/HashSearchPanel.java @@ -0,0 +1,175 @@ +/* + * 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)); + + 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); + } +} 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 index 99f8e09fd8..e61f8d61f7 --- 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/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 index 20b791c64d..432cb48810 --- 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/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 index 771380c415..f6580a3cbc --- 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/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 index d7471df562..268f828fc7 --- 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/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 index 75c8f7c205..49f37008be --- 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/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 index 5b74bea711..4582159030 --- 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 old mode 100644 new mode 100755 index 17f945778a..c631cee729 --- 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/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 index 2c5a6472ee..3c8062355b --- 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/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 index 4fb092f0c5..ad6961006e --- 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"); @@ -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; @@ -47,8 +47,8 @@ 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 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; @@ -73,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()); @@ -199,8 +200,6 @@ public final class TimeLineTopComponent extends TopComponent implements Explorer 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 getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(AddBookmarkTagAction.BOOKMARK_SHORTCUT, "addBookmarkTag"); //NON-NLS getActionMap().put("addBookmarkTag", new AddBookmarkTagAction()); //NON-NLS @@ -291,7 +290,13 @@ public final class TimeLineTopComponent extends TopComponent implements Explorer @Override public List availableModes(List modes) { - return Collections.emptyList(); + /* + * 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()); } /** @@ -377,8 +382,8 @@ public final class TimeLineTopComponent extends TopComponent implements Explorer @Override public void componentOpened() { + super.componentOpened(); WindowManager.getDefault().setTopComponentFloating(this, true); - putClientProperty(PROP_UNDOCKING_DISABLED, true); } @Override 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 index 8043007b52..bfd9112f9e --- 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/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 index 62c4d535e6..13a62b62ee --- 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 old mode 100644 new mode 100755 index 23a41edaf1..6fcef46ccd --- 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 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 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 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/AutoIngestControlPanel.form b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestControlPanel.form index f7fc33d78e..ad525e92ee 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestControlPanel.form +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestControlPanel.form @@ -472,4 +472,4 @@
- \ No newline at end of file + diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestControlPanel.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestControlPanel.java index d48cd31c7f..72a81b2835 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestControlPanel.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestControlPanel.java @@ -53,13 +53,9 @@ 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.util.NbBundle.Messages; 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; @@ -74,6 +70,66 @@ 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.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", + "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", + "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.bnResume.text=Resume", + "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", + "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 { private static final long serialVersionUID = 1L; @@ -119,20 +175,34 @@ 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.StageTime=Time in 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,11 +252,12 @@ 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); + WindowManager.getDefault().getMainWindow().setEnabled(false); manager = AutoIngestManager.getInstance(); - + pendingTableModel = new DefaultTableModel(JobsTableModelColumns.headers, 0) { private static final long serialVersionUID = 1L; @@ -231,6 +302,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 +331,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 +348,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 +631,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")); } /** @@ -588,6 +665,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() { /* @@ -598,12 +680,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); @@ -632,19 +714,25 @@ public final class AutoIngestControlPanel extends JPanel implements Observer { 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")); + //bnPause.setEnabled(true); + 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")); } /** * 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 @@ -655,13 +743,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 +763,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,8 +804,7 @@ public final class AutoIngestControlPanel extends JPanel implements Observer { /** * @inheritDoc */ - @NbBundle.Messages({ - "AutoIngestControlPanel.bnPause.paused=Paused", + @Messages({ "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.", @@ -725,10 +812,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) { @@ -799,8 +882,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 +908,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); /** @@ -1061,29 +1144,30 @@ public final class AutoIngestControlPanel extends JPanel implements Observer { tableModel.setRowCount(0); for (AutoIngestJob job : jobs) { AutoIngestJob.StageDetails status = job.getStageDetails(); + AutoIngestJobNodeData 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); } } - + /** * 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); @@ -1448,6 +1532,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; @@ -1480,12 +1567,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,7 +1626,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)); @@ -1551,7 +1638,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(); @@ -1633,6 +1720,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(); @@ -1643,8 +1734,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."); @@ -1728,4 +1819,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 old mode 100644 new mode 100755 index 4ae066784f..502fab6f16 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.form +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.form @@ -16,53 +16,13 @@ - + - + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -70,9 +30,16 @@ + + + + + + + @@ -81,10 +48,6 @@ - - - - @@ -92,61 +55,20 @@ - - - - - - - - - - - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + @@ -226,26 +148,6 @@ - - - - - - - - - - - - - - - - - - - - @@ -276,123 +178,18 @@ - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + @@ -418,19 +215,19 @@ - + - + - - - - - - + + + + + + - \ 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 old mode 100644 new mode 100755 index 653aedf252..79c9b4d533 --- 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"); @@ -18,27 +18,20 @@ */ 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; 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.util.Collections; -import java.util.logging.Logger; -import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JTable; import javax.swing.SwingWorker; @@ -46,17 +39,15 @@ 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.NbBundle; -import org.openide.windows.WindowManager; +import org.openide.util.NbBundle.Messages; import org.sleuthkit.autopsy.core.ServicesMonitor; -import org.sleuthkit.autopsy.coreutils.NetworkUtils; -import org.sleuthkit.autopsy.ingest.IngestManager; +import org.sleuthkit.autopsy.coreutils.Logger; +import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil; +import org.sleuthkit.autopsy.experimental.autoingest.AutoIngestMonitor.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. + * A dashboard for monitoring an automated ingest cluster. */ public final class AutoIngestDashboard extends JPanel implements Observer { @@ -82,87 +73,34 @@ 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 String LOCAL_HOST_NAME = NetworkUtils.getLocalHostName(); - private static final Logger SYS_LOGGER = AutoIngestSystemLogger.getLogger(); - private static AutoIngestDashboard instance; + private static final Logger logger = Logger.getLogger(AutoIngestDashboard.class.getName()); private final DefaultTableModel pendingTableModel; private final DefaultTableModel runningTableModel; private final DefaultTableModel completedTableModel; - 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()}; - } + private AutoIngestMonitor autoIngestMonitor; + // DLG: The Viking code needs to be updated, too. See VikingStartupWindow, + // which should be using the AutoIngestControlPanel, not the AutoIngestDashboard. /** - * Gets the singleton automated ingest control and monitoring panel for this - * cluster node. + * Creates a dashboard for monitoring an automated ingest cluster. * - * @return The panel. + * @return The dashboard. + * + * @throws AutoIngestDashboardException If there is a problem creating the + * dashboard. */ - 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 manager - * 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() { pendingTableModel = new DefaultTableModel(JobsTableModelColumns.headers, 0) { @@ -192,12 +130,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. @@ -211,7 +148,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(); @@ -242,7 +178,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; } @@ -264,8 +200,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() { /* @@ -278,7 +214,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())); @@ -293,8 +228,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); @@ -317,29 +251,21 @@ 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(); - enablePendingTableButtons((row >= 0) && (row < pendingTable.getRowCount())); + this.prioritizeButton.setEnabled(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. + * Sets up the JTable that presents a view of the running jobs list for an + * auto ingest cluster. */ private void initRunningJobsTable() { /* @@ -351,7 +277,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())); /* @@ -409,33 +334,11 @@ 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); } /** - * 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() { /* @@ -445,7 +348,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())); @@ -505,479 +407,51 @@ 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(); - 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(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. + * auto ingest job tables. */ - private void startUp() { - - autoIngestStarted = true; - - /* - * Subscribe to services monitor events. - */ + private void startUp() throws AutoIngestMonitor.AutoIngestMonitorException { + setServicesStatusMessage(); ServicesMonitor.getInstance().addSubscriber((PropertyChangeEvent evt) -> { setServicesStatusMessage(); }); - - /* - * 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()); - - //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")); + autoIngestMonitor = new AutoIngestMonitor(); + autoIngestMonitor.addObserver(this); + autoIngestMonitor.startUp(); } - /** - * 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(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 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(AutoIngestDashboard.class, "AutoIngestDashboard.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(AutoIngestDashboard.class, "AutoIngestDashboard.PauseDueToSystemError")); - bnOptions.setEnabled(true); - 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; - case JOB_STATUS_UPDATED: - updateExecutor.submit(new UpdateRunningJobsTablesTask()); - break; - default: - break; - } - } + public void update(Observable observable, Object argument) { + JobsSnapshot jobsSnapshot = (JobsSnapshot) argument; + EventQueue.invokeLater(new RefreshComponentsTask(jobsSnapshot)); } /** - * 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. + * 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 manager - * (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 manager 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: 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); } /** - * 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(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 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<>(); - 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<>(); - 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<>(); - // 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 + * 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. @@ -985,37 +459,195 @@ 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) { + // Ignore version '1' nodes since they don't carry enough + // data to populate the table. + continue; + } AutoIngestJob.StageDetails status = job.getStageDetails(); + AutoIngestJobNodeData 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 } + 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(){ + 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(); + } + + /* + * 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 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")), + 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; + } + + /* + * 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(), + 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 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 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 jobsSnapshot The jobs snapshot. + */ + RefreshComponentsTask(JobsSnapshot jobsSnapshot) { + this.jobsSnapshot = jobsSnapshot; + } + + @Override + public void run() { + refreshTables(jobsSnapshot); + } + } + + /** + * 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); + } + } /** @@ -1033,26 +665,13 @@ 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(); + refreshButton = new javax.swing.JButton(); lbServicesStatus = new javax.swing.JLabel(); tbServicesStatusMessage = new javax.swing.JTextField(); - bnOpenLogDir = new javax.swing.JButton(); - bnReprocessJob = new javax.swing.JButton(); + prioritizeButton = new javax.swing.JButton(); pendingTable.setModel(pendingTableModel); pendingTable.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.pendingTable.toolTipText")); // NOI18N @@ -1108,12 +727,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 @@ -1123,42 +736,13 @@ 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 - - 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 - - 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 - - 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 - - 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 + 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.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + refreshButtonActionPerformed(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 @@ -1168,155 +752,118 @@ 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 + 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( 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(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.TRAILING) + .addComponent(pendingScrollPane) + .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup() .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(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))) - .addGap(0, 0, Short.MAX_VALUE))) + .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(runningScrollPane, javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(completedScrollPane, javax.swing.GroupLayout.Alignment.LEADING)) .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) + .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)) .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) + .addGap(1, 1, 1) + .addComponent(pendingScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 215, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .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))))) + .addGap(1, 1, 1) + .addComponent(runningScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 133, javax.swing.GroupLayout.PREFERRED_SIZE) + .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) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(refreshButton) + .addComponent(prioritizeButton)) .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 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 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 + + @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)); + 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: 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()); + } + }//GEN-LAST:event_prioritizeButtonActionPerformed + // 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.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 +} diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardTopComponent.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardTopComponent.java index cfb2e7e18f..24369b9da2 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,23 +18,19 @@ */ package org.sleuthkit.autopsy.experimental.autoingest; +import java.util.List; 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 java.util.stream.Collectors; 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; +import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil; /** * 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", @@ -43,15 +39,21 @@ 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 { + + 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 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; @@ -61,23 +63,31 @@ 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(992, 744); + if (tc.isOpened() == false) { + tc.open(); + } + tc.toFront(); + tc.requestActive(); + } catch (AutoIngestDashboard.AutoIngestDashboardException ex) { + logger.log(Level.SEVERE, "Unable to create auto ingest dashboard", ex); + MessageNotifyUtil.Message.error(Bundle.AutoIngestDashboardTopComponent_exceptionMessage_failedToCreateDashboard()); + } } } 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 + logger.log(Level.SEVERE, "Failed to close " + PREFERRED_ID, e); // NON-NLS } } } @@ -86,7 +96,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); } /** @@ -111,25 +137,4 @@ 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/AutoIngestJob.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestJob.java old mode 100644 new mode 100755 index 8372205fc6..1bd4194ebd --- 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 AutoIngestJobNodeData nodeData; private final String nodeName; @GuardedBy("this") - private String caseDirectoryPath; - @GuardedBy("this") - private Integer priority; + private String caseDirectoryPath; // DLG: Replace with AutoIngestJobNodeData.caseDirectoryPath @GuardedBy("this") private Stage stage; @GuardedBy("this") @@ -56,54 +54,51 @@ 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. * - * @param manifest The manifest + * Note: Manifest objects will be phased out and no longer be part of the + * AutoIngestJob class. + * + * @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; + /* + * 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(AutoIngestJobNodeData 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; + AutoIngestJobNodeData getNodeData() { + return this.nodeData; } /** @@ -140,32 +135,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 +158,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 +171,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 +205,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 +216,8 @@ public final class AutoIngestJob implements Comparable, Serializa } } - synchronized boolean isCancelled() { - return cancelled; + synchronized boolean isCanceled() { + return canceled; } synchronized void setCompleted() { @@ -254,44 +229,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 +241,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,9 +256,19 @@ 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); } + // 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) @@ -337,7 +288,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 +310,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 +330,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/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/AutoIngestJobNodeData.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestJobNodeData.java new file mode 100755 index 0000000000..25ea226a7f --- /dev/null +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestJobNodeData.java @@ -0,0 +1,505 @@ +/* + * 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.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. + */ +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 = 131493; + 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; + + /* + * Version 1 fields. + */ + 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 + /* + * 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 + * service. + * + * @param nodeData The raw bytes received from the coordination service. + */ + AutoIngestJobNodeData(byte[] nodeData) throws AutoIngestJobNodeDataException { + ByteBuffer buffer = ByteBuffer.wrap(nodeData); + this.coordSvcNodeDataWasSet = buffer.hasRemaining(); + if (this.coordSvcNodeDataWasSet) { + int rawStatus = buffer.getInt(); + if (ProcessingStatus.PENDING.ordinal() == rawStatus) { + this.status = ProcessingStatus.PENDING; + } else if (ProcessingStatus.PROCESSING.ordinal() == rawStatus) { + this.status = ProcessingStatus.PROCESSING; + } else if (ProcessingStatus.COMPLETED.ordinal() == rawStatus) { + this.status = ProcessingStatus.COMPLETED; + } else if (ProcessingStatus.DELETED.ordinal() == rawStatus) { + this.status = ProcessingStatus.DELETED; + } + this.priority = buffer.getInt(); + this.numberOfCrashes = buffer.getInt(); + this.completedDate = buffer.getLong(); + int errorFlag = buffer.getInt(); + this.errorsOccurred = (1 == errorFlag); + } else { + this.status = ProcessingStatus.PENDING; + this.priority = DEFAULT_PRIORITY; + this.numberOfCrashes = 0; + this.completedDate = 0L; + this.errorsOccurred = false; + } + + if (buffer.hasRemaining()) { + /* + * 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 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 = 0; + this.deviceId = ""; + this.caseName = ""; + this.caseDirectoryPath = ""; + this.manifestFileDate = 0L; + this.manifestFilePath = ""; + this.dataSourcePath = ""; + this.processingStage = ""; + this.processingStageStartDate = 0L; + this.processingHost = ""; + } + } + + /** + * 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. + */ + AutoIngestJobNodeData(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(); + } + + /** + * Indicates whether or not the coordination service node data was set, + * i.e., this object was constructed from raw bytes from the ccordination + * service node for the manifest. + * + * @return True or false. + */ + boolean coordSvcNodeDataWasSet() { + return this.coordSvcNodeDataWasSet; + } + + /** + * Gets the processing status of the manifest + * + * @return The processing status of the manifest. + */ + ProcessingStatus getStatus() { + return this.status; + } + + /** + * Sets the processing status of the manifest + * + * @param status The processing status of the manifest. + */ + void setStatus(ProcessingStatus status) { + this.status = status; + } + + /** + * Gets the priority of the manifest. + * + * @return The priority of the manifest. + */ + int getPriority() { + return this.priority; + } + + /** + * Sets the priority of the manifest. A higher number indicates a higheer + * priority. + * + * @param priority The priority of the manifest. + */ + void setPriority(int priority) { + this.priority = priority; + } + + /** + * Gets the number of times auto ingest jobs for the manifest have crashed + * during processing. + * + * @return The number of times auto ingest jobs for the manifest have + * crashed during processing. + */ + int getNumberOfCrashes() { + return this.numberOfCrashes; + } + + /** + * Sets the number of times auto ingest jobs for the manifest have crashed + * during processing. + * + * @param numberOfCrashes The number of times auto ingest jobs for the + * manifest have crashed during processing. + */ + void setNumberOfCrashes(int numberOfCrashes) { + this.numberOfCrashes = numberOfCrashes; + } + + /** + * Gets the date the auto ingest job for the manifest was completed. + * + * @return The date the auto ingest job for the manifest was completed. The + * epoch (January 1, 1970, 00:00:00 GMT) indicates the date is not + * set, i.e., Date.getTime() returns 0L. + */ + Date getCompletedDate() { + return new Date(this.completedDate); + } + + /** + * Sets the date the auto ingest job for the manifest was completed. + * + * @param completedDate The date the auto ingest job for the manifest was + * completed. Use the epoch (January 1, 1970, 00:00:00 + * GMT) to indicate the date is not set, i.e., new + * Date(0L). + */ + void setCompletedDate(Date completedDate) { + this.completedDate = completedDate.getTime(); + } + + /** + * Queries whether or not any errors occurred during the processing of the + * auto ingest job for the manifest. + * + * @return True or false. + */ + boolean getErrorsOccurred() { + return this.errorsOccurred; + } + + /** + * Sets whether or not any errors occurred during the processing of the auto + * ingest job for the manifest. + * + * @param errorsOccurred True or false. + */ + 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 + * service. + * + * @return The manifest node data as a byte array. + */ + 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) { + // Write version + buffer.putInt(this.version); + + // 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 + 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()); + } + + /** + * Processing status for the auto ingest job for the manifest. + */ + enum ProcessingStatus { + PENDING, + PROCESSING, + COMPLETED, + DELETED + } + +} diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestJobNodeDataException.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestJobNodeDataException.java new file mode 100755 index 0000000000..6618062e50 --- /dev/null +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestJobNodeDataException.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 AutoIngestJobNodeDataException extends Exception { + + /** + * Constructs an exception thrown when a manifest node contains incompatible + * data. + * + * @param message An error message. + */ + public AutoIngestJobNodeDataException(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 AutoIngestJobNodeDataException(String message, Throwable cause) { + super(message, cause); + } +} 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/AutoIngestManager.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestManager.java old mode 100644 new mode 100755 index afae397553..0281446fba --- 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; @@ -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)); + AutoIngestJobNodeData nodeData = new AutoIngestJobNodeData(coordinationService.getNodeData(CoordinationService.CategoryNode.MANIFESTS, manifestNodePath)); nodeData.setPriority(maxPriority); coordinationService.setNodeData(CoordinationService.CategoryNode.MANIFESTS, manifestNodePath, nodeData.toArray()); + } 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); } 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)); + AutoIngestJobNodeData nodeData = new AutoIngestJobNodeData(coordinationService.getNodeData(CoordinationService.CategoryNode.MANIFESTS, manifestNodePath)); nodeData.setPriority(maxPriority); coordinationService.setNodeData(CoordinationService.CategoryNode.MANIFESTS, manifestNodePath, nodeData.toArray()); + } 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); } 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); + AutoIngestJobNodeData 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); @@ -724,9 +733,11 @@ 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 (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); 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 { + AutoIngestJobNodeData nodeData = new AutoIngestJobNodeData(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(AutoIngestJobNodeDataException 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(AutoIngestJobNodeData 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); + 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(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(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); + 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(AutoIngestJobNodeData 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 (AutoIngestJobNodeDataException 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 { + 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 + * 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 (AutoIngestJobNodeDataException 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, AutoIngestJobNodeDataException { + Path manifestPath = currentJob.getNodeData().getManifestFilePath(); + AutoIngestJobNodeData nodeData = new AutoIngestJobNodeData(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 AutoIngestJobNodeData(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); + AutoIngestJobNodeData 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()}); + 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); /* * 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(); + 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); 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(); + 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); 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(); + AutoIngestJobNodeData 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(); + 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); 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(); + AutoIngestJobNodeData 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"; } @@ -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); @@ -2685,7 +2683,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 new file mode 100755 index 0000000000..9b5a0df78d --- /dev/null +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMonitor.java @@ -0,0 +1,476 @@ +/* + * 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.experimental.autoingest; + +import com.google.common.util.concurrent.ThreadFactoryBuilder; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Observable; +import java.util.Set; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.TimeUnit; +import java.util.logging.Level; +import javax.annotation.concurrent.GuardedBy; +import org.sleuthkit.autopsy.coordinationservice.CoordinationService; +import org.sleuthkit.autopsy.coordinationservice.CoordinationService.CoordinationServiceException; +import org.sleuthkit.autopsy.coreutils.Logger; +import org.sleuthkit.autopsy.coreutils.NetworkUtils; +import org.sleuthkit.autopsy.events.AutopsyEventException; +import org.sleuthkit.autopsy.events.AutopsyEventPublisher; + +/** + * 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 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"; //NON-NLS + private static final Set EVENT_LIST = new HashSet<>(Arrays.asList(new String[]{ + 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; + private final Object jobsLock; + @GuardedBy("jobsLock") + private JobsSnapshot jobsSnapshot; + + /** + * Constructs an auto ingest monitor responsible for monitoring and + * reporting the processing of auto ingest jobs. + */ + 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(); + } + + /** + * Starts up the auto ingest monitor. + * + * @throws AutoIngestMonitorException If there is a problem starting the + * auto ingest monitor. + */ + void startUp() throws AutoIngestMonitor.AutoIngestMonitorException { + try { + coordinationService = CoordinationService.getInstance(); + } catch (CoordinationServiceException ex) { + throw new AutoIngestMonitorException("Failed to get coordination service", ex); //NON-NLS + } + try { + eventPublisher.openRemoteEventChannel(EVENT_CHANNEL_NAME); + } catch (AutopsyEventException ex) { + throw new AutoIngestMonitorException("Failed to open auto ingest event channel", ex); //NON-NLS + } + coordSvcQueryExecutor.scheduleAtFixedRate(new CoordinationServiceQueryTask(), 0, CORRD_SVC_QUERY_INERVAL_MINS, TimeUnit.MINUTES); + eventPublisher.addSubscriber(EVENT_LIST, this); + } + + /** + * Shuts down the auto ingest ingest monitor. + */ + 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 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 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); + } + } + + /** + * Handles an auto ingest job started event. + * + * @param event A auto ingest job started event. + */ + private void handleJobStartedEvent(AutoIngestJobStartedEvent event) { + synchronized (jobsLock) { + // DLG: Remove job from pending queue, if present + // DLG: Add job to running jobs list + setChanged(); + notifyObservers(jobsSnapshot); + } + } + + /** + * Handles an auto ingest job status event. + * + * @param event A auto ingest job status event. + */ + private void handleJobStatusEvent(AutoIngestJobStatusEvent event) { + synchronized (jobsLock) { + // DLG: Replace job in running list with job from event + setChanged(); + notifyObservers(jobsSnapshot); + } + } + + /** + * Handles an auto ingest job completed event. + * + * @param event A auto ingest job completed event. + */ + private void handleJobCompletedEvent(AutoIngestJobCompletedEvent event) { + synchronized (jobsLock) { + // DLG: Remove job from event from running list, if present + // DLG: Add job to completed list + setChanged(); + notifyObservers(jobsSnapshot); + } + } + + /** + * Handles an auto ingest job/case prioritization event. + * + * @param event A job/case prioritization event. + */ + private void handleCasePrioritizationEvent(AutoIngestCasePrioritizedEvent event) { + synchronized (jobsLock) { + // DLG: Replace job in pending queue with job from event + setChanged(); + notifyObservers(jobsSnapshot); + } + } + + /** + * Handles a case deletion event. + * + * @param event A job/case prioritization event. + */ + private void handleCaseDeletedEvent(AutoIngestCaseDeletedEvent event) { + coordSvcQueryExecutor.submit(new CoordinationServiceQueryTask()); + } + + /** + * 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. + * + * @return The snapshot. + */ + JobsSnapshot getJobsSnapshot() { + synchronized (jobsLock) { + return jobsSnapshot; + } + } + + /** + * 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. + */ + JobsSnapshot refreshJobsSnapshot() { + JobsSnapshot newJobsSnapshot = queryCoordinationService(); + synchronized (jobsLock) { + jobsSnapshot = newJobsSnapshot; + return jobsSnapshot; + } + } + + /** + * 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() { + try { + 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 AutoIngestJobNodeData => AutoIngestJobData) + // 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); + return new JobsSnapshot(); + } + } + + /** + * Bumps the priority of an auto ingest job. + * + * @param manifestPath The manifest file path for the job to be prioritized. + */ + JobsSnapshot prioritizeJob(Path manifestFilePath) throws AutoIngestMonitorException { + int highestPriority = 0; + AutoIngestJob prioritizedJob = null; + synchronized (jobsLock) { + /* + * 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(manifestFilePath)) { + prioritizedJob = job; + } + } + + /* + * If the job was still in the pending jobs queue, bump its + * priority. + */ + if (null != prioritizedJob) { + ++highestPriority; + String manifestNodePath = prioritizedJob.getNodeData().getManifestFilePath().toString(); + try { + AutoIngestJobNodeData nodeData = new AutoIngestJobNodeData(coordinationService.getNodeData(CoordinationService.CategoryNode.MANIFESTS, manifestNodePath)); + nodeData.setPriority(highestPriority); + coordinationService.setNodeData(CoordinationService.CategoryNode.MANIFESTS, manifestNodePath, nodeData.toArray()); + } catch (AutoIngestJobNodeDataException | CoordinationServiceException | InterruptedException ex) { + throw new AutoIngestMonitorException("Error bumping priority for job " + prioritizedJob.toString(), ex); + } + 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(); + } + + return jobsSnapshot; + } + } + + /** + * 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. + */ + private final class CoordinationServiceQueryTask implements Runnable { + + /** + * 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() { + if (!Thread.currentThread().isInterrupted()) { + JobsSnapshot newJobsSnapshot = queryCoordinationService(); + synchronized (jobsLock) { + jobsSnapshot = newJobsSnapshot; + setChanged(); + notifyObservers(jobsSnapshot); + } + } + } + + } + + /** + * A snapshot of the pending jobs queue, running jobs list, and completed + * jobs list for an auto ingest cluster. + */ + static final class JobsSnapshot { + + private final Set pendingJobs = new HashSet<>(); + private final Set runningJobs = new HashSet<>(); + private final Set completedJobs = new HashSet<>(); + + /** + * Gets the snapshot of the pending jobs queue for an auto ingest + * cluster. + * + * @return The pending jobs queue. + */ + List getPendingJobs() { + return new ArrayList<>(this.pendingJobs); + } + + /** + * Gets the snapshot of the running jobs list for an auto ingest + * cluster. + * + * @return The running jobs list. + */ + List getRunningJobs() { + return new ArrayList<>(this.runningJobs); + } + + /** + * Gets the snapshot of the completed jobs list for an auto ingest + * cluster. + * + * @return The completed jobs list. + */ + List getCompletedJobs() { + 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); + } + + } + + /** + * 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; + + /** + * 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); + } + + /** + * 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); + } + + } +} 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 index 08b3016eb5..184d5d350a --- 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(); 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 index f25182b018..4a5a3c86c5 --- 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 old mode 100644 new mode 100755 index 28b5796c3f..31fa2c11f0 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties @@ -1,11 +1,7 @@ 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,20 +11,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 @@ -163,20 +151,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 +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 @@ -223,8 +202,7 @@ ReviewModeCasePanel.OutputFolderHeaderText=Output Folder ReviewModeCasePanel.LastAccessedTimeHeaderText=Last Accessed Time CopyFilesPanel.bnOptions.text=&Options AutoIngestDashboard.lbServicesStatus.text=Services Status: -AutoIngestDashboard.tbServicesStatusMessage.text= -AutoIngestDashboard.tbStatusMessage.text= +AutoIngestDashboard.tbServicesStatusMessage.text=Connecting... FileExporterSettingsPanel.ChooseRootDirectory=Choose a root directory for file output FileExporterSettingsPanel.ChooseReportDirectory=Choose a report directory FileExporterSettingsPanel.RuleName=Rule Name @@ -283,12 +261,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,38 +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 -AutoIngestControlPanel.lbStatus.text=Status: \ No newline at end of file +AutoIngestDashboard.prioritizeButton.toolTipText=Prioritizes the selected job +AutoIngestDashboard.prioritizeButton.text=&Prioritize +AutoIngestDashboard.refreshButton.toolTipText=Refresh displayed tables +AutoIngestDashboard.refreshButton.text=&Refresh 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 deleted file mode 100644 index 498ac38cee..0000000000 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/ManifestNodeData.java +++ /dev/null @@ -1,234 +0,0 @@ -/* - * Autopsy Forensic Browser - * - * Copyright 2015 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.nio.ByteBuffer; -import java.util.Date; - -/** - * 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. - */ -final class ManifestNodeData { - - 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; - - /** - * Constructs a coordination service node data data transfer object for an - * auto ingest manifest from the raw bytes obtained from the coordination - * service. - * - * @param nodeData The raw bytes received from the coordination service. - */ - ManifestNodeData(byte[] nodeData) { - ByteBuffer buffer = ByteBuffer.wrap(nodeData); - this.coordSvcNodeDataWasSet = buffer.hasRemaining(); - if (this.coordSvcNodeDataWasSet) { - int rawStatus = buffer.getInt(); - if (ProcessingStatus.PENDING.ordinal() == rawStatus) { - this.status = ProcessingStatus.PENDING; - } else if (ProcessingStatus.PROCESSING.ordinal() == rawStatus) { - this.status = ProcessingStatus.PROCESSING; - } else if (ProcessingStatus.COMPLETED.ordinal() == rawStatus) { - this.status = ProcessingStatus.COMPLETED; - }else if (ProcessingStatus.DELETED.ordinal() == rawStatus) { - this.status = ProcessingStatus.DELETED; - } - this.priority = buffer.getInt(); - this.numberOfCrashes = buffer.getInt(); - this.completedDate = buffer.getLong(); - int errorFlag = buffer.getInt(); - this.errorsOccurred = (1 == errorFlag); - } else { - this.status = ProcessingStatus.PENDING; - this.priority = DEFAULT_PRIORITY; - this.numberOfCrashes = 0; - this.completedDate = 0L; - this.errorsOccurred = false; - } - } - - /** - * Constructs a coordination service node data data transfer object for an - * auto ingest manifest from values provided by the auto ingest system. - * - * @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. - */ - ManifestNodeData(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; - } - - /** - * Indicates whether or not the coordination service node data was set, - * i.e., this object was constructed from raw bytes from the ccordination - * service node for the manifest. - * - * @return True or false. - */ - boolean coordSvcNodeDataWasSet() { - return this.coordSvcNodeDataWasSet; - } - - /** - * Gets the processing status of the manifest - * - * @return The processing status of the manifest. - */ - ProcessingStatus getStatus() { - return this.status; - } - - /** - * Sets the processing status of the manifest - * - * @param status The processing status of the manifest. - */ - void setStatus(ProcessingStatus status) { - this.status = status; - } - - /** - * Gets the priority of the manifest. - * - * @return The priority of the manifest. - */ - int getPriority() { - return this.priority; - } - - /** - * Sets the priority of the manifest. A higher number indicates a higheer - * priority. - * - * @param priority The priority of the manifest. - */ - void setPriority(int priority) { - this.priority = priority; - } - - /** - * Gets the number of times auto ingest jobs for the manifest have crashed - * during processing. - * - * @return The number of times auto ingest jobs for the manifest have - * crashed during processing. - */ - int getNumberOfCrashes() { - return this.numberOfCrashes; - } - - /** - * Sets the number of times auto ingest jobs for the manifest have crashed - * during processing. - * - * @param numberOfCrashes The number of times auto ingest jobs for the - * manifest have crashed during processing. - */ - void setNumberOfCrashes(int numberOfCrashes) { - this.numberOfCrashes = numberOfCrashes; - } - - /** - * Gets the date the auto ingest job for the manifest was completed. - * - * @return The date the auto ingest job for the manifest was completed. The - * epoch (January 1, 1970, 00:00:00 GMT) indicates the date is not - * set, i.e., Date.getTime() returns 0L. - */ - Date getCompletedDate() { - return new Date(this.completedDate); - } - - /** - * Sets the date the auto ingest job for the manifest was completed. - * - * @param completedDate The date the auto ingest job for the manifest was - * completed. Use the epoch (January 1, 1970, 00:00:00 - * GMT) to indicate the date is not set, i.e., new - * Date(0L). - */ - void setCompletedDate(Date completedDate) { - this.completedDate = completedDate.getTime(); - } - - /** - * Queries whether or not any errors occurred during the processing of the - * auto ingest job for the manifest. - * - * @return True or false. - */ - boolean getErrorsOccurred() { - return this.errorsOccurred; - } - - /** - * Sets whether or not any errors occurred during the processing of the auto - * ingest job for the manifest. - * - * @param errorsOccurred True or false. - */ - void setErrorsOccurred(boolean errorsOccurred) { - this.errorsOccurred = errorsOccurred; - } - - /** - * Gets the node data as raw bytes that can be sent to the coordination - * service. - * - * @return The manifest node data as a byte array. - */ - byte[] toArray() { - ByteBuffer buffer = ByteBuffer.allocate(Integer.BYTES * 4 + Long.BYTES); - 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(); - } - - /** - * Processing status for the auto ingest job for the manifest. - */ - enum ProcessingStatus { - PENDING, - PROCESSING, - COMPLETED, - DELETED - } - -} 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/dashboardWsmode.xml b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/dashboardWsmode.xml new file mode 100644 index 0000000000..49305ab59f --- /dev/null +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/dashboardWsmode.xml @@ -0,0 +1,10 @@ + + + + + + + + + + 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 index 6711abd865..56ad444eb0 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/layer.xml +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/layer.xml @@ -31,5 +31,11 @@ + + + + + + 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 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 index 9e4c8299d4..52bf6cfe1e --- 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/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 index c277da47c9..ec5b511b7f --- 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,7 +18,9 @@ */ package org.sleuthkit.autopsy.imagegallery; +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; @@ -28,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; @@ -53,24 +55,37 @@ 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) -@TopComponent.Registration(mode = "timeline", openAtStartup = false) +@RetainLocation("ImageGallery") +@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,15 +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; - WindowManager.getDefault().isTopComponentFloating(tc); - Mode mode = WindowManager.getDefault().findMode("timeline"); // NON-NLS - if (mode != null) { - mode.dockInto(tc); + if (tc.isOpened() == false) { + tc.open(); } - tc.open(); + tc.toFront(); tc.requestActive(); } } @@ -107,36 +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() { - setName(Bundle.CTL_ImageGalleryTopComponent()); - setToolTipText(Bundle.HINT_ImageGalleryTopComponent()); - initComponents(); Platform.runLater(() -> {//initialize jfx ui @@ -200,25 +185,21 @@ public final class ImageGalleryTopComponent extends TopComponent implements Expl // End of variables declaration//GEN-END:variables @Override - public void componentOpened() { + 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("timeline") || mode.getName().equals("ImageGallery")) + .collect(Collectors.toList()); } @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 + public void componentOpened() { + super.componentOpened(); + WindowManager.getDefault().setTopComponentFloating(this, 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..c40b51e3e3 --- /dev/null +++ b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryWsmode.xml @@ -0,0 +1,10 @@ + + + + + + + + + + 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/layer.xml b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/layer.xml new file mode 100644 index 0000000000..aa55613f6f --- /dev/null +++ b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/layer.xml @@ -0,0 +1,9 @@ + + + + + + + + + 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 index d7e4032447..ac94008115 --- 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. @@ -317,7 +323,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(); } } @@ -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/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 index 99d88938ce..762afbea92 --- 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/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 index 3272b9dad1..1ad473dd01 --- 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) -> { 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 index a35e022279..24bda9a1f6 --- 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 old mode 100644 new mode 100755 index 47c71a8213..554477215e --- 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/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 index ad09b66077..b8bb93b240 --- 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/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 index 7ad2494da4..6bf6a4f3ef --- 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/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 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/KeywordHit.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordHit.java old mode 100644 new mode 100755 index f86b86b485..e51c1c2620 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordHit.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordHit.java @@ -18,81 +18,97 @@ */ 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.Content; 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 file 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. 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; private final String snippet; - private final Content content; - private final BlackboardArtifact artifact; + private final long contentID; + private final boolean hitOnArtifact; private final String hit; - public String getHit() { - return hit; - } - - KeywordHit(String solrDocumentId, String snippet) throws TskCoreException { - this(solrDocumentId, snippet, null); - } - + /** + * 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 { - /** - * Store the Solr document id. - */ + 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; - } - - /** - * 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. - */ - SleuthkitCase caseDb = Case.getCurrentCase().getSleuthkitCase(); - long fileId; - if (this.solrObjectId < 0) { - this.artifact = caseDb.getBlackboardArtifact(this.solrObjectId); - fileId = artifact.getObjectID(); } else { - this.artifact = null; - fileId = this.solrObjectId; + this.solrObjectId = Long.parseLong(split[0]); + this.chunkId = Integer.parseInt(split[1]); } - this.content = caseDb.getContentById(fileId); - /** - * Store the text snippet. - */ - this.snippet = snippet; - this.hit = hit; + //artifacts have negative obj ids + hitOnArtifact = this.solrObjectId < 0; + + if (hitOnArtifact) { + // 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); + 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; + } + } + + String getHit() { + return hit; } String getSolrDocumentId() { @@ -103,24 +119,20 @@ 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() { return this.snippet; } - Content getContent() { - return this.content; + long getContentID() { + return this.contentID; } /** @@ -129,17 +141,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 @@ -151,7 +166,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 @@ -163,21 +178,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); } } 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 index cafd45b3e8..da269e2d2c --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchQuery.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchQuery.java @@ -18,8 +18,11 @@ */ package org.sleuthkit.autopsy.keywordsearch; +import org.sleuthkit.datamodel.BlackboardArtifact; +import org.sleuthkit.datamodel.Content; + /** - * Interface for kewyord search queries. + * Interface for kewyord search queries. */ interface KeywordSearchQuery { @@ -30,18 +33,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,54 +54,67 @@ 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 * word - * - * @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(); - - KeywordCachedArtifact writeSingleFileHitsToBlackBoard(Keyword keyword, KeywordHit hit, String snippet, String listName); + String getEscapedQueryString(); + /** + * Converts the keyword hits for a given search term into artifacts. + * + * @param content The Content object associated with the hit. + * @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(Content content, Keyword foundKeyword, KeywordHit hit, String snippet, String listName); } 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 index b82e7778e1..ac7cfae557 --- 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; @@ -41,6 +38,7 @@ import org.openide.nodes.Children; import org.openide.nodes.Node; 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; @@ -50,12 +48,13 @@ 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; 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 +68,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; @@ -91,7 +90,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) { @@ -144,6 +143,13 @@ 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) { + logger.log(Level.SEVERE, "There was no case open.", ex); //NON-NLS + return false; + } int hitNumber = 0; List tempList = new ArrayList<>(); @@ -153,8 +159,20 @@ class KeywordSearchResultFactory extends ChildFactory { * Get file properties. */ Map properties = new LinkedHashMap<>(); - Content content = hit.getContent(); - String contentName = content.getName(); + Content content = null; + 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; + } + + contentName = content.getName(); if (content instanceof AbstractFile) { AbstractFsContentNode.fillPropertyMap(properties, (AbstractFile) content); } else { @@ -168,12 +186,20 @@ class KeywordSearchResultFactory extends ChildFactory { properties.put(TSK_KEYWORD_PREVIEW.getDisplayName(), hit.getSnippet()); } - String hitName = hit.isArtifactHit() - ? hit.getArtifact().getDisplayName() + " Artifact" //NON-NLS - : contentName; - + 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 @@ -222,6 +248,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); + } /** @@ -240,13 +267,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 content File that had the hit. - * @param query Query used in search - * @param hits Full set of search results (for all files! @@@) + * @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! @@@) */ KeyValueQueryContent(String name, Map map, int id, long solrObjectId, Content content, KeywordSearchQuery query, QueryResults hits) { super(name, map, id); @@ -278,13 +306,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) { @@ -298,13 +325,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/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 index 9f8686898f..4d3f9cc5b9 --- 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,15 +192,13 @@ class LuceneQuery implements KeywordSearchQuery { } @Override - public KeywordCachedArtifact writeSingleFileHitsToBlackBoard(Keyword foundKeyword, KeywordHit hit, String snippet, String listName) { + public BlackboardArtifact 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); - writeResult = new KeywordCachedArtifact(bba); + bba = content.newArtifact(ARTIFACT_TYPE.TSK_KEYWORD_HIT); } catch (TskCoreException e) { logger.log(Level.WARNING, "Error adding bb artifact for keyword hit", e); //NON-NLS return null; @@ -227,14 +225,15 @@ 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 - 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; @@ -399,10 +398,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/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/QueryResults.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/QueryResults.java index 410ec1a94c..48fdb38f10 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; } @@ -99,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()); @@ -145,14 +144,26 @@ 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 | IllegalStateException tskCoreException) { + logger.log(Level.SEVERE, "Error adding artifact for keyword hit to blackboard", tskCoreException); //NON-NLS + return null; + } + BlackboardArtifact writeResult = keywordSearchQuery.writeSingleFileHitsToBlackBoard(content, 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, content); + } 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 + logger.log(Level.WARNING, "BB artifact for keyword hit not written, file: {0}, hit: {1}", new Object[]{content, keyword.toString()}); //NON-NLS } } ++unitProgress; @@ -181,7 +192,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. @@ -196,12 +206,16 @@ 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 written - * @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(KeywordCachedArtifact written, Content hitContent) { + private void writeSingleFileInboxMessage(BlackboardArtifact artifact, Content hitContent) throws TskCoreException { StringBuilder subjectSb = new StringBuilder(); StringBuilder detailsSb = new StringBuilder(); @@ -210,24 +224,24 @@ class QueryResults { } else { subjectSb.append(NbBundle.getMessage(this.getClass(), "KeywordSearchIngestModule.kwHitLbl")); } + String uniqueKey = null; - BlackboardAttribute attr = written.getAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_KEYWORD.getTypeID()); + BlackboardAttribute 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")); @@ -247,16 +261,17 @@ 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")); @@ -264,9 +279,9 @@ class QueryResults { detailsSb.append(""); //NON-NLS } } + detailsSb.append("
").append(EscapeUtil.escapeHtml(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/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/RegexQuery.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/RegexQuery.java old mode 100644 new mode 100755 index 45205b0ca7..a422d9f9c3 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/RegexQuery.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/RegexQuery.java @@ -19,15 +19,11 @@ 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; -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 +48,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 @@ -87,8 +81,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,8 +183,9 @@ 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; + QueryResults results = new QueryResults(this); while (!allResultsProcessed) { try { @@ -204,9 +197,15 @@ 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) { + } catch (TskCoreException ex) { LOGGER.log(Level.SEVERE, "Error creating keyword hits", ex); //NON-NLS } } @@ -221,10 +220,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; } @@ -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,50 +373,15 @@ 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 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(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 +394,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; @@ -453,9 +417,9 @@ 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.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 +455,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 +467,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; @@ -516,17 +480,16 @@ 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())); 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; @@ -554,7 +517,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,12 +530,13 @@ 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 * 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); @@ -589,5 +553,4 @@ final class RegexQuery implements KeywordSearchQuery { return null; }); } - } 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 index 1a2ffd1200..c9b95a770b --- 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 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 index 3a55aad646..2552358de7 --- 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); } } @@ -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 { @@ -1231,6 +1234,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 +1245,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); @@ -1316,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(); @@ -1349,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; } 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 index f4413e3f2a..f37be9952e --- 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; @@ -96,7 +97,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 +116,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 +316,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(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 @@ -347,9 +333,9 @@ 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); + 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 @@ -373,9 +359,9 @@ 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.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 +397,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 +409,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; @@ -436,18 +422,17 @@ 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())); - + 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; @@ -488,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); 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 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/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 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 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 index 1e608b1326..e3f0401632 --- a/build-windows-installer.xml +++ b/build-windows-installer.xml @@ -170,7 +170,7 @@ - + diff --git a/build-windows.xml b/build-windows.xml old mode 100644 new mode 100755 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/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 index 8df7ff47a0..6293589ab0 --- 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 @@ -16,7 +16,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 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