Stop sdc-distribution-client upon service shutdown
[aai/model-loader.git] / src / main / java / org / onap / aai / modelloader / entity / model / ModelArtifact.java
index 175f858..364fc78 100644 (file)
  */
 package org.onap.aai.modelloader.entity.model;
 
-import java.io.StringWriter;
 import java.util.List;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import javax.xml.XMLConstants;
-import javax.xml.transform.OutputKeys;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerException;
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.dom.DOMSource;
-import javax.xml.transform.stream.StreamResult;
 
+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.entity.ArtifactType;
 import org.onap.aai.modelloader.restclient.AaiRestClient;
-import org.onap.aai.modelloader.entity.Artifact;
-import org.onap.aai.restclient.client.OperationResult;
-
-import org.w3c.dom.Node;
+import org.onap.aai.modelloader.service.ModelLoaderMsgs;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.client.HttpClientErrorException;
+import org.springframework.web.client.HttpServerErrorException;
 
 
 public class ModelArtifact extends AbstractModelArtifact {
 
+    private static Logger logger = LoggerFactory.getInstance().getLogger(ModelArtifact.class);
+
     private static final String AAI_MODEL_VER_SUB_URL = "/model-vers/model-ver";
 
     private static final String FAILURE_MSG_PREFIX = "Ingestion failed for ";
@@ -51,7 +48,7 @@ public class ModelArtifact extends AbstractModelArtifact {
 
     private String modelVerId;
     private String modelInvariantId;
-    private Node modelVer;
+    private String modelVer;
     private boolean firstVersionOfModel = false;
 
     public ModelArtifact() {
@@ -74,11 +71,11 @@ public class ModelArtifact extends AbstractModelArtifact {
         this.modelInvariantId = modelInvariantId;
     }
 
-    public Node getModelVer() {
+    public String getModelVer() {
         return modelVer;
     }
 
-    public void setModelVer(Node modelVer) {
+    public void setModelVer(String modelVer) {
         this.modelVer = modelVer;
     }
 
@@ -90,20 +87,40 @@ public class ModelArtifact extends AbstractModelArtifact {
 
     /**
      * Test whether the specified resource (URL) can be requested successfully
-     * 
+     *
      * @param aaiClient
      * @param distId
      * @param xmlResourceUrl
      * @return true if a request to GET this resource as XML media is successful (status OK)
      */
     private boolean xmlResourceCanBeFetched(AaiRestClient aaiClient, String distId, String xmlResourceUrl) {
-        OperationResult getResponse = aaiClient.getResource(xmlResourceUrl, distId, MediaType.APPLICATION_XML_TYPE);
-        return getResponse != null && getResponse.getResultCode() == Response.Status.OK.getStatusCode();
+        try {
+            ResponseEntity<Model> getResponse = getResourceModel(aaiClient, distId, xmlResourceUrl);
+            return getResponse.getStatusCode().equals(HttpStatus.OK);
+        } catch (HttpClientErrorException e) {
+            if(e.getStatusCode().equals(HttpStatus.NOT_FOUND)) {
+                return false;
+            } else {
+                throw e;
+            }
+        }
+    }
+
+    /**
+     * Test whether the specified resource (URL) can be requested successfully
+     *
+     * @param aaiClient
+     * @param distId
+     * @param xmlResourceUrl
+     * @return OperationResult the result of the operation
+     */
+    private ResponseEntity<Model> getResourceModel(AaiRestClient aaiClient, String distId, String xmlResourceUrl) {
+        return aaiClient.getResource(xmlResourceUrl, distId, MediaType.APPLICATION_XML, Model.class);
     }
 
     /**
      * PUT the specified XML resource
-     * 
+     *
      * @param aaiClient
      * @param distId
      * @param resourceUrl
@@ -111,49 +128,99 @@ public class ModelArtifact extends AbstractModelArtifact {
      * @return true if the resource PUT as XML media was successful (status OK)
      */
     private boolean putXmlResource(AaiRestClient aaiClient, String distId, String resourceUrl, String payload) {
-        OperationResult putResponse =
-                aaiClient.putResource(resourceUrl, payload, distId, MediaType.APPLICATION_XML_TYPE);
-        return putResponse != null && putResponse.getResultCode() == Response.Status.CREATED.getStatusCode();
+        ResponseEntity<String> putResponse = null;
+        try {
+            putResponse =
+                    aaiClient.putResource(resourceUrl, payload, distId, MediaType.APPLICATION_XML, String.class);
+        } catch (HttpClientErrorException | HttpServerErrorException e) {
+            logger.error(ModelLoaderMsgs.AAI_REST_REQUEST_ERROR, "Error putting resource: " + e.toString());
+        }
+        return putResponse != null && putResponse.getStatusCode() == HttpStatus.CREATED;
     }
 
     @Override
     public boolean push(AaiRestClient aaiClient, ModelLoaderConfig config, String distId,
-            List<Artifact> completedArtifacts) {        
+            List<Artifact> completedArtifacts) {
         if (config.useGizmo()) {
-            return pushToGizmo(aaiClient, config, distId, completedArtifacts);
+            return pushToGizmo(aaiClient, config, distId);
         }
 
         return pushToResources(aaiClient, config, distId, completedArtifacts);
     }
-    
+
     private boolean pushToResources(AaiRestClient aaiClient, ModelLoaderConfig config, String distId,
             List<Artifact> completedArtifacts) {
-        boolean success;
+        boolean success = false;
 
         // See whether the model is already present
         String resourceUrl = getModelUrl(config);
+        // ResponseEntity<Model> result;
+        boolean modelExists = checkIfModelExists(aaiClient, distId, resourceUrl);
 
-        if (xmlResourceCanBeFetched(aaiClient, distId, resourceUrl)) {
-            logInfoMsg(getType().toString() + " " + getModelInvariantId() + " already exists.  Skipping ingestion.");
-            success = pushModelVersion(aaiClient, config, distId, completedArtifacts);
+        if(modelExists) {
+            success = updateExistingModel(aaiClient, config, distId, completedArtifacts);
         } else {
-            // Assume that the model does not exist and attempt the PUT
-            success = putXmlResource(aaiClient, distId, resourceUrl, getPayload());
-            if (success) {
-                completedArtifacts.add(this);
+            success = createNewModel(aaiClient, distId, completedArtifacts, resourceUrl);
+        }
 
-                // Record state to remember that this is the first version of the model (just added).
-                firstVersionOfModel = true;
+        // if (result != null) {
+        //     if (result.getStatusCode() == HttpStatus.OK) {
+        //         success = updateExistingModel(aaiClient, config, distId, completedArtifacts);
+        //     } else if (result.getStatusCode() == HttpStatus.NOT_FOUND) {
+        //         success = createNewModel(aaiClient, distId, completedArtifacts, resourceUrl);
+        //     } else {
+        //         logModelUpdateFailure(
+        //                 "Response code " + result.getStatusCodeValue() + " invalid for getting resource model");
+        //     }
+        // } else {
+        //     logModelUpdateFailure("Null response from RestClient");
+        // }
 
-                logInfoMsg(getType().toString() + " " + getUniqueIdentifier() + " successfully ingested.");
+        return success;
+    }
+
+    private boolean checkIfModelExists(AaiRestClient aaiClient, String distId, String resourceUrl) throws HttpClientErrorException {
+        try {
+            ResponseEntity<Model> response = getResourceModel(aaiClient, distId, resourceUrl);
+            return response.getStatusCode().equals(HttpStatus.OK);
+        } catch (HttpClientErrorException e) {
+            if(e.getStatusCode().equals(HttpStatus.NOT_FOUND)) {
+                return false;
             } else {
-                logErrorMsg(
-                        FAILURE_MSG_PREFIX + getType().toString() + " " + getUniqueIdentifier() + ROLLBACK_MSG_SUFFIX);
+                throw e;
             }
         }
+    }
+
+    private boolean createNewModel(AaiRestClient aaiClient, String distId, List<Artifact> completedArtifacts,
+            String resourceUrl) {
+        boolean success;
+        // Assume that the model does not exist and attempt the PUT
+        success = putXmlResource(aaiClient, distId, resourceUrl, getPayload());
+        if (success) {
+            completedArtifacts.add(this);
+
+            // Record state to remember that this is the first version of the model (just added).
+            firstVersionOfModel = true;
 
+            logInfoMsg(getType() + " " + getUniqueIdentifier() + " successfully ingested.");
+        } else {
+            logModelUpdateFailure("Error creating model. Skipping ingestion.");
+        }
         return success;
-    }    
+    }
+
+    private void logModelUpdateFailure(String message) {
+        logErrorMsg(FAILURE_MSG_PREFIX + getType() + " " + getUniqueIdentifier() + " " + message + ROLLBACK_MSG_SUFFIX);
+    }
+
+    private boolean updateExistingModel(AaiRestClient aaiClient, ModelLoaderConfig config, String distId,
+            List<Artifact> completedArtifacts) {
+        boolean success;
+        logInfoMsg(getType() + " " + getModelInvariantId() + " already exists.  Skipping ingestion.");
+        success = pushModelVersion(aaiClient, config, distId, completedArtifacts);
+        return success;
+    }
 
     /**
      * @param aaiClient
@@ -165,25 +232,18 @@ public class ModelArtifact extends AbstractModelArtifact {
     private boolean pushModelVersion(AaiRestClient aaiClient, ModelLoaderConfig config, String distId,
             List<Artifact> completedArtifacts) {
         if (xmlResourceCanBeFetched(aaiClient, distId, getModelVerUrl(config))) {
-            logInfoMsg(getType().toString() + " " + getUniqueIdentifier() + " already exists.  Skipping ingestion.");
+            logInfoMsg(getType() + " " + getUniqueIdentifier() + " already exists.  Skipping ingestion.");
             return true;
         }
 
         // Load the model version
         boolean success = true;
-        try {
-            success = putXmlResource(aaiClient, distId, getModelVerUrl(config), nodeToString(getModelVer()));
-            if (success) {
-                completedArtifacts.add(this);
-                logInfoMsg(getType().toString() + " " + getUniqueIdentifier() + " successfully ingested.");
-            } else {
-                logErrorMsg(
-                        FAILURE_MSG_PREFIX + getType().toString() + " " + getUniqueIdentifier() + ROLLBACK_MSG_SUFFIX);
-            }
-        } catch (TransformerException e) {
-            logErrorMsg(FAILURE_MSG_PREFIX + getType().toString() + " " + getUniqueIdentifier() + ": " + e.getMessage()
-                    + ROLLBACK_MSG_SUFFIX);
-            success = false;
+        success = putXmlResource(aaiClient, distId, getModelVerUrl(config), getModelVer());
+        if (success) {
+            completedArtifacts.add(this);
+            logInfoMsg(getType() + " " + getUniqueIdentifier() + " successfully ingested.");
+        } else {
+            logModelUpdateFailure("Error pushing model");
         }
 
         return success;
@@ -192,12 +252,12 @@ public class ModelArtifact extends AbstractModelArtifact {
 
     @Override
     public void rollbackModel(AaiRestClient aaiClient, ModelLoaderConfig config, String distId) {
-        // Gizmo is resilient and doesn't require a rollback.  A redistribution will work fine even if 
+        // Gizmo is resilient and doesn't require a rollback. A redistribution will work fine even if
         // the model is partially loaded.
         if (config.useGizmo()) {
             return;
         }
-        
+
         String url = getModelVerUrl(config);
         if (firstVersionOfModel) {
             // If this was the first version of the model which was added, we want to remove the entire
@@ -249,14 +309,4 @@ public class ModelArtifact extends AbstractModelArtifact {
 
         return baseURL + subURL + instance;
     }
-
-    private String nodeToString(Node node) throws TransformerException {
-        StringWriter sw = new StringWriter();
-        TransformerFactory transFact = TransformerFactory.newInstance();
-        transFact.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, "");
-        Transformer t = transFact.newTransformer();
-        t.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
-        t.transform(new DOMSource(node), new StreamResult(sw));
-        return sw.toString();
-    }
 }