From 9c2c7e8ce83b8dfda0b4c1fbd875c9c34caf51eb Mon Sep 17 00:00:00 2001 From: Joanna Jeremicz Date: Tue, 21 Aug 2018 13:29:02 +0200 Subject: Rename vid-simulator packages - Rename from openecomp to onap and update imports - Fix small bug in README.txt Change-Id: I099b010adf7ed6dd708c9feae0340be462b1d195 Issue-ID: VID-205 Signed-off-by: Joanna Jeremicz --- .../simulator/controller/SimulatorController.java | 337 +++++++++++++++++++++ .../errorHandling/VidSimulatorException.java | 8 + .../main/java/org/onap/simulator/model/Misc.java | 30 ++ .../org/onap/simulator/model/SimulatorRequest.java | 67 ++++ .../model/SimulatorRequestResponseExpectation.java | 48 +++ .../onap/simulator/model/SimulatorResponse.java | 59 ++++ .../onap/simulator/service/TranslatorService.java | 19 ++ .../simulator/controller/SimulatorController.java | 337 --------------------- .../errorHandling/VidSimulatorException.java | 8 - .../java/org/openecomp/simulator/model/Misc.java | 30 -- .../simulator/model/SimulatorRequest.java | 67 ---- .../model/SimulatorRequestResponseExpectation.java | 48 --- .../simulator/model/SimulatorResponse.java | 59 ---- .../simulator/service/TranslatorService.java | 19 -- .../src/main/webapp/WEB-INF/rest-servlet.xml | 2 +- 15 files changed, 569 insertions(+), 569 deletions(-) create mode 100644 vid-ext-services-simulator/src/main/java/org/onap/simulator/controller/SimulatorController.java create mode 100644 vid-ext-services-simulator/src/main/java/org/onap/simulator/errorHandling/VidSimulatorException.java create mode 100644 vid-ext-services-simulator/src/main/java/org/onap/simulator/model/Misc.java create mode 100644 vid-ext-services-simulator/src/main/java/org/onap/simulator/model/SimulatorRequest.java create mode 100644 vid-ext-services-simulator/src/main/java/org/onap/simulator/model/SimulatorRequestResponseExpectation.java create mode 100644 vid-ext-services-simulator/src/main/java/org/onap/simulator/model/SimulatorResponse.java create mode 100644 vid-ext-services-simulator/src/main/java/org/onap/simulator/service/TranslatorService.java delete mode 100644 vid-ext-services-simulator/src/main/java/org/openecomp/simulator/controller/SimulatorController.java delete mode 100644 vid-ext-services-simulator/src/main/java/org/openecomp/simulator/errorHandling/VidSimulatorException.java delete mode 100644 vid-ext-services-simulator/src/main/java/org/openecomp/simulator/model/Misc.java delete mode 100644 vid-ext-services-simulator/src/main/java/org/openecomp/simulator/model/SimulatorRequest.java delete mode 100644 vid-ext-services-simulator/src/main/java/org/openecomp/simulator/model/SimulatorRequestResponseExpectation.java delete mode 100644 vid-ext-services-simulator/src/main/java/org/openecomp/simulator/model/SimulatorResponse.java delete mode 100644 vid-ext-services-simulator/src/main/java/org/openecomp/simulator/service/TranslatorService.java (limited to 'vid-ext-services-simulator/src') diff --git a/vid-ext-services-simulator/src/main/java/org/onap/simulator/controller/SimulatorController.java b/vid-ext-services-simulator/src/main/java/org/onap/simulator/controller/SimulatorController.java new file mode 100644 index 000000000..b67c98ee9 --- /dev/null +++ b/vid-ext-services-simulator/src/main/java/org/onap/simulator/controller/SimulatorController.java @@ -0,0 +1,337 @@ +package org.onap.simulator.controller; + +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.mockserver.integration.ClientAndServer; +import org.mockserver.matchers.Times; +import org.mockserver.model.HttpRequest; +import org.mockserver.model.HttpResponse; +import static org.mockserver.model.HttpRequest.request; +import static org.mockserver.model.HttpResponse.response; + +import org.mockserver.model.JsonBody; +import org.onap.simulator.errorHandling.VidSimulatorException; +import org.onap.simulator.model.SimulatorRequestResponseExpectation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.core.io.ClassPathResource; +import org.springframework.core.io.Resource; +import org.springframework.core.io.support.PathMatchingResourcePatternResolver; +import org.springframework.core.io.support.PropertiesLoaderUtils; +import org.springframework.core.io.support.ResourcePatternResolver; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.servlet.HandlerMapping; +import org.springframework.web.servlet.View; + +import javax.annotation.PostConstruct; +import javax.annotation.PreDestroy; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.*; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.util.stream.Collectors; + +import static org.mockserver.integration.ClientAndServer.startClientAndServer; +import static org.mockserver.matchers.Times.exactly; + +@RestController +@Component +public class SimulatorController { + + private static final Times DEFAULT_NUMBER_OF_TIMES = Times.unlimited(); + private ClientAndServer mockServer; + private String mockServerProtocol; + private String mockServerHost; + private Integer mockServerPort; + private Boolean enablePresetRegistration; + private volatile boolean isInitialized = false; + + + Logger logger = LoggerFactory.getLogger(SimulatorController.class); + + @PostConstruct + public void init(){ + logger.info("Starting VID Simulator...."); + setProperties(); + mockServer = startClientAndServer(mockServerPort); + presetRegister(); + isInitialized = true; + logger.info("VID Simulator started successfully"); + } + + @PreDestroy + public void tearDown(){ + logger.info("Stopping VID Simulator...."); + isInitialized = false; + mockServer.stop(); + } + + + private void presetRegister() { + //Checking if set + if (enablePresetRegistration == null || !enablePresetRegistration){ + logger.info("Preset registration property is false or not set - skipping preset registration..."); + return; + } + ClassLoader cl = this.getClass().getClassLoader(); + ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(cl); + List resources = new ArrayList<>(); + try { + File presetDir = resolver.getResource("/preset_registration/").getFile(); + if (presetDir.exists() && presetDir.isDirectory()) { + resources = Files.walk(Paths.get(presetDir.getPath())) + .filter(p -> p.toString().endsWith(".json")) + .collect(Collectors.toList()); + } else { + logger.error("preset_registration directory is not exists"); + } + } catch (IOException e) { + logger.error("Error performing preset registration, error: ", e); + return; + } + logger.info("Starting preset registrations, number of requests: {}", resources.size()); + for (Path resource: resources){ + String content; + try { + content = new Scanner(resource).useDelimiter("\\Z").next(); + } catch (IOException e){ + logger.error("Error reading preset registration file {}, skipping to next one. Error: ", resource.getFileName(), e); + continue; + } + //register the preset request + try { + register(content); + } catch (VidSimulatorException e) { + logger.error("Error proceeding preset registration file {},skipping to next one. Check if the JSON is in correct format. Error: ", resource.getFileName(), e); + } + } + } + + + + private void setProperties() { + Resource resource = new ClassPathResource("simulator.properties"); + Properties props = new Properties(); + try { + props = PropertiesLoaderUtils.loadProperties(resource); + } catch (IOException e) { + logger.error("Error loading simulator properties, error: ", e); + return; + } + logger.info("Simulator properties are {}", props); + mockServerProtocol = (String)props.get("simulator.mockserver.protocol"); + mockServerHost = (String)props.get("simulator.mockserver.host"); + mockServerPort = Integer.parseInt((String)props.get("simulator.mockserver.port")); + enablePresetRegistration = Boolean.parseBoolean((String)props.get("simulator.enablePresetRegistration")); + } + + @RequestMapping(value = {"/registerToVidSimulator"}, method = RequestMethod.POST) + public @ResponseBody + ResponseEntity registerRequest(HttpServletRequest request, @RequestBody String expectation) { + try { + register(expectation); + } catch (VidSimulatorException e) { + return new ResponseEntity<>("Registration failure! Error: "+e.getMessage(),HttpStatus.BAD_REQUEST); + } + return new ResponseEntity<>("Registration successful!",HttpStatus.OK); + } + + @RequestMapping(value = {"/echo"}, method = RequestMethod.GET) + ResponseEntity echo(HttpServletRequest request) { + return isInitialized ? new ResponseEntity<>("",HttpStatus.OK) : new ResponseEntity<>("",HttpStatus.SERVICE_UNAVAILABLE); + } + +// @RequestMapping(value = {"/registerToVidSimulator"}, method = RequestMethod.GET) +// public ResponseEntity getAllRegisteredRequests() throws JsonProcessingException { +// final Expectation[] expectations = mockServer.retrieveExistingExpectations(null); +// return new ResponseEntity<>(new ObjectMapper() +// .configure(SerializationFeature.INDENT_OUTPUT, true) +// .writeValueAsString(expectations), HttpStatus.OK); +// } + + @RequestMapping(value = {"/registerToVidSimulator"}, method = RequestMethod.DELETE) + @ResponseStatus(value = HttpStatus.OK) + public void wipeOutAllExpectations() { + mockServer.reset(); + } + + private void register(String expectation) throws VidSimulatorException{ + ObjectMapper mapper = new ObjectMapper() + .configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true); + + SimulatorRequestResponseExpectation[] expectationModels; + try { + expectationModels = mapper.readValue(expectation, SimulatorRequestResponseExpectation[].class); + } catch (IOException e) { + logger.error("Couldn't deserialize register expectation {}, error:", expectation, e); + throw new VidSimulatorException(e.getMessage()); + } + + for (SimulatorRequestResponseExpectation expectationModel : expectationModels) { + logger.info("Proceeding registration request: {}", expectationModel); + register(expectationModel); + } + } + + + @RequestMapping(value = {"/**"}) + public String redirectToMockServer(HttpServletRequest request, HttpServletResponse response) { + //Currently, the easiest logic is redirecting + + //This is needed to allow POST redirect - see http://www.baeldung.com/spring-redirect-and-forward + request.setAttribute(View.RESPONSE_STATUS_ATTRIBUTE, HttpStatus.TEMPORARY_REDIRECT); + + //Building the redirect URL + String restOfTheUrl = (String) request.getAttribute( + HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE); + + //TODO encode only characters like spaces, not slashes + /* try { + restOfTheUrl = URLEncoder.encode(restOfTheUrl, "UTF-8"); + restOfTheUrl = restOfTheUrl.replaceAll("%2F", "/"); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + }*/ + + StringBuilder sb = new StringBuilder(); + sb.append(mockServerProtocol+"://"+mockServerHost+":"+mockServerPort+"/"+restOfTheUrl); + String queryString = request.getQueryString(); + if (queryString != null){ + sb.append("?").append(queryString); + } + String redirectUrl = sb.toString(); + logger.info("Redirecting the request to : {}", redirectUrl); + return ("redirect:"+redirectUrl); + + //This was a try to setup a proxy instead of redirect + //Abandoned this direction when trying to return the original HTTP error code which was registered to mock server, instead of wrapped up HTTP 500. + + /* String restOfTheUrl = "/"+(String) request.getAttribute( + HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE); + URI uri = null; + try { + uri = new URI("http", null, "localhost", 1080, restOfTheUrl, request.getQueryString(), null); + } catch (URISyntaxException e) { + logger.error("Error during proxying request {}, error: ", request.getRequestURI(), e.getMessage()); + return new ResponseEntity(e.getMessage(),HttpStatus.INTERNAL_SERVER_ERROR); + } + RestTemplate restTemplate = new RestTemplate(); + //Preparing the headers + HttpHeaders headers = new HttpHeaders(); + Enumeration headerNames = request.getHeaderNames(); + while (headerNames.hasMoreElements()){ + String headerToSet = headerNames.nextElement(); + headers.set(headerToSet, request.getHeader(headerToSet)); + } + + ResponseEntity responseEntity = + restTemplate.exchange(uri, HttpMethod.resolve(request.getMethod()), new HttpEntity(body, headers), String.class); + + return responseEntity;*/ + } + + private void register(SimulatorRequestResponseExpectation expectationModel) throws VidSimulatorException{ + //Setting request according to what is passed + HttpRequest request = HttpRequest.request(); + String id = expectationModel.getSimulatorRequest().getId(); + if (id != null) { + request.withHeader("x-simulator-id", id); + } + String method = expectationModel.getSimulatorRequest().getMethod(); + if (method != null) { + request.withMethod(method); + } + String path = expectationModel.getSimulatorRequest().getPath(); + if (path != null) { + request.withPath(path); + } + String body = expectationModel.getSimulatorRequest().getBody(); + if (body != null) { + request.withBody(new JsonBody(body)); + } + + //Queryparams + final Map> queryParams = expectationModel.getSimulatorRequest().getQueryParams(); + if (queryParams != null){ + String[] arr = new String[0]; + queryParams.entrySet().stream().forEach(x -> { + request.withQueryStringParameter(x.getKey(), x.getValue().toArray(arr)); + }); + } + + //Setting response according to what is passed + HttpResponse response = HttpResponse.response(); + Integer responseCode = expectationModel.getSimulatorResponse().getResponseCode(); + if (responseCode != null) { + response.withStatusCode(responseCode); + } else { + logger.error("Invalid registration - response code cannot be empty"); + throw new VidSimulatorException("Invalid registration - response code cannot be empty"); + } + + String respBody = expectationModel.getSimulatorResponse().getBody(); + if (respBody != null) { + response.withBody(respBody); + } + + String file = expectationModel.getSimulatorResponse().getFile(); + if (file != null) { + response.withBody(loadFileString(file)); + } + + Map responseHeaders = expectationModel.getSimulatorResponse().getResponseHeaders(); + if (responseHeaders != null) { + responseHeaders.forEach(response::withHeader); + } + + Times numberOfTimes = getExpectationNumberOfTimes(expectationModel); + + if (expectationModel.getMisc().getReplace()) { + logger.info("Unregistering request expectation, if previously set, request: {}", expectationModel.getSimulatorRequest()); + mockServer.clear(request); + } + + mockServer + .when(request, numberOfTimes).respond(response); + } + + + private byte[] loadFileString(String filePath) { + byte[] bytes = null; + try { + File file = new ClassPathResource("download_files/" + filePath).getFile(); + bytes = new byte[(int)file.length()]; + DataInputStream dataInputStream = null; + + dataInputStream = new DataInputStream(new BufferedInputStream(new FileInputStream(file.getPath()))); + dataInputStream.readFully(bytes); + dataInputStream.close(); + } catch (FileNotFoundException e) { + logger.error("File not found for file:" + filePath); + e.printStackTrace(); + } catch (IOException e) { + logger.error("Error reading file:" + filePath); + e.printStackTrace(); + } + + return bytes; + } + private Times getExpectationNumberOfTimes(SimulatorRequestResponseExpectation expectationModel) { + Integer expectationModelNumberOfTimes = expectationModel.getMisc().getNumberOfTimes(); + Times effectiveNumberOfTimes; + if (expectationModelNumberOfTimes == null || expectationModelNumberOfTimes < 0) { + effectiveNumberOfTimes = DEFAULT_NUMBER_OF_TIMES; + } else { + effectiveNumberOfTimes = exactly(expectationModelNumberOfTimes); + } + return effectiveNumberOfTimes; + } +} diff --git a/vid-ext-services-simulator/src/main/java/org/onap/simulator/errorHandling/VidSimulatorException.java b/vid-ext-services-simulator/src/main/java/org/onap/simulator/errorHandling/VidSimulatorException.java new file mode 100644 index 000000000..0da482549 --- /dev/null +++ b/vid-ext-services-simulator/src/main/java/org/onap/simulator/errorHandling/VidSimulatorException.java @@ -0,0 +1,8 @@ +package org.onap.simulator.errorHandling; + +public class VidSimulatorException extends Exception { + + public VidSimulatorException(String message) { + super(message); + } +} diff --git a/vid-ext-services-simulator/src/main/java/org/onap/simulator/model/Misc.java b/vid-ext-services-simulator/src/main/java/org/onap/simulator/model/Misc.java new file mode 100644 index 000000000..f5750dd78 --- /dev/null +++ b/vid-ext-services-simulator/src/main/java/org/onap/simulator/model/Misc.java @@ -0,0 +1,30 @@ +package org.onap.simulator.model; + +public class Misc { + private Integer numberOfTimes; + private boolean replace = true; + + public Integer getNumberOfTimes() { + return numberOfTimes; + } + + public void setNumberOfTimes(Integer numberOfTimes) { + this.numberOfTimes = numberOfTimes; + } + + public boolean getReplace() { + return replace; + } + + public void setReplace(Boolean replace) { + this.replace = replace; + } + + @Override + public String toString() { + return "Misc{" + + "numberOfTimes='" + numberOfTimes + '\'' + + ", replace='" + replace + '\'' + + '}'; + } +} diff --git a/vid-ext-services-simulator/src/main/java/org/onap/simulator/model/SimulatorRequest.java b/vid-ext-services-simulator/src/main/java/org/onap/simulator/model/SimulatorRequest.java new file mode 100644 index 000000000..9e298b916 --- /dev/null +++ b/vid-ext-services-simulator/src/main/java/org/onap/simulator/model/SimulatorRequest.java @@ -0,0 +1,67 @@ +package org.onap.simulator.model; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.databind.JsonNode; + +import java.util.List; +import java.util.Map; + +@JsonInclude(JsonInclude.Include.NON_NULL) +public class SimulatorRequest { + private String id; + private String method; + private String path; + private String body; + private Map> queryParams; + + public Map> getQueryParams() { + return queryParams; + } + + public void setQueryParams(Map> queryParams) { + this.queryParams = queryParams; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getMethod() { + return method; + } + + public void setMethod(String method) { + this.method = method; + } + + public String getPath() { + return path; + } + + public void setPath(String path) { + this.path = path; + } + + public String getBody() { + return body; + } + + public void setBody(JsonNode body) { + this.body = body.isTextual() ? body.textValue() : body.toString(); + } + + @Override + public String toString() { + return "SimulatorRequest{" + + "id='" + id + '\'' + + ", method='" + method + '\'' + + ", path='" + path + '\'' + + ", body='" + body + '\'' + + ", queryParams=" + queryParams + + '}'; + } +} diff --git a/vid-ext-services-simulator/src/main/java/org/onap/simulator/model/SimulatorRequestResponseExpectation.java b/vid-ext-services-simulator/src/main/java/org/onap/simulator/model/SimulatorRequestResponseExpectation.java new file mode 100644 index 000000000..a7d3a9b7b --- /dev/null +++ b/vid-ext-services-simulator/src/main/java/org/onap/simulator/model/SimulatorRequestResponseExpectation.java @@ -0,0 +1,48 @@ +package org.onap.simulator.model; + +import com.fasterxml.jackson.annotation.JsonInclude; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +@JsonInclude(JsonInclude.Include.NON_NULL) +public class SimulatorRequestResponseExpectation { + + Logger logger = LoggerFactory.getLogger(SimulatorRequestResponseExpectation.class); + + private SimulatorRequest simulatorRequest; + private SimulatorResponse simulatorResponse; + private Misc misc; + + public SimulatorRequest getSimulatorRequest() { + return simulatorRequest; + } + + public void setSimulatorRequest(SimulatorRequest simulatorRequest) { + this.simulatorRequest = simulatorRequest; + } + + public SimulatorResponse getSimulatorResponse() { + return simulatorResponse; + } + + public void setSimulatorResponse(SimulatorResponse simulatorResponse) { + this.simulatorResponse = simulatorResponse; + } + + public Misc getMisc() { + return misc == null ? new Misc() : misc; + } + + public void setMisc(Misc misc) { + this.misc = misc; + } + + @Override + public String toString() { + return "ExpectationModel{" + + "simulatorRequest=" + simulatorRequest + + ", simulatorResponse=" + simulatorResponse + + ", misc=" + misc + + '}'; + } +} diff --git a/vid-ext-services-simulator/src/main/java/org/onap/simulator/model/SimulatorResponse.java b/vid-ext-services-simulator/src/main/java/org/onap/simulator/model/SimulatorResponse.java new file mode 100644 index 000000000..4836185f9 --- /dev/null +++ b/vid-ext-services-simulator/src/main/java/org/onap/simulator/model/SimulatorResponse.java @@ -0,0 +1,59 @@ +package org.onap.simulator.model; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.databind.JsonNode; + +import java.util.Map; + +public class SimulatorResponse { + private int responseCode; + private Map responseHeaders; + + @JsonInclude(JsonInclude.Include.NON_NULL) + private String body; + + @JsonInclude(JsonInclude.Include.NON_NULL) + private String file; + + public int getResponseCode() { + return responseCode; + } + + public void setResponseCode(int responseCode) { + this.responseCode = responseCode; + } + + public String getBody() { + return body; + } + + public void setBody(JsonNode body) { + this.body = body.isTextual() ? body.textValue() : body.toString(); + } + + public Map getResponseHeaders() { + return responseHeaders; + } + + public void setResponseHeaders(Map responseHeaders) { + this.responseHeaders = responseHeaders; + } + + public String getFile() { + return file; + } + + public void setFile(String file) { + this.file = file; + } + + @Override + public String toString() { + return "SimulatorResponse{" + + "responseCode=" + responseCode + + ", body='" + body + '\'' + + ", file='" + file + '\'' + + ", responseHeaders='" + responseHeaders + '\'' + + '}'; + } +} diff --git a/vid-ext-services-simulator/src/main/java/org/onap/simulator/service/TranslatorService.java b/vid-ext-services-simulator/src/main/java/org/onap/simulator/service/TranslatorService.java new file mode 100644 index 000000000..3894e90db --- /dev/null +++ b/vid-ext-services-simulator/src/main/java/org/onap/simulator/service/TranslatorService.java @@ -0,0 +1,19 @@ +//package org.onap.simulator.service; +// +//import org.mockserver.model.HttpRequest; +//import org.mockserver.model.HttpResponse; +//import org.onap.simulator.model.ExpectationModel; +//import org.springframework.stereotype.Component; +// +//import static org.mockserver.model.HttpRequest.request; +//@Component +//public class TranslatorService { +// public HttpRequest buildRequestByJson(ExpectationModel expectation){ +// return expectation.getExpectationRequest(); +// } +// public HttpResponse buildResponseByJson(ExpectationModel expectation){ +// return expectation.getExpectationResponse(); +// } +// +// +//} diff --git a/vid-ext-services-simulator/src/main/java/org/openecomp/simulator/controller/SimulatorController.java b/vid-ext-services-simulator/src/main/java/org/openecomp/simulator/controller/SimulatorController.java deleted file mode 100644 index c8b4083dc..000000000 --- a/vid-ext-services-simulator/src/main/java/org/openecomp/simulator/controller/SimulatorController.java +++ /dev/null @@ -1,337 +0,0 @@ -package org.openecomp.simulator.controller; - -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.ObjectMapper; -import org.mockserver.integration.ClientAndServer; -import org.mockserver.matchers.Times; -import org.mockserver.model.HttpRequest; -import org.mockserver.model.HttpResponse; -import static org.mockserver.model.HttpRequest.request; -import static org.mockserver.model.HttpResponse.response; - -import org.mockserver.model.JsonBody; -import org.openecomp.simulator.errorHandling.VidSimulatorException; -import org.openecomp.simulator.model.SimulatorRequestResponseExpectation; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.core.io.ClassPathResource; -import org.springframework.core.io.Resource; -import org.springframework.core.io.support.PathMatchingResourcePatternResolver; -import org.springframework.core.io.support.PropertiesLoaderUtils; -import org.springframework.core.io.support.ResourcePatternResolver; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.*; -import org.springframework.web.servlet.HandlerMapping; -import org.springframework.web.servlet.View; - -import javax.annotation.PostConstruct; -import javax.annotation.PreDestroy; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.*; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.*; -import java.io.UnsupportedEncodingException; -import java.net.URLEncoder; -import java.util.stream.Collectors; - -import static org.mockserver.integration.ClientAndServer.startClientAndServer; -import static org.mockserver.matchers.Times.exactly; - -@RestController -@Component -public class SimulatorController { - - private static final Times DEFAULT_NUMBER_OF_TIMES = Times.unlimited(); - private ClientAndServer mockServer; - private String mockServerProtocol; - private String mockServerHost; - private Integer mockServerPort; - private Boolean enablePresetRegistration; - private volatile boolean isInitialized = false; - - - Logger logger = LoggerFactory.getLogger(SimulatorController.class); - - @PostConstruct - public void init(){ - logger.info("Starting VID Simulator...."); - setProperties(); - mockServer = startClientAndServer(mockServerPort); - presetRegister(); - isInitialized = true; - logger.info("VID Simulator started successfully"); - } - - @PreDestroy - public void tearDown(){ - logger.info("Stopping VID Simulator...."); - isInitialized = false; - mockServer.stop(); - } - - - private void presetRegister() { - //Checking if set - if (enablePresetRegistration == null || !enablePresetRegistration){ - logger.info("Preset registration property is false or not set - skipping preset registration..."); - return; - } - ClassLoader cl = this.getClass().getClassLoader(); - ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(cl); - List resources = new ArrayList<>(); - try { - File presetDir = resolver.getResource("/preset_registration/").getFile(); - if (presetDir.exists() && presetDir.isDirectory()) { - resources = Files.walk(Paths.get(presetDir.getPath())) - .filter(p -> p.toString().endsWith(".json")) - .collect(Collectors.toList()); - } else { - logger.error("preset_registration directory is not exists"); - } - } catch (IOException e) { - logger.error("Error performing preset registration, error: ", e); - return; - } - logger.info("Starting preset registrations, number of requests: {}", resources.size()); - for (Path resource: resources){ - String content; - try { - content = new Scanner(resource).useDelimiter("\\Z").next(); - } catch (IOException e){ - logger.error("Error reading preset registration file {}, skipping to next one. Error: ", resource.getFileName(), e); - continue; - } - //register the preset request - try { - register(content); - } catch (VidSimulatorException e) { - logger.error("Error proceeding preset registration file {},skipping to next one. Check if the JSON is in correct format. Error: ", resource.getFileName(), e); - } - } - } - - - - private void setProperties() { - Resource resource = new ClassPathResource("simulator.properties"); - Properties props = new Properties(); - try { - props = PropertiesLoaderUtils.loadProperties(resource); - } catch (IOException e) { - logger.error("Error loading simulator properties, error: ", e); - return; - } - logger.info("Simulator properties are {}", props); - mockServerProtocol = (String)props.get("simulator.mockserver.protocol"); - mockServerHost = (String)props.get("simulator.mockserver.host"); - mockServerPort = Integer.parseInt((String)props.get("simulator.mockserver.port")); - enablePresetRegistration = Boolean.parseBoolean((String)props.get("simulator.enablePresetRegistration")); - } - - @RequestMapping(value = {"/registerToVidSimulator"}, method = RequestMethod.POST) - public @ResponseBody - ResponseEntity registerRequest(HttpServletRequest request, @RequestBody String expectation) { - try { - register(expectation); - } catch (VidSimulatorException e) { - return new ResponseEntity<>("Registration failure! Error: "+e.getMessage(),HttpStatus.BAD_REQUEST); - } - return new ResponseEntity<>("Registration successful!",HttpStatus.OK); - } - - @RequestMapping(value = {"/echo"}, method = RequestMethod.GET) - ResponseEntity echo(HttpServletRequest request) { - return isInitialized ? new ResponseEntity<>("",HttpStatus.OK) : new ResponseEntity<>("",HttpStatus.SERVICE_UNAVAILABLE); - } - -// @RequestMapping(value = {"/registerToVidSimulator"}, method = RequestMethod.GET) -// public ResponseEntity getAllRegisteredRequests() throws JsonProcessingException { -// final Expectation[] expectations = mockServer.retrieveExistingExpectations(null); -// return new ResponseEntity<>(new ObjectMapper() -// .configure(SerializationFeature.INDENT_OUTPUT, true) -// .writeValueAsString(expectations), HttpStatus.OK); -// } - - @RequestMapping(value = {"/registerToVidSimulator"}, method = RequestMethod.DELETE) - @ResponseStatus(value = HttpStatus.OK) - public void wipeOutAllExpectations() { - mockServer.reset(); - } - - private void register(String expectation) throws VidSimulatorException{ - ObjectMapper mapper = new ObjectMapper() - .configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true); - - SimulatorRequestResponseExpectation[] expectationModels; - try { - expectationModels = mapper.readValue(expectation, SimulatorRequestResponseExpectation[].class); - } catch (IOException e) { - logger.error("Couldn't deserialize register expectation {}, error:", expectation, e); - throw new VidSimulatorException(e.getMessage()); - } - - for (SimulatorRequestResponseExpectation expectationModel : expectationModels) { - logger.info("Proceeding registration request: {}", expectationModel); - register(expectationModel); - } - } - - - @RequestMapping(value = {"/**"}) - public String redirectToMockServer(HttpServletRequest request, HttpServletResponse response) { - //Currently, the easiest logic is redirecting - - //This is needed to allow POST redirect - see http://www.baeldung.com/spring-redirect-and-forward - request.setAttribute(View.RESPONSE_STATUS_ATTRIBUTE, HttpStatus.TEMPORARY_REDIRECT); - - //Building the redirect URL - String restOfTheUrl = (String) request.getAttribute( - HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE); - - //TODO encode only characters like spaces, not slashes - /* try { - restOfTheUrl = URLEncoder.encode(restOfTheUrl, "UTF-8"); - restOfTheUrl = restOfTheUrl.replaceAll("%2F", "/"); - } catch (UnsupportedEncodingException e) { - e.printStackTrace(); - }*/ - - StringBuilder sb = new StringBuilder(); - sb.append(mockServerProtocol+"://"+mockServerHost+":"+mockServerPort+"/"+restOfTheUrl); - String queryString = request.getQueryString(); - if (queryString != null){ - sb.append("?").append(queryString); - } - String redirectUrl = sb.toString(); - logger.info("Redirecting the request to : {}", redirectUrl); - return ("redirect:"+redirectUrl); - - //This was a try to setup a proxy instead of redirect - //Abandoned this direction when trying to return the original HTTP error code which was registered to mock server, instead of wrapped up HTTP 500. - - /* String restOfTheUrl = "/"+(String) request.getAttribute( - HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE); - URI uri = null; - try { - uri = new URI("http", null, "localhost", 1080, restOfTheUrl, request.getQueryString(), null); - } catch (URISyntaxException e) { - logger.error("Error during proxying request {}, error: ", request.getRequestURI(), e.getMessage()); - return new ResponseEntity(e.getMessage(),HttpStatus.INTERNAL_SERVER_ERROR); - } - RestTemplate restTemplate = new RestTemplate(); - //Preparing the headers - HttpHeaders headers = new HttpHeaders(); - Enumeration headerNames = request.getHeaderNames(); - while (headerNames.hasMoreElements()){ - String headerToSet = headerNames.nextElement(); - headers.set(headerToSet, request.getHeader(headerToSet)); - } - - ResponseEntity responseEntity = - restTemplate.exchange(uri, HttpMethod.resolve(request.getMethod()), new HttpEntity(body, headers), String.class); - - return responseEntity;*/ - } - - private void register(SimulatorRequestResponseExpectation expectationModel) throws VidSimulatorException{ - //Setting request according to what is passed - HttpRequest request = HttpRequest.request(); - String id = expectationModel.getSimulatorRequest().getId(); - if (id != null) { - request.withHeader("x-simulator-id", id); - } - String method = expectationModel.getSimulatorRequest().getMethod(); - if (method != null) { - request.withMethod(method); - } - String path = expectationModel.getSimulatorRequest().getPath(); - if (path != null) { - request.withPath(path); - } - String body = expectationModel.getSimulatorRequest().getBody(); - if (body != null) { - request.withBody(new JsonBody(body)); - } - - //Queryparams - final Map> queryParams = expectationModel.getSimulatorRequest().getQueryParams(); - if (queryParams != null){ - String[] arr = new String[0]; - queryParams.entrySet().stream().forEach(x -> { - request.withQueryStringParameter(x.getKey(), x.getValue().toArray(arr)); - }); - } - - //Setting response according to what is passed - HttpResponse response = HttpResponse.response(); - Integer responseCode = expectationModel.getSimulatorResponse().getResponseCode(); - if (responseCode != null) { - response.withStatusCode(responseCode); - } else { - logger.error("Invalid registration - response code cannot be empty"); - throw new VidSimulatorException("Invalid registration - response code cannot be empty"); - } - - String respBody = expectationModel.getSimulatorResponse().getBody(); - if (respBody != null) { - response.withBody(respBody); - } - - String file = expectationModel.getSimulatorResponse().getFile(); - if (file != null) { - response.withBody(loadFileString(file)); - } - - Map responseHeaders = expectationModel.getSimulatorResponse().getResponseHeaders(); - if (responseHeaders != null) { - responseHeaders.forEach(response::withHeader); - } - - Times numberOfTimes = getExpectationNumberOfTimes(expectationModel); - - if (expectationModel.getMisc().getReplace()) { - logger.info("Unregistering request expectation, if previously set, request: {}", expectationModel.getSimulatorRequest()); - mockServer.clear(request); - } - - mockServer - .when(request, numberOfTimes).respond(response); - } - - - private byte[] loadFileString(String filePath) { - byte[] bytes = null; - try { - File file = new ClassPathResource("download_files/" + filePath).getFile(); - bytes = new byte[(int)file.length()]; - DataInputStream dataInputStream = null; - - dataInputStream = new DataInputStream(new BufferedInputStream(new FileInputStream(file.getPath()))); - dataInputStream.readFully(bytes); - dataInputStream.close(); - } catch (FileNotFoundException e) { - logger.error("File not found for file:" + filePath); - e.printStackTrace(); - } catch (IOException e) { - logger.error("Error reading file:" + filePath); - e.printStackTrace(); - } - - return bytes; - } - private Times getExpectationNumberOfTimes(SimulatorRequestResponseExpectation expectationModel) { - Integer expectationModelNumberOfTimes = expectationModel.getMisc().getNumberOfTimes(); - Times effectiveNumberOfTimes; - if (expectationModelNumberOfTimes == null || expectationModelNumberOfTimes < 0) { - effectiveNumberOfTimes = DEFAULT_NUMBER_OF_TIMES; - } else { - effectiveNumberOfTimes = exactly(expectationModelNumberOfTimes); - } - return effectiveNumberOfTimes; - } -} diff --git a/vid-ext-services-simulator/src/main/java/org/openecomp/simulator/errorHandling/VidSimulatorException.java b/vid-ext-services-simulator/src/main/java/org/openecomp/simulator/errorHandling/VidSimulatorException.java deleted file mode 100644 index 3a67f26c2..000000000 --- a/vid-ext-services-simulator/src/main/java/org/openecomp/simulator/errorHandling/VidSimulatorException.java +++ /dev/null @@ -1,8 +0,0 @@ -package org.openecomp.simulator.errorHandling; - -public class VidSimulatorException extends Exception { - - public VidSimulatorException(String message) { - super(message); - } -} diff --git a/vid-ext-services-simulator/src/main/java/org/openecomp/simulator/model/Misc.java b/vid-ext-services-simulator/src/main/java/org/openecomp/simulator/model/Misc.java deleted file mode 100644 index 03cb498a7..000000000 --- a/vid-ext-services-simulator/src/main/java/org/openecomp/simulator/model/Misc.java +++ /dev/null @@ -1,30 +0,0 @@ -package org.openecomp.simulator.model; - -public class Misc { - private Integer numberOfTimes; - private boolean replace = true; - - public Integer getNumberOfTimes() { - return numberOfTimes; - } - - public void setNumberOfTimes(Integer numberOfTimes) { - this.numberOfTimes = numberOfTimes; - } - - public boolean getReplace() { - return replace; - } - - public void setReplace(Boolean replace) { - this.replace = replace; - } - - @Override - public String toString() { - return "Misc{" + - "numberOfTimes='" + numberOfTimes + '\'' + - ", replace='" + replace + '\'' + - '}'; - } -} diff --git a/vid-ext-services-simulator/src/main/java/org/openecomp/simulator/model/SimulatorRequest.java b/vid-ext-services-simulator/src/main/java/org/openecomp/simulator/model/SimulatorRequest.java deleted file mode 100644 index 6c619b399..000000000 --- a/vid-ext-services-simulator/src/main/java/org/openecomp/simulator/model/SimulatorRequest.java +++ /dev/null @@ -1,67 +0,0 @@ -package org.openecomp.simulator.model; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.databind.JsonNode; - -import java.util.List; -import java.util.Map; - -@JsonInclude(JsonInclude.Include.NON_NULL) -public class SimulatorRequest { - private String id; - private String method; - private String path; - private String body; - private Map> queryParams; - - public Map> getQueryParams() { - return queryParams; - } - - public void setQueryParams(Map> queryParams) { - this.queryParams = queryParams; - } - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public String getMethod() { - return method; - } - - public void setMethod(String method) { - this.method = method; - } - - public String getPath() { - return path; - } - - public void setPath(String path) { - this.path = path; - } - - public String getBody() { - return body; - } - - public void setBody(JsonNode body) { - this.body = body.isTextual() ? body.textValue() : body.toString(); - } - - @Override - public String toString() { - return "SimulatorRequest{" + - "id='" + id + '\'' + - ", method='" + method + '\'' + - ", path='" + path + '\'' + - ", body='" + body + '\'' + - ", queryParams=" + queryParams + - '}'; - } -} diff --git a/vid-ext-services-simulator/src/main/java/org/openecomp/simulator/model/SimulatorRequestResponseExpectation.java b/vid-ext-services-simulator/src/main/java/org/openecomp/simulator/model/SimulatorRequestResponseExpectation.java deleted file mode 100644 index 566de5c6a..000000000 --- a/vid-ext-services-simulator/src/main/java/org/openecomp/simulator/model/SimulatorRequestResponseExpectation.java +++ /dev/null @@ -1,48 +0,0 @@ -package org.openecomp.simulator.model; - -import com.fasterxml.jackson.annotation.JsonInclude; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -@JsonInclude(JsonInclude.Include.NON_NULL) -public class SimulatorRequestResponseExpectation { - - Logger logger = LoggerFactory.getLogger(SimulatorRequestResponseExpectation.class); - - private SimulatorRequest simulatorRequest; - private SimulatorResponse simulatorResponse; - private Misc misc; - - public SimulatorRequest getSimulatorRequest() { - return simulatorRequest; - } - - public void setSimulatorRequest(SimulatorRequest simulatorRequest) { - this.simulatorRequest = simulatorRequest; - } - - public SimulatorResponse getSimulatorResponse() { - return simulatorResponse; - } - - public void setSimulatorResponse(SimulatorResponse simulatorResponse) { - this.simulatorResponse = simulatorResponse; - } - - public Misc getMisc() { - return misc == null ? new Misc() : misc; - } - - public void setMisc(Misc misc) { - this.misc = misc; - } - - @Override - public String toString() { - return "ExpectationModel{" + - "simulatorRequest=" + simulatorRequest + - ", simulatorResponse=" + simulatorResponse + - ", misc=" + misc + - '}'; - } -} diff --git a/vid-ext-services-simulator/src/main/java/org/openecomp/simulator/model/SimulatorResponse.java b/vid-ext-services-simulator/src/main/java/org/openecomp/simulator/model/SimulatorResponse.java deleted file mode 100644 index 799075771..000000000 --- a/vid-ext-services-simulator/src/main/java/org/openecomp/simulator/model/SimulatorResponse.java +++ /dev/null @@ -1,59 +0,0 @@ -package org.openecomp.simulator.model; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.databind.JsonNode; - -import java.util.Map; - -public class SimulatorResponse { - private int responseCode; - private Map responseHeaders; - - @JsonInclude(JsonInclude.Include.NON_NULL) - private String body; - - @JsonInclude(JsonInclude.Include.NON_NULL) - private String file; - - public int getResponseCode() { - return responseCode; - } - - public void setResponseCode(int responseCode) { - this.responseCode = responseCode; - } - - public String getBody() { - return body; - } - - public void setBody(JsonNode body) { - this.body = body.isTextual() ? body.textValue() : body.toString(); - } - - public Map getResponseHeaders() { - return responseHeaders; - } - - public void setResponseHeaders(Map responseHeaders) { - this.responseHeaders = responseHeaders; - } - - public String getFile() { - return file; - } - - public void setFile(String file) { - this.file = file; - } - - @Override - public String toString() { - return "SimulatorResponse{" + - "responseCode=" + responseCode + - ", body='" + body + '\'' + - ", file='" + file + '\'' + - ", responseHeaders='" + responseHeaders + '\'' + - '}'; - } -} diff --git a/vid-ext-services-simulator/src/main/java/org/openecomp/simulator/service/TranslatorService.java b/vid-ext-services-simulator/src/main/java/org/openecomp/simulator/service/TranslatorService.java deleted file mode 100644 index f675d39fe..000000000 --- a/vid-ext-services-simulator/src/main/java/org/openecomp/simulator/service/TranslatorService.java +++ /dev/null @@ -1,19 +0,0 @@ -//package org.openecomp.simulator.service; -// -//import org.mockserver.model.HttpRequest; -//import org.mockserver.model.HttpResponse; -//import org.openecomp.simulator.model.ExpectationModel; -//import org.springframework.stereotype.Component; -// -//import static org.mockserver.model.HttpRequest.request; -//@Component -//public class TranslatorService { -// public HttpRequest buildRequestByJson(ExpectationModel expectation){ -// return expectation.getExpectationRequest(); -// } -// public HttpResponse buildResponseByJson(ExpectationModel expectation){ -// return expectation.getExpectationResponse(); -// } -// -// -//} diff --git a/vid-ext-services-simulator/src/main/webapp/WEB-INF/rest-servlet.xml b/vid-ext-services-simulator/src/main/webapp/WEB-INF/rest-servlet.xml index 6d06fea1e..30c31285b 100644 --- a/vid-ext-services-simulator/src/main/webapp/WEB-INF/rest-servlet.xml +++ b/vid-ext-services-simulator/src/main/webapp/WEB-INF/rest-servlet.xml @@ -9,5 +9,5 @@ + base-package="org.onap.simulator" /> \ No newline at end of file -- cgit 1.2.3-korg