diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/IndexFinder.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/IndexFinder.java index 0c54021b26..8ae76d4ff4 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/IndexFinder.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/IndexFinder.java @@ -111,10 +111,22 @@ class IndexFinder { return bestCandidateIndex; } + /** + * Creates a copy of an existing Solr index as well as a reference copy of Solr config set. + * + * @param indexToUpgrade Index object to create a copy of + * @param context AutopsyService.CaseContext object + * @param numCompletedWorkUnits Number of completed progress units so far + * + * @return + * + * @throws + * org.sleuthkit.autopsy.framework.AutopsyService.AutopsyServiceException + */ @NbBundle.Messages({ "SolrSearch.copyIndex.msg=Copying existing text index", "SolrSearch.copyConfigSet.msg=Copying Solr config set",}) - String copyIndexAndConfigSet(Case theCase, Index indexToUpgrade, AutopsyService.CaseContext context, int numCompletedWorkUnits) throws AutopsyService.AutopsyServiceException { + String copyIndexAndConfigSet(Index indexToUpgrade, AutopsyService.CaseContext context, int numCompletedWorkUnits) throws AutopsyService.AutopsyServiceException { ProgressIndicator progress = context.getProgressIndicator(); @@ -123,7 +135,7 @@ class IndexFinder { // Copy the "old" index into ModuleOutput/keywordsearch/data/solrX_schema_Y/index progress.progress(Bundle.SolrSearch_copyIndex_msg(), numCompletedWorkUnits++); - String newIndexDir = copyExistingIndex(theCase, indexToUpgrade); + String newIndexDir = copyExistingIndex(context.getCase(), indexToUpgrade); // Check for cancellation at whatever points are feasible checkCancellation(context); @@ -180,7 +192,6 @@ class IndexFinder { if (!pathToConfigSet.exists() || !pathToConfigSet.isDirectory()) { logger.log(Level.WARNING, "Unable to locate KWS config set in order to create a reference copy"); //NON-NLS return; - // ELTODO This is NTH: throw new AutopsyService.AutopsyServiceException("Unable to locate the config set"); } } } diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/IndexUpgrader.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/IndexUpgrader.java index be2e82db4e..79c53bec52 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/IndexUpgrader.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/IndexUpgrader.java @@ -47,10 +47,23 @@ class IndexUpgrader { JAVA_PATH = PlatformUtil.getJavaPath(); } + /** + * Perform Solr text index upgrade to the latest supported version of Solr. + * + * @param newIndexDir Full path to directory of Solr index to be upgraded + * @param indexToUpgrade Index object of the existing Solr index + * @param context AutopsyService.CaseContext object + * @param numCompletedWorkUnits Number of completed progress units so far + * + * @return Index object of the upgraded index + * + * @throws + * org.sleuthkit.autopsy.framework.AutopsyService.AutopsyServiceException + */ @NbBundle.Messages({ "SolrSearch.upgrade4to5.msg=Upgrading existing text index from Solr 4 to Solr 5", "SolrSearch.upgrade5to6.msg=Upgrading existing text index from Solr 5 to Solr 6", - "SolrSearch.upgradeFailed.msg=Upgrade of existing Solr text index failed, deleting temporary directories",}) + "SolrSearch.upgradeFailed.msg=Upgrade of existing Solr text index failed, deleting temporary directories",}) Index performIndexUpgrade(String newIndexDir, Index indexToUpgrade, AutopsyService.CaseContext context, int numCompletedWorkUnits) throws AutopsyService.AutopsyServiceException { ProgressIndicator progress = context.getProgressIndicator(); @@ -67,16 +80,19 @@ class IndexUpgrader { // Check for cancellation at whatever points are feasible checkCancellation(context); + // create process terminator that will monitor the cancellation flag + UserCancelledProcessTerminator terminatior = new UserCancelledProcessTerminator(context); + // upgrade from Solr 4 to 5 progress.progress(Bundle.SolrSearch_upgrade4to5_msg(), numCompletedWorkUnits++); - currentSolrVersion = upgradeSolrIndexVersion4to5(currentSolrVersion, newIndexDir, tempResultsDir); + currentSolrVersion = upgradeSolrIndexVersion4to5(currentSolrVersion, newIndexDir, tempResultsDir, terminatior); // Check for cancellation at whatever points are feasible checkCancellation(context); // upgrade from Solr 5 to 6 progress.progress(Bundle.SolrSearch_upgrade5to6_msg(), numCompletedWorkUnits++); - currentSolrVersion = upgradeSolrIndexVersion5to6(currentSolrVersion, newIndexDir, tempResultsDir); + currentSolrVersion = upgradeSolrIndexVersion5to6(currentSolrVersion, newIndexDir, tempResultsDir, terminatior); // create upgraded index object upgradedIndex = new Index(newIndexDir, Double.toString(currentSolrVersion), indexToUpgrade.getSchemaVersion()); @@ -103,10 +119,11 @@ class IndexUpgrader { * @param currentIndexVersion Current Solr index version * @param solr4IndexPath Full path to Solr v4 index directory * @param tempResultsDir Path to directory where to store log output + * @param terminatior Implementation of ExecUtil.ProcessTerminator to terminate upgrade process * * @return The new Solr index version. */ - private double upgradeSolrIndexVersion4to5(double currentIndexVersion, String solr4IndexPath, String tempResultsDir) throws AutopsyService.AutopsyServiceException, SecurityException, IOException { + private double upgradeSolrIndexVersion4to5(double currentIndexVersion, String solr4IndexPath, String tempResultsDir, UserCancelledProcessTerminator terminatior) throws AutopsyService.AutopsyServiceException, SecurityException, IOException { if (currentIndexVersion != 4.0) { return currentIndexVersion; @@ -139,7 +156,7 @@ class IndexUpgrader { ProcessBuilder processBuilder = new ProcessBuilder(commandLine); processBuilder.redirectOutput(new File(outputFileFullPath)); processBuilder.redirectError(new File(errFileFullPath)); - ExecUtil.execute(processBuilder); + ExecUtil.execute(processBuilder, terminatior); // alternatively can execute lucene upgrade command from the folder where lucene jars are located // java -cp ".;lucene-core-5.5.1.jar;lucene-backward-codecs-5.5.1.jar;lucene-codecs-5.5.1.jar;lucene-analyzers-common-5.5.1.jar" org.apache.lucene.index.IndexUpgrader \path\to\index @@ -152,10 +169,11 @@ class IndexUpgrader { * @param currentIndexVersion Current Solr index version * @param solr5IndexPath Full path to Solr v5 index directory * @param tempResultsDir Path to directory where to store log output + * @param terminatior Implementation of ExecUtil.ProcessTerminator to terminate upgrade process * * @return The new Solr index version. */ - private double upgradeSolrIndexVersion5to6(double currentIndexVersion, String solr5IndexPath, String tempResultsDir) throws AutopsyService.AutopsyServiceException, SecurityException, IOException { + private double upgradeSolrIndexVersion5to6(double currentIndexVersion, String solr5IndexPath, String tempResultsDir, UserCancelledProcessTerminator terminatior) throws AutopsyService.AutopsyServiceException, SecurityException, IOException { if (currentIndexVersion != 5.0) { return currentIndexVersion; } @@ -187,11 +205,30 @@ class IndexUpgrader { ProcessBuilder processBuilder = new ProcessBuilder(commandLine); processBuilder.redirectOutput(new File(outputFileFullPath)); processBuilder.redirectError(new File(errFileFullPath)); - ExecUtil.execute(processBuilder); + ExecUtil.execute(processBuilder, terminatior); // alternatively can execute lucene upgrade command from the folder where lucene jars are located // java -cp ".;lucene-core-6.2.1.jar;lucene-backward-codecs-6.2.1.jar;lucene-codecs-6.2.1.jar;lucene-analyzers-common-6.2.1.jar" org.apache.lucene.index.IndexUpgrader \path\to\index return 6.0; } + /** + * Process terminator that can be used to kill Solr index upgrade processes + * if a user has requested to cancel the upgrade. + */ + private class UserCancelledProcessTerminator implements ExecUtil.ProcessTerminator { + + AutopsyService.CaseContext context = null; + UserCancelledProcessTerminator(AutopsyService.CaseContext context) { + this.context = context; + } + + @Override + public boolean shouldTerminateProcess() { + if (context.cancelRequested()) { + return true; + } + return false; + } + } } diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/SolrSearchService.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/SolrSearchService.java index 1b204dd429..26a1e36f7a 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/SolrSearchService.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/SolrSearchService.java @@ -185,7 +185,7 @@ public class SolrSearchService implements KeywordSearchService, AutopsyService { */ ProgressIndicator progress = context.getProgressIndicator(); - int totalNumProgressUnits = 7; + int totalNumProgressUnits = 8; int progressUnitsCompleted = 1; // do a case subdirectory search to check for the existence and upgrade status of KWS indexes @@ -250,7 +250,7 @@ public class SolrSearchService implements KeywordSearchService, AutopsyService { } // Copy the existing index and config set into ModuleOutput/keywordsearch/data/solrX_schema_Y/ - String newIndexDir = indexFinder.copyIndexAndConfigSet(context.getCase(), indexToUpgrade, context, progressUnitsCompleted); + String newIndexDir = indexFinder.copyIndexAndConfigSet(indexToUpgrade, context, progressUnitsCompleted); progressUnitsCompleted += 2; // add progress increments for copying existing index and config set // upgrade the existing index to the latest supported Solr version