package com.plectix.simulator.io.xml;
import java.util.List;
import javax.xml.stream.XMLStreamException;
import com.plectix.simulator.interfaces.ObservableConnectedComponentInterface;
import com.plectix.simulator.io.SimulationDataOutputUtil;
import com.plectix.simulator.simulator.KappaSystem;
import com.plectix.simulator.staticanalysis.Rule;
import com.plectix.simulator.staticanalysis.influencemap.InfluenceMap;
import com.plectix.simulator.staticanalysis.influencemap.InfluenceMapEdge;
/*package*/ class InfluenceMapXMLWriter {
// TODO move out
private final InfluenceMap influenceMap;
private final static String TYPE_NEGATIVE_MAP = "NEGATIVE";
private final static String TYPE_POSITIVE_MAP = "POSITIVE";
public InfluenceMapXMLWriter(InfluenceMap influenceMap) {
this.influenceMap = influenceMap;
}
public final void write(OurXMLWriter writer, int rules,
List<ObservableConnectedComponentInterface> observableComponents,
boolean isInhibitionMap, KappaSystem kappaSystem,
boolean isOcamlStyleObsName) throws XMLStreamException {
writer.writeStartElement("InfluenceMap");
int rulesAndObsNumber = observableComponents.size() + rules;
/**
* add kappaSystem.getObservables()
* */
for (int i = observableComponents.size() - 1; i >= 0; i--) {
ObservableConnectedComponentInterface obsCC = observableComponents.get(i);
writer.writeStartElement("Node");
writer.writeAttribute("Id", Integer.toString(rulesAndObsNumber--));
writer.writeAttribute("Type", "OBSERVABLE");
String obsName = obsCC.getName();
if (obsName == null)
obsName = obsCC.getLine();
writer.writeAttribute("Text", '[' + obsName + ']');
writer.writeAttribute("Data", obsCC.getLine());
writer.writeAttribute("Name", '[' + obsName + ']');
writer.writeEndElement();
}
/**
* add rules
* */
addRulesToXML(rulesAndObsNumber, writer, rules, isOcamlStyleObsName,
kappaSystem, true);
/**
* add activation map
* */
for (int i = rules - 1; i >= 0; i--) {
Rule rule = kappaSystem.getRuleById(i);
printMap(writer, TYPE_POSITIVE_MAP, rule, influenceMap.getActivationMap().get(Integer
.valueOf(i)), influenceMap.getActivationMapObservables().get(Integer.valueOf(i)),
rules);
}
if (isInhibitionMap) {
for (int i = rules - 1; i >= 0; i--) {
Rule rule = kappaSystem.getRuleById(i);
printMap(writer, TYPE_NEGATIVE_MAP, rule, influenceMap.getInhibitionMap()
.get(Integer.valueOf(i)), influenceMap.getInhibitionMapObservables().get(Integer
.valueOf(i)), rules);
}
}
writer.writeEndElement();
}
private static final void printMap(OurXMLWriter writer, String mapType,
Rule rule, List<InfluenceMapEdge> rulesToPrint,
List<InfluenceMapEdge> influenceMapEdges, int allRules)
throws XMLStreamException {
int rulesNumber = allRules + 1;
if (influenceMapEdges != null)
for (int j = influenceMapEdges.size() - 1; j >= 0; j--) {
int fromNode = rule.getRuleId() + 1;
int toNode = influenceMapEdges.get(j).getTargetRule() + rulesNumber;
if(mapType == TYPE_NEGATIVE_MAP && fromNode == toNode)
continue;
writer.writeStartElement("Connection");
writer.writeAttribute("FromNode", Integer.toString(fromNode));
writer.writeAttribute("ToNode", Integer.toString(toNode));
writer.writeAttribute("Relation", mapType);
writer.writeEndElement();
}
if (rulesToPrint != null)
for (int j = rulesToPrint.size() - 1; j >= 0; j--) {
int fromNode = rule.getRuleId() + 1;
int toNode = rulesToPrint.get(j).getTargetRule() + 1;
if(mapType == TYPE_NEGATIVE_MAP && fromNode == toNode)
continue;
writer.writeStartElement("Connection");
writer.writeAttribute("FromNode", Integer.toString(fromNode));
writer.writeAttribute("ToNode", Integer.toString(toNode));
// .getRuleID() + 1));
writer.writeAttribute("Relation", mapType);
writer.writeEndElement();
}
}
public static final void addRulesToXML(int rulesAndObsNumber,
OurXMLWriter writer, int rules, boolean isOcamlStyleObsName,
KappaSystem kappaSystem, boolean writeText) throws XMLStreamException {
for (int i = rules - 1; i >= 0; i--) {
Rule rule = kappaSystem.getRuleById(i);
if(writeText)
writer.writeStartElement("Node");
else
writer.writeStartElement("Rule");
writer.writeAttribute("Type", "RULE");
if (rule.getName() != null) {
if(writeText)
writer.writeAttribute("Text", rule.getName());
writer.writeAttribute("Name", rule.getName());
} else {
Integer ruleId = rule.getRuleId() + 1;
if(writeText)
writer.writeAttribute("Text", "%Auto_" + ruleId);
writer.writeAttribute("Name", "%Auto_" + ruleId);
}
writer.writeAttribute("Id", Integer.toString(rulesAndObsNumber--));
// TODO ENG-419
writer.writeAttribute("Data", SimulationDataOutputUtil.getData(rule,
isOcamlStyleObsName));
writer.writeEndElement();
}
}
}