Skip to content

Instantly share code, notes, and snippets.

@sualeh
Created May 3, 2023 20:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sualeh/e9b83f755732f153da6a4664ce546936 to your computer and use it in GitHub Desktop.
Save sualeh/e9b83f755732f153da6a4664ce546936 to your computer and use it in GitHub Desktop.
Generate Schema Diagrams with SchemaCrawler
package de.dpma.azubi.markenschema.schemacrawler;
import static us.fatehi.utility.Utility.isBlank;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import schemacrawler.inclusionrule.RegularExpressionInclusionRule;
import schemacrawler.schemacrawler.LimitOptionsBuilder;
import schemacrawler.schemacrawler.LoadOptionsBuilder;
import schemacrawler.schemacrawler.SchemaCrawlerOptions;
import schemacrawler.schemacrawler.SchemaCrawlerOptionsBuilder;
import schemacrawler.schemacrawler.SchemaInfoLevelBuilder;
import schemacrawler.tools.command.text.diagram.options.DiagramOptionsBuilder;
import schemacrawler.tools.command.text.diagram.options.DiagramOutputFormat;
import schemacrawler.tools.executable.SchemaCrawlerExecutable;
import schemacrawler.tools.options.Config;
import schemacrawler.tools.options.OutputOptions;
import schemacrawler.tools.options.OutputOptionsBuilder;
import us.fatehi.utility.LoggingConfig;
import us.fatehi.utility.datasource.DatabaseConnectionSource;
import us.fatehi.utility.datasource.DatabaseConnectionSources;
import us.fatehi.utility.datasource.MultiUseUserCredentials;
public class SchemaCrawlerDiagramGenerator {
public static void main(final String[] args) throws Exception {
// Set log level
new LoggingConfig(Level.OFF);
// Create the options
final Map<String, String> graphvizAttributes = new HashMap<>();
final String GRAPH = "graph.";
graphvizAttributes.put(GRAPH + "fontname", "Courier");
final DiagramOptionsBuilder diagramOptionsBuilder = DiagramOptionsBuilder.builder()
.withGraphvizAttributes(graphvizAttributes);
final Config additionalConfig = new Config();
additionalConfig.put("schemacrawler.format.hide_weakassociation_names", "true");
additionalConfig.merge(diagramOptionsBuilder.toConfig());
final LimitOptionsBuilder limitOptionsBuilder = LimitOptionsBuilder.builder()
.includeSchemas(new RegularExpressionInclusionRule("PUBLIC.BOOKS"));
final LoadOptionsBuilder loadOptionsBuilder = LoadOptionsBuilder.builder()
// Set what details are required in the schema - this affects the
// time taken to crawl the schema
.withSchemaInfoLevel(SchemaInfoLevelBuilder.standard());
final SchemaCrawlerOptions options = SchemaCrawlerOptionsBuilder.newSchemaCrawlerOptions()
.withLimitOptions(limitOptionsBuilder.toOptions()).withLoadOptions(loadOptionsBuilder.toOptions());
final Path outputFile = getOutputFile(args);
final OutputOptions outputOptions = OutputOptionsBuilder.newOutputOptions(DiagramOutputFormat.svg, outputFile);
final String command = "schema";
try (final DatabaseConnectionSource dataSource = getDatabaseConnectionSource()) {
final SchemaCrawlerExecutable executable = new SchemaCrawlerExecutable(command);
executable.setSchemaCrawlerOptions(options);
executable.setOutputOptions(outputOptions);
executable.setDataSource(dataSource);
executable.setAdditionalConfiguration(additionalConfig);
executable.execute();
}
System.out.println("Created output file, " + outputFile);
}
private static DatabaseConnectionSource getDatabaseConnectionSource() {
final String connectionUrl = "jdbc:hsqldb:hsql://localhost:9001/schemacrawler";
final DatabaseConnectionSource dataSource = DatabaseConnectionSources.newDatabaseConnectionSource(connectionUrl,
new MultiUseUserCredentials("sa", ""));
return dataSource;
}
private static Path getOutputFile(final String[] args) {
final String outputfile;
if (args != null && args.length > 0 && !isBlank(args[0])) {
outputfile = args[0];
} else {
outputfile = "./schemacrawler_output.svg";
}
final Path outputFile = Paths.get(outputfile).toAbsolutePath().normalize();
return outputFile;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment