From 0910584f99e5497431e99f93539724347d2f9317 Mon Sep 17 00:00:00 2001 From: Andreas Bayha <bayha@fortiss.org> Date: Wed, 11 Oct 2023 13:10:21 +0200 Subject: [PATCH] Product-line Analysis: Added support for depending elements Added support for taking into account depending elements from the DependingElementService for the analysis. Issue-ref: 4240 Issue-URL: https://git.fortiss.org/af3/af3/-/issues/4240 Signed-off-by: Andreas Bayha <bayha@fortiss.org> --- .../tooling/ext/variability/analysis/.ratings | 2 +- .../OptimizedProductLineTranslation.java | 53 +++++++++++++++++++ .../org/fortiss/variability/analysis/.ratings | 2 +- .../analysis/EMFProductLineTranslation.java | 8 +-- 4 files changed, 59 insertions(+), 6 deletions(-) diff --git a/org.fortiss.tooling.ext.variability/src/org/fortiss/tooling/ext/variability/analysis/.ratings b/org.fortiss.tooling.ext.variability/src/org/fortiss/tooling/ext/variability/analysis/.ratings index d19cfbc58..d68ae5447 100644 --- a/org.fortiss.tooling.ext.variability/src/org/fortiss/tooling/ext/variability/analysis/.ratings +++ b/org.fortiss.tooling.ext.variability/src/org/fortiss/tooling/ext/variability/analysis/.ratings @@ -1,2 +1,2 @@ OptimizedProductLineAnalysisBase.java 94cb2d0d254f3e50f21ca039b6784e1a26c4d91c YELLOW -OptimizedProductLineTranslation.java fe61d76e7caa9d618c74cb36d6bc7f0c47896b31 YELLOW +OptimizedProductLineTranslation.java ad12974d9e19fc88e3240d6a4c2306004d0a3b39 YELLOW diff --git a/org.fortiss.tooling.ext.variability/src/org/fortiss/tooling/ext/variability/analysis/OptimizedProductLineTranslation.java b/org.fortiss.tooling.ext.variability/src/org/fortiss/tooling/ext/variability/analysis/OptimizedProductLineTranslation.java index fe61d76e7..ad12974d9 100644 --- a/org.fortiss.tooling.ext.variability/src/org/fortiss/tooling/ext/variability/analysis/OptimizedProductLineTranslation.java +++ b/org.fortiss.tooling.ext.variability/src/org/fortiss/tooling/ext/variability/analysis/OptimizedProductLineTranslation.java @@ -15,15 +15,20 @@ +--------------------------------------------------------------------------*/ package org.fortiss.tooling.ext.variability.analysis; +import static org.eclipse.emf.ecore.util.EcoreUtil.copy; import static org.fortiss.tooling.kernel.utils.EcoreUtils.pickFirstInstanceOf; +import static org.fortiss.variability.model.VariabilityModelElementFactory.createAndPC; import java.util.List; +import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EObject; import org.fortiss.tooling.base.model.element.IModelElement; import org.fortiss.tooling.base.model.element.IModelElementSpecification; import org.fortiss.tooling.ext.variability.model.OptionalVariationPointSpecification; +import org.fortiss.tooling.ext.variability.service.IDependingElementProviderService; import org.fortiss.variability.analysis.EMFProductLineTranslation; +import org.fortiss.variability.model.presence.AndPC; import org.fortiss.variability.model.presence.PresenceCondition; import org.fortiss.variability.model.presence.PresenceConditionTerm; @@ -34,6 +39,7 @@ import org.fortiss.variability.model.presence.PresenceConditionTerm; * @author bayha */ public class OptimizedProductLineTranslation extends EMFProductLineTranslation { + /** {@inheritDoc} */ @Override protected PresenceConditionTerm getLocalPresenceCondition(EObject model) { @@ -60,4 +66,51 @@ public class OptimizedProductLineTranslation extends EMFProductLineTranslation { return null; } + + /** {@inheritDoc} */ + @Override + protected void collectEObject(EObject eo, EClass cls, PresenceConditionTerm pc) { + class2TranslatedEObjects.add(cls, eo); + + collectPresenceCondition(eo, pc); + + // Also collect depending elements for the tooling kernel implementation + List<EObject> dependingElements = + IDependingElementProviderService.getInstance().getDependingElements(eo); + for(EObject depObj : dependingElements) { + PresenceConditionTerm depObjPC = getLocalPresenceCondition(depObj); + + if(depObjPC != null) { + depObjPC = createAndPC(copy(depObjPC), copy(pc), ""); + } else { + depObjPC = pc; + } + + collectEObject(depObj, getTranslatedClass(depObj.eClass()), depObjPC); + } + } + + /** + * Accumulates the given presence condition by conjugating it. This is necessary in case an + * element "inherits" more than one presence conditions due to dependencies from other elements. + */ + private PresenceConditionTerm collectPresenceCondition(EObject eObject, + PresenceConditionTerm pc) { + PresenceConditionTerm oldPC = object2presenceCondition.get(eObject); + + if(oldPC != null) { + if(pc != null) { + AndPC newPC = createAndPC(copy(oldPC), copy(pc), ""); + + object2presenceCondition.put(eObject, newPC); + return newPC; + } + + object2presenceCondition.put(eObject, oldPC); + return oldPC; + } + + object2presenceCondition.put(eObject, pc); + return pc; + } } diff --git a/org.fortiss.variability/src/org/fortiss/variability/analysis/.ratings b/org.fortiss.variability/src/org/fortiss/variability/analysis/.ratings index 0163adc0f..ef9cbd9af 100644 --- a/org.fortiss.variability/src/org/fortiss/variability/analysis/.ratings +++ b/org.fortiss.variability/src/org/fortiss/variability/analysis/.ratings @@ -1,6 +1,6 @@ BucketSetMap.java 665a28c80a9693b9b9e31b7ebe59f2de4195d56c YELLOW DualKeyMap.java 75fbe85a54e5a655aaf67108ae004f98ed2879d8 YELLOW -EMFProductLineTranslation.java c63af9719c1ca45a034ec5beb48e1b35971e40c4 YELLOW +EMFProductLineTranslation.java a62c588bd806fdf98d1e2fb4138c359528edcaad YELLOW GenericProductLineAnalysis.java 6f6d48544ec2b872fa0a4f747a85657889ad463e YELLOW IProductLineConstraint.java 1b0e1231cc578a6e7e544441ac33533b4feafeb1 YELLOW IProductLineTranslation.java 733dae03e2baae237b6f0b33f0dd618a4f47cf73 YELLOW diff --git a/org.fortiss.variability/src/org/fortiss/variability/analysis/EMFProductLineTranslation.java b/org.fortiss.variability/src/org/fortiss/variability/analysis/EMFProductLineTranslation.java index c63af9719..a62c588bd 100644 --- a/org.fortiss.variability/src/org/fortiss/variability/analysis/EMFProductLineTranslation.java +++ b/org.fortiss.variability/src/org/fortiss/variability/analysis/EMFProductLineTranslation.java @@ -131,7 +131,7 @@ public class EMFProductLineTranslation implements IProductLineTranslation { /* Model related fields */ /** The mapping of translated {@link EClass} to the objects that have been collected. */ - private BucketSetMap<EClass, EObject> class2TranslatedEObjects; + protected BucketSetMap<EClass, EObject> class2TranslatedEObjects; /** * Mapping of objects with types to their translated Z3 expressions. The second key EClass is @@ -164,7 +164,7 @@ public class EMFProductLineTranslation implements IProductLineTranslation { private Map<AbstractFeature, BoolExpr> feature2BoolExpr; /** The mapping of translated {@link EObject}s to global {@link PresenceCondition}s. */ - private Map<EObject, PresenceConditionTerm> object2presenceCondition; + protected Map<EObject, PresenceConditionTerm> object2presenceCondition; /** Mapping of classes to the selection function for this type. */ private Map<EClass, FuncDecl<?>> eClass2SelectionFunction; @@ -331,7 +331,7 @@ public class EMFProductLineTranslation implements IProductLineTranslation { } /** Collect one EObject to be translated. */ - private void collectEObject(EObject eo, EClass cls, PresenceConditionTerm pc) { + protected void collectEObject(EObject eo, EClass cls, PresenceConditionTerm pc) { class2TranslatedEObjects.add(cls, eo); object2presenceCondition.put(eo, pc); @@ -1033,7 +1033,7 @@ public class EMFProductLineTranslation implements IProductLineTranslation { * in case objClass shall be translated. 'null' in case neither objClass nor a super type are * specified to be translated. */ - private EClass getTranslatedClass(EClass objClass) { + protected EClass getTranslatedClass(EClass objClass) { if(translatedClasses.contains(objClass)) { return objClass; } -- GitLab