Allow handling of legact model artifacts
[aai/model-loader.git] / src / main / java / org / openecomp / modelloader / entity / model / ModelArtifactParser.java
index de27924..d81539c 100644 (file)
-/**\r
- * ============LICENSE_START=======================================================\r
- * Model Loader\r
- * ================================================================================\r
- * Copyright © 2017 AT&T Intellectual Property.\r
- * Copyright © 2017 Amdocs\r
- * All rights reserved.\r
- * ================================================================================\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- * http://www.apache.org/licenses/LICENSE-2.0\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- * ============LICENSE_END=========================================================\r
- *\r
- * ECOMP and OpenECOMP are trademarks\r
- * and service marks of AT&T Intellectual Property.\r
- */\r
-package org.openecomp.modelloader.entity.model;\r
-\r
-import org.openecomp.cl.api.Logger;\r
-import org.openecomp.cl.eelf.LoggerFactory;\r
-import org.openecomp.modelloader.entity.Artifact;\r
-import org.openecomp.modelloader.entity.ArtifactType;\r
-import org.openecomp.modelloader.service.ModelLoaderMsgs;\r
-import org.openecomp.modelloader.util.JsonXmlConverter;\r
-\r
-import org.w3c.dom.Document;\r
-import org.w3c.dom.Element;\r
-import org.w3c.dom.Node;\r
-import org.w3c.dom.NodeList;\r
-import org.xml.sax.InputSource;\r
-\r
-import java.io.StringReader;\r
-import java.io.StringWriter;\r
-import java.util.ArrayList;\r
-import java.util.List;\r
-\r
-import javax.xml.XMLConstants;\r
-import javax.xml.parsers.DocumentBuilder;\r
-import javax.xml.parsers.DocumentBuilderFactory;\r
-import javax.xml.transform.OutputKeys;\r
-import javax.xml.transform.Transformer;\r
-import javax.xml.transform.TransformerException;\r
-import javax.xml.transform.TransformerFactory;\r
-import javax.xml.transform.dom.DOMSource;\r
-import javax.xml.transform.stream.StreamResult;\r
-\r
-\r
-public class ModelArtifactParser {\r
-\r
-       private static String MODELS_ELEMENT = "models";\r
-       private static String MODEL_ELEMENT = "model";\r
-       private static String NAMED_QUERIES_ELEMENT = "named-queries";\r
-       private static String NAMED_QUERY_ELEMENT = "named-query";\r
-       private static String MODEL_NAME_VERSION_ID = "model-name-version-id";\r
-       private static String MODEL_VER = "model-ver";\r
-       private static String MODEL_VERSION_ID = "model-version-id";\r
-       private static String MODEL_INVARIANT_ID = "model-invariant-id";\r
-       private static String NAMED_QUERY_VERSION_ID = "named-query-uuid";\r
-       private static String RELATIONSHIP_DATA = "relationship-data";\r
-       private static String RELATIONSHIP_KEY = "relationship-key";\r
-       private static String RELATIONSHIP_VALUE = "relationship-value";\r
-       private static String MODEL_ELEMENT_RELATIONSHIP_KEY = "model.model-invariant-id";\r
-       private static String MODEL_VER_ELEMENT_RELATIONSHIP_KEY = "model-ver.model-version-id";\r
-       \r
-       private  static Logger logger = LoggerFactory.getInstance().getLogger(ModelArtifactParser.class.getName());\r
-       \r
-       public List<Artifact> parse(byte[] artifactPayload, String artifactName) {\r
-         String payload = new String(artifactPayload);\r
-         List<Artifact> modelList = new ArrayList<Artifact>();\r
-\r
-         try {\r
-           // Artifact could be JSON or XML\r
-           if (JsonXmlConverter.isValidJson(payload)) {\r
-             payload = JsonXmlConverter.convertJsonToXml(payload);\r
-           }\r
-\r
-           DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();\r
-           DocumentBuilder builder = factory.newDocumentBuilder();\r
-           InputSource is = new InputSource(new StringReader(payload));\r
-           Document doc = builder.parse(is);\r
-\r
-           if ( (doc.getDocumentElement().getNodeName().equalsIgnoreCase(MODEL_ELEMENT)) || \r
-               (doc.getDocumentElement().getNodeName().equalsIgnoreCase(NAMED_QUERY_ELEMENT)) ) {\r
-\r
-             ModelArtifact model = parseModel(doc.getDocumentElement(), payload);\r
-\r
-             if (model != null) {\r
-               if ( ArtifactType.MODEL.equals(model.getType())) {\r
-                 logger.info( ModelLoaderMsgs.DISTRIBUTION_EVENT, "Model parsed =====>>>> "\r
-                     + "Model-invariant-Id: "+ model.getModelInvariantId()\r
-                     + " Model-Version-Id: "+ model.getModelVerId());\r
-               }\r
-               modelList.add(model);\r
-             }\r
-             else {\r
-               logger.error(ModelLoaderMsgs.ARTIFACT_PARSE_ERROR, "Unable to parse artifact " + artifactName);\r
-               return null;\r
-             }\r
-           }\r
-           else if ( (doc.getDocumentElement().getNodeName().equalsIgnoreCase(MODELS_ELEMENT)) ||\r
-               (doc.getDocumentElement().getNodeName().equalsIgnoreCase(NAMED_QUERIES_ELEMENT)) ) {\r
-             // The complete set of models/named-queries were contained in this artifact\r
-             NodeList nodeList = doc.getDocumentElement().getChildNodes();\r
-             for (int i = 0; i < nodeList.getLength(); i++) {\r
-               Node childNode = nodeList.item(i);\r
-               if ( (childNode.getNodeName().equalsIgnoreCase(MODEL_ELEMENT)) || \r
-                   (childNode.getNodeName().equalsIgnoreCase(NAMED_QUERY_ELEMENT)) ) {\r
-                 String modelPayload = nodeToString(childNode);\r
-                 ModelArtifact model = parseModel(childNode, modelPayload);\r
-                 if (model != null) {\r
-                   modelList.add(model);\r
-                 }\r
-                 else {\r
-                   logger.error(ModelLoaderMsgs.ARTIFACT_PARSE_ERROR, "Unable to parse artifact " + artifactName);\r
-                   modelList.clear();\r
-                   break;\r
-                 }\r
-               }\r
-             }\r
-           }\r
-         }\r
-         catch (Exception ex) {\r
-           logger.error(ModelLoaderMsgs.ARTIFACT_PARSE_ERROR, "Unable to parse artifact " + artifactName + ": " + ex.getLocalizedMessage());\r
-         }\r
-\r
-         return modelList;\r
-       }\r
-\r
-       private void printDetails(Node modelVer) throws TransformerException {\r
-         logger.info(ModelLoaderMsgs.DISTRIBUTION_EVENT, nodeToString(modelVer));\r
-       }\r
-\r
-       private ModelArtifact parseModel(Node modelNode, String payload) {\r
-         ModelArtifact model = new ModelArtifact();\r
-         model.setPayload(payload);\r
-\r
-         if (modelNode.getNodeName().equalsIgnoreCase(MODEL_ELEMENT)) {\r
-           //compare with Model-ver\r
-           model.setType(ArtifactType.MODEL);\r
-         }\r
-         else {\r
-           model.setType(ArtifactType.NAMED_QUERY);\r
-         }\r
-\r
-         Element e = (Element)modelNode;\r
-         model.setModelNamespace(e.getAttribute("xmlns"));\r
-\r
-         parseNode(modelNode, model);\r
-\r
-         if (model.getModelInvariantId() == null  && model.getNameVersionId() == null) {\r
-           return null;\r
-         }\r
-\r
-         return model;\r
-       }\r
-\r
-       private void parseNode(Node node, ModelArtifact model) {\r
-\r
-         if(node.getNodeName().equalsIgnoreCase(MODEL_NAME_VERSION_ID)){\r
-           model.setModelVerId(node.getTextContent().trim());\r
-           model.setV9Artifact(false);\r
-         }\r
-         else if(node.getNodeName().equalsIgnoreCase("model-id")){\r
-           model.setModelInvariantId(node.getTextContent().trim());\r
-           model.setV9Artifact(false);\r
-         }\r
-\r
-         else if (node.getNodeName().equalsIgnoreCase(MODEL_INVARIANT_ID)) {\r
-           model.setModelInvariantId(node.getTextContent().trim());\r
-         }\r
-         else if (node.getNodeName().equalsIgnoreCase(MODEL_VERSION_ID)) {\r
-           model.setModelVerId(node.getTextContent().trim());\r
-           //Change to Model Invariant Id\r
-         }\r
-         else if (node.getNodeName().equalsIgnoreCase(NAMED_QUERY_VERSION_ID)) {\r
-           model.setNameVersionId(node.getTextContent().trim());\r
-         }\r
-         else if (node.getNodeName().equalsIgnoreCase(RELATIONSHIP_DATA)) {\r
-           parseRelationshipNode(node, model);\r
-           if(model.getModelModelInvariantId()!=null && model.getModelVerModelVersionId()!=null && !model.getModelModelInvariantId().isEmpty() && !model.getModelVerModelVersionId().isEmpty()){\r
-             model.addDependentModelId(model.getModelModelInvariantId() + "|" + model.getModelVerModelVersionId());\r
-             model.setModelModelInvariantId("");\r
-             model.setModelVerModelVersionId("");\r
-           }\r
-         }\r
-         else {\r
-\r
-           if (node.getNodeName().equalsIgnoreCase(MODEL_VER)) {\r
-             model.setModelVer(node);\r
-             if ( (model.getModelNamespace() != null) && (!model.getModelNamespace().isEmpty()) ) {\r
-               Element e = (Element) node;\r
-               e.setAttributeNS(XMLConstants.XMLNS_ATTRIBUTE_NS_URI, "xmlns", model.getModelNamespace());\r
-               System.out.println("Setting NS: " + e.getAttribute("xmlns"));\r
-             }\r
-           }\r
-\r
-           NodeList nodeList = node.getChildNodes();\r
-\r
-           for (int i = 0; i < nodeList.getLength(); i++) {\r
-             Node childNode = nodeList.item(i); \r
-             parseNode(childNode, model);\r
-           }\r
-         }\r
-       }\r
-\r
-       private void parseRelationshipNode(Node node, ModelArtifact model) {\r
-\r
-         //invariant-id comes before model-version-id .. create a list of values\r
-         String key = null;\r
-         String value = null;\r
-         String modelVersionIdKey=null;\r
-         String modelInvariantIdIdKey=null;\r
-         String modelVersionIdValue=null;\r
-         String modelInvariantIdIdValue=null;\r
-\r
-         NodeList nodeList = node.getChildNodes();\r
-         for (int i = 0; i < nodeList.getLength(); i++) {\r
-           Node childNode = nodeList.item(i);\r
-\r
-\r
-           if (childNode.getNodeName().equalsIgnoreCase(RELATIONSHIP_KEY)) {\r
-             key = childNode.getTextContent().trim();\r
-             if(key.equalsIgnoreCase(MODEL_VER_ELEMENT_RELATIONSHIP_KEY)){\r
-               modelVersionIdKey = key;\r
-             }\r
-             else if(key.equalsIgnoreCase(MODEL_ELEMENT_RELATIONSHIP_KEY)){\r
-               modelInvariantIdIdKey = key;\r
-             }\r
-           }\r
-           else if (childNode.getNodeName().equalsIgnoreCase(RELATIONSHIP_VALUE)) {\r
-             value = childNode.getTextContent().trim();\r
-             if(modelVersionIdKey!=null){\r
-               modelVersionIdValue = value;\r
-               model.setModelVerModelVersionId(modelVersionIdValue);\r
-             }\r
-             else if(modelInvariantIdIdKey!=null){\r
-               modelInvariantIdIdValue = value;\r
-               model.setModelModelInvariantId(modelInvariantIdIdValue);\r
-             } \r
-\r
-           }\r
-         }\r
-\r
-         if ( (key != null) && (key.equalsIgnoreCase(MODEL_ELEMENT_RELATIONSHIP_KEY )) && \r
-             (model.isV9Artifact == false ||ArtifactType.NAMED_QUERY.equals(model.getType())) ) {\r
-           if (value != null) {\r
-             model.addDependentModelId(value);\r
-           }\r
-         }\r
-       }\r
-\r
-       private String nodeToString(Node node) throws TransformerException {\r
-         StringWriter sw = new StringWriter();\r
-         Transformer t = TransformerFactory.newInstance().newTransformer();\r
-         t.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");\r
-         t.transform(new DOMSource(node), new StreamResult(sw));\r
-         return sw.toString();\r
-       }\r
-}\r
+/**
+ * ============LICENSE_START=======================================================
+ * Model Loader
+ * ================================================================================
+ * Copyright © 2017 AT&T Intellectual Property.
+ * Copyright © 2017 Amdocs
+ * All rights reserved.
+ * ================================================================================
+ * 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
+ * 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=========================================================
+ *
+ * ECOMP and OpenECOMP are trademarks
+ * and service marks of AT&T Intellectual Property.
+ */
+package org.openecomp.modelloader.entity.model;
+
+import org.openecomp.cl.api.Logger;
+import org.openecomp.cl.eelf.LoggerFactory;
+import org.openecomp.modelloader.entity.Artifact;
+import org.openecomp.modelloader.service.ModelLoaderMsgs;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.xml.sax.InputSource;
+
+import java.io.StringReader;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.XMLConstants;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+
+
+public class ModelArtifactParser implements IModelParser {
+
+       private static String MODEL_VER = "model-ver";
+       private static String MODEL_VERSION_ID = "model-version-id";
+       private static String MODEL_INVARIANT_ID = "model-invariant-id";
+       private static String RELATIONSHIP = "relationship";
+       private static String RELATIONSHIP_DATA = "relationship-data";
+       private static String RELATIONSHIP_KEY = "relationship-key";
+       private static String RELATIONSHIP_VALUE = "relationship-value";
+       private static String MODEL_ELEMENT_RELATIONSHIP_KEY = "model.model-invariant-id";
+       private static String MODEL_VER_ELEMENT_RELATIONSHIP_KEY = "model-ver.model-version-id";
+       
+       private  static Logger logger = LoggerFactory.getInstance().getLogger(ModelArtifactParser.class.getName());
+       
+       public List<Artifact> parse(byte[] artifactPayload, String artifactName) {
+         String payload = new String(artifactPayload);
+         List<Artifact> modelList = new ArrayList<Artifact>();
+
+         try {
+           DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+           DocumentBuilder builder = factory.newDocumentBuilder();
+           InputSource is = new InputSource(new StringReader(payload));
+           Document doc = builder.parse(is);
+
+           ModelArtifact model = parseModel(doc.getDocumentElement(), payload);
+
+           if (model != null) {
+             logger.info( ModelLoaderMsgs.DISTRIBUTION_EVENT, "Model parsed =====>>>> "
+                 + "Model-invariant-Id: "+ model.getModelInvariantId()
+                 + " Model-Version-Id: "+ model.getModelVerId());
+             modelList.add(model);
+           }
+           else {
+             logger.error(ModelLoaderMsgs.ARTIFACT_PARSE_ERROR, "Unable to parse artifact " + artifactName);
+             return null;
+           }
+         }
+         catch (Exception ex) {
+           logger.error(ModelLoaderMsgs.ARTIFACT_PARSE_ERROR, "Unable to parse artifact " + artifactName + ": " + ex.getLocalizedMessage());
+         }
+
+         return modelList;
+       }
+
+       private ModelArtifact parseModel(Node modelNode, String payload) {
+         ModelArtifact model = new ModelArtifact();
+         model.setPayload(payload);
+
+         Element e = (Element)modelNode;
+         model.setModelNamespace(e.getAttribute("xmlns"));
+
+         parseNode(modelNode, model);
+
+         if ( (model.getModelInvariantId() == null) || (model.getModelVerId() == null) ){
+           return null;
+         }
+
+         return model;
+       }
+
+       private void parseNode(Node node, ModelArtifact model) {
+         if (node.getNodeName().equalsIgnoreCase(MODEL_INVARIANT_ID)) {
+           model.setModelInvariantId(node.getTextContent().trim());
+         }
+         else if (node.getNodeName().equalsIgnoreCase(MODEL_VERSION_ID)) {
+           model.setModelVerId(node.getTextContent().trim());
+         }
+         else if (node.getNodeName().equalsIgnoreCase(RELATIONSHIP)) {
+           String dependentModelKey = parseRelationshipNode(node, model);
+           if (dependentModelKey != null) {
+             model.addDependentModelId(dependentModelKey);
+           }
+         }
+         else {
+           if (node.getNodeName().equalsIgnoreCase(MODEL_VER)) {
+             model.setModelVer(node);
+             if ( (model.getModelNamespace() != null) && (!model.getModelNamespace().isEmpty()) ) {
+               Element e = (Element) node;
+               e.setAttributeNS(XMLConstants.XMLNS_ATTRIBUTE_NS_URI, "xmlns", model.getModelNamespace());
+             }
+           }
+
+           NodeList nodeList = node.getChildNodes();
+
+           for (int i = 0; i < nodeList.getLength(); i++) {
+             Node childNode = nodeList.item(i); 
+             parseNode(childNode, model);
+           }
+         }
+       }
+
+       private String parseRelationshipNode(Node node, ModelArtifact model) {
+         String currentKey = null;
+         String currentValue = null;
+         String modelVersionIdValue = null;
+         String modelInvariantIdValue = null;
+
+         NodeList nodeList = node.getChildNodes();
+         for (int i = 0; i < nodeList.getLength(); i++) {
+           Node childNode = nodeList.item(i);
+           
+           if (childNode.getNodeName().equalsIgnoreCase(RELATIONSHIP_DATA)) {
+             NodeList relDataChildList = childNode.getChildNodes();
+             
+             for (int j = 0; j < relDataChildList.getLength(); j++) {
+               Node relDataChildNode = relDataChildList.item(j);
+               
+               if (relDataChildNode.getNodeName().equalsIgnoreCase(RELATIONSHIP_KEY)) {
+                 currentKey = relDataChildNode.getTextContent().trim();
+
+                 if (currentValue != null) {
+                   if (currentKey.equalsIgnoreCase(MODEL_VER_ELEMENT_RELATIONSHIP_KEY)) {
+                     modelVersionIdValue = currentValue;
+                   }
+                   else if (currentKey.equalsIgnoreCase(MODEL_ELEMENT_RELATIONSHIP_KEY)) {
+                     modelInvariantIdValue = currentValue;
+                   }
+                   
+                   currentKey = null;
+                   currentValue = null;
+                 }
+               }
+               else if (relDataChildNode.getNodeName().equalsIgnoreCase(RELATIONSHIP_VALUE)) {
+                 currentValue = relDataChildNode.getTextContent().trim();
+
+                 if (currentKey != null) {
+              if (currentKey.equalsIgnoreCase(MODEL_VER_ELEMENT_RELATIONSHIP_KEY)) {
+                modelVersionIdValue = currentValue;
+              }
+              else if (currentKey.equalsIgnoreCase(MODEL_ELEMENT_RELATIONSHIP_KEY)) {
+                modelInvariantIdValue = currentValue;
+              }
+              
+              currentKey = null;
+              currentValue = null;
+                 }
+               }
+             }
+           }
+         }
+         
+         if ( (modelVersionIdValue != null) && (modelInvariantIdValue != null) ) {
+           return modelInvariantIdValue + "|" + modelVersionIdValue;
+         }
+         
+         return null;
+
+       }
+
+}