All Downloads are FREE. Search and download functionalities are using the official Maven repository.

schemacrawler.tools.command.text.diagram.GraphvizJavaExecutorUtility Maven / Gradle / Ivy

package schemacrawler.tools.command.text.diagram;

import static java.nio.file.Files.lines;
import static java.util.Objects.requireNonNull;
import static java.util.stream.Collectors.joining;

import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

import guru.nidi.graphviz.engine.Format;
import guru.nidi.graphviz.engine.Graphviz;
import guru.nidi.graphviz.engine.GraphvizEngine;
import guru.nidi.graphviz.engine.GraphvizJdkEngine;
import guru.nidi.graphviz.engine.GraphvizV8Engine;
import schemacrawler.schemacrawler.exceptions.ConfigurationException;
import schemacrawler.schemacrawler.exceptions.ExecutionRuntimeException;
import schemacrawler.tools.command.text.diagram.options.DiagramOutputFormat;

public final class GraphvizJavaExecutorUtility {

  private static final Logger LOGGER =
      Logger.getLogger(GraphvizJavaExecutorUtility.class.getName());

  /**
   * Need a static method to account for imports of pure Java Graphviz library.
   *
   * @param dotFile Path to DOT file
   * @param outputFile Path to output file
   * @param diagramOutputFormat Output format
   */
  public static void generateGraph(
      final Path dotFile, final Path outputFile, final DiagramOutputFormat diagramOutputFormat) {
    requireNonNull(dotFile, "No DOT file provided");
    requireNonNull(outputFile, "No diagram output file provided");
    requireNonNull(diagramOutputFormat, "No diagram output format provided");

    try {
      // Strip all line breaks, in order to use the pure Java engine for
      // Graphviz
      final String dotSource = lines(dotFile).collect(joining(" "));

      final List engines = loadGraphvizEngines();
      Graphviz.useEngine(engines);

      final Format format = map(diagramOutputFormat);
      if (format == null) {
        throw new ConfigurationException(
            String.format("Unsupported output format <%s>", diagramOutputFormat));
      }

      Graphviz.fromString(dotSource).render(format).toFile(outputFile.toFile());
    } catch (final Throwable e) {
      throw new ExecutionRuntimeException(
          String.format("Cannot generate diagram from <%s>", dotFile), e);
    }
  }

  private static List loadGraphvizEngines() {
    final List engines = new ArrayList<>();

    try {
      final GraphvizEngine engine = new GraphvizJdkEngine();
      engines.add(engine);
      LOGGER.log(Level.CONFIG, "Loaded GraphvizJdkEngine");
    } catch (final Throwable e) {
      LOGGER.log(Level.CONFIG, "Cannot load GraphvizJdkEngine");
    }

    try {
      final GraphvizEngine engine = new GraphvizV8Engine();
      engines.add(engine);
      LOGGER.log(Level.CONFIG, "Loaded GraphvizV8Engine");
    } catch (final Throwable e) {
      LOGGER.log(Level.CONFIG, "Cannot load GraphvizV8Engine");
    }

    return engines;
  }

  private static Format map(final DiagramOutputFormat diagramOutputFormat) {
    if (diagramOutputFormat == null) {
      return null;
    }
    final Format format;
    switch (diagramOutputFormat) {
      case svg:
        format = Format.SVG;
        break;
      case png:
        format = Format.PNG;
        break;
      case ps:
        format = Format.PS;
        break;
      case xdot:
        format = Format.XDOT;
        break;
      case plain:
        format = Format.PLAIN;
        break;
      default:
        format = null;
        break;
    }
    return format;
  }

  private GraphvizJavaExecutorUtility() {
    // Prevent instantiation
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy