2 * ============LICENSE_START=======================================================
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
11 * http://www.apache.org/licenses/LICENSE-2.0
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=========================================================
21 package org.openecomp.sdc.generator.aai;
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;
40 import java.io.StringWriter;
41 import java.util.List;
43 import javax.xml.bind.JAXBContext;
44 import javax.xml.bind.JAXBException;
45 import javax.xml.bind.Marshaller;
48 * Implementation of the {@link AaiModelGenerator} which generates the XML models from the
49 * Service/Resource/Widget java models.
51 public class AaiModelGeneratorImpl implements AaiModelGenerator {
52 private static Logger log = LoggerFactory.getLogger(AaiModelGeneratorImpl.class.getName());
55 * Method to generate the AAI model for a Service.
57 * @param service Java object model representing an AAI {@link Service} model
58 * @return XML representation of the service model in String format
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());
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
78 .setModelType(service.getModelType().name().toLowerCase()); //Using enum name as model type
79 List<ModelElement> modelElementList = modelElements.getModelElement();
81 //Add service base widget model element
82 ModelElement serviceWidgetModelRelationshipElement =
83 createRelationshipModelElement(getNewDataDelFlagValue(service.getDeleteFlag()),
84 service.getWidgetId(),service.getWidgetInvariantId());
85 modelElementList.add(serviceWidgetModelRelationshipElement);
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);
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);
110 ModelVers modelVers = aaiServiceModel.getModelVers();
111 List<ModelVer> modelVerList = modelVers.getModelVer();
112 modelVerList.add(modelVer);
113 return getModelAsString(aaiServiceModel);
117 * Method to generate the AAI model for a Resource.
119 * @param resource Java object model representing an AAI {@link Resource} model
120 * @return XML representation of the resource model in String format
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();
138 .setModelType(resource.getModelType().name().toLowerCase()); //Using enum name as model type
139 List<ModelElement> modelElementList = modelElements.getModelElement();
141 //Add resource base widget model element
142 ModelElement resourceWidgetModelRelationshipElement =
143 createRelationshipModelElement(getNewDataDelFlagValue(resource.getDeleteFlag()),
144 resource.getWidgetId(),resource.getWidgetInvariantId());
145 modelElementList.add(resourceWidgetModelRelationshipElement);
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);
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);
167 ModelVers modelVers = aaiResourceModel.getModelVers();
168 List<ModelVer> modelVerList = modelVers.getModelVer();
169 modelVerList.add(modelVer);
170 return getModelAsString(aaiResourceModel);
175 * Method to create the <model-element></model-element> holding the relationship value for a
179 * @param newDataDelFlag Value of the <new-data-del-flag></new-data-del-flag> attribute for
180 * a widget/resource in
182 * @param relationshipValue Value of the <relationship-value></relationship-value> attribute
183 * for the widget/resource in
185 * @return Java object representation for the <model-element></model-element> holding the
188 private ModelElement createRelationshipModelElement(String newDataDelFlag,
189 String modelVersionId,String
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();
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(
209 relationshipDataList.add(modelInvariantRelationshipData);
210 relationships.add(relationship);
211 relationshipModelElement.setRelationshipList(relationShipList);
212 relationshipModelElement.setModelElements(new ModelElements());
213 return relationshipModelElement;
217 * Method to create the child model elements of the widget. Handles the generation of recursive
218 * child widget elements (if any)
220 * @param parent Reference to the parent widget model element
221 * @param widgetChildrenSet Set of children obtained from the tosca/widget definition
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);
234 ModelElement widgetChildRelationshipElement =
235 createRelationshipModelElement(getNewDataDelFlagValue(widget.getDeleteFlag()),
236 widget.getId(),widget.getWidgetId()
238 parent.getModelElements().getModelElement().add(widgetChildRelationshipElement);
244 * Converts the data delete flag value from boolean to String as per AAI model.
246 * @param delFlag Boolean value as true/false from the annotation
247 * @return Converted value to a flag as per AAI model
249 private String getNewDataDelFlagValue(boolean delFlag) {
258 * JAXB marshalling helper method to convert the Java object model to XML String.
260 * @param model Java Object model of a service/widget/resource
261 * @return XML representation of the Java model in String format
263 private String getModelAsString(Model model) {
264 JAXBContext jaxbContext;
265 StringWriter modelStringWriter = new StringWriter();
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());
279 //System.out.println(modelStringWriter.toString());
280 return modelStringWriter.toString();