package i5.las2peer.services.ocd.adapters.graphInput; import i5.las2peer.services.ocd.adapters.AdapterException; import i5.las2peer.services.ocd.graphs.CustomGraph; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.text.ParseException; import java.util.HashMap; import java.util.Map; import java.util.Scanner; import y.base.Edge; import y.base.EdgeCursor; import y.base.Node; import y.base.NodeCursor; import y.io.GMLIOHandler; /** * A graph input adapter for GML format, based on the GMLIOHandler of the yFiles library. * In case each node has a label with a unique value node names will be derived from there. Otherwise node names will be set as indices. * In case each edge has a label with a numeric value edge weights will be derived from there. * @author Sebastian * */ public class GmlGraphInputAdapter extends AbstractGraphInputAdapter { public void setParameter(Map<String,String> param) throws IllegalArgumentException, ParseException{ } @Override public CustomGraph readGraph() throws AdapterException { GMLIOHandler ioh = new GMLIOHandler(); Scanner scanner = new Scanner(reader); String inString = scanner.useDelimiter("\\A").next(); scanner.close(); InputStream is = new ByteArrayInputStream(inString.getBytes()); CustomGraph graph = new CustomGraph(); try { ioh.read(graph, is); } catch (IOException e) { throw new AdapterException(e); } finally { try { is.close(); } catch (IOException e) { } } /* * Check whether node labels are unique names. */ NodeCursor nodes = graph.nodes(); Node node; HashMap<Node, String> nodenames = new HashMap<Node, String>(); try { while(nodes.ok()) { node = nodes.node(); String name = graph.getRealizer(node).getLabel().getText(); if(name.isEmpty()) { break; } nodenames.put(node, name); nodes.next(); } } catch (RuntimeException e) { // label not set } nodes.toFirst(); /* * Node labels are unique. */ if(nodenames.size() == graph.nodeCount()) { while(nodes.ok()) { node = nodes.node(); graph.setNodeName(node, nodenames.get(node)); nodes.next(); } } /* * Node labels are not unique. */ else { while(nodes.ok()) { node = nodes.node(); graph.setNodeName(node, Integer.toString(node.index())); nodes.next(); } } /* * Check whether node labels are numeric. */ EdgeCursor edges = graph.edges(); Edge edge; HashMap<Edge, Double> edgeweights = new HashMap<Edge, Double>(); try { while(edges.ok()) { edge = edges.edge(); String weightStr = graph.getRealizer(edge).getLabel().getText(); Double weight = Double.parseDouble(weightStr); if(weight != null) { edgeweights.put(edge, weight); } else { break; } edges.next(); } } catch (RuntimeException e) { // label not set } edges.toFirst(); /* * all labels correspond numeric */ if(edgeweights.size() == graph.edgeCount()) { while(edges.ok()) { edge = edges.edge(); graph.setEdgeWeight(edge, edgeweights.get(edge)); edges.next(); } } return graph; } }