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 static final long serialVersionUID = 1L;
53 private CentralRepoImportWorker worker;
55 @NbBundle.Messages({
"ImportCentralRepoDbProgressDialog.title.text=Central Repository Import Progress",})
56 ImportCentralRepoDbProgressDialog() {
57 super((JFrame) WindowManager.getDefault().getMainWindow(),
58 Bundle.ImportCentralRepoDbProgressDialog_title_text(),
62 customizeComponents();
65 private void customizeComponents() {
67 setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
69 bnOk.setEnabled(
false);
85 void importFile(String hashSetName, String version,
int orgId,
86 boolean searchDuringIngest,
boolean sendIngestMessages, HashDbManager.HashDb.KnownFilesType knownFilesType,
87 boolean readOnly, String importFileName) {
89 worker =
new CentralRepoImportWorker(hashSetName, version, orgId, searchDuringIngest, sendIngestMessages,
90 knownFilesType, readOnly, importFileName);
91 worker.addPropertyChangeListener(
this);
94 setLocationRelativeTo((JFrame) WindowManager.getDefault().getMainWindow());
95 this.setVisible(
true);
104 HashDbManager.HashDb getDatabase() {
105 if (worker != null) {
106 return worker.getDatabase();
117 @NbBundle.Messages({
"ImportCentralRepoDbProgressDialog.errorParsingFile.message=Error parsing hash set file"})
119 public void propertyChange(PropertyChangeEvent evt) {
121 if (
"progress".equals(evt.getPropertyName())) {
123 progressBar.setValue(worker.getProgress());
124 lbProgress.setText(getProgressString());
125 }
else if (
"state".equals(evt.getPropertyName())
126 && (SwingWorker.StateValue.DONE.equals(evt.getNewValue()))) {
130 bnCancel.setEnabled(
false);
131 bnOk.setEnabled(
true);
133 if (worker.getImportSuccess()) {
136 progressBar.setValue(progressBar.getMaximum());
137 lbProgress.setText(getProgressString());
140 progressBar.setValue(0);
141 lbProgress.setForeground(Color.red);
142 lbProgress.setText(Bundle.ImportCentralRepoDbProgressDialog_errorParsingFile_message());
147 @NbBundle.Messages({
"ImportCentralRepoDbProgressDialog.linesProcessed.message= hashes processed"})
148 private String getProgressString() {
149 return worker.getNumHashesProcessed() + Bundle.ImportCentralRepoDbProgressDialog_linesProcessed_message();
154 private final int HASH_IMPORT_THRESHOLD = 10000;
164 private final AtomicInteger referenceSetID =
new AtomicInteger();
165 private final AtomicLong hashCount =
new AtomicLong();
166 private final AtomicBoolean importSuccess =
new AtomicBoolean();
170 boolean readOnly, String importFileName) {
172 this.hashSetName = hashSetName;
173 this.version = version;
175 this.searchDuringIngest = searchDuringIngest;
176 this.sendIngestMessages = sendIngestMessages;
177 this.knownFilesType = knownFilesType;
178 this.readOnly = readOnly;
179 this.importFileName = importFileName;
180 this.hashCount.set(0);
181 this.importSuccess.set(
false);
182 this.referenceSetID.set(-1);
200 long getNumHashesProcessed() {
201 return hashCount.get();
210 boolean getImportSuccess() {
211 return importSuccess.get();
218 HashSetParser hashSetParser;
219 if (importFileName.toLowerCase().endsWith(
".idx") || importFileName.toLowerCase().endsWith(
".txt")) {
220 hashSetParser =
new IdxHashSetParser(importFileName);
221 }
else if (importFileName.toLowerCase().endsWith(
".hash")) {
222 hashSetParser =
new EncaseHashSetParser(importFileName);
223 }
else if (importFileName.toLowerCase().endsWith(
".kdb")) {
225 }
else if (importFileName.toLowerCase().endsWith(
".hsh")) {
229 throw new TskCoreException(
"Hash set to import is an unknown format : " + importFileName);
234 TskData.FileKnown knownStatus;
236 knownStatus = TskData.FileKnown.KNOWN;
238 knownStatus = TskData.FileKnown.BAD;
251 Set<CentralRepoFileInstance> globalInstances =
new HashSet<>();
253 while (!hashSetParser.doneReading()) {
258 String newHash = hashSetParser.getNextHash();
260 if (newHash != null) {
262 referenceSetID.get(),
267 globalInstances.add(eamGlobalFileInstance);
271 if (hashCount.incrementAndGet() % HASH_IMPORT_THRESHOLD == 0) {
273 globalInstances.clear();
275 int progress = (int) (hashCount.get() * 100 / hashSetParser.getExpectedHashCount());
276 if (progress < 100) {
277 this.setProgress(progress);
279 this.setProgress(99);
287 this.setProgress(100);
290 hashSetParser.close();
295 if (referenceSetID.get() >= 0) {
298 Executors.newSingleThreadExecutor().execute(
new Runnable() {
304 Logger.
getLogger(ImportCentralRepoDbProgressDialog.class.getName()).log(Level.SEVERE,
"Error deleting incomplete hash set from central repository", ex2);
312 synchronized protected void done() {
316 deleteIncompleteSet();
324 referenceSetID.get(),
325 searchDuringIngest, sendIngestMessages, knownFilesType, readOnly);
326 importSuccess.set(
true);
327 }
catch (TskCoreException ex) {
328 Logger.
getLogger(ImportCentralRepoDbProgressDialog.class.getName()).log(Level.SEVERE,
"Error adding imported hash set", ex);
330 }
catch (Exception ex) {
332 deleteIncompleteSet();
333 Logger.
getLogger(ImportCentralRepoDbProgressDialog.class.getName()).log(Level.SEVERE,
"Error importing hash set", ex);
344 @SuppressWarnings(
"unchecked")
346 private
void initComponents() {
348 progressBar =
new javax.swing.JProgressBar();
349 lbProgress =
new javax.swing.JLabel();
350 bnOk =
new javax.swing.JButton();
351 bnCancel =
new javax.swing.JButton();
352 jLabel1 =
new javax.swing.JLabel();
354 setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
356 org.openide.awt.Mnemonics.setLocalizedText(lbProgress,
org.openide.util.NbBundle.getMessage(ImportCentralRepoDbProgressDialog.class,
"ImportCentralRepoDbProgressDialog.lbProgress.text"));
358 org.openide.awt.Mnemonics.setLocalizedText(bnOk,
org.openide.util.NbBundle.getMessage(ImportCentralRepoDbProgressDialog.class,
"ImportCentralRepoDbProgressDialog.bnOk.text"));
359 bnOk.addActionListener(
new java.awt.event.ActionListener() {
360 public void actionPerformed(java.awt.event.ActionEvent evt) {
361 bnOkActionPerformed(evt);
365 org.openide.awt.Mnemonics.setLocalizedText(bnCancel,
org.openide.util.NbBundle.getMessage(ImportCentralRepoDbProgressDialog.class,
"ImportCentralRepoDbProgressDialog.bnCancel.text"));
366 bnCancel.addActionListener(
new java.awt.event.ActionListener() {
367 public void actionPerformed(java.awt.event.ActionEvent evt) {
368 bnCancelActionPerformed(evt);
372 org.openide.awt.Mnemonics.setLocalizedText(jLabel1,
org.openide.util.NbBundle.getMessage(ImportCentralRepoDbProgressDialog.class,
"ImportCentralRepoDbProgressDialog.jLabel1.text"));
374 javax.swing.GroupLayout layout =
new javax.swing.GroupLayout(getContentPane());
375 getContentPane().setLayout(layout);
376 layout.setHorizontalGroup(
377 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
378 .addGroup(layout.createSequentialGroup()
380 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
381 .addGroup(layout.createSequentialGroup()
382 .addComponent(progressBar, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
384 .addGroup(layout.createSequentialGroup()
385 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
386 .addComponent(jLabel1)
387 .addComponent(lbProgress))
388 .addGap(0, 0, Short.MAX_VALUE))))
389 .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
390 .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
392 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
393 .addComponent(bnCancel)
396 layout.setVerticalGroup(
397 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
398 .addGroup(layout.createSequentialGroup()
400 .addComponent(jLabel1)
401 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
402 .addComponent(lbProgress)
403 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
404 .addComponent(progressBar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
405 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
406 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
407 .addComponent(bnCancel)
409 .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
415 private void bnCancelActionPerformed(java.awt.event.ActionEvent evt) {
416 this.worker.cancel(
true);
420 private void bnOkActionPerformed(java.awt.event.ActionEvent evt) {
426 private javax.swing.JButton bnCancel;
427 private javax.swing.JButton bnOk;
428 private javax.swing.JLabel jLabel1;
429 private javax.swing.JLabel lbProgress;
430 private javax.swing.JProgressBar progressBar;
final boolean sendIngestMessages
void bulkInsertReferenceTypeEntries(Set< CentralRepoFileInstance > globalInstances, CorrelationAttributeInstance.Type contentType)
void deleteReferenceSet(int referenceSetID)
final HashDbManager.HashDb.KnownFilesType knownFilesType
int newReferenceSet(CentralRepoFileSet eamGlobalSet)
static synchronized HashDbManager getInstance()
void deleteIncompleteSet()
final String importFileName
synchronized static Logger getLogger(String name)
CorrelationAttributeInstance.Type getCorrelationTypeById(int typeId)
static CentralRepository getInstance()
static final int FILES_TYPE_ID
final boolean searchDuringIngest