package fna.parsing.character;
import java.io.File;
import java.util.ArrayList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import fna.parsing.MainForm;
public class ManipulateGraphML {
/**
* @param args
*/
public static void main(String [] args) {
String group = "D:\\FNA\\FNAV19\\target\\co-occurrence\\" + "Group_1.xml";
//"D:\\FNA\\FNAV19\\target\\co-occurrence\\"+ groupName;
//removeEdge(new GraphNode("stem"), new GraphNode("herb"), group);
//GraphNode graphNode = deleteNode("rhizome", group);
//restoreNode(graphNode, group);
insertEdge(new GraphNode("stem"), new GraphNode("herb"), group);
}
public static GraphNode deleteNode(String nodeName, String groupName) {
GraphNode graphNode = new GraphNode(nodeName);
try{
File file = new File(groupName);
String remElement = "node";
if (file.exists()){
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(groupName);
TransformerFactory tFactory = TransformerFactory.newInstance();
Transformer tFormer = tFactory.newTransformer();
NodeList nodes = doc.getElementsByTagName(remElement);
for (int i = 0 ; i < nodes.getLength(); i++) {
Element el = (Element)nodes.item(i);
String nodeKeyValue = el.getElementsByTagName("data").item(0).getFirstChild().getNodeValue();
if (nodeKeyValue.equals(nodeName)) {
String id = el.getAttribute("id");
graphNode.setNodeNumber(id);
NodeList nl = doc.getElementsByTagName("edge");
int size = nl.getLength();
for (int j=0; j< size; j++) {
Element edgeElement = (Element) nl.item(j);
String source = edgeElement.getAttribute("source");
String target = edgeElement.getAttribute("target");
if (source.equals(id) || target.equals(id)) {
System.out.println("Source : " + source + ", target : " + target);
edgeElement.getParentNode().removeChild(edgeElement);
graphNode.getEdges().add(source + "," + target);
doc.normalize();
j = -1;
size = doc.getElementsByTagName("edge").getLength();
}
}
el.getParentNode().removeChild(el);
doc.normalize();
break;
}
}
doc.normalize();
Source source = new DOMSource(doc);
Result dest = new StreamResult(new File(groupName));
tFormer.transform(source, dest);
}
else{
System.out.println("File not found!");
}
}
catch (Exception e){
e.printStackTrace();
System.exit(0);
}
return graphNode;
}
public static void removeEdge(GraphNode fromNode, GraphNode toNode, String groupPath, String group) {
try{
File file = new File(groupPath);
String remElement = "node";
String idFrom = "", idTo = "";
if (file.exists()){
/*Look for existing nodes*/
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(groupPath);
TransformerFactory tFactory = TransformerFactory.newInstance();
Transformer tFormer = tFactory.newTransformer();
NodeList nodes = doc.getElementsByTagName(remElement);
for (int i = 0 ; i < nodes.getLength(); i++) {
Element el = (Element)nodes.item(i);
String nodeKeyValue = el.getElementsByTagName("data").item(0).getFirstChild().getNodeValue();
if (nodeKeyValue.equals(fromNode.getNodeName())) {
idFrom = el.getAttribute("id");
}
if (nodeKeyValue.equals(toNode.getNodeName())) {
idTo = el.getAttribute("id");
}
}
/* Now remove the edge connecting the nodes */
NodeList nl = doc.getElementsByTagName("edge");
int size = nl.getLength();
for (int j=0; j< size; j++) {
Element edgeElement = (Element) nl.item(j);
String source = edgeElement.getAttribute("source");
String target = edgeElement.getAttribute("target");
if ((source.equals(idFrom) && target.equals(idTo))
|| (source.equals(idTo) && target.equals(idFrom))) {
edgeElement.getParentNode().removeChild(edgeElement);
doc.normalize();
MainForm.getRemovedEdges().get(group).add(fromNode.getNodeName()+","+toNode.getNodeName());
break;
}
}
Source source = new DOMSource(doc);
Result dest = new StreamResult(new File(groupPath));
tFormer.transform(source, dest);
}
} catch(Exception exe){
exe.printStackTrace();
}
}
public static boolean restoreNode(GraphNode graphNode, String groupName) {
File file = new File(groupName);
String remElement = "node";
try {
if (file.exists()){
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(groupName);
TransformerFactory tFactory = TransformerFactory.newInstance();
Transformer tFormer = tFactory.newTransformer();
/* Add the parent graph-node */
Node graph = doc.getElementsByTagName("graph").item(0);
Element element = doc.createElement(remElement);
element.setAttribute("id", graphNode.getNodeNumber());
Element childElement = doc.createElement("data");
childElement.setAttribute("key", "name");
childElement.setTextContent(graphNode.getNodeName());
element.appendChild(childElement);
graph.appendChild(element);
doc.normalize();
/* Add the edges now */
ArrayList<String> edges = graphNode.getEdges();
for (String edgeGroup : edges) {
String [] boundaries = edgeGroup.split(",");
Element edge = doc.createElement("edge");
edge.setAttribute("source", boundaries[0]);
edge.setAttribute("target", boundaries[1]);
graph.appendChild(edge);
doc.normalize();
}
Source source = new DOMSource(doc);
Result dest = new StreamResult(new File(groupName));
tFormer.transform(source, dest);
}
} catch(Exception exe){
exe.printStackTrace();
}
return true;
}
public static void insertEdge(GraphNode fromNode, GraphNode toNode, String groupName) {
File file = new File(groupName);
String remElement = "node";
String idFrom = "", idTo = "";
try {
if (file.exists()){
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(groupName);
TransformerFactory tFactory = TransformerFactory.newInstance();
Transformer tFormer = tFactory.newTransformer();
NodeList nodes = doc.getElementsByTagName(remElement);
for (int i = 0 ; i < nodes.getLength(); i++) {
Element el = (Element)nodes.item(i);
String nodeKeyValue = el.getElementsByTagName("data").item(0).getFirstChild().getNodeValue();
if (nodeKeyValue.equals(fromNode.getNodeName())) {
idFrom = el.getAttribute("id");
}
if (nodeKeyValue.equals(toNode.getNodeName())) {
idTo = el.getAttribute("id");
}
}
/* Add the parent graph-node */
Node graph = doc.getElementsByTagName("graph").item(0);
NodeList nl = doc.getElementsByTagName("edge");
int size = nl.getLength();
boolean present = false;
for (int j=0; j< size; j++) {
Element edgeElement = (Element) nl.item(j);
String source = edgeElement.getAttribute("source");
String target = edgeElement.getAttribute("target");
if ((source.equals(idFrom) && target.equals(idTo))
|| (source.equals(idTo) && target.equals(idFrom))) {
present = true;
}
}
if (!present) {
Element edge = doc.createElement("edge");
edge.setAttribute("source", idFrom);
edge.setAttribute("target", idTo);
graph.appendChild(edge);
doc.normalize();
}
Source source = new DOMSource(doc);
Result dest = new StreamResult(new File(groupName));
tFormer.transform(source, dest);
}
} catch(Exception exe){
exe.printStackTrace();
}
}
}