0494facd51c87d44c33395e357c874331b9bb596
[vid.git] / vid-app-common / src / main / java / org / onap / vid / mso / RestMsoImplementation.java
1 package org.onap.vid.mso;
2
3 import com.att.eelf.configuration.EELFLogger;
4 import com.fasterxml.jackson.databind.ObjectMapper;
5 import org.apache.commons.codec.binary.Base64;
6 import org.eclipse.jetty.util.security.Password;
7 import org.onap.vid.aai.util.HttpClientMode;
8 import org.onap.vid.aai.util.HttpsAuthClient;
9 import org.onap.vid.client.HttpBasicClient;
10 import org.onap.vid.exceptions.GenericUncheckedException;
11 import org.onap.vid.mso.rest.RestInterface;
12 import org.onap.vid.utils.Logging;
13 import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate;
14 import org.onap.portalsdk.core.util.SystemProperties;
15 import org.springframework.beans.factory.annotation.Autowired;
16 import org.springframework.http.HttpMethod;
17
18 import javax.ws.rs.client.Client;
19 import javax.ws.rs.client.Entity;
20 import javax.ws.rs.client.Invocation;
21 import javax.ws.rs.core.MediaType;
22 import javax.ws.rs.core.MultivaluedHashMap;
23 import javax.ws.rs.core.Response;
24 import java.text.DateFormat;
25 import java.text.SimpleDateFormat;
26 import java.util.Collections;
27 import java.util.Date;
28 import java.util.UUID;
29
30 import static org.onap.vid.utils.Logging.*;
31
32 /**
33  * Created by pickjonathan on 26/06/2017.
34  */
35 public class RestMsoImplementation implements RestInterface {
36
37     public static final String START_LOG = " start";
38     public static final String APPLICATION_JSON = "application/json";
39     public static final String WITH_STATUS = " with status=";
40     public static final String URL_LOG = ", url=";
41     public static final String NO_RESPONSE_ENTITY_LOG = " No response entity, this is probably ok, e=";
42     public static final String WITH_URL_LOG = " with url=";
43     public static final String EXCEPTION_LOG = ", Exception: ";
44     public static final String REST_API_SUCCESSFULL_LOG = " REST api was successfull!";
45     public static final String REST_API_POST_WAS_SUCCESSFUL_LOG = " REST api POST was successful!";
46     /**
47      * The logger.
48      */
49     EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(RestMsoImplementation.class);
50     private final EELFLogger outgoingRequestsLogger = Logging.getRequestsLogger("mso");
51
52     /**
53      * The Constant dateFormat.
54      */
55     static final DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss:SSSS");
56
57     /** The client. */
58     private Client client = null;
59
60     @Autowired
61     HttpsAuthClient httpsAuthClient;
62
63     /** The common headers. */
64     /**
65      * Instantiates a new mso rest interface.
66      */
67
68     @SuppressWarnings("Duplicates")
69     @Override
70     public MultivaluedHashMap<String, Object> initMsoClient()
71     {
72         final String methodname = "initRestClient()";
73
74         final String username = SystemProperties.getProperty(MsoProperties.MSO_USER_NAME);
75         final String password = SystemProperties.getProperty(MsoProperties.MSO_PASSWORD);
76         final String mso_url = SystemProperties.getProperty(MsoProperties.MSO_SERVER_URL);
77         final String decrypted_password = Password.deobfuscate(password);
78
79         String authString = username + ":" + decrypted_password;
80
81         byte[] authEncBytes = Base64.encodeBase64(authString.getBytes());
82         String authStringEnc = new String(authEncBytes);
83
84         MultivaluedHashMap<String, Object> commonHeaders = new MultivaluedHashMap();
85         commonHeaders.put("Authorization",  Collections.singletonList(("Basic " + authStringEnc)));
86                 //Pass calling application identifier to SO
87                 commonHeaders.put("X-FromAppId", Collections.singletonList(SystemProperties.getProperty(SystemProperties.APP_DISPLAY_NAME)));
88         try {
89             commonHeaders.put(REQUEST_ID_HEADER_KEY, Collections.singletonList(Logging.extractOrGenerateRequestId()));
90         }
91         catch (IllegalStateException e){
92             //in async jobs we don't have any HttpServletRequest
93             commonHeaders.put(REQUEST_ID_HEADER_KEY, Collections.singletonList(UUID.randomUUID().toString()));
94         }
95
96
97         boolean useSsl = true;
98         if ( (mso_url != null) && ( !(mso_url.isEmpty()) ) ) {
99             useSsl = mso_url.startsWith("https");
100         }
101         if (client == null) {
102
103             try {
104                 if ( useSsl ) {
105                     client = httpsAuthClient.getClient(HttpClientMode.WITHOUT_KEYSTORE);
106                 }
107                 else {
108                     client = HttpBasicClient.getClient();
109                 }
110             } catch (Exception e) {
111                 logger.info(EELFLoggerDelegate.errorLogger, dateFormat.format(new Date()) +  methodname + " Unable to get the SSL client");
112             }
113         }
114
115         return commonHeaders;
116     }
117
118     public <T> void  Get (T t, String sourceId, String path, RestObject<T> restObject ) {
119         String methodName = "Get";
120
121         logger.debug(EELFLoggerDelegate.debugLogger, methodName + START_LOG);
122
123         String url="";
124         restObject.set(t);
125
126         url = SystemProperties.getProperty(MsoProperties.MSO_SERVER_URL) + path;
127
128         MultivaluedHashMap<String, Object> commonHeaders = initMsoClient();
129         Logging.logRequest(outgoingRequestsLogger, HttpMethod.GET, url);
130         final Response cres = client.target(url)
131                 .request()
132                 .accept(APPLICATION_JSON)
133                 .headers(commonHeaders)
134                 .get();
135         Logging.logResponse(outgoingRequestsLogger, HttpMethod.GET, url, cres);
136         int status = cres.getStatus();
137         restObject.setStatusCode (status);
138
139         if (status == 200 || status == 202) {
140             t = (T) cres.readEntity(t.getClass());
141             restObject.set(t);
142             logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + methodName + REST_API_SUCCESSFULL_LOG);
143
144         } else {
145             throw new GenericUncheckedException(methodName + WITH_STATUS + status + ", url= " + url );
146         }
147
148         logger.debug(EELFLoggerDelegate.debugLogger,methodName + " received status=" + status );
149
150         return;
151     }
152
153     public <T> RestObject<T> GetForObject(String sourceID, String path, Class<T> clazz) {
154         final String methodName = getMethodName();
155         logger.debug(EELFLoggerDelegate.debugLogger, "start {}->{}({}, {}, {})", getMethodCallerName(), methodName, sourceID, path, clazz);
156
157         String url = SystemProperties.getProperty(MsoProperties.MSO_SERVER_URL) + path;
158         logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " +  methodName + " sending request to url= " + url);
159
160         MultivaluedHashMap<String, Object> commonHeaders = initMsoClient();
161         Logging.logRequest(outgoingRequestsLogger, HttpMethod.GET, url);
162         final Response cres = client.target(url)
163                 .request()
164                 .accept(APPLICATION_JSON)
165                 .headers(commonHeaders)
166                 .get();
167         Logging.logResponse(outgoingRequestsLogger, HttpMethod.GET, url, cres);
168         final RestObject<T> restObject = cresToRestObject(cres, clazz);
169         int status = cres.getStatus();
170
171         if (status == 200 || status == 202) {
172             logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + methodName + REST_API_SUCCESSFULL_LOG);
173         } else {
174             logger.debug(EELFLoggerDelegate.debugLogger,dateFormat.format(new Date()) + "<== " + methodName + WITH_STATUS +status+ URL_LOG +url);
175         }
176
177         logger.debug(EELFLoggerDelegate.debugLogger,methodName + " received status=" + status );
178
179         return restObject;
180     }
181
182     @Override
183     public <T> void Delete(T t, Object r, String sourceID, String path, RestObject<T> restObject) {
184
185         String methodName = "Delete";
186         String url="";
187         Response cres = null;
188
189         logger.debug(EELFLoggerDelegate.debugLogger,dateFormat.format(new Date()) + "<== " +  methodName + START_LOG);
190
191         try {
192             MultivaluedHashMap<String, Object> commonHeaders = initMsoClient();
193
194             url = SystemProperties.getProperty(MsoProperties.MSO_SERVER_URL) + path;
195             Logging.logRequest(outgoingRequestsLogger, HttpMethod.DELETE, url, r);
196             cres = client.target(url)
197                     .request()
198
199                     .accept(APPLICATION_JSON)
200                     .headers(commonHeaders)
201                     //.entity(r)
202                     .build("DELETE", Entity.entity(r, MediaType.APPLICATION_JSON)).invoke();
203             Logging.logResponse(outgoingRequestsLogger, HttpMethod.DELETE, url, cres);
204             int status = cres.getStatus();
205             restObject.setStatusCode (status);
206
207             if (status == 404) { // resource not found
208                 String msg = "Resource does not exist...: " + cres.getStatus();
209                 logger.debug(EELFLoggerDelegate.debugLogger,dateFormat.format(new Date()) + "<== " + msg);
210             } else if (status == 200  || status == 204){
211                 logger.debug(EELFLoggerDelegate.debugLogger,dateFormat.format(new Date()) + "<== " + "Resource " + url + " deleted");
212             } else if (status == 202) {
213                 String msg = "Delete in progress: " + status;
214                 logger.debug(EELFLoggerDelegate.debugLogger,dateFormat.format(new Date()) + "<== " + msg);
215             }
216             else {
217                 String msg = "Deleting Resource failed: " + status;
218                 logger.debug(EELFLoggerDelegate.debugLogger,dateFormat.format(new Date()) + "<== " + msg);
219             }
220
221             try {
222                 t = (T) cres.readEntity(t.getClass());
223                 restObject.set(t);
224             }
225             catch ( Exception e ) {
226                 logger.debug(EELFLoggerDelegate.debugLogger,dateFormat.format(new Date()) + "<== " + methodName + NO_RESPONSE_ENTITY_LOG
227                         + e.getMessage());
228             }
229
230         }
231         catch (Exception e)
232         {
233             logger.debug(EELFLoggerDelegate.debugLogger,dateFormat.format(new Date()) + "<== " + methodName + WITH_URL_LOG +url+ EXCEPTION_LOG + e.toString());
234             throw e;
235
236         }
237     }
238
239     public <T> RestObject<T> PostForObject(Object requestDetails, String sourceID, String path, Class<T> clazz) {
240         logger.debug(EELFLoggerDelegate.debugLogger, "start {}->{}({}, {}, {}, {})", getMethodCallerName(), getMethodName(), requestDetails, sourceID, path, clazz);
241         RestObject<T> restObject = new RestObject<>();
242         Post(clazz, requestDetails, path, restObject);
243         return restObject;
244     }
245
246     @Override
247     public <T> void Post(T t, Object r, String sourceID, String path, RestObject<T> restObject) {
248         logger.debug(EELFLoggerDelegate.debugLogger, "start {}->{}({}, {}, {}, {})", getMethodCallerName(), getMethodName(), t.getClass(), r, sourceID, path);
249         Post(t.getClass(), r, path, restObject);
250     }
251
252     public Invocation.Builder prepareClient(String path, String methodName) {
253         MultivaluedHashMap<String, Object> commonHeaders = initMsoClient();
254
255         String url = SystemProperties.getProperty(MsoProperties.MSO_SERVER_URL) + path;
256         logger.debug(EELFLoggerDelegate.debugLogger,dateFormat.format(new Date()) + "<== " +  methodName + " sending request to url= " + url);
257         // Change the content length
258         return client.target(url)
259                 .request()
260                 .accept(APPLICATION_JSON)
261                 .headers(commonHeaders);
262     }
263
264
265
266     public <T> void Post(Class<?> tClass, Object requestDetails, String path, RestObject<T> restObject)  {
267         String methodName = "Post";
268         String url="";
269
270         try {
271
272             MultivaluedHashMap<String, Object> commonHeaders = initMsoClient();
273
274             url = SystemProperties.getProperty(MsoProperties.MSO_SERVER_URL) + path;
275             Logging.logRequest(outgoingRequestsLogger, HttpMethod.POST, url, requestDetails);
276             // Change the content length
277             final Response cres = client.target(url)
278                     .request()
279                     .accept(APPLICATION_JSON)
280                     .headers(commonHeaders)
281                     .post(Entity.entity(requestDetails, MediaType.APPLICATION_JSON));
282             Logging.logResponse(outgoingRequestsLogger, HttpMethod.POST, url, cres);
283             final RestObject<T> cresToRestObject = cresToRestObject(cres, tClass);
284             restObject.set(cresToRestObject.get());
285             restObject.setStatusCode(cresToRestObject.getStatusCode());
286             restObject.setRaw(cresToRestObject.getRaw());
287
288             int status = cres.getStatus();
289             restObject.setStatusCode (status);
290
291             if ( status >= 200 && status <= 299 ) {
292                 logger.info(EELFLoggerDelegate.errorLogger, dateFormat.format(new Date()) + "<== " + methodName + REST_API_POST_WAS_SUCCESSFUL_LOG);
293                 logger.debug(EELFLoggerDelegate.debugLogger,dateFormat.format(new Date()) + "<== " + methodName + REST_API_POST_WAS_SUCCESSFUL_LOG);
294
295             } else {
296                 logger.debug(EELFLoggerDelegate.debugLogger,dateFormat.format(new Date()) + "<== " + methodName + WITH_STATUS +status+ URL_LOG +url);
297             }
298
299         } catch (Exception e)
300         {
301             logger.debug(EELFLoggerDelegate.debugLogger,dateFormat.format(new Date()) + "<== " + methodName + WITH_URL_LOG +url+ EXCEPTION_LOG + e.toString());
302             throw e;
303
304         }
305
306         logger.debug(EELFLoggerDelegate.debugLogger, "end {}() => ({}){}", getMethodName(), tClass, restObject);
307     }
308
309     private <T> RestObject<T> cresToRestObject(Response cres, Class<?> tClass) {
310         RestObject<T> restObject = new RestObject<>();
311
312         String rawEntity = null;
313         try {
314             cres.bufferEntity();
315             rawEntity = cres.readEntity(String.class);
316             restObject.setRaw(rawEntity);
317             T t = (T) new ObjectMapper().readValue(rawEntity, tClass);
318             restObject.set(t);
319         }
320         catch ( Exception e ) {
321             try {
322                 logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + getMethodCallerName() + " Error reading response entity as " + tClass + ": , e="
323                         + e.getMessage() + ", Entity=" + rawEntity);
324             } catch (Exception e2) {
325                 logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + getMethodCallerName() + NO_RESPONSE_ENTITY_LOG
326                         + e.getMessage());
327             }
328         }
329
330         int status = cres.getStatus();
331         restObject.setStatusCode (status);
332
333         return restObject;
334
335     }
336
337     @Override
338     public <T> void Put(T t, org.onap.vid.changeManagement.RequestDetailsWrapper r, String sourceID, String path, RestObject<T> restObject) {
339
340         String methodName = "Put";
341         String url="";
342
343         logger.debug(EELFLoggerDelegate.debugLogger,dateFormat.format(new Date()) + "<== " +  methodName + START_LOG);
344
345         try {
346
347             MultivaluedHashMap<String, Object> commonHeaders = initMsoClient();
348
349             url = SystemProperties.getProperty(MsoProperties.MSO_SERVER_URL) + path;
350             Logging.logRequest(outgoingRequestsLogger, HttpMethod.PUT, url, r);
351             // Change the content length
352             final Response cres = client.target(url)
353                     .request()
354                     .accept(APPLICATION_JSON)
355                     .headers(commonHeaders)
356                     //.header("content-length", 201)
357                     //.header("X-FromAppId",  sourceID)
358                     .put(Entity.entity(r, MediaType.APPLICATION_JSON));
359
360             Logging.logResponse(outgoingRequestsLogger, HttpMethod.PUT, url, cres);
361
362             try {
363                 t = (T) cres.readEntity(t.getClass());
364                 restObject.set(t);
365             }
366             catch ( Exception e ) {
367                 logger.debug(EELFLoggerDelegate.debugLogger,dateFormat.format(new Date()) + "<== " + methodName + NO_RESPONSE_ENTITY_LOG
368                         + e.getMessage());
369             }
370
371             int status = cres.getStatus();
372             restObject.setStatusCode (status);
373
374             if ( status >= 200 && status <= 299 ) {
375                 logger.info(EELFLoggerDelegate.errorLogger, dateFormat.format(new Date()) + "<== " + methodName + REST_API_POST_WAS_SUCCESSFUL_LOG);
376                 logger.debug(EELFLoggerDelegate.debugLogger,dateFormat.format(new Date()) + "<== " + methodName + REST_API_POST_WAS_SUCCESSFUL_LOG);
377
378             } else {
379                 logger.debug(EELFLoggerDelegate.debugLogger,dateFormat.format(new Date()) + "<== " + methodName + WITH_STATUS +status+ URL_LOG +url);
380             }
381
382         } catch (Exception e)
383         {
384             logger.debug(EELFLoggerDelegate.debugLogger,dateFormat.format(new Date()) + "<== " + methodName + WITH_URL_LOG +url+ EXCEPTION_LOG + e.toString());
385             throw e;
386
387         }
388     }
389 }