+ resourceModel.addWidget(new TunnelXconnectWidget());
+ }
+
+ resources.addAll(processInstanceGroups(resourceModel, serviceNode));
+ resources.add((Resource) resourceModel);
+ }
+ return resources;
+ }
+
+ /**
+ * Process groups for this service node, according to the defined filter.
+ *
+ * @param resourceModel
+ * @param serviceNode
+ * @return resources for which XML Models should be generated
+ */
+ private List<Resource> processInstanceGroups(Model resourceModel, NodeTemplate serviceNode) {
+ List<Resource> resources = new ArrayList<>();
+ if (csarHelper.getNodeTemplateByName(serviceNode.getName()).getSubMappingToscaTemplate() != null) {
+ List<Group> serviceGroups = csarHelper.getGroupsOfOriginOfNodeTemplate(serviceNode);
+ for (Group group : serviceGroups) {
+ if (WidgetConfigurationUtil.isSupportedInstanceGroup(group.getType())) {
+ resources.addAll(processInstanceGroup(resourceModel, group));
+ }
+ }
+ }
+ return resources;
+ }
+
+ /**
+ * Create an Instance Group Model for the supplied Service Group and relate this to the supplied resource Model.
+ *
+ * @param resourceModel the Resource node template Model
+ * @param group the Service Group
+ * @return the Instance Group and Member resource models
+ */
+ private List<Resource> processInstanceGroup(Model resourceModel, Group group) {
+ List<Resource> resources = new ArrayList<>();
+
+ Resource groupModel = new InstanceGroup();
+ groupModel.populateModelIdentificationInformation(group.getMetadata().getAllProperties());
+ groupModel.populateModelIdentificationInformation(populateStringProperties(group.getProperties()));
+
+ resourceModel.addResource(groupModel);
+ resources.add(groupModel);
+
+ List<NodeTemplate> members = group.getMemberNodes();
+ if (members != null && !members.isEmpty()) {
+ for (NodeTemplate nodeTemplate : members) {
+ String nodeTypeName = normaliseNodeTypeName(nodeTemplate);
+ Model memberModel = Model.getModelFor(nodeTypeName, nodeTemplate.getMetaData().getValue("type"));
+ memberModel.populateModelIdentificationInformation(nodeTemplate.getMetaData().getAllProperties());
+ if (memberModel instanceof Resource) {
+ log.debug("Generating grouped Resource " + nodeTypeName);
+ groupModel.addResource((Resource) memberModel);
+ resources.add((Resource) memberModel);
+ } else {
+ log.debug("Generating grouped Widget " + nodeTypeName);
+ groupModel.addWidget((Widget) memberModel);
+ }