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=73709f683b795cc7d8102918a4365125acc34bac;hb=35e3de3f0d5b2b02fc6ef92ec577fe6b7cd05e3c;hp=896167a015e294c5962b5914bdc47d26756ee68a;hpb=7b1f813441f94261f43ec4f5bb0944ad2570fbdf;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 896167a..73709f6 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 @@ -1,22 +1,22 @@ /** - * ============LICENSE_START========================================== + * ============LICENSE_START======================================================= * org.onap.aai - * =================================================================== + * ================================================================================ * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved. - * Copyright © 2017-2018 Amdocs - * =================================================================== + * Copyright © 2017-2018 European Software Marketing Ltd. + * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - * ============LICENSE_END============================================ + * ============LICENSE_END========================================================= */ package org.onap.aai.modelloader.entity.model; @@ -31,18 +31,14 @@ 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.modelloader.entity.Artifact; import org.onap.aai.modelloader.entity.ArtifactType; import org.onap.aai.modelloader.restclient.AaiRestClient; -import org.onap.aai.modelloader.service.ModelLoaderMsgs; -import org.onap.aai.cl.api.Logger; -import org.onap.aai.cl.eelf.LoggerFactory; -import org.onap.aai.modelloader.entity.Artifact; import org.onap.aai.restclient.client.OperationResult; - import org.w3c.dom.Node; + public class ModelArtifact extends AbstractModelArtifact { private static final String AAI_MODEL_VER_SUB_URL = "/model-vers/model-ver"; @@ -50,7 +46,6 @@ public class ModelArtifact extends AbstractModelArtifact { private static final String FAILURE_MSG_PREFIX = "Ingestion failed for "; private static final String ROLLBACK_MSG_SUFFIX = ". Rolling back distribution."; - private static Logger logger = LoggerFactory.getInstance().getLogger(ModelArtifact.class.getName()); private String modelVerId; private String modelInvariantId; @@ -93,20 +88,32 @@ 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); + OperationResult getResponse = getResourceModel(aaiClient, distId, xmlResourceUrl); return getResponse != null && getResponse.getResultCode() == Response.Status.OK.getStatusCode(); } + /** + * Test whether the specified resource (URL) can be requested successfully + * + * @param aaiClient + * @param distId + * @param xmlResourceUrl + * @return OperationResult the result of the operation + */ + private OperationResult getResourceModel(AaiRestClient aaiClient, String distId, String xmlResourceUrl) { + return aaiClient.getResource(xmlResourceUrl, distId, MediaType.APPLICATION_XML_TYPE); + } + /** * PUT the specified XML resource - * + * * @param aaiClient * @param distId * @param resourceUrl @@ -122,30 +129,64 @@ public class ModelArtifact extends AbstractModelArtifact { @Override public boolean push(AaiRestClient aaiClient, ModelLoaderConfig config, String distId, List completedArtifacts) { - boolean success; + if (config.useGizmo()) { + return pushToGizmo(aaiClient, config, distId); + } + + return pushToResources(aaiClient, config, distId, completedArtifacts); + } + + private boolean pushToResources(AaiRestClient aaiClient, ModelLoaderConfig config, String distId, + List completedArtifacts) { + boolean success = false; // See whether the model is already present String resourceUrl = getModelUrl(config); + OperationResult result = getResourceModel(aaiClient, distId, resourceUrl); - if (xmlResourceCanBeFetched(aaiClient, distId, resourceUrl)) { - logInfoMsg(getType().toString() + " " + getModelInvariantId() + " already exists. Skipping ingestion."); - success = pushModelVersion(aaiClient, config, distId, completedArtifacts); + if (result != null) { + if (result.getResultCode() == Response.Status.OK.getStatusCode()) { + success = updateExistingModel(aaiClient, config, distId, completedArtifacts); + } else if (result.getResultCode() == Response.Status.NOT_FOUND.getStatusCode()) { + success = createNewModel(aaiClient, distId, completedArtifacts, resourceUrl); + } else { + logModelUpdateFailure( + "Response code " + result.getResultCode() + " invalid for getting resource model"); + } } else { - // Assume that the model does not exist and attempt the PUT - success = putXmlResource(aaiClient, distId, resourceUrl, getPayload()); - if (success) { - completedArtifacts.add(this); + logModelUpdateFailure("Null response from RestClient"); + } - // 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."); - } else { - logErrorMsg( - FAILURE_MSG_PREFIX + getType().toString() + " " + getUniqueIdentifier() + ROLLBACK_MSG_SUFFIX); - } + 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, ModelLoaderConfig config, String distId, + List completedArtifacts) { + boolean success; + logInfoMsg(getType() + " " + getModelInvariantId() + " already exists. Skipping ingestion."); + success = pushModelVersion(aaiClient, config, distId, completedArtifacts); return success; } @@ -159,7 +200,7 @@ public class ModelArtifact extends AbstractModelArtifact { private boolean pushModelVersion(AaiRestClient aaiClient, ModelLoaderConfig config, String distId, List completedArtifacts) { if (xmlResourceCanBeFetched(aaiClient, distId, getModelVerUrl(config))) { - logInfoMsg(getType().toString() + " " + getUniqueIdentifier() + " already exists. Skipping ingestion."); + logInfoMsg(getType() + " " + getUniqueIdentifier() + " already exists. Skipping ingestion."); return true; } @@ -169,14 +210,12 @@ public class ModelArtifact extends AbstractModelArtifact { success = putXmlResource(aaiClient, distId, getModelVerUrl(config), nodeToString(getModelVer())); if (success) { completedArtifacts.add(this); - logInfoMsg(getType().toString() + " " + getUniqueIdentifier() + " successfully ingested."); + logInfoMsg(getType() + " " + getUniqueIdentifier() + " successfully ingested."); } else { - logErrorMsg( - FAILURE_MSG_PREFIX + getType().toString() + " " + getUniqueIdentifier() + ROLLBACK_MSG_SUFFIX); + logModelUpdateFailure("Error pushing model"); } } catch (TransformerException e) { - logErrorMsg(FAILURE_MSG_PREFIX + getType().toString() + " " + getUniqueIdentifier() + ": " + e.getMessage() - + ROLLBACK_MSG_SUFFIX); + logModelUpdateFailure(e.getMessage()); success = false; } @@ -186,6 +225,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 + // 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 @@ -197,21 +242,12 @@ public class ModelArtifact extends AbstractModelArtifact { aaiClient.getAndDeleteResource(url, distId); } - - private void logInfoMsg(String infoMsg) { - logger.info(ModelLoaderMsgs.DISTRIBUTION_EVENT, infoMsg); - } - - private void logErrorMsg(String errorMsg) { - logger.error(ModelLoaderMsgs.DISTRIBUTION_EVENT_ERROR, errorMsg); - } - private String getModelUrl(ModelLoaderConfig config) { String baseURL = config.getAaiBaseUrl().trim(); String subURL = config.getAaiModelUrl(getModelNamespaceVersion()).trim(); String instance = getModelInvariantId(); - if ((!baseURL.endsWith("/")) && (!subURL.startsWith("/"))) { + if (!baseURL.endsWith("/") && !subURL.startsWith("/")) { baseURL = baseURL + "/"; } @@ -232,7 +268,7 @@ public class ModelArtifact extends AbstractModelArtifact { + AAI_MODEL_VER_SUB_URL; String instance = getModelVerId(); - if ((!baseURL.endsWith("/")) && (!subURL.startsWith("/"))) { + if (!baseURL.endsWith("/") && !subURL.startsWith("/")) { baseURL = baseURL + "/"; } @@ -251,6 +287,7 @@ public class ModelArtifact extends AbstractModelArtifact { StringWriter sw = new StringWriter(); TransformerFactory transFact = TransformerFactory.newInstance(); transFact.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, ""); + transFact.setAttribute(XMLConstants.ACCESS_EXTERNAL_STYLESHEET, ""); Transformer t = transFact.newTransformer(); t.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); t.transform(new DOMSource(node), new StreamResult(sw));