[SDC-29] Amdocs OnBoard 1707 initial commit.
[sdc.git] / common / openecomp-sdc-artifact-generator-lib / openecomp-sdc-artifact-generator-core / src / main / java / org / openecomp / sdc / generator / aai / AaiModelGeneratorImpl.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * SDC
4  * ================================================================================
5  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6  * ================================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  * 
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  * 
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ============LICENSE_END=========================================================
19  */
20
21 package org.openecomp.sdc.generator.aai;
22
23 import org.openecomp.core.logging.api.Logger;
24 import org.openecomp.core.logging.api.LoggerFactory;
25 import org.openecomp.sdc.generator.aai.model.Resource;
26 import org.openecomp.sdc.generator.aai.model.Service;
27 import org.openecomp.sdc.generator.aai.model.Widget;
28 import org.openecomp.sdc.generator.aai.xml.Model;
29 import org.openecomp.sdc.generator.aai.xml.ModelElement;
30 import org.openecomp.sdc.generator.aai.xml.ModelElements;
31 import org.openecomp.sdc.generator.aai.xml.ModelVer;
32 import org.openecomp.sdc.generator.aai.xml.ModelVers;
33 import org.openecomp.sdc.generator.aai.xml.Relationship;
34 import org.openecomp.sdc.generator.aai.xml.RelationshipData;
35 import org.openecomp.sdc.generator.aai.xml.RelationshipList;
36 import org.openecomp.sdc.generator.logging.annotations.Audit;
37 import org.openecomp.sdc.generator.logging.annotations.Metrics;
38 import org.w3c.dom.DOMException;
39
40 import java.io.StringWriter;
41 import java.util.List;
42 import java.util.Set;
43 import javax.xml.bind.JAXBContext;
44 import javax.xml.bind.JAXBException;
45 import javax.xml.bind.Marshaller;
46
47 /**
48  * Implementation of the {@link AaiModelGenerator} which generates the XML models from the
49  * Service/Resource/Widget java models.
50  */
51 public class AaiModelGeneratorImpl implements AaiModelGenerator {
52   private static Logger log = LoggerFactory.getLogger(AaiModelGeneratorImpl.class.getName());
53
54   /**
55    * Method to generate the AAI model for a Service.
56    *
57    * @param service Java object model representing an AAI {@link Service} model
58    * @return XML representation of the service model in String format
59    */
60   @Override
61   @Metrics
62   public String generateModelFor(Service service) {
63     //Create a JAXB Model for AAI service model
64     Model aaiServiceModel = new Model();
65     log.debug("Generating Model for Service with ModelName: " + service.getModelName());
66     // after new model
67     aaiServiceModel.setModelInvariantId(service.getModelId());
68     aaiServiceModel.setModelVers(new ModelVers());
69     ModelVer modelVer = new ModelVer();
70     modelVer.setModelDescription(service.getModelDescription());
71     modelVer.setModelName(service.getModelName());
72     modelVer.setModelVersion(service.getModelVersion());
73     modelVer.setModelVersionId(service.getModelNameVersionId());
74     modelVer.setModelElements(new ModelElements());
75     ModelElements modelElements = modelVer.getModelElements();
76     //Populate basic model details
77     aaiServiceModel
78        .setModelType(service.getModelType().name().toLowerCase()); //Using enum name as model type
79     List<ModelElement> modelElementList = modelElements.getModelElement();
80
81     //Add service base widget model element
82     ModelElement serviceWidgetModelRelationshipElement =
83         createRelationshipModelElement(getNewDataDelFlagValue(service.getDeleteFlag()),
84             service.getWidgetId(),service.getWidgetInvariantId());
85     modelElementList.add(serviceWidgetModelRelationshipElement);
86
87     //Add the resource model elements
88     ModelElements serviceModelElements = serviceWidgetModelRelationshipElement.getModelElements();
89     List<ModelElement> serviceModelElementList = serviceModelElements.getModelElement();
90     Set<Resource> serviceResources = service.getResources();
91     if (serviceResources != null && !serviceResources.isEmpty()) {
92       for (Resource resourceModel : serviceResources) {
93         ModelElement aaiResourceModelElement =
94             createRelationshipModelElement(getNewDataDelFlagValue(resourceModel.getDeleteFlag()),
95                 resourceModel.getModelNameVersionId(),resourceModel.getModelId());
96         serviceModelElementList.add(aaiResourceModelElement);
97       }
98     }
99
100     //Add the widget model elements
101     Set<Widget> serviceWidgets = service.getWidgets();
102     if (serviceWidgets != null && !serviceWidgets.isEmpty()) {
103       for (Widget widgetModel : serviceWidgets) {
104         ModelElement widgetModelElement =
105             createRelationshipModelElement(getNewDataDelFlagValue(widgetModel.getDeleteFlag()),
106                 widgetModel.getId(),widgetModel.getWidgetId());
107         serviceModelElementList.add(widgetModelElement);
108       }
109     }
110     ModelVers modelVers = aaiServiceModel.getModelVers();
111     List<ModelVer> modelVerList = modelVers.getModelVer();
112     modelVerList.add(modelVer);
113     return getModelAsString(aaiServiceModel);
114   }
115
116   /**
117    * Method to generate the AAI model for a Resource.
118    *
119    * @param resource Java object model representing an AAI {@link Resource} model
120    * @return XML representation of the resource model in String format
121    */
122   @Override
123   @Metrics
124   public String generateModelFor(Resource resource) {
125     //Create a JAXB Model for AAI Resource model
126     Model aaiResourceModel = new Model();
127     log.debug("Generating Model for Resource with ModelName: " + resource.getModelName());
128     aaiResourceModel.setModelInvariantId(resource.getModelId());
129     aaiResourceModel.setModelVers(new ModelVers());
130     ModelVer modelVer = new ModelVer();
131     modelVer.setModelDescription(resource.getModelDescription());
132     modelVer.setModelName(resource.getModelName());
133     modelVer.setModelVersion(resource.getModelVersion());
134     modelVer.setModelVersionId(resource.getModelNameVersionId());
135     modelVer.setModelElements(new ModelElements());
136     ModelElements modelElements = modelVer.getModelElements();
137     aaiResourceModel
138         .setModelType(resource.getModelType().name().toLowerCase()); //Using enum name as model type
139     List<ModelElement> modelElementList = modelElements.getModelElement();
140
141     //Add resource base widget model element
142     ModelElement resourceWidgetModelRelationshipElement =
143         createRelationshipModelElement(getNewDataDelFlagValue(resource.getDeleteFlag()),
144             resource.getWidgetId(),resource.getWidgetInvariantId());
145     modelElementList.add(resourceWidgetModelRelationshipElement);
146
147     //Add the child resources to the base widget model element list
148     ModelElements baseResourceWidgetModelElements =
149         resourceWidgetModelRelationshipElement.getModelElements();
150     List<ModelElement> baseResourceWidgetModelElementList =
151         baseResourceWidgetModelElements.getModelElement();
152     Set<Resource> childResources = resource.getResources();
153     if (childResources != null && !childResources.isEmpty()) {
154       for (Resource childResourceModel : childResources) {
155         ModelElement aaiChildResourceModelElement = createRelationshipModelElement(
156             getNewDataDelFlagValue(childResourceModel.getDeleteFlag()),
157             childResourceModel.getModelNameVersionId(),childResourceModel.getModelId());
158         baseResourceWidgetModelElementList.add(aaiChildResourceModelElement);
159       }
160     }
161     //Add resource widgets/resources to the resource widget model relationship element
162     Set<Widget> resourceWidgets = resource.getWidgets();
163     if (resourceWidgets != null && !resourceWidgets.isEmpty()) {
164       generateWidgetChildren(resourceWidgetModelRelationshipElement, resourceWidgets);
165     }
166
167     ModelVers modelVers = aaiResourceModel.getModelVers();
168     List<ModelVer> modelVerList = modelVers.getModelVer();
169     modelVerList.add(modelVer);
170     return getModelAsString(aaiResourceModel);
171
172   }
173
174   /**
175    * Method to create the <model-element></model-element> holding the relationship value for a
176    * resource/widget
177    * model.
178    *
179    * @param newDataDelFlag    Value of the <new-data-del-flag></new-data-del-flag> attribute for
180    *                          a widget/resource in
181    *                          the model xml
182    * @param relationshipValue Value of the <relationship-value></relationship-value> attribute
183    *                          for the widget/resource in
184    *                          the model xml
185    * @return Java object representation for the <model-element></model-element> holding the
186    relationship
187    */
188   private ModelElement createRelationshipModelElement(String newDataDelFlag,
189                                                       String modelVersionId,String
190                                                           modelInvariantId) {
191     ModelElement relationshipModelElement = new ModelElement();
192     relationshipModelElement.setNewDataDelFlag(newDataDelFlag); //Set new-data-del-flag value
193     relationshipModelElement.setCardinality("unbounded");
194     RelationshipList relationShipList = new RelationshipList();
195     final List<Relationship> relationships = relationShipList.getRelationship();
196     Relationship relationship = new Relationship();
197     relationship.setRelatedTo("model-ver");
198     List<RelationshipData> relationshipDataList = relationship.getRelationshipData();
199
200     RelationshipData modelVersionRelationshipData = new RelationshipData();
201     modelVersionRelationshipData.setRelationshipKey("model-ver.model-version-id");
202     modelVersionRelationshipData.setRelationshipValue(
203         modelVersionId);  //Set the widget/resource name-version-uuid as value
204     relationshipDataList.add(modelVersionRelationshipData);
205     RelationshipData modelInvariantRelationshipData = new RelationshipData();
206     modelInvariantRelationshipData.setRelationshipKey("model.model-invariant-id");
207     modelInvariantRelationshipData.setRelationshipValue(
208         modelInvariantId);
209     relationshipDataList.add(modelInvariantRelationshipData);
210     relationships.add(relationship);
211     relationshipModelElement.setRelationshipList(relationShipList);
212     relationshipModelElement.setModelElements(new ModelElements());
213     return relationshipModelElement;
214   }
215
216   /**
217    * Method to create the child model elements of the widget. Handles the generation of recursive
218    * child widget elements (if any)
219    *
220    * @param parent            Reference to the parent widget model element
221    * @param widgetChildrenSet Set of children obtained from the tosca/widget definition
222    */
223   private void generateWidgetChildren(ModelElement parent, Set<Widget> widgetChildrenSet) {
224     for (Widget widget : widgetChildrenSet) {
225       Set<Widget> widgetSubChildren = widget.getWidgets();
226       if (widgetSubChildren != null && !widgetSubChildren.isEmpty()) {
227         ModelElement widgetChildRelationshipElement =
228             createRelationshipModelElement(getNewDataDelFlagValue(widget.getDeleteFlag()),
229                 widget.getId(),widget.getWidgetId());
230         //Recursive call for getting the children of widgets (if any)
231         generateWidgetChildren(widgetChildRelationshipElement, widgetSubChildren);
232         parent.getModelElements().getModelElement().add(widgetChildRelationshipElement);
233       } else {
234         ModelElement widgetChildRelationshipElement =
235             createRelationshipModelElement(getNewDataDelFlagValue(widget.getDeleteFlag()),
236                 widget.getId(),widget.getWidgetId()
237             );
238         parent.getModelElements().getModelElement().add(widgetChildRelationshipElement);
239       }
240     }
241   }
242
243   /**
244    * Converts the data delete flag value from boolean to String as per AAI model.
245    *
246    * @param delFlag Boolean value as true/false from the annotation
247    * @return Converted value to a flag as per AAI model
248    */
249   private String getNewDataDelFlagValue(boolean delFlag) {
250     if (delFlag) {
251       return "T";
252     } else {
253       return "F";
254     }
255   }
256
257   /**
258    * JAXB marshalling helper method to convert the Java object model to XML String.
259    *
260    * @param model Java Object model of a service/widget/resource
261    * @return XML representation of the Java model in String format
262    */
263   private String getModelAsString(Model model) {
264     JAXBContext jaxbContext;
265     StringWriter modelStringWriter = new StringWriter();
266     try {
267       jaxbContext = JAXBContext.newInstance(Model.class);
268       Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
269       jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
270       jaxbMarshaller.setProperty(Marshaller.JAXB_ENCODING, "US-ASCII");
271       jaxbMarshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
272       jaxbMarshaller.marshal(model, modelStringWriter);
273     } catch (JAXBException jaxbException) {
274       //jaxbException.printStackTrace();
275       log.error(jaxbException.getMessage());
276       throw new DOMException(DOMException.SYNTAX_ERR, jaxbException.getMessage());
277     }
278
279     //System.out.println(modelStringWriter.toString());
280     return modelStringWriter.toString();
281   }
282 }