X-Git-Url: https://gerrit.onap.org/r/gitweb?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Forg%2Fonap%2Faai%2Fmodelloader%2Fentity%2Fmodel%2FModelArtifact.java;h=364fc78fb3520e131570ed308fd68b17c033559c;hb=HEAD;hp=175f858d8a98c1141ae22afbd550225faca5c255;hpb=270656abb1ed24930b2f9e57f5bef659494f5e8e;p=aai%2Fmodel-loader.git diff --git a/src/main/java/org/onap/aai/modelloader/entity/model/ModelArtifact.java b/src/main/java/org/onap/aai/modelloader/entity/model/ModelArtifact.java index 175f858..09c12b5 100644 --- a/src/main/java/org/onap/aai/modelloader/entity/model/ModelArtifact.java +++ b/src/main/java/org/onap/aai/modelloader/entity/model/ModelArtifact.java @@ -20,29 +20,26 @@ */ 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.modelloader.config.ModelLoaderConfig; + +import org.onap.aai.cl.api.Logger; +import org.onap.aai.cl.eelf.LoggerFactory; +import org.onap.aai.modelloader.config.AaiProperties; +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 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 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,79 +128,109 @@ 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 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 completedArtifacts) { - if (config.useGizmo()) { - return pushToGizmo(aaiClient, config, distId, completedArtifacts); + public boolean push(AaiRestClient aaiClient, AaiProperties aaiProperties, String distId, + List completedArtifacts) { + if (aaiProperties.isUseGizmo()) { + return pushToGizmo(aaiClient, aaiProperties, distId); } - return pushToResources(aaiClient, config, distId, completedArtifacts); + return pushToResources(aaiClient, aaiProperties, distId, completedArtifacts); } - - private boolean pushToResources(AaiRestClient aaiClient, ModelLoaderConfig config, String distId, + + private boolean pushToResources(AaiRestClient aaiClient, AaiProperties aaiProperties, String distId, List completedArtifacts) { - boolean success; + boolean success = false; // See whether the model is already present - String resourceUrl = getModelUrl(config); + String resourceUrl = getModelUrl(aaiProperties); + // ResponseEntity 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, aaiProperties, 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; + return success; + } - logInfoMsg(getType().toString() + " " + getUniqueIdentifier() + " successfully ingested."); + private boolean checkIfModelExists(AaiRestClient aaiClient, String distId, String resourceUrl) throws HttpClientErrorException { + try { + ResponseEntity 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 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, AaiProperties aaiProperties, String distId, + List completedArtifacts) { + boolean success; + logInfoMsg(getType() + " " + getModelInvariantId() + " already exists. Skipping ingestion."); + success = pushModelVersion(aaiClient, aaiProperties, distId, completedArtifacts); + return success; + } /** * @param aaiClient - * @param config + * @param aaiProperties * @param distId * @param completedArtifacts * @return */ - private boolean pushModelVersion(AaiRestClient aaiClient, ModelLoaderConfig config, String distId, + private boolean pushModelVersion(AaiRestClient aaiClient, AaiProperties aaiProperties, String distId, List completedArtifacts) { - if (xmlResourceCanBeFetched(aaiClient, distId, getModelVerUrl(config))) { - logInfoMsg(getType().toString() + " " + getUniqueIdentifier() + " already exists. Skipping ingestion."); + if (xmlResourceCanBeFetched(aaiClient, distId, getModelVerUrl(aaiProperties))) { + 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(aaiProperties), getModelVer()); + if (success) { + completedArtifacts.add(this); + logInfoMsg(getType() + " " + getUniqueIdentifier() + " successfully ingested."); + } else { + logModelUpdateFailure("Error pushing model"); } return success; @@ -191,27 +238,27 @@ 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 + public void rollbackModel(AaiRestClient aaiClient, AaiProperties aaiProperties, String distId) { + // Gizmo is resilient and doesn't require a rollback. A redistribution will work fine even if // the model is partially loaded. - if (config.useGizmo()) { + if (aaiProperties.isUseGizmo()) { return; } - - String url = getModelVerUrl(config); + + String url = getModelVerUrl(aaiProperties); if (firstVersionOfModel) { // If this was the first version of the model which was added, we want to remove the entire // model rather than just the version. - url = getModelUrl(config); + url = getModelUrl(aaiProperties); } // Best effort to delete. Nothing we can do in the event this fails. aaiClient.getAndDeleteResource(url, distId); } - private String getModelUrl(ModelLoaderConfig config) { - String baseURL = config.getAaiBaseUrl().trim(); - String subURL = config.getAaiModelUrl(getModelNamespaceVersion()).trim(); + private String getModelUrl(AaiProperties aaiProperties) { + String baseURL = aaiProperties.getBaseUrl().trim(); + String subURL = String.format(aaiProperties.getModelUrl(), getModelNamespaceVersion()).trim(); String instance = getModelInvariantId(); if (!baseURL.endsWith("/") && !subURL.startsWith("/")) { @@ -229,9 +276,9 @@ public class ModelArtifact extends AbstractModelArtifact { return baseURL + subURL + instance; } - private String getModelVerUrl(ModelLoaderConfig config) { - String baseURL = config.getAaiBaseUrl().trim(); - String subURL = config.getAaiModelUrl(getModelNamespaceVersion()).trim() + getModelInvariantId() + private String getModelVerUrl(AaiProperties aaiProperties) { + String baseURL = aaiProperties.getBaseUrl().trim(); + String subURL = String.format(aaiProperties.getModelUrl(), getModelNamespaceVersion()).trim() + getModelInvariantId() + AAI_MODEL_VER_SUB_URL; String instance = getModelVerId(); @@ -249,14 +296,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(); - } }