19 package org.sleuthkit.autopsy.modules.hashdatabase;
21 import java.awt.Color;
22 import java.beans.PropertyChangeListener;
23 import java.beans.PropertyChangeEvent;
24 import java.util.HashSet;
26 import java.util.logging.Level;
27 import javax.swing.JFrame;
28 import javax.swing.SwingWorker;
29 import javax.swing.WindowConstants;
30 import java.util.concurrent.atomic.AtomicLong;
31 import java.util.concurrent.atomic.AtomicBoolean;
32 import java.util.concurrent.atomic.AtomicInteger;
33 import java.util.concurrent.Executors;
34 import org.openide.util.NbBundle;
35 import org.openide.windows.WindowManager;
48 @SuppressWarnings(
"PMD.SingularField")
49 class ImportCentralRepoDbProgressDialog extends javax.swing.JDialog implements PropertyChangeListener {
51 private CentralRepoImportWorker worker;
53 @NbBundle.Messages({
"ImportCentralRepoDbProgressDialog.title.text=Central Repository Import Progress",})
54 ImportCentralRepoDbProgressDialog() {
55 super((JFrame) WindowManager.getDefault().getMainWindow(),
56 Bundle.ImportCentralRepoDbProgressDialog_title_text(),
60 customizeComponents();
63 private void customizeComponents() {
65 setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
67 bnOk.setEnabled(
false);
83 void importFile(String hashSetName, String version,
int orgId,
84 boolean searchDuringIngest,
boolean sendIngestMessages, HashDbManager.HashDb.KnownFilesType knownFilesType,
85 boolean readOnly, String importFileName) {
87 worker =
new CentralRepoImportWorker(hashSetName, version, orgId, searchDuringIngest, sendIngestMessages,
88 knownFilesType, readOnly, importFileName);
89 worker.addPropertyChangeListener(
this);
92 setLocationRelativeTo((JFrame) WindowManager.getDefault().getMainWindow());
93 this.setVisible(
true);
102 HashDbManager.HashDb getDatabase() {
103 if (worker != null) {
104 return worker.getDatabase();
115 @NbBundle.Messages({
"ImportCentralRepoDbProgressDialog.errorParsingFile.message=Error parsing hash set file"})
117 public void propertyChange(PropertyChangeEvent evt) {
119 if (
"progress".equals(evt.getPropertyName())) {
121 progressBar.setValue(worker.getProgress());
122 lbProgress.setText(getProgressString());
123 }
else if (
"state".equals(evt.getPropertyName())
124 && (SwingWorker.StateValue.DONE.equals(evt.getNewValue()))) {
128 bnCancel.setEnabled(
false);
129 bnOk.setEnabled(
true);
131 if (worker.getImportSuccess()) {
134 progressBar.setValue(progressBar.getMaximum());
135 lbProgress.setText(getProgressString());
138 progressBar.setValue(0);
139 lbProgress.setForeground(Color.red);
140 lbProgress.setText(Bundle.ImportCentralRepoDbProgressDialog_errorParsingFile_message());
145 @NbBundle.Messages({
"ImportCentralRepoDbProgressDialog.linesProcessed.message= hashes processed"})
146 private String getProgressString() {
147 return worker.getNumHashesProcessed() + Bundle.ImportCentralRepoDbProgressDialog_linesProcessed_message();
152 private final int HASH_IMPORT_THRESHOLD = 10000;
162 private final AtomicInteger referenceSetID =
new AtomicInteger();
163 private final AtomicLong hashCount =
new AtomicLong();
164 private final AtomicBoolean importSuccess =
new AtomicBoolean();
168 boolean readOnly, String importFileName) {
170 this.hashSetName = hashSetName;
171 this.version = version;
173 this.searchDuringIngest = searchDuringIngest;
174 this.sendIngestMessages = sendIngestMessages;
175 this.knownFilesType = knownFilesType;
176 this.readOnly = readOnly;
177 this.importFileName = importFileName;
178 this.hashCount.set(0);
179 this.importSuccess.set(
false);
180 this.referenceSetID.set(-1);
198 long getNumHashesProcessed() {
199 return hashCount.get();
208 boolean getImportSuccess() {
209 return importSuccess.get();
216 HashSetParser hashSetParser;
217 if (importFileName.toLowerCase().endsWith(
".idx") || importFileName.toLowerCase().endsWith(
".txt")) {
218 hashSetParser =
new IdxHashSetParser(importFileName);
219 }
else if (importFileName.toLowerCase().endsWith(
".hash")) {
220 hashSetParser =
new EncaseHashSetParser(importFileName);
221 }
else if (importFileName.toLowerCase().endsWith(
".kdb")) {
223 }
else if (importFileName.toLowerCase().endsWith(
".hsh")) {
227 throw new TskCoreException(
"Hash set to import is an unknown format : " + importFileName);
232 TskData.FileKnown knownStatus;
234 knownStatus = TskData.FileKnown.KNOWN;
236 knownStatus = TskData.FileKnown.BAD;
249 Set<EamGlobalFileInstance> globalInstances =
new HashSet<>();
251 while (!hashSetParser.doneReading()) {
256 String newHash = hashSetParser.getNextHash();
258 if (newHash != null) {
260 referenceSetID.get(),
265 globalInstances.add(eamGlobalFileInstance);
269 if (hashCount.incrementAndGet() % HASH_IMPORT_THRESHOLD == 0) {
271 globalInstances.clear();
273 int progress = (int) (hashCount.get() * 100 / hashSetParser.getExpectedHashCount());
274 if (progress < 100) {
275 this.setProgress(progress);
277 this.setProgress(99);
285 this.setProgress(100);
288 hashSetParser.close();
293 if (referenceSetID.get() >= 0) {
296 Executors.newSingleThreadExecutor().execute(
new Runnable() {
302 Logger.
getLogger(ImportCentralRepoDbProgressDialog.class.getName()).log(Level.SEVERE,
"Error deleting incomplete hash set from central repository", ex2);
310 synchronized protected void done() {
314 deleteIncompleteSet();
322 referenceSetID.get(),
323 searchDuringIngest, sendIngestMessages, knownFilesType, readOnly);
324 importSuccess.set(
true);
325 }
catch (TskCoreException ex) {
326 Logger.
getLogger(ImportCentralRepoDbProgressDialog.class.getName()).log(Level.SEVERE,
"Error adding imported hash set", ex);
328 }
catch (Exception ex) {
330 deleteIncompleteSet();
331 Logger.
getLogger(ImportCentralRepoDbProgressDialog.class.getName()).log(Level.SEVERE,
"Error importing hash set", ex);
342 @SuppressWarnings(
"unchecked")
344 private
void initComponents() {
346 progressBar =
new javax.swing.JProgressBar();
347 lbProgress =
new javax.swing.JLabel();
348 bnOk =
new javax.swing.JButton();
349 bnCancel =
new javax.swing.JButton();
350 jLabel1 =
new javax.swing.JLabel();
352 setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
354 org.openide.awt.Mnemonics.setLocalizedText(lbProgress,
org.openide.util.NbBundle.getMessage(ImportCentralRepoDbProgressDialog.class,
"ImportCentralRepoDbProgressDialog.lbProgress.text"));
356 org.openide.awt.Mnemonics.setLocalizedText(bnOk,
org.openide.util.NbBundle.getMessage(ImportCentralRepoDbProgressDialog.class,
"ImportCentralRepoDbProgressDialog.bnOk.text"));
357 bnOk.addActionListener(
new java.awt.event.ActionListener() {
358 public void actionPerformed(java.awt.event.ActionEvent evt) {
359 bnOkActionPerformed(evt);
363 org.openide.awt.Mnemonics.setLocalizedText(bnCancel,
org.openide.util.NbBundle.getMessage(ImportCentralRepoDbProgressDialog.class,
"ImportCentralRepoDbProgressDialog.bnCancel.text"));
364 bnCancel.addActionListener(
new java.awt.event.ActionListener() {
365 public void actionPerformed(java.awt.event.ActionEvent evt) {
366 bnCancelActionPerformed(evt);
370 org.openide.awt.Mnemonics.setLocalizedText(jLabel1,
org.openide.util.NbBundle.getMessage(ImportCentralRepoDbProgressDialog.class,
"ImportCentralRepoDbProgressDialog.jLabel1.text"));
372 javax.swing.GroupLayout layout =
new javax.swing.GroupLayout(getContentPane());
373 getContentPane().setLayout(layout);
374 layout.setHorizontalGroup(
375 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
376 .addGroup(layout.createSequentialGroup()
378 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
379 .addGroup(layout.createSequentialGroup()
380 .addComponent(progressBar, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
382 .addGroup(layout.createSequentialGroup()
383 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
384 .addComponent(jLabel1)
385 .addComponent(lbProgress))
386 .addGap(0, 0, Short.MAX_VALUE))))
387 .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
388 .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
390 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
391 .addComponent(bnCancel)
394 layout.setVerticalGroup(
395 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
396 .addGroup(layout.createSequentialGroup()
398 .addComponent(jLabel1)
399 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
400 .addComponent(lbProgress)
401 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
402 .addComponent(progressBar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
403 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
404 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
405 .addComponent(bnCancel)
407 .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
413 private void bnCancelActionPerformed(java.awt.event.ActionEvent evt) {
414 this.worker.cancel(
true);
418 private void bnOkActionPerformed(java.awt.event.ActionEvent evt) {
424 private javax.swing.JButton bnCancel;
425 private javax.swing.JButton bnOk;
426 private javax.swing.JLabel jLabel1;
427 private javax.swing.JLabel lbProgress;
428 private javax.swing.JProgressBar progressBar;
CorrelationAttribute.Type getCorrelationTypeById(int typeId)
void deleteReferenceSet(int referenceSetID)
int newReferenceSet(EamGlobalSet eamGlobalSet)
static final int FILES_TYPE_ID
final boolean sendIngestMessages
final HashDbManager.HashDb.KnownFilesType knownFilesType
static EamDb getInstance()
static synchronized HashDbManager getInstance()
void deleteIncompleteSet()
final String importFileName
synchronized static Logger getLogger(String name)
void bulkInsertReferenceTypeEntries(Set< EamGlobalFileInstance > globalInstances, CorrelationAttribute.Type contentType)
final boolean searchDuringIngest