diff --git a/.gitignore b/.gitignore index b236e619..e7b49f50 100644 --- a/.gitignore +++ b/.gitignore @@ -3,7 +3,6 @@ /wip /.classpath /.settings -/skip-replace-inject.txt .idea/ .project .vscode/ \ No newline at end of file diff --git a/pom.xml b/pom.xml index db891be5..240028f2 100644 --- a/pom.xml +++ b/pom.xml @@ -16,7 +16,7 @@ 3.0-SNAPSHOT UTF-8 - 0.0.54 + 0.0.57 6.1.7 4.0.4 2.17.1 diff --git a/src/main/java/nl/nn/testtool/web/api/RunApi.java b/src/main/java/nl/nn/testtool/web/api/RunApi.java index 3a2f0c9a..8660f816 100644 --- a/src/main/java/nl/nn/testtool/web/api/RunApi.java +++ b/src/main/java/nl/nn/testtool/web/api/RunApi.java @@ -16,11 +16,8 @@ package nl.nn.testtool.web.api; import java.lang.invoke.MethodHandles; -import java.util.ArrayList; -import java.util.Arrays; import java.util.Collections; import java.util.HashMap; -import java.util.List; import java.util.Map; import org.slf4j.Logger; @@ -30,7 +27,6 @@ import jakarta.inject.Inject; import jakarta.ws.rs.Consumes; import jakarta.ws.rs.POST; -import jakarta.ws.rs.PUT; import jakarta.ws.rs.Path; import jakarta.ws.rs.PathParam; import jakarta.ws.rs.Produces; @@ -41,8 +37,6 @@ import nl.nn.testtool.TestTool; import nl.nn.testtool.run.ReportRunner; import nl.nn.testtool.run.RunResult; -import nl.nn.testtool.storage.CrudStorage; -import nl.nn.testtool.storage.Storage; import nl.nn.testtool.storage.StorageException; import nl.nn.testtool.transform.ReportXmlTransformer; import nl.nn.testtool.web.ApiServlet; @@ -53,59 +47,40 @@ public class RunApi extends ApiBase { private @Setter @Inject @Autowired TestTool testTool; private @Setter @Inject @Autowired ReportXmlTransformer reportXmlTransformer; - /** - * Rerun the given report, and save the output the target storage. - * - * @param storageId the id of the report in the testStorage to run - * @param testStorageName Name of the test storage. - * @param debugStorageName Name of the debug storage. - * @return The response of running the report. - */ @POST - @Path("/run/{testStorageName}/{debugStorageName}/{storageId}") + @Path("/run/{storageName}/{storageId}") @Produces(MediaType.APPLICATION_JSON) @Consumes(MediaType.APPLICATION_JSON) - public Response runReport(@PathParam("storageId") int storageId, @PathParam("testStorageName") String testStorageName, @PathParam("debugStorageName") String debugStorageName) { - Storage testStorage = testTool.getStorage(testStorageName); - List exceptions = new ArrayList<>(); - ReportRunner runner = getRunner(testTool.getStorage(debugStorageName)); + public Response runReport(@PathParam("storageName") String storageName, @PathParam("storageId") int storageId) { Map result = new HashMap<>(); - String exception = null; - - // Reran reports will allow us to keep track of old reran reports. This will later be used in replace and result. - HashMap reranReports = getSessionAttr("reranReports", false); - if (reranReports == null) { - reranReports = new HashMap<>(); - setSessionAttr("reranReports", reranReports); - } - + String errorMessage = null; try { - Report report = testStorage.getReport(storageId); + Report report = testTool.getStorage(storageName).getReport(storageId); if (report != null) { report.setTestTool(testTool); - reranReports.put(storageId, report); - exception = runner.run(Collections.singletonList(report), true, true); - RunResult runResult = runner.getResults().get(storageId); - if (runResult.errorMessage != null) { - exceptions.add(runResult.errorMessage); + ReportRunner runner = new ReportRunner(); + runner.setTestTool(testTool); + runner.setDebugStorage(testTool.getDebugStorage()); + runner.setSecurityContext(this); + errorMessage = runner.run(Collections.singletonList(report), true, true); + if (errorMessage == null) { + RunResult runResult = runner.getResults().get(storageId); + if (runResult.errorMessage == null) { + Report runResultReport = runner.getRunResultReport(runResult.correlationId); + runResultReport.setTestTool(testTool); + result = extractRunResult(report, runResultReport, runner); + } else { + errorMessage = runResult.errorMessage; + } } - - Report runResultReport = runner.getRunResultReport(runResult.correlationId); - runResultReport.setTestTool(testTool); - result = extractRunResult(report, runResultReport, runner); } } catch (StorageException e) { - exceptions.add("Exception for report in [testStorage] with storage id [" + storageId + "] - detailed error message - " + e + Arrays.toString(e.getStackTrace())); - e.printStackTrace(); + errorMessage = "Storage exception: " + e.getMessage(); + log.error(errorMessage, e); } - - if (exceptions.size() > 0) { - String message = "Exceptions have been thrown, causing the related reports not to run. - detailed error message - Exceptions:\n" + String.join(". \n", exceptions); - return Response.serverError().entity(message).build(); - } else if (exception != null) { - return Response.status(Response.Status.SERVICE_UNAVAILABLE).entity("Exception has been thrown, caused the related report not to run. - detailed error message - " + exception).build(); + if (errorMessage != null) { + return Response.serverError().entity(errorMessage).build(); } - return Response.ok(result).build(); } @@ -124,114 +99,4 @@ private Map extractRunResult(Report report, Report runResultRepo return res; } - @PUT - @Path("/replace/{debugStorage}/{storageId}") - @Produces(MediaType.APPLICATION_JSON) - @Consumes(MediaType.APPLICATION_JSON) - public Response runReport(@PathParam("debugStorage") String storageName, @PathParam("storageId") int storageId) { - try { - // Get run result report. - // TODO: Rename debugStorageStorageParam to debugStorageName and use testTool.getStorage(debugStorageName) - // (frontend needs to be changed to use storage name instead of bean name) - Storage debugStorage = testTool.getStorage(storageName); - ReportRunner reportRunner = getRunner(debugStorage); - Report runResultReport = reportRunner.getRunResultReport(reportRunner.getResults().get(storageId).correlationId); - - // Get original report. - HashMap reranReports = getSessionAttr("reranReports", true); - Report report = reranReports.get(storageId); - - // Apply transformations, etc - log.debug("Replacing report [" + report.getStorage().getName() + ":" + report.getStorageId() + "] " + - "with [" + debugStorage.getName() + ":" + runResultReport.getStorageId() + "]"); - runResultReport.setTestTool(report.getTestTool()); - runResultReport.setName(report.getName()); - runResultReport.setDescription(report.getDescription()); - if (report.getCheckpoints().get(0).containsVariables()) { - runResultReport.getCheckpoints().get(0).setMessage(report.getCheckpoints().get(0).getMessage()); - } - runResultReport.setPath(report.getPath()); - runResultReport.setTransformation(report.getTransformation()); - runResultReport.setReportXmlTransformer(report.getReportXmlTransformer()); - runResultReport.setVariableCsvWithoutException(report.getVariableCsv()); - runResultReport.setStorageId(report.getStorageId()); - - ((CrudStorage) report.getStorage()).update(runResultReport); - reportRunner.getResults().remove(storageId); - reranReports.remove(storageId); - return Response.ok(runResultReport).build(); - } catch (StorageException e) { - e.printStackTrace(); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity("Exception while replacing report with storage id [" + storageId + "] - detailed error message - " + e + Arrays.toString(e.getStackTrace())).build(); - } - } - /** - * Resets all the report runners. - * @return The response after resetting the reports. - */ - @POST - @Path("/reset") - public Response resetAll() { - Object sessionAttr = getSessionAttr("reportRunner", false); - if (!(sessionAttr instanceof Map)) { - setSessionAttr("reportRunner", new HashMap()); - return Response.ok().build(); - } - - Map map = (Map) sessionAttr; - for (Object key : map.keySet()) { - Object val = map.get(key); - if (val instanceof ReportRunner) { - ReportRunner runner = (ReportRunner) val; - runner.reset(); - } else { - map.remove(key); - } - } - return Response.ok().build(); - } - - /** - * Resets the re-runner with the given debug storage. - * @param storageName Name of the debug storage. - * @return The response after resetting. - */ - @POST - @Path("/reset/{debugStorage}") - public Response resetRunner(@PathParam("debugStorage") String storageName) { - Storage storage = testTool.getStorage(storageName); - ReportRunner runner = getRunner(storage); - runner.reset(); - return Response.ok().build(); - } - - /** - * Return from the map, or generate report re-runner with the given debug storage. - * With the API, each session can create multiple re-runners for different debug storages. - * - * @param debugStorage Debug storage. - * @return ReportRunner that uses the given debug storage. - */ - private ReportRunner getRunner(Storage debugStorage) { - Map runners; - - Object sessionAttr = getSessionAttr("reportRunner", false); - if (sessionAttr instanceof Map) { - runners = (Map) sessionAttr; - } else { - runners = new HashMap<>(); - setSessionAttr("reportRunner", runners); - } - - ReportRunner runner = (ReportRunner) runners.get(debugStorage); - if (runner == null) { - runner = new ReportRunner(); - runner.setTestTool(testTool); - runner.setDebugStorage(debugStorage); - runner.setSecurityContext(this); - runners.put(debugStorage, runner); - } - - return runner; - } }