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.portalsdk.core.logging.logic.EELFLoggerDelegate;
8 import org.onap.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;
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;
29 import static org.onap.vid.utils.Logging.*;
32 * Created by pickjonathan on 26/06/2017.
34 public class RestMsoImplementation implements RestInterface {
39 EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(RestMsoImplementation.class);
40 final private EELFLogger outgoingRequestsLogger = Logging.getRequestsLogger("mso");
43 * The Constant dateFormat.
45 final static DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss:SSSS");
48 private static Client client = null;
50 /** The common headers. */
51 //private MultivaluedHashMap<String, Object> commonHeaders;
53 * Instantiates a new mso rest interface.
56 @SuppressWarnings("Duplicates")
58 public MultivaluedHashMap<String, Object> initMsoClient()
60 final String methodname = "initRestClient()";
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);
67 String authString = username + ":" + decrypted_password;
69 byte[] authEncBytes = Base64.encodeBase64(authString.getBytes());
70 String authStringEnc = new String(authEncBytes);
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)));
78 boolean use_ssl = true;
79 if ( (mso_url != null) && ( !(mso_url.isEmpty()) ) ) {
80 if ( mso_url.startsWith("https")) {
91 //logger.info(EELFLoggerDelegate.errorLogger, dateFormat.format(new Date()) + methodname + " getting HttpsBasicClient with username=" + username
92 // + " password=" + password);
93 client = HttpsBasicClient.getClient();
96 //logger.info(EELFLoggerDelegate.errorLogger, dateFormat.format(new Date()) + methodname + " getting HttpsBasicClient with username=" + username
97 // + " password=" + password);
98 client = HttpBasicClient.getClient();
100 } catch (Exception e) {
101 logger.info(EELFLoggerDelegate.errorLogger, dateFormat.format(new Date()) + methodname + " Unable to get the SSL client");
105 return commonHeaders;
108 public <T> void Get (T t, String sourceId, String path, RestObject<T> restObject ) throws Exception {
109 String methodName = "Get";
111 logger.debug(EELFLoggerDelegate.debugLogger, methodName + " start");
116 url = SystemProperties.getProperty(MsoProperties.MSO_SERVER_URL) + path;
118 MultivaluedHashMap<String, Object> commonHeaders = initMsoClient();
119 Logging.logRequest(outgoingRequestsLogger, HttpMethod.GET, url);
120 final Response cres = client.target(url)
122 .accept("application/json")
123 .headers(commonHeaders)
125 Logging.logResponse(outgoingRequestsLogger, HttpMethod.GET, url, cres);
126 int status = cres.getStatus();
127 restObject.setStatusCode (status);
129 if (status == 200 || status == 202) {
130 t = (T) cres.readEntity(t.getClass());
132 logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + methodName + " REST api was successfull!");
135 throw new Exception(methodName + " with status="+ status + ", url= " + url );
138 logger.debug(EELFLoggerDelegate.debugLogger,methodName + " received status=" + status );
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);
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);
150 MultivaluedHashMap<String, Object> commonHeaders = initMsoClient();
151 Logging.logRequest(outgoingRequestsLogger, HttpMethod.GET, url);
152 final Response cres = client.target(url)
154 .accept("application/json")
155 .headers(commonHeaders)
157 Logging.logResponse(outgoingRequestsLogger, HttpMethod.GET, url, cres);
158 final RestObject<T> restObject = cresToRestObject(cres, clazz);
159 int status = cres.getStatus();
161 if (status == 200 || status == 202) {
162 logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + methodName + " REST api was successfull!");
164 logger.debug(EELFLoggerDelegate.debugLogger,dateFormat.format(new Date()) + "<== " + methodName + " with status="+status+", url="+url);
167 logger.debug(EELFLoggerDelegate.debugLogger,methodName + " received status=" + status );
173 public <T> void Delete(T t, Object r, String sourceID, String path, RestObject<T> restObject) {
175 String methodName = "Delete";
177 Response cres = null;
179 logger.debug(EELFLoggerDelegate.debugLogger,dateFormat.format(new Date()) + "<== " + methodName + " start");
182 MultivaluedHashMap<String, Object> commonHeaders = initMsoClient();
184 url = SystemProperties.getProperty(MsoProperties.MSO_SERVER_URL) + path;
185 Logging.logRequest(outgoingRequestsLogger, HttpMethod.DELETE, url, r);
186 cres = client.target(url)
188 .accept("application/json")
189 .headers(commonHeaders)
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);
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);
206 String msg = "Deleting Resource failed: " + status;
207 logger.debug(EELFLoggerDelegate.debugLogger,dateFormat.format(new Date()) + "<== " + msg);
211 t = (T) cres.readEntity(t.getClass());
214 catch ( Exception e ) {
215 logger.debug(EELFLoggerDelegate.debugLogger,dateFormat.format(new Date()) + "<== " + methodName + " No response entity, this is probably ok, e="
222 logger.debug(EELFLoggerDelegate.debugLogger,dateFormat.format(new Date()) + "<== " + methodName + " with url="+url+ ", Exception: " + e.toString());
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);
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);
241 public Invocation.Builder prepareClient(String path, String methodName) {
242 MultivaluedHashMap<String, Object> commonHeaders = initMsoClient();
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)
249 .accept("application/json")
250 .headers(commonHeaders);
255 public <T> void Post(Class<?> tClass, Object requestDetails, String sourceID, String path, RestObject<T> restObject) throws RuntimeException {
256 String methodName = "Post";
261 MultivaluedHashMap<String, Object> commonHeaders = initMsoClient();
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)
268 .accept("application/json")
269 .headers(commonHeaders)
270 .post(Entity.entity(requestDetails, MediaType.APPLICATION_JSON));
271 Logging.logResponse(outgoingRequestsLogger, HttpMethod.POST, url, cres);
273 final RestObject<T> cresToRestObject = cresToRestObject(cres, tClass);
274 restObject.set(cresToRestObject.get());
275 restObject.setStatusCode(cresToRestObject.getStatusCode());
276 restObject.setRaw(cresToRestObject.getRaw());
278 int status = cres.getStatus();
279 restObject.setStatusCode (status);
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!");
286 logger.debug(EELFLoggerDelegate.debugLogger,dateFormat.format(new Date()) + "<== " + methodName + " with status="+status+", url="+url);
289 } catch (Exception e)
291 logger.debug(EELFLoggerDelegate.debugLogger,dateFormat.format(new Date()) + "<== " + methodName + " with url="+url+ ", Exception: " + e.toString());
296 logger.debug(EELFLoggerDelegate.debugLogger, "end {}() => ({}){}", getMethodName(), tClass, restObject);
299 private <T> RestObject<T> cresToRestObject(Response cres, Class<?> tClass) {
300 RestObject<T> restObject = new RestObject<>();
302 String rawEntity = null;
305 rawEntity = cres.readEntity(String.class);
306 T t = (T) new ObjectMapper().readValue(rawEntity, tClass);
309 catch ( Exception e ) {
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="
320 int status = cres.getStatus();
321 restObject.setStatusCode (status);
328 public <T> void Put(T t, org.onap.vid.changeManagement.RequestDetailsWrapper r, String sourceID, String path, RestObject<T> restObject) throws Exception {
330 String methodName = "Put";
333 logger.debug(EELFLoggerDelegate.debugLogger,dateFormat.format(new Date()) + "<== " + methodName + " start");
338 MultivaluedHashMap<String, Object> commonHeaders = initMsoClient();
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)
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));
351 Logging.logResponse(outgoingRequestsLogger, HttpMethod.PUT, url, cres);
354 t = (T) cres.readEntity(t.getClass());
357 catch ( Exception e ) {
358 logger.debug(EELFLoggerDelegate.debugLogger,dateFormat.format(new Date()) + "<== " + methodName + " No response entity, this is probably ok, e="
362 int status = cres.getStatus();
363 restObject.setStatusCode (status);
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!");
370 logger.debug(EELFLoggerDelegate.debugLogger,dateFormat.format(new Date()) + "<== " + methodName + " with status="+status+", url="+url);
373 } catch (Exception e)
375 logger.debug(EELFLoggerDelegate.debugLogger,dateFormat.format(new Date()) + "<== " + methodName + " with url="+url+ ", Exception: " + e.toString());