From c570d34893a61dccb71ae3cc9b69608e79022e35 Mon Sep 17 00:00:00 2001 From: pgwilliams Date: Thu, 12 Dec 2024 13:28:35 +0000 Subject: [PATCH] VAL-446 Improve error handling & reporting around file handling --- .../service/DroolsRulesValidationService.java | 11 +++++++- .../core/service/MysqlValidationService.java | 26 ++++++++++++------- .../core/service/ValidationVersionLoader.java | 2 +- 3 files changed, 27 insertions(+), 12 deletions(-) diff --git a/src/main/java/org/ihtsdo/rvf/core/service/DroolsRulesValidationService.java b/src/main/java/org/ihtsdo/rvf/core/service/DroolsRulesValidationService.java index 10c7f5e4..ddd882ac 100644 --- a/src/main/java/org/ihtsdo/rvf/core/service/DroolsRulesValidationService.java +++ b/src/main/java/org/ihtsdo/rvf/core/service/DroolsRulesValidationService.java @@ -304,7 +304,7 @@ private List validateFiles(ValidationRunConfig validationConfig, !uuidAssertionMap.get(UUID.fromString(item.getRuleId())).getGroups().contains("int-authoring")) || ((uuidAssertionMap.get(UUID.fromString(item.getRuleId())).getGroups().contains("common-authoring") || uuidAssertionMap.get(UUID.fromString(item.getRuleId())).getGroups().contains("int-authoring")) - && modules.contains(item.getComponent().getModuleId()))).collect(Collectors.toList()); + && modules.contains(item.getComponent().getModuleId()))).toList(); } } @@ -342,6 +342,7 @@ private List checkAgainstWhiteListedItems(List i } private void extractFiles(ValidationRunConfig validationConfig, Set extractedRF2FilesDirectories, Set previousReleaseDirectories) throws RVFExecutionException, ReleaseImportException, IOException { + verifyLocalFile("extracting prospective file", validationConfig.getLocalProspectiveFile()); try (InputStream testedReleaseFileStream = new FileInputStream(validationConfig.getLocalProspectiveFile())) { // If the validation is Delta validation, previous snapshot file must be loaded to snapshot files list. if (validationConfig.isRf2DeltaOnly()) { @@ -364,18 +365,26 @@ private void extractFiles(ValidationRunConfig validationConfig, Set extr if (StringUtils.isBlank(validationConfig.getExtensionDependency()) || !validationConfig.getExtensionDependency().endsWith(EXT_ZIP)) { throw new RVFExecutionException("Drools validation cannot execute when Extension Dependency is empty or not a .zip file: " + validationConfig.getExtensionDependency()); } + verifyLocalFile("extracting dependency file", validationConfig.getLocalDependencyReleaseFile()); try (InputStream dependencyStream = new FileInputStream(validationConfig.getLocalDependencyReleaseFile())) { extractedRF2FilesDirectories.add(new ReleaseImporter().unzipRelease(dependencyStream, ReleaseImporter.ImportType.SNAPSHOT).getAbsolutePath()); } } if (StringUtils.isNotBlank(validationConfig.getPreviousRelease()) && validationConfig.getPreviousRelease().endsWith(EXT_ZIP)) { + verifyLocalFile("extracting previous release file", validationConfig.getLocalPreviousReleaseFile()); try (InputStream previousReleaseStream = new FileInputStream(validationConfig.getLocalPreviousReleaseFile())) { previousReleaseDirectories.add(new ReleaseImporter().unzipRelease(previousReleaseStream, ReleaseImporter.ImportType.SNAPSHOT).getAbsolutePath()); } } } + private void verifyLocalFile(String step, File file) throws RVFExecutionException { + if (file == null || !file.exists() || !file.canRead()) { + throw new RVFExecutionException("Drools validation failure while " + step + " as it is null, not found, or cannot be read. File name: '" + file + "'"); + } + } + private UUID parseUUID(String uuid) { try{ return UUID.fromString(uuid); diff --git a/src/main/java/org/ihtsdo/rvf/core/service/MysqlValidationService.java b/src/main/java/org/ihtsdo/rvf/core/service/MysqlValidationService.java index 06113f18..c0668727 100644 --- a/src/main/java/org/ihtsdo/rvf/core/service/MysqlValidationService.java +++ b/src/main/java/org/ihtsdo/rvf/core/service/MysqlValidationService.java @@ -1,8 +1,9 @@ package org.ihtsdo.rvf.core.service; -import org.apache.commons.lang3.exception.ExceptionUtils; + import org.ihtsdo.otf.rest.client.RestClientException; import org.ihtsdo.otf.rest.exception.BusinessServiceException; +import org.ihtsdo.otf.utils.ExceptionUtils; import org.ihtsdo.rvf.core.data.model.*; import org.ihtsdo.rvf.core.service.config.MysqlExecutionConfig; import org.ihtsdo.rvf.core.service.config.ValidationRunConfig; @@ -76,8 +77,10 @@ public ValidationStatusReport runRF2MysqlValidations(ValidationRunConfig validat } String reportStorage = validationConfig.getStorageLocation(); + String lastItemLoadAttempted = "Item Unknown"; try { // prepare release data for testing + lastItemLoadAttempted = "Previous Release - " + executionConfig.getPreviousVersion(); releaseVersionLoader.loadPreviousVersion(executionConfig); if (releaseVersionLoader.isUnknownVersion(executionConfig.getPreviousVersion())) { statusReport.addFailureMessage("Failed to load previous release " + executionConfig.getPreviousVersion()); @@ -85,16 +88,19 @@ public ValidationStatusReport runRF2MysqlValidations(ValidationRunConfig validat // load dependency release releaseVersionLoader.loadDependencyVersion(executionConfig); + lastItemLoadAttempted = "Dependency Release - " + executionConfig.getExtensionDependencyVersion(); if (releaseVersionLoader.isUnknownVersion(executionConfig.getExtensionDependencyVersion())) { statusReport.addFailureMessage("Failed to load dependency release " + executionConfig.getExtensionDependencyVersion()); } // load prospective version + lastItemLoadAttempted = "Prospective Release - " + executionConfig.getProspectiveVersion(); releaseVersionLoader.loadProspectiveVersion(statusReport, executionConfig, validationConfig); } catch (Exception e) { - String errorMsg = String.format("Failed to load data into MySql due to %s", ExceptionUtils.getRootCauseMessage(e)); - LOGGER.error(errorMsg, e); - statusReport.addFailureMessage(errorMsg); - statusReport.getReportSummary().put(TestType.SQL.name(), errorMsg); + String errorMsg = String.format("Failed to load data (%s) into MySql", lastItemLoadAttempted); + String errorMsgWithCause = ExceptionUtils.getExceptionCause(errorMsg, e); + LOGGER.error(errorMsgWithCause, e); + statusReport.addFailureMessage(errorMsgWithCause); + statusReport.getReportSummary().put(TestType.SQL.name(), errorMsgWithCause); return statusReport; } if (executionConfig.isExtensionValidation()) { @@ -138,10 +144,10 @@ private void runExtensionReleaseValidation(ValidationStatusReport statusReport, releaseVersionLoader.combineCurrentExtensionWithDependencySnapshot(executionConfig, validationConfig); this.legacyProspectiveVersions.add(executionConfig.getProspectiveVersion()); } catch (BusinessServiceException e) { - String msg = String.format("Failed to prepare data for extension testing due to error %s", ExceptionUtils.getRootCauseMessage(e)); - statusReport.addFailureMessage(msg); - LOGGER.error(msg, e); - statusReport.getReportSummary().put(TestType.SQL.name(), msg); + String errMsg = ExceptionUtils.getExceptionCause("Failed to prepare data for extension testing", e); + statusReport.addFailureMessage(errMsg); + LOGGER.error(errMsg, e); + statusReport.getReportSummary().put(TestType.SQL.name(), errMsg); } } testItems.addAll(runAssertionTests(executionConfig, noneReleaseTypeAssertions, reportStorage, true)); @@ -289,7 +295,7 @@ private void constructTestReport(ValidationStatusReport statusReport, MysqlExecu report.addFailedAssertions(Collections.emptyList()); report.addWarningAssertions(Collections.emptyList()); report.addPassedAssertions(Collections.emptyList()); - statusReport.addFailureMessage(String.format("Failed to extract test results caused by %s", ExceptionUtils.getRootCauseMessage(exception))); + statusReport.addFailureMessage(ExceptionUtils.getExceptionCause("Failed to extract test results",exception)); } final long timeEnd = System.currentTimeMillis(); diff --git a/src/main/java/org/ihtsdo/rvf/core/service/ValidationVersionLoader.java b/src/main/java/org/ihtsdo/rvf/core/service/ValidationVersionLoader.java index a0457fb8..70039213 100644 --- a/src/main/java/org/ihtsdo/rvf/core/service/ValidationVersionLoader.java +++ b/src/main/java/org/ihtsdo/rvf/core/service/ValidationVersionLoader.java @@ -84,7 +84,7 @@ public void loadPreviousVersion(MysqlExecutionConfig executionConfig) throws Bus String rvfDbSchema = loadRelease(executionConfig.getPreviousVersion()); executionConfig.setPreviousVersion(rvfDbSchema); } else { - throw new BusinessServiceException("Previous release specified is not found " + throw new BusinessServiceException("Previous release specified is not found: " + executionConfig.getPreviousVersion()); } }