use of org.eclipse.winery.model.adaptation.placement.Constants.SERVICE_TEMPLATE_GROUP in project winery by eclipse.
the class DataFlowResource method mergeTemplateForDataSource.
/**
* Replace a filter corresponding to a running and placed data source by a ServiceTemplate with the same location
* and provider tag which contains a NodeTemplate of the NodeType specified for the data source filter.
*/
private TTopologyTemplate mergeTemplateForDataSource(TTopologyTemplate topology, NodeTypeId nodeTypeId, String templateName, Map<String, String> properties, String location, String provider) {
// get all ServiceTemplates in the repo
IRepository repo = RepositoryFactory.getRepository();
List<ServiceTemplateId> serviceTemplateIds = repo.getAllDefinitionsChildIds().stream().filter(id -> id.getGroup().equals(SERVICE_TEMPLATE_GROUP) && id instanceof ServiceTemplateId).map(id -> (ServiceTemplateId) id).collect(Collectors.toList());
for (ServiceTemplateId id : serviceTemplateIds) {
TServiceTemplate serviceTemplate = repo.getElement(id);
// only ServiceTemplates with location and provider tags are possible substitution candidates
if (containsMatchingTags(serviceTemplate, location, provider) && containsMatchingNodeType(serviceTemplate, nodeTypeId)) {
LOGGER.debug("Found suited substitution candidate for filter {}: {}", templateName, id.getQName());
TTopologyTemplate substitutionTopology = serviceTemplate.getTopologyTemplate();
TNodeTemplate filterCorrespondingNode = null;
LinkedHashMap<String, String> filterCorrespondingNodeProperties = null;
Map<String, String> nameMap = new HashMap<>();
if (substitutionTopology == null) {
continue;
}
// insert all NodeTemplates from the substitution candidate
for (TNodeTemplate node : substitutionTopology.getNodeTemplates()) {
LinkedHashMap<String, String> propertyList = ModelUtilities.getPropertiesKV(node);
if (propertyList == null) {
propertyList = new LinkedHashMap<>();
}
if (node.getType().equals(nodeTypeId.getQName())) {
// the NodeTemplate from the data flow model must be renamed to the given name
nameMap.put(node.getId(), templateName);
node.setId(templateName);
filterCorrespondingNode = node;
filterCorrespondingNodeProperties = propertyList;
} else if (Objects.nonNull(topology.getNodeTemplate(node.getId()))) {
// all existing names must be changed too
while (Objects.nonNull(topology.getNodeTemplate(node.getId() + "-" + IdCounter))) {
IdCounter++;
}
nameMap.put(node.getId(), node.getId() + "-" + IdCounter);
node.setId(node.getId() + "-" + IdCounter);
}
// update properties of the NodeTemplate if they are set at the filter
Map<String, String> propertyCopy = new HashMap<>(properties);
for (String propertyName : propertyCopy.keySet()) {
if (propertyName != null && propertyList.containsKey(propertyName)) {
propertyList.put(propertyName, properties.get(propertyName));
properties.remove(propertyName);
}
}
// set the state of all components related to the data source to running
propertyList.put("State", "Running");
ModelUtilities.setPropertiesKV(node, propertyList);
topology.addNodeTemplate(node);
}
// add all properties that are not defined in the NodeTypes to the node corresponding to the filter
if (Objects.nonNull(filterCorrespondingNode)) {
LOGGER.debug("{} properties defined without property at a matching type. Adding to filter " + "NodeTemplate!", properties.size());
for (String propertyName : properties.keySet()) {
filterCorrespondingNodeProperties.put(propertyName, properties.get(propertyName));
}
ModelUtilities.setPropertiesKV(filterCorrespondingNode, filterCorrespondingNodeProperties);
// add location and provider attribute to the NodeTemplate
filterCorrespondingNode.getOtherAttributes().put(ModelUtilities.NODE_TEMPLATE_REGION, location);
filterCorrespondingNode.getOtherAttributes().put(ModelUtilities.NODE_TEMPLATE_PROVIDER, provider);
}
// add all relations from the substitution fragment to the incomplete topology
for (TRelationshipTemplate relation : substitutionTopology.getRelationshipTemplates()) {
// update source id if it was changed
String sourceId = relation.getSourceElement().getRef().getId();
if (nameMap.containsKey(sourceId)) {
TNodeTemplate nodeTemplate = topology.getNodeTemplate(nameMap.get(sourceId));
if (nodeTemplate != null) {
relation.setSourceNodeTemplate(nodeTemplate);
}
}
// update target id if it was changed
if (nameMap.containsKey(relation.getTargetElement().getRef().getId())) {
relation.setTargetNodeTemplate(topology.getNodeTemplate(nameMap.get(relation.getTargetElement().getRef().getId())));
}
// update id if RelationshipTemplate with same id exists
if (Objects.nonNull(topology.getRelationshipTemplate(relation.getId()))) {
while (Objects.nonNull(topology.getRelationshipTemplate(relation.getId() + "-" + IdCounter))) {
IdCounter++;
}
relation.setId(relation.getId() + "-" + IdCounter);
}
topology.addRelationshipTemplate(relation);
}
return topology;
}
}
// no substitution of data source possible
return null;
}
Aggregations