2 * ============LICENSE_START=======================================================
3 * Copyright (C) 2022-2023 Nordix Foundation
4 * ================================================================================
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
17 * SPDX-License-Identifier: Apache-2.0
18 * ============LICENSE_END=========================================================
21 package org.onap.cps.ncmp.api.impl.utils;
23 import java.net.URLEncoder;
24 import java.nio.charset.StandardCharsets;
25 import java.util.HashMap;
27 import lombok.RequiredArgsConstructor;
28 import org.apache.logging.log4j.util.Strings;
29 import org.apache.logging.log4j.util.TriConsumer;
30 import org.onap.cps.ncmp.api.impl.config.DmiWebClientConfiguration.DmiProperties;
31 import org.onap.cps.spi.utils.CpsValidator;
32 import org.springframework.stereotype.Component;
33 import org.springframework.util.LinkedMultiValueMap;
34 import org.springframework.util.MultiValueMap;
35 import org.springframework.web.util.UriComponentsBuilder;
38 @RequiredArgsConstructor
39 public class DmiServiceUrlBuilder {
40 private final DmiProperties dmiProperties;
41 private final CpsValidator cpsValidator;
44 * This method creates the dmi service url.
46 * @param queryParams query param map as key,value pair
47 * @param uriVariables uri param map as key (placeholder),value pair
48 * @return {@code String} dmi service url as string
50 public String getDmiDatastoreUrl(final MultiValueMap<String, String> queryParams,
51 final Map<String, Object> uriVariables) {
52 return getUriComponentsBuilder(getResourceDataBasePathUriBuilder(), queryParams, uriVariables)
53 .buildAndExpand().toUriString();
57 * This method builds data operation request url.
59 * @param dataoperationRequestQueryParams query param map as key, value pair
60 * @param dataoperationRequestUriVariables uri param map as key (placeholder), value pair
61 * @return {@code String} data operation request url as string
63 public String getDataOperationRequestUrl(final MultiValueMap<String, String> dataoperationRequestQueryParams,
64 final Map<String, Object> dataoperationRequestUriVariables) {
65 return getDataOperationResourceDataBasePathUriBuilder()
66 .queryParams(dataoperationRequestQueryParams)
67 .uriVariables(dataoperationRequestUriVariables)
68 .buildAndExpand().toUriString();
72 * This method creates the dmi service url builder object with path variables.
74 * @return {@code UriComponentsBuilder} dmi service url builder object
76 public UriComponentsBuilder getResourceDataBasePathUriBuilder() {
77 return UriComponentsBuilder.newInstance()
78 .path("{dmiServiceName}")
79 .pathSegment("{dmiBasePath}")
82 .pathSegment("{cmHandleId}");
86 * This method creates the dmi service url builder object with path variables for data operation request.
88 * @return {@code UriComponentsBuilder} dmi service url builder object
90 public UriComponentsBuilder getDataOperationResourceDataBasePathUriBuilder() {
91 return UriComponentsBuilder.newInstance()
92 .path("{dmiServiceName}")
93 .pathSegment("{dmiBasePath}")
99 * This method populates uri variables.
101 * @param dataStoreName data store name
102 * @param dmiServiceName dmi service name
103 * @param cmHandleId cm handle id for dmi registration
104 * @return {@code String} dmi service url as string
106 public Map<String, Object> populateUriVariables(final String dataStoreName,
107 final String dmiServiceName,
108 final String cmHandleId) {
109 cpsValidator.validateNameCharacters(cmHandleId);
110 final Map<String, Object> uriVariables = new HashMap<>();
111 final String dmiBasePath = dmiProperties.getDmiBasePath();
112 uriVariables.put("dmiServiceName", dmiServiceName);
113 uriVariables.put("dmiBasePath", dmiBasePath);
114 uriVariables.put("cmHandleId", cmHandleId);
115 uriVariables.put("dataStore", dataStoreName);
120 * This method populates uri variables for data operation request.
122 * @param dmiServiceName dmi service name
123 * @return {@code Map<String, Object>} uri variables as map
125 public Map<String, Object> populateDataOperationRequestUriVariables(final String dmiServiceName) {
126 final Map<String, Object> uriVariables = new HashMap<>();
127 final String dmiBasePath = dmiProperties.getDmiBasePath();
128 uriVariables.put("dmiServiceName", dmiServiceName);
129 uriVariables.put("dmiBasePath", dmiBasePath);
134 * This method is used to populate map from query params.
136 * @param resourceId unique id of response for valid topic
137 * @param optionsParamInQuery options into url param
138 * @param topicParamInQuery topic into url param
139 * @return all valid query params as map
141 public MultiValueMap<String, String> populateQueryParams(final String resourceId,
142 final String optionsParamInQuery,
143 final String topicParamInQuery) {
144 final MultiValueMap<String, String> queryParams = new LinkedMultiValueMap<>();
145 getQueryParamConsumer().accept("resourceIdentifier", resourceId, queryParams);
146 getQueryParamConsumer().accept("options", optionsParamInQuery, queryParams);
147 if (Strings.isNotEmpty(topicParamInQuery)) {
148 getQueryParamConsumer().accept("topic", topicParamInQuery, queryParams);
154 * This method is used to populate map from query params for data operation request.
156 * @param topicParamInQuery topic into url param
157 * @param requestId unique id of response for valid topic
158 * @return all valid query params as map
160 public MultiValueMap<String, String> getDataOperationRequestQueryParams(final String topicParamInQuery,
161 final String requestId) {
162 final MultiValueMap<String, String> queryParams = new LinkedMultiValueMap<>();
163 getQueryParamConsumer().accept("topic", topicParamInQuery, queryParams);
164 getQueryParamConsumer().accept("requestId", requestId, queryParams);
168 private TriConsumer<String, String, MultiValueMap<String, String>> getQueryParamConsumer() {
169 return (paramName, paramValue, paramMap) -> {
170 if (Strings.isNotEmpty(paramValue)) {
171 paramMap.add(paramName, URLEncoder.encode(paramValue, StandardCharsets.UTF_8));
176 private UriComponentsBuilder getUriComponentsBuilder(final UriComponentsBuilder uriComponentsBuilder,
177 final MultiValueMap<String, String> queryParams,
178 final Map<String, Object> uriVariables) {
179 return uriComponentsBuilder
182 .pathSegment("{dataStore}")
183 .queryParams(queryParams)
184 .uriVariables(uriVariables);