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