1
0
mirror of https://github.com/elisspace/autopsy.git synced 2026-09-06 02:24:30 +00:00

Merge branch 'develop' of github.com:sleuthkit/autopsy into develop

This commit is contained in:
Brian Carrier
2014-05-19 18:07:06 -04:00
4 changed files with 92 additions and 61 deletions

View File

@@ -54,6 +54,6 @@ import org.sleuthkit.datamodel.BlackboardArtifact;
* that the directory tree would refresh. But, we haven't had a chance to add
* that so, we fire these events and the tree refreshes based on them.
*/
IngestServices.getInstance().fireModuleDataEvent(new ModuleDataEvent("TagAction", BlackboardArtifact.ARTIFACT_TYPE.TSK_TAG_FILE));
IngestServices.getInstance().fireModuleDataEvent(new ModuleDataEvent("TagAction", BlackboardArtifact.ARTIFACT_TYPE.TSK_TAG_FILE)); //NON-NLS
}
}

View File

@@ -107,7 +107,7 @@ final class AutopsyOptionsPanel extends javax.swing.JPanel {
org.openide.awt.Mnemonics.setLocalizedText(jLabel4, org.openide.util.NbBundle.getMessage(AutopsyOptionsPanel.class, "AutopsyOptionsPanel.jLabel4.text")); // NOI18N
restartRequiredLabel.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/corecomponents/warning16.png"))); // NOI18N
restartRequiredLabel.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/corecomponents/warning16.png"))); // NOI18N NON-NLS
org.openide.awt.Mnemonics.setLocalizedText(restartRequiredLabel, org.openide.util.NbBundle.getMessage(AutopsyOptionsPanel.class, "AutopsyOptionsPanel.restartRequiredLabel.text")); // NOI18N
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);

View File

@@ -46,8 +46,8 @@ final class IngestJob {
private long estimatedFilesToProcess = 0L; // Guarded by this
private long processedFiles = 0L; // Guarded by this
private DataSourceIngestPipeline dataSourceIngestPipeline;
private ProgressHandle dataSourceTasksProgress;
private ProgressHandle fileTasksProgress;
private ProgressHandle dataSourceIngestProgress;
private ProgressHandle fileIngestProgress;
private volatile boolean cancelled = false;
/**
@@ -140,11 +140,11 @@ final class IngestJob {
final String displayName = NbBundle.getMessage(this.getClass(),
"IngestJob.progress.dataSourceIngest.initialDisplayName",
dataSource.getName());
dataSourceTasksProgress = ProgressHandleFactory.createHandle(displayName, new Cancellable() {
dataSourceIngestProgress = ProgressHandleFactory.createHandle(displayName, new Cancellable() {
@Override
public boolean cancel() {
if (dataSourceTasksProgress != null) {
dataSourceTasksProgress.setDisplayName(
if (dataSourceIngestProgress != null) {
dataSourceIngestProgress.setDisplayName(
NbBundle.getMessage(this.getClass(),
"IngestJob.progress.cancelling",
displayName));
@@ -153,19 +153,19 @@ final class IngestJob {
return true;
}
});
dataSourceTasksProgress.start();
dataSourceTasksProgress.switchToIndeterminate();
dataSourceIngestProgress.start();
dataSourceIngestProgress.switchToIndeterminate();
}
private void startFileIngestProgressBar() {
final String displayName = NbBundle.getMessage(this.getClass(),
"IngestJob.progress.fileIngest.displayName",
dataSource.getName());
fileTasksProgress = ProgressHandleFactory.createHandle(displayName, new Cancellable() {
fileIngestProgress = ProgressHandleFactory.createHandle(displayName, new Cancellable() {
@Override
public boolean cancel() {
if (fileTasksProgress != null) {
fileTasksProgress.setDisplayName(
if (fileIngestProgress != null) {
fileIngestProgress.setDisplayName(
NbBundle.getMessage(this.getClass(), "IngestJob.progress.cancelling",
displayName));
}
@@ -174,29 +174,28 @@ final class IngestJob {
}
});
estimatedFilesToProcess = dataSource.accept(new GetFilesCountVisitor());
fileTasksProgress.start();
fileTasksProgress.switchToDeterminate((int) estimatedFilesToProcess);
fileIngestProgress.start();
fileIngestProgress.switchToDeterminate((int) estimatedFilesToProcess);
}
void process(DataSourceIngestTask task) throws InterruptedException {
if (!isCancelled()) {
List<IngestModuleError> errors = new ArrayList<>();
errors.addAll(dataSourceIngestPipeline.process(task.getDataSource(), dataSourceTasksProgress));
errors.addAll(dataSourceIngestPipeline.process(task.getDataSource(), dataSourceIngestProgress));
if (!errors.isEmpty()) {
logIngestModuleErrors(errors);
}
} else {
taskScheduler.removeTasksForIngestJob(id);
}
taskScheduler.notifyDataSourceIngestTaskCompleted(task);
// Because there is only one data source task per job, it is o.k. to
// call ProgressHandle.finish() now that the data source ingest modules
// are through using the progress bar via the DataSourceIngestModuleProgress wrapper.
// Calling ProgressHandle.finish() again in finish() will be harmless.
dataSourceTasksProgress.finish();
if (taskScheduler.isLastTaskForIngestJob(task)) {
finish();
if (!taskScheduler.hasDataSourceIngestTaskForIngestJob(this)) {
finishProgressBar(dataSourceIngestProgress);
if (!taskScheduler.hasFileIngestTaskForIngestJob(this)) {
finishProgressBar(fileIngestProgress);
finish();
}
}
}
@@ -206,9 +205,9 @@ final class IngestJob {
synchronized (this) {
++processedFiles;
if (processedFiles <= estimatedFilesToProcess) {
fileTasksProgress.progress(file.getName(), (int) processedFiles);
fileIngestProgress.progress(file.getName(), (int) processedFiles);
} else {
fileTasksProgress.progress(file.getName(), (int) estimatedFilesToProcess);
fileIngestProgress.progress(file.getName(), (int) estimatedFilesToProcess);
}
}
FileIngestPipeline pipeline = fileIngestPipelines.take();
@@ -221,9 +220,21 @@ final class IngestJob {
} else {
taskScheduler.removeTasksForIngestJob(id);
}
taskScheduler.notifyFileIngestTaskCompleted(task);
if (taskScheduler.isLastTaskForIngestJob(task)) {
finish();
if (!taskScheduler.hasFileIngestTaskForIngestJob(this)) {
finishProgressBar(fileIngestProgress);
if (!taskScheduler.hasDataSourceIngestTaskForIngestJob(this)) {
finishProgressBar(dataSourceIngestProgress);
finish();
}
}
}
private synchronized void finishProgressBar(ProgressHandle progress) {
if (progress != null) {
progress.finish();
progress = null;
}
}
@@ -236,8 +247,6 @@ final class IngestJob {
if (!errors.isEmpty()) {
logIngestModuleErrors(errors);
}
dataSourceTasksProgress.finish();
fileTasksProgress.finish();
ingestJobsById.remove(id);
if (!isCancelled()) {
IngestManager.getInstance().fireIngestJobCompleted(id);
@@ -256,6 +265,8 @@ final class IngestJob {
private void cancel() {
cancelled = true;
finishProgressBar(dataSourceIngestProgress);
finishProgressBar(fileIngestProgress);
IngestManager.getInstance().fireIngestJobCancelled(id);
}
}

View File

@@ -45,7 +45,8 @@ final class IngestScheduler {
private final TreeSet<FileIngestTask> rootDirectoryTasks = new TreeSet<>(new RootDirectoryTaskComparator()); // Guarded by this
private final List<FileIngestTask> directoryTasks = new ArrayList<>(); // Guarded by this
private final LinkedBlockingQueue<FileIngestTask> fileTasks = new LinkedBlockingQueue<>(); // Guarded by this
private final List<IngestTask> tasksInProgress = new ArrayList<>(); // Guarded by this
private final List<IngestTask> dataSourceTasksInProgress = new ArrayList<>(); // Guarded by this
private final List<IngestTask> fileTasksInProgress = new ArrayList<>(); // Guarded by this
private final DataSourceIngestTaskQueue dataSourceTaskDispenser = new DataSourceIngestTaskQueue();
private final FileIngestTaskQueue fileTaskDispenser = new FileIngestTaskQueue();
@@ -105,7 +106,7 @@ final class IngestScheduler {
}
}
updateFileTaskQueues(null);
updateFileTaskQueues();
}
void addFileTaskToIngestJob(IngestJob job, AbstractFile file) {
@@ -120,7 +121,7 @@ final class IngestScheduler {
}
}
synchronized void removeTasksForIngestJob(long ingestJobId) {
synchronized void removeTasksForIngestJob(long ingestJobId) {
// Remove all tasks for this ingest job that are not in progress.
Iterator<FileIngestTask> fileTasksIterator = fileTasks.iterator();
while (fileTasksIterator.hasNext()) {
@@ -148,11 +149,7 @@ final class IngestScheduler {
}
}
private synchronized void updateFileTaskQueues(FileIngestTask taskInProgress) throws InterruptedException {
if (taskInProgress != null) {
tasksInProgress.add(taskInProgress);
}
private synchronized void updateFileTaskQueues() throws InterruptedException {
// we loop because we could have a directory that has all files
// that do not get enqueued
while (true) {
@@ -262,36 +259,52 @@ final class IngestScheduler {
return fileTaskDispenser;
}
synchronized boolean isLastTaskForIngestJob(IngestTask completedTask) {
tasksInProgress.remove(completedTask);
IngestJob job = completedTask.getIngestJob();
synchronized void notifyDataSourceIngestTaskCompleted(DataSourceIngestTask task) {
dataSourceTasksInProgress.remove(task);
}
synchronized void notifyFileIngestTaskCompleted(FileIngestTask task) {
fileTasksInProgress.remove(task);
}
synchronized boolean hasDataSourceIngestTaskForIngestJob(IngestJob job) {
long jobId = job.getId();
for (IngestTask task : tasksInProgress) {
for (IngestTask task : dataSourceTasksInProgress) {
if (task.getIngestJob().getId() == jobId) {
return false;
}
}
for (FileIngestTask task : fileTasks) {
if (task.getIngestJob().getId() == jobId) {
return false;
}
}
for (FileIngestTask task : directoryTasks) {
if (task.getIngestJob().getId() == jobId) {
return false;
}
}
for (FileIngestTask task : rootDirectoryTasks) {
if (task.getIngestJob().getId() == jobId) {
return false;
return true;
}
}
for (DataSourceIngestTask task : dataSourceTasks) {
if (task.getIngestJob().getId() == jobId) {
return false;
return true;
}
}
return true;
return false;
}
synchronized boolean hasFileIngestTaskForIngestJob(IngestJob job) {
long jobId = job.getId();
for (IngestTask task : fileTasksInProgress) {
if (task.getIngestJob().getId() == jobId) {
return true;
}
}
for (FileIngestTask task : fileTasks) {
if (task.getIngestJob().getId() == jobId) {
return true;
}
}
for (FileIngestTask task : directoryTasks) {
if (task.getIngestJob().getId() == jobId) {
return true;
}
}
for (FileIngestTask task : rootDirectoryTasks) {
if (task.getIngestJob().getId() == jobId) {
return true;
}
}
return false;
}
private static class RootDirectoryTaskComparator implements Comparator<FileIngestTask> {
@@ -394,7 +407,11 @@ final class IngestScheduler {
@Override
public IngestTask getNextTask() throws InterruptedException {
return dataSourceTasks.take();
DataSourceIngestTask task = dataSourceTasks.take();
synchronized (this) {
dataSourceTasksInProgress.add(task);
}
return task;
}
}
@@ -403,7 +420,10 @@ final class IngestScheduler {
@Override
public IngestTask getNextTask() throws InterruptedException {
FileIngestTask task = fileTasks.take();
updateFileTaskQueues(task);
synchronized (this) {
fileTasksInProgress.add(task);
}
updateFileTaskQueues();
return task;
}
}