package net.sf.orcc.tools.merger.actor;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import net.sf.orcc.df.Network;
import net.sf.orcc.graph.Vertex;
import net.sf.orcc.graph.GraphFactory;
import net.sf.orcc.util.DomUtil;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
/**
* This class provides a way to import static regions from XML files.
* The class is analogous to StaticRegionDetector.
*
* @author Jani Boutellier
* @author Ghislain Roquier
*
*/
public class RegionParser {
private String definitionFile;
private Network network;
private List<List<Vertex>> actorList;
public RegionParser(String definitionFile, Network network) {
this.definitionFile = definitionFile;
this.network = network;
actorList = new ArrayList<List<Vertex>>();
}
public List<List<Vertex>> parse() {
try {
InputStream is = new FileInputStream(definitionFile);
Document document = DomUtil.parseDocument(is);
parseSuperactorList(document);
is.close();
} catch (IOException e) {
e.printStackTrace();
}
return actorList;
}
private void parseSuperactorList(Document doc) {
Element root = doc.getDocumentElement();
Node node = root.getFirstChild();
while (node != null) {
if (node.getNodeType() == Node.ELEMENT_NODE) {
Element element = (Element) node;
if (node.getNodeName().equals("superactor")) {
List<Vertex> localList = new ArrayList<Vertex>();
parseSuperactor(element, localList);
if (!localList.isEmpty()) {
addNameVertex(localList, element.getAttribute("name"));
actorList.add(localList);
}
} else {
// TODO: manage error
}
}
node = node.getNextSibling();
}
}
/*
* When static regions (= superactors) are imported from an XML file
* the region name is piggybacked in a special "name vertex" that
* is created here. The vertex is deleted in ActorMerger.transformNetwork
*/
private void addNameVertex(List<Vertex> actorList, String name) {
Vertex nameVertex = GraphFactory.eINSTANCE.createVertex();
nameVertex.setLabel(name);
nameVertex.setAttribute("isNameVertex", true);
actorList.add(nameVertex);
}
private void parseSuperactor(Element element, List<Vertex> actorList) {
Node node = element.getFirstChild();
while (node != null) {
if (node instanceof Element) {
Element elt = (Element) node;
if (elt.getTagName().equals("actor")) {
Vertex v = belongsToNetwork(elt.getAttribute("name"));
if(v != null) {
actorList.add(v);
}
} else {
// TODO: manage error
}
}
node = node.getNextSibling();
}
}
private Vertex belongsToNetwork(String id) {
for (Vertex vertex : network.getVertices()) {
if(vertex.getLabel().equals(id))
return vertex;
}
return null;
}
}