diff --git a/source/src/main/java/org/cerberus/core/apiprivate/TestDataLibController.java b/source/src/main/java/org/cerberus/core/apiprivate/TestDataLibController.java index 486d43a974..c8ac6384e0 100644 --- a/source/src/main/java/org/cerberus/core/apiprivate/TestDataLibController.java +++ b/source/src/main/java/org/cerberus/core/apiprivate/TestDataLibController.java @@ -19,40 +19,32 @@ */ package org.cerberus.core.apiprivate; -import org.cerberus.core.util.datatable.DataTableInformation; -import com.google.gson.Gson; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiImplicitParams; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.net.MalformedURLException; import javax.servlet.http.HttpServletRequest; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import org.cerberus.core.crud.entity.LogEvent; -import org.cerberus.core.crud.entity.Test; -import org.cerberus.core.crud.factory.IFactoryLogEvent; -import org.cerberus.core.crud.factory.IFactoryTest; +import org.cerberus.core.api.exceptions.EntityNotFoundException; +import org.cerberus.core.crud.entity.TestDataLib; import org.cerberus.core.crud.service.ILogEventService; import org.cerberus.core.crud.service.IParameterService; -import org.cerberus.core.crud.service.ITestService; -import org.cerberus.core.crud.service.impl.TestCaseExecutionService; -import org.cerberus.core.engine.entity.MessageEvent; -import org.cerberus.core.enums.MessageEventEnum; -import org.cerberus.core.util.ParameterParserUtil; -import org.cerberus.core.util.answer.Answer; +import org.cerberus.core.crud.service.ITestDataLibService; +import org.cerberus.core.util.StringUtil; import org.cerberus.core.util.answer.AnswerItem; -import org.cerberus.core.util.answer.AnswerList; import org.cerberus.core.util.servlet.ServletUtil; -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; import org.owasp.html.PolicyFactory; import org.owasp.html.Sanitizers; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.io.InputStreamResource; +import org.springframework.core.io.Resource; +import org.springframework.core.io.UrlResource; +import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; -import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PatchMapping; import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -68,16 +60,10 @@ public class TestDataLibController { private final PolicyFactory policy = Sanitizers.FORMATTING.and(Sanitizers.LINKS); @Autowired - TestCaseExecutionService testCaseExecutionService; - @Autowired - ITestService testService; - @Autowired - IFactoryTest factoryTest; + ITestDataLibService testDataLibService; @Autowired ILogEventService logEventService; @Autowired - IFactoryLogEvent factoryLogEvent; - @Autowired IParameterService parameterService; /** @@ -87,26 +73,48 @@ public class TestDataLibController { * @param request * @return */ - @GetMapping(path = "/csv", produces = MediaType.TEXT_PLAIN_VALUE) - public String readCsv( - // @PathVariable("testdatalibid") String testdatalibid, + @GetMapping(path = "{testdatalibid}/csv", produces = MediaType.TEXT_PLAIN_VALUE) + public ResponseEntity downloadCsv( + @PathVariable("testdatalibid") int testdatalibid, HttpServletRequest request) { - - JSONObject object = new JSONObject(); - boolean userHasPermissions = request.isUserInRole("TestAdmin"); - + Resource resource; + String filename = ""; try { - // Calling Servlet Transversal Util. + ServletUtil.servletStart(request); -// testdatalibid = policy.sanitize(testdatalibid); -// AnswerItem answerTest = testService.readByKey(test); - object.put("hasPermissions", userHasPermissions); + AnswerItem answerTest = testDataLibService.readByKey(testdatalibid); + TestDataLib res = answerTest.getItem(); + if ((res == null) || !(TestDataLib.TYPE_CSV.equals(res.getType())) || (StringUtil.isEmpty(res.getCsvUrl()))) { + throw new EntityNotFoundException(TestDataLib.class, "Data Library", testdatalibid); + } - } catch (JSONException ex) { - LOG.warn(ex, ex); + filename = res.getName(); + String servicePathCsv = res.getCsvUrl(); + if (!StringUtil.isURL(servicePathCsv)) { + // Url is still not valid. We try to add the path from csv parameter. + String csv_path = parameterService.getParameterStringByKey("cerberus_testdatalibcsv_path", "", ""); + csv_path = StringUtil.addSuffixIfNotAlready(csv_path, File.separator); + servicePathCsv = csv_path + servicePathCsv; + resource = new InputStreamResource(new FileInputStream(servicePathCsv)); + + } else { + + resource = new UrlResource(servicePathCsv); + + } + + } catch (MalformedURLException e) { + LOG.error(e, e); + return null; + } catch (FileNotFoundException ex) { + LOG.error(ex, ex); + return null; } - return "toto"; + + return ResponseEntity.ok().contentType(MediaType.TEXT_PLAIN) + .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + filename + "\"") + .body(resource); } diff --git a/source/src/main/java/org/cerberus/core/apiprivate/error/RestResponseEntityExceptionHandler.java b/source/src/main/java/org/cerberus/core/apiprivate/error/RestResponseEntityExceptionHandler.java index a51d0d6c7c..95e85f5860 100644 --- a/source/src/main/java/org/cerberus/core/apiprivate/error/RestResponseEntityExceptionHandler.java +++ b/source/src/main/java/org/cerberus/core/apiprivate/error/RestResponseEntityExceptionHandler.java @@ -20,6 +20,8 @@ package org.cerberus.core.apiprivate.error; import java.nio.file.AccessDeniedException; +import org.cerberus.core.api.controllers.wrappers.ResponseWrapper; +import org.cerberus.core.api.exceptions.EntityNotFoundException; import org.springframework.dao.DataAccessException; import org.springframework.dao.DataIntegrityViolationException; import org.springframework.dao.InvalidDataAccessApiUsageException; @@ -31,6 +33,7 @@ import org.springframework.web.bind.MissingServletRequestParameterException; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.context.request.WebRequest; import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler; @@ -67,7 +70,7 @@ protected ResponseEntity handleMethodArgumentNotValid(final MethodArgume } @Override - protected ResponseEntity handleMissingServletRequestParameter(final MissingServletRequestParameterException ex, final HttpHeaders headers, final HttpStatus status, final WebRequest request) { + protected ResponseEntity handleMissingServletRequestParameter(final MissingServletRequestParameterException ex, final HttpHeaders headers, final HttpStatus status, final WebRequest request) { String name = ex.getParameterName(); final String bodyOfResponse = name + " parameter is missing"; return handleExceptionInternal(ex, bodyOfResponse, new HttpHeaders(), HttpStatus.EXPECTATION_FAILED, request); @@ -85,6 +88,13 @@ protected ResponseEntity handleConflict(final RuntimeException ex, final return handleExceptionInternal(ex, bodyOfResponse, new HttpHeaders(), HttpStatus.CONFLICT, request); } + @ExceptionHandler(EntityNotFoundException.class) + @ResponseStatus(HttpStatus.NOT_FOUND) + protected ResponseEntity handleEntityNotFound(final EntityNotFoundException ex, final WebRequest request) { + final String bodyOfResponse = "Object not found !!"; + return handleExceptionInternal(ex, bodyOfResponse, new HttpHeaders(), HttpStatus.NOT_FOUND, request); + } + // 500 @ExceptionHandler({NullPointerException.class, IllegalArgumentException.class, IllegalStateException.class}) public ResponseEntity handleInternal(final RuntimeException ex, final WebRequest request) { diff --git a/source/src/main/java/org/cerberus/core/service/csvfile/ICsvFileService.java b/source/src/main/java/org/cerberus/core/service/csvfile/ICsvFileService.java index d0394d4d33..f884abd6d9 100644 --- a/source/src/main/java/org/cerberus/core/service/csvfile/ICsvFileService.java +++ b/source/src/main/java/org/cerberus/core/service/csvfile/ICsvFileService.java @@ -42,6 +42,7 @@ public interface ICsvFileService { * columns will not be included in the answer * @param defaultNoMatchColumnValue the default value to set to any non-matched * column if necessary + * @param execution * @return */ AnswerList> parseCSVFile(String urlToCSVFile, String separator, HashMap columnsToGet,List columnsToHide, boolean ignoreNoMatchColumns, String defaultNoMatchColumnValue, TestCaseExecution execution); diff --git a/source/src/main/java/org/cerberus/core/util/servlet/ServletUtil.java b/source/src/main/java/org/cerberus/core/util/servlet/ServletUtil.java index 8c1cae541a..79c8393cb6 100644 --- a/source/src/main/java/org/cerberus/core/util/servlet/ServletUtil.java +++ b/source/src/main/java/org/cerberus/core/util/servlet/ServletUtil.java @@ -62,6 +62,9 @@ public static void servletStart(HttpServletRequest request) { case "/ReadExecutionStat": timeToWait = 30; break; + case "/ReadTestCase": + timeToWait = 30; + break; default: } LOG.debug("Servlet " + request.getServletPath() + " - Waiting : " + timeToWait); diff --git a/source/src/main/resources/documentation/D2/include/en/changelog_4.18_en.adoc b/source/src/main/resources/documentation/D2/include/en/changelog_4.18_en.adoc index 1467d52d36..c6fa6973c5 100644 --- a/source/src/main/resources/documentation/D2/include/en/changelog_4.18_en.adoc +++ b/source/src/main/resources/documentation/D2/include/en/changelog_4.18_en.adoc @@ -9,6 +9,7 @@ * Edit Robot button is available directly from execution page. * MANUAL Proxy configuration is also supported (on top of NETWORKTRAFFIC). * Copy to Clipboard button on APIKey User screen. +* CSV file can now be downloaded from test data lib screen. *Warning to be considered before applying the version (deprecated features)* [square] diff --git a/source/src/main/webapp/include/transversalobject/TestDataLib.html b/source/src/main/webapp/include/transversalobject/TestDataLib.html index 6013da9ff3..13a4af1d65 100644 --- a/source/src/main/webapp/include/transversalobject/TestDataLib.html +++ b/source/src/main/webapp/include/transversalobject/TestDataLib.html @@ -152,7 +152,16 @@