From ef3d911e19919175941351caf9c58b66da8ad503 Mon Sep 17 00:00:00 2001 From: rob bygrave Date: Tue, 22 Jan 2019 01:08:15 +1300 Subject: [PATCH] #1614 - Refactor DbMigration.generateMigration() to use System out to log key messages and throw UnknownResourcePathException --- .../io/ebean/dbmigration/DbMigration.java | 5 ++ .../dbmigration/DefaultDbMigration.java | 53 +++++++++++++++---- .../UnknownResourcePathException.java | 14 +++++ 3 files changed, 62 insertions(+), 10 deletions(-) create mode 100644 src/main/java/io/ebeaninternal/dbmigration/UnknownResourcePathException.java diff --git a/src/main/java/io/ebean/dbmigration/DbMigration.java b/src/main/java/io/ebean/dbmigration/DbMigration.java index 2d9018806..7880945f9 100644 --- a/src/main/java/io/ebean/dbmigration/DbMigration.java +++ b/src/main/java/io/ebean/dbmigration/DbMigration.java @@ -50,6 +50,11 @@ public interface DbMigration { throw new IllegalStateException("No service implementation found for DbMigration?"); } + /** + * Set to false to suppress logging to System out. + */ + void setLogToSystemOut(boolean logToSystemOut); + /** * Set the path from the current working directory to the application resources. *

diff --git a/src/main/java/io/ebeaninternal/dbmigration/DefaultDbMigration.java b/src/main/java/io/ebeaninternal/dbmigration/DefaultDbMigration.java index bf92237dc..6c40cd09b 100644 --- a/src/main/java/io/ebeaninternal/dbmigration/DefaultDbMigration.java +++ b/src/main/java/io/ebeaninternal/dbmigration/DefaultDbMigration.java @@ -72,6 +72,8 @@ public class DefaultDbMigration implements DbMigration { private static final String GENERATED_COMMENT = "THIS IS A GENERATED FILE - DO NOT MODIFY"; + private boolean logToSystemOut = true; + /** * Set to true if DefaultDbMigration run with online EbeanServer instance. */ @@ -316,6 +318,11 @@ public class DefaultDbMigration implements DbMigration { return generateDiff(request); } + } catch (UnknownResourcePathException e) { + logError("ERROR - " + e.getMessage()); + logError("Check the working directory or change dbMigration.setPathToResources() value?"); + return null; + } finally { if (!online) { DbOffline.reset(); @@ -387,8 +394,7 @@ public class DefaultDbMigration implements DbMigration { private void writeExtraDdl(File migrationDir, DdlScript script) throws IOException { String fullName = repeatableMigrationName(script.isInit(), script.getName()); - - logger.info("writing repeatable script {}", fullName); + logger.debug("writing repeatable script {}", fullName); File file = new File(migrationDir, fullName); try (FileWriter writer = new FileWriter(file)) { @@ -397,6 +403,30 @@ public class DefaultDbMigration implements DbMigration { } } + @Override + public void setLogToSystemOut(boolean logToSystemOut) { + this.logToSystemOut = logToSystemOut; + } + + private void logError(String message) { + if (logToSystemOut) { + System.out.println("DbMigration> " + message); + } else { + logger.error(message); + } + } + + private void logInfo(String message, Object value) { + if (value != null) { + message = String.format(message, value); + } + if (logToSystemOut) { + System.out.println("DbMigration> " + message); + } else { + logger.info(message); + } + } + private String repeatableMigrationName(boolean init, String scriptName) { StringBuilder sb = new StringBuilder(); if (init) { @@ -416,12 +446,12 @@ public class DefaultDbMigration implements DbMigration { List pendingDrops = request.getPendingDrops(); if (!pendingDrops.isEmpty()) { - logger.info("Pending un-applied drops in versions {}", pendingDrops); + logInfo("Pending un-applied drops in versions %s", pendingDrops); } Migration migration = request.createDiffMigration(); if (migration == null) { - logger.info("no changes detected - no migration written"); + logInfo("no changes detected - no migration written", null); return null; } else { // there were actually changes to write @@ -440,7 +470,7 @@ public class DefaultDbMigration implements DbMigration { List pendingDrops = request.getPendingDrops(); if (!pendingDrops.isEmpty()) { - logger.info("... remaining pending un-applied drops in versions {}", pendingDrops); + logInfo("... remaining pending un-applied drops in versions %s", pendingDrops); } return version; } @@ -520,9 +550,9 @@ public class DefaultDbMigration implements DbMigration { String fullVersion = getFullVersion(request.nextVersion(), dropsFor); - logger.info("generating migration:{}", fullVersion); + logInfo("generating migration:%s", fullVersion); if (!request.dbinitMigration && !writeMigrationXml(dbMigration, request.modelDir, fullVersion)) { - logger.warn("migration already exists, not generating DDL"); + logError("migration already exists, not generating DDL"); return null; } else { if (!platforms.isEmpty()) { @@ -627,7 +657,6 @@ public class DefaultDbMigration implements DbMigration { if (vanillaPlatform || databasePlatform == null) { // not explicitly set so use the platform of the server databasePlatform = server.getDatabasePlatform(); - logger.trace("set platform to {}", databasePlatform.getName()); } if (migrationConfig != null) { if (strictMode != null) { @@ -713,13 +742,17 @@ public class DefaultDbMigration implements DbMigration { // path to src/main/resources in typical maven project File resourceRootDir = new File(pathToResources); + if (!resourceRootDir.exists()) { + String msg = String.format("Error - path to resources %s does not exist. Absolute path is %s", pathToResources, resourceRootDir.getAbsolutePath()); + throw new UnknownResourcePathException(msg); + } String resourcePath = migrationConfig.getMigrationPath(dbinitMigration); // expect to be a path to something like - src/main/resources/dbmigration/model File path = new File(resourceRootDir, resourcePath); if (!path.exists()) { if (!path.mkdirs()) { - logger.debug("Unable to ensure migration directory exists at {}", path.getAbsolutePath()); + logInfo("Warning - Unable to ensure migration directory exists at %s", path.getAbsolutePath()); } } return path; @@ -735,7 +768,7 @@ public class DefaultDbMigration implements DbMigration { } File modelDir = new File(migrationDirectory, migrationConfig.getModelPath()); if (!modelDir.exists() && !modelDir.mkdirs()) { - logger.debug("Unable to ensure migration model directory exists at {}", modelDir.getAbsolutePath()); + logInfo("Warning - Unable to ensure migration model directory exists at %s", modelDir.getAbsolutePath()); } return modelDir; } diff --git a/src/main/java/io/ebeaninternal/dbmigration/UnknownResourcePathException.java b/src/main/java/io/ebeaninternal/dbmigration/UnknownResourcePathException.java new file mode 100644 index 000000000..9ecfde157 --- /dev/null +++ b/src/main/java/io/ebeaninternal/dbmigration/UnknownResourcePathException.java @@ -0,0 +1,14 @@ +package io.ebeaninternal.dbmigration; + +/** + * Exception when db migration resource path does not exist. + *

+ * Typically the working directory or pathToResources is incorrect. + *

+ */ +public class UnknownResourcePathException extends RuntimeException { + + public UnknownResourcePathException(String msg) { + super(msg); + } +}