Skip to content
Main.java 2.74 KiB
Newer Older
package tfm.exec;

import com.github.javaparser.JavaParser;
import com.github.javaparser.ast.Node;
import com.github.javaparser.ast.body.MethodDeclaration;
import tfm.graphs.CFG;
import tfm.graphs.Graph;
import tfm.graphs.PDG;
import tfm.graphs.SDG;
import tfm.utils.Logger;
import tfm.utils.Utils;

import java.io.File;
import java.io.IOException;
import java.util.Objects;
import java.util.Optional;

public class Main {

    public static final String PROGRAM = Utils.PROGRAMS_FOLDER + "cfg/Eval_4.java";
Javier Costa's avatar
Javier Costa committed
    public static final String GRAPH = GraphLog.SDG;
Javier Costa's avatar
Javier Costa committed
    public static final String METHOD = "main";

    public static void main(String[] args) throws IOException {
        JavaParser.getStaticConfiguration().setAttributeComments(false);

        // File
        File file = new File(PROGRAM);
        Node root = JavaParser.parse(file);

        if (!METHOD.isEmpty()) {
            Optional<MethodDeclaration> methodDeclarationOptional = root.findFirst(MethodDeclaration.class,
                    methodDeclaration -> Objects.equals(methodDeclaration.getNameAsString(), METHOD));

            if (!methodDeclarationOptional.isPresent()) {
                Logger.format("Method '%s' not found in '%s'. Exiting...", METHOD, PROGRAM);
                return;
            }

            root = methodDeclarationOptional.get();
        }

Javier Costa's avatar
Javier Costa committed
        // GraphLog
        long t0 = System.nanoTime();
        Graph graph = getBuiltGraph(args.length == 1 ? args[0] : GRAPH, (MethodDeclaration) root);
        long tf = System.nanoTime();
        long tt = tf - t0;

        GraphLog<?> graphLog = getGraphLog(graph);
        graphLog.log();
        graphLog.openVisualRepresentation();

        Logger.log();
        Logger.format("Graph generated in %.2f ms", tt / 10e6);
    }

    private static Graph getBuiltGraph(String graph, MethodDeclaration method) {
        switch (graph) {
            case GraphLog.CFG:
                CFG cfg = new CFG();
                cfg.build(method);
                return cfg;
            case GraphLog.PDG:
                PDG pdg = new PDG();
                pdg.build(method);
                return pdg;
Javier Costa's avatar
Javier Costa committed
            case GraphLog.SDG:
                Logger.log("Not yet considered!");
                return new SDG();
            default:
                Logger.log("Unkown graph type");
                System.exit(1);
                return null;
    private static GraphLog<?> getGraphLog(Graph graph) {
        if (graph instanceof CFG)
            return new CFGLog((CFG) graph);
        else if (graph instanceof PDG)
            return new PDGLog((PDG) graph);
        else if (graph instanceof SDG)
            return new SDGLog((SDG) graph);
        Logger.log("Unknown graph type");
        System.exit(1);
        return null;