2  * ============LICENSE_START=======================================================
 
   3  * DCAEGEN2-SERVICES-SDK
 
   4  * ================================================================================
 
   5  * Copyright (C) 2019-2021 Nokia. All rights reserved.
 
   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.
 
  18  * ============LICENSE_END=========================================================
 
  20 package org.onap.dcaegen2.services.sdk.rest.services.cbs.client.impl;
 
  22 import com.google.gson.JsonObject;
 
  23 import org.jetbrains.annotations.NotNull;
 
  24 import org.onap.dcaegen2.services.sdk.rest.services.adapters.http.HttpMethod;
 
  25 import org.onap.dcaegen2.services.sdk.rest.services.adapters.http.HttpResponse;
 
  26 import org.onap.dcaegen2.services.sdk.rest.services.adapters.http.ImmutableHttpRequest;
 
  27 import org.onap.dcaegen2.services.sdk.rest.services.adapters.http.RxHttpClient;
 
  28 import org.onap.dcaegen2.services.sdk.rest.services.cbs.client.api.CbsClient;
 
  29 import org.onap.dcaegen2.services.sdk.rest.services.cbs.client.model.CbsRequest;
 
  30 import org.slf4j.Logger;
 
  31 import org.slf4j.LoggerFactory;
 
  32 import reactor.core.publisher.Mono;
 
  34 import java.net.InetSocketAddress;
 
  35 import java.net.MalformedURLException;
 
  38 public class CbsClientRest implements CbsClient {
 
  39     private static final Logger LOGGER = LoggerFactory.getLogger(CbsClientRest.class);
 
  40     private final RxHttpClient httpClient;
 
  41     private final String serviceName;
 
  42     private final InetSocketAddress cbsAddress;
 
  43     private final String protocol;
 
  45     public CbsClientRest(RxHttpClient httpClient, String serviceName, InetSocketAddress cbsAddress, String protocol) {
 
  46         this.httpClient = httpClient;
 
  47         this.serviceName = serviceName;
 
  48         this.cbsAddress = cbsAddress;
 
  49         this.protocol = protocol;
 
  53     public @NotNull Mono<JsonObject> get(CbsRequest request) {
 
  54         return Mono.fromCallable(() -> constructUrl(request).toString())
 
  55                 .doOnNext(this::logRequestUrl)
 
  56                 .map(url -> ImmutableHttpRequest.builder()
 
  57                         .method(HttpMethod.GET)
 
  59                         .diagnosticContext(request.diagnosticContext())
 
  61                 .flatMap(httpClient::call)
 
  62                 .doOnNext(HttpResponse::throwIfUnsuccessful)
 
  63                 .map(resp -> resp.bodyAsJson(JsonObject.class))
 
  64                 .doOnNext(this::logCbsResponse);
 
  67     private void logRequestUrl(String url) {
 
  68         LOGGER.debug("Calling {} for configuration", url);
 
  71     private void logCbsResponse(JsonObject json) {
 
  72         LOGGER.info("Got successful response from Config Binding Service");
 
  73         LOGGER.debug("CBS response: {}", json);
 
  76     private URL constructUrl(CbsRequest request) {
 
  80                     cbsAddress.getHostString(),
 
  82                     request.requestPath().getForService(serviceName));
 
  83         } catch (MalformedURLException e) {
 
  84             throw new IllegalArgumentException("Invalid CBS URL", e);