2  *  ============LICENSE_START=======================================================
 
   3  *  Copyright (C) 2022 Bell Canada
 
   4  *  Modifications Copyright (c) 2022-2024 Nordix Foundation
 
   5  *  ================================================================================
 
   6  *  Licensed under the Apache License, Version 2.0 (the "License");
 
   7  *  you may not use this file except in compliance with the License.
 
   8  *  You may obtain a copy of the License at
 
  10  *        http://www.apache.org/licenses/LICENSE-2.0
 
  12  *  Unless required by applicable law or agreed to in writing, software
 
  13  *  distributed under the License is distributed on an "AS IS" BASIS,
 
  14  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
  15  *  See the License for the specific language governing permissions and
 
  16  *  limitations under the License.
 
  18  *  SPDX-License-Identifier: Apache-2.0
 
  19  *  ============LICENSE_END=========================================================
 
  22 package org.onap.cps.ncmp.rest.stub.controller;
 
  24 import com.fasterxml.jackson.databind.ObjectMapper;
 
  25 import jakarta.validation.Valid;
 
  26 import jakarta.validation.constraints.NotNull;
 
  27 import java.io.IOException;
 
  28 import java.io.InputStream;
 
  29 import java.nio.charset.StandardCharsets;
 
  30 import java.util.Arrays;
 
  31 import java.util.Collections;
 
  32 import java.util.HashMap;
 
  33 import java.util.List;
 
  35 import java.util.Optional;
 
  36 import java.util.UUID;
 
  37 import lombok.extern.slf4j.Slf4j;
 
  38 import org.onap.cps.ncmp.api.data.models.DatastoreType;
 
  39 import org.onap.cps.ncmp.rest.api.NetworkCmProxyApi;
 
  40 import org.onap.cps.ncmp.rest.model.CmHandleQueryParameters;
 
  41 import org.onap.cps.ncmp.rest.model.DataOperationRequest;
 
  42 import org.onap.cps.ncmp.rest.model.RestModuleDefinition;
 
  43 import org.onap.cps.ncmp.rest.model.RestModuleReference;
 
  44 import org.onap.cps.ncmp.rest.model.RestOutputCmHandle;
 
  45 import org.onap.cps.ncmp.rest.model.RestOutputCmHandleCompositeState;
 
  46 import org.onap.cps.ncmp.rest.model.RestOutputPublicCmHandleProperties;
 
  47 import org.onap.cps.ncmp.rest.stub.providers.ResourceProvider;
 
  48 import org.springframework.beans.factory.annotation.Autowired;
 
  49 import org.springframework.http.HttpStatus;
 
  50 import org.springframework.http.ResponseEntity;
 
  51 import org.springframework.web.bind.annotation.RequestMapping;
 
  52 import org.springframework.web.bind.annotation.RestController;
 
  56 @RequestMapping("${rest.api.ncmp-stub-base-path}")
 
  57 public class NetworkCmProxyStubController implements NetworkCmProxyApi {
 
  60     private ResourceProvider resourceProvider;
 
  63     private ObjectMapper objectMapper;
 
  65     private static final String ASYNC_REQUEST_ID = "requestId";
 
  68     public ResponseEntity<Object> getResourceDataForCmHandle(final String datastoreName, final String cmHandle,
 
  69                                                              final String resourceIdentifier,
 
  70                                                              final String optionsParamInQuery,
 
  71                                                              final String topicParamInQuery,
 
  72                                                              final Boolean includeDescendants,
 
  73                                                              final String authorization) {
 
  74         if (DatastoreType.PASSTHROUGH_OPERATIONAL == DatastoreType.fromDatastoreName(datastoreName)) {
 
  75             final ResponseEntity<Map<String, Object>> asyncResponse = populateAsyncResponse(topicParamInQuery);
 
  76             final Map<String, Object> asyncResponseData = asyncResponse.getBody();
 
  77             Object responseObject = null;
 
  78             // read JSON file and map/convert to java POJO
 
  80                 final Optional<Object> optionalResponseObject = getResponseObject(
 
  81                         "passthrough-operational-example.json", Object.class);
 
  82                 if (optionalResponseObject.isPresent()) {
 
  83                     responseObject = optionalResponseObject.get();
 
  86             } catch (final IOException ioException) {
 
  87                 log.error("Error reading the file.", ioException);
 
  88                 return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
 
  91             if (asyncResponseData == null) {
 
  92                 return ResponseEntity.ok(responseObject);
 
  94             return ResponseEntity.ok(asyncResponse);
 
  96         return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);
 
 100     public ResponseEntity<List<RestOutputCmHandle>> searchCmHandles(
 
 101             final CmHandleQueryParameters cmHandleQueryParameters) {
 
 102         // read JSON file and map/convert to java POJO
 
 104             final Optional<RestOutputCmHandle[]> optionalResponseObject = getResponseObject("cmHandlesSearch.json",
 
 105                     RestOutputCmHandle[].class);
 
 106             if (optionalResponseObject.isPresent()) {
 
 107                 final List<RestOutputCmHandle> restOutputCmHandles = Arrays.asList(optionalResponseObject.get());
 
 108                 return ResponseEntity.ok(restOutputCmHandles);
 
 110         } catch (final IOException ioException) {
 
 111             log.error("Error reading the file.", ioException);
 
 112             return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
 
 115         return ResponseEntity.ok(Collections.<RestOutputCmHandle>emptyList());
 
 118     private ResponseEntity<Map<String, Object>> populateAsyncResponse(final String topicParamInQuery) {
 
 119         final Map<String, Object> responseData;
 
 120         if (topicParamInQuery == null) {
 
 123             responseData = getAsyncResponseData();
 
 125         return ResponseEntity.ok().body(responseData);
 
 128     private Map<String, Object> getAsyncResponseData() {
 
 129         final Map<String, Object> asyncResponseData = new HashMap<>(1);
 
 130         final String resourceDataRequestId = UUID.randomUUID().toString();
 
 131         asyncResponseData.put(ASYNC_REQUEST_ID, resourceDataRequestId);
 
 132         return asyncResponseData;
 
 135     private <T> Optional<T> getResponseObject(final String filename, final Class<T> type) throws IOException {
 
 136         final Optional<InputStream> optionalInputStream = resourceProvider.getResourceInputStream(filename);
 
 137         if (optionalInputStream.isPresent()) {
 
 138             final String content = new String(optionalInputStream.get().readAllBytes(), StandardCharsets.UTF_8);
 
 139             return Optional.of(objectMapper.readValue(content, type));
 
 141         return Optional.empty();
 
 145     public ResponseEntity<Void> createResourceDataRunningForCmHandle(final String datastoreName, final String cmHandle,
 
 146                                                                      @NotNull @Valid final String resourceIdentifier,
 
 147                                                                      @Valid final Object body,
 
 148                                                                      final String contentType,
 
 149                                                                      final String authorization) {
 
 150         return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);
 
 154     public ResponseEntity<Void> deleteResourceDataRunningForCmHandle(final String datastoreName, final String cmHandle,
 
 155                                                                      @NotNull @Valid final String resourceIdentifier,
 
 156                                                                      final String contentType,
 
 157                                                                      final String authorization) {
 
 158         return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);
 
 162     public ResponseEntity<RestOutputPublicCmHandleProperties> getCmHandlePublicPropertiesByCmHandleId(
 
 163             final String cmHandle) {
 
 164         return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);
 
 168     public ResponseEntity<RestOutputCmHandleCompositeState> getCmHandleStateByCmHandleId(
 
 169             final String cmHandleReference) {
 
 170         return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);
 
 174     public ResponseEntity<List<RestModuleDefinition>> getModuleDefinitions(final String cmHandleId,
 
 175                                                                            final String moduleName,
 
 176                                                                            final String revision) {
 
 177         return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);
 
 181     public ResponseEntity<List<RestModuleReference>> getModuleReferencesByCmHandle(final String cmHandle) {
 
 182         return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);
 
 186     public ResponseEntity<Object> executeDataOperationForCmHandles(final String topicParamInQuery,
 
 187                                                                    final DataOperationRequest dataOperationRequest,
 
 188                                                                    final String authorization) {
 
 189         return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);
 
 193     public ResponseEntity<Object> patchResourceDataRunningForCmHandle(final String datastoreName, final String cmHandle,
 
 194                                                                       @NotNull @Valid final String resourceIdentifier,
 
 195                                                                       @Valid final Object body,
 
 196                                                                       final String contentType,
 
 197                                                                       final String authorization) {
 
 198         return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);
 
 202     public ResponseEntity<Object> queryResourceDataForCmHandle(final String datastoreName, final String cmHandle,
 
 203                                                                @Valid final String cpsPath, @Valid final String options,
 
 204                                                                @Valid final String topic,
 
 205                                                                @Valid final Boolean includeDescendants) {
 
 206         return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);
 
 210     public ResponseEntity<RestOutputCmHandle> retrieveCmHandleDetailsById(final String cmHandle) {
 
 211         return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);
 
 216     public ResponseEntity<List<String>> searchCmHandleIds(@Valid final CmHandleQueryParameters body,
 
 217                                                           @Valid final Boolean outputAlternateId) {
 
 218         return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);
 
 223     public ResponseEntity<Object> setDataSyncEnabledFlagForCmHandle(final String cmHandle,
 
 224                                                                     @NotNull @Valid final Boolean dataSyncEnabled) {
 
 225         return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);
 
 230     public ResponseEntity<Object> updateResourceDataRunningForCmHandle(final String datastoreName,
 
 231                                                                        final String cmHandle,
 
 232                                                                        @NotNull @Valid final String resourceIdentifier,
 
 233                                                                        @Valid final Object body,
 
 234                                                                        final String contentType,
 
 235                                                                        final String authorization) {
 
 236         return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);