branch feature/7549 updated (853519a -> c2dc6f3)
This is an automated email from the git hooks/post-receive script. New change to branch feature/7549 in repository observe. See http://git.codelutin.com/observe.git from 853519a migrer une base sans l'ouvrir, verification de la version de la base local au chargement et migration si nécessaire (refs #7549) new c2dc6f3 verification des versions a la connection avec un serveur et a l'ouverture de la base (refs #7549) The 1 revisions listed above as "new" are entirely new to this repository and will be described in separate emails. The revisions listed as "adds" were already present in the repository and have only been added to this reference. Detailed log of new commits: commit c2dc6f30306756f621ae89b9d330267d4bca601f Author: Sylvain Bavencoff <bavencoff@codelutin.com> Date: Thu Oct 1 16:37:53 2015 +0200 verification des versions a la connection avec un serveur et a l'ouverture de la base (refs #7549) Summary of changes: .../observe/ObserveSwingApplicationContext.java | 6 ++- .../ObserveSwingApplicationConfig.java | 9 ++-- .../fr/ird/observe/db/ObserveSwingDataSource.java | 3 +- .../fr/ird/observe/ui/admin/AdminTabUIHandler.java | 3 +- .../java/fr/ird/observe/ui/admin/AdminUIModel.java | 3 +- .../observe/ui/admin/report/ReportUIHandler.java | 3 +- .../ird/observe/ui/storage/ObstunaAdminAction.java | 3 +- .../ird/observe/ui/storage/StorageUIHandler.java | 2 +- .../fr/ird/observe/ui/storage/StorageUIModel.java | 52 +++++++++++++++------- .../observe-application-swing_en_GB.properties | 1 + .../observe-application-swing_es_ES.properties | 1 + .../observe-application-swing_fr_FR.properties | 1 + .../web/ObserveWebApplicationContext.java | 6 ++- .../ObserveWebApplicationConfiguration.java | 10 +++++ .../ObserveWebApplicationConfigurationOption.java | 2 + .../controller/v1/DataSourceServiceController.java | 3 +- .../web/controller/v1/PingServiceController.java | 11 ++++- .../ObserveWebSecurityApplicationContext.java | 6 ++- .../src/main/resources/observeweb.conf | 3 +- .../migration/AbstractDataSourceMigration.java | 4 ++ .../services/service/BabModelVersionException.java | 34 ++++++++++++++ .../services/service/DataSourceService.java | 2 +- .../ird/observe/services/service/PingService.java | 5 +-- .../ObserveDataSourceConfiguration.java | 4 ++ .../ObserveDataSourceConfigurationRest.java | 17 +++++++ ...ObserveDataSourceConfigurationTopiaSupport.java | 13 ++++++ .../fr/ird/observe/services/TestClassResource.java | 5 +++ .../ird/observe/services/TestMethodResource.java | 10 +++-- .../service/DataSourceServiceRestTest.java | 4 +- .../ObserveDataSourceConfigurationMainFactory.java | 13 ++++-- .../services/service/DataSourceServiceTopia.java | 13 +++++- .../i18n/observe-services-topia_en_GB.properties | 1 + .../i18n/observe-services-topia_es_ES.properties | 1 + .../i18n/observe-services-topia_fr_FR.properties | 1 + .../services/ApplicationContextResource.java | 3 ++ .../services/service/AbstractServiceTopiaTest.java | 2 +- .../service/DataSourceServiceTopiaTest.java | 6 +-- .../fr/ird/observe/services/service/RigthTest.java | 36 ++++++++------- .../main/java/fr/ird/observe/test/TestHelper.java | 32 +++++++++++++ .../src/main/resources/observetest.properties | 3 ++ 40 files changed, 269 insertions(+), 68 deletions(-) create mode 100644 observe-services-api/src/main/java/fr/ird/observe/services/service/BabModelVersionException.java create mode 100644 observe-test-data/src/main/resources/observetest.properties -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@list.forge.codelutin.com>.
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 c2dc6f30306756f621ae89b9d330267d4bca601f Author: Sylvain Bavencoff <bavencoff@codelutin.com> Date: Thu Oct 1 16:37:53 2015 +0200 verification des versions a la connection avec un serveur et a l'ouverture de la base (refs #7549) --- .../observe/ObserveSwingApplicationContext.java | 6 ++- .../ObserveSwingApplicationConfig.java | 9 ++-- .../fr/ird/observe/db/ObserveSwingDataSource.java | 3 +- .../fr/ird/observe/ui/admin/AdminTabUIHandler.java | 3 +- .../java/fr/ird/observe/ui/admin/AdminUIModel.java | 3 +- .../observe/ui/admin/report/ReportUIHandler.java | 3 +- .../ird/observe/ui/storage/ObstunaAdminAction.java | 3 +- .../ird/observe/ui/storage/StorageUIHandler.java | 2 +- .../fr/ird/observe/ui/storage/StorageUIModel.java | 52 +++++++++++++++------- .../observe-application-swing_en_GB.properties | 1 + .../observe-application-swing_es_ES.properties | 1 + .../observe-application-swing_fr_FR.properties | 1 + .../web/ObserveWebApplicationContext.java | 6 ++- .../ObserveWebApplicationConfiguration.java | 10 +++++ .../ObserveWebApplicationConfigurationOption.java | 2 + .../controller/v1/DataSourceServiceController.java | 3 +- .../web/controller/v1/PingServiceController.java | 11 ++++- .../ObserveWebSecurityApplicationContext.java | 6 ++- .../src/main/resources/observeweb.conf | 3 +- .../migration/AbstractDataSourceMigration.java | 4 ++ .../services/service/BabModelVersionException.java | 34 ++++++++++++++ .../services/service/DataSourceService.java | 2 +- .../ird/observe/services/service/PingService.java | 5 +-- .../ObserveDataSourceConfiguration.java | 4 ++ .../ObserveDataSourceConfigurationRest.java | 17 +++++++ ...ObserveDataSourceConfigurationTopiaSupport.java | 13 ++++++ .../fr/ird/observe/services/TestClassResource.java | 5 +++ .../ird/observe/services/TestMethodResource.java | 10 +++-- .../service/DataSourceServiceRestTest.java | 4 +- .../ObserveDataSourceConfigurationMainFactory.java | 13 ++++-- .../services/service/DataSourceServiceTopia.java | 13 +++++- .../i18n/observe-services-topia_en_GB.properties | 1 + .../i18n/observe-services-topia_es_ES.properties | 1 + .../i18n/observe-services-topia_fr_FR.properties | 1 + .../services/ApplicationContextResource.java | 3 ++ .../services/service/AbstractServiceTopiaTest.java | 2 +- .../service/DataSourceServiceTopiaTest.java | 6 +-- .../fr/ird/observe/services/service/RigthTest.java | 36 ++++++++------- .../main/java/fr/ird/observe/test/TestHelper.java | 32 +++++++++++++ .../src/main/resources/observetest.properties | 3 ++ 40 files changed, 269 insertions(+), 68 deletions(-) diff --git a/observe-application-swing/src/main/java/fr/ird/observe/ObserveSwingApplicationContext.java b/observe-application-swing/src/main/java/fr/ird/observe/ObserveSwingApplicationContext.java index e60343c..d5e1a34 100644 --- a/observe-application-swing/src/main/java/fr/ird/observe/ObserveSwingApplicationContext.java +++ b/observe-application-swing/src/main/java/fr/ird/observe/ObserveSwingApplicationContext.java @@ -44,6 +44,7 @@ import fr.ird.observe.services.dto.longline.TripLonglineStubDto; import fr.ird.observe.services.dto.referential.ProgramDto; import fr.ird.observe.services.dto.referential.ProgramDtos; import fr.ird.observe.services.dto.seine.TripSeineStubDto; +import fr.ird.observe.services.service.BabModelVersionException; import fr.ird.observe.services.service.DatabaseConnexionNotAuthorizedException; import fr.ird.observe.services.service.DatabaseNotFoundException; import fr.ird.observe.services.service.ReferentialService; @@ -240,7 +241,8 @@ public class ObserveSwingApplicationContext extends DefaultApplicationContext { getConfig().getH2Login(), getConfig().getH2Password(), false, - false + false, + getConfig().getModelVersion() ); ObserveSwingDataSource result = new ObserveSwingDataSource(config); @@ -560,7 +562,7 @@ public class ObserveSwingApplicationContext extends DefaultApplicationContext { // la base locale existe, on l'ouvre dataSource.open(); success = true; - } catch (DatabaseConnexionNotAuthorizedException | DatabaseNotFoundException e) { + } catch (DatabaseConnexionNotAuthorizedException | DatabaseNotFoundException | BabModelVersionException e) { JOptionPane.showMessageDialog( null, e.getMessage(), diff --git a/observe-application-swing/src/main/java/fr/ird/observe/configuration/ObserveSwingApplicationConfig.java b/observe-application-swing/src/main/java/fr/ird/observe/configuration/ObserveSwingApplicationConfig.java index 499bfe8..43b5f3a 100644 --- a/observe-application-swing/src/main/java/fr/ird/observe/configuration/ObserveSwingApplicationConfig.java +++ b/observe-application-swing/src/main/java/fr/ird/observe/configuration/ObserveSwingApplicationConfig.java @@ -1023,7 +1023,8 @@ public class ObserveSwingApplicationConfig extends ApplicationConfig { getH2Login(), getH2Password(), isShowMigrationProgression(), - isShowMigrationSql() + isShowMigrationSql(), + getModelVersion() ); return result; } @@ -1039,7 +1040,8 @@ public class ObserveSwingApplicationConfig extends ApplicationConfig { getObstunaPassword(), isObstunaUseSsl(), isShowMigrationProgression(), - isShowMigrationSql() + isShowMigrationSql(), + getModelVersion() ); return result; } @@ -1053,7 +1055,8 @@ public class ObserveSwingApplicationConfig extends ApplicationConfig { getServerUrl(), getServerLogin(), getServerPassword(), - getServerDataBaseName() + getServerDataBaseName(), + getModelVersion() ); return result; } 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 c484126..a5a714c 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 @@ -20,6 +20,7 @@ import fr.ird.observe.services.dto.DataSourceCreateWithNoReferentialImportExcept import fr.ird.observe.services.dto.IncompatibleDataSourceCreateConfigurationException; import fr.ird.observe.services.dto.ObserveDbUserDto; import fr.ird.observe.services.dto.constants.ReferentialLocale; +import fr.ird.observe.services.service.BabModelVersionException; import fr.ird.observe.services.service.DataSourceService; import fr.ird.observe.services.service.DatabaseConnexionNotAuthorizedException; import fr.ird.observe.services.service.DatabaseNotFoundException; @@ -104,7 +105,7 @@ public class ObserveSwingDataSource extends AbstractSerializableBean { return result; } - public void open() throws DatabaseConnexionNotAuthorizedException, DatabaseNotFoundException { + public void open() throws DatabaseConnexionNotAuthorizedException, DatabaseNotFoundException, BabModelVersionException { Preconditions.checkState(!isOpen(), "Connection is alredy open"); diff --git a/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/AdminTabUIHandler.java b/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/AdminTabUIHandler.java index eec3d9f..8f84236 100644 --- a/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/AdminTabUIHandler.java +++ b/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/AdminTabUIHandler.java @@ -30,6 +30,7 @@ import fr.ird.observe.business.db.DataSourceException; import fr.ird.observe.business.gps.GPSService; import fr.ird.observe.business.validation.ValidationService; import fr.ird.observe.db.ObserveSwingDataSource; +import fr.ird.observe.services.service.BabModelVersionException; import fr.ird.observe.services.service.DatabaseConnexionNotAuthorizedException; import fr.ird.observe.services.service.DatabaseNotFoundException; import fr.ird.observe.ui.DecoratorService; @@ -388,7 +389,7 @@ public class AdminTabUIHandler implements SendMessageAble { // } } - protected void openSource(ObserveSwingDataSource service) throws DatabaseConnexionNotAuthorizedException, DatabaseNotFoundException { + protected void openSource(ObserveSwingDataSource service) throws DatabaseConnexionNotAuthorizedException, DatabaseNotFoundException, BabModelVersionException { addStorageServiceLogger(service); if (!service.isOpen()) { service.open(); diff --git a/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/AdminUIModel.java b/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/AdminUIModel.java index 0481a5a..d935954 100644 --- a/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/AdminUIModel.java +++ b/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/AdminUIModel.java @@ -28,6 +28,7 @@ import fr.ird.observe.configuration.ObserveSwingApplicationConfig; import fr.ird.observe.db.ObserveSwingDataSource; import fr.ird.observe.db.constantes.DbMode; import fr.ird.observe.services.configuration.ObserveDataSourceConfiguration; +import fr.ird.observe.services.service.BabModelVersionException; import fr.ird.observe.services.service.DatabaseConnexionNotAuthorizedException; import fr.ird.observe.services.service.DatabaseNotFoundException; import fr.ird.observe.ui.admin.consolidate.ConsolidateModel; @@ -1327,7 +1328,7 @@ public class AdminUIModel extends WizardExtModel<AdminStep> { if (source != null && !source.isOpen()) { try { source.open(); - } catch (DatabaseConnexionNotAuthorizedException | DatabaseNotFoundException e) { + } catch (DatabaseConnexionNotAuthorizedException | DatabaseNotFoundException | BabModelVersionException e) { throw new IllegalStateException("Could not open " + source, e); } } diff --git a/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/report/ReportUIHandler.java b/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/report/ReportUIHandler.java index a0a06c9..be16b95 100644 --- a/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/report/ReportUIHandler.java +++ b/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/report/ReportUIHandler.java @@ -27,6 +27,7 @@ import fr.ird.observe.business.report.model.ReportExecute; import fr.ird.observe.business.report.model.ReportVariable; import fr.ird.observe.db.ObserveSwingDataSource; import fr.ird.observe.services.dto.IdDto; +import fr.ird.observe.services.service.BabModelVersionException; import fr.ird.observe.services.service.DatabaseConnexionNotAuthorizedException; import fr.ird.observe.services.service.DatabaseNotFoundException; import fr.ird.observe.ui.UIHelper; @@ -502,7 +503,7 @@ public class ReportUIHandler extends AdminTabUIHandler { } try { openSource(source); - } catch (DatabaseConnexionNotAuthorizedException | DatabaseNotFoundException eee) { + } catch (DatabaseConnexionNotAuthorizedException | DatabaseNotFoundException | BabModelVersionException eee) { throw new IllegalStateException( "Could not open data source " + source.getLabel(), eee); } 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 59fb938..64d5dc2 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 @@ -33,6 +33,7 @@ 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; +import fr.ird.observe.services.service.BabModelVersionException; import fr.ird.observe.services.service.DatabaseConnexionNotAuthorizedException; import fr.ird.observe.services.service.DatabaseNotFoundException; import fr.ird.observe.ui.storage.tabs.DataSelectionModel; @@ -83,7 +84,7 @@ public enum ObstunaAdminAction { super.init(ui); } - protected void checkImportDbVersion(StorageUIModel model, ObserveDataSourceConfiguration dataSourceConfig) throws DatabaseConnexionNotAuthorizedException, DatabaseNotFoundException { + protected void checkImportDbVersion(StorageUIModel model, ObserveDataSourceConfiguration dataSourceConfig) throws DatabaseConnexionNotAuthorizedException, DatabaseNotFoundException, BabModelVersionException { ObserveSwingDataSource importDataSource = new ObserveSwingDataSource(dataSourceConfig); diff --git a/observe-application-swing/src/main/java/fr/ird/observe/ui/storage/StorageUIHandler.java b/observe-application-swing/src/main/java/fr/ird/observe/ui/storage/StorageUIHandler.java index 893bdda..6ee0435 100644 --- a/observe-application-swing/src/main/java/fr/ird/observe/ui/storage/StorageUIHandler.java +++ b/observe-application-swing/src/main/java/fr/ird/observe/ui/storage/StorageUIHandler.java @@ -495,7 +495,7 @@ public class StorageUIHandler { // si on utilise la base local on lance une migration de la base si necessaire if (DbMode.USE_LOCAL.equals((model.getDbMode()))) { - ObserveDataSourceInformation dataSourceInformation = model.getDataSourceInformation(); + ObserveDataSourceInformation dataSourceInformation = currentDataSource.checkCanConnect(); currentDataSource.migrateData(dataSourceInformation, config.getModelVersion()); 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 723c720..b82e454 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 @@ -35,6 +35,7 @@ import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationTopia 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.BabModelVersionException; import fr.ird.observe.services.service.DataSourceDumpProducerService; import fr.ird.observe.services.service.DatabaseConnexionNotAuthorizedException; import fr.ird.observe.services.service.DatabaseNotFoundException; @@ -255,7 +256,8 @@ public class StorageUIModel extends WizardModel<StorageStep> { "", EMPTY_PASSWORD, false, - false + false, + null ); pgConfig = configurationMainFactory.createObserveDataSourceConfigurationTopiaPG( @@ -265,7 +267,8 @@ public class StorageUIModel extends WizardModel<StorageStep> { EMPTY_PASSWORD, false, false, - false + false, + null ); restConfig = configurationMainFactory.createObserveDataSourceConfigurationRest( @@ -273,6 +276,7 @@ public class StorageUIModel extends WizardModel<StorageStep> { null, "", EMPTY_PASSWORD, + null, null ); @@ -1502,7 +1506,7 @@ public class StorageUIModel extends WizardModel<StorageStep> { restConfig = sourceConfig; } - public DataSourceCreateConfigurationDto getCreationConfigurationDto() throws IOException, DatabaseConnexionNotAuthorizedException, DatabaseNotFoundException { + public DataSourceCreateConfigurationDto getCreationConfigurationDto() throws IOException, DatabaseConnexionNotAuthorizedException, DatabaseNotFoundException, BabModelVersionException { DataSourceCreateConfigurationDto result = null; @@ -1567,7 +1571,8 @@ public class StorageUIModel extends WizardModel<StorageStep> { h2Config.getUsername(), h2Config.getPassword(), h2Config.isShowMigrationProgression(), - h2Config.isShowMigrationSql() + h2Config.isShowMigrationSql(), + h2Config.getModelVersion() ); return result; } @@ -1583,7 +1588,8 @@ public class StorageUIModel extends WizardModel<StorageStep> { pgConfig.getPassword(), pgConfig.isUseSsl(), pgConfig.isShowMigrationProgression(), - pgConfig.isShowMigrationSql() + pgConfig.isShowMigrationSql(), + pgConfig.getModelVersion() ); return result; } @@ -1597,7 +1603,8 @@ public class StorageUIModel extends WizardModel<StorageStep> { restConfig.getServerUrl(), restConfig.getLogin(), restConfig.getPassword(), - restConfig.getOptionalDatabaseName().orNull() + restConfig.getOptionalDatabaseName().orNull(), + restConfig.getModelVersion() ); return result; } @@ -1638,6 +1645,7 @@ public class StorageUIModel extends WizardModel<StorageStep> { ObserveDataSourceConfiguration config = null; boolean result = false; + boolean error = false; connexionStatusError = ""; if (isEditRemoteConfig()) { @@ -1670,27 +1678,39 @@ public class StorageUIModel extends WizardModel<StorageStep> { PingService pingService = dataSource.newService(PingService.class); - pingService.ping(); + Version modelServerVersion = pingService.ping(); + + if (! getModelVersion().equals(modelServerVersion)) { + + connexionStatusError = t("observe.storage.error.serverVersionMismatch", modelServerVersion, getModelVersion()); + + setConnexionStatus(ConnexionStatus.FAILED); + + error = true; + } } - dataSourceInformation = dataSource.checkCanConnect(); + if (!error) { - Version versionDataSource = dataSourceInformation.getVersion(); + dataSourceInformation = dataSource.checkCanConnect(); - // en mise a jour de la base on ne test pas la version - if (getModelVersion().equals(versionDataSource) || isCanMigrate()) { + Version versionDataSource = dataSourceInformation.getVersion(); - setConnexionStatus(ConnexionStatus.SUCCESS); + // en mise a jour de la base on ne test pas la version + if (getModelVersion().equals(versionDataSource) || isCanMigrate()) { - result = true; + setConnexionStatus(ConnexionStatus.SUCCESS); - } else { + result = true; - connexionStatusError = t("observe.storage.error.dbVersionMismatch", versionDataSource, getModelVersion()); + } else { + + connexionStatusError = t("observe.storage.error.dbVersionMismatch", versionDataSource, getModelVersion()); - setConnexionStatus(ConnexionStatus.FAILED); + setConnexionStatus(ConnexionStatus.FAILED); + } } } catch (Exception e) { 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 90a1e49..05aafb4 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 @@ -1792,6 +1792,7 @@ observe.storage.detail.remote= observe.storage.detail.server= observe.storage.error.badUrl= observe.storage.error.dbVersionMismatch= +observe.storage.error.serverVersionMismatch= observe.storage.importExternalDump.config= observe.storage.importExternalDump.description= observe.storage.importExternalDumpData.config= 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 9793e78..8f2bd44 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 @@ -1794,6 +1794,7 @@ observe.storage.detail.remote= observe.storage.detail.server= observe.storage.error.badUrl= observe.storage.error.dbVersionMismatch=La versión de la base remota (%s)no es compatible con la versión del modelo (%s). +observe.storage.error.serverVersionMismatch= observe.storage.importExternalDump.config=Selección de la copia de seguridad a utilizar observe.storage.importExternalDump.description=Seleccione el archivo de una copia de seguridad (*.sql.gz). observe.storage.importExternalDumpData.config= 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 29407c9..7183def 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 @@ -1793,6 +1793,7 @@ observe.storage.detail.remote=- URL JDBC \: %1s\n- Login \: %2s\n- Mot de passe observe.storage.detail.server=- URL serveur \: %1s\n- Login \: %2s\n- Mot de passe \: %3s \n- Base de données \: %4s observe.storage.error.badUrl=Erreur dans le format de l'URL %s observe.storage.error.dbVersionMismatch=La version de la base distante (%s) n'est pas compatible avec la version du modèle (%s) +observe.storage.error.serverVersionMismatch=La version du serveur distant (%s) n'est pas compatible avec la version du modèle (%s) observe.storage.importExternalDump.config=Sélection de la sauvegarde à utiliser observe.storage.importExternalDump.description=Veuillez sélectionner le fichier d'une sauvegarde (*.sql.gz). observe.storage.importExternalDumpData.config=Choisir la sauvegarde contenant les données à importer diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveWebApplicationContext.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveWebApplicationContext.java index fcd5112..9ace49b 100644 --- a/observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveWebApplicationContext.java +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveWebApplicationContext.java @@ -41,6 +41,7 @@ import fr.ird.observe.services.ObserveServiceInitializer; import fr.ird.observe.services.ObserveServiceMainFactory; import fr.ird.observe.services.dto.gson.ObserveDtoGsonSupplier; import org.debux.webmotion.server.call.HttpContext; +import org.nuiton.util.version.Version; import javax.servlet.ServletContext; import java.io.Closeable; @@ -97,7 +98,10 @@ public class ObserveWebApplicationContext implements Closeable { // init security application context securityApplicationContext = new ObserveWebSecurityApplicationContext(); - securityApplicationContext.init(databases, users); + + Version modelVersion = applicationConfiguration.getModelVersion(); + + securityApplicationContext.init(databases, users, modelVersion); // init service factory mainServiceFactory = ObserveServiceMainFactory.get(); diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/ObserveWebApplicationConfiguration.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/ObserveWebApplicationConfiguration.java index de0c1dc..624debf 100644 --- a/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/ObserveWebApplicationConfiguration.java +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/ObserveWebApplicationConfiguration.java @@ -33,6 +33,7 @@ import org.nuiton.config.ApplicationConfig; import org.nuiton.config.ApplicationConfigHelper; import org.nuiton.config.ApplicationConfigProvider; import org.nuiton.config.ArgumentsParserException; +import org.nuiton.util.version.Version; import java.io.BufferedReader; import java.io.File; @@ -81,6 +82,15 @@ public class ObserveWebApplicationConfiguration { return applicationConfig.getOptionAsBoolean(ObserveWebApplicationConfigurationOption.DEV_MODE.getKey()); } + public Version getVersion() { + return applicationConfig.getOption(Version.class, ObserveWebApplicationConfigurationOption.BUILD_VERSION.getKey()); + } + + public Version getModelVersion() { + Version result = applicationConfig.getOption(Version.class, ObserveWebApplicationConfigurationOption.MODEL_VERSION.getKey()); + return result; + } + public File getBaseDirectory() { return applicationConfig.getOptionAsFile(ObserveWebApplicationConfigurationOption.BASE_DIRECTORY.getKey()); } diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/ObserveWebApplicationConfigurationOption.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/ObserveWebApplicationConfigurationOption.java index 36ecc5b..63deb06 100644 --- a/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/ObserveWebApplicationConfigurationOption.java +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/ObserveWebApplicationConfigurationOption.java @@ -51,6 +51,8 @@ public enum ObserveWebApplicationConfigurationOption implements ConfigOptionDef ADMIN_API_KEY("observeweb.adminApiKey", n("observeweb.adminApiKey.description"), "changeme", String.class), API_URL("observeweb.apiUrl", n("observeweb.apiUrl.description"), "http://localhost:8080/observeweb/api/v1", URL.class), + MODEL_VERSION("observeweb.model.version", n("observe.model.version"), null, Version.class), + DEV_MODE("observeweb.devMode", n("observeweb.devMode.description"), "true", boolean.class), BASE_DIRECTORY("observeweb.baseDirectory", n("observeweb.baseDirectory.description"), "/var/local/observeweb", File.class), TEMPORARY_DIRECTORY("observeweb.temporaryDirectory", n("observeweb.temporaryDirectory.description"), "${observeweb.baseDirectory}/temp", File.class), 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 e1cef71..5f486e6 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 @@ -36,6 +36,7 @@ import fr.ird.observe.services.dto.DataSourceCreateConfigurationDto; import fr.ird.observe.services.dto.DataSourceCreateWithNoReferentialImportException; import fr.ird.observe.services.dto.IncompatibleDataSourceCreateConfigurationException; import fr.ird.observe.services.dto.ObserveDbUserDto; +import fr.ird.observe.services.service.BabModelVersionException; import fr.ird.observe.services.service.DataSourceService; import fr.ird.observe.services.service.DatabaseConnexionNotAuthorizedException; import fr.ird.observe.services.service.DatabaseNotFoundException; @@ -82,7 +83,7 @@ public class DataSourceServiceController extends ObserveServiceControllerSupport } @Override - public ObserveDataSourceConnectionRest open(ObserveDataSourceConfiguration dataSourceConfiguration) throws DatabaseNotFoundException, DatabaseConnexionNotAuthorizedException { + public ObserveDataSourceConnectionRest open(ObserveDataSourceConfiguration dataSourceConfiguration) throws DatabaseNotFoundException, DatabaseConnexionNotAuthorizedException, BabModelVersionException { ObserveDataSourceConfiguration dataSourceConfigurationTopia = getTopiaDataSourceConfiguration(dataSourceConfiguration); diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/PingServiceController.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/PingServiceController.java index 992c4c8..8654907 100644 --- a/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/PingServiceController.java +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/PingServiceController.java @@ -22,8 +22,10 @@ package fr.ird.observe.application.web.controller.v1; * #L% */ +import fr.ird.observe.application.web.configuration.ObserveWebApplicationConfiguration; import fr.ird.observe.application.web.controller.ObserveWebMotionController; import fr.ird.observe.services.service.PingService; +import org.nuiton.util.version.Version; /** * Created on 06/09/15. @@ -32,8 +34,13 @@ import fr.ird.observe.services.service.PingService; */ public class PingServiceController extends ObserveWebMotionController implements PingService { - public String ping() { - return PING_RESULT; + public Version ping() { + + ObserveWebApplicationConfiguration configuration = getApplicationConfiguration(); + + Version version = configuration.getModelVersion(); + + return version; } } diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/security/ObserveWebSecurityApplicationContext.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/security/ObserveWebSecurityApplicationContext.java index 87c184d..01f1abe 100644 --- a/observe-application-web/src/main/java/fr/ird/observe/application/web/security/ObserveWebSecurityApplicationContext.java +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/security/ObserveWebSecurityApplicationContext.java @@ -37,6 +37,7 @@ import fr.ird.observe.services.configuration.ObserveDataSourceConfiguration; import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationAndConnection; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.nuiton.util.version.Version; import java.io.Closeable; import java.util.Objects; @@ -86,7 +87,7 @@ public class ObserveWebSecurityApplicationContext implements Closeable { this.dataSourceConfigurationFactory = new ObserveDataSourceConfigurationMainFactory(); } - public synchronized void init(ObserveWebDatabases<?> databases, ObserveWebUsers<?> users) { + public synchronized void init(ObserveWebDatabases<?> databases, ObserveWebUsers<?> users, Version modelVersion) { this.databases = databases; this.users = users; @@ -125,7 +126,8 @@ public class ObserveWebSecurityApplicationContext implements Closeable { password.toCharArray(), true, true, - true); + true, + modelVersion); if (log.isInfoEnabled()) { diff --git a/observe-application-web/src/main/resources/observeweb.conf b/observe-application-web/src/main/resources/observeweb.conf index 0284992..06dac62 100644 --- a/observe-application-web/src/main/resources/observeweb.conf +++ b/observe-application-web/src/main/resources/observeweb.conf @@ -1,4 +1,5 @@ observeweb.devMode=${devMode} observeweb.build.version=${project.version} observeweb.build.date=${buildDate} -observeweb.build.number=${buildNumber} \ No newline at end of file +observeweb.build.number=${buildNumber} +observeweb.model.version=${observe.model.version} \ No newline at end of file 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 56934e9..9bbd769 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 @@ -132,4 +132,8 @@ public abstract class AbstractDataSourceMigration extends TopiaMigrationCallback this.topiaApplicationContext = topiaApplicationContext; } + public static Version getLastVersion() { + int lastIndex = availableVersions.length - 1; + return availableVersions[lastIndex]; + } } diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/BabModelVersionException.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/BabModelVersionException.java new file mode 100644 index 0000000..ebb50d3 --- /dev/null +++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/BabModelVersionException.java @@ -0,0 +1,34 @@ +package fr.ird.observe.services.service; + +import org.nuiton.util.version.Version; + +/** + * @author Sylvain Bavencoff - bavencoff@codelutin.com + */ +public class BabModelVersionException extends Exception { + + private static final long serialVersionUID = 1L; + + private final Version requestVersion; + + private final Version actualVersion; + + public BabModelVersionException(Version requestVersion, Version actualVersion) { + this.requestVersion = requestVersion; + this.actualVersion = actualVersion; + } + + public BabModelVersionException(String message, Version requestVersion, Version actualVersion) { + super(message); + this.requestVersion = requestVersion; + this.actualVersion = actualVersion; + } + + public Version getRequestVersion() { + return requestVersion; + } + + public Version getActualVersion() { + return actualVersion; + } +} 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 8753db9..036704d 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 @@ -53,7 +53,7 @@ public interface DataSourceService extends ObserveService { ObserveDataSourceConnection create(ObserveDataSourceConfiguration dataSourceConfiguration, DataSourceCreateConfigurationDto dataSourceCreateConfiguration) throws IncompatibleDataSourceCreateConfigurationException, DataSourceCreateWithNoReferentialImportException; @NoDataAccess - ObserveDataSourceConnection open(ObserveDataSourceConfiguration dataSourceConfiguration) throws DatabaseNotFoundException, DatabaseConnexionNotAuthorizedException; + ObserveDataSourceConnection open(ObserveDataSourceConfiguration dataSourceConfiguration) throws DatabaseNotFoundException, DatabaseConnexionNotAuthorizedException, BabModelVersionException; void close(); diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/PingService.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/PingService.java index 282318b..56028ba 100644 --- a/observe-services-api/src/main/java/fr/ird/observe/services/service/PingService.java +++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/PingService.java @@ -24,6 +24,7 @@ package fr.ird.observe.services.service; import fr.ird.observe.services.ObserveService; import fr.ird.observe.services.spi.NoDataAccess; +import org.nuiton.util.version.Version; /** * Created on 06/09/15. @@ -32,9 +33,7 @@ import fr.ird.observe.services.spi.NoDataAccess; */ public interface PingService extends ObserveService { - String PING_RESULT = "Pong"; - @NoDataAccess - String ping(); + Version ping(); } diff --git a/observe-services-configuration-api/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConfiguration.java b/observe-services-configuration-api/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConfiguration.java index b9986f7..866e32d 100644 --- a/observe-services-configuration-api/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConfiguration.java +++ b/observe-services-configuration-api/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConfiguration.java @@ -22,6 +22,8 @@ package fr.ird.observe.services.configuration; * #L% */ +import org.nuiton.util.version.Version; + import java.io.Serializable; /** @@ -33,4 +35,6 @@ public interface ObserveDataSourceConfiguration extends Serializable { String getLabel(); + Version getModelVersion(); + } diff --git a/observe-services-configuration-rest/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConfigurationRest.java b/observe-services-configuration-rest/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConfigurationRest.java index 17acb4e..38af297 100644 --- a/observe-services-configuration-rest/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConfigurationRest.java +++ b/observe-services-configuration-rest/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConfigurationRest.java @@ -24,6 +24,7 @@ package fr.ird.observe.services.configuration; import com.google.common.base.MoreObjects; import com.google.common.base.Optional; +import org.nuiton.util.version.Version; import java.net.URL; @@ -63,6 +64,12 @@ public class ObserveDataSourceConfigurationRest implements ObserveDataSourceConf */ protected String optionalDatabaseName; + /** + * La version de la base demmandé + */ + protected Version modelVersion; + + @Override public String getLabel() { return label; @@ -109,6 +116,15 @@ public class ObserveDataSourceConfigurationRest implements ObserveDataSourceConf } @Override + public Version getModelVersion() { + return modelVersion; + } + + public void setModelVersion(Version modelVersion) { + this.modelVersion = modelVersion; + } + + @Override public ObserveDataSourceConfigurationRest clone() throws CloneNotSupportedException { return (ObserveDataSourceConfigurationRest) super.clone(); } @@ -121,6 +137,7 @@ public class ObserveDataSourceConfigurationRest implements ObserveDataSourceConf .add("login", login) .add("password", "***") .add("optionalDatabaseName", optionalDatabaseName) + .add("modelVersion", modelVersion) .toString(); } } diff --git a/observe-services-configuration-topia/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConfigurationTopiaSupport.java b/observe-services-configuration-topia/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConfigurationTopiaSupport.java index e90b02f..cc0a649 100644 --- a/observe-services-configuration-topia/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConfigurationTopiaSupport.java +++ b/observe-services-configuration-topia/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConfigurationTopiaSupport.java @@ -22,6 +22,8 @@ package fr.ird.observe.services.configuration; * #L% */ +import org.nuiton.util.version.Version; + /** * Created on 19/08/15. * @@ -66,6 +68,8 @@ public abstract class ObserveDataSourceConfigurationTopiaSupport implements Obse protected boolean autoMigrate; + protected Version modelVersion; + public abstract boolean isH2Database(); public abstract boolean isPostgresDatabase(); @@ -126,4 +130,13 @@ public abstract class ObserveDataSourceConfigurationTopiaSupport implements Obse public void setAutoMigrate(boolean autoMigrate) { this.autoMigrate = autoMigrate; } + + @Override + public Version getModelVersion() { + return modelVersion; + } + + public void setModelVersion(Version modelVersion) { + this.modelVersion = modelVersion; + } } diff --git a/observe-services-rest/src/test/java/fr/ird/observe/services/TestClassResource.java b/observe-services-rest/src/test/java/fr/ird/observe/services/TestClassResource.java index 3ad06b0..0286bfd 100644 --- a/observe-services-rest/src/test/java/fr/ird/observe/services/TestClassResource.java +++ b/observe-services-rest/src/test/java/fr/ird/observe/services/TestClassResource.java @@ -32,6 +32,7 @@ import org.apache.commons.logging.LogFactory; import org.junit.rules.TestRule; import org.junit.runner.Description; import org.junit.runners.model.Statement; +import org.nuiton.util.version.Version; import java.io.File; import java.net.MalformedURLException; @@ -158,6 +159,7 @@ public class TestClassResource implements TestRule { public ObserveDataSourceConfigurationRest createDataSourceConfigurationRest(Class<?> testClass, String databaseName, String login, + Version dbVersion, char... password) { ObserveDataSourceConfigurationRest configurationRest = new ObserveDataSourceConfigurationRest(); @@ -166,6 +168,7 @@ public class TestClassResource implements TestRule { configurationRest.setLogin(login); configurationRest.setPassword(password); configurationRest.setOptionalDatabaseName(databaseName); + configurationRest.setModelVersion(dbVersion); return configurationRest; @@ -173,6 +176,7 @@ public class TestClassResource implements TestRule { public ObserveDataSourceConfigurationRest createDataSourceConfigurationRest(Class<?> testClass, String login, + Version dbVersion, char... password) { ObserveDataSourceConfigurationRest configurationRest = new ObserveDataSourceConfigurationRest(); @@ -181,6 +185,7 @@ public class TestClassResource implements TestRule { configurationRest.setLogin(login); configurationRest.setPassword(password); configurationRest.setOptionalDatabaseName(null); + configurationRest.setModelVersion(dbVersion); return configurationRest; diff --git a/observe-services-rest/src/test/java/fr/ird/observe/services/TestMethodResource.java b/observe-services-rest/src/test/java/fr/ird/observe/services/TestMethodResource.java index cf61796..c98f7a7 100644 --- a/observe-services-rest/src/test/java/fr/ird/observe/services/TestMethodResource.java +++ b/observe-services-rest/src/test/java/fr/ird/observe/services/TestMethodResource.java @@ -31,6 +31,7 @@ import org.junit.Assume; import org.junit.rules.TestRule; import org.junit.runner.Description; import org.junit.runners.model.Statement; +import org.nuiton.util.version.Version; import java.io.File; import java.nio.file.Files; @@ -111,7 +112,9 @@ public class TestMethodResource implements TestRule { testClassResource.setTemporaryDirectoryRoot(temporaryDirectoryRoot); - dataSourceConfiguration = testClassResource.createDataSourceConfigurationRest(testClass, databaseName, login, password); + Version modelVersion = TestHelper.getModelVersion(); + + dataSourceConfiguration = testClassResource.createDataSourceConfigurationRest(testClass, databaseName, login, modelVersion, password); checkServerIsAvailable(testClass, methodName); @@ -136,8 +139,9 @@ public class TestMethodResource implements TestRule { PingService service = testClassResource.newService(dataSourceConfiguration, PingService.class); try { - String ping = service.ping(); - if (!PingService.PING_RESULT.equals(ping)) { + Version serverVersion = service.ping(); + Version modelVersion = TestHelper.getModelVersion(); + if (!serverVersion.equals(modelVersion)) { serverExist = false; } } catch (Exception e) { diff --git a/observe-services-rest/src/test/java/fr/ird/observe/services/service/DataSourceServiceRestTest.java b/observe-services-rest/src/test/java/fr/ird/observe/services/service/DataSourceServiceRestTest.java index ffc8100..15b0f99 100644 --- a/observe-services-rest/src/test/java/fr/ird/observe/services/service/DataSourceServiceRestTest.java +++ b/observe-services-rest/src/test/java/fr/ird/observe/services/service/DataSourceServiceRestTest.java @@ -53,7 +53,7 @@ public class DataSourceServiceRestTest { //FIXME @Ignore @Test - public void testOpenNotExistingDatabase() throws IOException, DatabaseConnexionNotAuthorizedException, DatabaseNotFoundException, CloneNotSupportedException { + public void testOpenNotExistingDatabase() throws IOException, DatabaseConnexionNotAuthorizedException, DatabaseNotFoundException, CloneNotSupportedException, BabModelVersionException { ObserveDataSourceConfigurationRest dataSourceConfiguration = testMethodResource.getDataSourceConfiguration().clone(); dataSourceConfiguration.setLogin(dataSourceConfiguration.getLogin() + System.nanoTime()); @@ -63,7 +63,7 @@ public class DataSourceServiceRestTest { } @Test - public void testOpen() throws IOException, IncompatibleDataSourceCreateConfigurationException, DataSourceCreateWithNoReferentialImportException, DatabaseConnexionNotAuthorizedException, DatabaseNotFoundException { + public void testOpen() throws IOException, IncompatibleDataSourceCreateConfigurationException, DataSourceCreateWithNoReferentialImportException, DatabaseConnexionNotAuthorizedException, DatabaseNotFoundException, BabModelVersionException { ObserveDataSourceConfigurationRest dataSourceConfiguration = testMethodResource.getDataSourceConfiguration(); diff --git a/observe-services-runner/src/main/java/fr/ird/observe/services/ObserveDataSourceConfigurationMainFactory.java b/observe-services-runner/src/main/java/fr/ird/observe/services/ObserveDataSourceConfigurationMainFactory.java index 4cf4d32..faaf3dd 100644 --- a/observe-services-runner/src/main/java/fr/ird/observe/services/ObserveDataSourceConfigurationMainFactory.java +++ b/observe-services-runner/src/main/java/fr/ird/observe/services/ObserveDataSourceConfigurationMainFactory.java @@ -25,6 +25,7 @@ package fr.ird.observe.services; import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationRest; import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationTopiaH2; import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationTopiaPG; +import org.nuiton.util.version.Version; import java.io.File; import java.net.URL; @@ -42,7 +43,8 @@ public class ObserveDataSourceConfigurationMainFactory { char[] password, boolean useSsl, boolean showMigrationProgression, - boolean showMigrationSql) { + boolean showMigrationSql, + Version dbVersion) { ObserveDataSourceConfigurationTopiaPG result = new ObserveDataSourceConfigurationTopiaPG(); result.setLabel(label); @@ -52,6 +54,7 @@ public class ObserveDataSourceConfigurationMainFactory { result.setUseSsl(useSsl); result.setShowMigrationProgression(showMigrationProgression); result.setShowMigrationSql(showMigrationSql); + result.setModelVersion(dbVersion); return result; @@ -63,7 +66,8 @@ public class ObserveDataSourceConfigurationMainFactory { String username, char[] password, boolean showMigrationProgression, - boolean showMigrationSql) { + boolean showMigrationSql, + Version dbVersion) { ObserveDataSourceConfigurationTopiaH2 result = new ObserveDataSourceConfigurationTopiaH2(); result.setLabel(label); @@ -73,6 +77,7 @@ public class ObserveDataSourceConfigurationMainFactory { result.setDirectory(directory); result.setShowMigrationProgression(showMigrationProgression); result.setShowMigrationSql(showMigrationSql); + result.setModelVersion(dbVersion); return result; @@ -82,7 +87,8 @@ public class ObserveDataSourceConfigurationMainFactory { URL serverUrl, String login, char[] password, - String databaseName) { + String databaseName, + Version dbVersion) { ObserveDataSourceConfigurationRest result = new ObserveDataSourceConfigurationRest(); result.setLabel(label); @@ -90,6 +96,7 @@ public class ObserveDataSourceConfigurationMainFactory { result.setLogin(login); result.setPassword(password); result.setOptionalDatabaseName(databaseName); + result.setModelVersion(dbVersion); return result; 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 7308a30..4f3713d 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 @@ -258,10 +258,21 @@ public class DataSourceServiceTopia extends ObserveServiceTopia implements DataS } @Override - public ObserveDataSourceConnectionTopia open(ObserveDataSourceConfiguration dataSourceConfiguration) throws DatabaseNotFoundException, DatabaseConnexionNotAuthorizedException { + public ObserveDataSourceConnectionTopia open(ObserveDataSourceConfiguration dataSourceConfiguration) throws DatabaseNotFoundException, DatabaseConnexionNotAuthorizedException, BabModelVersionException { ObserveDataSourceInformation dataSourceInformation = checkCanConnect(dataSourceConfiguration); + Version dbVersion = dataSourceInformation.getVersion(); + Version requestVersion = dataSourceConfiguration.getModelVersion(); + + if (!dbVersion.equals(requestVersion)) { + + String message = l(getApplicationLocale(), "observe.services.topia.error.database.badModelVersion", requestVersion, dbVersion); + + throw new BabModelVersionException(message, requestVersion, dbVersion); + + } + ObserveTopiaApplicationContext topiaApplicationContext = ObserveTopiaApplicationContextFactory.getOrCreateTopiaApplicationContext((ObserveDataSourceConfigurationTopiaSupport) dataSourceConfiguration); return createDataSourceConnection(dataSourceInformation, topiaApplicationContext.getAuthenticationToken()); diff --git a/observe-services-topia/src/main/resources/i18n/observe-services-topia_en_GB.properties b/observe-services-topia/src/main/resources/i18n/observe-services-topia_en_GB.properties index 36ad692..72dc079 100644 --- a/observe-services-topia/src/main/resources/i18n/observe-services-topia_en_GB.properties +++ b/observe-services-topia/src/main/resources/i18n/observe-services-topia_en_GB.properties @@ -1,5 +1,6 @@ observe.service.actions.consolidate.lengthWeightParameterNotFound=No length-weight relation found for tuple (species %s - ocean %s - sex %s - date %s) observe.service.actions.consolidate.noSex=no sex +observe.services.topia.error.database.badModelVersion=Model version (%s) is not compatible with data base version (%s). Run migration before open data base. observe.services.topia.error.h2.database.badAuthentication=Bad autnetication. observe.services.topia.error.h2.database.locked=The H2 database is locked, may-be another user or application use it. observe.services.topia.error.h2.database.notFound=The H2 database was not found. diff --git a/observe-services-topia/src/main/resources/i18n/observe-services-topia_es_ES.properties b/observe-services-topia/src/main/resources/i18n/observe-services-topia_es_ES.properties index ab245f9..b33148f 100644 --- a/observe-services-topia/src/main/resources/i18n/observe-services-topia_es_ES.properties +++ b/observe-services-topia/src/main/resources/i18n/observe-services-topia_es_ES.properties @@ -1,5 +1,6 @@ observe.service.actions.consolidate.lengthWeightParameterNotFound= observe.service.actions.consolidate.noSex=no sexo +observe.services.topia.error.database.badModelVersion= observe.services.topia.error.h2.database.badAuthentication= observe.services.topia.error.h2.database.locked= observe.services.topia.error.h2.database.notFound= diff --git a/observe-services-topia/src/main/resources/i18n/observe-services-topia_fr_FR.properties b/observe-services-topia/src/main/resources/i18n/observe-services-topia_fr_FR.properties index f7d57b7..669b144 100644 --- a/observe-services-topia/src/main/resources/i18n/observe-services-topia_fr_FR.properties +++ b/observe-services-topia/src/main/resources/i18n/observe-services-topia_fr_FR.properties @@ -1,5 +1,6 @@ observe.service.actions.consolidate.lengthWeightParameterNotFound=Aucune relation taille-poids trouvé pour le tuple (espèce %s - océan %s - sexe %s - date %s) observe.service.actions.consolidate.noSex=pas de sexe +observe.services.topia.error.database.badModelVersion=La version du modèle (%s) n'est pas compatible avec la version de la base de données (%s). Une migration est nécessaire avant d'ouvrir la base. observe.services.topia.error.h2.database.badAuthentication=Authentification erronée. observe.services.topia.error.h2.database.locked=La base H2 est déjà utilisé par un autre utilisateur. observe.services.topia.error.h2.database.notFound=La base H2 n'a pas été trouvée. diff --git a/observe-services-topia/src/test/java/fr/ird/observe/services/ApplicationContextResource.java b/observe-services-topia/src/test/java/fr/ird/observe/services/ApplicationContextResource.java index cea80a5..16395c2 100644 --- a/observe-services-topia/src/test/java/fr/ird/observe/services/ApplicationContextResource.java +++ b/observe-services-topia/src/test/java/fr/ird/observe/services/ApplicationContextResource.java @@ -24,6 +24,7 @@ package fr.ird.observe.services; import fr.ird.observe.ObserveTopiaApplicationContext; import fr.ird.observe.ObserveTopiaPersistenceContext; +import fr.ird.observe.entities.migration.AbstractDataSourceMigration; import fr.ird.observe.services.configuration.ObserveDataSourceConfiguration; import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationTopiaH2; import fr.ird.observe.services.configuration.ObserveDataSourceConnection; @@ -186,6 +187,7 @@ public class ApplicationContextResource implements TestRule { configurationTopiaH2.setDirectory(localDbFile); configurationTopiaH2.setDbName("obstuna"); configurationTopiaH2.setAutoMigrate(true); + configurationTopiaH2.setModelVersion(AbstractDataSourceMigration.getLastVersion()); return configurationTopiaH2; } @@ -205,6 +207,7 @@ public class ApplicationContextResource implements TestRule { configurationTopiaH2.setDirectory(localDbFile); configurationTopiaH2.setDbName("obstuna"); configurationTopiaH2.setAutoMigrate(true); + configurationTopiaH2.setModelVersion(AbstractDataSourceMigration.getLastVersion()); return configurationTopiaH2; } diff --git a/observe-services-topia/src/test/java/fr/ird/observe/services/service/AbstractServiceTopiaTest.java b/observe-services-topia/src/test/java/fr/ird/observe/services/service/AbstractServiceTopiaTest.java index dd3197d..b6fe60f 100644 --- a/observe-services-topia/src/test/java/fr/ird/observe/services/service/AbstractServiceTopiaTest.java +++ b/observe-services-topia/src/test/java/fr/ird/observe/services/service/AbstractServiceTopiaTest.java @@ -102,7 +102,7 @@ public abstract class AbstractServiceTopiaTest { } - public <S extends ObserveService> S newService(Class<S> serviceType) throws DatabaseConnexionNotAuthorizedException, DatabaseNotFoundException { + public <S extends ObserveService> S newService(Class<S> serviceType) throws DatabaseConnexionNotAuthorizedException, DatabaseNotFoundException, BabModelVersionException { ObserveDataSourceConnection dataSourceConnection = dataSourceResource.getDataSourceConnection(); diff --git a/observe-services-topia/src/test/java/fr/ird/observe/services/service/DataSourceServiceTopiaTest.java b/observe-services-topia/src/test/java/fr/ird/observe/services/service/DataSourceServiceTopiaTest.java index aba7451..72a69fa 100644 --- a/observe-services-topia/src/test/java/fr/ird/observe/services/service/DataSourceServiceTopiaTest.java +++ b/observe-services-topia/src/test/java/fr/ird/observe/services/service/DataSourceServiceTopiaTest.java @@ -81,7 +81,7 @@ public class DataSourceServiceTopiaTest { } @Test(expected = DatabaseNotFoundException.class) - public void testOpenNotExistingDatabase() throws IOException, DatabaseConnexionNotAuthorizedException, DatabaseNotFoundException { + public void testOpenNotExistingDatabase() throws IOException, DatabaseConnexionNotAuthorizedException, DatabaseNotFoundException, BabModelVersionException { ObserveDataSourceConfigurationTopiaH2 dataSourceConfiguration = dataSourceResource.getDataSourceConfiguration(); service.open(dataSourceConfiguration); @@ -89,7 +89,7 @@ public class DataSourceServiceTopiaTest { } @Test - public void testCanConnect() throws IOException, IncompatibleDataSourceCreateConfigurationException, DataSourceCreateWithNoReferentialImportException, DatabaseConnexionNotAuthorizedException, DatabaseNotFoundException, InterruptedException { + public void testCanConnect() throws IOException, IncompatibleDataSourceCreateConfigurationException, DataSourceCreateWithNoReferentialImportException, DatabaseConnexionNotAuthorizedException, DatabaseNotFoundException, InterruptedException, BabModelVersionException { ObserveDataSourceConfigurationTopiaH2 dataSourceConfiguration = dataSourceResource.getDataSourceConfiguration(); @@ -148,7 +148,7 @@ public class DataSourceServiceTopiaTest { } @Test - public void testOpen() throws IOException, IncompatibleDataSourceCreateConfigurationException, DataSourceCreateWithNoReferentialImportException, DatabaseConnexionNotAuthorizedException, DatabaseNotFoundException, InterruptedException { + public void testOpen() throws IOException, IncompatibleDataSourceCreateConfigurationException, DataSourceCreateWithNoReferentialImportException, DatabaseConnexionNotAuthorizedException, DatabaseNotFoundException, InterruptedException, BabModelVersionException { ObserveDataSourceConfigurationTopiaH2 dataSourceConfiguration = dataSourceResource.getDataSourceConfiguration(); DataSourceCreateConfigurationDto dataSourceCreateConfiguration = new DataSourceCreateConfigurationDto(); diff --git a/observe-services-topia/src/test/java/fr/ird/observe/services/service/RigthTest.java b/observe-services-topia/src/test/java/fr/ird/observe/services/service/RigthTest.java index c1fe848..c7a3495 100644 --- a/observe-services-topia/src/test/java/fr/ird/observe/services/service/RigthTest.java +++ b/observe-services-topia/src/test/java/fr/ird/observe/services/service/RigthTest.java @@ -1,5 +1,6 @@ package fr.ird.observe.services.service; +import fr.ird.observe.entities.migration.AbstractDataSourceMigration; import fr.ird.observe.services.ObserveService; import fr.ird.observe.services.ObserveServiceContextTopia; import fr.ird.observe.services.ObserveServiceContextTopiaTaiste; @@ -64,12 +65,13 @@ public class RigthTest { configurationTopiaPG.setUsername(login); configurationTopiaPG.setPassword('a'); configurationTopiaPG.setAutoMigrate(true); + configurationTopiaPG.setModelVersion(AbstractDataSourceMigration.getLastVersion()); return configurationTopiaPG; } - protected ObserveDataSourceConnection getDataSourceConnection(String login) throws DatabaseConnexionNotAuthorizedException, DatabaseNotFoundException { + protected ObserveDataSourceConnection getDataSourceConnection(String login) throws DatabaseConnexionNotAuthorizedException, DatabaseNotFoundException, BabModelVersionException { ObserveDataSourceConfigurationTopiaPG adminConfig = createDataSourceConfigurationH2(login); @@ -101,7 +103,7 @@ public class RigthTest { return serviceFactory.newService(observeServiceInitializer, serviceType); } - protected void testUser(String login, boolean readData, boolean writeData, boolean readReferential, boolean writeReferential) throws DatabaseConnexionNotAuthorizedException, DatabaseNotFoundException { + protected void testUser(String login, boolean readData, boolean writeData, boolean readReferential, boolean writeReferential) throws DatabaseConnexionNotAuthorizedException, DatabaseNotFoundException, BabModelVersionException { ObserveDataSourceConfigurationTopiaPG adminConfig = createDataSourceConfigurationH2(login); @@ -117,26 +119,26 @@ public class RigthTest { } @Test - public void testAdminRight() throws DatabaseConnexionNotAuthorizedException, DatabaseNotFoundException { + public void testAdminRight() throws DatabaseConnexionNotAuthorizedException, DatabaseNotFoundException, BabModelVersionException { testUser("admin", true, true, true, true); } @Test - public void testTechnicienAdminRight() throws DatabaseConnexionNotAuthorizedException, DatabaseNotFoundException { + public void testTechnicienAdminRight() throws DatabaseConnexionNotAuthorizedException, DatabaseNotFoundException, BabModelVersionException { testUser("technicien", true, true, true, true); } @Test - public void testUtilisateurRight() throws DatabaseConnexionNotAuthorizedException, DatabaseNotFoundException { + public void testUtilisateurRight() throws DatabaseConnexionNotAuthorizedException, DatabaseNotFoundException, BabModelVersionException { testUser("utilisateur", true, false, true, false); } @Test - public void testReferentielRight() throws DatabaseConnexionNotAuthorizedException, DatabaseNotFoundException { + public void testReferentielRight() throws DatabaseConnexionNotAuthorizedException, DatabaseNotFoundException, BabModelVersionException { testUser("referentiel", false, false, true, false); } - protected void testReadData(String login) throws DatabaseConnexionNotAuthorizedException, DatabaseNotFoundException { + protected void testReadData(String login) throws DatabaseConnexionNotAuthorizedException, DatabaseNotFoundException, BabModelVersionException { ObserveDataSourceConnection dataSourceConnection = getDataSourceConnection(login); @@ -145,7 +147,7 @@ public class RigthTest { service.loadToRead(TRIP_SEINE_ID); } - protected void testWriteData(String login) throws DatabaseConnexionNotAuthorizedException, DatabaseNotFoundException { + protected void testWriteData(String login) throws DatabaseConnexionNotAuthorizedException, DatabaseNotFoundException, BabModelVersionException { ObserveDataSourceConnection dataSourceConnection = getDataSourceConnection(login); @@ -156,7 +158,7 @@ public class RigthTest { service.save(tripSeineDtoFormDto); } - protected void testReadReferential(String login) throws DatabaseConnexionNotAuthorizedException, DatabaseNotFoundException { + protected void testReadReferential(String login) throws DatabaseConnexionNotAuthorizedException, DatabaseNotFoundException, BabModelVersionException { ObserveDataSourceConnection dataSourceConnection = getDataSourceConnection(login); @@ -165,7 +167,7 @@ public class RigthTest { service.loadToRead(ProgramDto.class, PROGRAM_ID); } - protected void testWriteReferential(String login) throws DatabaseConnexionNotAuthorizedException, DatabaseNotFoundException { + protected void testWriteReferential(String login) throws DatabaseConnexionNotAuthorizedException, DatabaseNotFoundException, BabModelVersionException { ObserveDataSourceConnection dataSourceConnection = getDataSourceConnection(login); @@ -177,37 +179,37 @@ public class RigthTest { } @Test - public void testAdminReadData() throws DatabaseConnexionNotAuthorizedException, DatabaseNotFoundException { + public void testAdminReadData() throws DatabaseConnexionNotAuthorizedException, DatabaseNotFoundException, BabModelVersionException { testReadData("admin"); } @Test - public void testAdminWriteData() throws DatabaseConnexionNotAuthorizedException, DatabaseNotFoundException { + public void testAdminWriteData() throws DatabaseConnexionNotAuthorizedException, DatabaseNotFoundException, BabModelVersionException { testWriteData("admin"); } @Test - public void testAdminReadReferential() throws DatabaseConnexionNotAuthorizedException, DatabaseNotFoundException { + public void testAdminReadReferential() throws DatabaseConnexionNotAuthorizedException, DatabaseNotFoundException, BabModelVersionException { testReadReferential("admin"); } @Test - public void testAdminWriteReferential() throws DatabaseConnexionNotAuthorizedException, DatabaseNotFoundException { + public void testAdminWriteReferential() throws DatabaseConnexionNotAuthorizedException, DatabaseNotFoundException, BabModelVersionException { testWriteReferential("admin"); } @Test(expected = UnauthorizedException.class) - public void testReferentielReadData() throws DatabaseConnexionNotAuthorizedException, DatabaseNotFoundException { + public void testReferentielReadData() throws DatabaseConnexionNotAuthorizedException, DatabaseNotFoundException, BabModelVersionException { testReadData("referentiel"); } @Test(expected = UnauthorizedException.class) - public void testReferentielWriteData() throws DatabaseConnexionNotAuthorizedException, DatabaseNotFoundException { + public void testReferentielWriteData() throws DatabaseConnexionNotAuthorizedException, DatabaseNotFoundException, BabModelVersionException { testWriteData("referentiel"); } @Test(expected = UnauthorizedException.class) - public void testReferentielWriteReferential() throws DatabaseConnexionNotAuthorizedException, DatabaseNotFoundException { + public void testReferentielWriteReferential() throws DatabaseConnexionNotAuthorizedException, DatabaseNotFoundException, BabModelVersionException { testWriteReferential("referentiel"); } diff --git a/observe-test-data/src/main/java/fr/ird/observe/test/TestHelper.java b/observe-test-data/src/main/java/fr/ird/observe/test/TestHelper.java index f98d959..1c25d25 100644 --- a/observe-test-data/src/main/java/fr/ird/observe/test/TestHelper.java +++ b/observe-test-data/src/main/java/fr/ird/observe/test/TestHelper.java @@ -28,11 +28,15 @@ import org.nuiton.topia.persistence.TopiaApplicationContext; import org.nuiton.topia.persistence.TopiaEntity; import org.nuiton.topia.persistence.TopiaPersistenceContext; import org.nuiton.util.version.Version; +import org.nuiton.util.version.Versions; import java.io.File; +import java.io.IOException; +import java.io.InputStream; import java.lang.reflect.Modifier; import java.util.Date; import java.util.List; +import java.util.Properties; /** * @author Tony Chemit - chemit@codelutin.com @@ -63,6 +67,9 @@ public abstract class TestHelper { public static final char[] TEST_REMOTE_PASSWORD = "a".toCharArray(); + protected static final String TEST_PROPERTIES_FILE_NAME = "observetest.properties"; + protected static final String MODEL_VERSION_PROPERTY_NAME = "observetest.model.version"; + static private Long testsTimeStamp; static private File testsBasedir; @@ -75,6 +82,8 @@ public abstract class TestHelper { public static Class<?> testClass; + protected static Properties testProperties; + public static void assertSchemaCreated(TopiaApplicationContext topiaApplicationContext, TopiaPersistenceContext persistenceContext, boolean noData) { // on verifie que le schema a bien ete cree @@ -252,4 +261,27 @@ public abstract class TestHelper { } + protected static Properties getTestProperties() { + if (testProperties == null) { + testProperties = new Properties(); + try (InputStream inputStream = TestHelper.class.getClassLoader().getResourceAsStream(TEST_PROPERTIES_FILE_NAME)) { + testProperties.load(inputStream); + } catch (IOException e) { + if (log.isErrorEnabled()) { + log.error("unable to load test properties", e); + } + } + } + return testProperties; + } + + public static Version getModelVersion() { + String versionString = getTestProperties().getProperty(MODEL_VERSION_PROPERTY_NAME); + + Version version = Versions.valueOf(versionString); + + return version; + } + + } diff --git a/observe-test-data/src/main/resources/observetest.properties b/observe-test-data/src/main/resources/observetest.properties new file mode 100644 index 0000000..875ddf4 --- /dev/null +++ b/observe-test-data/src/main/resources/observetest.properties @@ -0,0 +1,3 @@ +observetest.devMode=${devMode} +observetest.build.version=${project.version} +observetest.model.version=${observe.model.version} \ No newline at end of file -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@list.forge.codelutin.com>.
participants (1)
-
codelutin.com scm