Implement support for v10 model entities.
[aai/model-loader.git] / src / main / java / org / openecomp / modelloader / entity / model / ModelArtifactParser.java
1 /**\r
2  * ============LICENSE_START=======================================================\r
3  * Model Loader\r
4  * ================================================================================\r
5  * Copyright © 2017 AT&T Intellectual Property.\r
6  * Copyright © 2017 Amdocs\r
7  * All rights reserved.\r
8  * ================================================================================\r
9  * Licensed under the Apache License, Version 2.0 (the "License");\r
10  * you may not use this file except in compliance with the License.\r
11  * You may obtain a copy of the License at\r
12  * http://www.apache.org/licenses/LICENSE-2.0\r
13  * Unless required by applicable law or agreed to in writing, software\r
14  * distributed under the License is distributed on an "AS IS" BASIS,\r
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
16  * See the License for the specific language governing permissions and\r
17  * limitations under the License.\r
18  * ============LICENSE_END=========================================================\r
19  *\r
20  * ECOMP and OpenECOMP are trademarks\r
21  * and service marks of AT&T Intellectual Property.\r
22  */\r
23 package org.openecomp.modelloader.entity.model;\r
24 \r
25 import org.openecomp.cl.api.Logger;\r
26 import org.openecomp.cl.eelf.LoggerFactory;\r
27 import org.openecomp.modelloader.entity.Artifact;\r
28 import org.openecomp.modelloader.entity.ArtifactType;\r
29 import org.openecomp.modelloader.service.ModelLoaderMsgs;\r
30 import org.openecomp.modelloader.util.JsonXmlConverter;\r
31 \r
32 import org.w3c.dom.Document;\r
33 import org.w3c.dom.Element;\r
34 import org.w3c.dom.Node;\r
35 import org.w3c.dom.NodeList;\r
36 import org.xml.sax.InputSource;\r
37 \r
38 import java.io.StringReader;\r
39 import java.io.StringWriter;\r
40 import java.util.ArrayList;\r
41 import java.util.List;\r
42 \r
43 import javax.xml.XMLConstants;\r
44 import javax.xml.parsers.DocumentBuilder;\r
45 import javax.xml.parsers.DocumentBuilderFactory;\r
46 import javax.xml.transform.OutputKeys;\r
47 import javax.xml.transform.Transformer;\r
48 import javax.xml.transform.TransformerException;\r
49 import javax.xml.transform.TransformerFactory;\r
50 import javax.xml.transform.dom.DOMSource;\r
51 import javax.xml.transform.stream.StreamResult;\r
52 \r
53 \r
54 public class ModelArtifactParser {\r
55 \r
56         private static String MODELS_ELEMENT = "models";\r
57         private static String MODEL_ELEMENT = "model";\r
58         private static String NAMED_QUERIES_ELEMENT = "named-queries";\r
59         private static String NAMED_QUERY_ELEMENT = "named-query";\r
60         private static String MODEL_NAME_VERSION_ID = "model-name-version-id";\r
61         private static String MODEL_VER = "model-ver";\r
62         private static String MODEL_VERSION_ID = "model-version-id";\r
63         private static String MODEL_INVARIANT_ID = "model-invariant-id";\r
64         private static String NAMED_QUERY_VERSION_ID = "named-query-uuid";\r
65         private static String RELATIONSHIP_DATA = "relationship-data";\r
66         private static String RELATIONSHIP_KEY = "relationship-key";\r
67         private static String RELATIONSHIP_VALUE = "relationship-value";\r
68         private static String MODEL_ELEMENT_RELATIONSHIP_KEY = "model.model-invariant-id";\r
69         private static String MODEL_VER_ELEMENT_RELATIONSHIP_KEY = "model-ver.model-version-id";\r
70         \r
71         private  static Logger logger = LoggerFactory.getInstance().getLogger(ModelArtifactParser.class.getName());\r
72         \r
73         public List<Artifact> parse(byte[] artifactPayload, String artifactName) {\r
74           String payload = new String(artifactPayload);\r
75           List<Artifact> modelList = new ArrayList<Artifact>();\r
76 \r
77           try {\r
78             // Artifact could be JSON or XML\r
79             if (JsonXmlConverter.isValidJson(payload)) {\r
80               payload = JsonXmlConverter.convertJsonToXml(payload);\r
81             }\r
82 \r
83             DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();\r
84             DocumentBuilder builder = factory.newDocumentBuilder();\r
85             InputSource is = new InputSource(new StringReader(payload));\r
86             Document doc = builder.parse(is);\r
87 \r
88             if ( (doc.getDocumentElement().getNodeName().equalsIgnoreCase(MODEL_ELEMENT)) || \r
89                 (doc.getDocumentElement().getNodeName().equalsIgnoreCase(NAMED_QUERY_ELEMENT)) ) {\r
90 \r
91               ModelArtifact model = parseModel(doc.getDocumentElement(), payload);\r
92 \r
93               if (model != null) {\r
94                 if ( ArtifactType.MODEL.equals(model.getType())) {\r
95                   logger.info( ModelLoaderMsgs.DISTRIBUTION_EVENT, "Model parsed =====>>>> "\r
96                       + "Model-invariant-Id: "+ model.getModelInvariantId()\r
97                       + " Model-Version-Id: "+ model.getModelVerId());\r
98                 }\r
99                 modelList.add(model);\r
100               }\r
101               else {\r
102                 logger.error(ModelLoaderMsgs.ARTIFACT_PARSE_ERROR, "Unable to parse artifact " + artifactName);\r
103                 return null;\r
104               }\r
105             }\r
106             else if ( (doc.getDocumentElement().getNodeName().equalsIgnoreCase(MODELS_ELEMENT)) ||\r
107                 (doc.getDocumentElement().getNodeName().equalsIgnoreCase(NAMED_QUERIES_ELEMENT)) ) {\r
108               // The complete set of models/named-queries were contained in this artifact\r
109               NodeList nodeList = doc.getDocumentElement().getChildNodes();\r
110               for (int i = 0; i < nodeList.getLength(); i++) {\r
111                 Node childNode = nodeList.item(i);\r
112                 if ( (childNode.getNodeName().equalsIgnoreCase(MODEL_ELEMENT)) || \r
113                     (childNode.getNodeName().equalsIgnoreCase(NAMED_QUERY_ELEMENT)) ) {\r
114                   String modelPayload = nodeToString(childNode);\r
115                   ModelArtifact model = parseModel(childNode, modelPayload);\r
116                   if (model != null) {\r
117                     modelList.add(model);\r
118                   }\r
119                   else {\r
120                     logger.error(ModelLoaderMsgs.ARTIFACT_PARSE_ERROR, "Unable to parse artifact " + artifactName);\r
121                     modelList.clear();\r
122                     break;\r
123                   }\r
124                 }\r
125               }\r
126             }\r
127           }\r
128           catch (Exception ex) {\r
129             logger.error(ModelLoaderMsgs.ARTIFACT_PARSE_ERROR, "Unable to parse artifact " + artifactName + ": " + ex.getLocalizedMessage());\r
130           }\r
131 \r
132           return modelList;\r
133         }\r
134 \r
135         private void printDetails(Node modelVer) throws TransformerException {\r
136           logger.info(ModelLoaderMsgs.DISTRIBUTION_EVENT, nodeToString(modelVer));\r
137         }\r
138 \r
139         private ModelArtifact parseModel(Node modelNode, String payload) {\r
140           ModelArtifact model = new ModelArtifact();\r
141           model.setPayload(payload);\r
142 \r
143           if (modelNode.getNodeName().equalsIgnoreCase(MODEL_ELEMENT)) {\r
144             //compare with Model-ver\r
145             model.setType(ArtifactType.MODEL);\r
146           }\r
147           else {\r
148             model.setType(ArtifactType.NAMED_QUERY);\r
149           }\r
150 \r
151           Element e = (Element)modelNode;\r
152           model.setModelNamespace(e.getAttribute("xmlns"));\r
153 \r
154           parseNode(modelNode, model);\r
155 \r
156           if (model.getModelInvariantId() == null  && model.getNameVersionId() == null) {\r
157             return null;\r
158           }\r
159 \r
160           return model;\r
161         }\r
162 \r
163         private void parseNode(Node node, ModelArtifact model) {\r
164 \r
165           if(node.getNodeName().equalsIgnoreCase(MODEL_NAME_VERSION_ID)){\r
166             model.setModelVerId(node.getTextContent().trim());\r
167             model.setV9Artifact(false);\r
168           }\r
169           else if(node.getNodeName().equalsIgnoreCase("model-id")){\r
170             model.setModelInvariantId(node.getTextContent().trim());\r
171             model.setV9Artifact(false);\r
172           }\r
173 \r
174           else if (node.getNodeName().equalsIgnoreCase(MODEL_INVARIANT_ID)) {\r
175             model.setModelInvariantId(node.getTextContent().trim());\r
176           }\r
177           else if (node.getNodeName().equalsIgnoreCase(MODEL_VERSION_ID)) {\r
178             model.setModelVerId(node.getTextContent().trim());\r
179             //Change to Model Invariant Id\r
180           }\r
181           else if (node.getNodeName().equalsIgnoreCase(NAMED_QUERY_VERSION_ID)) {\r
182             model.setNameVersionId(node.getTextContent().trim());\r
183           }\r
184           else if (node.getNodeName().equalsIgnoreCase(RELATIONSHIP_DATA)) {\r
185             parseRelationshipNode(node, model);\r
186             if(model.getModelModelInvariantId()!=null && model.getModelVerModelVersionId()!=null && !model.getModelModelInvariantId().isEmpty() && !model.getModelVerModelVersionId().isEmpty()){\r
187               model.addDependentModelId(model.getModelModelInvariantId() + "|" + model.getModelVerModelVersionId());\r
188               model.setModelModelInvariantId("");\r
189               model.setModelVerModelVersionId("");\r
190             }\r
191           }\r
192           else {\r
193 \r
194             if (node.getNodeName().equalsIgnoreCase(MODEL_VER)) {\r
195               model.setModelVer(node);\r
196               if ( (model.getModelNamespace() != null) && (!model.getModelNamespace().isEmpty()) ) {\r
197                 Element e = (Element) node;\r
198                 e.setAttributeNS(XMLConstants.XMLNS_ATTRIBUTE_NS_URI, "xmlns", model.getModelNamespace());\r
199                 System.out.println("Setting NS: " + e.getAttribute("xmlns"));\r
200               }\r
201             }\r
202 \r
203             NodeList nodeList = node.getChildNodes();\r
204 \r
205             for (int i = 0; i < nodeList.getLength(); i++) {\r
206               Node childNode = nodeList.item(i); \r
207               parseNode(childNode, model);\r
208             }\r
209           }\r
210         }\r
211 \r
212         private void parseRelationshipNode(Node node, ModelArtifact model) {\r
213 \r
214           //invariant-id comes before model-version-id .. create a list of values\r
215           String key = null;\r
216           String value = null;\r
217           String modelVersionIdKey=null;\r
218           String modelInvariantIdIdKey=null;\r
219           String modelVersionIdValue=null;\r
220           String modelInvariantIdIdValue=null;\r
221 \r
222           NodeList nodeList = node.getChildNodes();\r
223           for (int i = 0; i < nodeList.getLength(); i++) {\r
224             Node childNode = nodeList.item(i);\r
225 \r
226 \r
227             if (childNode.getNodeName().equalsIgnoreCase(RELATIONSHIP_KEY)) {\r
228               key = childNode.getTextContent().trim();\r
229               if(key.equalsIgnoreCase(MODEL_VER_ELEMENT_RELATIONSHIP_KEY)){\r
230                 modelVersionIdKey = key;\r
231               }\r
232               else if(key.equalsIgnoreCase(MODEL_ELEMENT_RELATIONSHIP_KEY)){\r
233                 modelInvariantIdIdKey = key;\r
234               }\r
235             }\r
236             else if (childNode.getNodeName().equalsIgnoreCase(RELATIONSHIP_VALUE)) {\r
237               value = childNode.getTextContent().trim();\r
238               if(modelVersionIdKey!=null){\r
239                 modelVersionIdValue = value;\r
240                 model.setModelVerModelVersionId(modelVersionIdValue);\r
241               }\r
242               else if(modelInvariantIdIdKey!=null){\r
243                 modelInvariantIdIdValue = value;\r
244                 model.setModelModelInvariantId(modelInvariantIdIdValue);\r
245               } \r
246 \r
247             }\r
248           }\r
249 \r
250           if ( (key != null) && (key.equalsIgnoreCase(MODEL_ELEMENT_RELATIONSHIP_KEY )) && \r
251               (model.isV9Artifact == false ||ArtifactType.NAMED_QUERY.equals(model.getType())) ) {\r
252             if (value != null) {\r
253               model.addDependentModelId(value);\r
254             }\r
255           }\r
256         }\r
257 \r
258         private String nodeToString(Node node) throws TransformerException {\r
259           StringWriter sw = new StringWriter();\r
260           Transformer t = TransformerFactory.newInstance().newTransformer();\r
261           t.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");\r
262           t.transform(new DOMSource(node), new StreamResult(sw));\r
263           return sw.toString();\r
264         }\r
265 }\r