From 197056dbc501dcfabec021e00b7d9393f1dd7c63 Mon Sep 17 00:00:00 2001 From: Roland Praml Date: Sat, 18 May 2019 01:32:17 +0200 Subject: [PATCH] Refactor: Ebean uses the MigrationVersion from the ebean-migration artifact (#1713) --- .../dbmigration/DefaultDbMigration.java | 2 +- .../dbmigration/LastMigration.java | 3 +- .../dbmigration/model/MigrationModel.java | 2 + .../dbmigration/model/MigrationResource.java | 1 + .../dbmigration/model/MigrationVersion.java | 211 ------------------ .../dbmigration/model/ModelContainer.java | 1 + .../dbmigration/model/PendingDrops.java | 1 + .../dbmigration/model/EntryTest.java | 1 + .../model/MigrationVersionTest.java | 19 +- .../model/ModelContainerApplyTest.java | 1 + .../dbmigration/model/ModelContainerTest.java | 1 + .../dbmigration/model/PendingDropsTest.java | 1 + 12 files changed, 27 insertions(+), 217 deletions(-) delete mode 100644 src/main/java/io/ebeaninternal/dbmigration/model/MigrationVersion.java diff --git a/src/main/java/io/ebeaninternal/dbmigration/DefaultDbMigration.java b/src/main/java/io/ebeaninternal/dbmigration/DefaultDbMigration.java index 464fdfbdc..0ce03379c 100644 --- a/src/main/java/io/ebeaninternal/dbmigration/DefaultDbMigration.java +++ b/src/main/java/io/ebeaninternal/dbmigration/DefaultDbMigration.java @@ -22,6 +22,7 @@ import io.ebean.config.dbplatform.sqlite.SQLitePlatform; import io.ebean.config.dbplatform.sqlserver.SqlServer16Platform; import io.ebean.config.dbplatform.sqlserver.SqlServer17Platform; import io.ebean.dbmigration.DbMigration; +import io.ebean.migration.MigrationVersion; import io.ebeaninternal.api.SpiEbeanServer; import io.ebeaninternal.dbmigration.ddlgeneration.DdlWrite; import io.ebeaninternal.dbmigration.migration.Migration; @@ -29,7 +30,6 @@ import io.ebeaninternal.dbmigration.migrationreader.MigrationXmlWriter; import io.ebeaninternal.dbmigration.model.CurrentModel; import io.ebeaninternal.dbmigration.model.MConfiguration; import io.ebeaninternal.dbmigration.model.MigrationModel; -import io.ebeaninternal.dbmigration.model.MigrationVersion; import io.ebeaninternal.dbmigration.model.ModelContainer; import io.ebeaninternal.dbmigration.model.ModelDiff; import io.ebeaninternal.dbmigration.model.PlatformDdlWriter; diff --git a/src/main/java/io/ebeaninternal/dbmigration/LastMigration.java b/src/main/java/io/ebeaninternal/dbmigration/LastMigration.java index 5baaa939e..1b063ba22 100644 --- a/src/main/java/io/ebeaninternal/dbmigration/LastMigration.java +++ b/src/main/java/io/ebeaninternal/dbmigration/LastMigration.java @@ -1,12 +1,13 @@ package io.ebeaninternal.dbmigration; -import io.ebeaninternal.dbmigration.model.MigrationVersion; import java.io.File; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import io.ebean.migration.MigrationVersion; + /** * Utility to determine the last sql migration version and next version. */ diff --git a/src/main/java/io/ebeaninternal/dbmigration/model/MigrationModel.java b/src/main/java/io/ebeaninternal/dbmigration/model/MigrationModel.java index cc1776c13..6fe5ed66b 100644 --- a/src/main/java/io/ebeaninternal/dbmigration/model/MigrationModel.java +++ b/src/main/java/io/ebeaninternal/dbmigration/model/MigrationModel.java @@ -3,6 +3,8 @@ package io.ebeaninternal.dbmigration.model; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import io.ebean.migration.MigrationVersion; + import java.io.File; import java.util.ArrayList; import java.util.Collections; diff --git a/src/main/java/io/ebeaninternal/dbmigration/model/MigrationResource.java b/src/main/java/io/ebeaninternal/dbmigration/model/MigrationResource.java index 6ef7ce995..eff454813 100644 --- a/src/main/java/io/ebeaninternal/dbmigration/model/MigrationResource.java +++ b/src/main/java/io/ebeaninternal/dbmigration/model/MigrationResource.java @@ -1,5 +1,6 @@ package io.ebeaninternal.dbmigration.model; +import io.ebean.migration.MigrationVersion; import io.ebeaninternal.dbmigration.migration.Migration; import io.ebeaninternal.dbmigration.migrationreader.MigrationXmlReader; diff --git a/src/main/java/io/ebeaninternal/dbmigration/model/MigrationVersion.java b/src/main/java/io/ebeaninternal/dbmigration/model/MigrationVersion.java deleted file mode 100644 index e2925055d..000000000 --- a/src/main/java/io/ebeaninternal/dbmigration/model/MigrationVersion.java +++ /dev/null @@ -1,211 +0,0 @@ -package io.ebeaninternal.dbmigration.model; - -import java.util.Arrays; -import java.util.regex.Pattern; - -/** - * The version of a migration used so that migrations are processed in order. - */ -public class MigrationVersion implements Comparable { - - private static final Pattern SECTION_SPLITTER = Pattern.compile("[\\.-]"); - - private static final int[] REPEAT_ORDERING = {Integer.MAX_VALUE}; - - private static final boolean[] REPEAT_UNDERSCORES = {false}; - - /** - * The raw version text. - */ - private final String raw; - - /** - * The ordering parts. - */ - private final int[] ordering; - - private final boolean[] underscores; - - private final String comment; - - /** - * Construct for "repeatable" version. - */ - private MigrationVersion(String raw, String comment) { - this.raw = raw; - this.comment = comment; - this.ordering = REPEAT_ORDERING; - this.underscores = REPEAT_UNDERSCORES; - } - - /** - * Construct for "normal" version. - */ - private MigrationVersion(String raw, int[] ordering, boolean[] underscores, String comment) { - this.raw = raw; - this.ordering = ordering; - this.underscores = underscores; - this.comment = comment; - } - - /** - * Return true if this is a "repeatable" version. - */ - public boolean isRepeatable() { - // Clarification: The comparison here is intended to compare object references and not the content of the arrays. - // This is a kind of shortcut to see if some configuration is in place that results in the use of something other than the default. - return ordering == REPEAT_ORDERING; - } - - /** - * Return the full version. - */ - public String getFull() { - return raw; - } - - @Override - public String toString() { - return raw; - } - - /** - * Return the version comment. - */ - public String getComment() { - return comment; - } - - /** - * Return the version in raw form. - */ - public String getRaw() { - return raw; - } - - /** - * Return the trimmed version excluding version comment and un-parsable string. - */ - public String asString() { - return formattedVersion(false, false); - } - - /** - * Return the trimmed version with any underscores replaced with '.' - */ - public String normalised() { - return formattedVersion(true, false); - } - - /** - * Return the next version based on this version. - */ - public String nextVersion() { - return formattedVersion(false, true); - } - - /** - * Returns the version part of the string. - *

- * Normalised means always use '.' delimiters (no underscores). - * NextVersion means bump/increase the last version number by 1. - */ - private String formattedVersion(boolean normalised, boolean nextVersion) { - - // Clarification: The comparison here is intended to compare object references and not the content of the arrays. - // This is a kind of shortcut to see if some configuration is in place that results in the use of something other than the default. - if (ordering == REPEAT_ORDERING) { - return "R"; - } - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < ordering.length; i++) { - if (i < ordering.length - 1) { - sb.append(ordering[i]); - if (normalised) { - sb.append('.'); - } else { - sb.append(underscores[i] ? '_' : '.'); - } - } else { - sb.append((nextVersion) ? ordering[i] + 1 : ordering[i]); - } - } - return sb.toString(); - } - - @Override - public int compareTo(MigrationVersion other) { - - int otherLength = other.ordering.length; - for (int i = 0; i < ordering.length; i++) { - if (i >= otherLength) { - // considered greater - return 1; - } - if (ordering[i] != other.ordering[i]) { - return (ordering[i] > other.ordering[i]) ? 1 : -1; - } - } - return comment.compareTo(other.comment); - } - - /** - * Parse the raw version string and just return the leading version number; - */ - public static String trim(String raw) { - return parse(raw).asString(); - } - - /** - * Parse the raw version string into a MigrationVersion. - */ - public static MigrationVersion parse(String raw) { - - if (raw.startsWith("V") || raw.startsWith("v")) { - raw = raw.substring(1); - } - - String comment = ""; - String value = raw; - int commentStart = raw.indexOf("__"); - if (commentStart > -1) { - // trim off the trailing comment - comment = raw.substring(commentStart + 2); - value = value.substring(0, commentStart); - } - - value = value.replace('_', '.'); - - String[] sections = SECTION_SPLITTER.split(value); - - if ("r".equalsIgnoreCase(sections[0])) { - // a "repeatable" version (does not have a version number) - return new MigrationVersion(raw, comment); - } - - boolean[] underscores = new boolean[sections.length]; - int[] ordering = new int[sections.length]; - - int delimiterPos = 0; - int stopIndex = 0; - for (int i = 0; i < sections.length; i++) { - try { - ordering[i] = Integer.parseInt(sections[i]); - stopIndex++; - - delimiterPos += sections[i].length(); - underscores[i] = (delimiterPos < raw.length() - 1 && raw.charAt(delimiterPos) == '_'); - delimiterPos++; - } catch (NumberFormatException e) { - // stop parsing - break; - } - } - - int[] actualOrder = Arrays.copyOf(ordering, stopIndex); - boolean[] actualUnderscores = Arrays.copyOf(underscores, stopIndex); - - return new MigrationVersion(raw, actualOrder, actualUnderscores, comment); - } - -} diff --git a/src/main/java/io/ebeaninternal/dbmigration/model/ModelContainer.java b/src/main/java/io/ebeaninternal/dbmigration/model/ModelContainer.java index d92adfb61..7f0e50fa1 100644 --- a/src/main/java/io/ebeaninternal/dbmigration/model/ModelContainer.java +++ b/src/main/java/io/ebeaninternal/dbmigration/model/ModelContainer.java @@ -1,5 +1,6 @@ package io.ebeaninternal.dbmigration.model; +import io.ebean.migration.MigrationVersion; import io.ebeaninternal.dbmigration.ddlgeneration.platform.DdlHelp; import io.ebeaninternal.dbmigration.ddlgeneration.platform.SplitColumns; import io.ebeaninternal.dbmigration.migration.AddColumn; diff --git a/src/main/java/io/ebeaninternal/dbmigration/model/PendingDrops.java b/src/main/java/io/ebeaninternal/dbmigration/model/PendingDrops.java index 44905aa02..9a0bdd242 100644 --- a/src/main/java/io/ebeaninternal/dbmigration/model/PendingDrops.java +++ b/src/main/java/io/ebeaninternal/dbmigration/model/PendingDrops.java @@ -1,5 +1,6 @@ package io.ebeaninternal.dbmigration.model; +import io.ebean.migration.MigrationVersion; import io.ebeaninternal.dbmigration.migration.ChangeSet; import io.ebeaninternal.dbmigration.migration.ChangeSetType; import io.ebeaninternal.dbmigration.migration.DropColumn; diff --git a/src/test/java/io/ebeaninternal/dbmigration/model/EntryTest.java b/src/test/java/io/ebeaninternal/dbmigration/model/EntryTest.java index 0a3546fd8..1a80bdc87 100644 --- a/src/test/java/io/ebeaninternal/dbmigration/model/EntryTest.java +++ b/src/test/java/io/ebeaninternal/dbmigration/model/EntryTest.java @@ -1,5 +1,6 @@ package io.ebeaninternal.dbmigration.model; +import io.ebean.migration.MigrationVersion; import io.ebeaninternal.dbmigration.migration.ChangeSet; import io.ebeaninternal.dbmigration.migration.DropColumn; import org.junit.Test; diff --git a/src/test/java/io/ebeaninternal/dbmigration/model/MigrationVersionTest.java b/src/test/java/io/ebeaninternal/dbmigration/model/MigrationVersionTest.java index cd85b241a..84101bfe7 100644 --- a/src/test/java/io/ebeaninternal/dbmigration/model/MigrationVersionTest.java +++ b/src/test/java/io/ebeaninternal/dbmigration/model/MigrationVersionTest.java @@ -2,12 +2,15 @@ package io.ebeaninternal.dbmigration.model; import org.junit.Test; +import io.ebean.migration.MigrationVersion; + import java.util.ArrayList; import java.util.Collections; import java.util.List; import static org.assertj.core.api.StrictAssertions.assertThat; +// FIXME: this test should be moved to ebean-migration artifact public class MigrationVersionTest { @@ -143,12 +146,20 @@ public class MigrationVersionTest { MigrationVersion v2 = MigrationVersion.parse("1.1_1.2_foo"); MigrationVersion v3 = MigrationVersion.parse("1.1_1.2__foo"); - assertThat(v0.compareTo(v1)).isGreaterThan(0); - assertThat(v1.compareTo(v0)).isLessThan(0); + // same version number, but not equal. It prints out the warning: + // The migrationscript '1.1.1.1_junk' contains non numeric version part. + // This may lead to misordered version scripts. + assertThat(v0.compareTo(v1)).isEqualTo(0); + assertThat(v0).isNotEqualTo(v1); + assertThat(v1.compareTo(v0)).isEqualTo(0); + assertThat(v1).isNotEqualTo(v0); assertThat(v1.compareTo(v2)).isEqualTo(0); + assertThat(v1).isNotEqualTo(v2); - assertThat(v0.compareTo(v3)).isLessThan(0); - assertThat(v3.compareTo(v0)).isGreaterThan(0); + assertThat(v0.compareTo(v3)).isEqualTo(0); + assertThat(v0).isNotEqualTo(v3); + assertThat(v3.compareTo(v0)).isEqualTo(0); + assertThat(v3).isNotEqualTo(v0); } @Test diff --git a/src/test/java/io/ebeaninternal/dbmigration/model/ModelContainerApplyTest.java b/src/test/java/io/ebeaninternal/dbmigration/model/ModelContainerApplyTest.java index 7f797c376..895b24f3f 100644 --- a/src/test/java/io/ebeaninternal/dbmigration/model/ModelContainerApplyTest.java +++ b/src/test/java/io/ebeaninternal/dbmigration/model/ModelContainerApplyTest.java @@ -1,5 +1,6 @@ package io.ebeaninternal.dbmigration.model; +import io.ebean.migration.MigrationVersion; import io.ebeaninternal.dbmigration.migration.AddColumn; import io.ebeaninternal.dbmigration.migration.ChangeSet; import io.ebeaninternal.dbmigration.migration.CreateTable; diff --git a/src/test/java/io/ebeaninternal/dbmigration/model/ModelContainerTest.java b/src/test/java/io/ebeaninternal/dbmigration/model/ModelContainerTest.java index 591e7aa99..f02ecede7 100644 --- a/src/test/java/io/ebeaninternal/dbmigration/model/ModelContainerTest.java +++ b/src/test/java/io/ebeaninternal/dbmigration/model/ModelContainerTest.java @@ -1,6 +1,7 @@ package io.ebeaninternal.dbmigration.model; +import io.ebean.migration.MigrationVersion; import io.ebeaninternal.dbmigration.migration.DropHistoryTable; import io.ebeaninternal.dbmigration.migration.DropIndex; import io.ebeaninternal.dbmigration.migration.DropTable; diff --git a/src/test/java/io/ebeaninternal/dbmigration/model/PendingDropsTest.java b/src/test/java/io/ebeaninternal/dbmigration/model/PendingDropsTest.java index 276a08ceb..df58fbc45 100644 --- a/src/test/java/io/ebeaninternal/dbmigration/model/PendingDropsTest.java +++ b/src/test/java/io/ebeaninternal/dbmigration/model/PendingDropsTest.java @@ -1,5 +1,6 @@ package io.ebeaninternal.dbmigration.model; +import io.ebean.migration.MigrationVersion; import io.ebeaninternal.dbmigration.migration.ChangeSet; import io.ebeaninternal.dbmigration.migration.DropColumn; import io.ebeaninternal.dbmigration.migration.Migration;