Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/master' into collect-telemetry
Browse files Browse the repository at this point in the history
  • Loading branch information
ricklue committed Jun 13, 2024
2 parents a8b959e + c0cc84b commit 45949a8
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 159 deletions.
1 change: 0 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
/wip
/.classpath
/.settings
/skip-replace-inject.txt
.idea/
.project
.vscode/
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
<properties>
<revision>3.0-SNAPSHOT</revision>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<frontend.version>0.0.54</frontend.version><!-- Is parsed by the GitHub actions test that triggers the ladybug-frontend Cypress test -->
<frontend.version>0.0.57</frontend.version><!-- Is parsed by the GitHub actions test that triggers the ladybug-frontend Cypress test -->
<spring.version>6.1.7</spring.version>
<cxf.version>4.0.4</cxf.version>
<jackson.version>2.17.1</jackson.version>
Expand Down
179 changes: 22 additions & 157 deletions src/main/java/nl/nn/testtool/web/api/RunApi.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand All @@ -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;
Expand All @@ -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<String> exceptions = new ArrayList<>();
ReportRunner runner = getRunner(testTool.getStorage(debugStorageName));
public Response runReport(@PathParam("storageName") String storageName, @PathParam("storageId") int storageId) {
Map<String, Object> 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<Integer, Report> 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();
}

Expand All @@ -124,114 +99,4 @@ private Map<String, Object> 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<Integer, Report> 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<Object, Object>());
return Response.ok().build();
}

Map<Object, Object> 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<Object, Object> 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;
}
}

0 comments on commit 45949a8

Please sign in to comment.