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.util.HashMap;
25 import lombok.RequiredArgsConstructor;
26 import org.apache.logging.log4j.util.Strings;
27 import org.apache.logging.log4j.util.TriConsumer;
28 import org.onap.cps.ncmp.api.impl.config.NcmpConfiguration;
29 import org.onap.cps.spi.utils.CpsValidator;
30 import org.springframework.stereotype.Component;
31 import org.springframework.util.LinkedMultiValueMap;
32 import org.springframework.util.MultiValueMap;
33 import org.springframework.web.util.UriComponentsBuilder;
36 @RequiredArgsConstructor
37 public class DmiServiceUrlBuilder {
39 private final NcmpConfiguration.DmiProperties dmiProperties;
40 private final CpsValidator cpsValidator;
43 * This method creates the dmi service url.
45 * @param queryParams query param map as key,value pair
46 * @param uriVariables uri param map as key (placeholder),value pair
47 * @return {@code String} dmi service url as string
49 public String getDmiDatastoreUrl(final MultiValueMap<String, String> queryParams,
50 final Map<String, Object> uriVariables) {
51 return getUriComponentsBuilder(getResourceDataBasePathUriBuilder(), queryParams, uriVariables)
52 .buildAndExpand().toUriString();
56 * This method builds data operation request url.
58 * @param dataoperationRequestQueryParams query param map as key, value pair
59 * @param dataoperationRequestUriVariables uri param map as key (placeholder), value pair
60 * @return {@code String} data operation request url as string
62 public String getDataOperationRequestUrl(final MultiValueMap<String, String> dataoperationRequestQueryParams,
63 final Map<String, Object> dataoperationRequestUriVariables) {
64 return getDataOperationResourceDataBasePathUriBuilder()
65 .queryParams(dataoperationRequestQueryParams)
66 .uriVariables(dataoperationRequestUriVariables)
67 .buildAndExpand().toUriString();
71 * This method creates the dmi service url builder object with path variables.
73 * @return {@code UriComponentsBuilder} dmi service url builder object
75 public UriComponentsBuilder getResourceDataBasePathUriBuilder() {
76 return UriComponentsBuilder.newInstance()
77 .path("{dmiServiceName}")
78 .pathSegment("{dmiBasePath}")
81 .pathSegment("{cmHandleId}");
85 * This method creates the dmi service url builder object with path variables for data operation request.
87 * @return {@code UriComponentsBuilder} dmi service url builder object
89 public UriComponentsBuilder getDataOperationResourceDataBasePathUriBuilder() {
90 return UriComponentsBuilder.newInstance()
91 .path("{dmiServiceName}")
92 .pathSegment("{dmiBasePath}")
98 * This method populates uri variables.
100 * @param dataStoreName data store name
101 * @param dmiServiceName dmi service name
102 * @param cmHandleId cm handle id for dmi registration
103 * @return {@code String} dmi service url as string
105 public Map<String, Object> populateUriVariables(final String dataStoreName,
106 final String dmiServiceName,
107 final String cmHandleId) {
108 cpsValidator.validateNameCharacters(cmHandleId);
109 final Map<String, Object> uriVariables = new HashMap<>();
110 final String dmiBasePath = dmiProperties.getDmiBasePath();
111 uriVariables.put("dmiServiceName", dmiServiceName);
112 uriVariables.put("dmiBasePath", dmiBasePath);
113 uriVariables.put("cmHandleId", cmHandleId);
114 uriVariables.put("dataStore", dataStoreName);
119 * This method populates uri variables for data operation request.
121 * @param dmiServiceName dmi service name
122 * @return {@code Map<String, Object>} uri variables as map
124 public Map<String, Object> populateDataOperationRequestUriVariables(final String dmiServiceName) {
125 final Map<String, Object> uriVariables = new HashMap<>();
126 final String dmiBasePath = dmiProperties.getDmiBasePath();
127 uriVariables.put("dmiServiceName", dmiServiceName);
128 uriVariables.put("dmiBasePath", dmiBasePath);
133 * This method is used to populate map from query params.
135 * @param resourceId unique id of response for valid topic
136 * @param optionsParamInQuery options into url param
137 * @param topicParamInQuery topic into url param
138 * @return all valid query params as map
140 public MultiValueMap<String, String> populateQueryParams(final String resourceId,
141 final String optionsParamInQuery,
142 final String topicParamInQuery) {
143 final MultiValueMap<String, String> queryParams = new LinkedMultiValueMap<>();
144 getQueryParamConsumer().accept("resourceIdentifier",
145 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, paramValue);
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);