use of org.eclipse.winery.model.tosca.extensions.OTPatternRefinementModel 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;
}
use of org.eclipse.winery.model.tosca.extensions.OTPatternRefinementModel in project winery by eclipse.
the class PermutationGeneratorTestWithGitBackedRepository method prmWithTwoHostedOnOneTest.
@Test
void prmWithTwoHostedOnOneTest() throws Exception {
this.setRevisionTo("origin/plain");
OTPatternRefinementModel refinementModel = generatePrmWithTwoPatternsHostedOnAThird();
PatternRefinementModelId id = new PatternRefinementModelId(refinementModel.getTargetNamespace(), refinementModel.getIdFromIdOrNameField(), false);
RepositoryFactory.getRepository().setElement(id, refinementModel);
PermutationGenerator generator = new PermutationGenerator();
Map<String, OTTopologyFragmentRefinementModel> permutations = generator.generatePermutations(refinementModel);
assertEquals(6, permutations.size());
OTTopologyFragmentRefinementModel permutation_1 = permutations.get("PrmWithComplexRelationMappings_permutation-1-w1-wip1");
assertNotNull(permutation_1);
assertEquals(3, permutation_1.getDetector().getNodeTemplates().size());
assertEquals(3, permutation_1.getDetector().getRelationshipTemplates().size());
assertTrue(permutation_1.getDetector().getRelationshipTemplates().removeIf(relation -> relation.getSourceElement().getRef().getId().equals("11") && relation.getTargetElement().getRef().getId().equals("2")));
assertTrue(permutation_1.getDetector().getRelationshipTemplates().removeIf(relation -> relation.getSourceElement().getRef().getId().equals("11") && relation.getTargetElement().getRef().getId().equals("3")));
OTTopologyFragmentRefinementModel permutation_2 = permutations.get("PrmWithComplexRelationMappings_permutation-2-w1-wip1");
assertNotNull(permutation_2);
assertEquals(4, permutation_2.getDetector().getNodeTemplates().size());
assertEquals(4, permutation_2.getDetector().getRelationshipTemplates().size());
assertTrue(permutation_2.getDetector().getRelationshipTemplates().removeIf(relation -> relation.getSourceElement().getRef().getId().equals("1") && relation.getTargetElement().getRef().getId().equals("13")));
assertTrue(permutation_2.getDetector().getRelationshipTemplates().removeIf(relation -> relation.getSourceElement().getRef().getId().equals("3") && relation.getTargetElement().getRef().getId().equals("13")));
OTTopologyFragmentRefinementModel permutation_3 = permutations.get("PrmWithComplexRelationMappings_permutation-3-w1-wip1");
assertNotNull(permutation_3);
assertEquals(3, permutation_3.getDetector().getNodeTemplates().size());
assertEquals(3, permutation_3.getDetector().getRelationshipTemplates().size());
assertTrue(permutation_3.getDetector().getRelationshipTemplates().removeIf(relation -> relation.getSourceElement().getRef().getId().equals("12") && relation.getTargetElement().getRef().getId().equals("2")));
assertTrue(permutation_3.getDetector().getRelationshipTemplates().removeIf(relation -> relation.getSourceElement().getRef().getId().equals("1") && relation.getTargetElement().getRef().getId().equals("12")));
OTTopologyFragmentRefinementModel permutation_1_2 = permutations.get("PrmWithComplexRelationMappings_permutation-1-2-w1-wip1");
assertNotNull(permutation_1_2);
assertEquals(4, permutation_1_2.getDetector().getNodeTemplates().size());
assertEquals(4, permutation_1_2.getDetector().getRelationshipTemplates().size());
assertTrue(permutation_1_2.getDetector().getRelationshipTemplates().removeIf(relation -> relation.getSourceElement().getRef().getId().equals("11") && relation.getTargetElement().getRef().getId().equals("13")));
assertTrue(permutation_1_2.getDetector().getRelationshipTemplates().removeIf(relation -> relation.getSourceElement().getRef().getId().equals("11") && relation.getTargetElement().getRef().getId().equals("3")));
assertTrue(permutation_1_2.getDetector().getRelationshipTemplates().removeIf(relation -> relation.getSourceElement().getRef().getId().equals("3") && relation.getTargetElement().getRef().getId().equals("13")));
OTTopologyFragmentRefinementModel permutation_1_3 = permutations.get("PrmWithComplexRelationMappings_permutation-1-3-w1-wip1");
assertNotNull(permutation_1_3);
assertEquals(3, permutation_1_3.getDetector().getNodeTemplates().size());
assertEquals(3, permutation_1_3.getDetector().getRelationshipTemplates().size());
assertTrue(permutation_1_3.getDetector().getRelationshipTemplates().removeIf(relation -> relation.getSourceElement().getRef().getId().equals("11") && relation.getTargetElement().getRef().getId().equals("2")));
assertTrue(permutation_1_3.getDetector().getRelationshipTemplates().removeIf(relation -> relation.getSourceElement().getRef().getId().equals("11") && relation.getTargetElement().getRef().getId().equals("12")));
assertTrue(permutation_1_3.getDetector().getRelationshipTemplates().removeIf(relation -> relation.getSourceElement().getRef().getId().equals("12") && relation.getTargetElement().getRef().getId().equals("2")));
OTTopologyFragmentRefinementModel permutation_2_3 = permutations.get("PrmWithComplexRelationMappings_permutation-2-3-w1-wip1");
assertNotNull(permutation_2_3);
assertEquals(4, permutation_2_3.getDetector().getNodeTemplates().size());
assertEquals(4, permutation_2_3.getDetector().getRelationshipTemplates().size());
assertTrue(permutation_2_3.getDetector().getRelationshipTemplates().removeIf(relation -> relation.getSourceElement().getRef().getId().equals("1") && relation.getTargetElement().getRef().getId().equals("12")));
assertTrue(permutation_2_3.getDetector().getRelationshipTemplates().removeIf(relation -> relation.getSourceElement().getRef().getId().equals("1") && relation.getTargetElement().getRef().getId().equals("13")));
assertTrue(permutation_2_3.getDetector().getRelationshipTemplates().removeIf(relation -> relation.getSourceElement().getRef().getId().equals("12") && relation.getTargetElement().getRef().getId().equals("13")));
}
use of org.eclipse.winery.model.tosca.extensions.OTPatternRefinementModel in project winery by eclipse.
the class PermutationGeneratorTestWithGitBackedRepository method testGeneration.
@Test
void testGeneration() throws Exception {
this.setRevisionTo("origin/plain");
OTPatternRefinementModel refinementModel = generateComplexPrmWithPatternSet();
addAllPermutationMappings(refinementModel);
PatternRefinementModelId id = new PatternRefinementModelId(refinementModel.getTargetNamespace(), refinementModel.getIdFromIdOrNameField(), false);
RepositoryFactory.getRepository().setElement(id, refinementModel);
PermutationGenerator generator = new PermutationGenerator();
Map<String, OTTopologyFragmentRefinementModel> permutations = generator.generatePermutations(refinementModel);
assertEquals(2, permutations.size());
OTTopologyFragmentRefinementModel permutation_1 = permutations.get("ComplexPrmWithPatternSet_permutation-1-w1-wip1");
assertNotNull(permutation_1);
assertEquals(4, permutation_1.getDetector().getNodeTemplates().size());
assertEquals(4, permutation_1.getDetector().getRelationshipTemplates().size());
assertTrue(permutation_1.getDetector().getRelationshipTemplates().removeIf(relation -> "11".equals(relation.getSourceElement().getRef().getId()) && "12".equals(relation.getTargetElement().getRef().getId())));
assertTrue(permutation_1.getDetector().getRelationshipTemplates().removeIf(relation -> "11".equals(relation.getSourceElement().getRef().getId()) && "2".equals(relation.getTargetElement().getRef().getId())));
assertTrue(permutation_1.getDetector().getRelationshipTemplates().removeIf(relation -> "12".equals(relation.getSourceElement().getRef().getId()) && "2".equals(relation.getTargetElement().getRef().getId())));
assertTrue(permutation_1.getDetector().getRelationshipTemplates().removeIf(relation -> "11".equals(relation.getSourceElement().getRef().getId()) && "12".equals(relation.getTargetElement().getRef().getId())));
assertTrue(permutation_1.getDetector().getRelationshipTemplates().removeIf(relation -> "11".equals(relation.getSourceElement().getRef().getId()) && "2".equals(relation.getTargetElement().getRef().getId())));
assertNotNull(permutation_1.getStayMappings());
assertTrue(permutation_1.getStayMappings().removeIf(mapping -> "11".equals(mapping.getDetectorElement().getId()) && "11".equals(mapping.getRefinementElement().getId())));
assertTrue(permutation_1.getStayMappings().removeIf(mapping -> "12".equals(mapping.getDetectorElement().getId()) && "12".equals(mapping.getRefinementElement().getId())));
assertEquals(0, RefinementUtils.getAllMappingsForRefinementNode(permutation_1.getRefinementTopology().getNodeTemplate("11"), permutation_1).size());
assertEquals(0, RefinementUtils.getAllMappingsForRefinementNode(permutation_1.getRefinementTopology().getNodeTemplate("12"), permutation_1).size());
assertEquals(2, RefinementUtils.getAllMappingsForRefinementNode(permutation_1.getRefinementTopology().getNodeTemplate("13"), permutation_1).size());
assertEquals(1, RefinementUtils.getAllMappingsForRefinementNode(permutation_1.getRefinementTopology().getNodeTemplate("14"), permutation_1).size());
assertEquals(3, RefinementUtils.getAllMappingsForRefinementNode(permutation_1.getRefinementTopology().getNodeTemplate("15"), permutation_1).size());
assertEquals(1, RefinementUtils.getAllMappingsForRefinementNode(permutation_1.getRefinementTopology().getNodeTemplate("16"), permutation_1).size());
OTTopologyFragmentRefinementModel permutation_2 = permutations.get("ComplexPrmWithPatternSet_permutation-2-3-w1-wip1");
assertNotNull(permutation_2);
assertEquals(5, permutation_2.getDetector().getNodeTemplates().size());
assertEquals(5, permutation_2.getDetector().getRelationshipTemplates().size());
assertTrue(permutation_2.getDetector().getRelationshipTemplates().removeIf(relation -> "1".equals(relation.getSourceElement().getRef().getId()) && "14".equals(relation.getTargetElement().getRef().getId())));
assertTrue(permutation_2.getDetector().getRelationshipTemplates().removeIf(relation -> "13".equals(relation.getSourceElement().getRef().getId()) && "14".equals(relation.getTargetElement().getRef().getId())));
assertTrue(permutation_2.getDetector().getRelationshipTemplates().removeIf(relation -> "13".equals(relation.getSourceElement().getRef().getId()) && "15".equals(relation.getTargetElement().getRef().getId())));
assertTrue(permutation_2.getDetector().getRelationshipTemplates().removeIf(relation -> "15".equals(relation.getSourceElement().getRef().getId()) && "16".equals(relation.getTargetElement().getRef().getId())));
assertTrue(permutation_2.getDetector().getRelationshipTemplates().removeIf(relation -> "14".equals(relation.getSourceElement().getRef().getId()) && "16".equals(relation.getTargetElement().getRef().getId())));
assertNotNull(permutation_2.getStayMappings());
assertTrue(permutation_2.getStayMappings().removeIf(mapping -> "13".equals(mapping.getDetectorElement().getId()) && "13".equals(mapping.getRefinementElement().getId())));
assertTrue(permutation_2.getStayMappings().removeIf(mapping -> "14".equals(mapping.getDetectorElement().getId()) && "14".equals(mapping.getRefinementElement().getId())));
assertTrue(permutation_2.getStayMappings().removeIf(mapping -> "15".equals(mapping.getDetectorElement().getId()) && "15".equals(mapping.getRefinementElement().getId())));
assertTrue(permutation_2.getStayMappings().removeIf(mapping -> "16".equals(mapping.getDetectorElement().getId()) && "16".equals(mapping.getRefinementElement().getId())));
assertEquals(2, RefinementUtils.getAllMappingsForRefinementNode(permutation_2.getRefinementTopology().getNodeTemplate("11"), permutation_2).size());
assertEquals(2, RefinementUtils.getAllMappingsForRefinementNode(permutation_2.getRefinementTopology().getNodeTemplate("12"), permutation_2).size());
assertEquals(0, RefinementUtils.getAllMappingsForRefinementNode(permutation_2.getRefinementTopology().getNodeTemplate("13"), permutation_2).size());
assertEquals(0, RefinementUtils.getAllMappingsForRefinementNode(permutation_2.getRefinementTopology().getNodeTemplate("14"), permutation_2).size());
assertEquals(0, RefinementUtils.getAllMappingsForRefinementNode(permutation_2.getRefinementTopology().getNodeTemplate("15"), permutation_2).size());
assertEquals(0, RefinementUtils.getAllMappingsForRefinementNode(permutation_2.getRefinementTopology().getNodeTemplate("16"), permutation_2).size());
}
use of org.eclipse.winery.model.tosca.extensions.OTPatternRefinementModel in project winery by eclipse.
the class PermutationGeneratorTest method checkMutabilityOfNotMutablePrmBecauseOfARelationThatCannotBeRedirected.
@Test
void checkMutabilityOfNotMutablePrmBecauseOfARelationThatCannotBeRedirected() {
OTPatternRefinementModel refinementModel = generateComplexPrmWithPatternSet();
addSomePermutationMappings(refinementModel);
PermutationGenerator permutationGenerator = new PermutationGenerator();
assertFalse(permutationGenerator.checkMutability(refinementModel));
assertEquals("There are relations that cannot be redirected during the generation: con-1--2", permutationGenerator.getMutabilityErrorReason());
}
use of org.eclipse.winery.model.tosca.extensions.OTPatternRefinementModel in project winery by eclipse.
the class PermutationGeneratorTest method checkMutabilityOfPrmWithAutomaticallyDeterminableComplexRelationMapping.
@Test
void checkMutabilityOfPrmWithAutomaticallyDeterminableComplexRelationMapping() {
OTPatternRefinementModel refinementModel = generatePrmWithComplexRelationMaps();
PermutationGenerator permutationGenerator = new PermutationGenerator();
assertTrue(permutationGenerator.checkMutability(refinementModel));
assertEquals(2, refinementModel.getPermutationOptions().size());
List<OTPermutationMapping> mappings = refinementModel.getPermutationMappings();
assertEquals(5, mappings.size());
assertTrue(refinementModel.getPermutationMappings().removeIf(permutationMap -> permutationMap.getDetectorElement().getId().equals("1") && permutationMap.getRefinementElement().getId().equals("11")));
assertTrue(refinementModel.getPermutationMappings().removeIf(permutationMap -> permutationMap.getDetectorElement().getId().equals("1") && permutationMap.getRefinementElement().getId().equals("12")));
assertTrue(refinementModel.getPermutationMappings().removeIf(permutationMap -> permutationMap.getDetectorElement().getId().equals("2") && permutationMap.getRefinementElement().getId().equals("13")));
assertTrue(refinementModel.getPermutationMappings().removeIf(permutationMap -> permutationMap.getDetectorElement().getId().equals("2") && permutationMap.getRefinementElement().getId().equals("14")));
assertTrue(refinementModel.getPermutationMappings().removeIf(permutationMap -> permutationMap.getDetectorElement().getId().equals("con-1--2") && permutationMap.getRefinementElement().getId().equals("13")));
}
Aggregations