package de.FeatureModellingTool.PLModelChecker.RelationAnalysis;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import de.FeatureModellingTool.FeatureModel.CFRModifier;
import de.FeatureModellingTool.FeatureModel.ConstraintModel;
import de.FeatureModellingTool.FeatureModel.Feature;
import de.FeatureModellingTool.FeatureModel.FeatureModel;
import de.FeatureModellingTool.FeatureModel.FeatureRelation;
import de.FeatureModellingTool.FeatureModel.GroupConstraint;
import de.FeatureModellingTool.FeatureModel.GroupConstraintType;
import de.FeatureModellingTool.FeatureModel.Variability;
public class RequireRelationDiagram {
public static String getKey(Feature feature , boolean value) {
return feature.getID() + " value=" + (value ? "true" : "false");
}
public RequireRelationDiagram(FeatureModel fm , ConstraintModel cm) {
this.fm = fm;
this.cm = cm;
this.buildGraph();
}
protected FeatureModel fm = null;
protected ConstraintModel cm = null;
public DGraph graph = new DGraph();
protected void buildGraph() {
for (Iterator<FeatureRelation> itRelation=this.fm.getAllFeatureRelation().values().iterator() ; itRelation.hasNext() ; ) {
FeatureRelation fr = itRelation.next();
if (fr.getName().equals(FeatureRelation.EXCLUDE)) {
this.graph.addEdge(fr.getStartFeature() , true , fr.getEndFeature() , false);
} else if (fr.getName().equals(FeatureRelation.REQUIRE)) {
this.graph.addEdge(fr.getStartFeature() , true , fr.getEndFeature() , true);
} else {
this.graph.addEdge(fr.getEndFeature() , true , fr.getStartFeature() , true);
if (fr.getEndFeature().getVariability().equals(Variability.Mandatory)) {
this.graph.addEdge(fr.getStartFeature() , true , fr.getEndFeature() , true);
}
}
}
for (Iterator<GroupConstraint> itGC=this.cm.getAllGroupConstraint().values().iterator() ; itGC.hasNext() ; ) {
GroupConstraint gc = itGC.next();
if (gc.getType().equals(GroupConstraintType.SingleGroup)) {
List<Feature> features = new ArrayList<Feature>(gc.getFeatureSet());
for (int i=0 ; i<features.size() ; i++) {
for (int j=0 ; j<features.size() ; j++) {
if (i!=j) {
CFRModifier c;
this.graph.addEdge(features.get(i) , cm.getCFRelation(features.get(i),gc,false).getModifier().equals(CFRModifier.Affirmation)
, features.get(j) , !cm.getCFRelation(features.get(j),gc,false).getModifier().equals(CFRModifier.Affirmation));
}
}
}
} else if (gc.getType().equals(GroupConstraintType.AllGroup)) {
List<Feature> features = new ArrayList<Feature>(gc.getFeatureSet());
for (int i=0 ; i<features.size() ; i++) {
for (int j=0 ; j<features.size() ; j++) {
if (i!=j) {
this.graph.addEdge(features.get(i) , cm.getCFRelation(features.get(i),gc,false).getModifier().equals(CFRModifier.Affirmation)
, features.get(j) , cm.getCFRelation(features.get(j),gc,false).getModifier().equals(CFRModifier.Affirmation));
}
}
}
}
}
// for (Iterator<CompositeConstraint> itCC=this.cm.getAllCompositeConstraint().values().iterator() ; itCC.hasNext() ; ) {
// CompositeConstraint cc = itCC.next();
//
// }
}
public class DGraph {
public Map<String,DNode> nodes = new HashMap<String,DNode>();
public void addFeature(Feature feature) {
DNode node = new DNode(feature , true);
this.nodes.put(getKey(feature , true) , node);
node = new DNode(feature , false);
this.nodes.put(getKey(feature , false) , node);
}
public void addEdge(Feature f1 , boolean v1 , Feature f2 , boolean v2) {
this.nodes.get(getKey(f1,v1)).nodes.add(this.nodes.get(getKey(f2,v2)));
this.nodes.get(getKey(f2,!v2)).nodes.add(this.nodes.get(getKey(f1,!v1)));
}
}
public class DNode {
public DNode(Feature feature , boolean value) {
this.feature = feature;
this.value = value;
}
public Feature feature;
public boolean value;
public Set<DNode> nodes = new HashSet<DNode>();
public int weight = 0;
}
public class AtomNodes{
public Map<Feature,DNode> atomMap = new HashMap<Feature,DNode>();
}
}