package splar.core.fm.configuration;
import java.text.DecimalFormat;
import java.util.HashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import splar.core.fm.FeatureModel;
import splar.core.fm.FeatureTreeNode;
public class ConfigurationStep {
private String stepId;
private Set<FeatureTreeNode> decisions; // -a: a=false, +a: a=true
private Set<FeatureTreeNode> propagations;
private Map<String,String> attributes;
public ConfigurationStep(String stepId) {
this.stepId = stepId;
propagations = new LinkedHashSet<FeatureTreeNode>();
decisions = new LinkedHashSet<FeatureTreeNode>();
attributes = new HashMap<String,String>();
}
public int hashCode() {
return stepId.hashCode();
}
public boolean equals(Object step) {
if( this == step ) {
return true;
}
if( (step == null) || (step.getClass() != this.getClass())) {
return false;
}
return stepId.equals(((ConfigurationStep)step).stepId);
}
public String toString() {
String toString = "["+stepId+": ";
for( FeatureTreeNode featureNode : decisions ) {
toString += "*"+featureNode.getName() + "=" + featureNode.getValue() + ",";
}
toString += "(";
for( FeatureTreeNode featureNode : propagations ) {
toString += featureNode.getName() + "=" + featureNode.getValue() + ",";
}
toString += ")]";
return toString;
}
public String getId() {
return stepId;
}
public int countDecisions() {
return countManualDecisions() + countPropagations();
}
public int countManualDecisions() {
return decisions.size();
}
public int countPropagations() {
return propagations.size();
}
public void addManualDecisionFeature(FeatureTreeNode decidedFeature) {
decisions.add(decidedFeature);
}
public void addPropagatedFeature(FeatureTreeNode propagatedFeature) {
propagations.add(propagatedFeature);
}
public Set<FeatureTreeNode> getPropagations() {
return propagations;
}
public Set<FeatureTreeNode> getDecisions() {
return decisions;
}
public boolean removeManualDecision(FeatureTreeNode featureNode) {
return decisions.remove(featureNode);
}
public boolean removePropagatedDecision(FeatureTreeNode featureNode) {
return propagations.remove(featureNode);
}
public void addAttribute(String name, String value) {
attributes.put(name, value);
}
public String getAttribute(String name) {
return attributes.get(name);
}
public Map<String,String> getAttributesMap() {
return attributes;
}
public static void computeStepAttributes(ConfigurationStep step, List<ConfigurationStep> stepsList, FeatureModel model) {
// cummulative decisions
int previousStepCountCummulativeDecisions = 0;
if( !stepsList.isEmpty() ) {
ConfigurationStep previousStep = stepsList.get(stepsList.size()-1);
previousStepCountCummulativeDecisions = Integer.valueOf(previousStep.getAttribute("step_countCummulativeDecisions"));
}
int curStepCountCummulativeDecisions = step.countDecisions() + previousStepCountCummulativeDecisions;
step.addAttribute("step_countCummulativeDecisions", String.valueOf(curStepCountCummulativeDecisions));
DecimalFormat format = new DecimalFormat("#0.0");
step.addAttribute("step_percentageCummulativeDecisions", format.format((curStepCountCummulativeDecisions*100f)/model.countFeatures()));
}
}