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 node weighted edge list format. * There are two sections, immediately following one another without any special indications. * In the first section each line of input contains only a node name. There must be one line for each node. * In the second section 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 * and finally a double value as the edge weight, using the space character (' ') as a delimiter. There must be one line for each edge. * @author Sebastian * */ public class NodeWeightedEdgeListGraphInputAdapter extends AbstractGraphInputAdapter { /** * Creates a new instance setting the reader attribute. * @param reader The reader to receive input from. */ public NodeWeightedEdgeListGraphInputAdapter(Reader reader) { this.setReader(reader); } /** * Creates a new instance. */ public NodeWeightedEdgeListGraphInputAdapter() { } 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 nodes */ while(line.size() == 1) { Node node = graph.createNode(); String nodeName = line.get(0); if(!reverseNodeNames.containsKey(nodeName)) { graph.setNodeName(node, nodeName); reverseNodeNames.put(nodeName, node); } else { throw new AdapterException("Node name not unique: " + nodeName); } line = Adapters.readLine(reader); } /* * Reads edges */ while(line.size() == 3) { String sourceNodeName = line.get(0); Node sourceNode = reverseNodeNames.get(sourceNodeName); String targetNodeName = line.get(1); Node targetNode = reverseNodeNames.get(targetNodeName); double edgeWeight = Double.parseDouble(line.get(2)); if(sourceNode == null) { throw new AdapterException("Node not specified: " + sourceNodeName); } if(targetNode == null) { throw new AdapterException("Node not specified: " + targetNodeName); } Edge edge = graph.createEdge(sourceNode, targetNode); graph.setEdgeWeight(edge, edgeWeight); 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) { } } } }