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