This is an automated email from the git hooks/post-receive script. New commit to branch feature/7549 in repository observe. See http://git.codelutin.com/observe.git commit 7791a1feb33067995d838a6d617ffc3a24b55416 Author: Sylvain Bavencoff <bavencoff@codelutin.com> Date: Wed Sep 30 16:07:44 2015 +0200 miragtion des base de données (refs #7549) --- .../fr/ird/observe/db/ObserveSwingDataSource.java | 17 +++++- .../ird/observe/ui/storage/ObstunaAdminAction.java | 69 ++++++++++++++++------ .../fr/ird/observe/ui/storage/StorageUIModel.java | 40 ++++++------- .../observe-application-swing_en_GB.properties | 4 ++ .../observe-application-swing_es_ES.properties | 4 ++ .../observe-application-swing_fr_FR.properties | 4 ++ .../controller/v1/DataSourceServiceController.java | 12 +++- .../migration/AbstractDataSourceMigration.java | 57 +++++++----------- .../i18n/observe-entities_en_GB.properties | 4 -- .../i18n/observe-entities_es_ES.properties | 4 -- .../i18n/observe-entities_fr_FR.properties | 4 -- .../services/service/DataSourceService.java | 10 +++- .../ObserveDataSourceInformation.java | 62 +++++++++++++++++++ .../services/service/DataSourceServiceTopia.java | 65 ++++++++++++++++---- 14 files changed, 251 insertions(+), 105 deletions(-) diff --git a/observe-application-swing/src/main/java/fr/ird/observe/db/ObserveSwingDataSource.java b/observe-application-swing/src/main/java/fr/ird/observe/db/ObserveSwingDataSource.java index 8547bfd..1ab99ab 100644 --- a/observe-application-swing/src/main/java/fr/ird/observe/db/ObserveSwingDataSource.java +++ b/observe-application-swing/src/main/java/fr/ird/observe/db/ObserveSwingDataSource.java @@ -14,6 +14,7 @@ import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationRest; import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationTopiaH2; import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationTopiaPG; import fr.ird.observe.services.configuration.ObserveDataSourceConnection; +import fr.ird.observe.services.configuration.ObserveDataSourceInformation; import fr.ird.observe.services.dto.DataSourceCreateConfigurationDto; import fr.ird.observe.services.dto.DataSourceCreateWithNoReferentialImportException; import fr.ird.observe.services.dto.IncompatibleDataSourceCreateConfigurationException; @@ -188,6 +189,16 @@ public class ObserveSwingDataSource extends AbstractSerializableBean { dataSourceService.applySecurity(users); } + public void migrateData() { + + Preconditions.checkState(isOpen(), "Connection is not open"); + + DataSourceService dataSourceService = newService(DataSourceService.class); + + dataSourceService.migrateData(); + + } + public boolean isOpen() { return connection != null; } @@ -227,13 +238,15 @@ public class ObserveSwingDataSource extends AbstractSerializableBean { } - public void checkCanConnect() throws DatabaseConnexionNotAuthorizedException, DatabaseNotFoundException { + public ObserveDataSourceInformation checkCanConnect() throws DatabaseConnexionNotAuthorizedException, DatabaseNotFoundException { Preconditions.checkState(connection == null, "Connection is alredy open"); DataSourceService dataSourceService = newService(DataSourceService.class); - dataSourceService.checkCanConnect(configuration); + ObserveDataSourceInformation dataSourceInformation = dataSourceService.checkCanConnect(configuration); + + return dataSourceInformation; } diff --git a/observe-application-swing/src/main/java/fr/ird/observe/ui/storage/ObstunaAdminAction.java b/observe-application-swing/src/main/java/fr/ird/observe/ui/storage/ObstunaAdminAction.java index 4f68ed6..6783328 100644 --- a/observe-application-swing/src/main/java/fr/ird/observe/ui/storage/ObstunaAdminAction.java +++ b/observe-application-swing/src/main/java/fr/ird/observe/ui/storage/ObstunaAdminAction.java @@ -29,6 +29,7 @@ import fr.ird.observe.db.constantes.DbMode; import fr.ird.observe.services.configuration.ObserveDataSourceConfiguration; import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationRest; import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationTopiaPG; +import fr.ird.observe.services.configuration.ObserveDataSourceInformation; import fr.ird.observe.services.dto.DataSourceCreateConfigurationDto; import fr.ird.observe.services.dto.IdDtos; import fr.ird.observe.services.dto.ObserveDbUserDto; @@ -41,6 +42,7 @@ import org.apache.commons.logging.LogFactory; import org.nuiton.util.version.Version; import org.nuiton.util.version.Versions; +import javax.swing.JOptionPane; import java.awt.Window; import java.util.Set; @@ -214,47 +216,73 @@ public enum ObstunaAdminAction { return new RemoteUILauncher(this, context, frame, t(getLabel())) { protected ObserveSwingDataSource dataSource; + protected ObserveDataSourceInformation dataSourceInformation; protected Version targetVersion; protected Set<ObserveDbUserDto> users; @Override protected void initTask(StorageUIModel model) throws Exception { - ObserveDataSourceConfigurationTopiaPG pgConfig = model.getPgConfig(); + if (DbMode.USE_REMOTE.equals(model.getDbMode())) { + ObserveDataSourceConfigurationTopiaPG pgConfig = model.getPgConfig(); + + dataSource = new ObserveSwingDataSource(pgConfig); - // pas autorise a migrer automatiquement - pgConfig.setCanMigrate(false); + } else { - dataSource = new ObserveSwingDataSource(pgConfig); + ObserveDataSourceConfigurationRest restConfig = model.getRestConfig(); + + dataSource = new ObserveSwingDataSource(restConfig); + } targetVersion = model.getConfig().getModelVersion(); users = model.getSecurityModel().getUsers(); + dataSourceInformation = model.getDataSourceInformation(); + } @Override protected void execute() throws Exception { - try { + Version dbVersion = dataSourceInformation.getVersion(); + if (! dataSourceInformation.getMigrations().isEmpty()) { - dataSource.open(); + if (dbVersion.before(dataSourceInformation.getMinnimumVersion())) { - Version dataSourceVersion = dataSource.getVersion(); + JOptionPane.showMessageDialog( + null, + t("observe.storage.migrate.not.possible.before.version.3.0.message", targetVersion, dbVersion), + t("observe.storage.migrate.not.possible.before.version.3.0.title", targetVersion), + JOptionPane.WARNING_MESSAGE); - if (dataSourceVersion.before(targetVersion)) { + } else { - if (log.isInfoEnabled()) { - log.info("Migrate data source " + dataSource.getLabel() + " in " + dataSourceVersion + " to " + targetVersion); - } + int answer = JOptionPane.showConfirmDialog( + null, + t("observe.storage.migrate.askUser.message", dbVersion, targetVersion, dataSourceInformation.getMigrations()), + t("observe.storage.migrate.askUser.title", targetVersion), + JOptionPane.YES_NO_OPTION, + JOptionPane.WARNING_MESSAGE); - // todo + if (answer == JOptionPane.YES_OPTION) { - } + try { - } finally { - if (dataSource.isOpen()) { - dataSource.close(); + dataSource.open(); + + if (log.isInfoEnabled()) { + log.info("Migrate data source " + dataSource.getLabel() + " in " + dbVersion + " to " + targetVersion); + } + + dataSource.migrateData(); + } finally { + if (dataSource.isOpen()) { + dataSource.close(); + } + } + } } } } @@ -269,7 +297,14 @@ public enum ObstunaAdminAction { if (log.isInfoEnabled()) { log.info("Apply security..."); } - dataSource.applySecurity(users); + try { + dataSource.open(); + dataSource.applySecurity(users); + } finally { + if (dataSource.isOpen()) { + dataSource.close(); + } + } } }; } diff --git a/observe-application-swing/src/main/java/fr/ird/observe/ui/storage/StorageUIModel.java b/observe-application-swing/src/main/java/fr/ird/observe/ui/storage/StorageUIModel.java index ec2e4d6..723c720 100644 --- a/observe-application-swing/src/main/java/fr/ird/observe/ui/storage/StorageUIModel.java +++ b/observe-application-swing/src/main/java/fr/ird/observe/ui/storage/StorageUIModel.java @@ -32,7 +32,7 @@ import fr.ird.observe.services.configuration.ObserveDataSourceConfiguration; import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationRest; import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationTopiaH2; import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationTopiaPG; -import fr.ird.observe.services.configuration.ObserveDataSourceConnection; +import fr.ird.observe.services.configuration.ObserveDataSourceInformation; import fr.ird.observe.services.dto.DataSourceCreateConfigurationDto; import fr.ird.observe.services.dto.ObserveDbUserDto; import fr.ird.observe.services.service.DataSourceDumpProducerService; @@ -196,7 +196,7 @@ public class StorageUIModel extends WizardModel<StorageStep> { protected String serverUrl; /** Les information de connextion a la base**/ - protected ObserveDataSourceConnection connection; + protected ObserveDataSourceInformation dataSourceInformation; /** le fichier d'import des donné */ protected File dumpFile; @@ -280,7 +280,7 @@ public class StorageUIModel extends WizardModel<StorageStep> { @Override public void propertyChange(PropertyChangeEvent evt) { setConnexionStatus(ConnexionStatus.UNTESTED); - connection = null; + dataSourceInformation = null; } }; @@ -916,10 +916,11 @@ public class StorageUIModel extends WizardModel<StorageStep> { if (getAdminAction() != null) { // il faut des droits rw sur la base distante - validate = connection.canReadReferential() && - connection.canWriteReferential() && - connection.canWriteData() && - connection.canReadData(); + validate = dataSourceInformation != null && + dataSourceInformation.canReadReferential() && + dataSourceInformation.canWriteReferential() && + dataSourceInformation.canWriteData() && + dataSourceInformation.canReadData(); } } } @@ -955,7 +956,7 @@ public class StorageUIModel extends WizardModel<StorageStep> { } if (validate) { - validate = centralSourceModel.getConnection().canReadReferential(); + validate = centralSourceModel.getDataSourceInformation().canReadReferential(); } break; } @@ -993,7 +994,7 @@ public class StorageUIModel extends WizardModel<StorageStep> { if (validate) { - validate = centralSourceModel.getConnection().canReadData(); + validate = centralSourceModel.getDataSourceInformation().canReadData(); } @@ -1083,13 +1084,11 @@ public class StorageUIModel extends WizardModel<StorageStep> { switch (dbMode) { case USE_LOCAL: case CREATE_LOCAL: - result = h2Config.isCanMigrate(); + result = true; break; case USE_REMOTE: - result = pgConfig.isCanMigrate(); - break; case USE_SERVER: - result = false; + result = ObstunaAdminAction.UPDATE.equals(adminAction); break; } } @@ -1675,15 +1674,12 @@ public class StorageUIModel extends WizardModel<StorageStep> { } - dataSource.checkCanConnect(); - - dataSource.open(); - - connection = dataSource.getConnection(); + dataSourceInformation = dataSource.checkCanConnect(); - Version versionDataSource = dataSource.getVersion(); + Version versionDataSource = dataSourceInformation.getVersion(); - if (getModelVersion().equals(versionDataSource)) { + // en mise a jour de la base on ne test pas la version + if (getModelVersion().equals(versionDataSource) || isCanMigrate()) { setConnexionStatus(ConnexionStatus.SUCCESS); @@ -1887,7 +1883,7 @@ public class StorageUIModel extends WizardModel<StorageStep> { } - public ObserveDataSourceConnection getConnection() { - return connection; + public ObserveDataSourceInformation getDataSourceInformation() { + return dataSourceInformation; } } diff --git a/observe-application-swing/src/main/resources/i18n/observe-application-swing_en_GB.properties b/observe-application-swing/src/main/resources/i18n/observe-application-swing_en_GB.properties index edc8d1e..90a1e49 100644 --- a/observe-application-swing/src/main/resources/i18n/observe-application-swing_en_GB.properties +++ b/observe-application-swing/src/main/resources/i18n/observe-application-swing_en_GB.properties @@ -1832,6 +1832,10 @@ observe.storage.message.destroying= observe.storage.message.opened= observe.storage.message.opening= observe.storage.message.provider.detected= +observe.storage.migrate.askUser.message=Database use version %1$s,\n\nYou need to migrate to version %2$s.\nWould you like to execute migration ?\n\nNote\: Following migrations will be applied\: %3$s. +observe.storage.migrate.askUser.title=Database update to version %1$s is required +observe.storage.migrate.not.possible.before.version.3.0.message=<html><body>The application version requires a database in minimum version <strong>3.0</strong>. You database is actually in version %s<br/>Do first a migration using ObServe 3.0 or 3.1, you will then be able to migrate your database using this version of ObServe</body></html> +observe.storage.migrate.not.possible.before.version.3.0.title=Can not migrate to databse in version %s observe.storage.no.creationMode= observe.storage.no.creationMode.required= observe.storage.no.dbMode= diff --git a/observe-application-swing/src/main/resources/i18n/observe-application-swing_es_ES.properties b/observe-application-swing/src/main/resources/i18n/observe-application-swing_es_ES.properties index 5fa9165..9793e78 100644 --- a/observe-application-swing/src/main/resources/i18n/observe-application-swing_es_ES.properties +++ b/observe-application-swing/src/main/resources/i18n/observe-application-swing_es_ES.properties @@ -1834,6 +1834,10 @@ observe.storage.message.destroying= observe.storage.message.opened= observe.storage.message.opening= observe.storage.message.provider.detected= +observe.storage.migrate.askUser.message=La base de datos tiene la versión %1$s,\n\n Es necesario una migración a la versión %2$s.\n¿Quiere migrar la base de datos ?\n\nNota \: Se aplicarán las siguientes actualizaciones \: %3$s. +observe.storage.migrate.askUser.title=Se requiera la actualización de la base de datos a la versión %1$s. +observe.storage.migrate.not.possible.before.version.3.0.message=<html><body>La version %s d'ObServe nécessite une base de version au moins <strong>3.0</strong>. Votre base est en version %s<br/>Veuillez dans un premier temps utiliser ObServe 3.0 ou 3.1 pour effectuer la migration puis réouvrir la base avec cette nouvelle version d'ObServe</body></html> +observe.storage.migrate.not.possible.before.version.3.0.title=Migration de base impossible en version %s observe.storage.no.creationMode=No se ha seleccionado ningún modo de creación observe.storage.no.creationMode.required=No requerido. observe.storage.no.dbMode=Ningún tipo de origen de datos seleccionado diff --git a/observe-application-swing/src/main/resources/i18n/observe-application-swing_fr_FR.properties b/observe-application-swing/src/main/resources/i18n/observe-application-swing_fr_FR.properties index 1ca4299..29407c9 100644 --- a/observe-application-swing/src/main/resources/i18n/observe-application-swing_fr_FR.properties +++ b/observe-application-swing/src/main/resources/i18n/observe-application-swing_fr_FR.properties @@ -1832,6 +1832,10 @@ observe.storage.message.destroying=Suppression de la source de données [%1$s] observe.storage.message.opened=Le service de persistence [%1$s] est ouvert observe.storage.message.opening=Ouverture de la connexion [%1$s] observe.storage.message.provider.detected= +observe.storage.migrate.askUser.message=La base de données est en version %1$s,\n\nUne migration en version %2$s est nécéssaire.\nVoulez vous migrer la base de données ?\n\nNote \: Les mises à jour suivantes seront appliquées \: %3$s. +observe.storage.migrate.askUser.title=Mise à jour de la base en version %1$s requise +observe.storage.migrate.not.possible.before.version.3.0.message=<html><body>La version %s d'ObServe nécessite une base de version au moins <strong>3.0</strong>. Votre base est en version %s<br/>Veuillez dans un premier temps utiliser ObServe 3.0 ou 3.1 pour effectuer la migration puis réouvrir la base avec cette nouvelle version d'ObServe</body></html> +observe.storage.migrate.not.possible.before.version.3.0.title=Migration de base impossible en version %s observe.storage.no.creationMode=Aucun mode de création sélectionné observe.storage.no.creationMode.required=Non requis. observe.storage.no.dbMode=Aucun type de source de données sélectionné diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/DataSourceServiceController.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/DataSourceServiceController.java index 6225f59..e1cef71 100644 --- a/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/DataSourceServiceController.java +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/DataSourceServiceController.java @@ -31,6 +31,7 @@ import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationAndCo import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationRest; import fr.ird.observe.services.configuration.ObserveDataSourceConnection; import fr.ird.observe.services.configuration.ObserveDataSourceConnectionRest; +import fr.ird.observe.services.configuration.ObserveDataSourceInformation; import fr.ird.observe.services.dto.DataSourceCreateConfigurationDto; import fr.ird.observe.services.dto.DataSourceCreateWithNoReferentialImportException; import fr.ird.observe.services.dto.IncompatibleDataSourceCreateConfigurationException; @@ -58,11 +59,13 @@ public class DataSourceServiceController extends ObserveServiceControllerSupport } @Override - public void checkCanConnect(ObserveDataSourceConfiguration dataSourceConfiguration) throws DatabaseConnexionNotAuthorizedException, DatabaseNotFoundException { + public ObserveDataSourceInformation checkCanConnect(ObserveDataSourceConfiguration dataSourceConfiguration) throws DatabaseConnexionNotAuthorizedException, DatabaseNotFoundException { ObserveDataSourceConfiguration dataSourceConfigurationTopia = getTopiaDataSourceConfiguration(dataSourceConfiguration); - getAnonymousService(dataSourceConfigurationTopia).checkCanConnect(dataSourceConfigurationTopia); + ObserveDataSourceInformation information = getAnonymousService(dataSourceConfigurationTopia).checkCanConnect(dataSourceConfigurationTopia); + + return information; } @Override @@ -121,6 +124,11 @@ public class DataSourceServiceController extends ObserveServiceControllerSupport } + @Override + public void migrateData() { + getAuthenticatedService().migrateData(); + } + protected ObserveDataSourceConfiguration getTopiaDataSourceConfiguration(ObserveDataSourceConfiguration dataSourceConfigurationFromRequest) { Preconditions.checkArgument(dataSourceConfigurationFromRequest instanceof ObserveDataSourceConfigurationRest); diff --git a/observe-entities/src/main/java/fr/ird/observe/entities/migration/AbstractDataSourceMigration.java b/observe-entities/src/main/java/fr/ird/observe/entities/migration/AbstractDataSourceMigration.java index d89d5fe..56934e9 100644 --- a/observe-entities/src/main/java/fr/ird/observe/entities/migration/AbstractDataSourceMigration.java +++ b/observe-entities/src/main/java/fr/ird/observe/entities/migration/AbstractDataSourceMigration.java @@ -21,19 +21,16 @@ */ package fr.ird.observe.entities.migration; +import com.google.common.collect.ImmutableList; import fr.ird.observe.ObserveTopiaApplicationContext; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.topia.migration.TopiaMigrationCallbackByClass; import org.nuiton.util.version.Version; -import org.nuiton.util.version.VersionBuilder; import org.nuiton.util.version.Versions; -import javax.swing.JOptionPane; import java.util.List; -import static org.nuiton.i18n.I18n.t; - /** * AbstractDataSourceMigration * @@ -94,6 +91,23 @@ public abstract class AbstractDataSourceMigration extends TopiaMigrationCallback V_4_0_RC3, V_4_0_RC4, V_4_0_RC6, V_4_0_RC7, V_4_0, V_4_0_1, V_4_0_2, V_5_0 }; + + public static ImmutableList<Version> getVersionsAfter(Version current) { + + ImmutableList.Builder<Version> builder = ImmutableList.builder(); + + for (Version version : availableVersions) { + + if (version.after(current)) { + + builder.add(version); + + } + } + + return builder.build(); + } + protected ObserveTopiaApplicationContext topiaApplicationContext; protected AbstractDataSourceMigration(MigrationCallBackForVersionResolver callBackResolver) { @@ -110,39 +124,8 @@ public abstract class AbstractDataSourceMigration extends TopiaMigrationCallback @Override public boolean askUser(Version dbVersion, List<Version> versions) { - - Version applicationVersion = VersionBuilder.create(topiaApplicationContext.getModelVersion()).build(); - - if (dbVersion.before(V_3_0)) { - - JOptionPane.showMessageDialog( - null, - t("observe.storage.migrate.not.possible.before.version.3.0.message", applicationVersion, dbVersion), - t("observe.storage.migrate.not.possible.before.version.3.0.title", applicationVersion), - JOptionPane.WARNING_MESSAGE); - - return false; - - } - - boolean autoMigrate = topiaApplicationContext.isAutoMigrate(); - - if (autoMigrate) { - - if (log.isInfoEnabled()) { - log.info("auto migrate mode"); - } - return true; - } - - int answer = JOptionPane.showConfirmDialog( - null, - t("observe.storage.migrate.askUser.message", dbVersion, applicationVersion, versions), - t("observe.storage.migrate.askUser.title", applicationVersion), - JOptionPane.YES_NO_OPTION, - JOptionPane.WARNING_MESSAGE); - - return answer == JOptionPane.YES_OPTION; + // on autorise les migrations dès quelles sont demandée pour une version égale ou superieur à la V3.0. + return dbVersion.afterOrEquals(V_3_0); } public void setTopiaApplicationContext(ObserveTopiaApplicationContext topiaApplicationContext) { diff --git a/observe-entities/src/main/resources/i18n/observe-entities_en_GB.properties b/observe-entities/src/main/resources/i18n/observe-entities_en_GB.properties index fd9fc16..42275ef 100644 --- a/observe-entities/src/main/resources/i18n/observe-entities_en_GB.properties +++ b/observe-entities/src/main/resources/i18n/observe-entities_en_GB.properties @@ -35,7 +35,3 @@ observe.persistence.oldCode3L=Old code\: observe.persistence.schoolType.libre=Free school type observe.persistence.schoolType.objet=Object school type observe.persistence.schoolType.undefined=Undefined school type -observe.storage.migrate.askUser.message=Database use version %1$s,\n\nYou need to migrate to version %2$s.\nWould you like to execute migration ?\n\nNote\: Following migrations will be applied\: %3$s. -observe.storage.migrate.askUser.title=Database update to version %1$s is required -observe.storage.migrate.not.possible.before.version.3.0.message=<html><body>The application version requires a database in minimum version <strong>3.0</strong>. You database is actually in version %s<br/>Do first a migration using ObServe 3.0 or 3.1, you will then be able to migrate your database using this version of ObServe</body></html> -observe.storage.migrate.not.possible.before.version.3.0.title=Can not migrate to databse in version %s diff --git a/observe-entities/src/main/resources/i18n/observe-entities_es_ES.properties b/observe-entities/src/main/resources/i18n/observe-entities_es_ES.properties index 87540c4..c12ab41 100644 --- a/observe-entities/src/main/resources/i18n/observe-entities_es_ES.properties +++ b/observe-entities/src/main/resources/i18n/observe-entities_es_ES.properties @@ -35,7 +35,3 @@ observe.persistence.oldCode3L=Antiguo código\: observe.persistence.schoolType.libre=Banco libre observe.persistence.schoolType.objet=Banco a objeto observe.persistence.schoolType.undefined=Banco indeterminado -observe.storage.migrate.askUser.message=La base de datos tiene la versión %1$s,\n\n Es necesario una migración a la versión %2$s.\n¿Quiere migrar la base de datos ?\n\nNota \: Se aplicarán las siguientes actualizaciones \: %3$s. -observe.storage.migrate.askUser.title=Se requiera la actualización de la base de datos a la versión %1$s. -observe.storage.migrate.not.possible.before.version.3.0.message=<html><body>La version %s d'ObServe nécessite une base de version au moins <strong>3.0</strong>. Votre base est en version %s<br/>Veuillez dans un premier temps utiliser ObServe 3.0 ou 3.1 pour effectuer la migration puis réouvrir la base avec cette nouvelle version d'ObServe</body></html> -observe.storage.migrate.not.possible.before.version.3.0.title=Migration de base impossible en version %s diff --git a/observe-entities/src/main/resources/i18n/observe-entities_fr_FR.properties b/observe-entities/src/main/resources/i18n/observe-entities_fr_FR.properties index 5f5de26..0fa154d 100644 --- a/observe-entities/src/main/resources/i18n/observe-entities_fr_FR.properties +++ b/observe-entities/src/main/resources/i18n/observe-entities_fr_FR.properties @@ -35,7 +35,3 @@ observe.persistence.oldCode3L=ancien code \: observe.persistence.schoolType.libre=Banc libre observe.persistence.schoolType.objet=Banc objet observe.persistence.schoolType.undefined=Banc indéterminé -observe.storage.migrate.askUser.message=La base de données est en version %1$s,\n\nUne migration en version %2$s est nécéssaire.\nVoulez vous migrer la base de données ?\n\nNote \: Les mises à jour suivantes seront appliquées \: %3$s. -observe.storage.migrate.askUser.title=Mise à jour de la base en version %1$s requise -observe.storage.migrate.not.possible.before.version.3.0.message=<html><body>La version %s d'ObServe nécessite une base de version au moins <strong>3.0</strong>. Votre base est en version %s<br/>Veuillez dans un premier temps utiliser ObServe 3.0 ou 3.1 pour effectuer la migration puis réouvrir la base avec cette nouvelle version d'ObServe</body></html> -observe.storage.migrate.not.possible.before.version.3.0.title=Migration de base impossible en version %s diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/DataSourceService.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/DataSourceService.java index bd380d0..bca26c5 100644 --- a/observe-services-api/src/main/java/fr/ird/observe/services/service/DataSourceService.java +++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/DataSourceService.java @@ -25,6 +25,7 @@ package fr.ird.observe.services.service; import fr.ird.observe.services.ObserveService; import fr.ird.observe.services.configuration.ObserveDataSourceConfiguration; import fr.ird.observe.services.configuration.ObserveDataSourceConnection; +import fr.ird.observe.services.configuration.ObserveDataSourceInformation; import fr.ird.observe.services.dto.DataSourceCreateConfigurationDto; import fr.ird.observe.services.dto.DataSourceCreateWithNoReferentialImportException; import fr.ird.observe.services.dto.IncompatibleDataSourceCreateConfigurationException; @@ -46,7 +47,7 @@ import java.util.Set; public interface DataSourceService extends ObserveService { @NoDataAccess - void checkCanConnect(ObserveDataSourceConfiguration dataSourceConfiguration) throws DatabaseNotFoundException, DatabaseConnexionNotAuthorizedException; + ObserveDataSourceInformation checkCanConnect(ObserveDataSourceConfiguration dataSourceConfiguration) throws DatabaseNotFoundException, DatabaseConnexionNotAuthorizedException; @NoDataAccess ObserveDataSourceConnection create(ObserveDataSourceConfiguration dataSourceConfiguration, DataSourceCreateConfigurationDto dataSourceCreateConfiguration) throws IncompatibleDataSourceCreateConfigurationException, DataSourceCreateWithNoReferentialImportException; @@ -70,4 +71,11 @@ public interface DataSourceService extends ObserveService { @WriteDataPermission @Write void applySecurity(Set<ObserveDbUserDto> users); + + @ReadReferentialPermission + @WriteReferentialPermission + @ReadDataPermission + @WriteDataPermission + @Write + void migrateData(); } diff --git a/observe-services-configuration-api/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceInformation.java b/observe-services-configuration-api/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceInformation.java new file mode 100644 index 0000000..91b7651 --- /dev/null +++ b/observe-services-configuration-api/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceInformation.java @@ -0,0 +1,62 @@ +package fr.ird.observe.services.configuration; + +import com.google.common.collect.ImmutableList; +import org.nuiton.util.version.Version; + +/** + * @author Sylvain Bavencoff - bavencoff@codelutin.com + */ +public class ObserveDataSourceInformation { + + protected final boolean readReferential; + + protected final boolean writeReferential; + + protected final boolean readData; + + protected final boolean writeData; + + protected final Version minnimumVersion; + + protected final Version version; + + protected final ImmutableList<Version> migrations; + + public ObserveDataSourceInformation(boolean readReferential, boolean writeReferential, boolean readData, boolean writeData, Version minnimumVersion, Version version, ImmutableList<Version> migrations) { + this.readReferential = readReferential; + this.writeReferential = writeReferential; + this.readData = readData; + this.writeData = writeData; + this.minnimumVersion = minnimumVersion; + this.version = version; + this.migrations = migrations; + } + + public boolean canReadReferential() { + return readReferential; + } + + public boolean canWriteReferential() { + return writeReferential; + } + + public boolean canReadData() { + return readData; + } + + public boolean canWriteData() { + return writeData; + } + + public Version getMinnimumVersion() { + return minnimumVersion; + } + + public Version getVersion() { + return version; + } + + public ImmutableList<Version> getMigrations() { + return migrations; + } +} diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/service/DataSourceServiceTopia.java b/observe-services-topia/src/main/java/fr/ird/observe/services/service/DataSourceServiceTopia.java index a531565..b238073 100644 --- a/observe-services-topia/src/main/java/fr/ird/observe/services/service/DataSourceServiceTopia.java +++ b/observe-services-topia/src/main/java/fr/ird/observe/services/service/DataSourceServiceTopia.java @@ -29,6 +29,7 @@ import com.google.common.collect.Sets; import fr.ird.observe.ObserveTopiaApplicationContext; import fr.ird.observe.ObserveTopiaConfiguration; import fr.ird.observe.ObserveTopiaConfigurationFactory; +import fr.ird.observe.entities.migration.AbstractDataSourceMigration; import fr.ird.observe.services.ObserveJdbcHelper; import fr.ird.observe.services.ObserveSecurityHelper; import fr.ird.observe.services.ObserveServiceTopia; @@ -38,6 +39,7 @@ import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationTopia import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationTopiaPG; import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationTopiaSupport; import fr.ird.observe.services.configuration.ObserveDataSourceConnectionTopia; +import fr.ird.observe.services.configuration.ObserveDataSourceInformation; import fr.ird.observe.services.dto.DataSourceCreateConfigurationDto; import fr.ird.observe.services.dto.DataSourceCreateWithNoReferentialImportException; import fr.ird.observe.services.dto.IncompatibleDataSourceCreateConfigurationException; @@ -64,11 +66,13 @@ public class DataSourceServiceTopia extends ObserveServiceTopia implements DataS private static final Log log = LogFactory.getLog(DataSourceServiceTopia.class); @Override - public void checkCanConnect(ObserveDataSourceConfiguration dataSourceConfiguration) throws DatabaseNotFoundException, DatabaseConnexionNotAuthorizedException { + public ObserveDataSourceInformation checkCanConnect(ObserveDataSourceConfiguration dataSourceConfiguration) throws DatabaseNotFoundException, DatabaseConnexionNotAuthorizedException { Preconditions.checkState(dataSourceConfiguration instanceof ObserveDataSourceConfigurationTopiaSupport); ObserveDataSourceConfigurationTopiaSupport dataSourceConfigurationTopiaSupport = (ObserveDataSourceConfigurationTopiaSupport) dataSourceConfiguration; + ObserveDataSourceInformation dataSourceInformation; + if (dataSourceConfigurationTopiaSupport.isH2Database()) { ObserveDataSourceConfigurationTopiaH2 h2DataSourceConfiguration = (ObserveDataSourceConfigurationTopiaH2) dataSourceConfigurationTopiaSupport; @@ -112,6 +116,8 @@ public class DataSourceServiceTopia extends ObserveServiceTopia implements DataS } + dataSourceInformation = getDataSourceInformation(h2DataSourceConfiguration, topiaConfiguration); + } else { @@ -135,8 +141,12 @@ public class DataSourceServiceTopia extends ObserveServiceTopia implements DataS } + dataSourceInformation = getDataSourceInformation(pgDataSourceConfiguration, topiaConfiguration); + } + return dataSourceInformation; + } @Override @@ -241,17 +251,19 @@ public class DataSourceServiceTopia extends ObserveServiceTopia implements DataS } - return createDataSourceConnection((ObserveDataSourceConfigurationTopiaSupport) dataSourceConfiguration, topiaApplicationContext.getConfiguration(), topiaApplicationContext.getAuthenticationToken()); + ObserveDataSourceInformation dataSourceInformation = getDataSourceInformation((ObserveDataSourceConfigurationTopiaSupport) dataSourceConfiguration, topiaApplicationContext.getConfiguration()); + + return createDataSourceConnection(dataSourceInformation, topiaApplicationContext.getAuthenticationToken()); } @Override public ObserveDataSourceConnectionTopia open(ObserveDataSourceConfiguration dataSourceConfiguration) throws DatabaseNotFoundException, DatabaseConnexionNotAuthorizedException { - checkCanConnect(dataSourceConfiguration); + ObserveDataSourceInformation dataSourceInformation = checkCanConnect(dataSourceConfiguration); ObserveTopiaApplicationContext topiaApplicationContext = ObserveTopiaApplicationContextFactory.getOrCreateTopiaApplicationContext((ObserveDataSourceConfigurationTopiaSupport) dataSourceConfiguration); - return createDataSourceConnection((ObserveDataSourceConfigurationTopiaSupport) dataSourceConfiguration, topiaApplicationContext.getConfiguration(), topiaApplicationContext.getAuthenticationToken()); + return createDataSourceConnection(dataSourceInformation, topiaApplicationContext.getAuthenticationToken()); } @@ -323,6 +335,20 @@ public class DataSourceServiceTopia extends ObserveServiceTopia implements DataS } + @Override + public void migrateData() { + + ObserveDataSourceConfigurationTopiaSupport dataSourceConfiguration = serviceContext.getDataSourceConfiguration(); + + Optional<ObserveTopiaApplicationContext> optionalTopiaApplicationContext = ObserveTopiaApplicationContextFactory.getTopiaApplicationContextIfPresent(dataSourceConfiguration); + + if (optionalTopiaApplicationContext.isPresent()) { + + optionalTopiaApplicationContext.get().getMigrationService().runSchemaMigration(); + } + + } + protected void executeGzipSqlStatements(ObserveTopiaApplicationContext topiaApplicationContext, String temporaryFilePrefix, byte... content) { File temporaryDirectory = serviceContext.createTemporaryDirectory(temporaryFilePrefix); @@ -335,7 +361,20 @@ public class DataSourceServiceTopia extends ObserveServiceTopia implements DataS } - protected ObserveDataSourceConnectionTopia createDataSourceConnection(ObserveDataSourceConfigurationTopiaSupport dataSourceConfiguration, ObserveTopiaConfiguration topiaConfiguration, String authenticationToken) { + protected ObserveDataSourceConnectionTopia createDataSourceConnection(ObserveDataSourceInformation dataSourceInformation, String authenticationToken) { + + ObserveDataSourceConnectionTopia dataSourceConnection = new ObserveDataSourceConnectionTopia( + authenticationToken, + dataSourceInformation.canReadReferential(), + dataSourceInformation.canWriteReferential(), + dataSourceInformation.canReadData(), + dataSourceInformation.canWriteData(), + dataSourceInformation.getVersion()); + + return dataSourceConnection; + } + + protected ObserveDataSourceInformation getDataSourceInformation(ObserveDataSourceConfigurationTopiaSupport dataSourceConfiguration, ObserveTopiaConfiguration topiaConfiguration) { boolean readReferential; boolean writeReferential; @@ -395,21 +434,23 @@ public class DataSourceServiceTopia extends ObserveServiceTopia implements DataS if (log.isDebugEnabled()) { log.debug("User can read refererential : " + readReferential + ", " + - "write referential : " + writeReferential + ", " + - "read data : " + readData + ", " + - "write data : " + writeData + "."); + "write referential : " + writeReferential + ", " + + "read data : " + readData + ", " + + "write data : " + writeData + "."); } - ObserveDataSourceConnectionTopia dataSourceConnection = new ObserveDataSourceConnectionTopia( - authenticationToken, + ObserveDataSourceInformation information = new ObserveDataSourceInformation( readReferential, writeReferential, readData, writeData, - version); - return dataSourceConnection; + AbstractDataSourceMigration.V_3_0, + version, + AbstractDataSourceMigration.getVersionsAfter(version)); + return information; } + protected static boolean canWrite(Set<?> privileges) { boolean result = privileges != null && privileges.contains("DELETE") && -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@list.forge.codelutin.com>.