This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository observe. See http://git.codelutin.com/observe.git commit 3457320497a7919b3e888b125e2b736a3dc0b398 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 babe227..965b0ee 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; @@ -258,7 +259,8 @@ public class ObserveSwingApplicationContext extends DefaultApplicationContext { getConfig().getH2Login(), getConfig().getH2Password(), false, - false + false, + getConfig().getModelVersion() ); ObserveSwingDataSource result = new ObserveSwingDataSource(config); @@ -578,7 +580,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 9b3451b..748fbb3 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; @@ -105,7 +106,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 ebc7b42..6d0d29f 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; @@ -376,7 +377,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 4a07366..1068a85 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 @@ -494,7 +494,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 f7f395d..04b9ede 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 @@ -1793,6 +1793,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 415352f..a7a9db4 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 @@ -1795,6 +1795,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 d342090..a39efaa 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 @@ -1794,6 +1794,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 4f12763..94ea9a9 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.getForm()); } - 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>.