Skip to content
Graph.java 3.73 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

Javier Costa's avatar
Javier Costa committed
import java.util.*;
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
    private int nextVertexId = 0;

//    public final static class NodeId {
//        private static int nextVertexId = 0;
//
//        private int id;
//
//        private NodeId(int id) {
//            this.id = id;
//        }
//
//        static synchronized NodeId getVertexId() {
//            return new NodeId(nextVertexId++);
//        }
//
//        public int getId() {
//            return id;
//        }
//
//        @Override
//        public String toString() {
//            return String.valueOf(id);
//        }
//    }
Javier Costa's avatar
Javier Costa committed

    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))
Javier Costa's avatar
Javier Costa committed
            throw new IllegalArgumentException(String.format("from (%s) is not in graph", from));
        if (!verticies.contains(to))
Javier Costa's avatar
Javier Costa committed
            throw new IllegalArgumentException(String.format("to (%s) is not in graph", to));

        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

Javier Costa's avatar
Javier Costa committed
    public Optional<NodeType> findNodeByStatement(Statement statement) {
        return getNodes().stream()
                .filter(node -> Objects.equals(node.getStatement(), statement))
                .findFirst();
    }

Javier Costa's avatar
Javier Costa committed
    public Optional<NodeType> findNodeById(int id) {
        return findNodeById(String.valueOf(id));
    }

    public Optional<NodeType> findNodeById(String id) {
        return getNodes().stream()
                .filter(node -> Objects.equals(node.getName(), id))
                .findFirst();
    }

Javier Costa's avatar
Javier Costa committed
    @SuppressWarnings("unchecked")
    public Set<NodeType> getNodes() {
Javier Costa's avatar
Javier Costa committed
        return getVerticies().stream()
Javier Costa's avatar
Javier Costa committed
                .map(vertex -> (NodeType) vertex)
                .collect(Collectors.toSet());
    }

    public Set<Arc<ArcData>> getArcs() {
        return getArrows().stream()
                .map(arrow -> (Arc<ArcData>) arrow)
                .collect(Collectors.toSet());
    }

    public String toString() {
        return getNodes().stream()
Javier Costa's avatar
Javier Costa committed
                .sorted(Comparator.comparingInt(Node::getId))
Javier Costa's avatar
Javier Costa committed
                .map(Node::toString)
Javier Costa's avatar
Javier Costa committed
                .collect(Collectors.joining(System.lineSeparator()));
    }

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

Javier Costa's avatar
Javier Costa committed

    protected synchronized int getNextVertexId() {
        return nextVertexId++;
    }
Javier Costa's avatar
Javier Costa committed
}