Skip to content
Graph.java 2.63 KiB
Newer Older
Javier Costa's avatar
Javier Costa committed
package tfm.graphs;
Javier Costa's avatar
Javier Costa committed

Javier Costa's avatar
Javier Costa committed
import com.github.javaparser.ast.stmt.Statement;
import edg.graphlib.Arrow;
import edg.graphlib.Vertex;
Javier Costa's avatar
Javier Costa committed
import tfm.arcs.Arc;
import tfm.arcs.data.ArcData;
Javier Costa's avatar
Javier Costa committed
import tfm.nodes.Node;
Javier Costa's avatar
Javier Costa committed

import java.util.Comparator;
Javier Costa's avatar
Javier Costa committed
import java.util.List;
import java.util.Objects;
Javier Costa's avatar
Javier Costa committed
import java.util.stream.Collectors;

/**
 * A graphlibGraph without cost and data in arcs
 * */
Javier Costa's avatar
Javier Costa committed
public abstract class Graph<NodeType extends Node> extends edg.graphlib.Graph<String, ArcData> {
Javier Costa's avatar
Javier Costa committed

Javier Costa's avatar
Javier Costa committed
    public final static class NodeId {
Javier Costa's avatar
Javier Costa committed
        private static int nextVertexId = 0;

        private int id;

Javier Costa's avatar
Javier Costa committed
        private NodeId(int id) {
Javier Costa's avatar
Javier Costa committed
            this.id = id;
        }

Javier Costa's avatar
Javier Costa committed
        static synchronized NodeId getVertexId() {
            return new NodeId(nextVertexId++);
Javier Costa's avatar
Javier Costa committed
        }

        public int getId() {
            return id;
        }

        @Override
        public String toString() {
            return String.valueOf(id);
        }
    }

    public Graph() {
        super();
    }

    @Override
    /*
      Library fix: if a node had an edge to itself resulted in 2 outgoing nodes instead of 1 outgoing and 1 incoming
     */
    public boolean addEdge(Arrow<String, ArcData> arrow) {
        Vertex<String, ArcData> from = arrow.getFrom();
        Vertex<String, ArcData> to = arrow.getTo();
        int cost = arrow.getCost();
        ArcData data = arrow.getData();

        if (!verticies.contains(from))
            throw new IllegalArgumentException("from is not in graph");
        if (!verticies.contains(to))
            throw new IllegalArgumentException("to is not in graph");

        List<Arrow<String, ArcData>> es2 = from.findEdges(to);

        for (Arrow<String, ArcData> e2 : es2) {
            if (e2 != null && cost == e2.getCost() &&
                    ((data == null && e2.getData() == null) ||
                            (data != null && data.equals(e2.getData()))))
                return false;
        }

        // FIX
        if (Objects.equals(from, to)) {
            from.getOutgoingArrows().add(arrow);
            from.getIncomingArrows().add(arrow);
        } else {
            from.addEdge(arrow);
            to.addEdge(arrow);
        }
        edges.add(arrow);
        return true;
    }

Javier Costa's avatar
Javier Costa committed
    @SuppressWarnings("unchecked")
Javier Costa's avatar
Javier Costa committed
    public NodeType getRootNode() {
Javier Costa's avatar
Javier Costa committed
        return (NodeType) super.getRootVertex();
    }

Javier Costa's avatar
Javier Costa committed
    public abstract NodeType addNode(String instruction, Statement statement);
Javier Costa's avatar
Javier Costa committed

    public String toString() {
        return getVerticies().stream()
                .map(edg.graphlib.Vertex::toString)
                .collect(Collectors.joining(System.lineSeparator()));
    }

Javier Costa's avatar
Javier Costa committed
    public abstract String toGraphvizRepresentation();
Javier Costa's avatar
Javier Costa committed

}