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