This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository observe. See https://gitlab.nuiton.org/codelutin/observe.git commit 8708aaf9de6af6894ef8525332caa0cee8445acc Author: Tony CHEMIT <chemit@codelutin.com> Date: Fri Nov 4 10:52:16 2016 +0100 Déplacements du moteur de migration dans le module entities --- ...ObserveMigrationCallBackForVersionResolver.java | 94 -------------- .../ObserveMigrationConfigurationProviderImpl.java | 144 --------------------- entities/pom.xml | 4 + .../migration/AbstractDataSourceMigration.java | 5 - .../AbstractObserveMigrationCallBack.java | 20 +-- .../entities/migration/H2DataSourceMigration.java | 0 .../entities/migration/MigrationVersion.java | 20 +++ ...ObserveMigrationCallBackForVersionResolver.java | 87 +++++++++++++ .../ObserveMigrationConfigurationProvider.java | 105 ++++++++++++--- .../entities/migration/PGDataSourceMigration.java | 0 10 files changed, 210 insertions(+), 269 deletions(-) diff --git a/entities-migration/src/main/java/fr/ird/observe/entities/migration/ObserveMigrationCallBackForVersionResolver.java b/entities-migration/src/main/java/fr/ird/observe/entities/migration/ObserveMigrationCallBackForVersionResolver.java deleted file mode 100644 index ec0a59b..0000000 --- a/entities-migration/src/main/java/fr/ird/observe/entities/migration/ObserveMigrationCallBackForVersionResolver.java +++ /dev/null @@ -1,94 +0,0 @@ -/* - * #%L - * ObServe :: Entities Migration - * %% - * Copyright (C) 2008 - 2016 IRD, Codelutin, Tony Chemit - * %% - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program. If not, see - * <http://www.gnu.org/licenses/gpl-3.0.html>. - * #L% - */ -package fr.ird.observe.entities.migration; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.nuiton.topia.persistence.TopiaException; -import org.nuiton.topia.migration.TopiaMigrationCallbackByClass; -import org.nuiton.version.Version; - -import java.lang.reflect.Modifier; - -/** - * Le resolveur de classe de migration par version. - * - * @author Tony Chemit - chemit@codelutin.com - * @since 2.0 - */ -class ObserveMigrationCallBackForVersionResolver implements TopiaMigrationCallbackByClass.MigrationCallBackForVersionResolver { - - /** Logger */ - private static final Log log = - LogFactory.getLog(ObserveMigrationCallBackForVersionResolver.class); - - protected final String prefix; - - public ObserveMigrationCallBackForVersionResolver(String prefix) { - this.prefix = prefix; - } - - @SuppressWarnings({"unchecked"}) - @Override - public Class<? extends TopiaMigrationCallbackByClass.MigrationCallBackForVersion> getCallBack(Version version) { - - String mainclassName = getClass().getPackage().getName() + ".versions.DataSourceMigrationForVersion_" + version.getValidName(); - Class<? extends TopiaMigrationCallbackByClass.MigrationCallBackForVersion> result = null; - try { - Class<?> mainClass = Class.forName(mainclassName); - Class<?>[] declaredClasses = mainClass.getClasses(); - if (declaredClasses.length == 0) { - - // no specified class for the version, use the main one - result = (Class<? extends TopiaMigrationCallbackByClass.MigrationCallBackForVersion>) mainClass; - - // must check that the main class is not abstract - if (Modifier.isAbstract(mainClass.getModifiers())) { - throw new IllegalStateException("Could not find specialized migration class for version [" + version + "] in [" + mainclassName + "]"); - } - } else { - - // some specialized class exists, find the correct (with good prefix) - for (Class<?> declaredClass : declaredClasses) { - if (declaredClass.getSimpleName().startsWith(prefix)) { - - // found the good class - result = (Class<? extends TopiaMigrationCallbackByClass.MigrationCallBackForVersion>) declaredClass; - break; - } - } - - if (result == null) { - throw new IllegalStateException("Could not find specialized migration class for version [" + version + "] in [" + mainclassName + "]"); - } - } - - } catch (ClassNotFoundException e) { - throw new TopiaException("Could not find migration class [" + mainclassName + "] for version " + version); - } - - if (log.isDebugEnabled()) { - log.debug("[" + prefix + "] Resolved callback for version [" + version + "] : " + result.getName()); - } - return result; - } -} diff --git a/entities-migration/src/main/java/fr/ird/observe/entities/migration/ObserveMigrationConfigurationProviderImpl.java b/entities-migration/src/main/java/fr/ird/observe/entities/migration/ObserveMigrationConfigurationProviderImpl.java deleted file mode 100644 index 7a993f8..0000000 --- a/entities-migration/src/main/java/fr/ird/observe/entities/migration/ObserveMigrationConfigurationProviderImpl.java +++ /dev/null @@ -1,144 +0,0 @@ -package fr.ird.observe.entities.migration; - -/*- - * #%L - * ObServe :: Entities Migration - * %% - * Copyright (C) 2008 - 2016 IRD, Codelutin, Tony Chemit - * %% - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program. If not, see - * <http://www.gnu.org/licenses/gpl-3.0.html>. - * #L% - */ - -import com.google.common.collect.ImmutableList; -import org.nuiton.topia.migration.TopiaMigrationCallbackByClass; -import org.nuiton.version.Version; -import org.nuiton.version.Versions; - -import java.util.LinkedHashSet; -import java.util.Set; - -/** - * Created on 01/08/16. - * - * @author Tony Chemit - chemit@codelutin.com - */ -public final class ObserveMigrationConfigurationProviderImpl extends ObserveMigrationConfigurationProvider { - - public enum ObserveMigrationVersions { - - V_3_0("3.0", false), - V_3_1("3.1"), - V_3_5("3.5"), - V_3_7("3.7"), - V_3_8("3.8"), - V_3_9("3.9"), - V_3_10("3.10"), - V_3_11("3.11"), - V_3_12("3.12"), - V_3_14("3.14"), - V_3_15("3.15"), - V_3_16("3.16"), - V_4_0_RC2("4.0-RC2"), - V_4_0_RC3("4.0-RC3"), - V_4_0_RC4("4.0-RC4"), - V_4_0_RC6("4.0-RC6"), - V_4_0_RC7("4.0-RC7"), - V_4_0("4.0"), - V_4_0_1("4.0.1"), - V_4_0_2("4.0.2"), - V_4_0_4("4.0.4"), - V_4_900("4.900"), - V_4_901("4.901"), - V_4_902("4.902"), - V_4_903("4.903"), - V_4_904("4.904"), - V_4_905("4.905"), - V_4_906("4.906"), - V_5_0("5.0"), - V_5_1("5.1"); - - - private final Version version; - private final boolean canApply; - - ObserveMigrationVersions(String versionAsString, boolean canApply) { - this.version = Versions.valueOf(versionAsString); - this.canApply = canApply; - } - - ObserveMigrationVersions(String versionAsString) { - this(versionAsString, true); - } - - public Version getVersion() { - return version; - } - - } - - private final Version[] availableVersions; - - public ObserveMigrationConfigurationProviderImpl() { - - Set<Version> result = new LinkedHashSet<>(); - for (ObserveMigrationVersions version : ObserveMigrationVersions.values()) { - if (version.canApply) { - result.add(version.getVersion()); - } - } - this.availableVersions = result.toArray(new Version[result.size()]); - } - - @Override - public Version[] getAvailableVersions() { - return availableVersions; - } - - @Override - public Version getLastVersion() { - Version[] values = getAvailableVersions(); - int lastIndex = values.length - 1; - return values[lastIndex]; - } - - @Override - public Version getMinimumVersion() { - return ObserveMigrationVersions.V_3_0.getVersion(); - } - - @Override - public ImmutableList<Version> getVersionsAfter(Version current) { - - ImmutableList.Builder<Version> builder = ImmutableList.builder(); - - for (Version version : getAvailableVersions()) { - - if (version.after(current)) { - builder.add(version); - } - - } - - return builder.build(); - - } - - @Override - public Class<? extends TopiaMigrationCallbackByClass> getMigrationClassBack(boolean h2) { - return h2 ? H2DataSourceMigration.class : PGDataSourceMigration.class; - } - -} diff --git a/entities/pom.xml b/entities/pom.xml index ec5f34c..14b6966 100644 --- a/entities/pom.xml +++ b/entities/pom.xml @@ -69,6 +69,10 @@ <artifactId>commons-logging</artifactId> </dependency> <dependency> + <groupId>commons-io</groupId> + <artifactId>commons-io</artifactId> + </dependency> + <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> </dependency> diff --git a/entities-migration/src/main/java/fr/ird/observe/entities/migration/AbstractDataSourceMigration.java b/entities/src/main/java/fr/ird/observe/entities/migration/AbstractDataSourceMigration.java similarity index 90% rename from entities-migration/src/main/java/fr/ird/observe/entities/migration/AbstractDataSourceMigration.java rename to entities/src/main/java/fr/ird/observe/entities/migration/AbstractDataSourceMigration.java index 22806b8..9cf7e7a 100644 --- a/entities-migration/src/main/java/fr/ird/observe/entities/migration/AbstractDataSourceMigration.java +++ b/entities/src/main/java/fr/ird/observe/entities/migration/AbstractDataSourceMigration.java @@ -21,8 +21,6 @@ */ package fr.ird.observe.entities.migration; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; import org.nuiton.topia.migration.TopiaMigrationCallbackByClass; import org.nuiton.version.Version; @@ -36,9 +34,6 @@ import java.util.List; */ public abstract class AbstractDataSourceMigration extends TopiaMigrationCallbackByClass { - /** Logger. */ - private static final Log log = LogFactory.getLog(AbstractDataSourceMigration.class); - protected AbstractDataSourceMigration(MigrationCallBackForVersionResolver callBackResolver) { super(callBackResolver); } diff --git a/entities-migration/src/main/java/fr/ird/observe/entities/migration/AbstractObserveMigrationCallBack.java b/entities/src/main/java/fr/ird/observe/entities/migration/AbstractObserveMigrationCallBack.java similarity index 82% rename from entities-migration/src/main/java/fr/ird/observe/entities/migration/AbstractObserveMigrationCallBack.java rename to entities/src/main/java/fr/ird/observe/entities/migration/AbstractObserveMigrationCallBack.java index ce37a4c..55be2c1 100644 --- a/entities-migration/src/main/java/fr/ird/observe/entities/migration/AbstractObserveMigrationCallBack.java +++ b/entities/src/main/java/fr/ird/observe/entities/migration/AbstractObserveMigrationCallBack.java @@ -23,7 +23,6 @@ package fr.ird.observe.entities.migration; */ import com.google.common.base.Charsets; -import com.google.common.collect.Lists; import org.apache.commons.io.IOUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -36,6 +35,7 @@ import java.io.IOException; import java.io.InputStream; import java.sql.PreparedStatement; import java.sql.ResultSet; +import java.util.Arrays; import java.util.HashSet; import java.util.LinkedHashSet; import java.util.List; @@ -54,8 +54,8 @@ public abstract class AbstractObserveMigrationCallBack extends TopiaMigrationCal private final String scriptSuffix; - public AbstractObserveMigrationCallBack(Version version, TopiaMigrationCallbackByClass callBack, String scriptSuffix) { - super(version, callBack); + public AbstractObserveMigrationCallBack(Class type, TopiaMigrationCallbackByClass callBack, String scriptSuffix) { + super(ObserveMigrationConfigurationProvider.getVersion(type), callBack); this.scriptSuffix = scriptSuffix; } @@ -78,17 +78,19 @@ public abstract class AbstractObserveMigrationCallBack extends TopiaMigrationCal } - protected void addScript(String rank, String prefix, List<String> queries) { - - String[] migrationQueries = loadScript(rank, prefix); - queries.addAll(Lists.newArrayList(migrationQueries)); + protected void addScript(Version version, String rank, String prefix, List<String> queries) { + String[] migrationQueries = loadScript(version, rank, prefix); + queries.addAll(Arrays.asList(migrationQueries)); + } + protected void addScript(String rank, String prefix, List<String> queries) { + addScript(version, rank, prefix, queries); } - private String[] loadScript(String rank, String prefix) { + private String[] loadScript(Version version, String rank, String prefix) { String migrationScript = prefix + "-" + scriptSuffix + ".sql"; - String scriptPath = "/db/migration/V" + version.getValidName() + "_" + rank + "_" + migrationScript; + String scriptPath = "/db/migration/" + this.version + "/V" + version.getValidName() + "_" + rank + "_" + migrationScript; if (log.isInfoEnabled()) { log.info("Load migration script: " + scriptPath); diff --git a/entities-migration/src/main/java/fr/ird/observe/entities/migration/H2DataSourceMigration.java b/entities/src/main/java/fr/ird/observe/entities/migration/H2DataSourceMigration.java similarity index 100% rename from entities-migration/src/main/java/fr/ird/observe/entities/migration/H2DataSourceMigration.java rename to entities/src/main/java/fr/ird/observe/entities/migration/H2DataSourceMigration.java diff --git a/entities/src/main/java/fr/ird/observe/entities/migration/MigrationVersion.java b/entities/src/main/java/fr/ird/observe/entities/migration/MigrationVersion.java new file mode 100644 index 0000000..e9c0c33 --- /dev/null +++ b/entities/src/main/java/fr/ird/observe/entities/migration/MigrationVersion.java @@ -0,0 +1,20 @@ +package fr.ird.observe.entities.migration; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Created on 04/11/16. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 5.1 + */ +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +public @interface MigrationVersion { + + String version(); + +} diff --git a/entities/src/main/java/fr/ird/observe/entities/migration/ObserveMigrationCallBackForVersionResolver.java b/entities/src/main/java/fr/ird/observe/entities/migration/ObserveMigrationCallBackForVersionResolver.java new file mode 100644 index 0000000..da50f9a --- /dev/null +++ b/entities/src/main/java/fr/ird/observe/entities/migration/ObserveMigrationCallBackForVersionResolver.java @@ -0,0 +1,87 @@ +/* + * #%L + * ObServe :: Entities Migration + * %% + * Copyright (C) 2008 - 2016 IRD, Codelutin, Tony Chemit + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/gpl-3.0.html>. + * #L% + */ +package fr.ird.observe.entities.migration; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.topia.migration.TopiaMigrationCallbackByClass; +import org.nuiton.version.Version; + +import java.lang.reflect.Modifier; + +/** + * Le resolveur de classe de migration par version. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 2.0 + */ +class ObserveMigrationCallBackForVersionResolver implements TopiaMigrationCallbackByClass.MigrationCallBackForVersionResolver { + + /** Logger */ + private static final Log log = LogFactory.getLog(ObserveMigrationCallBackForVersionResolver.class); + + protected final String prefix; + + public ObserveMigrationCallBackForVersionResolver(String prefix) { + this.prefix = prefix; + } + + @Override + public Class<? extends TopiaMigrationCallbackByClass.MigrationCallBackForVersion> getCallBack(Version version) { + + Class<?> result = null; + + Class<?> mainClass = ObserveMigrationConfigurationProvider.getMigrationForVersionTypes().get(version); + Class<?>[] declaredClasses = mainClass.getClasses(); + if (declaredClasses.length == 0) { + + // no specified class for the version, use the main one + result = mainClass; + + // must check that the main class is not abstract + if (Modifier.isAbstract(mainClass.getModifiers())) { + throw new IllegalStateException("Could not find specialized migration class for version [" + version + "] in [" + mainClass.getName() + "]"); + } + } else { + + // some specialized class exists, find the correct (with good prefix) + for (Class<?> declaredClass : declaredClasses) { + if (declaredClass.getSimpleName().startsWith(prefix)) { + + // found the good class + result = declaredClass; + break; + } + } + + if (result == null) { + throw new IllegalStateException("Could not find specialized migration class for version [" + version + "] in [" + mainClass.getName() + "]"); + } + } + + + if (log.isDebugEnabled()) { + log.debug("[" + prefix + "] Resolved callback for version [" + version + "] : " + result.getName()); + } + return (Class<? extends TopiaMigrationCallbackByClass.MigrationCallBackForVersion>) result; + } +} diff --git a/entities/src/main/java/fr/ird/observe/entities/migration/ObserveMigrationConfigurationProvider.java b/entities/src/main/java/fr/ird/observe/entities/migration/ObserveMigrationConfigurationProvider.java index b09f94a..47de7f6 100644 --- a/entities/src/main/java/fr/ird/observe/entities/migration/ObserveMigrationConfigurationProvider.java +++ b/entities/src/main/java/fr/ird/observe/entities/migration/ObserveMigrationConfigurationProvider.java @@ -23,11 +23,21 @@ package fr.ird.observe.entities.migration; */ import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.nuiton.topia.migration.TopiaMigrationCallbackByClass; import org.nuiton.version.Version; +import org.nuiton.version.VersionBuilder; import org.reflections.Reflections; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Objects; import java.util.Set; +import java.util.TreeMap; /** * Created on 01/08/16. @@ -35,33 +45,94 @@ import java.util.Set; * @author Tony Chemit - chemit@codelutin.com * @since 5.0 */ -public abstract class ObserveMigrationConfigurationProvider { +public final class ObserveMigrationConfigurationProvider { + + /** Logger */ + private static final Log log = LogFactory.getLog(ObserveMigrationConfigurationProvider.class); private static ObserveMigrationConfigurationProvider INSTANCE; - public abstract Version[] getAvailableVersions(); + private static Map<Version, Class<?>> migrationForVersionTypes; - public abstract Version getLastVersion(); + private final Version[] availableVersions; - public abstract Version getMinimumVersion(); + public static Map<Version, Class<?>> getMigrationForVersionTypes() { + if (migrationForVersionTypes == null) { - public abstract ImmutableList<Version> getVersionsAfter(Version current); + TreeMap<Version, Class<?>> builder = new TreeMap<>(); - public abstract Class<? extends TopiaMigrationCallbackByClass> getMigrationClassBack(boolean h2); + Set<Class<?>> types = new Reflections("fr.ird.observe.entities.migration.versions").getTypesAnnotatedWith(MigrationVersion.class); + for (Class<?> type : types) { + Version version = getVersion(type); + builder.put(version, type); + if (log.isInfoEnabled()) { + log.info("Found migration version: " + version + " -> " + type.getName()); + } + } + migrationForVersionTypes = ImmutableMap.copyOf(builder); - public static ObserveMigrationConfigurationProvider get() { - if (INSTANCE == null) { + } + return migrationForVersionTypes; + } - Set<Class<? extends ObserveMigrationConfigurationProvider>> impls = new Reflections("fr.ird.observe.entities.migration").getSubTypesOf(ObserveMigrationConfigurationProvider.class); - if (impls.isEmpty()) { - throw new ExceptionInInitializerError("No migration configuration provider found."); - } - Class<? extends ObserveMigrationConfigurationProvider> impl = impls.iterator().next(); - try { - INSTANCE = impl.newInstance(); - } catch (InstantiationException | IllegalAccessException e) { - throw new ExceptionInInitializerError(e); + public static Version getVersion(Class type) { + + Objects.requireNonNull(type); + if (type.isMemberClass()) { + type = type.getEnclosingClass(); + } + MigrationVersion annotation = (MigrationVersion) type.getDeclaredAnnotation(MigrationVersion.class); + Objects.requireNonNull(annotation); + String version = annotation.version(); + return VersionBuilder.create(version).build(); + + } + + public ObserveMigrationConfigurationProvider() { + Set<Version> versionsSet = getMigrationForVersionTypes().keySet(); + List<Version> versions = new ArrayList<>(versionsSet); + Collections.sort(versions); + this.availableVersions = versions.toArray(new Version[versions.size()]); + } + + public Version[] getAvailableVersions() { + return availableVersions; + } + + public Version getLastVersion() { + Version[] values = getAvailableVersions(); + int lastIndex = values.length - 1; + return values[lastIndex]; + } + + + public ImmutableList<Version> getVersionsAfter(Version current) { + + ImmutableList.Builder<Version> builder = ImmutableList.builder(); + + for (Version version : getAvailableVersions()) { + + if (version.after(current)) { + builder.add(version); } + + } + + return builder.build(); + + } + + public Version getMinimumVersion() { + return VersionBuilder.create("3.0").build(); + } + + public Class<? extends TopiaMigrationCallbackByClass> getMigrationClassBack(boolean h2) { + return h2 ? H2DataSourceMigration.class : PGDataSourceMigration.class; + } + + public static ObserveMigrationConfigurationProvider get() { + if (INSTANCE == null) { + INSTANCE = new ObserveMigrationConfigurationProvider(); } return INSTANCE; } diff --git a/entities-migration/src/main/java/fr/ird/observe/entities/migration/PGDataSourceMigration.java b/entities/src/main/java/fr/ird/observe/entities/migration/PGDataSourceMigration.java similarity index 100% rename from entities-migration/src/main/java/fr/ird/observe/entities/migration/PGDataSourceMigration.java rename to entities/src/main/java/fr/ird/observe/entities/migration/PGDataSourceMigration.java -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.