diff --git a/src/main/java/GraphMLFileReader.java b/src/main/java/GraphMLFileReader.java index 151c078..fc75f3b 100644 --- a/src/main/java/GraphMLFileReader.java +++ b/src/main/java/GraphMLFileReader.java @@ -1,3 +1,4 @@ +import org.jgrapht.graph.DefaultWeightedEdge; import org.jgrapht.graph.SimpleWeightedGraph; import org.jgrapht.nio.graphml.GraphMLImporter; @@ -21,7 +22,12 @@ public class GraphMLFileReader { try(//don't need to close reader bc of try-with-resources auto-closing BufferedReader reader = Files.newBufferedReader(Path.of(filename)); ){ - GraphMLImporter importer = new GraphMLImporter<>(); + GraphMLImporter importer = new GraphMLImporter<>(); + importer.addVertexWithAttributesConsumer((vertex, attributes) -> { + vertex.setType(attributes.get("type").getValue()); + vertex.setSequence(attributes.get("sequence").getValue()); + vertex.setOccupancy((attributes.get("occupancy").getValue())); + }); importer.importGraph(graph, reader); } catch (IOException ex) { diff --git a/src/main/java/GraphMLFileWriter.java b/src/main/java/GraphMLFileWriter.java index ca5e89d..a2f0a5a 100644 --- a/src/main/java/GraphMLFileWriter.java +++ b/src/main/java/GraphMLFileWriter.java @@ -1,12 +1,18 @@ +import org.jgrapht.graph.DefaultWeightedEdge; import org.jgrapht.graph.SimpleWeightedGraph; -import org.jgrapht.nio.dot.DOTExporter; +import org.jgrapht.nio.Attribute; +import org.jgrapht.nio.AttributeType; +import org.jgrapht.nio.DefaultAttribute; import org.jgrapht.nio.graphml.GraphMLExporter; +import org.jgrapht.nio.graphml.GraphMLExporter.AttributeCategory; import java.io.BufferedWriter; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.StandardOpenOption; +import java.util.HashMap; +import java.util.Map; public class GraphMLFileWriter { @@ -14,7 +20,7 @@ public class GraphMLFileWriter { SimpleWeightedGraph graph; - public GraphMLFileWriter(String filename, SimpleWeightedGraph graph) { + public GraphMLFileWriter(String filename, SimpleWeightedGraph graph) { if(!filename.matches(".*\\.graphml")){ filename = filename + ".graphml"; } @@ -25,7 +31,23 @@ public class GraphMLFileWriter { public void writeGraphToFile() { try(BufferedWriter writer = Files.newBufferedWriter(Path.of(filename), StandardOpenOption.CREATE_NEW); ){ - GraphMLExporter exporter = new GraphMLExporter<>(); + //create exporter. Let the vertex labels be the unique ids for the vertices + GraphMLExporter> exporter = new GraphMLExporter<>(Vertex::getVertexLabel); + //set to export weights + exporter.setExportEdgeWeights(true); + //set type, sequnce, and occupancy attributes for each vertex + exporter.setVertexAttributeProvider( v -> { + Map attributes = new HashMap<>(); + attributes.put("type", DefaultAttribute.createAttribute(v.getType())); + attributes.put("sequence", DefaultAttribute.createAttribute(v.getSequence())); + attributes.put("occupancy", DefaultAttribute.createAttribute(v.getOccupancy())); + return attributes; + }); + //register the attributes + exporter.registerAttribute("type", AttributeCategory.NODE, AttributeType.STRING); + exporter.registerAttribute("sequence", AttributeCategory.NODE, AttributeType.STRING); + exporter.registerAttribute("occupancy", AttributeCategory.NODE, AttributeType.STRING); + //export the graph exporter.exportGraph(graph, writer); } catch(IOException ex){ System.out.println("Could not make new file named "+filename); diff --git a/src/main/java/Vertex.java b/src/main/java/Vertex.java index 32627ae..74b2cac 100644 --- a/src/main/java/Vertex.java +++ b/src/main/java/Vertex.java @@ -1,10 +1,14 @@ public class Vertex { - private final SequenceType type; - private final Integer vertexLabel; - private final Integer sequence; - private final Integer occupancy; + private SequenceType type; + private Integer vertexLabel; + private Integer sequence; + private Integer occupancy; + + public Vertex(String vertexLabel) { + this.vertexLabel = Integer.parseInt((vertexLabel)); + } public Vertex(SequenceType type, Integer sequence, Integer occupancy, Integer vertexLabel) { this.type = type; @@ -13,15 +17,73 @@ public class Vertex { this.occupancy = occupancy; } - public SequenceType getType() { return type; } - public Integer getVertexLabel() { return vertexLabel; } - - public Integer getSequence() { - return sequence; + public String getType() { + return type.name(); } - public Integer getOccupancy() { - return occupancy; + public void setType(String type) { + this.type = SequenceType.valueOf(type); } + + public String getVertexLabel() { + return vertexLabel.toString(); + } + + public void setVertexLabel(String label) { + this.vertexLabel = Integer.parseInt(label); + } + + public String getSequence() { + + return sequence.toString(); + } + + public void setSequence(String sequence) { + this.sequence = Integer.parseInt(sequence); + } + + public String getOccupancy() { + return occupancy.toString(); + } + + public void setOccupancy(String occupancy) { + this.occupancy = Integer.parseInt(occupancy); + } + + @Override //adapted from JGraphT example code + public int hashCode() + { + return (sequence == null) ? 0 : sequence.hashCode(); + } + + @Override //adapted from JGraphT example code + public boolean equals(Object obj) + { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + Vertex other = (Vertex) obj; + if (sequence == null) { + return other.sequence == null; + } else { + return sequence.equals(other.sequence); + } + } + + + @Override //adapted from JGraphT example code + public String toString() + { + StringBuilder sb = new StringBuilder(); + sb.append("(").append(vertexLabel) + .append(", Type: ").append(type.name()) + .append(", Sequence: ").append(sequence) + .append(", Occupancy: ").append(occupancy).append(")"); + return sb.toString(); + } + }