Merge "Variability: decouple wrapper layer from UI+fix in interpreter"
diff --git a/plugins/variability/org.eclipse.emf.henshin.variability.configuration/src/configuration/impl/ConfigurationImpl.java b/plugins/variability/org.eclipse.emf.henshin.variability.configuration/src/configuration/impl/ConfigurationImpl.java
index fff32ee..c26b84b 100644
--- a/plugins/variability/org.eclipse.emf.henshin.variability.configuration/src/configuration/impl/ConfigurationImpl.java
+++ b/plugins/variability/org.eclipse.emf.henshin.variability.configuration/src/configuration/impl/ConfigurationImpl.java
@@ -19,8 +19,8 @@
 import org.eclipse.emf.henshin.model.Rule;
 import org.eclipse.emf.henshin.variability.wrapper.VariabilityConstants;
 import org.eclipse.emf.henshin.variability.wrapper.VariabilityFactory;
+import org.eclipse.emf.henshin.variability.wrapper.VariabilityHelper;
 import org.eclipse.emf.henshin.variability.wrapper.VariabilityRule;
-import org.eclipse.emf.henshin.variability.wrapper.VariabilityTransactionHelper;
 
 import configuration.Configuration;
 import configuration.ConfigurationFactory;
@@ -209,7 +209,7 @@
 		} else {
 			featureAnnotationValue += feature.getName();
 		}
-		VariabilityTransactionHelper.setAnnotationValue(rule, VariabilityConstants.FEATURES, featureAnnotationValue);
+		VariabilityHelper.setAnnotationValue(rule, VariabilityConstants.FEATURES, featureAnnotationValue);
 		enableContentAdapter();
 		return features.add(feature);
 	}
@@ -246,7 +246,7 @@
 			if (annotationFeatures.size() > 1) {
 				featureAnnotationValue = featureAnnotationValue.substring(0, featureAnnotationValue.length() - 2);
 			}
-			VariabilityTransactionHelper.setAnnotationValue(rule, VariabilityConstants.FEATURES, featureAnnotationValue);
+			VariabilityHelper.setAnnotationValue(rule, VariabilityConstants.FEATURES, featureAnnotationValue);
 			enableContentAdapter();
 			return features.remove(feature);
 		} else {
diff --git a/plugins/variability/org.eclipse.emf.henshin.variability/src/org/eclipse/emf/henshin/variability/VarRuleApplicationImpl.java b/plugins/variability/org.eclipse.emf.henshin.variability/src/org/eclipse/emf/henshin/variability/VarRuleApplicationImpl.java
index 9744245..6c54a3b 100644
--- a/plugins/variability/org.eclipse.emf.henshin.variability/src/org/eclipse/emf/henshin/variability/VarRuleApplicationImpl.java
+++ b/plugins/variability/org.eclipse.emf.henshin.variability/src/org/eclipse/emf/henshin/variability/VarRuleApplicationImpl.java
@@ -13,8 +13,8 @@
 import org.eclipse.emf.henshin.interpreter.impl.MatchImpl;
 import org.eclipse.emf.henshin.interpreter.impl.RuleApplicationImpl;
 import org.eclipse.emf.henshin.model.Rule;
-import org.eclipse.emf.henshin.variability.matcher.VariabilityAwareMatch;
 import org.eclipse.emf.henshin.variability.matcher.VariabilityAwareEngine;
+import org.eclipse.emf.henshin.variability.matcher.VariabilityAwareMatch;
 import org.eclipse.emf.henshin.variability.util.RuleUtil;
 
 /**
@@ -31,6 +31,7 @@
 	public VarRuleApplicationImpl(Engine engine, EGraph graph, Rule rule, Assignment partialMatch) {
 		super(engine, graph, rule, partialMatch);
 		this.completeVarMatch = null;
+		this.configuration = new HashMap<String,Boolean>();
 	}
 
 	/**
@@ -92,7 +93,6 @@
 					try {
 						List<String> initiallyTrue = configuration.keySet().stream().filter(s -> configuration.get(s) == true).collect(Collectors.toList());
 						List<String> initiallyFalse = configuration.keySet().stream().filter(s -> configuration.get(s) == false).collect(Collectors.toList());
-						System.out.println(initiallyTrue);
 						vbEngine = new VariabilityAwareEngine((Rule) unit, graph, initiallyTrue, initiallyFalse);
 					} catch (InconsistentRuleException e) {
 						return false;
diff --git a/plugins/variability/org.eclipse.emf.henshin.variability/src/org/eclipse/emf/henshin/variability/matcher/RulePreparator.java b/plugins/variability/org.eclipse.emf.henshin.variability/src/org/eclipse/emf/henshin/variability/matcher/RulePreparator.java
index 580e131..c4c5083 100644
--- a/plugins/variability/org.eclipse.emf.henshin.variability/src/org/eclipse/emf/henshin/variability/matcher/RulePreparator.java
+++ b/plugins/variability/org.eclipse.emf.henshin.variability/src/org/eclipse/emf/henshin/variability/matcher/RulePreparator.java
@@ -27,7 +27,6 @@
 import org.eclipse.emf.henshin.variability.matcher.VariabilityAwareEngine.RuleInfo;
 import org.eclipse.emf.henshin.variability.wrapper.VariabilityFactory;
 import org.eclipse.emf.henshin.variability.wrapper.VariabilityGraphElement;
-import org.eclipse.emf.henshin.variability.wrapper.VariabilityNode;
 
 import aima.core.logic.propositional.parsing.ast.Sentence;
 
@@ -115,7 +114,11 @@
 	private void fillMaps(RuleInfo ruleInfo, Set<Sentence> rejected) {
 		
 		for (Sentence expr : rejected) {
-			for (GraphElement ge : ruleInfo.getPc2Elem().get(expr)) {
+			Set<GraphElement> elements = ruleInfo.getPc2Elem().get(expr);
+			if (elements == null)
+				continue;
+			
+			for (GraphElement ge : elements) {
 				boolean geIsVariabilityAware = ge instanceof VariabilityGraphElement;
 				
 				if (ge instanceof Node) {
diff --git a/plugins/variability/org.eclipse.emf.henshin.variability/src/org/eclipse/emf/henshin/variability/matcher/VariabilityAwareEngine.java b/plugins/variability/org.eclipse.emf.henshin.variability/src/org/eclipse/emf/henshin/variability/matcher/VariabilityAwareEngine.java
index ce4d273..e801464 100644
--- a/plugins/variability/org.eclipse.emf.henshin.variability/src/org/eclipse/emf/henshin/variability/matcher/VariabilityAwareEngine.java
+++ b/plugins/variability/org.eclipse.emf.henshin.variability/src/org/eclipse/emf/henshin/variability/matcher/VariabilityAwareEngine.java
@@ -102,7 +102,7 @@
 		this.initiallyFalseFeatures = initiallyFalse;
 		
 		if (!ruleInfoRegistry.containsKey(rule))
-			ruleInfoRegistry.put(rule, new RuleInfo(rule, initiallyTrue, initiallyFalse));
+			ruleInfoRegistry.put(rule, new RuleInfo(rule));
 		this.ruleInfo = ruleInfoRegistry.get(rule);
 		populateExpressionMap();
 	}
@@ -134,7 +134,7 @@
 		
 		// Remove everything except for the base rule
 		Set<Sentence> nonTauotologies = getNonTautologies(mo);
-		BitSet bs = rulePreparator.prepare(ruleInfo, nonTauotologies, rule.isInjectiveMatching(), true);
+		rulePreparator.prepare(ruleInfo, nonTauotologies, rule.isInjectiveMatching(), true);
 		
 		Set<Match> baseMatches = new HashSet<Match>();
 		Iterator<Match> it = engine.findMatches(rule, graph, null).iterator();
@@ -153,7 +153,6 @@
 
 		Set<VariabilityAwareMatch> matches = new HashSet<VariabilityAwareMatch>();
 		if (!baseMatches.isEmpty()) {
-			mo.getMatchedSubrules().add(bs);
 			mo.set(ruleInfo.getFeatureModel(), null, true);
 			findMatches(rule, mo, baseMatches, matches);
 			mo.set(ruleInfo.getFeatureModel(), true, null);
@@ -285,7 +284,7 @@
 		Sentence injectiveMatching;
 		
 
-		public RuleInfo(Rule rule, List<String> initiallyTrue, List<String> initiallyFalse) {
+		public RuleInfo(Rule rule) {
 			this.rule = VariabilityFactory.createVariabilityRule(rule);
 			this.featureModel = FeatureExpression.getExpr(this.rule.getFeatureModel());
 			String injective = this.rule.getInjectiveMatchingPresenceCondition();
diff --git a/plugins/variability/org.eclipse.emf.henshin.variability/src/org/eclipse/emf/henshin/variability/util/OclUtil.java b/plugins/variability/org.eclipse.emf.henshin.variability/src/org/eclipse/emf/henshin/variability/util/OclUtil.java
index 718c1dc..b0eb4b3 100644
--- a/plugins/variability/org.eclipse.emf.henshin.variability/src/org/eclipse/emf/henshin/variability/util/OclUtil.java
+++ b/plugins/variability/org.eclipse.emf.henshin.variability/src/org/eclipse/emf/henshin/variability/util/OclUtil.java
@@ -6,10 +6,10 @@
 import org.eclipse.ocl.ParserException;
 import org.eclipse.ocl.ecore.OCL;
 import org.eclipse.ocl.ecore.OCL.Helper;
-import org.eclipse.ocl.ecore.OCLExpression;
-import org.eclipse.ocl.expressions.Variable;
 import org.eclipse.ocl.ecore.OCL.Query;
+import org.eclipse.ocl.ecore.OCLExpression;
 import org.eclipse.ocl.ecore.impl.EcoreFactoryImpl;
+import org.eclipse.ocl.expressions.Variable;
 
 /**
  * Utility for parsing OCL expressions (currently not used).
diff --git a/plugins/variability/org.eclipse.emf.henshin.variability/src/org/eclipse/emf/henshin/variability/wrapper/VariabilityAttribute.java b/plugins/variability/org.eclipse.emf.henshin.variability/src/org/eclipse/emf/henshin/variability/wrapper/VariabilityAttribute.java
index b8146e1..99ca679 100644
--- a/plugins/variability/org.eclipse.emf.henshin.variability/src/org/eclipse/emf/henshin/variability/wrapper/VariabilityAttribute.java
+++ b/plugins/variability/org.eclipse.emf.henshin.variability/src/org/eclipse/emf/henshin/variability/wrapper/VariabilityAttribute.java
@@ -17,7 +17,6 @@
 import org.eclipse.emf.henshin.model.Action;
 import org.eclipse.emf.henshin.model.Annotation;
 import org.eclipse.emf.henshin.model.Attribute;
-import org.eclipse.emf.henshin.model.Edge;
 import org.eclipse.emf.henshin.model.Graph;
 import org.eclipse.emf.henshin.model.GraphElement;
 import org.eclipse.emf.henshin.model.Node;
@@ -49,7 +48,7 @@
 		if(pc != null) {
 			return pc;
 		} else {
-			return VariabilityTransactionHelper.addAnnotation(attribute, VariabilityConstants.PRESENCE_CONDITION, "");
+			return VariabilityHelper.addAnnotation(attribute, VariabilityConstants.PRESENCE_CONDITION, "");
 		}
 	}
 	
diff --git a/plugins/variability/org.eclipse.emf.henshin.variability/src/org/eclipse/emf/henshin/variability/wrapper/VariabilityEdge.java b/plugins/variability/org.eclipse.emf.henshin.variability/src/org/eclipse/emf/henshin/variability/wrapper/VariabilityEdge.java
index da51305..75258e0 100644
--- a/plugins/variability/org.eclipse.emf.henshin.variability/src/org/eclipse/emf/henshin/variability/wrapper/VariabilityEdge.java
+++ b/plugins/variability/org.eclipse.emf.henshin.variability/src/org/eclipse/emf/henshin/variability/wrapper/VariabilityEdge.java
@@ -47,7 +47,7 @@
 		if(pc != null) {
 			return pc;
 		} else {
-			return VariabilityTransactionHelper.addAnnotation(edge, VariabilityConstants.PRESENCE_CONDITION, "");
+			return VariabilityHelper.addAnnotation(edge, VariabilityConstants.PRESENCE_CONDITION, "");
 		}
 	}
 	
diff --git a/plugins/variability/org.eclipse.emf.henshin.variability/src/org/eclipse/emf/henshin/variability/wrapper/VariabilityFactory.java b/plugins/variability/org.eclipse.emf.henshin.variability/src/org/eclipse/emf/henshin/variability/wrapper/VariabilityFactory.java
index b3cb5e4..8b341e7 100644
--- a/plugins/variability/org.eclipse.emf.henshin.variability/src/org/eclipse/emf/henshin/variability/wrapper/VariabilityFactory.java
+++ b/plugins/variability/org.eclipse.emf.henshin.variability/src/org/eclipse/emf/henshin/variability/wrapper/VariabilityFactory.java
@@ -10,7 +10,6 @@
 import org.eclipse.emf.henshin.model.NestedCondition;
 import org.eclipse.emf.henshin.model.Node;
 import org.eclipse.emf.henshin.model.Rule;
-import org.eclipse.emf.henshin.variability.VarRuleApplicationImpl;
 
 /**
  * The factory for the variability-aware graph elements.
diff --git a/plugins/variability/org.eclipse.emf.henshin.variability/src/org/eclipse/emf/henshin/variability/wrapper/VariabilityHelper.java b/plugins/variability/org.eclipse.emf.henshin.variability/src/org/eclipse/emf/henshin/variability/wrapper/VariabilityHelper.java
new file mode 100644
index 0000000..cc9c330
--- /dev/null
+++ b/plugins/variability/org.eclipse.emf.henshin.variability/src/org/eclipse/emf/henshin/variability/wrapper/VariabilityHelper.java
@@ -0,0 +1,40 @@
+package org.eclipse.emf.henshin.variability.wrapper;
+
+import org.eclipse.emf.henshin.model.Annotation;
+import org.eclipse.emf.henshin.model.HenshinFactory;
+import org.eclipse.emf.henshin.model.ModelElement;
+
+public class VariabilityHelper {
+	private VariabilityHelper() {
+		// This class should not be instantiated
+	}
+
+	static Annotation addAnnotation(ModelElement modelElement, String key, String value) {
+		Annotation anno = HenshinFactory.eINSTANCE.createAnnotation();
+
+		anno.setKey(key);
+		anno.setValue(value);
+
+		modelElement.getAnnotations().add(anno);
+		return anno;
+	}
+
+	public static void setAnnotationValue(ModelElement modelElement, String key, String value) {
+		Annotation anno = getAnnotation(modelElement, key);
+
+		if (anno != null)
+			anno.setValue(value);
+	}
+
+	private static Annotation getAnnotation(ModelElement modelElement, String key) {
+		if (modelElement.getAnnotations() != null) {
+			for (Annotation anno : modelElement.getAnnotations()) {
+				if (anno.getKey().equals(key)) {
+					return anno;
+				}
+			}
+		}
+		return null;
+	}
+
+}
diff --git a/plugins/variability/org.eclipse.emf.henshin.variability/src/org/eclipse/emf/henshin/variability/wrapper/VariabilityNestedCondition.java b/plugins/variability/org.eclipse.emf.henshin.variability/src/org/eclipse/emf/henshin/variability/wrapper/VariabilityNestedCondition.java
index 23c5211..ea79a55 100644
--- a/plugins/variability/org.eclipse.emf.henshin.variability/src/org/eclipse/emf/henshin/variability/wrapper/VariabilityNestedCondition.java
+++ b/plugins/variability/org.eclipse.emf.henshin.variability/src/org/eclipse/emf/henshin/variability/wrapper/VariabilityNestedCondition.java
@@ -17,7 +17,6 @@
 import org.eclipse.emf.henshin.model.Graph;
 import org.eclipse.emf.henshin.model.MappingList;
 import org.eclipse.emf.henshin.model.NestedCondition;
-import org.eclipse.emf.henshin.model.Node;
 import org.eclipse.emf.henshin.model.impl.HenshinFactoryImpl;
 
 /**
@@ -46,7 +45,7 @@
 		if(pc != null) {
 			return pc;
 		} else {
-			return VariabilityTransactionHelper.addAnnotation(condition, VariabilityConstants.PRESENCE_CONDITION, "");
+			return VariabilityHelper.addAnnotation(condition, VariabilityConstants.PRESENCE_CONDITION, "");
 		}
 	}
 	
diff --git a/plugins/variability/org.eclipse.emf.henshin.variability/src/org/eclipse/emf/henshin/variability/wrapper/VariabilityNode.java b/plugins/variability/org.eclipse.emf.henshin.variability/src/org/eclipse/emf/henshin/variability/wrapper/VariabilityNode.java
index b305ea7..432ef91 100644
--- a/plugins/variability/org.eclipse.emf.henshin.variability/src/org/eclipse/emf/henshin/variability/wrapper/VariabilityNode.java
+++ b/plugins/variability/org.eclipse.emf.henshin.variability/src/org/eclipse/emf/henshin/variability/wrapper/VariabilityNode.java
@@ -49,7 +49,7 @@
 		if(pc != null) {
 			return pc;
 		} else {
-			return VariabilityTransactionHelper.addAnnotation(node, VariabilityConstants.PRESENCE_CONDITION, "");
+			return VariabilityHelper.addAnnotation(node, VariabilityConstants.PRESENCE_CONDITION, "");
 		}
 	}
 	
diff --git a/plugins/variability/org.eclipse.emf.henshin.variability/src/org/eclipse/emf/henshin/variability/wrapper/VariabilityRule.java b/plugins/variability/org.eclipse.emf.henshin.variability/src/org/eclipse/emf/henshin/variability/wrapper/VariabilityRule.java
index a591b43..3b717a7 100644
--- a/plugins/variability/org.eclipse.emf.henshin.variability/src/org/eclipse/emf/henshin/variability/wrapper/VariabilityRule.java
+++ b/plugins/variability/org.eclipse.emf.henshin.variability/src/org/eclipse/emf/henshin/variability/wrapper/VariabilityRule.java
@@ -98,19 +98,19 @@
 		if(featModel != null) {
 			featureModel = featModel;
 		} else {
-			featureModel = VariabilityTransactionHelper.addAnnotation(rule, VariabilityConstants.FEATURE_MODEL, "");
+			featureModel = VariabilityHelper.addAnnotation(rule, VariabilityConstants.FEATURE_MODEL, "");
 		}
 		
 		if(injMatPreCon != null) {
 			injectiveMatchingPresenceCondition = injMatPreCon;
 		} else {
-			injectiveMatchingPresenceCondition = VariabilityTransactionHelper.addAnnotation(rule, VariabilityConstants.INJECTIVE_MATCHING_PC, "");
+			injectiveMatchingPresenceCondition = VariabilityHelper.addAnnotation(rule, VariabilityConstants.INJECTIVE_MATCHING_PC, "");
 		}
 		
 		if(feats != null) {
 			features = feats;
 		} else {
-			features = VariabilityTransactionHelper.addAnnotation(rule, VariabilityConstants.FEATURES, "");
+			features = VariabilityHelper.addAnnotation(rule, VariabilityConstants.FEATURES, "");
 		}
 	}
 
diff --git a/plugins/variability/org.eclipse.emf.henshin.variability/src/org/eclipse/emf/henshin/variability/wrapper/VariabilityTransactionHelper.java b/plugins/variability/org.eclipse.emf.henshin.variability/src/org/eclipse/emf/henshin/variability/wrapper/VariabilityTransactionHelper.java
index 1ee565c..a0ae0ec 100644
--- a/plugins/variability/org.eclipse.emf.henshin.variability/src/org/eclipse/emf/henshin/variability/wrapper/VariabilityTransactionHelper.java
+++ b/plugins/variability/org.eclipse.emf.henshin.variability/src/org/eclipse/emf/henshin/variability/wrapper/VariabilityTransactionHelper.java
@@ -4,7 +4,6 @@
 import org.eclipse.emf.common.command.CommandStack;
 import org.eclipse.emf.ecore.resource.ResourceSet;
 import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
-import org.eclipse.emf.edit.command.AddCommand;
 import org.eclipse.emf.edit.command.SetCommand;
 import org.eclipse.emf.edit.domain.EditingDomain;
 import org.eclipse.emf.henshin.model.Annotation;