2 * ============LICENSE_START=======================================================
3 * Copyright (C) 2021-2025 Nordix Foundation
4 * Modifications Copyright (C) 2022 Bell Canada.
5 * Modifications Copyright (C) 2022-2024 TechMahindra Ltd.
6 * ================================================================================
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
19 * SPDX-License-Identifier: Apache-2.0
20 * ============LICENSE_END=========================================================
23 package org.onap.cps.rest.controller;
25 import io.micrometer.core.annotation.Timed;
26 import java.util.List;
28 import lombok.RequiredArgsConstructor;
29 import org.onap.cps.api.CpsFacade;
30 import org.onap.cps.api.parameters.FetchDescendantsOption;
31 import org.onap.cps.api.parameters.PaginationOption;
32 import org.onap.cps.rest.api.CpsQueryApi;
33 import org.onap.cps.utils.ContentType;
34 import org.onap.cps.utils.JsonObjectMapper;
35 import org.onap.cps.utils.XmlFileUtils;
36 import org.springframework.http.HttpStatus;
37 import org.springframework.http.ResponseEntity;
38 import org.springframework.web.bind.annotation.RequestMapping;
39 import org.springframework.web.bind.annotation.RestController;
42 @RequestMapping("${rest.api.cps-base-path}")
43 @RequiredArgsConstructor
44 public class QueryRestController implements CpsQueryApi {
46 private final CpsFacade cpsFacade;
47 private final JsonObjectMapper jsonObjectMapper;
50 @Timed(value = "cps.data.controller.datanode.query.v1", description = "Time taken to query data nodes")
51 public ResponseEntity<Object> getNodesByDataspaceAndAnchorAndCpsPath(final String dataspaceName,
52 final String anchorName,
54 final Boolean includeDescendants) {
55 final FetchDescendantsOption fetchDescendantsOption =
56 FetchDescendantsOption.getFetchDescendantsOption(includeDescendants);
57 final List<Map<String, Object>> dataNodesAsMaps
58 = cpsFacade.executeAnchorQuery(dataspaceName, anchorName, cpsPath, fetchDescendantsOption);
59 return buildResponseEntity(dataNodesAsMaps, ContentType.JSON);
63 @Timed(value = "cps.data.controller.datanode.query.v2", description = "Time taken to query data nodes")
64 public ResponseEntity<Object> getNodesByDataspaceAndAnchorAndCpsPathV2(final String dataspaceName,
65 final String anchorName,
67 final String fetchDescendantsOptionAsString,
68 final String contentTypeInHeader) {
69 final ContentType contentType = ContentType.fromString(contentTypeInHeader);
70 final FetchDescendantsOption fetchDescendantsOption =
71 FetchDescendantsOption.getFetchDescendantsOption(fetchDescendantsOptionAsString);
72 final List<Map<String, Object>> dataNodesAsMaps
73 = cpsFacade.executeAnchorQuery(dataspaceName, anchorName, cpsPath, fetchDescendantsOption);
74 return buildResponseEntity(dataNodesAsMaps, contentType);
78 @Timed(value = "cps.data.controller.datanode.query.across.anchors",
79 description = "Time taken to query data nodes across anchors")
80 public ResponseEntity<Object> getNodesByDataspaceAndCpsPath(final String dataspaceName,
82 final String fetchDescendantsOptionAsString,
83 final Integer pageIndex,
84 final Integer pageSize) {
85 final FetchDescendantsOption fetchDescendantsOption =
86 FetchDescendantsOption.getFetchDescendantsOption(fetchDescendantsOptionAsString);
87 final PaginationOption paginationOption = (pageIndex == null || pageSize == null)
88 ? PaginationOption.NO_PAGINATION : new PaginationOption(pageIndex, pageSize);
89 final List<Map<String, Object>> dataNodesAsMaps
90 = cpsFacade.executeDataspaceQuery(dataspaceName, cpsPath, fetchDescendantsOption, paginationOption);
92 final int totalPages = cpsFacade.countAnchorsInDataspaceQuery(dataspaceName, cpsPath, paginationOption);
93 return ResponseEntity.ok().header("total-pages", String.valueOf(totalPages))
94 .body(jsonObjectMapper.asJsonString(dataNodesAsMaps));
97 private ResponseEntity<Object> buildResponseEntity(final List<Map<String, Object>> dataNodesAsMaps,
98 final ContentType contentType) {
99 final String responseData;
100 if (ContentType.XML.equals(contentType)) {
101 responseData = XmlFileUtils.convertDataMapsToXml(dataNodesAsMaps);
103 responseData = jsonObjectMapper.asJsonString(dataNodesAsMaps);
105 return new ResponseEntity<>(responseData, HttpStatus.OK);