diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/AddLocalFilesTask.java b/Core/src/org/sleuthkit/autopsy/casemodule/AddLocalFilesTask.java index b2d14db118..c610ff78c3 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/AddLocalFilesTask.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/AddLocalFilesTask.java @@ -89,7 +89,7 @@ class AddLocalFilesTask implements Runnable { progress.setIndeterminate(true); FileManager fileManager = Case.getCurrentCase().getServices().getFileManager(); LocalFilesDataSource newDataSource = fileManager.addLocalFilesDataSource(deviceId, rootVirtualDirectoryName, "", localFilePaths, new ProgressUpdater()); - newDataSources.add(newDataSource.getRootDirectory()); + newDataSources.add(newDataSource); } catch (TskDataException | TskCoreException ex) { errors.add(ex.getMessage()); LOGGER.log(Level.SEVERE, String.format("Failed to add datasource: %s", ex.getMessage()), ex); diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesPanel.java b/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesPanel.java index 23e9d0b1c8..101f8688dd 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesPanel.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesPanel.java @@ -78,10 +78,9 @@ final class CasePropertiesPanel extends javax.swing.JPanel { try { EamDb dbManager = EamDb.getInstance(); if (dbManager != null) { - CorrelationCase correlationCase = dbManager.getCaseByUUID(Case.getCurrentCase().getName()); + CorrelationCase correlationCase = dbManager.getCase(Case.getCurrentCase()); if (null == correlationCase) { - dbManager.newCase(Case.getCurrentCase()); - correlationCase = dbManager.getCaseByUUID(Case.getCurrentCase().getName()); + correlationCase = dbManager.newCase(Case.getCurrentCase()); } currentOrg = correlationCase.getOrg(); } diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardAction.java b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardAction.java index 7a4a1f7bf4..89d527fcc1 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardAction.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardAction.java @@ -91,7 +91,7 @@ final class NewCaseWizardAction extends CallableSystemAction { if (EamDb.isEnabled()) { //if the eam is enabled we need to save the case organization information now EamDb dbManager = EamDb.getInstance(); if (dbManager != null) { - CorrelationCase cRCase = dbManager.getCaseByUUID(Case.getCurrentCase().getName()); + CorrelationCase cRCase = dbManager.getCase(Case.getCurrentCase()); if (cRCase == null) { cRCase = dbManager.newCase(Case.getCurrentCase()); } diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/OptionalCasePropertiesPanel.java b/Core/src/org/sleuthkit/autopsy/casemodule/OptionalCasePropertiesPanel.java index a2793ec295..0a9649c45d 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/OptionalCasePropertiesPanel.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/OptionalCasePropertiesPanel.java @@ -89,7 +89,7 @@ final class OptionalCasePropertiesPanel extends javax.swing.JPanel { if (currentCase != null) { try { EamDb dbManager = EamDb.getInstance(); - selectedOrg = dbManager.getCaseByUUID(currentCase.getName()).getOrg(); + selectedOrg = dbManager.getCase(currentCase).getOrg(); } catch (EamDbException ex) { LOGGER.log(Level.SEVERE, "Unable to get Organization associated with the case from Central Repo", ex); } @@ -561,7 +561,7 @@ final class OptionalCasePropertiesPanel extends javax.swing.JPanel { if (EamDb.isEnabled()) { try { EamDb dbManager = EamDb.getInstance(); - CorrelationCase correlationCase = dbManager.getCaseByUUID(Case.getCurrentCase().getName()); + CorrelationCase correlationCase = dbManager.getCase(Case.getCurrentCase()); if (caseDisplayNameTextField.isVisible()) { correlationCase.setDisplayName(caseDisplayNameTextField.getText()); } diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/services/FileManager.java b/Core/src/org/sleuthkit/autopsy/casemodule/services/FileManager.java index f12c2f7e5d..817052619b 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/services/FileManager.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/services/FileManager.java @@ -47,7 +47,6 @@ import org.sleuthkit.datamodel.LocalFilesDataSource; import org.sleuthkit.datamodel.TskDataException; import org.apache.commons.lang3.StringUtils; import org.sleuthkit.autopsy.coreutils.Logger; -import org.sleuthkit.datamodel.AbstractContent; import org.sleuthkit.datamodel.CarvingResult; import org.sleuthkit.datamodel.TskData; @@ -409,10 +408,9 @@ public class FileManager implements Closeable { */ trans = caseDb.beginTransaction(); LocalFilesDataSource dataSource = caseDb.addLocalFilesDataSource(deviceId, rootDirectoryName, timeZone, trans); - VirtualDirectory rootDirectory = dataSource.getRootDirectory(); List filesAdded = new ArrayList<>(); for (java.io.File localFile : localFiles) { - AbstractFile fileAdded = addLocalFile(trans, rootDirectory, localFile, TskData.EncodingType.NONE, progressUpdater); + AbstractFile fileAdded = addLocalFile(trans, dataSource, localFile, TskData.EncodingType.NONE, progressUpdater); if (null != fileAdded) { filesAdded.add(fileAdded); } else { diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/contentviewer/DataContentViewerOtherCases.java b/Core/src/org/sleuthkit/autopsy/centralrepository/contentviewer/DataContentViewerOtherCases.java index 2a7fcf168b..fbc955ca72 100755 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/contentviewer/DataContentViewerOtherCases.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/contentviewer/DataContentViewerOtherCases.java @@ -177,7 +177,7 @@ public class DataContentViewerOtherCases extends javax.swing.JPanel implements D } caseDisplayName = eamCasePartial.getDisplayName(); // query case details - CorrelationCase eamCase = dbManager.getCaseByUUID(eamCasePartial.getCaseUUID()); + CorrelationCase eamCase = dbManager.getCase(Case.getCurrentCase()); if (eamCase == null) { JOptionPane.showConfirmDialog(showCaseDetailsMenuItem, Bundle.DataContentViewerOtherCases_caseDetailsDialog_noDetails(), diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/AbstractSqlEamDb.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/AbstractSqlEamDb.java index e1ea3649b0..3fc827f7d5 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/AbstractSqlEamDb.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/AbstractSqlEamDb.java @@ -173,9 +173,10 @@ public abstract class AbstractSqlEamDb implements EamDb { * Expects the Organization for this case to already exist in the database. * * @param eamCase The case to add + * @returns New Case class with populated database ID */ @Override - public void newCase(CorrelationCase eamCase) throws EamDbException { + public CorrelationCase newCase(CorrelationCase eamCase) throws EamDbException { Connection conn = connect(); PreparedStatement preparedStatement = null; @@ -228,6 +229,9 @@ public abstract class AbstractSqlEamDb implements EamDb { EamDbUtil.closePreparedStatement(preparedStatement); EamDbUtil.closeConnection(conn); } + + // get a new version with the updated ID + return getCaseByUUID(eamCase.getCaseUUID()); } /** @@ -252,9 +256,14 @@ public abstract class AbstractSqlEamDb implements EamDb { autopsyCase.getExaminerEmail(), autopsyCase.getExaminerPhone(), autopsyCase.getCaseNotes()); - newCase(curCeCase); - return curCeCase; + return newCase(curCeCase); } + + @Override + public CorrelationCase getCase(Case autopsyCase) throws EamDbException { + return getCaseByUUID(autopsyCase.getName()); + } + /** * Updates an existing Case in the database @@ -435,7 +444,7 @@ public abstract class AbstractSqlEamDb implements EamDb { * @return The data source */ @Override - public CorrelationDataSource getDataSourceDetails(CorrelationCase correlationCase, String dataSourceDeviceId) throws EamDbException { + public CorrelationDataSource getDataSource(CorrelationCase correlationCase, String dataSourceDeviceId) throws EamDbException { Connection conn = connect(); CorrelationDataSource eamDataSourceResult = null; @@ -453,7 +462,7 @@ public abstract class AbstractSqlEamDb implements EamDb { eamDataSourceResult = getEamDataSourceFromResultSet(resultSet); } } catch (SQLException ex) { - throw new EamDbException("Error getting case details.", ex); // NON-NLS + throw new EamDbException("Error getting data source.", ex); // NON-NLS } finally { EamDbUtil.closePreparedStatement(preparedStatement); EamDbUtil.closeResultSet(resultSet); @@ -1060,12 +1069,12 @@ public abstract class AbstractSqlEamDb implements EamDb { // We could improve effiency by keeping a list of all datasources and cases // in the database, but we don't expect the user to be tagging large numbers // of items (that didn't have the CE ingest module run on them) at once. - CorrelationCase correlationCase = getCaseByUUID(eamInstance.getCorrelationCase().getCaseUUID()); - if (null == correlationCase) { - newCase(eamInstance.getCorrelationCase()); - correlationCase = getCaseByUUID(eamInstance.getCorrelationCase().getCaseUUID()); + CorrelationCase correlationCaseWithId = getCaseByUUID(eamInstance.getCorrelationCase().getCaseUUID()); + if (null == correlationCaseWithId) { + correlationCaseWithId = newCase(eamInstance.getCorrelationCase()); } - if (null == getDataSourceDetails(correlationCase, eamInstance.getCorrelationDataSource().getDeviceID())) { + + if (null == getDataSource(correlationCaseWithId, eamInstance.getCorrelationDataSource().getDeviceID())) { newDataSource(eamInstance.getCorrelationDataSource()); } eamArtifact.getInstances().get(0).setKnownStatus(knownStatus); @@ -2149,7 +2158,7 @@ public abstract class AbstractSqlEamDb implements EamDb { return null; } CorrelationAttributeInstance eamArtifactInstance = new CorrelationAttributeInstance( - new CorrelationCase(resultSet.getString("case_uid"), resultSet.getString("case_name")), + new CorrelationCase(resultSet.getInt("case_id"), resultSet.getString("case_uid"), resultSet.getString("case_name")), new CorrelationDataSource(-1, resultSet.getInt("case_id"), resultSet.getString("device_id"), resultSet.getString("name")), resultSet.getString("file_path"), resultSet.getString("comment"), diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/CorrelationCase.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/CorrelationCase.java index 466c73a7ee..79d94837ee 100755 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/CorrelationCase.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/CorrelationCase.java @@ -49,16 +49,12 @@ public class CorrelationCase implements Serializable { * * @param caseUUID Globally unique identifier * @param displayName - */ - public CorrelationCase(String caseUUID, String displayName) { - this(-1, caseUUID, null, displayName, DATE_FORMAT.format(new Date()), null, null, null, null, null); - } - + */ CorrelationCase(int ID, String caseUUID, String displayName) { this(ID, caseUUID, null, displayName, DATE_FORMAT.format(new Date()), null, null, null, null, null); } - public CorrelationCase(int ID, + CorrelationCase(int ID, String caseUUID, EamOrganization org, String displayName, diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamArtifactUtil.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamArtifactUtil.java index b3194e4b7f..c2bb0e0016 100755 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamArtifactUtil.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamArtifactUtil.java @@ -96,10 +96,9 @@ public class EamArtifactUtil { } // make an instance for the BB source file - CorrelationCase correlationCase = EamDb.getInstance().getCaseByUUID(Case.getCurrentCase().getName()); + CorrelationCase correlationCase = EamDb.getInstance().getCase(Case.getCurrentCase()); if (null == correlationCase) { - EamDb.getInstance().newCase(Case.getCurrentCase()); - correlationCase = EamDb.getInstance().getCaseByUUID(Case.getCurrentCase().getName()); + correlationCase = EamDb.getInstance().newCase(Case.getCurrentCase()); } CorrelationAttributeInstance eamInstance = new CorrelationAttributeInstance( correlationCase, @@ -250,10 +249,9 @@ public class EamArtifactUtil { try { CorrelationAttribute.Type filesType = EamDb.getInstance().getCorrelationTypeById(CorrelationAttribute.FILES_TYPE_ID); eamArtifact = new CorrelationAttribute(filesType, af.getMd5Hash()); - CorrelationCase correlationCase = EamDb.getInstance().getCaseByUUID(Case.getCurrentCase().getName()); + CorrelationCase correlationCase = EamDb.getInstance().getCase(Case.getCurrentCase()); if (null == correlationCase) { - EamDb.getInstance().newCase(Case.getCurrentCase()); - correlationCase = EamDb.getInstance().getCaseByUUID(Case.getCurrentCase().getName()); + correlationCase = EamDb.getInstance().newCase(Case.getCurrentCase()); } CorrelationAttributeInstance cei = new CorrelationAttributeInstance( correlationCase, diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamDb.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamDb.java index 8d6a49fc9d..97e2750e95 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamDb.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamDb.java @@ -136,7 +136,7 @@ public interface EamDb { * * @param eamCase The case to add */ - void newCase(CorrelationCase eamCase) throws EamDbException; + CorrelationCase newCase(CorrelationCase eamCase) throws EamDbException; /** * Creates new Case in the database from the given case @@ -144,6 +144,8 @@ public interface EamDb { * @param autopsyCase The case to add */ CorrelationCase newCase(Case autopsyCase) throws EamDbException; + + /** * Updates an existing Case in the database @@ -152,6 +154,15 @@ public interface EamDb { */ void updateCase(CorrelationCase eamCase) throws EamDbException; + /** + * Retrieves Central Repo case based on an Autopsy Case + * + * @param autopsyCase Autopsy case to find corresponding CR case for + * @return CR Case + * @throws EamDbException + */ + CorrelationCase getCase(Case autopsyCase) throws EamDbException; + /** * Retrieves Case details based on Case UUID * @@ -184,7 +195,7 @@ public interface EamDb { * * @return The data source */ - CorrelationDataSource getDataSourceDetails(CorrelationCase correlationCase, String dataSourceDeviceId) throws EamDbException; + CorrelationDataSource getDataSource(CorrelationCase correlationCase, String dataSourceDeviceId) throws EamDbException; /** * Retrieves data sources that are in DB diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/SqliteEamDb.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/SqliteEamDb.java index f774909b5b..f6853de545 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/SqliteEamDb.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/SqliteEamDb.java @@ -149,16 +149,14 @@ public class SqliteEamDb extends AbstractSqlEamDb { * */ private void setupConnectionPool() throws EamDbException { + + if (dbSettings.dbFileExists() == false) { + throw new EamDbException("Central repository database missing"); + } + connectionPool = new BasicDataSource(); connectionPool.setDriverClassName(dbSettings.getDriver()); - - StringBuilder connectionURL = new StringBuilder(); - connectionURL.append(dbSettings.getJDBCBaseURI()); - connectionURL.append(dbSettings.getDbDirectory()); - connectionURL.append(File.separator); - connectionURL.append(dbSettings.getDbName()); - - connectionPool.setUrl(connectionURL.toString()); + connectionPool.setUrl(dbSettings.getConnectionURL()); // tweak pool configuration connectionPool.setInitialSize(50); @@ -279,10 +277,10 @@ public class SqliteEamDb extends AbstractSqlEamDb { * @param eamCase The case to add */ @Override - public void newCase(CorrelationCase eamCase) throws EamDbException { + public CorrelationCase newCase(CorrelationCase eamCase) throws EamDbException { try{ acquireExclusiveLock(); - super.newCase(eamCase); + return super.newCase(eamCase); } finally { releaseExclusiveLock(); } @@ -359,10 +357,10 @@ public class SqliteEamDb extends AbstractSqlEamDb { * @return The data source */ @Override - public CorrelationDataSource getDataSourceDetails(CorrelationCase correlationCase, String dataSourceDeviceId) throws EamDbException { + public CorrelationDataSource getDataSource(CorrelationCase correlationCase, String dataSourceDeviceId) throws EamDbException { try{ acquireSharedLock(); - return super.getDataSourceDetails(correlationCase, dataSourceDeviceId); + return super.getDataSource(correlationCase, dataSourceDeviceId); } finally { releaseSharedLock(); } diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/CaseEventListener.java b/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/CaseEventListener.java index 7252ca53cc..88cf1ed59e 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/CaseEventListener.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/CaseEventListener.java @@ -430,12 +430,11 @@ final class CaseEventListener implements PropertyChangeListener { try { String deviceId = Case.getCurrentCase().getSleuthkitCase().getDataSource(newDataSource.getId()).getDeviceId(); - CorrelationCase correlationCase = dbManager.getCaseByUUID(Case.getCurrentCase().getName()); + CorrelationCase correlationCase = dbManager.getCase(Case.getCurrentCase()); if (null == correlationCase) { - dbManager.newCase(Case.getCurrentCase()); - correlationCase = dbManager.getCaseByUUID(Case.getCurrentCase().getName()); + correlationCase = dbManager.newCase(Case.getCurrentCase()); } - if (null == dbManager.getDataSourceDetails(correlationCase, deviceId)) { + if (null == dbManager.getDataSource(correlationCase, deviceId)) { dbManager.newDataSource(CorrelationDataSource.fromTSKDataSource(correlationCase, newDataSource)); } } catch (EamDbException ex) { @@ -466,18 +465,6 @@ final class CaseEventListener implements PropertyChangeListener { Case curCase = (Case) event.getNewValue(); IngestEventsListener.resetCeModuleInstanceCount(); - CorrelationCase curCeCase = new CorrelationCase( - -1, - curCase.getName(), // unique case ID - EamOrganization.getDefault(), - curCase.getDisplayName(), - curCase.getCreatedDate(), - curCase.getNumber(), - curCase.getExaminer(), - curCase.getExaminerEmail(), - curCase.getExaminerPhone(), - curCase.getCaseNotes()); - if (!EamDb.isEnabled()) { return; } @@ -485,10 +472,8 @@ final class CaseEventListener implements PropertyChangeListener { try { // NOTE: Cannot determine if the opened case is a new case or a reopened case, // so check for existing name in DB and insert if missing. - CorrelationCase existingCase = dbManager.getCaseByUUID(curCeCase.getCaseUUID()); - - if (null == existingCase) { - dbManager.newCase(curCeCase); + if (dbManager.getCase(curCase) == null) { + dbManager.newCase(curCase); } } catch (EamDbException ex) { LOGGER.log(Level.SEVERE, "Error connecting to Central Repository database.", ex); //NON-NLS diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/ingestmodule/IngestModule.java b/Core/src/org/sleuthkit/autopsy/centralrepository/ingestmodule/IngestModule.java index 30d374f133..9e1e36cb8a 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/ingestmodule/IngestModule.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/ingestmodule/IngestModule.java @@ -201,47 +201,36 @@ class IngestModule implements FileIngestModule { } jobId = context.getJobId(); - EamDb dbManager; + EamDb centralRepoDb; try { - dbManager = EamDb.getInstance(); + centralRepoDb = EamDb.getInstance(); } catch (EamDbException ex) { LOGGER.log(Level.SEVERE, "Error connecting to central repository database.", ex); // NON-NLS throw new IngestModuleException("Error connecting to central repository database.", ex); // NON-NLS } try { - filesType = dbManager.getCorrelationTypeById(CorrelationAttribute.FILES_TYPE_ID); + filesType = centralRepoDb.getCorrelationTypeById(CorrelationAttribute.FILES_TYPE_ID); } catch (EamDbException ex) { LOGGER.log(Level.SEVERE, "Error getting correlation type FILES in ingest module start up.", ex); // NON-NLS throw new IngestModuleException("Error getting correlation type FILES in ingest module start up.", ex); // NON-NLS } - Case curCase = Case.getCurrentCase(); + Case autopsyCase = Case.getCurrentCase(); try { - eamCase = dbManager.getCaseByUUID(curCase.getName()); + eamCase = centralRepoDb.getCase(autopsyCase); } catch (EamDbException ex) { throw new IngestModuleException("Unable to get case from central repository database ", ex); } if (eamCase == null) { // ensure we have this case defined in the EAM DB - CorrelationCase curCeCase = new CorrelationCase( - -1, - curCase.getName(), // unique case ID - EamOrganization.getDefault(), - curCase.getDisplayName(), - curCase.getCreatedDate(), - curCase.getNumber(), - curCase.getExaminer(), - curCase.getExaminerEmail(), - curCase.getExaminerPhone(), - curCase.getCaseNotes()); try { - dbManager.newCase(curCeCase); - eamCase = dbManager.getCaseByUUID(curCase.getName()); + eamCase = centralRepoDb.newCase(autopsyCase); } catch (EamDbException ex) { LOGGER.log(Level.SEVERE, "Error creating new case in ingest module start up.", ex); // NON-NLS throw new IngestModuleException("Error creating new case in ingest module start up.", ex); // NON-NLS } } + try { eamDataSource = CorrelationDataSource.fromTSKDataSource(eamCase, context.getDataSource()); } catch (EamDbException ex) { @@ -255,12 +244,12 @@ class IngestModule implements FileIngestModule { == 1) { // ensure we have this data source in the EAM DB try { - if (null == dbManager.getDataSourceDetails(eamCase, eamDataSource.getDeviceID())) { - dbManager.newDataSource(eamDataSource); + if (null == centralRepoDb.getDataSource(eamCase, eamDataSource.getDeviceID())) { + centralRepoDb.newDataSource(eamDataSource); } } catch (EamDbException ex) { - LOGGER.log(Level.SEVERE, "Error creating new data source in ingest module start up.", ex); // NON-NLS - throw new IngestModuleException("Error creating new data source in ingest module start up.", ex); // NON-NLS + LOGGER.log(Level.SEVERE, "Error adding data source to Central Repository.", ex); // NON-NLS + throw new IngestModuleException("Error adding data source to Central Repository.", ex); // NON-NLS } } diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMetricsCollector.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMetricsCollector.java index 9567b70470..7b07a15aec 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMetricsCollector.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMetricsCollector.java @@ -1,7 +1,7 @@ /* * Autopsy Forensic Browser * - * Copyright 2011-2017 Basis Technology Corp. + * Copyright 2017 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -29,14 +29,15 @@ import org.sleuthkit.autopsy.coreutils.Logger; * Collects metrics for an auto ingest cluster. */ final class AutoIngestMetricsCollector { - + private static final Logger LOGGER = Logger.getLogger(AutoIngestMetricsCollector.class.getName()); + private static final int MINIMUM_SUPPORTED_JOB_NODE_VERSION = 1; private CoordinationService coordinationService; - + /** * Creates an instance of the AutoIngestMetricsCollector. - * - * @throws AutoIngestMetricsCollector.AutoIngestMetricsCollectorException + * + * @throws AutoIngestMetricsCollector.AutoIngestMetricsCollectorException */ AutoIngestMetricsCollector() throws AutoIngestMetricsCollectorException { try { @@ -45,7 +46,7 @@ final class AutoIngestMetricsCollector { throw new AutoIngestMetricsCollectorException("Failed to get coordination service", ex); //NON-NLS } } - + /** * Gets a new metrics snapshot from the coordination service for an auto * ingest cluster. @@ -59,7 +60,7 @@ final class AutoIngestMetricsCollector { for (String node : nodeList) { try { AutoIngestJobNodeData nodeData = new AutoIngestJobNodeData(coordinationService.getNodeData(CoordinationService.CategoryNode.MANIFESTS, node)); - if (nodeData.getVersion() < 1) { + if (nodeData.getVersion() < MINIMUM_SUPPORTED_JOB_NODE_VERSION) { /* * Ignore version '0' nodes that have not been * "upgraded" since they don't carry enough data. @@ -78,7 +79,7 @@ final class AutoIngestMetricsCollector { */ break; case COMPLETED: - newMetricsSnapshot.addCompletedJobDate(job.getCompletedDate()); + newMetricsSnapshot.addCompletedJobMetric(job.getCompletedDate(), job.getDataSourceSize()); break; default: LOGGER.log(Level.SEVERE, "Unknown AutoIngestJobData.ProcessingStatus"); @@ -92,41 +93,80 @@ final class AutoIngestMetricsCollector { LOGGER.log(Level.SEVERE, String.format("Failed to create a job for '%s'", node), ex); } } - + return newMetricsSnapshot; - + } catch (CoordinationService.CoordinationServiceException ex) { LOGGER.log(Level.SEVERE, "Failed to get node list from coordination service", ex); return new MetricsSnapshot(); } } - + /** * A snapshot of metrics for an auto ingest cluster. */ static final class MetricsSnapshot { - - private final List completedJobDates = new ArrayList<>(); - + + private final List completedJobMetrics = new ArrayList<>(); + /** - * Gets a list of completed job dates, formatted in milliseconds. - * - * @return The completed job dates, formatted in milliseconds. + * Gets a list of completed job metrics. + * + * @return The completed job metrics. */ - List getCompletedJobDates() { - return new ArrayList<>(completedJobDates); + List getCompletedJobMetrics() { + return new ArrayList<>(completedJobMetrics); } - + /** - * Adds a new date to the list of completed job dates. - * - * @param date The date to be added. + * Adds a new metric to the list of completed job metrics. + * + * @param completedDate The completed job date. + * @param dataSourceSize The data source size. */ - void addCompletedJobDate(java.util.Date date) { - completedJobDates.add(date.getTime()); + void addCompletedJobMetric(java.util.Date completedDate, long dataSourceSize) { + completedJobMetrics.add(new JobMetric(completedDate, dataSourceSize)); } } - + + /** + * A single job metric for an auto ingest cluster. + */ + static final class JobMetric { + + private final long completedDate; + private final long dataSourceSize; + + /** + * Instantiates a job metric. + * + * @param completedDate The job completion date. + * @param dataSourceSize The data source size. + */ + JobMetric(java.util.Date completedDate, long dataSourceSize) { + this.completedDate = completedDate.getTime(); + this.dataSourceSize = dataSourceSize; + } + + /** + * Gets the job completion date, formatted in milliseconds. + * + * @return The job completion date. + */ + long getCompletedDate() { + return completedDate; + } + + /** + * Gets the data source size. + * + * @return The data source size. + */ + long getDataSourceSize() { + return dataSourceSize; + } + } + /** * Exception type thrown when there is an error completing an auto ingest * metrics collector operation. @@ -157,4 +197,4 @@ final class AutoIngestMetricsCollector { } } -} \ No newline at end of file +} diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMetricsDialog.form b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMetricsDialog.form index 49e700ca21..cbe7b53c2f 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMetricsDialog.form +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMetricsDialog.form @@ -30,10 +30,14 @@ - - + + - + + + + + @@ -43,17 +47,17 @@ - + + + + + + + - - - - - - - + @@ -109,5 +113,12 @@ + + + + + + + diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMetricsDialog.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMetricsDialog.java index 80bcb6958b..af0679be5f 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMetricsDialog.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMetricsDialog.java @@ -1,7 +1,7 @@ /* * Autopsy Forensic Browser * - * Copyright 2011-2017 Basis Technology Corp. + * Copyright 2017 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -25,24 +25,28 @@ import java.awt.Window; import java.sql.Date; import java.text.SimpleDateFormat; import java.time.ZoneOffset; +import java.util.List; import org.openide.util.NbBundle; import org.openide.util.NbBundle.Messages; +import org.sleuthkit.autopsy.experimental.autoingest.AutoIngestMetricsCollector.JobMetric; /** * Displays auto ingest metrics for a cluster. */ final class AutoIngestMetricsDialog extends javax.swing.JDialog { - + + private static final int GIGABYTE_SIZE = 1073741824; + private final AutoIngestMetricsCollector autoIngestMetricsCollector; /** * Creates an instance of AutoIngestMetricsDialog - * + * * @param parent The parent container. */ @Messages({ "AutoIngestMetricsDialog.title.text=Auto Ingest Cluster Metrics", - "AutoIngestMetricsDialog.initReportText=Select a date below and click the 'Get Metrics Since...' button to generate\na metrics report." + "AutoIngestMetricsDialog.initReportText=Select a date above and click the 'Generate Metrics Report' button to generate\na metrics report." }) AutoIngestMetricsDialog(Container parent) throws AutoIngestMetricsDialogException { super((Window) parent, NbBundle.getMessage(AutoIngestMetricsDialog.class, "AutoIngestMetricsDialog.title.text"), ModalityType.MODELESS); @@ -58,34 +62,39 @@ final class AutoIngestMetricsDialog extends javax.swing.JDialog { setLocationRelativeTo(parent); setVisible(true); } - + /** * Update the metrics shown in the report text area. */ private void updateMetrics() { - if(datePicker.getDate() == null) { + if (datePicker.getDate() == null) { return; } - + AutoIngestMetricsCollector.MetricsSnapshot metricsSnapshot = autoIngestMetricsCollector.queryCoordinationServiceForMetrics(); - Object[] completedJobDates = metricsSnapshot.getCompletedJobDates().toArray(); - int count = 0; + List completedJobMetrics = metricsSnapshot.getCompletedJobMetrics(); + int jobsCompleted = 0; + long dataSourceSizeTotal = 0; long pickedDate = datePicker.getDate().atStartOfDay().toEpochSecond(ZoneOffset.UTC) * 1000; - for(int i = completedJobDates.length - 1; i >= 0; i--) { - if((Long)completedJobDates[i] >= pickedDate) { - count++; + + for (JobMetric jobMetric : completedJobMetrics) { + if (jobMetric.getCompletedDate() >= pickedDate) { + jobsCompleted++; + dataSourceSizeTotal += jobMetric.getDataSourceSize(); } } - + SimpleDateFormat dateFormatter = new SimpleDateFormat("MMM d, yyyy"); reportTextArea.setText(String.format( - "Since %s:\n" + - "\tNumber of Jobs Completed: %d\n", + "Since %s:\n" + + "Number of Jobs Completed: %d\n" + + "Total Size of Data Sources: %.1f GB\n", dateFormatter.format(Date.valueOf(datePicker.getDate())), - count + jobsCompleted, + (double) dataSourceSizeTotal / GIGABYTE_SIZE )); } - + /** * Exception type thrown when there is an error completing an auto ingest * metrics dialog operation. @@ -131,6 +140,7 @@ final class AutoIngestMetricsDialog extends javax.swing.JDialog { reportTextArea = new javax.swing.JTextArea(); metricsButton = new javax.swing.JButton(); datePicker = new DatePicker(); + startingDataLabel = new javax.swing.JLabel(); setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); setAlwaysOnTop(true); @@ -158,6 +168,8 @@ final class AutoIngestMetricsDialog extends javax.swing.JDialog { datePicker.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestMetricsDialog.class, "AutoIngestMetricsDialog.datePicker.toolTipText")); // NOI18N + org.openide.awt.Mnemonics.setLocalizedText(startingDataLabel, org.openide.util.NbBundle.getMessage(AutoIngestMetricsDialog.class, "AutoIngestMetricsDialog.startingDataLabel.text")); // NOI18N + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( @@ -167,24 +179,28 @@ final class AutoIngestMetricsDialog extends javax.swing.JDialog { .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jScrollPane1) .addGroup(layout.createSequentialGroup() - .addComponent(metricsButton) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(startingDataLabel) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(datePicker, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 33, Short.MAX_VALUE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 7, Short.MAX_VALUE) + .addComponent(metricsButton)) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addGap(0, 0, Short.MAX_VALUE) .addComponent(closeButton, javax.swing.GroupLayout.PREFERRED_SIZE, 70, javax.swing.GroupLayout.PREFERRED_SIZE))) .addContainerGap()) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addGroup(layout.createSequentialGroup() .addContainerGap() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(metricsButton) + .addComponent(datePicker, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(startingDataLabel)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 128, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(closeButton) - .addComponent(metricsButton)) - .addComponent(datePicker, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addComponent(closeButton) .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); @@ -208,5 +224,6 @@ final class AutoIngestMetricsDialog extends javax.swing.JDialog { private javax.swing.JScrollPane jScrollPane1; private javax.swing.JButton metricsButton; private javax.swing.JTextArea reportTextArea; + private javax.swing.JLabel startingDataLabel; // End of variables declaration//GEN-END:variables -} \ No newline at end of file +} diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties index 5f335b1ba4..d953b0ceb3 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties @@ -228,10 +228,11 @@ AutoIngestDashboard.prioritizeCaseButton.toolTipText=Move all images associated AutoIngestDashboard.prioritizeCaseButton.text=Prioritize &Case AutoIngestMetricsDialog.reportTextArea.text= AutoIngestDashboard.clusterMetricsButton.text=Cluster Metrics -AutoIngestMetricsDialog.metricsButton.text=Get Metrics Since... +AutoIngestMetricsDialog.metricsButton.text=Generate Metrics Report AutoIngestMetricsDialog.closeButton.text=Close AutoIngestMetricsDialog.datePicker.toolTipText=Choose a date ArchiveFilePanel.pathLabel.text=Browse for an archive file: ArchiveFilePanel.browseButton.text=Browse ArchiveFilePanel.pathTextField.text= -ArchiveFilePanel.errorLabel.text=Error Label \ No newline at end of file +ArchiveFilePanel.errorLabel.text=Error Label +AutoIngestMetricsDialog.startingDataLabel.text=Starting Date: