Merge from ECOMP's repository
[vid.git] / vid-app-common / src / main / java / org / onap / vid / scheduler / SchedulerRestInterface.java
index abd03f3..c986f22 100644 (file)
 package org.onap.vid.scheduler;
 
 import com.att.eelf.configuration.EELFLogger;
-import org.apache.commons.codec.binary.Base64;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Maps;
+import io.joshworks.restclient.http.HttpResponse;
+import org.apache.http.HttpException;
 import org.eclipse.jetty.util.security.Password;
-import org.onap.vid.aai.util.HttpClientMode;
-import org.onap.vid.aai.util.HttpsAuthClient;
-import org.onap.vid.client.HttpBasicClient;
-import org.onap.vid.exceptions.GenericUncheckedException;
-import org.onap.vid.utils.Logging;
 import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate;
 import org.onap.portalsdk.core.util.SystemProperties;
-import org.springframework.beans.factory.annotation.Autowired;
+import org.onap.vid.aai.ExceptionWithRequestInfo;
+import org.onap.vid.client.SyncRestClient;
+import org.onap.vid.client.SyncRestClientInterface;
+import org.onap.vid.exceptions.GenericUncheckedException;
+import org.onap.vid.mso.RestObject;
+import org.onap.vid.mso.RestObjectWithRequestInfo;
+import org.onap.vid.utils.Logging;
 import org.springframework.http.HttpMethod;
 import org.springframework.stereotype.Service;
 
-import javax.ws.rs.client.Client;
-import javax.ws.rs.core.MultivaluedHashMap;
-import javax.ws.rs.core.Response;
+import java.util.Base64;
 import java.util.Collections;
+import java.util.Map;
+import java.util.function.Function;
 
 import static org.onap.vid.utils.Logging.REQUEST_ID_HEADER_KEY;
 
 @Service
 public class SchedulerRestInterface implements SchedulerRestInterfaceIfc {
 
-       private Client client = null;
-
-       @Autowired
-       HttpsAuthClient httpsAuthClient;
-
-       private MultivaluedHashMap<String, Object> commonHeaders;
-       
-       /** The logger. */
-       private static EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(SchedulerRestInterface.class);
-       final private static EELFLogger outgoingRequestsLogger = Logging.getRequestsLogger("scheduler");
-       
-       public void initRestClient() {
-               logger.info("Starting to initialize rest client ");
-               
-               final String username;
-               final String password;
-               
-               /*Setting user name based on properties*/
-               String retrievedUsername = SystemProperties.getProperty(SchedulerProperties.SCHEDULER_USER_NAME_VAL);
-               if(retrievedUsername.isEmpty()) {
-                       username = "";
-               } else {
-                       username = retrievedUsername;
-               }
-               
-               /*Setting password based on properties*/
-               String retrievedPassword = SystemProperties.getProperty(SchedulerProperties.SCHEDULER_PASSWORD_VAL);
-               if(retrievedPassword.isEmpty()) {
-                       password = "";
-               } else {
-                       if (retrievedPassword.contains("OBF:")) {
-                               password = Password.deobfuscate(retrievedPassword);
-                       } else {
-                               password = retrievedPassword;
-                       }
-               }
-               
-               String authString = username + ":" + password;
-                               
-               byte[] authEncBytes = Base64.encodeBase64(authString.getBytes());
-               String authStringEnc = new String(authEncBytes);
-
-               commonHeaders = new MultivaluedHashMap<String, Object> ();
-               commonHeaders.put("Authorization", Collections.singletonList("Basic " + authStringEnc));
-                                       
-               try {
-                       if ( !username.isEmpty() ) { 
-                               client = httpsAuthClient.getClient(HttpClientMode.WITHOUT_KEYSTORE);
-                       }
-                       else {
-                               
-                               client = HttpBasicClient.getClient();
-                       }
-               } catch (Exception e) {
-                       logger.error(" <== Unable to initialize rest client ", e);
-               }
-
-               logger.info("\t<== Client Initialized \n");
-       }
-               
-       public <T> void Get (T t, String sourceId, String path, org.onap.vid.scheduler.RestObject<T> restObject ) {
-               
-               String methodName = "Get";
-               String url = SystemProperties.getProperty(SchedulerProperties.SCHEDULER_SERVER_URL_VAL) + path;
-               initRestClient();
-               Logging.logRequest(outgoingRequestsLogger, HttpMethod.GET, url);
-               final Response cres = client.target(url)
-                        .request()
-                .accept("application/json")
-                .headers(commonHeaders)
-                        .header(REQUEST_ID_HEADER_KEY, Logging.extractOrGenerateRequestId())
-                        .get();
-               Logging.logResponse(outgoingRequestsLogger, HttpMethod.GET, url, cres);
-               int status = cres.getStatus();
-               restObject.setStatusCode (status);
-               
-               if (status == 200) {
-                        t = (T) cres.readEntity(t.getClass());
-                        restObject.set(t);
-                       
-                } else {
-                    throw new GenericUncheckedException(methodName + " with status="+ status + ", url= " + url );
-                }
-
-       }
-
-       public <T> void Delete(T t, String sourceID, String path, org.onap.vid.scheduler.RestObject<T> restObject) {
-
-               initRestClient();
-
-               String url = SystemProperties.getProperty(SchedulerProperties.SCHEDULER_SERVER_URL_VAL) + path;
-               Logging.logRequest(outgoingRequestsLogger, HttpMethod.DELETE, url);
-               Response cres = client.target(url)
-                               .request()
-                               .accept("application/json")
-                               .headers(commonHeaders)
-                               .header(REQUEST_ID_HEADER_KEY, Logging.extractOrGenerateRequestId())
-                               .delete();
-               Logging.logResponse(outgoingRequestsLogger, HttpMethod.DELETE, url, cres);
-
-               int status = cres.getStatus();
-               restObject.setStatusCode(status);
-
-               t = (T) cres.readEntity(t.getClass());
-               restObject.set(t);
-
-       }
-
-       public <T> T getInstance(Class<T> clazz) throws IllegalAccessException, InstantiationException
-       {
-               return clazz.newInstance();
-       }
-
+    private static final  EELFLogger outgoingRequestsLogger = Logging.getRequestsLogger("scheduler");
+    private static EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(SchedulerRestInterface.class);
+    private static final String SUCCESSFUL_API_MESSAGE=" REST api GET was successful!";
+    private SyncRestClientInterface syncRestClient;
+    private Function<String, String> propertyGetter;
+    private Map<String, String> commonHeaders;
+
+    public SchedulerRestInterface() {
+        this.propertyGetter = SystemProperties::getProperty;
+    }
+
+    public SchedulerRestInterface(Function<String, String> propertyGetter) {
+        this.propertyGetter = propertyGetter;
+    }
+
+    public void initRestClient() {
+        logger.info("Starting to initialize rest client ");
+        String authStringEnc = calcEncodedAuthString();
+
+        commonHeaders = Maps.newHashMap();
+        commonHeaders.put("Authorization", "Basic " + authStringEnc);
+
+        syncRestClient = new SyncRestClient();
+
+        logger.info("\t<== Client Initialized \n");
+    }
+
+    public <T> RestObjectWithRequestInfo<T> Get(T t, String path, RestObject<T> restObject) {
+
+        String url = null;
+        String rawData = null;
+        Integer status = null;
+
+        try {
+            String methodName = "Get";
+            url = String.format("%s%s", propertyGetter.apply(SchedulerProperties.SCHEDULER_SERVER_URL_VAL), path);
+            initRestClient();
+            Logging.logRequest(outgoingRequestsLogger, HttpMethod.GET, url);
+            Map<String, String> requestHeaders = ImmutableMap.<String, String>builder()
+                    .putAll(commonHeaders)
+                    .put(REQUEST_ID_HEADER_KEY, Logging.extractOrGenerateRequestId())
+                    .build();
+            final HttpResponse<T> response = ((HttpResponse<T>) syncRestClient.get(url, requestHeaders,
+                    Collections.emptyMap(), t.getClass()));
+            Logging.logResponse(outgoingRequestsLogger, HttpMethod.GET, url, response);
+            status = response.getStatus();
+            restObject.setStatusCode(status);
+
+            if (status == 200) {
+                t = response.getBody();
+                restObject.set(t);
+                logger.debug(EELFLoggerDelegate.debugLogger, "<== " + methodName + SUCCESSFUL_API_MESSAGE);
+                logger.info(EELFLoggerDelegate.errorLogger, "<== " + methodName + SUCCESSFUL_API_MESSAGE);
+            } else {
+                throw new GenericUncheckedException(new HttpException(String.format("%s with status=%d, url=%s", methodName, status, url)));
+            }
+            return new RestObjectWithRequestInfo<>(HttpMethod.GET, url, restObject, status, rawData);
+        }
+        catch (RuntimeException e) {
+            throw new ExceptionWithRequestInfo(HttpMethod.GET, url, rawData, status, e);
+        }
+    }
+
+    public <T> void Delete(T t, String sourceID, String path, RestObject<T> restObject) {
+        initRestClient();
+        String url = String.format("%s%s", propertyGetter.apply(SchedulerProperties.SCHEDULER_SERVER_URL_VAL), path);
+        Logging.logRequest(outgoingRequestsLogger, HttpMethod.DELETE, url);
+        Map<String, String> requestHeaders = ImmutableMap.<String, String>builder()
+                .putAll(commonHeaders)
+                .put(REQUEST_ID_HEADER_KEY, Logging.extractOrGenerateRequestId()).build();
+        final HttpResponse<T> response = (HttpResponse<T>) syncRestClient.delete(url, requestHeaders, t.getClass());
+
+        Logging.logResponse(outgoingRequestsLogger, HttpMethod.DELETE, url, response);
+
+        int status = response.getStatus();
+        restObject.setStatusCode(status);
+
+        t = response.getBody();
+        restObject.set(t);
+    }
+
+    public <T> T getInstance(Class<T> clazz) throws IllegalAccessException, InstantiationException {
+        return clazz.newInstance();
+    }
+
+    private String calcEncodedAuthString() {
+        String retrievedUsername = propertyGetter.apply(SchedulerProperties.SCHEDULER_USER_NAME_VAL);
+        final String username = retrievedUsername.isEmpty() ? "" : retrievedUsername;
+
+        String retrievedPassword = propertyGetter.apply(SchedulerProperties.SCHEDULER_PASSWORD_VAL);
+        final String password = retrievedPassword.isEmpty() ? "" : getDeobfuscatedPassword(retrievedPassword);
+
+        return Base64.getEncoder().encodeToString((username + ":" + password).getBytes());
+    }
+
+    private static String getDeobfuscatedPassword(String password) {
+        return password.contains("OBF:") ? Password.deobfuscate(password) : password;
+    }
 }