Implement support for v10 model entities.
[aai/model-loader.git] / src / main / java / org / openecomp / modelloader / entity / model / ModelArtifactHandler.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 com.sun.jersey.api.client.ClientResponse;\r
26 \r
27 import org.openecomp.cl.api.Logger;\r
28 import org.openecomp.cl.eelf.LoggerFactory;\r
29 import org.openecomp.modelloader.config.ModelLoaderConfig;\r
30 import org.openecomp.modelloader.entity.Artifact;\r
31 import org.openecomp.modelloader.entity.ArtifactHandler;\r
32 import org.openecomp.modelloader.entity.ArtifactType;\r
33 import org.openecomp.modelloader.restclient.AaiRestClient;\r
34 import org.openecomp.modelloader.service.ModelLoaderMsgs;\r
35 \r
36 import org.w3c.dom.Node;\r
37 \r
38 import java.io.StringWriter;\r
39 import java.util.ArrayList;\r
40 import java.util.List;\r
41 \r
42 import javax.ws.rs.core.Response;\r
43 import javax.xml.transform.OutputKeys;\r
44 import javax.xml.transform.Transformer;\r
45 import javax.xml.transform.TransformerException;\r
46 import javax.xml.transform.TransformerFactory;\r
47 import javax.xml.transform.dom.DOMSource;\r
48 import javax.xml.transform.stream.StreamResult;\r
49 \r
50 \r
51 public class ModelArtifactHandler extends ArtifactHandler {\r
52 \r
53   private static final String AAI_MODEL_VER = "/model-vers/model-ver";\r
54   private static Logger logger = LoggerFactory.getInstance().getLogger(ArtifactHandler.class.getName());\r
55 \r
56 \r
57   public ModelArtifactHandler(ModelLoaderConfig config) {\r
58     super(config);\r
59   }\r
60 \r
61   @Override\r
62   public boolean pushArtifacts(List<Artifact> artifacts, String distributionID) {\r
63     ModelSorter modelSorter = new ModelSorter();\r
64     List<Artifact> sortedModelArtifacts = modelSorter.sort(artifacts);\r
65 \r
66     // Push the ordered list of model artifacts to A&AI.  If one fails, we need to roll back\r
67     // the changes.\r
68     List<ModelArtifact> completedModels = new ArrayList<ModelArtifact>();\r
69     AaiRestClient aaiClient = new AaiRestClient(config);\r
70 \r
71     for (Artifact art : sortedModelArtifacts) {\r
72       ModelArtifact model = (ModelArtifact)art;\r
73 \r
74       boolean version = model.isV9Artifact();\r
75       //Non - V9 version for models\r
76       if(version == false){\r
77         ClientResponse getResponse = aaiClient.getResource(getModelVerURL(model), distributionID, AaiRestClient.MimeType.XML);\r
78         if ( (getResponse == null) || (getResponse.getStatus() != Response.Status.OK.getStatusCode()) ) {\r
79           logger.error(ModelLoaderMsgs.DISTRIBUTION_EVENT_ERROR, " Artifact format not valid for " + \r
80               model.getType().toString() + "- model-invariant-id[model-id]: " + \r
81               model.getModelInvariantId() + " and model-version-id[model-name-version-id]: "+ \r
82               model.getModelVerId()+ " . Rolling back distribution.");\r
83           return false;\r
84         }\r
85         else{\r
86           completedModels.add(model);\r
87           logger.info(ModelLoaderMsgs.DISTRIBUTION_EVENT, model.getType().toString() + \r
88               " " + model.getModelInvariantId() + " successfully ingested.");\r
89         }\r
90       }\r
91       else\r
92       {\r
93         ClientResponse getResponse  = aaiClient.getResource(getURL(model), distributionID, AaiRestClient.MimeType.XML);\r
94         if ( (getResponse == null) || (getResponse.getStatus() != Response.Status.OK.getStatusCode()) ) {\r
95           // Only attempt the PUT if the model doesn't already exist\r
96           ClientResponse putResponse = aaiClient.putResource(getURL(model), model.getPayload(), distributionID, AaiRestClient.MimeType.XML);\r
97           if ( (putResponse != null) && (putResponse.getStatus() == Response.Status.CREATED.getStatusCode()) ) {\r
98             completedModels.add(model);\r
99             logger.info(ModelLoaderMsgs.DISTRIBUTION_EVENT, model.getType().toString() + \r
100                 " " + model.getModelInvariantId() + " successfully ingested.");\r
101           }\r
102           else {\r
103             logger.error(ModelLoaderMsgs.DISTRIBUTION_EVENT_ERROR, "Ingestion failed for " + \r
104                 model.getType().toString() + " " + model.getModelInvariantId() + ". Rolling back distribution.");\r
105 \r
106             for (ModelArtifact modelToDelete : completedModels) {\r
107               // Best effort to delete.  Nothing we can do in the event this fails.\r
108               aaiClient.getAndDeleteResource(getURL(modelToDelete), distributionID);\r
109             }\r
110 \r
111             return false;\r
112           }\r
113         }\r
114         else {\r
115           logger.info(ModelLoaderMsgs.DISTRIBUTION_EVENT, model.getType().toString() + " " + model.getModelInvariantId() + \r
116               " already exists.  Skipping ingestion.");\r
117           getResponse  = aaiClient.getResource(getModelVerURL(model), distributionID, AaiRestClient.MimeType.XML);\r
118           if ( (getResponse == null) || (getResponse.getStatus() != Response.Status.OK.getStatusCode()) ) {\r
119             // Only attempt the PUT if the model-ver doesn't already exist\r
120             ClientResponse putResponse = null;\r
121 \r
122             try {\r
123               putResponse = aaiClient.putResource(getModelVerURL(model), nodeToString(model.getModelVer()), distributionID, AaiRestClient.MimeType.XML);\r
124             } catch (TransformerException e) {\r
125               // TODO Auto-generated catch block\r
126               e.printStackTrace();\r
127             }\r
128             if ( (putResponse != null) && (putResponse.getStatus() == Response.Status.CREATED.getStatusCode()) ) {\r
129               completedModels.add(model);\r
130               logger.info(ModelLoaderMsgs.DISTRIBUTION_EVENT, model.getType().toString() + " " + \r
131                   model.getNameVersionId() + " successfully ingested.");\r
132             }\r
133             else {\r
134               logger.error(ModelLoaderMsgs.DISTRIBUTION_EVENT_ERROR, "Ingestion failed for " + \r
135                   model.getType().toString() + " " + model.getNameVersionId() + ". Rolling back distribution.");\r
136 \r
137               for (ModelArtifact modelToDelete : completedModels) {\r
138                 // Best effort to delete.  Nothing we can do in the event this fails.\r
139                 aaiClient.getAndDeleteResource(getModelVerURL(modelToDelete), distributionID);\r
140               }\r
141 \r
142               return false;\r
143             }\r
144           }\r
145           else {\r
146             logger.info(ModelLoaderMsgs.DISTRIBUTION_EVENT, model.getType().toString() + " " + \r
147                 model.getModelInvariantId() + " already exists.  Skipping ingestion.");\r
148           }\r
149         }\r
150       }\r
151     }\r
152 \r
153     return true;\r
154   }\r
155 \r
156 \r
157   private String nodeToString(Node node) throws TransformerException {\r
158     StringWriter sw = new StringWriter();\r
159     Transformer t = TransformerFactory.newInstance().newTransformer();\r
160     t.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");\r
161     t.transform(new DOMSource(node), new StreamResult(sw));\r
162     System.out.println(sw.toString());\r
163     return sw.toString();\r
164   }\r
165 \r
166   private String getURL(ModelArtifact model) {\r
167     String baseURL = config.getAaiBaseUrl().trim();\r
168     String subURL = null;\r
169     if (model.getType().equals(ArtifactType.MODEL)) {\r
170       subURL = config.getAaiModelUrl().trim();\r
171     }\r
172     else {\r
173       subURL = config.getAaiNamedQueryUrl().trim();\r
174     }\r
175 \r
176     if ( (!baseURL.endsWith("/")) && (!subURL.startsWith("/")) ) {\r
177       baseURL = baseURL + "/";\r
178     }\r
179 \r
180     if ( baseURL.endsWith("/") && subURL.startsWith("/") ) {\r
181       baseURL = baseURL.substring(0, baseURL.length()-1);\r
182     }\r
183 \r
184     if (!subURL.endsWith("/")) {\r
185       subURL = subURL + "/";\r
186     }\r
187 \r
188     String url = baseURL + subURL + model.getModelInvariantId();\r
189     return url;\r
190   }\r
191 \r
192   private String getModelVerURL(ModelArtifact model) {\r
193     String baseURL = config.getAaiBaseUrl().trim();\r
194     String subURL = null;\r
195     if (model.getType().equals(ArtifactType.MODEL)) {\r
196       subURL = config.getAaiModelUrl().trim() + model.getModelInvariantId() + AAI_MODEL_VER;\r
197     }\r
198     else {\r
199       subURL = config.getAaiNamedQueryUrl().trim();\r
200     }\r
201 \r
202     if ( (!baseURL.endsWith("/")) && (!subURL.startsWith("/")) ) {\r
203       baseURL = baseURL + "/";\r
204     }\r
205 \r
206     if ( baseURL.endsWith("/") && subURL.startsWith("/") ) {\r
207       baseURL = baseURL.substring(0, baseURL.length()-1);\r
208     }\r
209 \r
210     if (!subURL.endsWith("/")) {\r
211       subURL = subURL + "/";\r
212     }\r
213 \r
214     String url = baseURL + subURL + model.getModelVerId();\r
215     System.out.println(url);\r
216     return url;\r
217   }\r
218 \r
219   // This method is used for the test REST interface to load models without an ASDC\r
220   public void loadModelTest(byte[] payload) {\r
221     List<Artifact> modelArtifacts = new ArrayList<Artifact>();\r
222     ModelArtifactParser parser = new ModelArtifactParser();\r
223     modelArtifacts.addAll(parser.parse(payload, "Test-Artifact"));\r
224     ModelSorter modelSorter = new ModelSorter();\r
225     List<Artifact> sortedModelArtifacts = modelSorter.sort(modelArtifacts);\r
226     pushArtifacts(sortedModelArtifacts, "Test-Distribution");\r
227   }\r
228 }\r