1 /*******************************************************************************
2 * Copyright 2017 ZTE, Inc. and others.
4 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
5 * in compliance with the License. You may obtain a copy of the License at
7 * http://www.apache.org/licenses/LICENSE-2.0
9 * Unless required by applicable law or agreed to in writing, software distributed under the License
10 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
11 * or implied. See the License for the specific language governing permissions and limitations under
13 ******************************************************************************/
17 package org.onap.msb.sdk.httpclient.builder.impl;
19 import java.util.HashSet;
20 import java.util.LinkedHashMap;
23 import java.util.concurrent.atomic.AtomicReference;
25 import org.onap.msb.sdk.discovery.entity.MicroServiceFullInfo;
26 import org.onap.msb.sdk.discovery.entity.NodeInfo;
27 import org.onap.msb.sdk.httpclient.RetrofitServiceUtils;
28 import org.onap.msb.sdk.httpclient.ServiceHttpEndPointBeanObject;
29 import org.onap.msb.sdk.httpclient.ServiceHttpEndPointObject;
30 import org.onap.msb.sdk.httpclient.builder.IRetrofitObjectBuilder;
31 import org.onap.msb.sdk.httpclient.exception.RetrofitServiceRuntimeException;
32 import org.onap.msb.sdk.httpclient.handler.RetrofitServiceHandlerContext;
34 import okhttp3.OkHttpClient;
35 import retrofit2.Retrofit;
41 public class ClientRetrofitObjectBuilder implements IRetrofitObjectBuilder {
44 private RetrofitServiceHandlerContext context;
47 public ClientRetrofitObjectBuilder(RetrofitServiceHandlerContext context) {
49 this.context = context;
57 * com.zte.ums.zenap.httpclient.retrofit.builder.IRetrofitObjectBuilder#buildRetrofitObject(java.
58 * util.concurrent.atomic.AtomicReference)
61 public Map<ServiceHttpEndPointObject, Object> buildRetrofitObject(
62 AtomicReference<Map<ServiceHttpEndPointObject, Object>> endPointToRetrofitRef,
63 ServiceHttpEndPointObject lastEndPoint) throws RetrofitServiceRuntimeException {
65 Map<ServiceHttpEndPointObject, Object> srvEndPointToRetrofit = endPointToRetrofitRef.get();
66 if (srvEndPointToRetrofit == null) {
67 srvEndPointToRetrofit = new LinkedHashMap<>();
71 ServiceHttpEndPointBeanObject srvhttpEndPointBeanObject =
72 context.getServiceHttpEndPointBeanObject();
74 // MsbClientFactory msbClient = context.getLocator().getService(MsbClientFactory.class);
76 MicroServiceFullInfo fullInfo = null;
79 context.getMsbClient().queryMicroServiceInfo(srvhttpEndPointBeanObject.getServiceName(),
80 srvhttpEndPointBeanObject.getServiceVersion());
83 for (NodeInfo nodeInfo : fullInfo.getNodes()) {
85 MicroServiceFullInfo cloneFullInfo = cloneFullInfo(fullInfo, nodeInfo);
87 ServiceHttpEndPointObject endPointObj =
88 new ServiceHttpEndPointObject(srvhttpEndPointBeanObject.getServiceName(),
89 srvhttpEndPointBeanObject.getServiceVersion(), nodeInfo, cloneFullInfo);
92 String baseUrl = null;
93 if (fullInfo.getUrl() == null || fullInfo.getUrl().trim().length() == 0
94 || fullInfo.getUrl().equals("/")) {
95 baseUrl = String.format("http://%s:%s/", nodeInfo.getIp(), nodeInfo.getPort());
97 baseUrl = String.format("http://%s:%s%s/", nodeInfo.getIp(), nodeInfo.getPort(),
101 OkHttpClient httpClient = null;
103 if (context.getHttpClientConf() != null) {
104 if (srvhttpEndPointBeanObject.getClientProtocl().toLowerCase().equals("https")) {
106 RetrofitServiceUtils.buildDefaultOkHttpsClient(context.getHttpClientConf());
109 RetrofitServiceUtils.buildDefaultOkHttpClient(context.getHttpClientConf());
112 if (srvhttpEndPointBeanObject.getClientProtocl().toLowerCase().equals("https")) {
113 httpClient = RetrofitServiceUtils.buildDefaultOkHttpsClient(
114 RetrofitServiceHandlerContext.getGlobalHttpClientConf());
116 httpClient = RetrofitServiceUtils.buildDefaultOkHttpClient(
117 RetrofitServiceHandlerContext.getGlobalHttpClientConf());
123 Retrofit retrofit = new Retrofit.Builder().client(httpClient).baseUrl(baseUrl)
124 .addConverterFactory(context.getConverterFactoryBuilder().buildConverterFactory())
127 srvEndPointToRetrofit.put(endPointObj,
128 retrofit.create(context.getRetrofitSrvInterfaceClazz()));
132 if (srvEndPointToRetrofit.isEmpty()) {
133 throw new RetrofitServiceRuntimeException(
134 "can't find service in msb,serviceName:" + srvhttpEndPointBeanObject.getServiceName()
135 + ",serviceVersion:" + srvhttpEndPointBeanObject.getServiceVersion());
138 if (lastEndPoint != null) {
139 srvEndPointToRetrofit.remove(lastEndPoint);
142 if (srvEndPointToRetrofit.isEmpty()) {
143 throw new RetrofitServiceRuntimeException("can't find other service in msb,serviceName:"
144 + srvhttpEndPointBeanObject.getServiceName() + ",serviceVersion:"
145 + srvhttpEndPointBeanObject.getServiceVersion());
148 if (endPointToRetrofitRef.compareAndSet(null, srvEndPointToRetrofit)) {
149 context.setLastUpdateMsbTime(System.currentTimeMillis());
152 return endPointToRetrofitRef.get();
155 } catch (Exception e) {
156 throw new RetrofitServiceRuntimeException("init Retrofit service map fail", e);
160 return endPointToRetrofitRef.get();
165 private MicroServiceFullInfo cloneFullInfo(MicroServiceFullInfo fullInfo, NodeInfo nodeInfo) {
167 MicroServiceFullInfo cloneFuleInfo = new MicroServiceFullInfo();
168 cloneFuleInfo.setMetadata(fullInfo.getMetadata());
169 cloneFuleInfo.setProtocol(fullInfo.getProtocol());
170 cloneFuleInfo.setServiceName(fullInfo.getServiceName());
171 cloneFuleInfo.setStatus(fullInfo.getStatus());
172 cloneFuleInfo.setUrl(fullInfo.getUrl());
173 cloneFuleInfo.setVersion(fullInfo.getVersion());
174 cloneFuleInfo.setVisualRange(fullInfo.getVisualRange());
175 Set<NodeInfo> nodeInfos = new HashSet<>();
176 nodeInfos.add(nodeInfo);
177 cloneFuleInfo.setNodes(nodeInfos);
178 return cloneFuleInfo;