From 00b90746ce2c65de3e7b50ef1b87af3933c895e7 Mon Sep 17 00:00:00 2001 From: krishnaa96 Date: Fri, 26 Feb 2021 13:14:09 +0530 Subject: Add cps-tbdmt-rest code Issue-ID: CPS-243 Signed-off-by: krishnaa96 Change-Id: I473135bc026a63cb6d644a42e54ffe45d1389fbd --- cps-tbdmt-rest/docs/api/swagger/openapi.yaml | 175 +++++++++++++++++++++ cps-tbdmt-rest/pom.xml | 30 ++++ .../tbdmt/exception/TemplateExceptionHandler.java | 82 ++++++++++ .../onap/cps/tbdmt/rest/ExecutionController.java | 56 +++++++ .../onap/cps/tbdmt/rest/TemplateController.java | 92 +++++++++++ .../java/org/onap/cps/tbdmt/TestApplication.java | 32 ++++ .../cps/tbdmt/rest/ExecutionControllerTest.java | 142 +++++++++++++++++ .../cps/tbdmt/rest/TemplateControllerTest.java | 145 +++++++++++++++++ 8 files changed, 754 insertions(+) create mode 100644 cps-tbdmt-rest/docs/api/swagger/openapi.yaml create mode 100644 cps-tbdmt-rest/src/main/java/org/onap/cps/tbdmt/exception/TemplateExceptionHandler.java create mode 100644 cps-tbdmt-rest/src/main/java/org/onap/cps/tbdmt/rest/ExecutionController.java create mode 100644 cps-tbdmt-rest/src/main/java/org/onap/cps/tbdmt/rest/TemplateController.java create mode 100644 cps-tbdmt-rest/src/test/java/org/onap/cps/tbdmt/TestApplication.java create mode 100644 cps-tbdmt-rest/src/test/java/org/onap/cps/tbdmt/rest/ExecutionControllerTest.java create mode 100644 cps-tbdmt-rest/src/test/java/org/onap/cps/tbdmt/rest/TemplateControllerTest.java (limited to 'cps-tbdmt-rest') diff --git a/cps-tbdmt-rest/docs/api/swagger/openapi.yaml b/cps-tbdmt-rest/docs/api/swagger/openapi.yaml new file mode 100644 index 0000000..f1c6514 --- /dev/null +++ b/cps-tbdmt-rest/docs/api/swagger/openapi.yaml @@ -0,0 +1,175 @@ +openapi: 3.0.0 +info: + description: APIS for Template based Data Model Transformer + version: 1.0.0 + title: Template based Data Model Transformer APIs + license: + name: Apache 2.0 + url: http://www.apache.org/licenses/LICENSE-2.0.html +tags: + - name: templates + description: CRUD APIs for xpath templates +paths: + /templates: + post: + tags: + - templates + summary: Add a new template + description: Creates a template in the database + operationId: addTemplate + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/Template" + description: Template object that needs to be added + required: true + responses: + "201": + description: Created successfully + "400": + description: Invalid input + "500": + description: Internal server error + get: + tags: + - templates + summary: Get all templates + description: Retrieves all the templates stored in database + operationId: getAllTemplates + responses: + "200": + description: Templates returned successfully + content: + application/json: + schema: + type: array + items: + $ref: "#/components/schemas/Template" + "404": + description: No templates found + "500": + description: Internal server error + "/templates/{model}/{template-id}": + get: + tags: + - templates + summary: Find template by ID and model + description: Returns a single template identified by template-id and model + operationId: getTemplateById + parameters: + - name: template-id + in: path + description: ID of template to return + required: true + schema: + type: string + - name: model + in: path + description: represents the yang model + required: true + schema: + type: string + responses: + "200": + description: Template returned successfully + content: + application/json: + schema: + $ref: "#/components/schemas/Template" + "400": + description: Invalid ID supplied + "404": + description: Not found + delete: + tags: + - templates + summary: Deletes a template + description: Deletes a template by id and model from the database + operationId: deleteTemplate + parameters: + - name: template-id + in: path + required: true + schema: + type: string + - name: model + in: path + description: represents the yang model + required: true + schema: + type: string + responses: + "200": + description: Deleted successfully + "400": + description: Invalid ID supplied + "404": + description: Template not found + "/execute/{model}/{template-id}": + post: + tags: + - template executions + summary: Execute a template + description: Returns the result of execution + operationId: executeTemplateById + parameters: + - name: template-id + in: path + description: ID of template to execute + required: true + schema: + type: string + - name: model + in: path + description: represents the yang model + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/ApiRequest" + description: Template object that needs to be added + required: true + responses: + "200": + description: Result returned successfully + content: + application/json: + schema: + $ref: "#/components/schemas/ApiResponse" + "400": + description: Invalid ID supplied + "404": + description: Not found + "500": + description: Internal server error +externalDocs: + description: Find out more about APIs + url: https://wiki.onap.org/display/DW/API+Mapper+Service +servers: + - url: http://localhost +components: + schemas: + Template: + type: object + required: + - template-id + - model + - xpath-template + properties: + template-id: + type: string + model: + type: string + xpath-template: + type: string + ApiRequest: + type: object + properties: + input: + type: object + ApiResponse: + type: object diff --git a/cps-tbdmt-rest/pom.xml b/cps-tbdmt-rest/pom.xml index 048f243..c155196 100644 --- a/cps-tbdmt-rest/pom.xml +++ b/cps-tbdmt-rest/pom.xml @@ -28,4 +28,34 @@ 4.0.0 cps-tbdmt-rest + + + ${project.groupId} + cps-tbdmt-service + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-tomcat + + + + + org.springframework.boot + spring-boot-starter-jetty + + + junit + junit + test + + + org.springframework.boot + spring-boot-starter-test + test + + \ No newline at end of file diff --git a/cps-tbdmt-rest/src/main/java/org/onap/cps/tbdmt/exception/TemplateExceptionHandler.java b/cps-tbdmt-rest/src/main/java/org/onap/cps/tbdmt/exception/TemplateExceptionHandler.java new file mode 100644 index 0000000..fa6fa28 --- /dev/null +++ b/cps-tbdmt-rest/src/main/java/org/onap/cps/tbdmt/exception/TemplateExceptionHandler.java @@ -0,0 +1,82 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP + * ================================================================================ + * Copyright (C) 2021 Wipro Limited. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.cps.tbdmt.exception; + +import java.util.ArrayList; +import java.util.List; +import org.onap.cps.tbdmt.model.ErrorResponse; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.ObjectError; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.context.request.WebRequest; +import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler; + +@ControllerAdvice +public class TemplateExceptionHandler extends ResponseEntityExceptionHandler { + + /** + * Handle TemplateNotFoundException. + * + * @param templateNotFoundException Exception + * @param webRequest web request + * @return response entity + */ + @ExceptionHandler(TemplateNotFoundException.class) + public final ResponseEntity handleTemplateNotFoundException( + final TemplateNotFoundException templateNotFoundException, final WebRequest webRequest) { + final List details = new ArrayList<>(); + details.add(templateNotFoundException.getLocalizedMessage()); + final ErrorResponse ErrorResponse = new ErrorResponse("Template Not found", details); + return new ResponseEntity<>(ErrorResponse, HttpStatus.NOT_FOUND); + } + + /** + * Handle ExecuteException. + * + * @param executeException Exception + * @param webRequest web request + * @return response entity + */ + @ExceptionHandler(ExecuteException.class) + public final ResponseEntity handleExecutionException(final ExecuteException executeException, + final WebRequest webRequest) { + final List details = new ArrayList<>(); + details.add(executeException.getLocalizedMessage()); + final ErrorResponse ErrorResponse = new ErrorResponse("Error while executing template", details); + return new ResponseEntity<>(ErrorResponse, HttpStatus.OK); + } + + @Override + protected ResponseEntity handleMethodArgumentNotValid( + final MethodArgumentNotValidException methodArgumentNotValidException, final HttpHeaders httpHeaders, + final HttpStatus httpStatus, final WebRequest webRequest) { + final List details = new ArrayList<>(); + for (final ObjectError objectError : methodArgumentNotValidException.getBindingResult().getAllErrors()) { + details.add(objectError.getDefaultMessage()); + } + final ErrorResponse ErrorResponse = new ErrorResponse("Validation Failed", details); + return new ResponseEntity<>(ErrorResponse, HttpStatus.BAD_REQUEST); + } +} diff --git a/cps-tbdmt-rest/src/main/java/org/onap/cps/tbdmt/rest/ExecutionController.java b/cps-tbdmt-rest/src/main/java/org/onap/cps/tbdmt/rest/ExecutionController.java new file mode 100644 index 0000000..b7dc4f6 --- /dev/null +++ b/cps-tbdmt-rest/src/main/java/org/onap/cps/tbdmt/rest/ExecutionController.java @@ -0,0 +1,56 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP + * ================================================================================ + * Copyright (C) 2021 Wipro Limited. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.cps.tbdmt.rest; + +import javax.validation.Valid; +import org.onap.cps.tbdmt.model.ExecutionRequest; +import org.onap.cps.tbdmt.service.ExecutionBusinessLogic; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class ExecutionController { + + @Autowired + private ExecutionBusinessLogic executionBusinessLogic; + + /** + * Execute a template by model and templateId. + * + * @param model model to find the template + * @param templateId Id to find the template + * @param executionRequest execution request + * @return result of the execution + */ + @PostMapping(path = "/execute/{model}/{templateId}") + public ResponseEntity executeTemplate(@Valid @PathVariable final String model, + @Valid @PathVariable final String templateId, + @Valid @RequestBody final ExecutionRequest executionRequest) { + final String result = executionBusinessLogic.executeTemplate(model, templateId, executionRequest); + return new ResponseEntity<>(result, HttpStatus.OK); + } + +} diff --git a/cps-tbdmt-rest/src/main/java/org/onap/cps/tbdmt/rest/TemplateController.java b/cps-tbdmt-rest/src/main/java/org/onap/cps/tbdmt/rest/TemplateController.java new file mode 100644 index 0000000..15efdc5 --- /dev/null +++ b/cps-tbdmt-rest/src/main/java/org/onap/cps/tbdmt/rest/TemplateController.java @@ -0,0 +1,92 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP + * ================================================================================ + * Copyright (C) 2021 Wipro Limited. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.cps.tbdmt.rest; + +import java.util.Collection; +import javax.validation.Valid; +import org.onap.cps.tbdmt.exception.TemplateNotFoundException; +import org.onap.cps.tbdmt.model.Template; +import org.onap.cps.tbdmt.model.TemplateKey; +import org.onap.cps.tbdmt.model.TemplateRequest; +import org.onap.cps.tbdmt.service.TemplateBusinessLogic; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class TemplateController { + + @Autowired + private TemplateBusinessLogic templateBusinessLogic; + + @PostMapping(path = "/templates") + public ResponseEntity