package com.plectix.simulator.io.xml;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.xml.stream.XMLStreamException;
import com.plectix.simulator.staticanalysis.abstracting.AbstractSite;
import com.plectix.simulator.staticanalysis.contactmap.ContactMap;
import com.plectix.simulator.staticanalysis.contactmap.ContactMapAbstractEdge;
import com.plectix.simulator.staticanalysis.contactmap.ContactMapChangedSite;
import com.plectix.simulator.util.BoundContactMap;
/*package*/ class ContactMapXMLWriter {
private final ContactMap contactMap;
public ContactMapXMLWriter(ContactMap contactMap) {
this.contactMap = contactMap;
}
public final void write(OurXMLWriter writer) throws XMLStreamException {
// Element contactMapElement = doc.createElement("ContactMap");
writer.writeStartElement("ContactMap");
writer.writeAttribute("Name", "High resolution");
Map<String, Map<String, ContactMapChangedSite>> agentsInContactMap = contactMap.getAbstractSolution()
.getAgentsInContactMap();
Map<String, Map<String, List<ContactMapAbstractEdge>>> bondsInContactMap = contactMap.getAbstractSolution()
.getEdgesInContactMap();
List<String> readAgentsNames = new ArrayList<String>();
for (Map.Entry<String, Map<String, ContactMapChangedSite>> entry : agentsInContactMap
.entrySet()) {
// Element agent = doc.createElement("Agent");
writer.writeStartElement("Agent");
readAgentsNames.add(entry.getKey());
Map<String, ContactMapChangedSite> sitesMap = entry.getValue();
Iterator<Map.Entry<String, ContactMapChangedSite>> siteIterator = sitesMap
.entrySet().iterator();
Map.Entry<String, ContactMapChangedSite> siteEntry = siteIterator
.next();
ContactMapChangedSite chSite = siteEntry.getValue();
writer.writeAttribute("Name", chSite.getSite().getParentAgent()
.getName());
// TODO
addSiteToContactMapAgent(chSite, writer);
while (siteIterator.hasNext()) {
siteEntry = siteIterator.next();
addSiteToContactMapAgent(siteEntry.getValue(), writer);
}
// contactMapElement.appendChild(agent);
writer.writeEndElement();
}
List<BoundContactMap> boundList = new ArrayList<BoundContactMap>();
for (Map<String, List<ContactMapAbstractEdge>> edgesMap : bondsInContactMap
.values()) {
for (List<ContactMapAbstractEdge> edgesList : edgesMap.values()) {
for (ContactMapAbstractEdge edge : edgesList) {
String vertexToSiteName = edge.getTargetVertexSiteName();
String vertexToAgentName = edge.getTargetVertexAgentName();
AbstractSite vertexFrom = edge.getSourceVertex();
BoundContactMap boundContactMap = new BoundContactMap(
vertexFrom.getParentAgent().getName(), vertexFrom
.getName(), vertexToAgentName,
vertexToSiteName);
if (!boundContactMap.includedInCollection(boundList))// (!boundList.contains(b))
boundList.add(boundContactMap);
else
continue;
writer.writeStartElement("Bond");
writer.writeAttribute("FromAgent", vertexFrom
.getParentAgent().getName());
writer.writeAttribute("FromSite", vertexFrom.getName());
writer.writeAttribute("ToAgent", vertexToAgentName);
writer.writeAttribute("ToSite", vertexToSiteName);
if (edge.getRules().size() != 0) {
for (int ruleID : edge.getRules()) {
writer.writeStartElement("Rule");
writer.writeAttribute("Id", Integer
.toString(ruleID));
writer.writeEndElement();
}
}
writer.writeEndElement();
// }
}
}
}
writer.writeEndElement();
}
private final void addSiteToContactMapAgent(ContactMapChangedSite site,
OurXMLWriter writer) throws XMLStreamException {
boolean isDefaultSite = site.getSite().hasDefaultName();
if (isDefaultSite) {
for (Integer ruleID : site.getUsedRuleIDs()) {
if (isDefaultSite) {
writer.writeStartElement("Rule");
writer.writeAttribute("Id", Integer.toString(ruleID));
writer.writeEndElement();
}
}
} else {
writer.writeStartElement("Site");
writer.writeAttribute("Name", site.getSite().getName());
writer.writeAttribute("CanChangeState", Boolean.toString(site
.hasInternalState()));
writer.writeAttribute("CanBeBound", Boolean.toString(site
.hasLinkState()));
for (Integer ruleID : site.getUsedRuleIDs()) {
if (isDefaultSite) {
writer.writeStartElement("Rule");
writer.writeAttribute("Id", Integer.toString(ruleID));
writer.writeEndElement();
}
}
writer.writeEndElement();
}
}
}