use of org.eclipse.winery.model.tosca.extensions.OTStringList in project winery by eclipse.
the class PermutationGeneratorTest method checkSimpleMutabilityTest.
@Test
void checkSimpleMutabilityTest() {
setUp();
PermutationGenerator permutationGenerator = new PermutationGenerator();
OTTopologyFragmentRefinementModel refinementModel = (OTTopologyFragmentRefinementModel) candidateForTopology3WithDa.getRefinementModel();
assertTrue(permutationGenerator.checkMutability(refinementModel));
List<OTStringList> options = refinementModel.getPermutationOptions();
assertNotNull(options);
assertEquals(2, options.size());
options.forEach(permutationOption -> assertEquals(1, permutationOption.getValues().size()));
}
use of org.eclipse.winery.model.tosca.extensions.OTStringList in project winery by eclipse.
the class PermutationGenerator method checkMutability.
public boolean checkMutability(OTTopologyFragmentRefinementModel refinementModel) {
logger.info("Starting mutability check of {}", refinementModel.getIdFromIdOrNameField());
this.mutabilityErrorReason = "";
List<TNodeTemplate> detectorNodeTemplates = refinementModel.getDetector().getNodeTemplates();
Set<TNodeTemplate> mutableNodes = detectorNodeTemplates.stream().filter(nodeTemplate -> !isStayPlaceholder(nodeTemplate, refinementModel)).collect(Collectors.toSet());
List<OTStringList> permutationOptions = new ArrayList<>();
refinementModel.setPermutationOptions(permutationOptions);
Sets.powerSet(mutableNodes).stream().filter(set -> !(set.size() == 0 || set.size() == mutableNodes.size())).forEach(permutation -> permutationOptions.add(new OTStringList(permutation.stream().map(HasId::getId).collect(Collectors.toList()))));
refinementModel.setComponentSets(new ArrayList<>());
for (TNodeTemplate detectorNode : detectorNodeTemplates) {
getAllMappingsForDetectorNode(detectorNode, refinementModel).stream().filter(mapping -> mapping.getRefinementElement() instanceof TNodeTemplate).map(mapping -> (TNodeTemplate) mapping.getRefinementElement()).forEach(refinementNode -> this.checkComponentMutability(refinementNode, detectorNode, refinementModel));
ModelUtilities.getIncomingRelationshipTemplates(refinementModel.getDetector(), detectorNode).stream().filter(relation -> refinementModel.getComponentSets().stream().noneMatch(setList -> setList.getValues().contains(relation.getTargetElement().getRef().getId()) && setList.getValues().contains(relation.getSourceElement().getRef().getId()))).forEach(relation -> {
TNodeTemplate dependantNode = (TNodeTemplate) relation.getSourceElement().getRef();
if (refinementModel.getRelationMappings() != null) {
refinementModel.getRelationMappings().stream().filter(relMap -> relMap.getDetectorElement().equals(dependantNode)).filter(relMap -> RefinementUtils.canRedirectRelation(relMap, relation, this.relationshipTypes, this.nodeTypes)).findFirst().ifPresent(relMap -> addMutabilityMapping(relMap.getDetectorElement(), relMap.getRefinementElement(), refinementModel));
}
});
}
if (refinementModel.getPermutationMappings() == null) {
this.mutabilityErrorReason = "No permutation mappings could be identified";
logger.info(this.errorMessage, this.mutabilityErrorReason);
return false;
}
List<String> unmappedDetectorNodes = refinementModel.getDetector().getNodeTemplates().stream().filter(detectorNode -> !isStayPlaceholder(detectorNode, refinementModel)).filter(detectorNode -> !permutabilityMappingExistsForDetectorElement(detectorNode, refinementModel)).map(HasId::getId).collect(Collectors.toList());
if (unmappedDetectorNodes.size() > 0) {
this.mutabilityErrorReason = "There are detector nodes which could not be mapped to a refinement node: " + String.join(", ", unmappedDetectorNodes);
logger.info(this.errorMessage, this.mutabilityErrorReason);
return false;
}
List<String> unmappedRefinementNodes = refinementModel.getRefinementStructure().getNodeTemplates().stream().filter(refinementNode -> !isStayingRefinementElement(refinementNode, refinementModel)).filter(refinementNode -> !permutabilityMappingExistsForRefinementNode(refinementNode, refinementModel)).map(HasId::getId).collect(Collectors.toList());
if (unmappedRefinementNodes.size() > 0) {
this.mutabilityErrorReason = "There are refinement nodes which could not be mapped to a detector node: " + String.join(", ", unmappedRefinementNodes);
logger.info(this.errorMessage, this.mutabilityErrorReason);
return false;
}
List<String> unmappableRelationIds = chekMutabilityOfDetectorRelations(refinementModel);
if (unmappableRelationIds.size() > 0) {
this.mutabilityErrorReason = "There are relations that cannot be redirected during the generation: " + String.join(", ", unmappableRelationIds);
logger.info(this.errorMessage, this.mutabilityErrorReason);
return false;
}
return true;
}
use of org.eclipse.winery.model.tosca.extensions.OTStringList 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