Merge from ECOMP's repository
[vid.git] / vid-app-common / src / main / java / org / onap / vid / scheduler / SchedulerRestInterface.java
index d66ed49..c986f22 100644 (file)
@@ -1,23 +1,26 @@
 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;
@@ -25,126 +28,102 @@ import static org.onap.vid.utils.Logging.REQUEST_ID_HEADER_KEY;
 @Service
 public class SchedulerRestInterface implements SchedulerRestInterfaceIfc {
 
-    private Client client = null;
-    private Function<String, String> propertyGetter;
-
-    @Autowired
-    HttpsAuthClient httpsAuthClient;
-
-    private MultivaluedHashMap<String, Object> commonHeaders;
-
-    /** The logger. */
+    private static final  EELFLogger outgoingRequestsLogger = Logging.getRequestsLogger("scheduler");
     private static EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(SchedulerRestInterface.class);
-    final private static EELFLogger outgoingRequestsLogger = Logging.getRequestsLogger("scheduler");
+    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(){
+    public SchedulerRestInterface() {
         this.propertyGetter = SystemProperties::getProperty;
     }
 
-    public SchedulerRestInterface(Function<String, String> propertyGetter){
+    public SchedulerRestInterface(Function<String, String> propertyGetter) {
         this.propertyGetter = propertyGetter;
     }
 
     public void initRestClient() {
         logger.info("Starting to initialize rest client ");
+        String authStringEnc = calcEncodedAuthString();
 
-        final String username;
-        final String password;
-
-               /*Setting user name based on properties*/
-        String retrievedUsername = propertyGetter.apply(SchedulerProperties.SCHEDULER_USER_NAME_VAL);
-        if(retrievedUsername.isEmpty()) {
-            username = "";
-        } else {
-            username = retrievedUsername;
-        }
+        commonHeaders = Maps.newHashMap();
+        commonHeaders.put("Authorization", "Basic " + authStringEnc);
 
-               /*Setting password based on properties*/
-        String retrievedPassword = propertyGetter.apply(SchedulerProperties.SCHEDULER_PASSWORD_VAL);
-        if(retrievedPassword.isEmpty()) {
-            password = "";
-        } else {
-            if (retrievedPassword.contains("OBF:")) {
-                password = Password.deobfuscate(retrievedPassword);
-            } else {
-                password = retrievedPassword;
-            }
-        }
+        syncRestClient = new SyncRestClient();
 
-        String authString = username + ":" + password;
+        logger.info("\t<== Client Initialized \n");
+    }
 
-        byte[] authEncBytes = Base64.encodeBase64(authString.getBytes());
-        String authStringEnc = new String(authEncBytes);
+    public <T> RestObjectWithRequestInfo<T> Get(T t, String path, RestObject<T> restObject) {
 
-        commonHeaders = new MultivaluedHashMap<> ();
-        commonHeaders.put("Authorization", Collections.singletonList("Basic " + authStringEnc));
+        String url = null;
+        String rawData = null;
+        Integer status = null;
 
         try {
-            if ( !username.isEmpty() ) {
-                client = httpsAuthClient.getClient(HttpClientMode.WITHOUT_KEYSTORE);
-            }
-            else {
-
-                client = HttpBasicClient.getClient();
+            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)));
             }
-        } catch (Exception e) {
-            logger.error(" <== Unable to initialize rest client ", e);
+            return new RestObjectWithRequestInfo<>(HttpMethod.GET, url, restObject, status, rawData);
         }
-
-        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 = String.format("%s%s",propertyGetter.apply(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(String.format("%s with status=%d, url=%s", methodName, status,url));
+        catch (RuntimeException e) {
+            throw new ExceptionWithRequestInfo(HttpMethod.GET, url, rawData, status, e);
         }
-
     }
 
-    public <T> void Delete(T t, String sourceID, String path, org.onap.vid.scheduler.RestObject<T> restObject) {
-
+    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);
+        String url = String.format("%s%s", propertyGetter.apply(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();
+        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 = (T) cres.readEntity(t.getClass());
+        t = response.getBody();
         restObject.set(t);
-
     }
 
-    public <T> T getInstance(Class<T> clazz) throws IllegalAccessException, InstantiationException
-    {
+    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;
+    }
 }