X-Git-Url: https://gerrit.onap.org/r/gitweb?a=blobdiff_plain;f=cps-rest%2Fsrc%2Fmain%2Fjava%2Forg%2Fonap%2Fcps%2Frest%2Fcontroller%2FDataRestController.java;h=b78d38339422eecd798824775cf8d78bcfed6bac;hb=ebfa4077b2e462237301e93566fed6ef2f56674c;hp=61f9399e7e3683f1d7e5020fa7a2a13e0d288b0e;hpb=b77bf2529f15e60c852cf83d5150e75d30068bb0;p=cps.git diff --git a/cps-rest/src/main/java/org/onap/cps/rest/controller/DataRestController.java b/cps-rest/src/main/java/org/onap/cps/rest/controller/DataRestController.java old mode 100644 new mode 100755 index 61f9399e7..b78d38339 --- a/cps-rest/src/main/java/org/onap/cps/rest/controller/DataRestController.java +++ b/cps-rest/src/main/java/org/onap/cps/rest/controller/DataRestController.java @@ -1,12 +1,15 @@ /* - * ============LICENSE_START======================================================= - * Copyright (C) 2020 Bell Canada. All rights reserved. + * ============LICENSE_START======================================================= + * Copyright (C) 2020-2022 Bell Canada. + * Modifications Copyright (C) 2021 Pantheon.tech + * Modifications Copyright (C) 2021-2022 Nordix Foundation * ================================================================================ * 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. @@ -19,38 +22,118 @@ package org.onap.cps.rest.controller; -import javax.validation.Valid; -import org.modelmapper.ModelMapper; -import org.onap.cps.api.CpsAdminService; +import java.time.OffsetDateTime; +import java.time.format.DateTimeFormatter; +import javax.validation.ValidationException; +import lombok.RequiredArgsConstructor; +import org.apache.commons.lang3.StringUtils; +import org.onap.cps.api.CpsDataService; import org.onap.cps.rest.api.CpsDataApi; -import org.springframework.beans.factory.annotation.Autowired; +import org.onap.cps.spi.FetchDescendantsOption; +import org.onap.cps.utils.DataMapUtils; +import org.onap.cps.utils.JsonObjectMapper; +import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.multipart.MultipartFile; @RestController @RequestMapping("${rest.api.cps-base-path}") +@RequiredArgsConstructor public class DataRestController implements CpsDataApi { - @Autowired - private CpsAdminService cpsAdminService; + private static final String ROOT_XPATH = "/"; + private static final String ISO_TIMESTAMP_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"; + private static final DateTimeFormatter ISO_TIMESTAMP_FORMATTER = DateTimeFormatter.ofPattern(ISO_TIMESTAMP_FORMAT); + + private final CpsDataService cpsDataService; + private final JsonObjectMapper jsonObjectMapper; + + @Override + public ResponseEntity createNode(final String dataspaceName, final String anchorName, + final Object jsonData, final String parentNodeXpath, final String observedTimestamp) { + final String jsonDataAsString = jsonObjectMapper.asJsonString(jsonData); + if (isRootXpath(parentNodeXpath)) { + cpsDataService.saveData(dataspaceName, anchorName, jsonDataAsString, + toOffsetDateTime(observedTimestamp)); + } else { + cpsDataService.saveData(dataspaceName, anchorName, parentNodeXpath, + jsonDataAsString, toOffsetDateTime(observedTimestamp)); + } + return new ResponseEntity<>(HttpStatus.CREATED); + } + + @Override + public ResponseEntity deleteDataNode(final String dataspaceName, final String anchorName, + final String xpath, final String observedTimestamp) { + cpsDataService.deleteDataNode(dataspaceName, anchorName, xpath, + toOffsetDateTime(observedTimestamp)); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + @Override + public ResponseEntity addListElements(final String parentNodeXpath, + final String dataspaceName, final String anchorName, final Object jsonData, final String observedTimestamp) { + cpsDataService.saveListElements(dataspaceName, anchorName, parentNodeXpath, + jsonObjectMapper.asJsonString(jsonData), toOffsetDateTime(observedTimestamp)); + return new ResponseEntity<>(HttpStatus.CREATED); + } + + @Override + public ResponseEntity getNodeByDataspaceAndAnchor(final String dataspaceName, final String anchorName, + final String xpath, final Boolean includeDescendants) { + final FetchDescendantsOption fetchDescendantsOption = Boolean.TRUE.equals(includeDescendants) + ? FetchDescendantsOption.INCLUDE_ALL_DESCENDANTS : FetchDescendantsOption.OMIT_DESCENDANTS; + final var dataNode = cpsDataService.getDataNode(dataspaceName, anchorName, xpath, + fetchDescendantsOption); + return new ResponseEntity<>(DataMapUtils.toDataMapWithIdentifier(dataNode), HttpStatus.OK); + } - @Autowired - private ModelMapper modelMapper; + @Override + public ResponseEntity updateNodeLeaves(final String dataspaceName, + final String anchorName, final Object jsonData, final String parentNodeXpath, final String observedTimestamp) { + cpsDataService.updateNodeLeaves(dataspaceName, anchorName, parentNodeXpath, + jsonObjectMapper.asJsonString(jsonData), toOffsetDateTime(observedTimestamp)); + return new ResponseEntity<>(HttpStatus.OK); + } @Override - public ResponseEntity createNode(@Valid final MultipartFile multipartFile, final String dataspaceName) { - return null; + public ResponseEntity replaceNode(final String dataspaceName, final String anchorName, + final Object jsonData, final String parentNodeXpath, final String observedTimestamp) { + cpsDataService + .replaceNodeTree(dataspaceName, anchorName, parentNodeXpath, + jsonObjectMapper.asJsonString(jsonData), toOffsetDateTime(observedTimestamp)); + return new ResponseEntity<>(HttpStatus.OK); } @Override - public ResponseEntity getNode(final String dataspaceName) { - return null; + public ResponseEntity replaceListContent(final String parentNodeXpath, + final String dataspaceName, final String anchorName, final Object jsonData, + final String observedTimestamp) { + cpsDataService.replaceListContent(dataspaceName, anchorName, parentNodeXpath, + jsonObjectMapper.asJsonString(jsonData), toOffsetDateTime(observedTimestamp)); + return new ResponseEntity<>(HttpStatus.OK); } @Override - public ResponseEntity getNodeByDataspaceAndAnchor(final String dataspaceName, final String anchorName) { - return null; + public ResponseEntity deleteListOrListElement(final String dataspaceName, final String anchorName, + final String listElementXpath, final String observedTimestamp) { + cpsDataService + .deleteListOrListElement(dataspaceName, anchorName, listElementXpath, toOffsetDateTime(observedTimestamp)); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + private static boolean isRootXpath(final String xpath) { + return ROOT_XPATH.equals(xpath); + } + + private static OffsetDateTime toOffsetDateTime(final String datetTimestamp) { + try { + return StringUtils.isEmpty(datetTimestamp) + ? null : OffsetDateTime.parse(datetTimestamp, ISO_TIMESTAMP_FORMATTER); + } catch (final Exception exception) { + throw new ValidationException( + String.format("observed-timestamp must be in '%s' format", ISO_TIMESTAMP_FORMAT)); + } } }