diff --git a/Core/src/org/sleuthkit/autopsy/examples/SampleFileIngestModule.java b/Core/src/org/sleuthkit/autopsy/examples/SampleFileIngestModule.java index 988d834904..8a95750924 100755 --- a/Core/src/org/sleuthkit/autopsy/examples/SampleFileIngestModule.java +++ b/Core/src/org/sleuthkit/autopsy/examples/SampleFileIngestModule.java @@ -69,6 +69,7 @@ class SampleFileIngestModule extends IngestModuleAdapter implements FileIngestMo @Override public void startUp(IngestJobContext context) throws IngestModuleException { this.context = context; + refCounter.incrementAndGet(context.getJobId()); synchronized (SampleFileIngestModule.class) { if (attrId == -1) { @@ -97,10 +98,6 @@ class SampleFileIngestModule extends IngestModuleAdapter implements FileIngestMo } } } - - // This method is thread-safe with per ingest job reference counted - // management of shared data. - initBlackboardPostCount(context.getJobId()); } @Override @@ -168,15 +165,15 @@ class SampleFileIngestModule extends IngestModuleAdapter implements FileIngestMo reportBlackboardPostCount(context.getJobId()); } - synchronized static void initBlackboardPostCount(long ingestJobId) { - Long refCount = refCounter.incrementAndGet(ingestJobId); - if (refCount == 1) { - artifactCountsForIngestJobs.put(ingestJobId, 0L); - } - } - synchronized static void addToBlackboardPostCount(long ingestJobId, long countToAdd) { Long fileCount = artifactCountsForIngestJobs.get(ingestJobId); + + // Ensures that this job has an entry + if (fileCount == null) { + fileCount = 0L; + artifactCountsForIngestJobs.put(ingestJobId, fileCount); + } + fileCount += countToAdd; artifactCountsForIngestJobs.put(ingestJobId, fileCount); } diff --git a/Core/src/org/sleuthkit/autopsy/examples/SampleIngestModuleFactory.java b/Core/src/org/sleuthkit/autopsy/examples/SampleIngestModuleFactory.java index 9e9fbba5fe..a1388ce15f 100755 --- a/Core/src/org/sleuthkit/autopsy/examples/SampleIngestModuleFactory.java +++ b/Core/src/org/sleuthkit/autopsy/examples/SampleIngestModuleFactory.java @@ -43,7 +43,7 @@ import org.openide.util.NbBundle; import org.sleuthkit.autopsy.ingest.IngestModuleFactory; import org.sleuthkit.autopsy.ingest.DataSourceIngestModule; import org.sleuthkit.autopsy.ingest.FileIngestModule; -import org.sleuthkit.autopsy.ingest.IngestModuleGlobalSetttingsPanel; +import org.sleuthkit.autopsy.ingest.IngestModuleGlobalSettingsPanel; import org.sleuthkit.autopsy.ingest.IngestModuleIngestJobSettings; import org.sleuthkit.autopsy.ingest.IngestModuleIngestJobSettingsPanel; @@ -167,7 +167,7 @@ public class SampleIngestModuleFactory implements IngestModuleFactory { * @return A global settings panel. */ @Override - public IngestModuleGlobalSetttingsPanel getGlobalSettingsPanel() { + public IngestModuleGlobalSettingsPanel getGlobalSettingsPanel() { throw new UnsupportedOperationException(); } diff --git a/Core/src/org/sleuthkit/autopsy/ingest/IngestJobConfigurationPanel.java b/Core/src/org/sleuthkit/autopsy/ingest/IngestJobConfigurationPanel.java index 1cf4cfaa90..6ad1aa9d98 100644 --- a/Core/src/org/sleuthkit/autopsy/ingest/IngestJobConfigurationPanel.java +++ b/Core/src/org/sleuthkit/autopsy/ingest/IngestJobConfigurationPanel.java @@ -325,7 +325,7 @@ class IngestJobConfigurationPanel extends javax.swing.JPanel { static private class IngestModuleModel { private final IngestModuleTemplate moduleTemplate; - private IngestModuleGlobalSetttingsPanel globalSettingsPanel = null; + private IngestModuleGlobalSettingsPanel globalSettingsPanel = null; private IngestModuleIngestJobSettingsPanel moduleSettingsPanel = null; IngestModuleModel(IngestModuleTemplate moduleTemplate) { @@ -370,7 +370,7 @@ class IngestJobConfigurationPanel extends javax.swing.JPanel { return moduleTemplate.hasGlobalSettingsPanel(); } - IngestModuleGlobalSetttingsPanel getGlobalSettingsPanel() { + IngestModuleGlobalSettingsPanel getGlobalSettingsPanel() { return globalSettingsPanel; } diff --git a/Core/src/org/sleuthkit/autopsy/ingest/IngestManager.java b/Core/src/org/sleuthkit/autopsy/ingest/IngestManager.java index 76df43cae3..a0d2233622 100644 --- a/Core/src/org/sleuthkit/autopsy/ingest/IngestManager.java +++ b/Core/src/org/sleuthkit/autopsy/ingest/IngestManager.java @@ -21,9 +21,11 @@ package org.sleuthkit.autopsy.ingest; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; import java.util.ArrayList; +import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.concurrent.CancellationException; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; @@ -61,8 +63,8 @@ public class IngestManager { private final ExecutorService startIngestJobsExecutor = Executors.newSingleThreadExecutor(); private final ExecutorService dataSourceIngestTasksExecutor = Executors.newSingleThreadExecutor(); private final ExecutorService fileIngestTasksExecutor = Executors.newFixedThreadPool(MAX_NUMBER_OF_FILE_INGEST_THREADS); - private final HashMap ingestJobs = new HashMap<>(); // Maps job ids to jobs - private final HashMap> ingestTasks = new HashMap<>(); // Maps task ids to task cancellation handles + private final ConcurrentHashMap ingestJobs = new ConcurrentHashMap<>(1, 0.9f, 4); // Maps job ids to jobs. + private final HashMap> ingestTasks = new HashMap<>(); // Maps task ids to task cancellation handles. Guarded by this. private AtomicLong ingestJobId = new AtomicLong(0L); private AtomicLong ingestTaskId = new AtomicLong(0L); private volatile IngestUI ingestMessageBox; @@ -124,11 +126,11 @@ public class IngestManager { * * @return True if any ingest jobs are in progress, false otherwise */ - public synchronized boolean isIngestRunning() { + public boolean isIngestRunning() { return (ingestJobs.isEmpty() == false); } - synchronized void addFileToIngestJob(long ingestJobId, AbstractFile file) { + void addFileToIngestJob(long ingestJobId, AbstractFile file) { IngestJob job = ingestJobs.get(ingestJobId); if (job != null) { scheduler.getFileIngestScheduler().queueFile(job, file); @@ -301,7 +303,7 @@ public class IngestManager { } } - private synchronized void stopIngestTasks() { + private void stopIngestTasks() { // First mark all of the ingest jobs as cancelled. This way the // ingest modules will know they are being shut down due to // cancellation when the cancelled run ingest module tasks release @@ -312,21 +314,25 @@ public class IngestManager { // Cancel the run ingest module tasks, setting the state of the threads // running them to interrupted. - for (Future task : ingestTasks.values()) { - task.cancel(true); + synchronized(this) { + for (Future task : ingestTasks.values()) { + task.cancel(true); + } } - + // Jettision the remaining data source and file ingest tasks. scheduler.getFileIngestScheduler().emptyQueues(); scheduler.getDataSourceIngestScheduler().emptyQueues(); } - synchronized void reportStartIngestJobsTaskDone(long taskId) { + private synchronized void reportStartIngestJobsTaskDone(long taskId) { ingestTasks.remove(taskId); } - synchronized void reportRunIngestModulesTaskDone(long taskId) { - ingestTasks.remove(taskId); + private void reportRunIngestModulesTaskDone(long taskId) { + synchronized(this) { + ingestTasks.remove(taskId); + } List completedJobs = new ArrayList<>(); for (IngestJob job : ingestJobs.values()) { @@ -384,9 +390,7 @@ public class IngestManager { // Create an ingest job. IngestJob ingestJob = new IngestJob(IngestManager.this.ingestJobId.incrementAndGet(), dataSource, moduleTemplates, processUnallocatedSpace); - synchronized (IngestManager.this) { - ingestJobs.put(ingestJob.getId(), ingestJob); - } + ingestJobs.put(ingestJob.getId(), ingestJob); // Start at least one instance of each kind of ingest // pipeline for this ingest job. This allows for an early out @@ -420,10 +424,8 @@ public class IngestManager { "IngestManager.StartIngestJobsTask.run.startupErr.dlgTitle"), JOptionPane.ERROR_MESSAGE); // Jettison the ingest job and move on to the next one. - synchronized (IngestManager.this) { - ingestJob.cancel(); - ingestJobs.remove(ingestJob.getId()); - } + ingestJob.cancel(); + ingestJobs.remove(ingestJob.getId()); break; } diff --git a/Core/src/org/sleuthkit/autopsy/ingest/IngestModuleFactory.java b/Core/src/org/sleuthkit/autopsy/ingest/IngestModuleFactory.java index d097ff557c..c59e3868c8 100755 --- a/Core/src/org/sleuthkit/autopsy/ingest/IngestModuleFactory.java +++ b/Core/src/org/sleuthkit/autopsy/ingest/IngestModuleFactory.java @@ -113,7 +113,7 @@ public interface IngestModuleFactory { * * @return A global settings panel. */ - IngestModuleGlobalSetttingsPanel getGlobalSettingsPanel(); + IngestModuleGlobalSettingsPanel getGlobalSettingsPanel(); /** * Gets the default per ingest job settings for instances of the family of diff --git a/Core/src/org/sleuthkit/autopsy/ingest/IngestModuleFactoryAdapter.java b/Core/src/org/sleuthkit/autopsy/ingest/IngestModuleFactoryAdapter.java index 60bea92713..2c4831bb01 100755 --- a/Core/src/org/sleuthkit/autopsy/ingest/IngestModuleFactoryAdapter.java +++ b/Core/src/org/sleuthkit/autopsy/ingest/IngestModuleFactoryAdapter.java @@ -39,7 +39,7 @@ public abstract class IngestModuleFactoryAdapter implements IngestModuleFactory } @Override - public IngestModuleGlobalSetttingsPanel getGlobalSettingsPanel() { + public IngestModuleGlobalSettingsPanel getGlobalSettingsPanel() { throw new UnsupportedOperationException(); } diff --git a/Core/src/org/sleuthkit/autopsy/ingest/IngestModuleGlobalSetttingsPanel.java b/Core/src/org/sleuthkit/autopsy/ingest/IngestModuleGlobalSettingsPanel.java similarity index 92% rename from Core/src/org/sleuthkit/autopsy/ingest/IngestModuleGlobalSetttingsPanel.java rename to Core/src/org/sleuthkit/autopsy/ingest/IngestModuleGlobalSettingsPanel.java index f6de631e9b..30724bfe8d 100755 --- a/Core/src/org/sleuthkit/autopsy/ingest/IngestModuleGlobalSetttingsPanel.java +++ b/Core/src/org/sleuthkit/autopsy/ingest/IngestModuleGlobalSettingsPanel.java @@ -23,7 +23,7 @@ import javax.swing.JPanel; /** * Base class for ingest module global settings panels. */ -public abstract class IngestModuleGlobalSetttingsPanel extends JPanel { +public abstract class IngestModuleGlobalSettingsPanel extends JPanel { public abstract void saveSettings(); } \ No newline at end of file diff --git a/Core/src/org/sleuthkit/autopsy/ingest/IngestModuleTemplate.java b/Core/src/org/sleuthkit/autopsy/ingest/IngestModuleTemplate.java index 23a55a5d01..6d802c4660 100755 --- a/Core/src/org/sleuthkit/autopsy/ingest/IngestModuleTemplate.java +++ b/Core/src/org/sleuthkit/autopsy/ingest/IngestModuleTemplate.java @@ -65,7 +65,7 @@ final class IngestModuleTemplate { return moduleFactory.hasGlobalSettingsPanel(); } - IngestModuleGlobalSetttingsPanel getGlobalSettingsPanel() { + IngestModuleGlobalSettingsPanel getGlobalSettingsPanel() { return moduleFactory.getGlobalSettingsPanel(); } diff --git a/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/FileExtMismatchDetectorModuleFactory.java b/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/FileExtMismatchDetectorModuleFactory.java index 4eb9931d2e..6affe32554 100755 --- a/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/FileExtMismatchDetectorModuleFactory.java +++ b/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/FileExtMismatchDetectorModuleFactory.java @@ -26,7 +26,7 @@ import org.sleuthkit.autopsy.ingest.FileIngestModule; import org.sleuthkit.autopsy.ingest.IngestModuleFactory; import org.sleuthkit.autopsy.ingest.IngestModuleIngestJobSettings; import org.sleuthkit.autopsy.ingest.IngestModuleIngestJobSettingsPanel; -import org.sleuthkit.autopsy.ingest.IngestModuleGlobalSetttingsPanel; +import org.sleuthkit.autopsy.ingest.IngestModuleGlobalSettingsPanel; /** * An factory that creates file ingest modules that detect mismatches between @@ -83,7 +83,7 @@ public class FileExtMismatchDetectorModuleFactory extends IngestModuleFactoryAda } @Override - public IngestModuleGlobalSetttingsPanel getGlobalSettingsPanel() { + public IngestModuleGlobalSettingsPanel getGlobalSettingsPanel() { FileExtMismatchSettingsPanel globalOptionsPanel = new FileExtMismatchSettingsPanel(); globalOptionsPanel.load(); return globalOptionsPanel; diff --git a/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/FileExtMismatchIngestModule.java b/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/FileExtMismatchIngestModule.java index a59768fed9..6c0928619c 100644 --- a/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/FileExtMismatchIngestModule.java +++ b/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/FileExtMismatchIngestModule.java @@ -23,7 +23,6 @@ import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.List; -import java.util.concurrent.atomic.AtomicLong; import java.util.logging.Level; import org.openide.util.NbBundle; import org.sleuthkit.autopsy.coreutils.Logger; @@ -52,10 +51,31 @@ public class FileExtMismatchIngestModule extends IngestModuleAdapter implements private final FileExtMismatchDetectorModuleSettings settings; private HashMap SigTypeToExtMap = new HashMap<>(); private long jobId; - private static AtomicLong processTime = new AtomicLong(0); - private static AtomicLong numFiles = new AtomicLong(0); + private static final HashMap totalsForIngestJobs = new HashMap<>(); private static final IngestModuleReferenceCounter refCounter = new IngestModuleReferenceCounter(); + private static class IngestJobTotals { + private long processTime = 0; + private long numFiles = 0; + } + + /** + * Update the match time total and increment num of files for this job + * @param ingestJobId + * @param matchTimeInc amount of time to add + */ + private static synchronized void addToTotals(long ingestJobId, long processTimeInc) { + IngestJobTotals ingestJobTotals = totalsForIngestJobs.get(ingestJobId); + if (ingestJobTotals == null) { + ingestJobTotals = new IngestJobTotals(); + totalsForIngestJobs.put(ingestJobId, ingestJobTotals); + } + + ingestJobTotals.processTime += processTimeInc; + ingestJobTotals.numFiles++; + totalsForIngestJobs.put(ingestJobId, ingestJobTotals); + } + FileExtMismatchIngestModule(FileExtMismatchDetectorModuleSettings settings) { this.settings = settings; } @@ -64,6 +84,7 @@ public class FileExtMismatchIngestModule extends IngestModuleAdapter implements public void startUp(IngestJobContext context) throws IngestModuleException { jobId = context.getJobId(); refCounter.incrementAndGet(jobId); + FileExtMismatchXML xmlLoader = FileExtMismatchXML.getDefault(); SigTypeToExtMap = xmlLoader.load(); } @@ -87,8 +108,7 @@ public class FileExtMismatchIngestModule extends IngestModuleAdapter implements boolean mismatchDetected = compareSigTypeToExt(abstractFile); - processTime.getAndAdd(System.currentTimeMillis() - startTime); - numFiles.getAndIncrement(); + addToTotals(jobId, System.currentTimeMillis() - startTime); if (mismatchDetected) { // add artifact @@ -155,21 +175,28 @@ public class FileExtMismatchIngestModule extends IngestModuleAdapter implements @Override public void shutDown(boolean ingestJobCancelled) { // We only need to post the summary msg from the last module per job - if (refCounter.decrementAndGet(jobId) == 0) { - StringBuilder detailsSb = new StringBuilder(); - detailsSb.append(""); //NON-NLS - detailsSb.append(""); //NON-NLS - detailsSb.append("\n"); //NON-NLS - detailsSb.append("\n"); //NON-NLS - detailsSb.append("
").append(FileExtMismatchDetectorModuleFactory.getModuleName()).append("
").append( //NON-NLS - NbBundle.getMessage(this.getClass(), "FileExtMismatchIngestModule.complete.totalProcTime")) - .append("").append(processTime.get()).append("
").append( //NON-NLS - NbBundle.getMessage(this.getClass(), "FileExtMismatchIngestModule.complete.totalFiles")) - .append("").append(numFiles.get()).append("
"); //NON-NLS - services.postMessage(IngestMessage.createMessage(IngestMessage.MessageType.INFO, FileExtMismatchDetectorModuleFactory.getModuleName(), - NbBundle.getMessage(this.getClass(), - "FileExtMismatchIngestModule.complete.svcMsg.text"), - detailsSb.toString())); + if (refCounter.decrementAndGet(jobId) == 0) { + IngestJobTotals jobTotals; + synchronized(this) { + jobTotals = totalsForIngestJobs.remove(jobId); + } + if (jobTotals != null) { + StringBuilder detailsSb = new StringBuilder(); + detailsSb.append(""); //NON-NLS + detailsSb.append(""); //NON-NLS + detailsSb.append("\n"); //NON-NLS + detailsSb.append("\n"); //NON-NLS + detailsSb.append("
").append(FileExtMismatchDetectorModuleFactory.getModuleName()).append("
").append( //NON-NLS + NbBundle.getMessage(this.getClass(), "FileExtMismatchIngestModule.complete.totalProcTime")) + .append("").append(jobTotals.processTime).append("
").append( //NON-NLS + NbBundle.getMessage(this.getClass(), "FileExtMismatchIngestModule.complete.totalFiles")) + .append("").append(jobTotals.numFiles).append("
"); //NON-NLS + + services.postMessage(IngestMessage.createMessage(IngestMessage.MessageType.INFO, FileExtMismatchDetectorModuleFactory.getModuleName(), + NbBundle.getMessage(this.getClass(), + "FileExtMismatchIngestModule.complete.svcMsg.text"), + detailsSb.toString())); + } } } } diff --git a/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/FileExtMismatchSettingsPanel.java b/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/FileExtMismatchSettingsPanel.java index 12fe3f09b4..46f683f666 100644 --- a/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/FileExtMismatchSettingsPanel.java +++ b/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/FileExtMismatchSettingsPanel.java @@ -29,7 +29,7 @@ import javax.swing.ListSelectionModel; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.table.AbstractTableModel; -import org.sleuthkit.autopsy.ingest.IngestModuleGlobalSetttingsPanel; +import org.sleuthkit.autopsy.ingest.IngestModuleGlobalSettingsPanel; import org.openide.util.NbBundle; import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.modules.filetypeid.FileTypeIdIngestModule; @@ -39,7 +39,7 @@ import org.sleuthkit.autopsy.corecomponents.OptionsPanel; * Container panel for File Extension Mismatch Ingest Module advanced * configuration options */ -final class FileExtMismatchSettingsPanel extends IngestModuleGlobalSetttingsPanel implements OptionsPanel { +final class FileExtMismatchSettingsPanel extends IngestModuleGlobalSettingsPanel implements OptionsPanel { private static Logger logger = Logger.getLogger(FileExtMismatchSettingsPanel.class.getName()); private HashMap editableMap = new HashMap<>(); diff --git a/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/mismatch_config.xml b/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/mismatch_config.xml index 476c5e78b5..3294584539 100644 --- a/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/mismatch_config.xml +++ b/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/mismatch_config.xml @@ -211,16 +211,24 @@ gif + jpeg + jpg + png + gif jfi jfif jif jpe jpeg jpg + png + gif + jpeg + jpg png diff --git a/Core/src/org/sleuthkit/autopsy/modules/filetypeid/FileTypeIdIngestModule.java b/Core/src/org/sleuthkit/autopsy/modules/filetypeid/FileTypeIdIngestModule.java index 75c326fda5..2e89724e86 100644 --- a/Core/src/org/sleuthkit/autopsy/modules/filetypeid/FileTypeIdIngestModule.java +++ b/Core/src/org/sleuthkit/autopsy/modules/filetypeid/FileTypeIdIngestModule.java @@ -61,10 +61,6 @@ public class FileTypeIdIngestModule extends IngestModuleAdapter implements FileI long numFiles = 0; } - private static synchronized void initTotals(long ingestJobId) { - totalsForIngestJobs.put(ingestJobId, new IngestJobTotals()); - } - /** * Update the match time total and increment num of files for this job * @param ingestJobId @@ -72,6 +68,11 @@ public class FileTypeIdIngestModule extends IngestModuleAdapter implements FileI */ private static synchronized void addToTotals(long ingestJobId, long matchTimeInc) { IngestJobTotals ingestJobTotals = totalsForIngestJobs.get(ingestJobId); + if (ingestJobTotals == null) { + ingestJobTotals = new IngestJobTotals(); + totalsForIngestJobs.put(ingestJobId, ingestJobTotals); + } + ingestJobTotals.matchTime += matchTimeInc; ingestJobTotals.numFiles++; totalsForIngestJobs.put(ingestJobId, ingestJobTotals); @@ -84,9 +85,7 @@ public class FileTypeIdIngestModule extends IngestModuleAdapter implements FileI @Override public void startUp(IngestJobContext context) throws IngestModuleException { jobId = context.getJobId(); - if (refCounter.incrementAndGet(jobId) == 1) { - initTotals(jobId); - } + refCounter.incrementAndGet(jobId); } @Override @@ -133,22 +132,26 @@ public class FileTypeIdIngestModule extends IngestModuleAdapter implements FileI public void shutDown(boolean ingestJobCancelled) { // We only need to post the summary msg from the last module per job if (refCounter.decrementAndGet(jobId) == 0) { - IngestJobTotals jobTotals = totalsForIngestJobs.remove(jobId); - - StringBuilder detailsSb = new StringBuilder(); - detailsSb.append(""); //NON-NLS - detailsSb.append(""); //NON-NLS - detailsSb.append("\n"); //NON-NLS - detailsSb.append("\n"); //NON-NLS - detailsSb.append("
").append(FileTypeIdModuleFactory.getModuleName()).append("
") //NON-NLS - .append(NbBundle.getMessage(this.getClass(), "FileTypeIdIngestModule.complete.totalProcTime")) - .append("").append(jobTotals.matchTime).append("
") //NON-NLS - .append(NbBundle.getMessage(this.getClass(), "FileTypeIdIngestModule.complete.totalFiles")) - .append("").append(jobTotals.numFiles).append("
"); //NON-NLS - IngestServices.getInstance().postMessage(IngestMessage.createMessage(IngestMessage.MessageType.INFO, FileTypeIdModuleFactory.getModuleName(), - NbBundle.getMessage(this.getClass(), - "FileTypeIdIngestModule.complete.srvMsg.text"), - detailsSb.toString())); + IngestJobTotals jobTotals; + synchronized(this) { + jobTotals = totalsForIngestJobs.remove(jobId); + } + if (jobTotals != null) { + StringBuilder detailsSb = new StringBuilder(); + detailsSb.append(""); //NON-NLS + detailsSb.append(""); //NON-NLS + detailsSb.append("\n"); //NON-NLS + detailsSb.append("\n"); //NON-NLS + detailsSb.append("
").append(FileTypeIdModuleFactory.getModuleName()).append("
") //NON-NLS + .append(NbBundle.getMessage(this.getClass(), "FileTypeIdIngestModule.complete.totalProcTime")) + .append("").append(jobTotals.matchTime).append("
") //NON-NLS + .append(NbBundle.getMessage(this.getClass(), "FileTypeIdIngestModule.complete.totalFiles")) + .append("").append(jobTotals.numFiles).append("
"); //NON-NLS + IngestServices.getInstance().postMessage(IngestMessage.createMessage(IngestMessage.MessageType.INFO, FileTypeIdModuleFactory.getModuleName(), + NbBundle.getMessage(this.getClass(), + "FileTypeIdIngestModule.complete.srvMsg.text"), + detailsSb.toString())); + } } } diff --git a/Core/src/org/sleuthkit/autopsy/modules/filetypeid/FileTypeIdModuleSettingsPanel.form b/Core/src/org/sleuthkit/autopsy/modules/filetypeid/FileTypeIdModuleSettingsPanel.form index 6a81b507d5..9ffeb0b8d7 100644 --- a/Core/src/org/sleuthkit/autopsy/modules/filetypeid/FileTypeIdModuleSettingsPanel.form +++ b/Core/src/org/sleuthkit/autopsy/modules/filetypeid/FileTypeIdModuleSettingsPanel.form @@ -19,7 +19,7 @@ - + diff --git a/Core/src/org/sleuthkit/autopsy/modules/filetypeid/FileTypeIdModuleSettingsPanel.java b/Core/src/org/sleuthkit/autopsy/modules/filetypeid/FileTypeIdModuleSettingsPanel.java index b6f9b75c15..f21498e6f6 100644 --- a/Core/src/org/sleuthkit/autopsy/modules/filetypeid/FileTypeIdModuleSettingsPanel.java +++ b/Core/src/org/sleuthkit/autopsy/modules/filetypeid/FileTypeIdModuleSettingsPanel.java @@ -72,7 +72,7 @@ final class FileTypeIdModuleSettingsPanel extends IngestModuleIngestJobSettingsP .addGroup(layout.createSequentialGroup() .addGap(10, 10, 10) .addComponent(skipKnownCheckBox) - .addContainerGap(608, Short.MAX_VALUE)) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) diff --git a/Core/src/org/sleuthkit/autopsy/report/ReportGenerator.java b/Core/src/org/sleuthkit/autopsy/report/ReportGenerator.java index 2400f38c88..cd48ed2764 100644 --- a/Core/src/org/sleuthkit/autopsy/report/ReportGenerator.java +++ b/Core/src/org/sleuthkit/autopsy/report/ReportGenerator.java @@ -47,6 +47,7 @@ import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.SwingWorker; import org.openide.filesystems.FileUtil; +import org.openide.util.Exceptions; import org.openide.util.NbBundle; import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.coreutils.EscapeUtil; @@ -909,16 +910,12 @@ import org.sleuthkit.datamodel.TskData; } } - // Get any tags that associated with this artifact and apply the tag filter. - HashSet uniqueTagNames = new HashSet<>(); - ResultSet tagNameRows = skCase.runQuery("SELECT display_name FROM tag_names WHERE artifact_id = " + rs.getLong("artifact_id")); //NON-NLS - while (tagNameRows.next()) { - uniqueTagNames.add(tagNameRows.getString("display_name")); //NON-NLS - } - if(failsTagFilter(uniqueTagNames, tagNamesFilter)) { - continue; - } - String tagsList = makeCommaSeparatedList(uniqueTagNames); + // Get any tags that associated with this artifact and apply the tag filter. + HashSet uniqueTagNames = getUniqueTagNames(rs.getLong("artifact_id")); + if(failsTagFilter(uniqueTagNames, tagNamesFilter)) { + continue; + } + String tagsList = makeCommaSeparatedList(uniqueTagNames); Long objId = rs.getLong("obj_id"); //NON-NLS String keyword = rs.getString("keyword"); //NON-NLS @@ -1050,11 +1047,7 @@ import org.sleuthkit.datamodel.TskData; } // Get any tags that associated with this artifact and apply the tag filter. - HashSet uniqueTagNames = new HashSet<>(); - ResultSet tagNameRows = skCase.runQuery("SELECT display_name FROM tag_names WHERE artifact_id = " + rs.getLong("artifact_id")); //NON-NLS - while (tagNameRows.next()) { - uniqueTagNames.add(tagNameRows.getString("display_name")); //NON-NLS - } + HashSet uniqueTagNames = getUniqueTagNames(rs.getLong("artifact_id")); if(failsTagFilter(uniqueTagNames, tagNamesFilter)) { continue; } @@ -1664,6 +1657,22 @@ import org.sleuthkit.datamodel.TskData; return ReportGenerator.this.getMappedAttributes(attributes); } } + + /** + * Get any tags associated with an artifact + * @param artifactId + * @return hash set of tag display names + * @throws SQLException + */ + private HashSet getUniqueTagNames(long artifactId) throws SQLException { + HashSet uniqueTagNames = new HashSet<>(); + ResultSet tagNameRows = skCase.runQuery("SELECT display_name, artifact_id FROM tag_names AS tn, blackboard_artifact_tags AS bat " + //NON-NLS + "WHERE tn.tag_name_id = bat.tag_name_id AND bat.artifact_id = " + artifactId); //NON-NLS + while (tagNameRows.next()) { + uniqueTagNames.add(tagNameRows.getString("display_name")); //NON-NLS + } + return uniqueTagNames; + } + } - diff --git a/HashDatabase/src/org/sleuthkit/autopsy/hashdatabase/HashDbIngestModule.java b/HashDatabase/src/org/sleuthkit/autopsy/hashdatabase/HashDbIngestModule.java index 71ab5c2c22..d8e67613dc 100644 --- a/HashDatabase/src/org/sleuthkit/autopsy/hashdatabase/HashDbIngestModule.java +++ b/HashDatabase/src/org/sleuthkit/autopsy/hashdatabase/HashDbIngestModule.java @@ -21,6 +21,7 @@ package org.sleuthkit.autopsy.hashdatabase; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; +import java.util.HashMap; import java.util.List; import java.util.concurrent.atomic.AtomicLong; import java.util.logging.Level; @@ -57,22 +58,35 @@ public class HashDbIngestModule extends IngestModuleAdapter implements FileInges private List knownBadHashSets = new ArrayList<>(); private List knownHashSets = new ArrayList<>(); private long jobId; - private static AtomicLong totalKnownBadCount = new AtomicLong(0); - private static AtomicLong totalCalctime = new AtomicLong(0); - private static AtomicLong totalLookuptime = new AtomicLong(0); + private static final HashMap totalsForIngestJobs = new HashMap<>(); private static final IngestModuleReferenceCounter refCounter = new IngestModuleReferenceCounter(); + private static class IngestJobTotals { + private AtomicLong totalKnownBadCount = new AtomicLong(0); + private AtomicLong totalCalctime = new AtomicLong(0); + private AtomicLong totalLookuptime = new AtomicLong(0); + } + + private static synchronized IngestJobTotals getTotalsForIngestJobs(long ingestJobId) { + IngestJobTotals totals = totalsForIngestJobs.get(ingestJobId); + if (totals == null) { + totals = new HashDbIngestModule.IngestJobTotals(); + totalsForIngestJobs.put(ingestJobId, totals); + } + return totals; + } + HashDbIngestModule(HashLookupModuleSettings settings) { this.settings = settings; } @Override public void startUp(org.sleuthkit.autopsy.ingest.IngestJobContext context) throws IngestModuleException { - jobId = context.getJobId(); + jobId = context.getJobId(); getEnabledHashSets(hashDbManager.getKnownBadFileHashSets(), knownBadHashSets); getEnabledHashSets(hashDbManager.getKnownFileHashSets(), knownHashSets); - if (refCounter.incrementAndGet(jobId) == 1) { + if (refCounter.incrementAndGet(jobId) == 1) { // if first module for this job then post error msgs if needed if (knownBadHashSets.isEmpty()) { @@ -123,6 +137,9 @@ public class HashDbIngestModule extends IngestModuleAdapter implements FileInges return ProcessResult.OK; } + // Safely get a reference to the totalsForIngestJobs object + IngestJobTotals totals = getTotalsForIngestJobs(jobId); + // calc hash value String name = file.getName(); String md5Hash = file.getMd5Hash(); @@ -131,7 +148,7 @@ public class HashDbIngestModule extends IngestModuleAdapter implements FileInges long calcstart = System.currentTimeMillis(); md5Hash = hasher.calculateMd5(file); long delta = (System.currentTimeMillis() - calcstart); - totalCalctime.addAndGet(delta); + totals.totalCalctime.addAndGet(delta); } catch (IOException ex) { logger.log(Level.WARNING, "Error calculating hash of file " + name, ex); //NON-NLS @@ -156,7 +173,7 @@ public class HashDbIngestModule extends IngestModuleAdapter implements FileInges HashInfo hashInfo = db.lookUp(file); if (null != hashInfo) { foundBad = true; - totalKnownBadCount.incrementAndGet(); + totals.totalKnownBadCount.incrementAndGet(); try { skCase.setKnown(file, TskData.FileKnown.BAD); @@ -191,7 +208,7 @@ public class HashDbIngestModule extends IngestModuleAdapter implements FileInges postHashSetHitToBlackboard(file, md5Hash, hashSetName, comment, db.getSendIngestMessages()); } long delta = (System.currentTimeMillis() - lookupstart); - totalLookuptime.addAndGet(delta); + totals.totalLookuptime.addAndGet(delta); } catch (TskException ex) { logger.log(Level.WARNING, "Couldn't lookup known bad hash for file " + name + " - see sleuthkit log for details", ex); //NON-NLS @@ -224,7 +241,7 @@ public class HashDbIngestModule extends IngestModuleAdapter implements FileInges } } long delta = (System.currentTimeMillis() - lookupstart); - totalLookuptime.addAndGet(delta); + totals.totalLookuptime.addAndGet(delta); } catch (TskException ex) { logger.log(Level.WARNING, "Couldn't lookup known hash for file " + name + " - see sleuthkit log for details", ex); //NON-NLS @@ -302,43 +319,49 @@ public class HashDbIngestModule extends IngestModuleAdapter implements FileInges } } + private synchronized void postSummary() { + IngestJobTotals jobTotals = totalsForIngestJobs.remove(jobId); + + if ((!knownBadHashSets.isEmpty()) || (!knownHashSets.isEmpty())) { + StringBuilder detailsSb = new StringBuilder(); + //details + detailsSb.append(""); //NON-NLS + + detailsSb.append(""); //NON-NLS + detailsSb.append(""); //NON-NLS + + detailsSb.append("\n"); //NON-NLS + detailsSb.append("\n"); //NON-NLS + detailsSb.append("
") //NON-NLS + .append(NbBundle.getMessage(this.getClass(), "HashDbIngestModule.complete.knownBadsFound")) + .append("").append(jobTotals.totalKnownBadCount.get()).append("
") //NON-NLS + .append(NbBundle.getMessage(this.getClass(), "HashDbIngestModule.complete.totalCalcTime")) + .append("").append(jobTotals.totalCalctime.get()).append("
") //NON-NLS + .append(NbBundle.getMessage(this.getClass(), "HashDbIngestModule.complete.totalLookupTime")) + .append("").append(jobTotals.totalLookuptime.get()).append("
"); //NON-NLS + + detailsSb.append("

") //NON-NLS + .append(NbBundle.getMessage(this.getClass(), "HashDbIngestModule.complete.databasesUsed")) + .append("

\n
    "); //NON-NLS + for (HashDb db : knownBadHashSets) { + detailsSb.append("
  • ").append(db.getHashSetName()).append("
  • \n"); //NON-NLS + } + + detailsSb.append("
"); //NON-NLS + + services.postMessage(IngestMessage.createMessage( + IngestMessage.MessageType.INFO, + HashLookupModuleFactory.getModuleName(), + NbBundle.getMessage(this.getClass(), + "HashDbIngestModule.complete.hashLookupResults"), + detailsSb.toString())); + } + } @Override public void shutDown(boolean ingestJobCancelled) { if (refCounter.decrementAndGet(jobId) == 0) { - if ((!knownBadHashSets.isEmpty()) || (!knownHashSets.isEmpty())) { - StringBuilder detailsSb = new StringBuilder(); - //details - detailsSb.append(""); //NON-NLS - - detailsSb.append(""); //NON-NLS - detailsSb.append(""); //NON-NLS - - detailsSb.append("\n"); //NON-NLS - detailsSb.append("\n"); //NON-NLS - detailsSb.append("
") //NON-NLS - .append(NbBundle.getMessage(this.getClass(), "HashDbIngestModule.complete.knownBadsFound")) - .append("").append(totalKnownBadCount.get()).append("
") //NON-NLS - .append(NbBundle.getMessage(this.getClass(), "HashDbIngestModule.complete.totalCalcTime")) - .append("").append(totalCalctime.get()).append("
") //NON-NLS - .append(NbBundle.getMessage(this.getClass(), "HashDbIngestModule.complete.totalLookupTime")) - .append("").append(totalLookuptime.get()).append("
"); //NON-NLS - - detailsSb.append("

") //NON-NLS - .append(NbBundle.getMessage(this.getClass(), "HashDbIngestModule.complete.databasesUsed")) - .append("

\n
    "); //NON-NLS - for (HashDb db : knownBadHashSets) { - detailsSb.append("
  • ").append(db.getHashSetName()).append("
  • \n"); //NON-NLS - } - - detailsSb.append("
"); //NON-NLS - services.postMessage(IngestMessage.createMessage( - IngestMessage.MessageType.INFO, - HashLookupModuleFactory.getModuleName(), - NbBundle.getMessage(this.getClass(), - "HashDbIngestModule.complete.hashLookupResults"), - detailsSb.toString())); - } + postSummary(); } } } diff --git a/HashDatabase/src/org/sleuthkit/autopsy/hashdatabase/HashLookupModuleFactory.java b/HashDatabase/src/org/sleuthkit/autopsy/hashdatabase/HashLookupModuleFactory.java index ea3b3fa10c..554c79ee33 100755 --- a/HashDatabase/src/org/sleuthkit/autopsy/hashdatabase/HashLookupModuleFactory.java +++ b/HashDatabase/src/org/sleuthkit/autopsy/hashdatabase/HashLookupModuleFactory.java @@ -28,7 +28,7 @@ import org.sleuthkit.autopsy.ingest.FileIngestModule; import org.sleuthkit.autopsy.ingest.IngestModuleFactory; import org.sleuthkit.autopsy.ingest.IngestModuleIngestJobSettings; import org.sleuthkit.autopsy.ingest.IngestModuleIngestJobSettingsPanel; -import org.sleuthkit.autopsy.ingest.IngestModuleGlobalSetttingsPanel; +import org.sleuthkit.autopsy.ingest.IngestModuleGlobalSettingsPanel; /** * A factory that creates file ingest modules that do hash database lookups. @@ -99,7 +99,7 @@ public class HashLookupModuleFactory extends IngestModuleFactoryAdapter { } @Override - public IngestModuleGlobalSetttingsPanel getGlobalSettingsPanel() { + public IngestModuleGlobalSettingsPanel getGlobalSettingsPanel() { HashLookupSettingsPanel globalSettingsPanel = new HashLookupSettingsPanel(); globalSettingsPanel.load(); return globalSettingsPanel; diff --git a/HashDatabase/src/org/sleuthkit/autopsy/hashdatabase/HashLookupSettingsPanel.java b/HashDatabase/src/org/sleuthkit/autopsy/hashdatabase/HashLookupSettingsPanel.java index 62cc8f0792..7e901fbc71 100644 --- a/HashDatabase/src/org/sleuthkit/autopsy/hashdatabase/HashLookupSettingsPanel.java +++ b/HashDatabase/src/org/sleuthkit/autopsy/hashdatabase/HashLookupSettingsPanel.java @@ -45,13 +45,13 @@ import org.sleuthkit.autopsy.ingest.IngestManager; import org.sleuthkit.datamodel.TskCoreException; import org.sleuthkit.autopsy.hashdatabase.HashDbManager.HashDb; import org.sleuthkit.autopsy.hashdatabase.HashDbManager.HashDb.KnownFilesType; -import org.sleuthkit.autopsy.ingest.IngestModuleGlobalSetttingsPanel; +import org.sleuthkit.autopsy.ingest.IngestModuleGlobalSettingsPanel; /** * Instances of this class provide a comprehensive UI for managing the hash sets * configuration. */ -public final class HashLookupSettingsPanel extends IngestModuleGlobalSetttingsPanel implements OptionsPanel { +public final class HashLookupSettingsPanel extends IngestModuleGlobalSettingsPanel implements OptionsPanel { private static final String NO_SELECTION_TEXT = NbBundle .getMessage(HashLookupSettingsPanel.class, "HashDbConfigPanel.noSelectionText"); diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle.properties b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle.properties index 22c95f3bd4..30513b4c21 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle.properties +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle.properties @@ -280,3 +280,7 @@ KeywordSearchListsAbstract.writeLists.errMsg2.msg=A module caused an error liste KeywordSearchListsAbstract.deleteList.errMsg1.msg=A module caused an error listening to KeywordSearchListsAbstract updates. See log to determine which module. Some data could be incomplete. KeywordSearchListsManagementPanel.newKeywordListDescription=Keyword List <{0}> already exists as a read-only list. Do you want to replace it for the duration of the program (the change will not be persistent). KeywordSearchListsManagementPanel.newKeywordListDescription2=Keyword List <{0}> already exists, do you want to replace it? +DropdownSearchPanelgetQueryList.exception.msg=No list for single-keyword search +KeywordSearchModuleFactory.getIngestJobSettingsPanel.exception.msg=Expected settings argument to be instanceof KeywordSearchJobSettings +KeywordSearchModuleFactory.createFileIngestModule.exception.msg=Expected settings argument to be instanceof KeywordSearchJobSettings +SearchRunner.Searcher.done.err.msg=Error performing keyword search diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle_ja.properties b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle_ja.properties index 19cf99b2ac..419b184213 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle_ja.properties +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle_ja.properties @@ -31,13 +31,13 @@ KeywordSearchListsViewerPanel.manageListsButton.text=\u30EA\u30B9\u30C8\u3092\u7 KeywordSearchListsViewerPanel.ingestIndexLabel.text=\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u5316\u3055\u308C\u305F\u30D5\u30A1\u30A4\u30EB\uFF1A ExtractedContentPanel.pageButtonsLabel.text=\u30DA\u30FC\u30B8 ExtractedContentPanel.pagesLabel.text=\u30DA\u30FC\u30B8\uFF1A -KeywordSearchEditListPanel.ingestMessagesCheckbox.text=\u51E6\u7406\u4E2D\u306B\u30E1\u30C3\u30BB\u30FC\u30B8\u3092\u30A4\u30F3\u30DC\u30C3\u30AF\u30B9\u306B\u9001\u4FE1 -KeywordSearchEditListPanel.ingestMessagesCheckbox.toolTipText=\u3053\u306E\u30EA\u30B9\u30C8\u306E\u30AD\u30FC\u30EF\u30FC\u30C9\u304C\u691C\u7D22\u306B\u30D2\u30C3\u30C8\u3057\u305F\u5834\u5408\u3001\u51E6\u7406\u4E2D\u306B\u30E1\u30C3\u30BB\u30FC\u30B8\u3092\u30A4\u30F3\u30DC\u30C3\u30AF\u30B9\u306B\u9001\u4FE1 +KeywordSearchEditListPanel.ingestMessagesCheckbox.text=\u30D2\u30C3\u30C8\u6BCE\u306B\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u30A4\u30F3\u30DC\u30C3\u30AF\u30B9\u3078\u30E1\u30C3\u30BB\u30FC\u30B8\u3092\u9001\u4FE1 +KeywordSearchEditListPanel.ingestMessagesCheckbox.toolTipText=\u3053\u306E\u30EA\u30B9\u30C8\u306E\u30AD\u30FC\u30EF\u30FC\u30C9\u304C\u691C\u7D22\u306B\u30D2\u30C3\u30C8\u3057\u305F\u5834\u5408\u3001\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u4E2D\u306B\u30E1\u30C3\u30BB\u30FC\u30B8\u3092\u30A4\u30F3\u30DC\u30C3\u30AF\u30B9\u306B\u9001\u4FE1 KeywordSearchEditListPanel.keywordOptionsLabel.text=\u30AD\u30FC\u30EF\u30FC\u30C9\u30AA\u30D7\u30B7\u30E7\u30F3 KeywordSearchEditListPanel.listOptionsLabel.text=\u30EA\u30B9\u30C8\u30AA\u30D7\u30B7\u30E7\u30F3 KeywordSearchListsManagementPanel.keywordListsLabel.text=\u30AD\u30FC\u30EF\u30FC\u30C9\u30EA\u30B9\u30C8\uFF1A KeywordSearchEditListPanel.keywordsLabel.text=\u30AD\u30FC\u30EF\u30FC\u30C9\uFF1A -OpenIDE-Module-Short-Description=\u30AD\u30FC\u30EF\u30FC\u30C9\u691C\u7D22\u51E6\u7406\u30E2\u30B8\u30E5\u30FC\u30EB\u3001\u62BD\u51FA\u3055\u308C\u305F\u30C6\u30AD\u30B9\u30C8\u30D3\u30E5\u30FC\u30A2\u3001\u30AD\u30FC\u30EF\u30FC\u30C9\u691C\u7D22\u30C4\u30FC\u30EB +OpenIDE-Module-Short-Description=\u30AD\u30FC\u30EF\u30FC\u30C9\u691C\u7D22\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u30E2\u30B8\u30E5\u30FC\u30EB\u3001\u62BD\u51FA\u3055\u308C\u305F\u30C6\u30AD\u30B9\u30C8\u30D3\u30E5\u30FC\u30A2\u3001\u30AD\u30FC\u30EF\u30FC\u30C9\u691C\u7D22\u30C4\u30FC\u30EB KeywordSearchListsViewerPanel.manageListsButton.toolTipText=\u30AD\u30FC\u30EF\u30FC\u30C9\u30EA\u30B9\u30C8\u3001\u30EA\u30B9\u30C8\u306E\u8A2D\u5B9A\u3068\u95A2\u9023\u3059\u308B\u30AD\u30FC\u30EF\u30FC\u30C9\u306E\u7BA1\u7406\u3002\u3053\u306E\u8A2D\u5B9A\u306F\u5168\u3066\u306E\u30B1\u30FC\u30B9\u306B\u9069\u7528\u3055\u308C\u307E\u3059\u3002 AbstractKeywordSearchPerformer.search.dialogErrorHeader=\u30AD\u30FC\u30EF\u30FC\u30C9\u691C\u7D22\u30A8\u30E9\u30FC AbstractKeywordSearchPerformer.search.invalidSyntaxHeader=\u30B7\u30F3\u30BF\u30C3\u30AF\u30B9\u30A8\u30E9\u30FC @@ -46,13 +46,13 @@ AbstractKeywordSearchPerformer.search.ingestInProgressBody=\u30AD\u30FC\u3 AbstractKeywordSearchPerformer.search.emptyKeywordErrorBody=\u30AD\u30FC\u30EF\u30FC\u30C9\u30EA\u30B9\u30C8\u304C\u7A7A\u767D\u3067\u3059\u3002\u6700\u4F4E\uFF11\u3064\u30AD\u30FC\u30EF\u30FC\u30C9\u3092\u8FFD\u52A0\u3057\u3066\u4E0B\u3055\u3044\u3002 AbstractKeywordSearchPerformer.search.pleaseEnterKeywordBody=\u691C\u7D22\u3059\u308B\u30AD\u30FC\u30EF\u30FC\u30C9\u3092\u5165\u529B\u3057\u3066\u4E0B\u3055\u3044 AbstractKeywordSearchPerformer.search.noFilesInIdxMsg=\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u306B\u307E\u3060\u30D5\u30A1\u30A4\u30EB\u304C\u3042\u308A\u307E\u305B\u3093\u3002
\u3057\u3070\u3089\u304F\u3057\u3066\u304B\u3089\u3001\u518D\u5EA6\u5B9F\u884C\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u306F\u3000{0}\u3000\u5206\u6BCE\u66F4\u65B0\u3055\u308C\u307E\u3059\u3002 -AbstractKeywordSearchPerformer.search.noFilesIdxdMsg=\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u5316\u3055\u308C\u305F\u30D5\u30A1\u30A4\u30EB\u304C\u3042\u308A\u307E\u305B\u3093\u3002
\u30AD\u30FC\u30EF\u30FC\u30C9\u691C\u7D22\u30E2\u30B8\u30E5\u30FC\u30EB\u3092\u6709\u52B9\u5316\u3057\u3066\u30A4\u30E1\u30FC\u30B8\u3092\u518D\u51E6\u7406\u3002 +AbstractKeywordSearchPerformer.search.noFilesIdxdMsg=\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u5316\u3055\u308C\u305F\u30D5\u30A1\u30A4\u30EB\u304C\u3042\u308A\u307E\u305B\u3093\u3002
\u30AD\u30FC\u30EF\u30FC\u30C9\u691C\u7D22\u30E2\u30B8\u30E5\u30FC\u30EB\u3092\u6709\u52B9\u5316\u3057\u3066\u30A4\u30E1\u30FC\u30B8\u3092\u518D\u5EA6\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u3002 ExtractedContentPanel.setMarkup.panelTxt=\u30C6\u30AD\u30B9\u30C8\u30ED\u30FC\u30C9\u4E2D\u3002\u3057\u3070\u3089\u304F\u304A\u5F85\u3061\u304F\u3060\u3055\u3044... ExtractedContentViewer.toString=\u62BD\u51FA\u3055\u308C\u305F\u30C6\u30AD\u30B9\u30C8 -ExtractedContentViewer.toolTip=\u30D5\u30A1\u30A4\u30EB\u3084\u30AD\u30FC\u30EF\u30FC\u30C9\u691C\u7D22\u7D50\u679C\u304B\u3089\u62BD\u51FA\u3055\u308C\u305F\u30C6\u30AD\u30B9\u30C8\u3092\u8868\u793A\u3002\u3053\u306E\u30D3\u30E5\u30FC\u30A2\u3092\u30A2\u30AF\u30C6\u30A3\u30D9\u30A4\u30C8\u3059\u308B\u306B\u306F\u3001\u30AD\u30FC\u30EF\u30FC\u30C9\u691C\u7D22\u51E6\u7406\u3092\u30D5\u30A1\u30A4\u30EB\u4E0A\u3067\u5B9F\u884C\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002 +ExtractedContentViewer.toolTip=\u30D5\u30A1\u30A4\u30EB\u3084\u30AD\u30FC\u30EF\u30FC\u30C9\u691C\u7D22\u7D50\u679C\u304B\u3089\u62BD\u51FA\u3055\u308C\u305F\u30C6\u30AD\u30B9\u30C8\u3092\u8868\u793A\u3002\u3053\u306E\u30D3\u30E5\u30FC\u30A2\u3092\u30A2\u30AF\u30C6\u30A3\u30D9\u30A4\u30C8\u3059\u308B\u306B\u306F\u3001\u30AD\u30FC\u30EF\u30FC\u30C9\u691C\u7D22\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u3092\u30D5\u30A1\u30A4\u30EB\u4E0A\u3067\u5B9F\u884C\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002 ExtractedContentViewer.getTitle=\u30C6\u30AD\u30B9\u30C8 ExtractedContentViewer.getSolrContent.knownFileMsg=

{0}\u306F\u65E2\u77E5\u30D5\u30A1\u30A4\u30EB\u3067\u3059\uFF08MDS\u30CF\u30C3\u30B7\u30E5\u306B\u57FA\u3065\u304F\u3068\uFF09\u3002\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u306B\u30C6\u30AD\u30B9\u30C8\u304C\u3042\u308A\u307E\u305B\u3093\u3002

-ExtractedContentViewer.getSolrContent.noTxtYetMsg=

{0}\u306E\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u306B\u30C6\u30AD\u30B9\u30C8\u304C\u3042\u308A\u307E\u305B\u3093\u3002
\u30C6\u30AD\u30B9\u30C8\u304C\u7121\u3044\u304B\u3001\u307E\u3060\u89E3\u6790\u3055\u308C\u3066\u3044\u306A\u3044\u304B\u3001\u30AD\u30FC\u30EF\u30FC\u30C9\u691C\u7D22\u304C\u51E6\u7406\u4E2D\u306B\u6709\u52B9\u5316\u3055\u308C\u3066\u3044\u306A\u304B\u3063\u305F\u306E\u304B\u3082\u3057\u308C\u307E\u305B\u3093\u3002

+ExtractedContentViewer.getSolrContent.noTxtYetMsg=

{0}\u306E\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u306B\u30C6\u30AD\u30B9\u30C8\u304C\u3042\u308A\u307E\u305B\u3093\u3002
\u30C6\u30AD\u30B9\u30C8\u304C\u7121\u3044\u304B\u3001\u307E\u3060\u89E3\u6790\u3055\u308C\u3066\u3044\u306A\u3044\u304B\u3001\u30AD\u30FC\u30EF\u30FC\u30C9\u691C\u7D22\u304C\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u4E2D\u306B\u6709\u52B9\u5316\u3055\u308C\u3066\u3044\u306A\u304B\u3063\u305F\u306E\u304B\u3082\u3057\u308C\u307E\u305B\u3093\u3002

HighlightedMatchesSource.getMarkup.noMatchMsg=
\u3053\u306E\u30DA\u30FC\u30B8\u4E0A\u3067\u30AD\u30FC\u30EF\u30FC\u30C9\u304C\u30D2\u30C3\u30C8\u3057\u307E\u305B\u3093\u3067\u3057\u305F\u3002
\u30AD\u30FC\u30EF\u30FC\u30C9\u304C\u30D5\u30A1\u30A4\u30EB\u540D\u306B\u542B\u307E\u308C\u3066\u3044\u305F\u304B\u3082\u3057\u308C\u307E\u305B\u3093\u3002
\u5225\u306E\u30DA\u30FC\u30B8\u306B\u79FB\u52D5\u3059\u308B\u304B\u3001\u30AA\u30EA\u30B8\u30CA\u30EB\u30C6\u30AD\u30B9\u30C8\u3092\u8868\u793A\u3059\u308B\u306E\u306B\u3001\u300C\u62BD\u51FA\u3055\u308C\u305F\u30C6\u30AD\u30B9\u30C8\u300D\u3092\u9078\u629E\u3057\u3066\u4E0B\u3055\u3044\u3002
HighlightedMatchesSource.toString=\u691C\u7D22\u7D50\u679C Installer.reportPortError=\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u30B5\u30FC\u30D0\u30FC\u30DD\u30FC\u30C8 {0} \u306F\u5229\u7528\u3067\u304D\u307E\u305B\u3093\u3002\u4F7F\u7528\u3057\u3066\u3044\u308B\u30BB\u30AD\u30E5\u30EA\u30C6\u30A3\u30BD\u30D5\u30C8\u30A6\u30A7\u30A2\u304C {1} \u3092\u30D6\u30ED\u30C3\u30AF\u3057\u3066\u3044\u306A\u3044\u304B\u78BA\u8A8D\u3057\u3001\u30A2\u30D7\u30EA\u30B1\u30FC\u30B7\u30E7\u30F3\u30E6\u30FC\u30B6\u30FC\u30D5\u30A9\u30EB\u30C0\u30FC\u5185\u306E {3} \u306E {2} \u306E\u30D7\u30ED\u30D1\u30C6\u30A3\u30D5\u30A1\u30A4\u30EB\u306E\u5909\u66F4\u3092\u691C\u8A0E\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u3082\u3057\u4ED6\u306E\u51E6\u7406\u304C\u554F\u984C\u306E\u539F\u56E0\u3067\u3042\u308C\u3070\u3001\u30B7\u30B9\u30C6\u30E0\u3092\u518D\u8D77\u52D5\u3057\u3066\u4E0B\u3055\u3044\u3002 @@ -64,7 +64,7 @@ KeywordSearchConfigurationPanel.customizeComponents.listTabTitle=\u30EA\u30B9\u3 KeywordSearchConfigurationPanel.customizeComponents.stringExtTitle=\u30B9\u30C8\u30EA\u30F3\u30B0\u62BD\u51FA KeywordSearchConfigurationPanel.customizeComponents.genTabTitle=\u4E00\u822C KeywordSearchConfigurationPanel.customizeComponents.listLabToolTip=\u30EA\u30B9\u30C8\u8A2D\u5B9A -KeywordSearchConfigurationPanel.customizeComponents.stringExtToolTip=\u30AD\u30FC\u30EF\u30FC\u30C9\u691C\u7D22\u51E6\u7406\u306E\u30B9\u30C8\u30EA\u30F3\u30B0\u62BD\u51FA\u8A2D\u5B9A +KeywordSearchConfigurationPanel.customizeComponents.stringExtToolTip=\u30AD\u30FC\u30EF\u30FC\u30C9\u691C\u7D22\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u306E\u30B9\u30C8\u30EA\u30F3\u30B0\u62BD\u51FA\u8A2D\u5B9A KeywordSearchConfigurationPanel.customizeComponents.genTabToolTip=\u4E00\u822C\u8A2D\u5B9A KeywordSearchConfigurationPanel1.customizeComponents.title=\u30AD\u30FC\u30EF\u30FC\u30C9\u30EA\u30B9\u30C8\u3092\u524A\u9664 KeywordSearchConfigurationPanel1.customizeComponents.body=\u5168\u3066\u306E\u30B1\u30FC\u30B9\u306B\u304A\u3051\u308B\u30AD\u30FC\u30EF\u30FC\u30C9\u30EA\u30B9\u30C8\u3092\u524A\u9664\u3057\u307E\u3059\u3002\u3053\u306E\u524A\u9664\u3092\u5B9F\u884C\u3057\u307E\u3059\u304B\uFF1F @@ -92,10 +92,10 @@ KeywordSearchEditListPanel.exportButtonActionPerformed.regExColName=\u6B63\u898F KeywordSearchFilterNode.getFileActions.openExternViewActLbl=\u5916\u90E8\u30D3\u30E5\u30FC\u30A2\u3067\u958B\u304F KeywordSearchFilterNode.getFileActions.searchSameMd5=\u540C\u4E00\u306EMD5\u30CF\u30C3\u30B7\u30E5\u3092\u6301\u3064\u30D5\u30A1\u30A4\u30EB\u3092\u691C\u7D22 KeywordSearchFilterNode.getFileActions.viewInNewWinActionLbl=\u65B0\u3057\u3044\u30A6\u30A3\u30F3\u30C9\u30A6\u3067\u8868\u793A -KeywordSearchIngestModule.init.badInitMsg=\u30AD\u30FC\u30EF\u30FC\u30C9\u691C\u7D22\u30B5\u30FC\u30D0\u30FC\u304C\u6B63\u3057\u304F\u8D77\u52D5\u3057\u307E\u305B\u3093\u3067\u3057\u305F\u3002\u30AD\u30FC\u30EF\u30FC\u30C9\u691C\u7D22\u51E6\u7406\u3092\u5B9F\u884C\u3067\u304D\u307E\u305B\u3093\u3002 -KeywordSearchIngestModule.init.tryStopSolrMsg={0}
\u53E4\u3044java Solr\u51E6\u7406\u3092\u505C\u6B62\u3057\uFF08\u5B58\u5728\u3059\u308C\u3070\uFF09\u3001\u30A2\u30D7\u30EA\u30B1\u30FC\u30B7\u30E7\u30F3\u3092\u518D\u8D77\u52D5\u3057\u3066\u304F\u3060\u3055\u3044\u3002 +KeywordSearchIngestModule.init.badInitMsg=\u30AD\u30FC\u30EF\u30FC\u30C9\u691C\u7D22\u30B5\u30FC\u30D0\u30FC\u304C\u6B63\u3057\u304F\u8D77\u52D5\u3057\u307E\u305B\u3093\u3067\u3057\u305F\u3002\u30AD\u30FC\u30EF\u30FC\u30C9\u691C\u7D22\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u3092\u5B9F\u884C\u3067\u304D\u307E\u305B\u3093\u3002 +KeywordSearchIngestModule.init.tryStopSolrMsg={0}
\u53E4\u3044java Solr\u51E6\u7406\u3092\uFF08\u5B58\u5728\u3059\u308C\u3070\uFF09\u505C\u6B62\u3057\u3001\u30A2\u30D7\u30EA\u30B1\u30FC\u30B7\u30E7\u30F3\u3092\u518D\u8D77\u52D5\u3057\u3066\u304F\u3060\u3055\u3044\u3002 KeywordSearchIngestModule.init.noKwInLstMsg=\u30AD\u30FC\u30EF\u30FC\u30C9\u30EA\u30B9\u30C8\u306B\u30AD\u30FC\u30EF\u30FC\u30C9\u304C\u3042\u308A\u307E\u305B\u3093\u3002 -KeywordSearchIngestModule.init.onlyIdxKwSkipMsg=\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u5316\u3060\u3051\u5B9F\u884C\u3055\u308C\u3001\u30AD\u30FC\u30EF\u30FC\u30C9\u691C\u7D22\u306F\u30B9\u30AD\u30C3\u30D7\u3055\u308C\u307E\u3059\uFF08\u300C\u30AD\u30FC\u30EF\u30FC\u30C9\u30EA\u30B9\u30C8 - \u51E6\u7406\u306B\u8FFD\u52A0\u300D\u3092\u4F7F\u7528\u3057\u3001\u30AD\u30FC\u30EF\u30FC\u30C9\u30EA\u30B9\u30C8\u3092\u8FFD\u52A0\u3059\u308B\u306E\u306F\u53EF\u80FD\u3067\u3059 +KeywordSearchIngestModule.init.onlyIdxKwSkipMsg=\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u5316\u3060\u3051\u5B9F\u884C\u3055\u308C\u3001\u30AD\u30FC\u30EF\u30FC\u30C9\u691C\u7D22\u306F\u30B9\u30AD\u30C3\u30D7\u3055\u308C\u307E\u3059\uFF08\u300C\u30AD\u30FC\u30EF\u30FC\u30C9\u30EA\u30B9\u30C8 - \u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u306B\u8FFD\u52A0\u300D\u3092\u4F7F\u7528\u3057\u3001\u30AD\u30FC\u30EF\u30FC\u30C9\u30EA\u30B9\u30C8\u3092\u8FFD\u52A0\u3059\u308B\u306E\u306F\u53EF\u80FD\u3067\u3059 KeywordSearchIngestModule.postIndexSummary.knowFileHeaderLbl=\u65E2\u77E5\u30BF\u30A4\u30D7\u306E\u30D5\u30A1\u30A4\u30EB KeywordSearchIngestModule.postIndexSummary.fileGenStringsHead=\u4E00\u822C\u7684\u306A\u30B9\u30C8\u30EA\u30F3\u30B0\u304C\u62BD\u51FA\u3055\u308C\u305F\u30D5\u30A1\u30A4\u30EB KeywordSearchIngestModule.postIndexSummary.mdOnlyLbl=\u30E1\u30BF\u30C7\u30FC\u30BF\u306E\u307F\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u5316\u3055\u308C\u307E\u3057\u305F @@ -104,14 +104,14 @@ KeywordSearchIngestModule.postIndexSummary.errTxtLbl=\u30A8\u30E9\u30FC\uFF08\u3 KeywordSearchIngestModule.postIndexSummary.errIoLbl=\u30A8\u30E9\u30FC\uFF08I/O\uFF09 KeywordSearchIngestModule.postIndexSummary.kwIdxResultsLbl=\u30AD\u30FC\u30EF\u30FC\u30C9\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u5316\u7D50\u679C KeywordSearchIngestModule.postIndexSummary.kwIdxErrsTitle=\u30AD\u30FC\u30EF\u30FC\u30C9\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u5316\u30A8\u30E9\u30FC -KeywordSearchIngestModule.postIndexSummary.kwIdxErrMsgFiles=\u30AD\u30FC\u30EF\u30FC\u30C9\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u30B5\u30FC\u30D3\u30B9\u4E2D\u306B{0}\u30D5\u30A1\u30A4\u30EB\u306E\u51E6\u7406\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002 +KeywordSearchIngestModule.postIndexSummary.kwIdxErrMsgFiles=\u30AD\u30FC\u30EF\u30FC\u30C9\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u30B5\u30FC\u30D3\u30B9\u4E2D\u306B{0}\u30D5\u30A1\u30A4\u30EB\u306E\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002 KeywordSearchIngestModule.postIndexSummary.kwIdxWarnMsgTitle=\u30AD\u30FC\u30EF\u30FC\u30C9\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u5316\u8B66\u544A KeywordSearchIngestModule.postIndexSummary.idxErrReadFilesMsg=\u30AD\u30FC\u30EF\u30FC\u30C9\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u30B5\u30FC\u30D3\u30B9\u4E2D\u306B\u30D5\u30A1\u30A4\u30EB\u306E\u8AAD\u307F\u8FBC\u307F\u3084\u30C6\u30AD\u30B9\u30C8\u62BD\u51FA\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002\u539F\u56E0\u306F\u7834\u640D\u3057\u305F\u30E1\u30C7\u30A3\u30A2\u3084\u30D5\u30A1\u30A4\u30EB\u304B\u3082\u3057\u308C\u307E\u305B\u3093\u3002 -KeywordSearchListsViewerPanel.initIngest.addIngestTitle=\u51E6\u7406\u306B\u8FFD\u52A0 -KeywordSearchListsViewerPanel.initIngest.addIngestMsg=\u8FFD\u52A0\u306E\u30AD\u30FC\u30EF\u30FC\u30C9\u30EA\u30B9\u30C8\u3092\u9078\u629E\u3067\u304D\u307E\u3059
\u305D\u3057\u3066\u5B9F\u884C\u4E2D\u306E\u51E6\u7406\u306B\u8FFD\u52A0\u3067\u304D\u307E\u3059
\u6B21\u56DE\u306E\u30D5\u30A1\u30A4\u30EB\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u518D\u69CB\u7BC9\u306E\u3068\u304D\u306B\u9078\u629E\u3055\u308C\u305F\u30EA\u30B9\u30C8\u3082\u691C\u7D22\u3055\u308C\u307E\u3059\u3002 +KeywordSearchListsViewerPanel.initIngest.addIngestTitle=\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u306B\u8FFD\u52A0 +KeywordSearchListsViewerPanel.initIngest.addIngestMsg=\u8FFD\u52A0\u306E\u30AD\u30FC\u30EF\u30FC\u30C9\u30EA\u30B9\u30C8\u3092\u9078\u629E\u3067\u304D\u307E\u3059
\u305D\u3057\u3066\u5B9F\u884C\u4E2D\u306E\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u306B\u8FFD\u52A0\u3067\u304D\u307E\u3059
\u6B21\u56DE\u306E\u30D5\u30A1\u30A4\u30EB\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u518D\u69CB\u7BC9\u306E\u3068\u304D\u306B\u9078\u629E\u3055\u308C\u305F\u30EA\u30B9\u30C8\u3082\u691C\u7D22\u3055\u308C\u307E\u3059\u3002 KeywordSearchListsViewerPanel.initIngest.searchIngestTitle=\u691C\u7D22 KeywordSearchListsViewerPanel.initIngest.addIdxSearchMsg=\u9078\u629E\u3057\u305F\u30EA\u30B9\u30C8\u5185\u306E\u30AD\u30FC\u30EF\u30FC\u30C9\u3092\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u5316\u3055\u308C\u305F\u30D5\u30A1\u30A4\u30EB\u5185\u3067\u691C\u7D22 -KeywordSearchListsViewerPanel.initIngest.ongoingIngestMsg=\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u5316\u3055\u308C\u305F\u30D5\u30A1\u30A4\u30EB\uFF1A {0} \uFF08\u51E6\u7406\u306F\u5B9F\u884C\u4E2D\uFF09 +KeywordSearchListsViewerPanel.initIngest.ongoingIngestMsg=\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u5316\u3055\u308C\u305F\u30D5\u30A1\u30A4\u30EB\uFF1A {0} \uFF08\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u306F\u5B9F\u884C\u4E2D\uFF09 KeywordSearchListsViewerPanel.initIngest.fileIndexCtMsg=\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u5316\u3055\u308C\u305F\u30D5\u30A1\u30A4\u30EB\uFF1A {0} KeywordSearch.selectedColLbl=\u9078\u629E\u6E08\u307F KeywordSearch.nameColLbl=\u540D\u524D @@ -139,7 +139,7 @@ ExtractedContentPanel.pagePreviousButton.actionCommand= ExtractedContentPanel.pageOfLabel.text=of ExtractedContentPanel.pageCurLabel.text=- ExtractedContentPanel.pageTotalLabel.text=- -AbstractFileChunk.index.exception.msg=\u30D5\u30A1\u30A4\u30EB\u30B9\u30C8\u30EA\u30F3\u30B0\u30C1\u30E3\u30F3\u30AF\u306E\u51E6\u7406\u4E2D\u306B\u554F\u984C\u304C\u767A\u751F\u3057\u307E\u3057\u305F\uFF1A {0}, \u30C1\u30E3\u30F3\u30AF\: {1} +AbstractFileChunk.index.exception.msg=\u30D5\u30A1\u30A4\u30EB\u30B9\u30C8\u30EA\u30F3\u30B0\u30C1\u30E3\u30F3\u30AF\u306E\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u4E2D\u306B\u554F\u984C\u304C\u767A\u751F\u3057\u307E\u3057\u305F\uFF1A {0}, \u30C1\u30E3\u30F3\u30AF\: {1} AbstractFileStringContentStream.getSize.exception.msg=\u30B9\u30C8\u30EA\u30F3\u30B0\u5168\u4F53\u304C\u5909\u63DB\u3055\u308C\u306A\u3051\u308C\u3070\u3001\u5909\u63DB\u3055\u308C\u305F\u30B9\u30C8\u30EA\u30F3\u30B0\u5185\u306E\u30AD\u30E3\u30E9\u30AF\u30BF\u30FC\u6570\u306F\u4E0D\u660E\u3067\u3059\u3002 AbstractFileStringContentStream.getSrcInfo.text=\u30D5\u30A1\u30A4\u30EB\uFF1A{0} ByteContentStream.getSrcInfo.text=\u30D5\u30A1\u30A4\u30EB\uFF1A{0} @@ -158,7 +158,7 @@ HighlightedMatchesSource.nextItem.exception.msg=\u6B21\u306E\u30A2\u30A4\u30C6\u HighlightedMatchesSource.previousItem.exception.msg=\u524D\u306E\u30A2\u30A4\u30C6\u30E0\u304C\u3042\u308A\u307E\u305B\u3093\u3002 Ingester.ingest.exception.unknownImgId.msg=\u4E0B\u8A18\u306E\u30D5\u30A1\u30A4\u30EB\u306E\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u5316\u3092\u30B9\u30AD\u30C3\u30D7\u3057\u3066\u3044\u307E\u3059\u3002\u4E0D\u660E\u306A\u30A4\u30E1\u30FC\u30B8ID\uFF1A{0} Ingester.ingest.exception.cantReadStream.msg=\u30B3\u30F3\u30C6\u30F3\u30C4\u30B9\u30C8\u30EA\u30FC\u30E0\u3092\u8AAD\u307F\u53D6\u308C\u307E\u305B\u3093\u3067\u3057\u305F\uFF1A{0} -Ingester.ingest.exception.err.msg=\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u51E6\u7406\u4E2D\u306E\u30A8\u30E9\u30FC\uFF1A{0} +Ingester.ingest.exception.err.msg=\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u306E\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u4E2D\u306E\u30A8\u30E9\u30FC\uFF1A{0} Ingester.ingestExtract.exception.solrTimeout.msg=\u4E0B\u8A18\u306EID\u306B\u5BFE\u3059\u308B\u3001Solr\u306E\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u5316\u30EA\u30AF\u30A8\u30B9\u30C8\u306F\u30BF\u30A4\u30E0\u30A2\u30A6\u30C8\u3057\u307E\u3057\u305F\uFF1A{0}, \u540D\u524D\: {1} Ingester.ingestExtract.exception.probPostToSolr.msg=Solr\u306B\u30B3\u30F3\u30C6\u30F3\u30C4\u3092\u30DD\u30B9\u30C8\u3059\u308B\u306E\u306B\u554F\u984C\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002ID\uFF1A{0}, \u540D\u524D\: {1} Ingester.UpReqestTask.run.exception.sorlNotAvail.msg=Solr\u30B3\u30A2\u304C\u5229\u7528\u4E0D\u53EF\u3067\u3059\u3002\u30B3\u30F3\u30C6\u30F3\u30C4\u3092\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u5316\u3067\u304D\u307E\u305B\u3093\u3002 @@ -220,29 +220,29 @@ Keyword.toString.text=Keyword'{'query\={0}, isLiteral\={1}, keywordType\={2}'}' KeywordSearchJobSettingsPanel.keywordSearchEncodings.text=- KeywordSearchJobSettingsPanel.languagesValLabel.text=- KeywordSearchJobSettingsPanel.encodingsLabel.text=\u30A8\u30F3\u30B3\u30FC\u30C7\u30A3\u30F3\u30B0\uFF1A -KeywordSearchJobSettingsPanel.titleLabel.text=\u51E6\u7406\u4E2D\u306B\u6709\u52B9\u306A\u30AD\u30FC\u30EF\u30FC\u30C9\u30EA\u30B9\u30C8\u3092\u9078\u629E\uFF1A +KeywordSearchJobSettingsPanel.titleLabel.text=\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u4E2D\u306B\u6709\u52B9\u306A\u30AD\u30FC\u30EF\u30FC\u30C9\u30EA\u30B9\u30C8\u3092\u9078\u629E\uFF1A KeywordSearchJobSettingsPanel.languagesLabel.toolTipText=\u4E0D\u660E\u306A\u30D5\u30A1\u30A4\u30EB\u30BF\u30A4\u30D7\u304B\u3089\u306E\u30B9\u30C8\u30EA\u30F3\u30B0\u62BD\u51FA\u3092\u6709\u52B9\u306B\u3057\u305F\u30B9\u30AF\u30EA\u30D7\u30C8\u3002\u30A2\u30C9\u30D0\u30F3\u30B9\u8A2D\u5B9A\u304B\u3089\u5909\u66F4\u304C\u53EF\u80FD\u3067\u3059\u3002 KeywordSearchJobSettingsPanel.languagesLabel.text=\u4E0D\u660E\u306A\u30D5\u30A1\u30A4\u30EB\u30BF\u30A4\u30D7\u304B\u3089\u306E\u30B9\u30C8\u30EA\u30F3\u30B0\u62BD\u51FA\u3092\u6709\u52B9\u306B\u3057\u305F\u30B9\u30AF\u30EA\u30D7\u30C8\uFF1A KeywordSearchGlobalLanguageSettingsPanel.enableUTF8Checkbox.text=UTF8\u30C6\u30AD\u30B9\u30C8\u62BD\u51FA\u306E\u6709\u52B9\u5316 -KeywordSearchGlobalLanguageSettingsPanel.ingestSettingsLabel.text=\u4E0D\u660E\u306A\u30D5\u30A1\u30A4\u30EB\u30BF\u30A4\u30D7\u304B\u3089\u306E\u30B9\u30C8\u30EA\u30F3\u30B0\u62BD\u51FA\u306E\u51E6\u7406\u65B9\u6CD5\u306E\u8A2D\u5B9A\uFF08\u5909\u66F4\u306F\u6B21\u56DE\u306E\u51E6\u7406\u304B\u3089\u6709\u52B9\uFF09\uFF1A +KeywordSearchGlobalLanguageSettingsPanel.ingestSettingsLabel.text=\u4E0D\u660E\u306A\u30D5\u30A1\u30A4\u30EB\u30BF\u30A4\u30D7\u304B\u3089\u306E\u30B9\u30C8\u30EA\u30F3\u30B0\u62BD\u51FA\u306E\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u8A2D\u5B9A\uFF08\u5909\u66F4\u306F\u6B21\u56DE\u306E\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u304B\u3089\u6709\u52B9\uFF09\uFF1A KeywordSearchGlobalLanguageSettingsPanel.enableUTF16Checkbox.text=UTF16LE\u3068UTF16BE\u30B9\u30C8\u30EA\u30F3\u30B0\u62BD\u51FA\u306E\u6709\u52B9\u5316 KeywordSearchGlobalLanguageSettingsPanel.languagesLabel.text=\u6709\u52B9\u306A\u30B9\u30AF\u30EA\u30D7\u30C8\uFF08\u8A00\u8A9E\uFF09\uFF1A -KeywordSearchGlobalSearchSettingsPanel.timeRadioButton1.toolTipText=\uFF12\uFF10\u5206\uFF08\u6700\u77ED\u306E\u51E6\u7406\u6642\u9593\uFF09 -KeywordSearchGlobalSearchSettingsPanel.timeRadioButton1.text=\uFF12\uFF10\u5206\uFF08\u6700\u3082\u9045\u3044\u30D5\u30A3\u30FC\u30C9\u30D0\u30C3\u30AF\u3001\u6700\u77ED\u306E\u51E6\u7406\u6642\u9593\uFF09 -KeywordSearchGlobalSearchSettingsPanel.timeRadioButton2.toolTipText=\uFF11\uFF10\u5206\uFF08\u30C7\u30D5\u30A9\u30EB\u30C8\u3088\u308A\u5168\u4F53\u7684\u306B\u901F\u3044\u51E6\u7406\u6642\u9593\uFF09 -KeywordSearchGlobalSearchSettingsPanel.timeRadioButton2.text=\uFF11\uFF10\u5206\uFF08\u3088\u308A\u9045\u3044\u30D5\u30A3\u30FC\u30C9\u30D0\u30C3\u30AF\u3001\u3088\u308A\u901F\u3044\u51E6\u7406\u6642\u9593\uFF09 -KeywordSearchGlobalSearchSettingsPanel.frequencyLabel.text=\u51E6\u7406\u4E2D\u306E\u7D50\u679C\u66F4\u65B0\u306E\u983B\u5EA6\uFF1A -KeywordSearchGlobalSearchSettingsPanel.skipNSRLCheckBox.toolTipText=Hash DB\u30B5\u30FC\u30D3\u30B9\u3092\u4E8B\u524D\u306B\u5B9F\u884C\u3059\u308B\u304B\u3001\u6B21\u56DE\u306E\u51E6\u7406\u306B\u9078\u629E\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002 -KeywordSearchGlobalSearchSettingsPanel.skipNSRLCheckBox.text=\u51E6\u7406\u4E2D\u306BNSRL\u306E\u30D5\u30A1\u30A4\u30EB\uFF08\u65E2\u77E5\u306E\u30D5\u30A1\u30A4\u30EB\uFF09\u3092\u30AD\u30FC\u30EF\u30FC\u30C9\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u306B\u8FFD\u52A0\u3057\u306A\u3044 +KeywordSearchGlobalSearchSettingsPanel.timeRadioButton1.toolTipText=\uFF12\uFF10\u5206\uFF08\u6700\u77ED\u306E\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u6642\u9593\uFF09 +KeywordSearchGlobalSearchSettingsPanel.timeRadioButton1.text=\uFF12\uFF10\u5206\uFF08\u6700\u3082\u9045\u3044\u30D5\u30A3\u30FC\u30C9\u30D0\u30C3\u30AF\u3001\u6700\u77ED\u306E\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u6642\u9593\uFF09 +KeywordSearchGlobalSearchSettingsPanel.timeRadioButton2.toolTipText=\uFF11\uFF10\u5206\uFF08\u30C7\u30D5\u30A9\u30EB\u30C8\u3088\u308A\u5168\u4F53\u7684\u306B\u901F\u3044\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u6642\u9593\uFF09 +KeywordSearchGlobalSearchSettingsPanel.timeRadioButton2.text=\uFF11\uFF10\u5206\uFF08\u3088\u308A\u9045\u3044\u30D5\u30A3\u30FC\u30C9\u30D0\u30C3\u30AF\u3001\u3088\u308A\u901F\u3044\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u6642\u9593\uFF09 +KeywordSearchGlobalSearchSettingsPanel.frequencyLabel.text=\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u4E2D\u306E\u7D50\u679C\u66F4\u65B0\u306E\u983B\u5EA6\uFF1A +KeywordSearchGlobalSearchSettingsPanel.skipNSRLCheckBox.toolTipText=Hash DB\u30B5\u30FC\u30D3\u30B9\u3092\u4E8B\u524D\u306B\u5B9F\u884C\u3059\u308B\u304B\u3001\u6B21\u56DE\u306E\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u306B\u9078\u629E\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002 +KeywordSearchGlobalSearchSettingsPanel.skipNSRLCheckBox.text=\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u4E2D\u306BNSRL\u306E\u30D5\u30A1\u30A4\u30EB\uFF08\u65E2\u77E5\u306E\u30D5\u30A1\u30A4\u30EB\uFF09\u3092\u30AD\u30FC\u30EF\u30FC\u30C9\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u306B\u8FFD\u52A0\u3057\u306A\u3044 KeywordSearchGlobalSearchSettingsPanel.informationLabel.text=\u60C5\u5831 KeywordSearchGlobalSearchSettingsPanel.settingsLabel.text=\u8A2D\u5B9A KeywordSearchGlobalSearchSettingsPanel.filesIndexedValue.text=- KeywordSearchGlobalSearchSettingsPanel.filesIndexedLabel.text=\u30AD\u30FC\u30EF\u30FC\u30C9\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u5185\u306E\u30D5\u30A1\u30A4\u30EB\uFF1A KeywordSearchGlobalSearchSettingsPanel.chunksValLabel.text=- -KeywordSearchGlobalSearchSettingsPanel.timeRadioButton4.toolTipText=\uFF11\u5206\uFF08\u5168\u4F53\u7684\u306A\u51E6\u7406\u6642\u9593\u304C\u9577\u304F\u306A\u308A\u307E\u3059\uFF09 -KeywordSearchGlobalSearchSettingsPanel.timeRadioButton4.text_1=\uFF11\u5206\uFF08\u3088\u308A\u901F\u3044\u30D5\u30A3\u30FC\u30C9\u30D0\u30C3\u30AF\u3001\u6700\u3082\u9577\u3044\u51E6\u7406\u6642\u9593\uFF09 +KeywordSearchGlobalSearchSettingsPanel.timeRadioButton4.toolTipText=\uFF11\u5206\uFF08\u5168\u4F53\u7684\u306A\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u6642\u9593\u304C\u9577\u304F\u306A\u308A\u307E\u3059\uFF09 +KeywordSearchGlobalSearchSettingsPanel.timeRadioButton4.text_1=\uFF11\u5206\uFF08\u3088\u308A\u901F\u3044\u30D5\u30A3\u30FC\u30C9\u30D0\u30C3\u30AF\u3001\u6700\u3082\u9577\u3044\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u6642\u9593\uFF09 KeywordSearchGlobalSearchSettingsPanel.chunksLabel.text=\u30AD\u30FC\u30EF\u30FC\u30C9\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u5185\u306E\u30C1\u30E3\u30F3\u30AF\uFF1A -KeywordSearchGlobalSearchSettingsPanel.timeRadioButton3.toolTipText=\uFF15\u5206\uFF08\u5168\u4F53\u7684\u306A\u51E6\u7406\u6642\u9593\u304C\u9577\u304F\u306A\u308A\u307E\u3059\uFF09 +KeywordSearchGlobalSearchSettingsPanel.timeRadioButton3.toolTipText=\uFF15\u5206\uFF08\u5168\u4F53\u7684\u306A\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u6642\u9593\u304C\u9577\u304F\u306A\u308A\u307E\u3059\uFF09 KeywordSearchGlobalSearchSettingsPanel.timeRadioButton3.text=\uFF15\u5206\uFF08\u30C7\u30D5\u30A9\u30EB\u30C8\uFF09 DropdownSearchPanel.substringRadioButton.text=\u30B5\u30D6\u30B9\u30C8\u30EA\u30F3\u30B0\u4E00\u81F4 AbstractFileTikaTextExtract.index.exception.tikaParse.msg=\u4F8B\u5916\uFF1A\u30D5\u30A1\u30A4\u30EB\uFF1A{0}, {1}\u306EApache Tika\u30D1\u30FC\u30B9\u30BF\u30B9\u30AF\u5B9F\u884C\u4E2D\u306E\u4E88\u671F\u305B\u306C\u4F8B\u5916 @@ -272,3 +272,7 @@ KeywordSearchListsAbstract.writeLists.errMsg1.msg=KeywordSearchListsAbstract\u30 KeywordSearchListsAbstract.writeLists.errMsg2.msg=KeywordSearchListsAbstract\u30A2\u30C3\u30D7\u30C7\u30FC\u30C8\u3092\u78BA\u8A8D\u4E2D\u306B\u30E2\u30B8\u30E5\u30FC\u30EB\u304C\u30A8\u30E9\u30FC\u3092\u8D77\u3053\u3057\u307E\u3057\u305F\u3002\u3069\u306E\u30E2\u30B8\u30E5\u30FC\u30EB\u304B\u30ED\u30B0\u3067\u78BA\u8A8D\u3057\u3066\u4E0B\u3055\u3044\u3002\u4E00\u90E8\u306E\u30C7\u30FC\u30BF\u304C\u4E0D\u5B8C\u5168\u304B\u3082\u3057\u308C\u307E\u305B\u3093\u3002 KeywordSearchListsManagementPanel.newKeywordListDescription=\u30AD\u30FC\u30EF\u30FC\u30C9\u30EA\u30B9\u30C8<{0}>\u306F\u8AAD\u307F\u53D6\u308A\u5C02\u7528\u30EA\u30B9\u30C8\u3068\u3057\u3066\u5B58\u5728\u3057\u307E\u3059\u3002\u30D7\u30ED\u30B0\u30E9\u30E0\u3092\u4F7F\u7528\u4E2D\u306E\u307F\u3053\u306E\u30EA\u30B9\u30C8\u3092\u7F6E\u304D\u63DB\u3048\u307E\u3059\u304B\uFF1F\uFF08\u3053\u306E\u5909\u66F4\u306F\u7D99\u7D9A\u3055\u308C\u307E\u305B\u3093\uFF09 KeywordSearchListsManagementPanel.newKeywordListDescription2=\u30AD\u30FC\u30EF\u30FC\u30C9\u30EA\u30B9\u30C8<{0}>\u306F\u65E2\u306B\u5B58\u5728\u3057\u307E\u3059\u3002\u7F6E\u304D\u63DB\u3048\u307E\u3059\u304B\uFF1F +DropdownSearchPanelgetQueryList.exception.msg=\u30B7\u30F3\u30B0\u30EB\u30AD\u30FC\u30EF\u30FC\u30C9\u691C\u7D22\u306E\u30EA\u30B9\u30C8\u306F\u5B58\u5728\u3057\u307E\u305B\u3093 +KeywordSearchModuleFactory.createFileIngestModule.exception.msg=\u8A2D\u5B9A\u3092\u884C\u3046\u70BA\u306E\u60F3\u5B9A\u3055\u308C\u308B\u5F15\u6570\u306Finstanceof KeywordSearchJobSettings +KeywordSearchModuleFactory.getIngestJobSettingsPanel.exception.msg=\u8A2D\u5B9A\u3092\u884C\u3046\u70BA\u306E\u60F3\u5B9A\u3055\u308C\u308B\u5F15\u6570\u306Finstanceof KeywordSearchJobSettings +SearchRunner.Searcher.done.err.msg=\u30AD\u30FC\u30EF\u30FC\u30C9\u691C\u7D22\u3092\u5B9F\u884C\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/DropdownSearchPanel.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/DropdownSearchPanel.java index 934953d4d3..df719daa41 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/DropdownSearchPanel.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/DropdownSearchPanel.java @@ -25,6 +25,8 @@ import java.awt.event.FocusListener; import java.util.List; import java.util.logging.Level; import javax.swing.JMenuItem; + +import org.openide.util.NbBundle; import org.sleuthkit.autopsy.coreutils.Logger; /** @@ -120,7 +122,8 @@ public class DropdownSearchPanel extends AbstractKeywordSearchPerformer { @Override public List getQueryList() { - throw new UnsupportedOperationException("No list for single-keyword search"); + throw new UnsupportedOperationException( + NbBundle.getMessage(this.getClass(), "DropdownSearchPanelgetQueryList.exception.msg")); } @Override diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchGlobalSettingsPanel.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchGlobalSettingsPanel.java index d400abe80c..dc0fdf2912 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchGlobalSettingsPanel.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchGlobalSettingsPanel.java @@ -20,12 +20,12 @@ package org.sleuthkit.autopsy.keywordsearch; import org.openide.util.NbBundle; import org.sleuthkit.autopsy.corecomponents.OptionsPanel; -import org.sleuthkit.autopsy.ingest.IngestModuleGlobalSetttingsPanel; +import org.sleuthkit.autopsy.ingest.IngestModuleGlobalSettingsPanel; /** * Global options panel for keyword searching. */ -final class KeywordSearchGlobalSettingsPanel extends IngestModuleGlobalSetttingsPanel implements OptionsPanel { +final class KeywordSearchGlobalSettingsPanel extends IngestModuleGlobalSettingsPanel implements OptionsPanel { private KeywordSearchGlobalListSettingsPanel listsPanel; private KeywordSearchGlobalLanguageSettingsPanel languagesPanel; diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchIngestModule.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchIngestModule.java index ffff9219ea..a02b143c20 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchIngestModule.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchIngestModule.java @@ -103,11 +103,18 @@ public final class KeywordSearchIngestModule extends IngestModuleAdapter impleme SKIPPED_ERROR_TEXTEXTRACT, ///< File was skipped because of text extraction issues SKIPPED_ERROR_IO ///< File was skipped because of IO issues reading it }; - private static final Map ingestStatus = new HashMap<>(); //guarded by itself - - static void putIngestStatus(long id, IngestStatus status) { - synchronized(ingestStatus) { - ingestStatus.put(id, status); + private static final Map> ingestStatus = new HashMap<>(); //guarded by itself + + private static void putIngestStatus(long ingestJobId, long fileId, IngestStatus status) { + synchronized(ingestStatus) { + Map ingestStatusForJob = ingestStatus.get(ingestJobId); + if (ingestStatusForJob == null) { + ingestStatusForJob = new HashMap<>(); + ingestStatus.put(ingestJobId, ingestStatusForJob); + } + + ingestStatusForJob.put(fileId, status); + ingestStatus.put(ingestJobId, ingestStatusForJob); } } @@ -125,7 +132,7 @@ public final class KeywordSearchIngestModule extends IngestModuleAdapter impleme public void startUp(IngestJobContext context) throws IngestModuleException { logger.log(Level.INFO, "Initializing instance {0}", instanceNum); //NON-NLS initialized = false; - jobId = context.getJobId(); + jobId = context.getJobId(); caseHandle = Case.getCurrentCase().getSleuthkitCase(); tikaFormatDetector = new Tika(); ingester = Server.getIngester(); @@ -200,8 +207,8 @@ public final class KeywordSearchIngestModule extends IngestModuleAdapter impleme public ProcessResult process(AbstractFile abstractFile) { if (initialized == false) //error initializing indexing/Solr { - logger.log(Level.WARNING, "Skipping processing, module not initialized, file: {0}", abstractFile.getName()); //NON-NLS - putIngestStatus(abstractFile.getId(), IngestStatus.SKIPPED_ERROR_INDEXING); + logger.log(Level.WARNING, "Skipping processing, module not initialized, file: {0}", abstractFile.getName()); //NON-NLS + putIngestStatus(jobId, abstractFile.getId(), IngestStatus.SKIPPED_ERROR_INDEXING); return ProcessResult.OK; } try { @@ -260,6 +267,9 @@ public final class KeywordSearchIngestModule extends IngestModuleAdapter impleme // We only need to post the summary msg from the last module per job if (refCounter.decrementAndGet(jobId) == 0) { postIndexSummary(); + synchronized(ingestStatus) { + ingestStatus.remove(jobId); + } } //log number of files / chunks in index @@ -272,6 +282,8 @@ public final class KeywordSearchIngestModule extends IngestModuleAdapter impleme } catch (NoOpenCoreException | KeywordSearchModuleException ex) { logger.log(Level.WARNING, "Error executing Solr query to check number of indexed files/chunks: ", ex); //NON-NLS } + + cleanup(); } /** @@ -289,10 +301,6 @@ public final class KeywordSearchIngestModule extends IngestModuleAdapter impleme * Common cleanup code when module stops or final searcher completes */ private void cleanup() { - synchronized(ingestStatus) { - ingestStatus.clear(); - } - textExtractors.clear(); textExtractors = null; stringExtractor = null; @@ -314,16 +322,17 @@ public final class KeywordSearchIngestModule extends IngestModuleAdapter impleme int error_io = 0; synchronized(ingestStatus) { - for (IngestStatus s : ingestStatus.values()) { + Map ingestStatusForJob = ingestStatus.get(jobId); + for (IngestStatus s : ingestStatusForJob.values()) { switch (s) { case TEXT_INGESTED: - ++text_ingested; + text_ingested++; break; case METADATA_INGESTED: - ++metadata_ingested; + metadata_ingested++; break; case STRINGS_INGESTED: - ++strings_ingested; + strings_ingested++; break; case SKIPPED_ERROR_TEXTEXTRACT: error_text++; @@ -411,16 +420,16 @@ public final class KeywordSearchIngestModule extends IngestModuleAdapter impleme private boolean extractStringsAndIndex(AbstractFile aFile) { try { if (stringExtractor.index(aFile)) { - putIngestStatus(aFile.getId(), IngestStatus.STRINGS_INGESTED); + putIngestStatus(jobId, aFile.getId(), IngestStatus.STRINGS_INGESTED); return true; } else { - logger.log(Level.WARNING, "Failed to extract strings and ingest, file ''{0}'' (id: {1}).", new Object[]{aFile.getName(), aFile.getId()}); //NON-NLS - putIngestStatus(aFile.getId(), IngestStatus.SKIPPED_ERROR_TEXTEXTRACT); + logger.log(Level.WARNING, "Failed to extract strings and ingest, file ''{0}'' (id: {1}).", new Object[]{aFile.getName(), aFile.getId()}); //NON-NLS + putIngestStatus(jobId, aFile.getId(), IngestStatus.SKIPPED_ERROR_TEXTEXTRACT); return false; } } catch (IngesterException ex) { - logger.log(Level.WARNING, "Failed to extract strings and ingest, file '" + aFile.getName() + "' (id: " + aFile.getId() + ").", ex); //NON-NLS - putIngestStatus(aFile.getId(), IngestStatus.SKIPPED_ERROR_INDEXING); + logger.log(Level.WARNING, "Failed to extract strings and ingest, file '" + aFile.getName() + "' (id: " + aFile.getId() + ").", ex); //NON-NLS + putIngestStatus(jobId, aFile.getId(), IngestStatus.SKIPPED_ERROR_INDEXING); return false; } } @@ -466,9 +475,9 @@ public final class KeywordSearchIngestModule extends IngestModuleAdapter impleme if ((indexContent == false || aFile.isDir() || size == 0)) { try { ingester.ingest(aFile, false); //meta-data only - putIngestStatus(aFile.getId(), IngestStatus.METADATA_INGESTED); + putIngestStatus(jobId, aFile.getId(), IngestStatus.METADATA_INGESTED); } catch (IngesterException ex) { - putIngestStatus(aFile.getId(), IngestStatus.SKIPPED_ERROR_INDEXING); + putIngestStatus(jobId, aFile.getId(), IngestStatus.SKIPPED_ERROR_INDEXING); logger.log(Level.WARNING, "Unable to index meta-data for file: " + aFile.getId(), ex); //NON-NLS } return; @@ -502,9 +511,9 @@ public final class KeywordSearchIngestModule extends IngestModuleAdapter impleme if (AbstractFileExtract.ARCHIVE_MIME_TYPES.contains(detectedFormat)) { try { ingester.ingest(aFile, false); //meta-data only - putIngestStatus(aFile.getId(), IngestStatus.METADATA_INGESTED); + putIngestStatus(jobId, aFile.getId(), IngestStatus.METADATA_INGESTED); } catch (IngesterException ex) { - putIngestStatus(aFile.getId(), IngestStatus.SKIPPED_ERROR_INDEXING); + putIngestStatus(jobId, aFile.getId(), IngestStatus.SKIPPED_ERROR_INDEXING); logger.log(Level.WARNING, "Unable to index meta-data for file: " + aFile.getId(), ex); //NON-NLS } return; @@ -517,20 +526,20 @@ public final class KeywordSearchIngestModule extends IngestModuleAdapter impleme //logger.log(Level.INFO, "indexing: " + aFile.getName()); if (!extractTextAndIndex(aFile, detectedFormat)) { logger.log(Level.WARNING, "Failed to extract text and ingest, file ''{0}'' (id: {1}).", new Object[]{aFile.getName(), aFile.getId()}); //NON-NLS - putIngestStatus(aFile.getId(), IngestStatus.SKIPPED_ERROR_TEXTEXTRACT); + putIngestStatus(jobId, aFile.getId(), IngestStatus.SKIPPED_ERROR_TEXTEXTRACT); } else { - putIngestStatus(aFile.getId(), IngestStatus.TEXT_INGESTED); + putIngestStatus(jobId, aFile.getId(), IngestStatus.TEXT_INGESTED); wasTextAdded = true; } } catch (IngesterException e) { logger.log(Level.INFO, "Could not extract text with Tika, " + aFile.getId() + ", " //NON-NLS + aFile.getName(), e); - putIngestStatus(aFile.getId(), IngestStatus.SKIPPED_ERROR_INDEXING); + putIngestStatus(jobId, aFile.getId(), IngestStatus.SKIPPED_ERROR_INDEXING); } catch (Exception e) { logger.log(Level.WARNING, "Error extracting text with Tika, " + aFile.getId() + ", " //NON-NLS + aFile.getName(), e); - putIngestStatus(aFile.getId(), IngestStatus.SKIPPED_ERROR_TEXTEXTRACT); + putIngestStatus(jobId, aFile.getId(), IngestStatus.SKIPPED_ERROR_TEXTEXTRACT); } } diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchModuleFactory.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchModuleFactory.java index b813ce5958..4a6c91d7ea 100755 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchModuleFactory.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchModuleFactory.java @@ -30,7 +30,7 @@ import org.sleuthkit.autopsy.ingest.FileIngestModule; import org.sleuthkit.autopsy.ingest.IngestModuleFactory; import org.sleuthkit.autopsy.ingest.IngestModuleIngestJobSettings; import org.sleuthkit.autopsy.ingest.IngestModuleIngestJobSettingsPanel; -import org.sleuthkit.autopsy.ingest.IngestModuleGlobalSetttingsPanel; +import org.sleuthkit.autopsy.ingest.IngestModuleGlobalSettingsPanel; /** * An ingest module factory that creates file ingest modules that do keyword @@ -83,7 +83,8 @@ public class KeywordSearchModuleFactory extends IngestModuleFactoryAdapter { public IngestModuleIngestJobSettingsPanel getIngestJobSettingsPanel(IngestModuleIngestJobSettings settings) { assert settings instanceof KeywordSearchJobSettings; if (!(settings instanceof KeywordSearchJobSettings)) { - throw new IllegalArgumentException("Expected settings argument to be instanceof KeywordSearchJobSettings"); + throw new IllegalArgumentException(NbBundle.getMessage(this.getClass(), + "KeywordSearchModuleFactory.getIngestJobSettingsPanel.exception.msg")); } if (jobSettingsPanel == null) { @@ -100,7 +101,7 @@ public class KeywordSearchModuleFactory extends IngestModuleFactoryAdapter { } @Override - public IngestModuleGlobalSetttingsPanel getGlobalSettingsPanel() { + public IngestModuleGlobalSettingsPanel getGlobalSettingsPanel() { KeywordSearchGlobalSettingsPanel globalSettingsPanel = new KeywordSearchGlobalSettingsPanel(); globalSettingsPanel.load(); return globalSettingsPanel; @@ -115,7 +116,8 @@ public class KeywordSearchModuleFactory extends IngestModuleFactoryAdapter { public FileIngestModule createFileIngestModule(IngestModuleIngestJobSettings settings) { assert settings instanceof KeywordSearchJobSettings; if (!(settings instanceof KeywordSearchJobSettings)) { - throw new IllegalArgumentException("Expected settings argument to be instanceof KeywordSearchJobSettings"); + throw new IllegalArgumentException(NbBundle.getMessage(this.getClass(), + "KeywordSearchModuleFactory.createFileIngestModule.exception.msg")); } return new KeywordSearchIngestModule((KeywordSearchJobSettings) settings); } diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/SearchRunner.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/SearchRunner.java index 6403631548..3c747b9ce0 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/SearchRunner.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/SearchRunner.java @@ -627,7 +627,9 @@ public final class SearchRunner { get(); } catch (InterruptedException | ExecutionException e) { logger.log(Level.SEVERE, "Error performing keyword search: " + e.getMessage()); //NON-NLS - services.postMessage(IngestMessage.createErrorMessage(KeywordSearchModuleFactory.getModuleName(), "Error performing keyword search", e.getMessage())); + services.postMessage(IngestMessage.createErrorMessage(KeywordSearchModuleFactory.getModuleName(), + NbBundle.getMessage(this.getClass(), + "SearchRunner.Searcher.done.err.msg"), e.getMessage())); } // catch and ignore if we were cancelled catch (java.util.concurrent.CancellationException ex) { } 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 7e57d709f8..28783ec7c0 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, 13 Mar 2014 18:09:42 -0400 +#Tue, 22 Apr 2014 16:06:14 -0400 LBL_splash_window_title=Starting Autopsy SPLASH_HEIGHT=288 SPLASH_WIDTH=538 @@ -8,4 +8,4 @@ SplashRunningTextBounds=5,266,530,17 SplashRunningTextColor=0x0 SplashRunningTextFontSize=18 -currentVersion=Autopsy 3.0.9 +currentVersion=Autopsy 3.1.0_Beta 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 4bcee6a939..fe9124784d 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,5 +1,5 @@ #Updated by build script -#Thu, 13 Mar 2014 18:09:42 -0400 +#Tue, 22 Apr 2014 16:06:14 -0400 -CTL_MainWindow_Title=Autopsy 3.0.9 -CTL_MainWindow_Title_No_Project=Autopsy 3.0.9 +CTL_MainWindow_Title=Autopsy 3.1.0_Beta +CTL_MainWindow_Title_No_Project=Autopsy 3.1.0_Beta diff --git a/test/script/tskdbdiff.py b/test/script/tskdbdiff.py index b3b7a986cb..26b4fc643e 100644 --- a/test/script/tskdbdiff.py +++ b/test/script/tskdbdiff.py @@ -213,6 +213,9 @@ class TskDbDiff(object): raise TskDbDiffException("Unexpected error while dumping blackboard database: " + str(e)) finally: database_log.close() + attribute_cursor.close() + artifact_cursor.close() + conn.close() # Now sort the file srtcmdlst = ["sort", unsorted_dump, "-o", bb_dump_file] @@ -242,6 +245,7 @@ class TskDbDiff(object): line = replace_id(line, id_path_table) db_log.write('%s\n' % line) + conn.close() # cleanup the backup os.remove(backup_db_file)