From ac9753f41e5a34bafa42b9c3975931e2d5b27f85 Mon Sep 17 00:00:00 2001
From: Andreas Bayha <bayha@fortiss.org>
Date: Tue, 29 Aug 2023 17:55:49 +0200
Subject: [PATCH] YELLOW

Issue-ref: 4240
Issue-URL: https://git.fortiss.org/af3/af3/-/issues/4240

Signed-off-by: Andreas Bayha <bayha@fortiss.org>
---
 .../org/fortiss/variability/analysis/.ratings |  2 +-
 .../analysis/EMFProductLineTranslation.java   | 48 ++++++++-----------
 2 files changed, 22 insertions(+), 28 deletions(-)

diff --git a/org.fortiss.variability/src/org/fortiss/variability/analysis/.ratings b/org.fortiss.variability/src/org/fortiss/variability/analysis/.ratings
index 4ccee4fa5..0163adc0f 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 343224462f35bf0b7300cf32743e4be11fee1ee6 YELLOW
+EMFProductLineTranslation.java c63af9719c1ca45a034ec5beb48e1b35971e40c4 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 343224462..c63af9719 100644
--- a/org.fortiss.variability/src/org/fortiss/variability/analysis/EMFProductLineTranslation.java
+++ b/org.fortiss.variability/src/org/fortiss/variability/analysis/EMFProductLineTranslation.java
@@ -145,7 +145,17 @@ public class EMFProductLineTranslation implements IProductLineTranslation {
 	 */
 	private Map<Expr<?>, EObject> z3Expr2EObject;
 
-	private Map<EObject, Map<EReference, Set<EObject>>> eObject2referencingEObjects;
+	/**
+	 * Maps {@link EObject}s to all incoming references with their source objects each.
+	 * 
+	 * The following example EObjects and EReferences...
+	 * srcObj1 --ref1--> trgObj1 <--ref1-- srcObj2
+	 * 
+	 * ...will be contained here as:
+	 * trgObj1 -> ( ref1 -> {srcObj1, srcObj2})
+	 * 
+	 */
+	private Map<EObject, BucketSetMap<EReference, EObject>> eObject2referencingEObjects;
 
 	/* Variability related fields */
 	/** The {@link AbstractFeatureModel} collected by this translation */
@@ -194,28 +204,15 @@ public class EMFProductLineTranslation implements IProductLineTranslation {
 		eObject2z3Expr = new DualKeyMap<EObject, EClass, Expr<?>>();
 		z3Expr2EObject = new HashMap<Expr<?>, EObject>();
 
-		eObject2referencingEObjects = new HashMap<EObject, Map<EReference, Set<EObject>>>() {
+		eObject2referencingEObjects = new HashMap<EObject, BucketSetMap<EReference, EObject>>() {
 			/** {@inheritDoc} */
 			@Override
-			public Map<EReference, Set<EObject>> get(Object key1) {
-				Map<EReference, Set<EObject>> retMap = super.get(key1);
+			public BucketSetMap<EReference, EObject> get(Object key1) {
+				BucketSetMap<EReference, EObject> retMap = super.get(key1);
 
+				// In case the bucket map does not yet exist, it is initialized, here.
 				if(retMap == null) {
-					retMap = new HashMap<EReference, Set<EObject>>() {
-						/** {@inheritDoc} */
-						@Override
-						public Set<EObject> get(Object key) {
-							Set<EObject> retSet = super.get(key);
-
-							if(retSet == null) {
-								retSet = new HashSet<EObject>();
-
-								super.put((EReference)key, retSet);
-							}
-
-							return retSet;
-						}
-					};
+					retMap = new BucketSetMap<EReference, EObject>();
 					super.put((EObject)key1, retMap);
 				}
 
@@ -240,7 +237,6 @@ public class EMFProductLineTranslation implements IProductLineTranslation {
 		initialize();
 
 		// Reference types need to be collected first, since they are required by optimizations in
-		// collectTranslatedObjects().
 		collectReferenceTypes();
 		collectTranslatedObjects(model, null);
 
@@ -248,8 +244,6 @@ public class EMFProductLineTranslation implements IProductLineTranslation {
 			collectReferencedIslandObjects();
 		}
 
-		translateFeatureModel();
-
 		// Metamodel translation
 		translateClassesMetamodel();
 		translateAttributesAndReferencesMetamodel();
@@ -258,6 +252,7 @@ public class EMFProductLineTranslation implements IProductLineTranslation {
 		translateObjects();
 
 		// Translate variability
+		translateFeatureModel();
 		translatePresenceConditions();
 	}
 
@@ -347,11 +342,9 @@ public class EMFProductLineTranslation implements IProductLineTranslation {
 		for(EReference ref : refSource.eClass().getEAllReferences()) {
 			if(translatedReferences.contains(ref)) {
 				EObject refTarget = (EObject)refSource.eGet(ref);
-				Map<EReference, Set<EObject>> referencingObj =
+				BucketSetMap<EReference, EObject> referencingObj =
 						eObject2referencingEObjects.get(refTarget);
-				Set<EObject> refSet = referencingObj.get(ref);
-
-				refSet.add(refSource);
+				referencingObj.add(ref, refSource);
 			}
 		}
 	}
@@ -388,7 +381,8 @@ public class EMFProductLineTranslation implements IProductLineTranslation {
 		}
 
 		// Collect incoming references
-		Map<EReference, Set<EObject>> incomingReferences = eObject2referencingEObjects.get(model);
+		BucketSetMap<EReference, EObject> incomingReferences =
+				eObject2referencingEObjects.get(model);
 		for(EReference ref : incomingReferences.keySet()) {
 			for(EObject srcObj : incomingReferences.get(ref)) {
 				EClass srcObjTransClass = getTranslatedClass(srcObj.eClass());
-- 
GitLab