use of org.eclipse.winery.model.tosca.extensions.OTPrmMapping in project winery by eclipse.
the class PermutationGenerator method chekMutabilityOfDetectorRelations.
private List<String> chekMutabilityOfDetectorRelations(OTTopologyFragmentRefinementModel refinementModel) {
List<String> unmappableRelationIds = new ArrayList<>();
// try to generate permutation maps.
for (TNodeTemplate detectorNode : refinementModel.getDetector().getNodeTemplates()) {
List<TRelationshipTemplate> unMappableRelations = ModelUtilities.getIncomingRelationshipTemplates(refinementModel.getDetector(), detectorNode).stream().filter(relation -> !permutabilityMappingExistsForDetectorElement(relation, refinementModel)).collect(Collectors.toList());
for (TRelationshipTemplate unmappable : unMappableRelations) {
logger.info("Checking unmapped relation \"{}\"", unmappable.getId());
// If the relation exists between two components in a component set we ignore it, as there is no
// case in which the relation has to be redirected while creating a permutation.
boolean unmappableRelationExists = refinementModel.getComponentSets().stream().noneMatch(componentSet -> componentSet.getValues().containsAll(Arrays.asList(unmappable.getSourceElement().getRef().getId(), unmappable.getTargetElement().getRef().getId())));
if (unmappableRelationExists) {
// If there is only one permutation mapping sourcing from the current detector node,
// the relation can be redirected directly to the corresponding refinement node.
// If there are multiple permutations mappings sourcing from the relation's source detector node,
// do crazy shit: If the corresponding refinement nodes of the relation's source have relations
// that point to the same node that can be mapped to the current detector node (except for
// relations among each other), the relation can be redirected to this node.
TNodeTemplate source = (TNodeTemplate) unmappable.getSourceElement().getRef();
List<TNodeTemplate> nodesTheSourceRefinesTo = getStayAndPermutationMappings(refinementModel).stream().filter(pm -> pm.getDetectorElement().getId().equals(source.getId())).map(OTPrmMapping::getRefinementElement).filter(element -> element instanceof TNodeTemplate).map(element -> (TNodeTemplate) element).distinct().collect(Collectors.toList());
Set<TNodeTemplate> nodesTheRefinementNodesAreDependingOn = new HashSet<>();
nodesTheSourceRefinesTo.forEach(node -> nodesTheRefinementNodesAreDependingOn.addAll(ModelUtilities.getOutgoingRelationshipTemplates(refinementModel.getRefinementStructure(), node).stream().map(outgoing -> outgoing.getTargetElement().getRef()).filter(target -> target instanceof TNodeTemplate).map(target -> (TNodeTemplate) target).filter(target -> refinementModel.getPermutationMappings().stream().anyMatch(pm -> pm.getRefinementElement().getId().equals(target.getId()) && pm.getDetectorElement().getId().equals(detectorNode.getId()))).collect(Collectors.toList())));
// respective target of the relation automatically.
if (nodesTheRefinementNodesAreDependingOn.size() == 1) {
TNodeTemplate target = nodesTheRefinementNodesAreDependingOn.iterator().next();
logger.info("Found possibility to redirect relation \"{}\" to refinement node \"{}\"", unmappable.getId(), target.getId());
addMutabilityMapping(unmappable, target, refinementModel);
unmappableRelationExists = false;
}
} else {
logger.info("Relation \"{}\" is part of a component set", unmappable.getId());
}
if (unmappableRelationExists) {
unmappableRelationIds.add(unmappable.getId());
}
}
}
return unmappableRelationIds;
}
use of org.eclipse.winery.model.tosca.extensions.OTPrmMapping in project winery by eclipse.
the class RefinementTopologyTemplateResource method createRelationshipsForMappings.
/**
* convert mappings into Relationship for use in grafic prm modeling
*/
private void createRelationshipsForMappings(OTRefinementModel refinementModel) {
for (OTPrmMapping mapping : getAllMappings(refinementModel)) {
TRelationshipTemplate.Builder builder = new TRelationshipTemplate.Builder("con_" + mapping.getId(), QName.valueOf("{http://opentosca.org/prmMappingTypes}" + mapping.getId().substring(0, mapping.getId().indexOf("_"))), new TNodeTemplate(mapping.getDetectorElement().getId()), new TNodeTemplate(mapping.getRefinementElement().getId()));
if (mapping instanceof OTPermutationMapping) {
builder.setName("PermutationMapping");
}
if (mapping instanceof OTRelationMapping) {
builder.setName("RelationshipMapping");
LinkedHashMap<String, String> kvproperties = new LinkedHashMap<>();
kvproperties.put("direction", ((OTRelationMapping) mapping).getDirection().value());
kvproperties.put("applicableRelationshipType", ((OTRelationMapping) mapping).getRelationType().toString());
kvproperties.put("validEndpointType", ((OTRelationMapping) mapping).getValidSourceOrTarget().toString());
TEntityTemplate.WineryKVProperties properties = new TEntityTemplate.WineryKVProperties();
properties.setKVProperties(kvproperties);
builder.setProperties(properties);
}
if (mapping instanceof OTStayMapping) {
builder.setName("StayMapping");
}
if (mapping instanceof OTAttributeMapping) {
builder.setName("AttributeMapping");
LinkedHashMap<String, String> kvproperties = new LinkedHashMap<>();
kvproperties.put("type", ((OTAttributeMapping) mapping).getType().value());
kvproperties.put("detectorProperty", ((OTAttributeMapping) mapping).getDetectorProperty());
kvproperties.put("refinementProperty", ((OTAttributeMapping) mapping).getRefinementProperty());
TEntityTemplate.WineryKVProperties properties = new TEntityTemplate.WineryKVProperties();
properties.setKVProperties(kvproperties);
builder.setProperties(properties);
}
if (mapping instanceof OTDeploymentArtifactMapping) {
builder.setName("DeploymentArtifactMapping");
LinkedHashMap<String, String> kvproperties = new LinkedHashMap<>();
kvproperties.put("requiredDeploymentArtifactType", ((OTDeploymentArtifactMapping) mapping).getArtifactType().toString());
TEntityTemplate.WineryKVProperties properties = new TEntityTemplate.WineryKVProperties();
properties.setKVProperties(kvproperties);
builder.setProperties(properties);
}
if (mapping instanceof OTBehaviorPatternMapping) {
builder.setName("BehaviorPatternMapping");
LinkedHashMap<String, String> kvproperties = new LinkedHashMap<>();
kvproperties.put("refinementProperty", ((OTBehaviorPatternMapping) mapping).getProperty().getKey());
kvproperties.put("refinementPropertyValue", ((OTBehaviorPatternMapping) mapping).getProperty().getValue());
kvproperties.put("behaviorPattern", ((OTBehaviorPatternMapping) mapping).getBehaviorPattern());
TEntityTemplate.WineryKVProperties properties = new TEntityTemplate.WineryKVProperties();
properties.setKVProperties(kvproperties);
builder.setProperties(properties);
}
TRelationshipTemplate templateForMapping = new TRelationshipTemplate(builder);
prmModellingTopologyTemplate.addRelationshipTemplate(templateForMapping);
}
}
use of org.eclipse.winery.model.tosca.extensions.OTPrmMapping in project winery by eclipse.
the class PermutationGenerator method generatePermutations.
public Map<String, OTTopologyFragmentRefinementModel> generatePermutations(OTTopologyFragmentRefinementModel refinementModel) {
Map<String, OTTopologyFragmentRefinementModel> permutations = new HashMap<>();
IRepository repository = RepositoryFactory.getRepository();
if (!checkMutability(refinementModel)) {
throw new RuntimeException("The refinement model cannot be permuted!");
}
QName refinementModelQName = new QName(refinementModel.getTargetNamespace(), refinementModel.getName());
DefinitionsChildId refinementModelId = new TopologyFragmentRefinementModelId(refinementModelQName);
if (refinementModel instanceof OTPatternRefinementModel) {
refinementModelId = new PatternRefinementModelId(refinementModelQName);
}
for (OTStringList options : refinementModel.getPermutationOptions()) {
String permutationName = VersionSupport.getNewComponentVersionId(refinementModelId, "permutation-" + String.join("-", options.getValues()).replaceAll("_", "-"));
QName permutationQName = new QName(refinementModel.getTargetNamespace(), permutationName);
DefinitionsChildId permutationModelId = new TopologyFragmentRefinementModelId(permutationQName);
if (refinementModel instanceof OTPatternRefinementModel) {
permutationModelId = new PatternRefinementModelId(permutationQName);
}
try {
// To ensure that the permutationMaps are duplicated correctly, save the permutation first
repository.setElement(refinementModelId, refinementModel);
repository.setElement(permutationModelId, refinementModel);
} catch (IOException e) {
logger.error("Error while creating permutation!", e);
break;
}
OTTopologyFragmentRefinementModel permutation = repository.getElement(permutationModelId);
permutation.setName(permutationName);
permutations.put(permutationName, permutation);
Map<String, String> alreadyAdded = new HashMap<>();
for (String option : options.getValues()) {
permutation.getPermutationMappings().stream().filter(permutationMap -> permutationMap.getDetectorElement().getId().equals(option)).map(OTPrmMapping::getRefinementElement).filter(refinementElement -> refinementElement instanceof TNodeTemplate).map(refinementElement -> (TNodeTemplate) refinementElement).forEach(refinementElement -> {
TNodeTemplate addedDetectorElement = alreadyAdded.containsKey(refinementElement.getId()) ? permutation.getDetector().getNodeTemplate(alreadyAdded.get(refinementElement.getId())) : addNodeFromRefinementStructureToDetector(refinementElement, permutation, alreadyAdded);
// region outgoing relations of the currently permuted refinementElement
ModelUtilities.getOutgoingRelationshipTemplates(permutation.getRefinementStructure(), refinementElement).forEach(relation -> {
// Using the permutation maps defined in the original model as we remove them in the permutation
refinementModel.getPermutationMappings().stream().filter(permutationMap -> permutationMap.getRefinementElement().getId().equals(relation.getTargetElement().getRef().getId())).filter(permutationMap -> permutationMap.getDetectorElement() instanceof TNodeTemplate).forEach(permutationMap -> {
// to be mutated, add it the component and create the relation.
if (permutationMap.getDetectorElement().getId().equals(option) || options.getValues().contains(permutationMap.getDetectorElement().getId())) {
String alreadyAddedElement = alreadyAdded.get(relation.getTargetElement().getRef().getId());
TNodeTemplate target = alreadyAddedElement == null ? addNodeFromRefinementStructureToDetector((TNodeTemplate) relation.getTargetElement().getRef(), permutation, alreadyAdded) : permutation.getDetector().getNodeTemplate(alreadyAddedElement);
ModelUtilities.createRelationshipTemplateAndAddToTopology(addedDetectorElement, target, relation.getType(), permutation.getDetector());
} else if (!options.getValues().contains(permutationMap.getDetectorElement().getId())) {
// Else if the target is part of the detector, add the relation between the
// added element and the detector element.
// No need to check instance of again, as we filter them in line 383.
TNodeTemplate target = (TNodeTemplate) permutationMap.getDetectorElement();
ModelUtilities.createRelationshipTemplateAndAddToTopology(addedDetectorElement, target, relation.getType(), permutation.getDetector());
}
});
});
// region handle ingoing relations in the detector
for (TRelationshipTemplate relation : permutation.getDetector().getRelationshipTemplates()) {
if (relation.getTargetElement().getRef().getId().equals(option)) {
Optional<OTPermutationMapping> relationTarget = permutation.getPermutationMappings().stream().filter(permutationMap -> permutationMap.getDetectorElement().getId().equals(relation.getId())).filter(permutationMap -> permutationMap.getRefinementElement().getId().equals(refinementElement.getId())).findFirst();
long refinementEquivalents = permutation.getPermutationMappings().stream().filter(permutationMap -> permutationMap.getDetectorElement().getId().equals(option)).map(OTPrmMapping::getRefinementElement).distinct().count();
if (relationTarget.isPresent() || refinementEquivalents == 1) {
ModelUtilities.createRelationshipTemplateAndAddToTopology((TNodeTemplate) relation.getSourceElement().getRef(), addedDetectorElement, relation.getType(), permutation.getDetector());
}
}
}
// endregion
});
// region remove permuted
if (permutation.getAttributeMappings() != null) {
permutation.getRelationMappings().removeIf(map -> map.getDetectorElement().getId().equals(option));
}
if (permutation.getAttributeMappings() != null) {
permutation.getAttributeMappings().removeIf(map -> map.getDetectorElement().getId().equals(option));
}
if (permutation.getDeploymentArtifactMappings() != null) {
permutation.getDeploymentArtifactMappings().removeIf(map -> map.getDetectorElement().getId().equals(option));
}
permutation.getPermutationMappings().removeIf(permMap -> permMap.getDetectorElement().getId().equals(option) || permMap.getDetectorElement() instanceof TRelationshipTemplate && (((TRelationshipTemplate) permMap.getDetectorElement()).getSourceElement().getRef().getId().equals(option) || ((TRelationshipTemplate) permMap.getDetectorElement()).getTargetElement().getRef().getId().equals(option)));
permutation.getDetector().getNodeTemplateOrRelationshipTemplate().removeIf(template -> template instanceof TRelationshipTemplate && (((TRelationshipTemplate) template).getSourceElement().getRef().getId().equals(option) || ((TRelationshipTemplate) template).getTargetElement().getRef().getId().equals(option)) || template.getId().equals(option));
// endregion
}
try {
RepositoryFactory.getRepository().setElement(permutationModelId, permutation);
} catch (IOException e) {
logger.error("Error while saving permutation!", e);
break;
}
}
return permutations;
}
Aggregations