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;