package i5.las2peer.services.ocd.adapters.graphInput;
import i5.las2peer.services.ocd.adapters.AdapterException;
import i5.las2peer.services.ocd.adapters.Adapters;
import i5.las2peer.services.ocd.graphs.CustomGraph;
import java.io.Reader;
import java.text.ParseException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import y.base.Edge;
import y.base.Node;
/**
* A graph input adapter for unweighted edge list format.
* Each line of input contains first the name of a source node of an edge, then the name of a target node of an edge,
* using the space character (' ') as a delimiter. There must be one line for each edge.
* @author Sebastian
*
*/
public class UnweightedEdgeListGraphInputAdapter extends
AbstractGraphInputAdapter {
/**
* Creates a new instance setting the reader attribute.
* @param reader The reader to receive input from.
*/
public UnweightedEdgeListGraphInputAdapter(Reader reader) {
this.setReader(reader);
}
/**
* Creates a new instance.
*/
public UnweightedEdgeListGraphInputAdapter() {
}
public void setParameter(Map<String,String> param) throws IllegalArgumentException, ParseException{
}
@Override
public CustomGraph readGraph() throws AdapterException {
CustomGraph graph = new CustomGraph();
try {
Map<String, Node> reverseNodeNames = new HashMap<String, Node>();
List<String> line = Adapters.readLine(reader);
/*
* Reads edges
*/
while (line.size() == 2) {
String sourceNodeName = line.get(0);
Node sourceNode;
if (!reverseNodeNames.containsKey(sourceNodeName)) {
sourceNode = graph.createNode();
reverseNodeNames.put(sourceNodeName, sourceNode);
graph.setNodeName(sourceNode, sourceNodeName);
} else {
sourceNode = reverseNodeNames.get(sourceNodeName);
}
String targetNodeName = line.get(1);
Node targetNode;
if (!reverseNodeNames.containsKey(targetNodeName)) {
targetNode = graph.createNode();
reverseNodeNames.put(targetNodeName, targetNode);
graph.setNodeName(targetNode, targetNodeName);
} else {
targetNode = reverseNodeNames.get(targetNodeName);
}
Edge edge = graph.createEdge(sourceNode, targetNode);
graph.setEdgeWeight(edge, 1);
line = Adapters.readLine(reader);
}
if(line.size() > 0) {
throw new AdapterException("Invalid input format");
}
return graph;
} catch (Exception e) {
throw new AdapterException(e);
} finally {
try {
reader.close();
} catch (Exception e) {
}
}
}
}