Merge "#2 NCMP : Replacing the word 'Batch' as 'DataOperation'."
[cps.git] / cps-ncmp-service / src / main / java / org / onap / cps / ncmp / api / impl / utils / DmiServiceUrlBuilder.java
index b60aac9..d855442 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *  ============LICENSE_START=======================================================
- *  Copyright (C) 2022 Nordix Foundation
+ *  Copyright (C) 2022-2023 Nordix Foundation
  *  ================================================================================
  *  Licensed under the Apache License, Version 2.0 (the "License");
  *  you may not use this file except in compliance with the License.
  *  limitations under the License.
  *
  *  SPDX-License-Identifier: Apache-2.0
- * ============LICENSE_END=========================================================
+ *  ============LICENSE_END=========================================================
  */
 
 package org.onap.cps.ncmp.api.impl.utils;
 
-import static org.onap.cps.ncmp.api.impl.operations.RequiredDmiService.DATA;
-
 import java.util.HashMap;
 import java.util.Map;
 import lombok.RequiredArgsConstructor;
 import org.apache.logging.log4j.util.Strings;
 import org.apache.logging.log4j.util.TriConsumer;
 import org.onap.cps.ncmp.api.impl.config.NcmpConfiguration;
-import org.onap.cps.ncmp.api.impl.operations.DmiOperations;
-import org.onap.cps.ncmp.api.impl.yangmodels.YangModelCmHandle;
+import org.onap.cps.spi.utils.CpsValidator;
 import org.springframework.stereotype.Component;
 import org.springframework.util.LinkedMultiValueMap;
 import org.springframework.util.MultiValueMap;
@@ -40,6 +37,7 @@ import org.springframework.web.util.UriComponentsBuilder;
 public class DmiServiceUrlBuilder {
 
     private final NcmpConfiguration.DmiProperties dmiProperties;
+    private final CpsValidator cpsValidator;
 
     /**
      * This method creates the dmi service url.
@@ -50,13 +48,23 @@ public class DmiServiceUrlBuilder {
      */
     public String getDmiDatastoreUrl(final MultiValueMap<String, String> queryParams,
                                      final Map<String, Object> uriVariables) {
-        final UriComponentsBuilder uriComponentsBuilder = getCmHandleUrl()
-                .pathSegment("data")
-                .pathSegment("ds")
-                .pathSegment("{dataStore}")
-                .queryParams(queryParams)
-                .uriVariables(uriVariables);
-        return uriComponentsBuilder.buildAndExpand().toUriString();
+        return getUriComponentsBuilder(getResourceDataBasePathUriBuilder(), queryParams, uriVariables)
+                .buildAndExpand().toUriString();
+    }
+
+    /**
+     * This method builds data operation request url.
+     *
+     * @param dataoperationRequestQueryParams  query param map as key, value pair
+     * @param dataoperationRequestUriVariables uri param map as key (placeholder), value pair
+     * @return {@code String} data operation request url as string
+     */
+    public String getDataOperationRequestUrl(final MultiValueMap<String, String> dataoperationRequestQueryParams,
+                                             final Map<String, Object> dataoperationRequestUriVariables) {
+        return getDataOperationResourceDataBasePathUriBuilder()
+                .queryParams(dataoperationRequestQueryParams)
+                .uriVariables(dataoperationRequestUriVariables)
+                .buildAndExpand().toUriString();
     }
 
     /**
@@ -64,32 +72,60 @@ public class DmiServiceUrlBuilder {
      *
      * @return {@code UriComponentsBuilder} dmi service url builder object
      */
-    public UriComponentsBuilder getCmHandleUrl() {
+    public UriComponentsBuilder getResourceDataBasePathUriBuilder() {
         return UriComponentsBuilder.newInstance()
                 .path("{dmiServiceName}")
                 .pathSegment("{dmiBasePath}")
                 .pathSegment("v1")
                 .pathSegment("ch")
-                .pathSegment("{cmHandle}");
+                .pathSegment("{cmHandleId}");
+    }
+
+    /**
+     * This method creates the dmi service url builder object with path variables for data operation request.
+     *
+     * @return {@code UriComponentsBuilder} dmi service url builder object
+     */
+    public UriComponentsBuilder getDataOperationResourceDataBasePathUriBuilder() {
+        return UriComponentsBuilder.newInstance()
+                .path("{dmiServiceName}")
+                .pathSegment("{dmiBasePath}")
+                .pathSegment("v1")
+                .pathSegment("data");
     }
 
     /**
      * This method populates uri variables.
      *
-     * @param yangModelCmHandle get dmi service name
-     * @param cmHandle          cm handle name for dmi registration
+     * @param dataStoreName data store name 
+     * @param dmiServiceName dmi service name
+     * @param cmHandleId        cm handle id for dmi registration
      * @return {@code String} dmi service url as string
      */
-    public Map<String, Object> populateUriVariables(final YangModelCmHandle yangModelCmHandle,
-                                                    final String cmHandle,
-                                                    final DmiOperations.DataStoreEnum dataStore) {
+    public Map<String, Object> populateUriVariables(final String dataStoreName,
+                                                    final String dmiServiceName,
+                                                    final String cmHandleId) {
+        cpsValidator.validateNameCharacters(cmHandleId);
         final Map<String, Object> uriVariables = new HashMap<>();
         final String dmiBasePath = dmiProperties.getDmiBasePath();
-        uriVariables.put("dmiServiceName",
-                yangModelCmHandle.resolveDmiServiceName(DATA));
+        uriVariables.put("dmiServiceName", dmiServiceName);
+        uriVariables.put("dmiBasePath", dmiBasePath);
+        uriVariables.put("cmHandleId", cmHandleId);
+        uriVariables.put("dataStore", dataStoreName);
+        return uriVariables;
+    }
+
+    /**
+     * This method populates uri variables for data operation request.
+     *
+     * @param dmiServiceName dmi service name
+     * @return {@code Map<String, Object>} uri variables as map
+     */
+    public Map<String, Object> populateDataOperationRequestUriVariables(final String dmiServiceName) {
+        final Map<String, Object> uriVariables = new HashMap<>();
+        final String dmiBasePath = dmiProperties.getDmiBasePath();
+        uriVariables.put("dmiServiceName", dmiServiceName);
         uriVariables.put("dmiBasePath", dmiBasePath);
-        uriVariables.put("cmHandle", cmHandle);
-        uriVariables.put("dataStore", dataStore.getValue());
         return uriVariables;
     }
 
@@ -114,6 +150,21 @@ public class DmiServiceUrlBuilder {
         return queryParams;
     }
 
+    /**
+     * This method is used to populate map from query params for data operation request.
+     *
+     * @param topicParamInQuery topic into url param
+     * @param requestId         unique id of response for valid topic
+     * @return all valid query params as map
+     */
+    public MultiValueMap<String, String> getDataOperationRequestQueryParams(final String topicParamInQuery,
+                                                                            final String requestId) {
+        final MultiValueMap<String, String> queryParams = new LinkedMultiValueMap<>();
+        getQueryParamConsumer().accept("topic", topicParamInQuery, queryParams);
+        getQueryParamConsumer().accept("requestId", requestId, queryParams);
+        return queryParams;
+    }
+
     private TriConsumer<String, String, MultiValueMap<String, String>> getQueryParamConsumer() {
         return (paramName, paramValue, paramMap) -> {
             if (Strings.isNotEmpty(paramValue)) {
@@ -121,4 +172,15 @@ public class DmiServiceUrlBuilder {
             }
         };
     }
+
+    private UriComponentsBuilder getUriComponentsBuilder(final UriComponentsBuilder uriComponentsBuilder,
+                                                         final MultiValueMap<String, String> queryParams,
+                                                         final Map<String, Object> uriVariables) {
+        return uriComponentsBuilder
+                .pathSegment("data")
+                .pathSegment("ds")
+                .pathSegment("{dataStore}")
+                .queryParams(queryParams)
+                .uriVariables(uriVariables);
+    }
 }