1 package org.onap.vid.mso;
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;
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;
30 import static org.onap.vid.utils.Logging.*;
33 * Created by pickjonathan on 26/06/2017.
35 public class RestMsoImplementation implements RestInterface {
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!";
49 EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(RestMsoImplementation.class);
50 private final EELFLogger outgoingRequestsLogger = Logging.getRequestsLogger("mso");
53 * The Constant dateFormat.
55 static final DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss:SSSS");
58 private Client client = null;
61 HttpsAuthClient httpsAuthClient;
63 /** The common headers. */
65 * Instantiates a new mso rest interface.
68 @SuppressWarnings("Duplicates")
70 public MultivaluedHashMap<String, Object> initMsoClient()
72 final String methodname = "initRestClient()";
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);
79 String authString = username + ":" + decrypted_password;
81 byte[] authEncBytes = Base64.encodeBase64(authString.getBytes());
82 String authStringEnc = new String(authEncBytes);
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)));
89 commonHeaders.put(REQUEST_ID_HEADER_KEY, Collections.singletonList(Logging.extractOrGenerateRequestId()));
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()));
97 boolean useSsl = true;
98 if ( (mso_url != null) && ( !(mso_url.isEmpty()) ) ) {
99 useSsl = mso_url.startsWith("https");
101 if (client == null) {
105 client = httpsAuthClient.getClient(HttpClientMode.WITHOUT_KEYSTORE);
108 client = HttpBasicClient.getClient();
110 } catch (Exception e) {
111 logger.info(EELFLoggerDelegate.errorLogger, dateFormat.format(new Date()) + methodname + " Unable to get the SSL client");
115 return commonHeaders;
118 public <T> void Get (T t, String sourceId, String path, RestObject<T> restObject ) {
119 String methodName = "Get";
121 logger.debug(EELFLoggerDelegate.debugLogger, methodName + START_LOG);
126 url = SystemProperties.getProperty(MsoProperties.MSO_SERVER_URL) + path;
128 MultivaluedHashMap<String, Object> commonHeaders = initMsoClient();
129 Logging.logRequest(outgoingRequestsLogger, HttpMethod.GET, url);
130 final Response cres = client.target(url)
132 .accept(APPLICATION_JSON)
133 .headers(commonHeaders)
135 Logging.logResponse(outgoingRequestsLogger, HttpMethod.GET, url, cres);
136 int status = cres.getStatus();
137 restObject.setStatusCode (status);
139 if (status == 200 || status == 202) {
140 t = (T) cres.readEntity(t.getClass());
142 logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + methodName + REST_API_SUCCESSFULL_LOG);
145 throw new GenericUncheckedException(methodName + WITH_STATUS + status + ", url= " + url );
148 logger.debug(EELFLoggerDelegate.debugLogger,methodName + " received status=" + status );
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);
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);
160 MultivaluedHashMap<String, Object> commonHeaders = initMsoClient();
161 Logging.logRequest(outgoingRequestsLogger, HttpMethod.GET, url);
162 final Response cres = client.target(url)
164 .accept(APPLICATION_JSON)
165 .headers(commonHeaders)
167 Logging.logResponse(outgoingRequestsLogger, HttpMethod.GET, url, cres);
168 final RestObject<T> restObject = cresToRestObject(cres, clazz);
169 int status = cres.getStatus();
171 if (status == 200 || status == 202) {
172 logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + methodName + REST_API_SUCCESSFULL_LOG);
174 logger.debug(EELFLoggerDelegate.debugLogger,dateFormat.format(new Date()) + "<== " + methodName + WITH_STATUS +status+ URL_LOG +url);
177 logger.debug(EELFLoggerDelegate.debugLogger,methodName + " received status=" + status );
183 public <T> void Delete(T t, Object r, String sourceID, String path, RestObject<T> restObject) {
185 String methodName = "Delete";
187 Response cres = null;
189 logger.debug(EELFLoggerDelegate.debugLogger,dateFormat.format(new Date()) + "<== " + methodName + START_LOG);
192 MultivaluedHashMap<String, Object> commonHeaders = initMsoClient();
194 url = SystemProperties.getProperty(MsoProperties.MSO_SERVER_URL) + path;
195 Logging.logRequest(outgoingRequestsLogger, HttpMethod.DELETE, url, r);
196 cres = client.target(url)
199 .accept(APPLICATION_JSON)
200 .headers(commonHeaders)
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);
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);
217 String msg = "Deleting Resource failed: " + status;
218 logger.debug(EELFLoggerDelegate.debugLogger,dateFormat.format(new Date()) + "<== " + msg);
222 t = (T) cres.readEntity(t.getClass());
225 catch ( Exception e ) {
226 logger.debug(EELFLoggerDelegate.debugLogger,dateFormat.format(new Date()) + "<== " + methodName + NO_RESPONSE_ENTITY_LOG
233 logger.debug(EELFLoggerDelegate.debugLogger,dateFormat.format(new Date()) + "<== " + methodName + WITH_URL_LOG +url+ EXCEPTION_LOG + e.toString());
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);
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);
252 public Invocation.Builder prepareClient(String path, String methodName) {
253 MultivaluedHashMap<String, Object> commonHeaders = initMsoClient();
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)
260 .accept(APPLICATION_JSON)
261 .headers(commonHeaders);
266 public <T> void Post(Class<?> tClass, Object requestDetails, String path, RestObject<T> restObject) {
267 String methodName = "Post";
272 MultivaluedHashMap<String, Object> commonHeaders = initMsoClient();
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)
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());
288 int status = cres.getStatus();
289 restObject.setStatusCode (status);
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);
296 logger.debug(EELFLoggerDelegate.debugLogger,dateFormat.format(new Date()) + "<== " + methodName + WITH_STATUS +status+ URL_LOG +url);
299 } catch (Exception e)
301 logger.debug(EELFLoggerDelegate.debugLogger,dateFormat.format(new Date()) + "<== " + methodName + WITH_URL_LOG +url+ EXCEPTION_LOG + e.toString());
306 logger.debug(EELFLoggerDelegate.debugLogger, "end {}() => ({}){}", getMethodName(), tClass, restObject);
309 private <T> RestObject<T> cresToRestObject(Response cres, Class<?> tClass) {
310 RestObject<T> restObject = new RestObject<>();
312 String rawEntity = null;
315 rawEntity = cres.readEntity(String.class);
316 restObject.setRaw(rawEntity);
317 T t = (T) new ObjectMapper().readValue(rawEntity, tClass);
320 catch ( Exception e ) {
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
330 int status = cres.getStatus();
331 restObject.setStatusCode (status);
338 public <T> void Put(T t, org.onap.vid.changeManagement.RequestDetailsWrapper r, String sourceID, String path, RestObject<T> restObject) {
340 String methodName = "Put";
343 logger.debug(EELFLoggerDelegate.debugLogger,dateFormat.format(new Date()) + "<== " + methodName + START_LOG);
347 MultivaluedHashMap<String, Object> commonHeaders = initMsoClient();
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)
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));
360 Logging.logResponse(outgoingRequestsLogger, HttpMethod.PUT, url, cres);
363 t = (T) cres.readEntity(t.getClass());
366 catch ( Exception e ) {
367 logger.debug(EELFLoggerDelegate.debugLogger,dateFormat.format(new Date()) + "<== " + methodName + NO_RESPONSE_ENTITY_LOG
371 int status = cres.getStatus();
372 restObject.setStatusCode (status);
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);
379 logger.debug(EELFLoggerDelegate.debugLogger,dateFormat.format(new Date()) + "<== " + methodName + WITH_STATUS +status+ URL_LOG +url);
382 } catch (Exception e)
384 logger.debug(EELFLoggerDelegate.debugLogger,dateFormat.format(new Date()) + "<== " + methodName + WITH_URL_LOG +url+ EXCEPTION_LOG + e.toString());