Refactor for Sonar smells and code coverage
[aai/model-loader.git] / src / main / java / org / onap / aai / modelloader / service / ModelLoaderService.java
index 06d6e30..f8ab60f 100644 (file)
@@ -1,5 +1,5 @@
 /**
- * ============LICENSE_START=======================================================
+ * ============LICENSE_START=======================================================
  * org.onap.aai
  * ================================================================================
  * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
@@ -20,8 +20,9 @@
  */
 package org.onap.aai.modelloader.service;
 
-import java.io.FileInputStream;
 import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Paths;
 import java.util.ArrayList;
 import java.util.Base64;
 import java.util.Date;
@@ -30,21 +31,22 @@ import java.util.Properties;
 import java.util.Timer;
 import java.util.TimerTask;
 import javax.annotation.PostConstruct;
+import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 import org.onap.aai.cl.api.Logger;
 import org.onap.aai.cl.eelf.LoggerFactory;
 import org.onap.aai.modelloader.config.ModelLoaderConfig;
 import org.onap.aai.modelloader.entity.Artifact;
-import org.onap.aai.modelloader.notification.ArtifactDeploymentManager;
 import org.onap.aai.modelloader.notification.ArtifactDownloadManager;
 import org.onap.aai.modelloader.notification.EventCallback;
-import org.onap.aai.modelloader.restclient.BabelServiceClientFactory;
+import org.onap.aai.modelloader.notification.NotificationDataImpl;
+import org.onap.aai.modelloader.notification.NotificationPublisher;
 import org.onap.sdc.api.IDistributionClient;
 import org.onap.sdc.api.notification.IArtifactInfo;
-import org.onap.sdc.api.notification.INotificationData;
 import org.onap.sdc.api.results.IDistributionClientResult;
 import org.onap.sdc.impl.DistributionClientFactory;
 import org.onap.sdc.utils.DistributionActionResultEnum;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -58,15 +60,14 @@ import org.springframework.web.bind.annotation.RestController;
 @RequestMapping("/services/model-loader/v1/model-service")
 public class ModelLoaderService implements ModelLoaderInterface {
 
-    static Logger logger = LoggerFactory.getInstance().getLogger(ModelLoaderService.class.getName());
-
-    protected static final String FILESEP =
-            (System.getProperty("file.separator") == null) ? "/" : System.getProperty("file.separator");
+    private static Logger logger = LoggerFactory.getInstance().getLogger(ModelLoaderService.class.getName());
 
     @Value("${CONFIG_HOME}")
     private String configDir;
     private IDistributionClient client;
     private ModelLoaderConfig config;
+    @Autowired
+    private BabelServiceClientFactory babelClientFactory;
 
     /**
      * Responsible for loading configuration files and calling initialization.
@@ -78,7 +79,7 @@ public class ModelLoaderService implements ModelLoaderInterface {
         ModelLoaderConfig.setConfigHome(configDir);
         Properties configProperties = new Properties();
         try {
-            configProperties.load(new FileInputStream(configDir + FILESEP + "model-loader.properties"));
+            configProperties.load(Files.newInputStream(Paths.get(configDir, "model-loader.properties")));
             config = new ModelLoaderConfig(configProperties);
             if (!config.getASDCConnectionDisabled()) {
                 initSdcClient();
@@ -92,7 +93,7 @@ public class ModelLoaderService implements ModelLoaderInterface {
     /**
      * Responsible for stopping the connection to the distribution client before the resource is destroyed.
      */
-    protected void preShutdownOperations() {
+    public void preShutdownOperations() {
         logger.info(ModelLoaderMsgs.STOPPING_CLIENT);
         if (client != null) {
             client.stop();
@@ -110,19 +111,13 @@ public class ModelLoaderService implements ModelLoaderInterface {
 
         IDistributionClientResult initResult = client.init(config, callback);
 
-        if (initResult.getDistributionActionResult() != DistributionActionResultEnum.SUCCESS) {
-            String errorMsg = "Failed to initialize distribution client: " + initResult.getDistributionMessageResult();
-            logger.error(ModelLoaderMsgs.ASDC_CONNECTION_ERROR, errorMsg);
-
-            // Kick off a timer to retry the SDC connection
-            Timer timer = new Timer();
-            TimerTask task = new SdcConnectionJob(client, config, callback, timer);
-            timer.schedule(task, new Date(), 60000);
-        } else {
+        if (initResult.getDistributionActionResult() == DistributionActionResultEnum.SUCCESS) {
             // Start distribution client
             logger.debug(ModelLoaderMsgs.INITIALIZING, "Starting distribution client...");
             IDistributionClientResult startResult = client.start();
-            if (startResult.getDistributionActionResult() != DistributionActionResultEnum.SUCCESS) {
+            if (startResult.getDistributionActionResult() == DistributionActionResultEnum.SUCCESS) {
+                logger.info(ModelLoaderMsgs.INITIALIZING, "Connection to SDC established");
+            } else {
                 String errorMsg = "Failed to start distribution client: " + startResult.getDistributionMessageResult();
                 logger.error(ModelLoaderMsgs.ASDC_CONNECTION_ERROR, errorMsg);
 
@@ -130,10 +125,17 @@ public class ModelLoaderService implements ModelLoaderInterface {
                 Timer timer = new Timer();
                 TimerTask task = new SdcConnectionJob(client, config, callback, timer);
                 timer.schedule(task, new Date(), 60000);
-            } else {
-                logger.info(ModelLoaderMsgs.INITIALIZING, "Connection to SDC established");
             }
+        } else {
+            String errorMsg = "Failed to initialize distribution client: " + initResult.getDistributionMessageResult();
+            logger.error(ModelLoaderMsgs.ASDC_CONNECTION_ERROR, errorMsg);
+
+            // Kick off a timer to retry the SDC connection
+            Timer timer = new Timer();
+            TimerTask task = new SdcConnectionJob(client, config, callback, timer);
+            timer.schedule(task, new Date(), 60000);
         }
+
         Runtime.getRuntime().addShutdownHook(new Thread(this::preShutdownOperations));
     }
 
@@ -160,51 +162,57 @@ public class ModelLoaderService implements ModelLoaderInterface {
     @Override
     public Response ingestModel(@PathVariable String modelName, @PathVariable String modelVersion,
             @RequestBody String payload) throws IOException {
-        boolean success;
+        Response response;
 
         if (config.getIngestSimulatorEnabled()) {
-            try {
-                logger.info(ModelLoaderMsgs.DISTRIBUTION_EVENT, "Received test artifact");
+            response = processTestArtifact(modelName, modelVersion, payload);
+        } else {
+            logger.debug("Simulation interface disabled");
+            response = Response.serverError().build();
+        }
 
-                List<Artifact> catalogArtifacts = new ArrayList<>();
-                List<Artifact> modelArtifacts = new ArrayList<>();
+        return response;
+    }
 
-                IArtifactInfo artifactInfo = new ArtifactInfoImpl();
-                ((ArtifactInfoImpl) artifactInfo).setArtifactName(modelName);
-                ((ArtifactInfoImpl) artifactInfo).setArtifactVersion(modelVersion);
+    private Response processTestArtifact(String modelName, String modelVersion, String payload) {
+        IArtifactInfo artifactInfo = new ArtifactInfoImpl();
+        ((ArtifactInfoImpl) artifactInfo).setArtifactName(modelName);
+        ((ArtifactInfoImpl) artifactInfo).setArtifactVersion(modelVersion);
 
-                byte[] csarFile = Base64.getDecoder().decode(payload);
+        Response response;
+        try {
+            logger.info(ModelLoaderMsgs.DISTRIBUTION_EVENT, "Received test artifact " + modelName + " " + modelVersion);
 
-                logger.info(ModelLoaderMsgs.DISTRIBUTION_EVENT, "Generating xml models from test artifact");
+            byte[] csarFile = Base64.getDecoder().decode(payload);
 
-                new ArtifactDownloadManager(client, config, new BabelServiceClientFactory()).processToscaArtifacts(
-                        modelArtifacts, catalogArtifacts, csarFile, artifactInfo, "test-transaction-id", modelVersion);
+            logger.info(ModelLoaderMsgs.DISTRIBUTION_EVENT, "Generating XML models from test artifact");
 
-                List<IArtifactInfo> artifacts = new ArrayList<>();
-                artifacts.add(artifactInfo);
-                INotificationData notificationData = new NotificationDataImpl();
-                ((NotificationDataImpl) notificationData).setDistributionID("TestDistributionID");
+            List<Artifact> modelArtifacts = new ArrayList<>();
+            List<Artifact> catalogArtifacts = new ArrayList<>();
 
-                logger.info(ModelLoaderMsgs.DISTRIBUTION_EVENT, "Loading xml models from test artifact");
+            new ArtifactDownloadManager(client, config, babelClientFactory).processToscaArtifacts(modelArtifacts,
+                    catalogArtifacts, csarFile, artifactInfo, "test-transaction-id", modelVersion);
 
-                success = new ArtifactDeploymentManager(client, config).deploy(notificationData, artifacts,
-                        modelArtifacts, catalogArtifacts);
+            logger.info(ModelLoaderMsgs.DISTRIBUTION_EVENT, "Loading xml models from test artifacts: "
+                    + modelArtifacts.size() + " model(s) and " + catalogArtifacts.size() + " catalog(s)");
 
-            } catch (Exception e) {
-                return Response.serverError().entity(e).build();
+            NotificationDataImpl notificationData = new NotificationDataImpl();
+            notificationData.setDistributionID("TestDistributionID");
+            boolean success =
+                    new ArtifactDeploymentManager(config).deploy(notificationData, modelArtifacts, catalogArtifacts);
+            logger.info(ModelLoaderMsgs.DISTRIBUTION_EVENT, "Deployment success was " + success);
+            response = success ? Response.ok().build() : Response.serverError().build();
+        } catch (Exception e) {
+            String responseMessage = e.getMessage();
+            logger.info(ModelLoaderMsgs.DISTRIBUTION_EVENT, "Exception handled: " + responseMessage);
+            if (config.getASDCConnectionDisabled()) {
+                // Make sure the NotificationPublisher logger is invoked as per the standard processing flow.
+                new NotificationPublisher().publishDeployFailure(client, new NotificationDataImpl(), artifactInfo);
+            } else {
+                responseMessage += "\nSDC publishing is enabled but has been bypassed";
             }
-        } else {
-            logger.debug("Simulation interface disabled");
-            success = false;
-        }
-
-        Response response;
-        if (success) {
-            response = Response.ok().build();
-        } else {
-            response = Response.serverError().build();
+            response = Response.serverError().entity(responseMessage).type(MediaType.APPLICATION_XML).build();
         }
-
         return response;
     }
 }