remove not required docs and .readthedocs.yaml
[msb/java-sdk.git] / src / main / java / org / onap / msb / sdk / httpclient / handler / RetrofitServiceHandler.java
1 /*******************************************************************************
2  * Copyright 2017 ZTE, Inc. and others.
3  * 
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
6  * 
7  * http://www.apache.org/licenses/LICENSE-2.0
8  * 
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
12  * the License.
13  ******************************************************************************/
14 /**
15  * 
16  */
17 package org.onap.msb.sdk.httpclient.handler;
18
19 import java.lang.reflect.InvocationHandler;
20 import java.lang.reflect.Method;
21 import java.util.Map;
22 import java.util.concurrent.atomic.AtomicReference;
23
24 import org.onap.msb.sdk.httpclient.ProxyRetrofitCall;
25 import org.onap.msb.sdk.httpclient.ServiceHttpEndPointObject;
26 import org.onap.msb.sdk.httpclient.exception.RetrofitServiceRuntimeException;
27 import org.onap.msb.sdk.httpclient.lb.LoadBalanceContext;
28 import org.slf4j.Logger;
29 import org.slf4j.LoggerFactory;
30
31 import com.google.common.collect.Lists;
32 import retrofit2.Call;
33
34 /**
35  * @author 10071214
36  *
37  */
38 public class RetrofitServiceHandler implements InvocationHandler {
39
40     private final static Logger logger = LoggerFactory.getLogger(RetrofitServiceHandler.class);
41     private static long periodTime = 60;
42
43     static {
44         try {
45             String periodStr = System.getenv("retrofit_route_cache_refresh_period");
46             periodTime = periodStr != null ? Long.valueOf(periodStr) : 60;
47             logger.info("retrofit_route_cache_refresh_period:" + periodTime);
48         } catch (Exception e) {
49             logger.warn("", e);
50         }
51
52     }
53
54
55
56     private RetrofitServiceHandlerContext flowContext;
57
58     private AtomicReference<Map<ServiceHttpEndPointObject, Object>> endPointToRetrofitRef = new AtomicReference();
59
60     public RetrofitServiceHandler(RetrofitServiceHandlerContext flowContext) {
61         super();
62         this.flowContext = flowContext;
63         logger.info("retrofit_route_cache_refresh_period:" + periodTime);
64     }
65
66
67     /*
68      * (non-Javadoc)
69      * 
70      * @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object, java.lang.reflect.Method,
71      * java.lang.Object[])
72      */
73     @Override
74     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
75
76         Object retrofitObject = null;
77         ServiceHttpEndPointObjectWapper wapper = null;
78
79         updateMsbInfo();
80         wapper = selectRetrofitObjectByLBStrategy(
81                         flowContext.getRetrofitObjectBuilder().buildRetrofitObject(endPointToRetrofitRef, null), method,
82                         args);
83         retrofitObject = wapper.retrofitObject;
84
85         Object resultObjecct = method.invoke(retrofitObject, args);
86
87         if (resultObjecct instanceof Call) {
88             Call targetCall = (Call) resultObjecct;
89             return new ProxyRetrofitCall(targetCall, this, wapper.endPoint, proxy, method, args);
90         }
91         return resultObjecct;
92     }
93
94
95     public Object reInvoke(Object proxy, Method method, Object[] args, ServiceHttpEndPointObject endPoint)
96                     throws Throwable {
97
98
99         Object retrofitObject = null;
100         ServiceHttpEndPointObjectWapper wapper = null;
101
102         updateMsbInfo();
103
104         Map<ServiceHttpEndPointObject, Object> serviceHttpEndPointObjectMap =
105                         flowContext.getRetrofitObjectBuilder().buildRetrofitObject(endPointToRetrofitRef, endPoint);
106
107         wapper = selectRetrofitObjectByLBStrategy(serviceHttpEndPointObjectMap, method, args);
108
109
110
111         retrofitObject = wapper.retrofitObject;
112
113         Object resultObjecct = method.invoke(retrofitObject, args);
114
115         return resultObjecct;
116
117     }
118
119     private void updateMsbInfo() {
120
121
122
123         if (System.currentTimeMillis() - flowContext.getLastUpdateMsbTime() > periodTime * 1000) {
124             clean();
125         }
126     }
127
128     public void clean() {
129         endPointToRetrofitRef.set(null);
130     }
131
132
133     private ServiceHttpEndPointObjectWapper selectRetrofitObjectByLBStrategy(
134                     Map<ServiceHttpEndPointObject, Object> srvEndPointToRetrofit, Method method, Object[] args)
135                     throws RetrofitServiceRuntimeException {
136
137         LoadBalanceContext ctx = new LoadBalanceContext();
138         ctx.setEndPoints(Lists.newArrayList(srvEndPointToRetrofit.keySet()));
139         ctx.setArgs(args);
140         ctx.setMethod(method);
141         ServiceHttpEndPointObject endPoint = flowContext.getLbStrategy().chooseEndPointObject(ctx);
142         return new ServiceHttpEndPointObjectWapper(endPoint, srvEndPointToRetrofit.get(endPoint));
143     }
144
145 }
146
147
148 class ServiceHttpEndPointObjectWapper {
149
150     protected ServiceHttpEndPointObject endPoint;
151     protected Object retrofitObject;
152
153     public ServiceHttpEndPointObjectWapper(ServiceHttpEndPointObject endPoint, Object retrofitObject) {
154         super();
155         this.endPoint = endPoint;
156         this.retrofitObject = retrofitObject;
157     }
158
159 }