branch develop updated (f83390a -> 3ba428e)
This is an automated email from the git hooks/post-receive script. New change to branch develop in repository observe. See http://git.codelutin.com/observe.git from f83390a Utiliser un moteur de template pour générer le rendu des résumés d'action (Termine #7547) Merge branch 'feature/7547' into develop new ff31642 ajout du DTO pour les utilisateurs de la base PG (refs #7549) new 6e20360 ajout des méthodes de service pour gérer la securité des bases PG (refs #7549) new 34b2c0e renomage en observeDbUserDto et ajout du role d'administrator (refs #7549) new 8ec40fe ajout du converter pour les DTO (refs #7549) new bfcd27c migration des tâches administratives, mise ren place de la Sécurité (refs #7549) new 600a69c miragtion des base de données (refs #7549) new e324081 migrer une base sans l'ouvrir, verification de la version de la base local au chargement et migration si nécessaire (refs #7549) new 3457320 verification des versions a la connection avec un serveur et a l'ouverture de la base (refs #7549) new 6910618 adapter le rapport de connexion au base a la gestion de la sécurité (suite au rebase) (refs #7549) new 5d38d12 rendre serializable la connexion a une source de donnees new 61939e6 fix typo new 9ca1de5 Renommage des méthodes qui font appels à nos listeners pour respecter la norme JavaBean new 3ba428e Retour sur develop pour pouvoir utiliser la partie ouverture de base (RAF la creation d'une base locale). Merge branch 'feature/7549' into develop The 13 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 3ba428e4cd137332f29ec010b37567281f63775f Merge: f83390a 9ca1de5 Author: Tony CHEMIT <chemit@codelutin.com> Date: Fri Oct 2 17:24:41 2015 +0200 Retour sur develop pour pouvoir utiliser la partie ouverture de base (RAF la creation d'une base locale). Merge branch 'feature/7549' into develop commit 9ca1de5071aceb4ec8b4fe32326fe4771714ca4c Author: Tony CHEMIT <chemit@codelutin.com> Date: Fri Oct 2 16:59:19 2015 +0200 Renommage des méthodes qui font appels à nos listeners pour respecter la norme JavaBean commit 61939e6ecf4092efe258e27e7316f43c5eba59cb Author: Tony CHEMIT <chemit@codelutin.com> Date: Fri Oct 2 16:48:44 2015 +0200 fix typo commit 5d38d122e12394d59e6afcaf9c9ad091a446bb1b Author: Tony CHEMIT <chemit@codelutin.com> Date: Fri Oct 2 16:48:03 2015 +0200 rendre serializable la connexion a une source de donnees commit 6910618ff8f85c397bda93c616688cda3a9058b6 Author: Sylvain Bavencoff <bavencoff@codelutin.com> Date: Fri Oct 2 15:16:33 2015 +0200 adapter le rapport de connexion au base a la gestion de la sécurité (suite au rebase) (refs #7549) 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) commit e3240813a121b70372f42468b30aff5ddfc0e987 Author: Sylvain Bavencoff <bavencoff@codelutin.com> Date: Wed Sep 30 17:53:37 2015 +0200 migrer une base sans l'ouvrir, verification de la version de la base local au chargement et migration si nécessaire (refs #7549) commit 600a69cdb2419cf151c743a91177d65c88b88004 Author: Sylvain Bavencoff <bavencoff@codelutin.com> Date: Wed Sep 30 16:07:44 2015 +0200 miragtion des base de données (refs #7549) commit bfcd27c09e6ba89f6879d500b611f953fbe88ba4 Author: Sylvain Bavencoff <bavencoff@codelutin.com> Date: Wed Sep 30 09:50:39 2015 +0200 migration des tâches administratives, mise ren place de la Sécurité (refs #7549) commit 8ec40fefe7b49a496b5ca95cae8326ce9a9d420b Author: Sylvain Bavencoff <bavencoff@codelutin.com> Date: Wed Sep 30 09:46:03 2015 +0200 ajout du converter pour les DTO (refs #7549) commit 34b2c0e0a41e4eb689e03b167440abe13eb51556 Author: Sylvain Bavencoff <bavencoff@codelutin.com> Date: Wed Sep 30 09:45:11 2015 +0200 renomage en observeDbUserDto et ajout du role d'administrator (refs #7549) commit 6e20360f9c13fe59637027f9867afd758ea858c2 Author: Sylvain Bavencoff <bavencoff@codelutin.com> Date: Tue Sep 29 10:59:00 2015 +0200 ajout des méthodes de service pour gérer la securité des bases PG (refs #7549) commit ff316428c0b7dbc7b862c873dbbb8497dbc97cda Author: Sylvain Bavencoff <bavencoff@codelutin.com> Date: Tue Sep 29 10:50:34 2015 +0200 ajout du DTO pour les utilisateurs de la base PG (refs #7549) Summary of changes: .../main/java/fr/ird/observe/ObserveCLAction.java | 6 - .../observe/ObserveSwingApplicationContext.java | 38 +- .../ird/observe/business/util/SecurityModel.java | 217 ---------- .../ObserveSwingApplicationConfig.java | 9 +- .../fr/ird/observe/db/ObserveSwingDataSource.java | 116 ++++-- .../java/fr/ird/observe/db/constantes/DbMode.java | 2 +- .../fr/ird/observe/ui/admin/AdminTabUIHandler.java | 11 +- .../java/fr/ird/observe/ui/admin/AdminUIModel.java | 3 +- .../observe/ui/admin/report/ReportUIHandler.java | 3 +- .../ird/observe/ui/storage/ObstunaAdminAction.java | 455 ++++++++++++--------- .../ird/observe/ui/storage/RemoteUILauncher.java | 48 +-- .../ird/observe/ui/storage/StorageUIHandler.java | 96 +++-- .../fr/ird/observe/ui/storage/StorageUIModel.java | 94 +++-- .../observe/ui/storage/tabs/RolesTableModel.java | 62 ++- .../fr/ird/observe/ui/storage/tabs/RolesUI.css | 2 +- .../fr/ird/observe/ui/storage/tabs/RolesUI.jaxx | 2 +- .../ird/observe/ui/storage/tabs/SecurityModel.java | 174 ++++++++ .../ftl/dataSourceConnectionReport_fr.ftl | 20 +- .../observe-application-swing_en_GB.properties | 5 + .../observe-application-swing_es_ES.properties | 5 + .../observe-application-swing_fr_FR.properties | 5 + .../web/ObserveWebApplicationContext.java | 6 +- .../web/ObserveWebApplicationListener.java | 3 + .../ObserveWebApplicationConfiguration.java | 10 + .../ObserveWebApplicationConfigurationOption.java | 2 + .../controller/v1/DataSourceServiceController.java | 29 +- .../web/controller/v1/PingServiceController.java | 11 +- .../ObserveDtoConverter.java} | 34 +- .../web/injector/ObserveDtoInjector.java | 30 +- .../ObserveWebSecurityApplicationContext.java | 6 +- .../src/main/resources/observeweb.conf | 3 +- .../migration/AbstractDataSourceMigration.java | 61 ++- .../i18n/observe-entities_en_GB.properties | 4 - .../i18n/observe-entities_es_ES.properties | 4 - .../i18n/observe-entities_fr_FR.properties | 4 - .../services/service/BabModelVersionException.java | 34 ++ .../services/service/DataSourceService.java | 28 +- .../ird/observe/services/service/PingService.java | 5 +- .../ObserveDataSourceConfiguration.java | 4 + .../configuration/ObserveDataSourceConnection.java | 4 +- .../ObserveDataSourceConnectionSupport.java | 2 + .../ObserveDataSourceInformation.java | 62 +++ .../ObserveDataSourceConfigurationRest.java | 17 + .../ObserveDataSourceConnectionRest.java | 2 + ...ObserveDataSourceConfigurationTopiaSupport.java | 13 + .../ObserveDataSourceConnectionTopia.java | 2 + .../observe/services/dto/ObserveDbUserDtos.java | 22 + .../services/dto/constants/ObserveDbRole.java | 14 + .../src/main/xmi/observe-services-dto-common.zargo | Bin 36919 -> 39020 bytes .../fr/ird/observe/services/TestClassResource.java | 5 + .../ird/observe/services/TestMethodResource.java | 10 +- .../service/DataSourceServiceRestTest.java | 4 +- .../ObserveDataSourceConfigurationMainFactory.java | 13 +- .../fr/ird/observe/services/ObserveJdbcHelper.java | 154 +++++++ .../observe/services/ObserveSecurityHelper.java | 306 ++++++++++++++ .../services/dto/ObserveDtosInitializer.java | 5 + .../services/service/DataSourceServiceTopia.java | 141 ++++++- .../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 + .../ObserveDataSourceConnectionTopiaTaiste.java | 2 + .../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 + 67 files changed, 1777 insertions(+), 737 deletions(-) delete mode 100644 observe-application-swing/src/main/java/fr/ird/observe/business/util/SecurityModel.java create mode 100644 observe-application-swing/src/main/java/fr/ird/observe/ui/storage/tabs/SecurityModel.java copy observe-application-web/src/main/java/fr/ird/observe/application/web/{injector/ObserveDtoInjector.java => converter/ObserveDtoConverter.java} (59%) create mode 100644 observe-services-api/src/main/java/fr/ird/observe/services/service/BabModelVersionException.java create mode 100644 observe-services-configuration-api/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceInformation.java create mode 100644 observe-services-model/src/main/java/fr/ird/observe/services/dto/ObserveDbUserDtos.java create mode 100644 observe-services-model/src/main/java/fr/ird/observe/services/dto/constants/ObserveDbRole.java create mode 100644 observe-services-topia/src/main/java/fr/ird/observe/services/ObserveSecurityHelper.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 develop in repository observe. See http://git.codelutin.com/observe.git commit ff316428c0b7dbc7b862c873dbbb8497dbc97cda Author: Sylvain Bavencoff <bavencoff@codelutin.com> Date: Tue Sep 29 10:50:34 2015 +0200 ajout du DTO pour les utilisateurs de la base PG (refs #7549) --- .../java/fr/ird/observe/services/dto/UserDtos.java | 22 +++++++++++++++++++++ .../ird/observe/services/dto/constants/Role.java | 13 ++++++++++++ .../src/main/xmi/observe-services-dto-common.zargo | Bin 36919 -> 38585 bytes .../services/dto/ObserveDtosInitializer.java | 5 +++++ 4 files changed, 40 insertions(+) diff --git a/observe-services-model/src/main/java/fr/ird/observe/services/dto/UserDtos.java b/observe-services-model/src/main/java/fr/ird/observe/services/dto/UserDtos.java new file mode 100644 index 0000000..215d40c --- /dev/null +++ b/observe-services-model/src/main/java/fr/ird/observe/services/dto/UserDtos.java @@ -0,0 +1,22 @@ +package fr.ird.observe.services.dto; + +import java.util.Comparator; + +public class UserDtos extends AbstractUserDtos { + + protected static UserDtoComparator USER_DTO_COMPARATOR = new UserDtoComparator(); + + public static UserDtoComparator getUserDtoComparator() { + return USER_DTO_COMPARATOR; + } + + protected static class UserDtoComparator implements Comparator<UserDto> { + + @Override + public int compare(UserDto user1, UserDto user2) { + return user1.getName().compareTo(user2.getName()); + } + } + + +} \ No newline at end of file diff --git a/observe-services-model/src/main/java/fr/ird/observe/services/dto/constants/Role.java b/observe-services-model/src/main/java/fr/ird/observe/services/dto/constants/Role.java new file mode 100644 index 0000000..896cba6 --- /dev/null +++ b/observe-services-model/src/main/java/fr/ird/observe/services/dto/constants/Role.java @@ -0,0 +1,13 @@ +package fr.ird.observe.services.dto.constants; + +/** + * @author Sylvain Bavencoff - bavencoff@codelutin.com + */ +public enum Role { + + UNUSED, + REFERENTIAL, + USER, + TECHNICAL; + +} diff --git a/observe-services-model/src/main/xmi/observe-services-dto-common.zargo b/observe-services-model/src/main/xmi/observe-services-dto-common.zargo index 346fde6..2bdd1d5 100644 Binary files a/observe-services-model/src/main/xmi/observe-services-dto-common.zargo and b/observe-services-model/src/main/xmi/observe-services-dto-common.zargo differ diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/dto/ObserveDtosInitializer.java b/observe-services-topia/src/main/java/fr/ird/observe/services/dto/ObserveDtosInitializer.java index 4b4c20c..92ec5bd 100644 --- a/observe-services-topia/src/main/java/fr/ird/observe/services/dto/ObserveDtosInitializer.java +++ b/observe-services-topia/src/main/java/fr/ird/observe/services/dto/ObserveDtosInitializer.java @@ -350,6 +350,11 @@ public class ObserveDtosInitializer implements ObserveModelInitializer { // Rien à faire } + @Override + public void initUserDto() { + // Rien à faire + } + // -------------------------------------------------------------------------------------------------------------- // // -- DATA LONGLINE --------------------------------------------------------------------------------------------- // // -------------------------------------------------------------------------------------------------------------- // -- 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 develop in repository observe. See http://git.codelutin.com/observe.git commit 6e20360f9c13fe59637027f9867afd758ea858c2 Author: Sylvain Bavencoff <bavencoff@codelutin.com> Date: Tue Sep 29 10:59:00 2015 +0200 ajout des méthodes de service pour gérer la securité des bases PG (refs #7549) --- .../controller/v1/DataSourceServiceController.java | 14 + .../services/service/DataSourceService.java | 20 ++ .../fr/ird/observe/services/ObserveJdbcHelper.java | 151 ++++++++++ .../observe/services/ObserveSecurityHelper.java | 303 +++++++++++++++++++++ .../services/service/DataSourceServiceTopia.java | 66 ++++- 5 files changed, 547 insertions(+), 7 deletions(-) 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 025bb3c..6e713c8 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 @@ -34,12 +34,15 @@ import fr.ird.observe.services.configuration.ObserveDataSourceConnectionRest; 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.UserDto; import fr.ird.observe.services.service.DataSourceService; import fr.ird.observe.services.service.DatabaseConnexionNotAuthorizedException; import fr.ird.observe.services.service.DatabaseNotFoundException; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import java.util.Set; + /** * Created on 30/08/15. * @@ -107,6 +110,17 @@ public class DataSourceServiceController extends ObserveServiceControllerSupport getAuthenticatedService().destroy(); } + @Override + public Set<UserDto> getUsers() { + return getAuthenticatedService().getUsers(); + } + + @Override + public void applySecurity(Set<UserDto> users) { + getAuthenticatedService().applySecurity(users); + + } + protected ObserveDataSourceConfiguration getTopiaDataSourceConfiguration(ObserveDataSourceConfiguration dataSourceConfigurationFromRequest) { Preconditions.checkArgument(dataSourceConfigurationFromRequest instanceof ObserveDataSourceConfigurationRest); 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 5e23948..f5f1c9e 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 @@ -28,7 +28,15 @@ import fr.ird.observe.services.configuration.ObserveDataSourceConnection; 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.UserDto; import fr.ird.observe.services.spi.NoDataAccess; +import fr.ird.observe.services.spi.ReadDataPermission; +import fr.ird.observe.services.spi.ReadReferentialPermission; +import fr.ird.observe.services.spi.Write; +import fr.ird.observe.services.spi.WriteDataPermission; +import fr.ird.observe.services.spi.WriteReferentialPermission; + +import java.util.Set; /** * Created on 21/08/15. @@ -50,4 +58,16 @@ public interface DataSourceService extends ObserveService { void destroy(); + @ReadReferentialPermission + @WriteReferentialPermission + @ReadDataPermission + @WriteDataPermission + Set<UserDto> getUsers(); + + @ReadReferentialPermission + @WriteReferentialPermission + @ReadDataPermission + @WriteDataPermission + @Write + void applySecurity(Set<UserDto> users); } diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/ObserveJdbcHelper.java b/observe-services-topia/src/main/java/fr/ird/observe/services/ObserveJdbcHelper.java index c5197de..d2961b6 100644 --- a/observe-services-topia/src/main/java/fr/ird/observe/services/ObserveJdbcHelper.java +++ b/observe-services-topia/src/main/java/fr/ird/observe/services/ObserveJdbcHelper.java @@ -1,6 +1,10 @@ package fr.ird.observe.services; +import com.google.common.collect.Lists; import com.google.common.collect.Sets; +import fr.ird.observe.services.dto.UserDto; +import fr.ird.observe.services.dto.constants.Role; +import org.apache.commons.lang3.tuple.Pair; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.topia.persistence.jdbc.JdbcConfiguration; @@ -13,6 +17,10 @@ import java.sql.DatabaseMetaData; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.LinkedHashSet; +import java.util.List; import java.util.Set; /** @@ -22,6 +30,9 @@ public class ObserveJdbcHelper extends JdbcHelper { private static final Log log = LogFactory.getLog(ObserveJdbcHelper.class); + protected static final Set<String> POSTGIS_TABLES = Sets.newHashSet("geometry_columns", "spatial_ref_sys"); + + public ObserveJdbcHelper(JdbcConfiguration jdbcConfiguration) { super(jdbcConfiguration); } @@ -84,11 +95,151 @@ public class ObserveJdbcHelper extends JdbcHelper { closeQuietly(connection); } + } + + public List<UserDto> getUsers() { + Connection connection = null; + PreparedStatement preparedStatement = null; + List<UserDto> users = Lists.newLinkedList(); + + try { + connection = openConnection(); + // la connexion est reussie, on recherche les droits de + // récupération de la version de la base + preparedStatement = connection.prepareStatement("SELECT rolname FROM pg_catalog.pg_roles where rolname <> current_user;"); + ResultSet resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + String name = resultSet.getString(1); + UserDto user = new UserDto(); + user.setName(name); + user.setRole(Role.UNUSED); + + users.add(user); + } + + return users; + + } catch (SQLException e) { + throw new RuntimeException(e); + } finally { + closeQuietly(preparedStatement); + closeQuietly(connection); + } + } + + public List<Pair<String, String>> getTables(Set<String> schemas, Set<String> extraTables) { + List<Pair<String, String>> result = new ArrayList<Pair<String, String>>(); + + Connection connection = null; + ResultSet tables = null; + + try { + // recuperation des tables sur la base + connection = openConnection(); + DatabaseMetaData data = connection.getMetaData(); + tables = data.getTables(null, + null, + null, + new String[]{"TABLE"} + ); + + int columnCount = tables.getMetaData().getColumnCount(); + + if (log.isDebugEnabled()) { + StringBuilder builder = new StringBuilder(); + builder.append("\nheader"); + for (int i = 1; i <= columnCount; i++) { + String columnName = tables.getMetaData().getColumnName(i); + builder.append("\n [").append(i).append("] :").append(columnName); + } + log.debug(builder.toString()); + log.debug("fetchSize : " + tables.getFetchSize()); + } + while (tables.next()) { + String schemaName = tables.getString(2); + String tableName = tables.getString(3); + if (log.isDebugEnabled()) { + log.debug(String.format("Discover table named %s", tables)); + } + if (!extraTables.contains(tableName)) { + + if (POSTGIS_TABLES.contains(tableName)) { + continue; + } + + if (schemaName == null || !schemas.contains(schemaName.toUpperCase())) { + continue; + } + + } + + if (log.isDebugEnabled()) { + log.debug(String.format("Keep table: %s", tables)); + } + result.add(Pair.of(schemaName, tableName)); + } + + Collections.sort(result); + return result; + } catch (SQLException e) { + throw new RuntimeException(e); + } finally { + closeQuietly(connection); + closeQuietly(tables); + } + } + + public Set<String> getPostgisFunctions(String functionPattern) { + + final Set<String> result = new LinkedHashSet<String>(); + Connection connection = null; + PreparedStatement preparedStatement = null; + + String sql = String.format("SELECT ns.nspname::text || '.' || p.proname::text || '(' || oidvectortypes(p.proargtypes)::text || ')'" + + " FROM pg_proc p INNER JOIN pg_namespace ns ON (p.pronamespace = ns.oid)" + + " WHERE ns.nspname = 'public' AND p.proname ILIKE '%s%%';", functionPattern); + try { + connection = openConnection(); + preparedStatement = connection.prepareStatement(sql); + ResultSet set = preparedStatement.executeQuery(); + + while (set.next()) { + String functionPrototype = set.getString(1); + result.add(functionPrototype); + } + + } catch (SQLException e) { + throw new RuntimeException(e); + } finally { + closeQuietly(connection); + closeQuietly(preparedStatement); + } + return result; + + } + public void loadScript(String scriptContent) { + Connection connection = null; + PreparedStatement preparedStatement = null; + try { + connection = openConnection(); + preparedStatement = connection.prepareStatement(scriptContent); + preparedStatement.executeUpdate(); + connection.commit(); + } catch (SQLException e) { + throw new RuntimeException(e); + } finally { + closeQuietly(connection); + closeQuietly(preparedStatement); + } } + + + } diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/ObserveSecurityHelper.java b/observe-services-topia/src/main/java/fr/ird/observe/services/ObserveSecurityHelper.java new file mode 100644 index 0000000..10d6b04 --- /dev/null +++ b/observe-services-topia/src/main/java/fr/ird/observe/services/ObserveSecurityHelper.java @@ -0,0 +1,303 @@ +package fr.ird.observe.services; + +import com.google.common.base.Function; +import com.google.common.collect.Iterables; +import com.google.common.collect.Sets; +import fr.ird.observe.entities.Entities; +import fr.ird.observe.services.dto.UserDto; +import fr.ird.observe.services.dto.UserDtos; +import fr.ird.observe.services.dto.constants.Role; +import org.apache.commons.lang3.tuple.Pair; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.topia.migration.mappings.TMSVersionHibernateDao; +import org.nuiton.topia.persistence.TopiaEntityEnum; +import org.nuiton.topia.persistence.jdbc.JdbcConfiguration; +import org.nuiton.util.StringUtil; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.HashSet; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Set; + +/** + * @author Sylvain Bavencoff - bavencoff@codelutin.com + */ +public class ObserveSecurityHelper { + + private static final Log log = LogFactory.getLog(ObserveSecurityHelper.class); + + protected static final String DROP_TABLE_PATTERN = "DROP TABLE IF EXISTS %s.%s CASCADE;\n"; + + protected static final String DROP_SCHEMA_PATTERN = "DROP SCHEMA IF EXISTS %s CASCADE;\n"; + + protected static final String REVOKE_ON_TABLE_ALL_PATTERN = "REVOKE ALL ON %s.%s FROM %s CASCADE;\n"; + + protected static final String SET_ON_TABLE_OWNER_PATTERN = "ALTER TABLE %s.%s OWNER TO %s;\n"; + + protected static final String GRANT_ON_TABLE_READ_PATTERN = "GRANT SELECT ON %s.%s TO %s;\n"; + + protected static final String GRANT_ON_TABLE_ALL_PATTERN = "GRANT ALL ON %s.%s TO %s;\n"; + + protected static final String GRANT_ON_FUNCTION_PATTERN = "GRANT EXECUTE ON FUNCTION %s TO %s;\n"; + + protected static final String REVOKE_ON_SCHEMA_ALL_PATTERN = "REVOKE ALL ON SCHEMA %s FROM %s CASCADE;\n"; + + protected static final String REVOKE_ON_FUNCTIONS_PATTERN = "REVOKE EXECUTE ON FUNCTION %s FROM %s CASCADE;\n"; + + protected static final String GRANT_ON_SCHEMA_ALL_PATTERN = "GRANT USAGE ON SCHEMA %s TO %s;\n"; + + protected static final Set<String> EXTRA_TABLES = Sets.newHashSet( + TMSVersionHibernateDao.TABLE_NAME, + TMSVersionHibernateDao.LEGACY_TABLE_NAME); + + protected static final Set<String> FUNCTION_NAMES_PREFIXS = Sets.newHashSet("ST_MakePoint", + "ST_SetSRID", + "sync_", + "tr_sync", + "ot_enhanced_school_type", + "observe_"); + + + protected static final String SCHEMA_PUBLIC = "public"; + + protected static final Set<String> SCHEMAS = Sets.newHashSet(SCHEMA_PUBLIC, + "OBSERVE_COMMON", + "OBSERVE_SEINE", + "OBSERVE_LONGLINE"); + + public static final Function<String, String> ESCAPE_STRING = new Function<String, String>() { + @Override + public String apply(String input) { + return "\"" + input + "\""; + } + }; + + + protected final ObserveJdbcHelper jdbcHelper; + protected final JdbcConfiguration jdbcConfiguration; + + + public ObserveSecurityHelper(JdbcConfiguration jdbcConfiguration) { + this.jdbcConfiguration = jdbcConfiguration; + this.jdbcHelper = new ObserveJdbcHelper(jdbcConfiguration); + } + + public void applySecurity(Set<UserDto> users, boolean showSql) { + if (users == null) { + throw new NullPointerException("users can not be null"); + } + + String script = createSecurityScript(users); + + if (showSql && log.isInfoEnabled()) { + log.info("SQL to execute :\n" + script); + } + + jdbcHelper.loadScript(script); + + } + + protected String createSecurityScript(Set<UserDto> users) { + + List<Pair<String, String>> tables = jdbcHelper.getTables(SCHEMAS, EXTRA_TABLES); + + if (tables.isEmpty()) { + // no tables + return ""; + } + + String administratorName = jdbcConfiguration.getJdbcConnectionUser(); + + Iterable<String> technicalNames = Iterables.transform(Iterables.filter(users, UserDtos.newRolePredicate(Role.TECHNICAL)), UserDtos.getNameFunction()); + Iterable<String> usersNames = Iterables.transform(Iterables.filter(users, UserDtos.newRolePredicate(Role.USER)), UserDtos.getNameFunction()); + Iterable<String> referentialNames = Iterables.transform(Iterables.filter(users, UserDtos.newRolePredicate(Role.REFERENTIAL)), UserDtos.getNameFunction()); + Iterable<String> unusedNames = Iterables.transform(Iterables.filter(users, UserDtos.newRolePredicate(Role.UNUSED)), UserDtos.getNameFunction()); + + + if (log.isInfoEnabled()) { + log.info("Will apply security on " + tables.size() + " table(s)."); + log.info(" - administrateur : " + administratorName); + log.info(" - techniciens : " + technicalNames); + log.info(" - utilisateurs : " + usersNames); + log.info(" - referentiels : " + referentialNames); + } + + List<Pair<String, String>> referentielTables = getReferentielTables(tables); + + getDataTables(tables, referentielTables); + + Set<String> allPostgisFunctions = new LinkedHashSet<String>(); + for (String postgisFunction : FUNCTION_NAMES_PREFIXS) { + Set<String> postgisFunctions = jdbcHelper.getPostgisFunctions(postgisFunction); + allPostgisFunctions.addAll(postgisFunctions); + } + + StringBuilder builder = new StringBuilder(); + + String administratorEscapedName = ESCAPE_STRING.apply(administratorName); + Set<String> technicalEscapedNames = escapedNames(technicalNames); + Set<String> usersEscapedNames = escapedNames(usersNames); + Set<String> referentialEscapedNames = escapedNames(referentialNames); + Set<String> unusedEscapedNames = escapedNames(unusedNames); + + + + // suppression de tous les droits + { + Set<String> privateRoles = new HashSet<String>(); + privateRoles.add("public"); + privateRoles.addAll(referentialEscapedNames); + privateRoles.addAll(usersEscapedNames); + privateRoles.addAll(unusedEscapedNames); + + String roles = StringUtil.join(privateRoles, ",", true); + + addOnTablesForRole(REVOKE_ON_TABLE_ALL_PATTERN, builder, tables, roles); + addOnSchemaForRole(REVOKE_ON_SCHEMA_ALL_PATTERN, builder, SCHEMAS, roles); + addOnFunctionForRole(REVOKE_ON_FUNCTIONS_PATTERN, builder, allPostgisFunctions, roles); + + } + + // ajout propriétaire + addOnTablesForRole(SET_ON_TABLE_OWNER_PATTERN, builder, tables, administratorEscapedName); + addOnSchemaForRole(GRANT_ON_SCHEMA_ALL_PATTERN, builder, SCHEMAS, administratorEscapedName); + addOnSchemaForRole(GRANT_ON_FUNCTION_PATTERN, builder, allPostgisFunctions, administratorEscapedName); + + // ajout administrateurs + if ( ! technicalEscapedNames.isEmpty()) { + String roles = StringUtil.join(technicalEscapedNames, ",", true); + addOnTablesForRole(GRANT_ON_TABLE_ALL_PATTERN, builder, tables, roles); + addOnSchemaForRole(GRANT_ON_SCHEMA_ALL_PATTERN, builder, SCHEMAS, roles); + addOnSchemaForRole(GRANT_ON_FUNCTION_PATTERN, builder, allPostgisFunctions, roles); + } + + // ajout utilisateur + if ( ! usersEscapedNames.isEmpty()) { + String roles = StringUtil.join(usersEscapedNames, ",", true); + addOnTablesForRole(GRANT_ON_TABLE_READ_PATTERN, builder, tables, roles); + addOnSchemaForRole(GRANT_ON_SCHEMA_ALL_PATTERN, builder, SCHEMAS, roles); + addOnSchemaForRole(GRANT_ON_FUNCTION_PATTERN, builder, allPostgisFunctions, roles); + } + + // ajout referentiel + if ( ! referentialEscapedNames.isEmpty()) { + String roles = StringUtil.join(referentialEscapedNames, ",", true); + addOnTablesForRole(GRANT_ON_TABLE_READ_PATTERN, builder, referentielTables, roles); + addOnSchemaForRole(GRANT_ON_SCHEMA_ALL_PATTERN, builder, SCHEMAS, roles); + addOnSchemaForRole(GRANT_ON_FUNCTION_PATTERN, builder, allPostgisFunctions, roles); + } + + String result = builder.toString(); + + if (log.isInfoEnabled()) { + log.info("Security script :\n" + result); + } + return result; + + + } + + protected Set<String> escapedNames(Iterable<String> names) { + Iterable<String> transform = Iterables.transform(names, ESCAPE_STRING); + return Sets.newHashSet(transform); + } + + protected List<Pair<String, String>> getReferentielTables(Iterable<Pair<String, String>> tables) { + Set<TopiaEntityEnum> types = new HashSet<TopiaEntityEnum>(); + types.addAll(Arrays.asList(Entities.REFERENCE_ENTITIES)); + + List<Pair<String, String>> result = getTables(tables, types, EXTRA_TABLES); + if (log.isInfoEnabled()) { + StringBuilder sb = new StringBuilder(); + sb.append("Detected ").append(result.size()).append(" referentiel tables :"); + for (Pair<String, String> s : result) { + sb.append("\n - ").append(s); + } + log.info(sb.toString()); + } + return result; + } + + protected List<Pair<String, String>> getDataTables(Collection<Pair<String, String>> tables, + Collection<Pair<String, String>> referentielTables) { + List<Pair<String, String>> result = new ArrayList<Pair<String, String>>(tables); + result.removeAll(referentielTables); + + if (log.isInfoEnabled()) { + StringBuilder sb = new StringBuilder(); + sb.append("Detected ").append(result.size()).append(" data tables :"); + for (Pair<String, String> s : result) { + sb.append("\n - ").append(s); + } + log.info(sb.toString()); + } + return result; + } + + protected List<Pair<String, String>> getTables(Iterable<Pair<String, String>> tables, + Set<TopiaEntityEnum> types, + Set<String> extraTypes) { + List<Pair<String, String>> result = new ArrayList<Pair<String, String>>(); + for (Pair<String, String> t : tables) { + String table = t.getRight(); + String detectedType = null; + for (TopiaEntityEnum type : types) { + String name = type.dbTableName(); + if (table.equalsIgnoreCase(name) || table.startsWith(name + "_")) { + detectedType = name; + break; + } + } + if (detectedType == null) { + for (String extraType : extraTypes) { + if (table.equalsIgnoreCase(extraType)) { + detectedType = extraType; + break; + } + } + } + if (detectedType != null && !result.contains(t)) { + result.add(t); + } + } + Collections.sort(result); + return result; + } + + protected void addOnTablesForRole(String pattern, + StringBuilder builder, + Iterable<Pair<String, String>> tables, + String role) { + + for (Pair<String, String> t : tables) { + builder.append(String.format(pattern, t.getLeft(), t.getRight(), role)); + } + } + + protected void addOnSchemaForRole(String pattern, + StringBuilder builder, + Set<String> schemas, + String role) { + + for (String t : schemas) { + builder.append(String.format(pattern, t, role)); + } + } + + protected void addOnFunctionForRole(String pattern, + StringBuilder builder, + Set<String> functions, + String role) { + + for (String t : functions) { + builder.append(String.format(pattern, t, role)); + } + } + + +} 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 53d2820..9c5c750 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 @@ -25,10 +25,12 @@ package fr.ird.observe.services.service; import com.google.common.base.Optional; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Sets; import fr.ird.observe.ObserveTopiaApplicationContext; import fr.ird.observe.ObserveTopiaConfiguration; import fr.ird.observe.ObserveTopiaConfigurationFactory; import fr.ird.observe.services.ObserveJdbcHelper; +import fr.ird.observe.services.ObserveSecurityHelper; import fr.ird.observe.services.ObserveServiceTopia; import fr.ird.observe.services.ObserveTopiaApplicationContextFactory; import fr.ird.observe.services.configuration.ObserveDataSourceConfiguration; @@ -39,6 +41,7 @@ import fr.ird.observe.services.configuration.ObserveDataSourceConnectionTopia; 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.UserDto; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.topia.persistence.jdbc.JdbcHelper; @@ -90,13 +93,13 @@ public class DataSourceServiceTopia extends ObserveServiceTopia implements DataS // On tente une connection à la base ObserveTopiaConfiguration topiaConfiguration = ObserveTopiaConfigurationFactory.forH2Database(h2DataSourceConfiguration.getDirectory(), - h2DataSourceConfiguration.getDbName(), - h2DataSourceConfiguration.getUsername(), - new String(h2DataSourceConfiguration.getPassword()), - false, - false, - false, - false); + h2DataSourceConfiguration.getDbName(), + h2DataSourceConfiguration.getUsername(), + new String(h2DataSourceConfiguration.getPassword()), + false, + false, + false, + false); try { @@ -271,6 +274,55 @@ public class DataSourceServiceTopia extends ObserveServiceTopia implements DataS } + @Override + public Set<UserDto> getUsers() { + + Set<UserDto> users = Sets.newHashSet(); + + ObserveDataSourceConfigurationTopiaSupport dataSourceConfiguration = serviceContext.getDataSourceConfiguration(); + + // pas d'user pour les bases autres que postgresql + if (dataSourceConfiguration instanceof ObserveDataSourceConfigurationTopiaPG) { + + Optional<ObserveTopiaApplicationContext> optionalTopiaApplicationContext = ObserveTopiaApplicationContextFactory.getTopiaApplicationContextIfPresent(dataSourceConfiguration); + + if (optionalTopiaApplicationContext.isPresent()) { + ObserveTopiaConfiguration topiaConfiguration = optionalTopiaApplicationContext.get().getConfiguration(); + + ObserveJdbcHelper observeJdbcHelper = new ObserveJdbcHelper(topiaConfiguration); + + users.addAll(observeJdbcHelper.getUsers()); + + } + + } + + return users; + } + + @Override + public void applySecurity(Set<UserDto> users) { + ObserveDataSourceConfigurationTopiaSupport dataSourceConfiguration = serviceContext.getDataSourceConfiguration(); + + // pas de securité pour les bases autres que postgresql + if (dataSourceConfiguration instanceof ObserveDataSourceConfigurationTopiaPG) { + + Optional<ObserveTopiaApplicationContext> optionalTopiaApplicationContext = ObserveTopiaApplicationContextFactory.getTopiaApplicationContextIfPresent(dataSourceConfiguration); + + if (optionalTopiaApplicationContext.isPresent()) { + + ObserveTopiaConfiguration topiaConfiguration = optionalTopiaApplicationContext.get().getConfiguration(); + + ObserveSecurityHelper securityHelper = new ObserveSecurityHelper(topiaConfiguration); + + securityHelper.applySecurity(users, dataSourceConfiguration.isShowMigrationSql()); + + } + + } + + } + protected void executeGzipSqlStatements(ObserveTopiaApplicationContext topiaApplicationContext, String temporaryFilePrefix, byte... content) { File temporaryDirectory = serviceContext.createTemporaryDirectory(temporaryFilePrefix); -- 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 develop in repository observe. See http://git.codelutin.com/observe.git commit 34b2c0e0a41e4eb689e03b167440abe13eb51556 Author: Sylvain Bavencoff <bavencoff@codelutin.com> Date: Wed Sep 30 09:45:11 2015 +0200 renomage en observeDbUserDto et ajout du role d'administrator (refs #7549) --- .../services/service/DataSourceService.java | 6 ++--- .../dto/{UserDtos.java => ObserveDbUserDtos.java} | 6 ++--- .../constants/{Role.java => ObserveDbRole.java} | 5 +++-- .../src/main/xmi/observe-services-dto-common.zargo | Bin 38585 -> 39020 bytes .../fr/ird/observe/services/ObserveJdbcHelper.java | 19 +++++++++------- .../observe/services/ObserveSecurityHelper.java | 25 ++++++++++++--------- .../services/dto/ObserveDtosInitializer.java | 2 +- .../services/service/DataSourceServiceTopia.java | 8 +++---- 8 files changed, 39 insertions(+), 32 deletions(-) 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 f5f1c9e..bd380d0 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 @@ -28,7 +28,7 @@ import fr.ird.observe.services.configuration.ObserveDataSourceConnection; 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.UserDto; +import fr.ird.observe.services.dto.ObserveDbUserDto; import fr.ird.observe.services.spi.NoDataAccess; import fr.ird.observe.services.spi.ReadDataPermission; import fr.ird.observe.services.spi.ReadReferentialPermission; @@ -62,12 +62,12 @@ public interface DataSourceService extends ObserveService { @WriteReferentialPermission @ReadDataPermission @WriteDataPermission - Set<UserDto> getUsers(); + Set<ObserveDbUserDto> getUsers(); @ReadReferentialPermission @WriteReferentialPermission @ReadDataPermission @WriteDataPermission @Write - void applySecurity(Set<UserDto> users); + void applySecurity(Set<ObserveDbUserDto> users); } diff --git a/observe-services-model/src/main/java/fr/ird/observe/services/dto/UserDtos.java b/observe-services-model/src/main/java/fr/ird/observe/services/dto/ObserveDbUserDtos.java similarity index 71% rename from observe-services-model/src/main/java/fr/ird/observe/services/dto/UserDtos.java rename to observe-services-model/src/main/java/fr/ird/observe/services/dto/ObserveDbUserDtos.java index 215d40c..12bcb54 100644 --- a/observe-services-model/src/main/java/fr/ird/observe/services/dto/UserDtos.java +++ b/observe-services-model/src/main/java/fr/ird/observe/services/dto/ObserveDbUserDtos.java @@ -2,7 +2,7 @@ package fr.ird.observe.services.dto; import java.util.Comparator; -public class UserDtos extends AbstractUserDtos { +public class ObserveDbUserDtos extends AbstractObserveDbUserDtos { protected static UserDtoComparator USER_DTO_COMPARATOR = new UserDtoComparator(); @@ -10,10 +10,10 @@ public class UserDtos extends AbstractUserDtos { return USER_DTO_COMPARATOR; } - protected static class UserDtoComparator implements Comparator<UserDto> { + protected static class UserDtoComparator implements Comparator<ObserveDbUserDto> { @Override - public int compare(UserDto user1, UserDto user2) { + public int compare(ObserveDbUserDto user1, ObserveDbUserDto user2) { return user1.getName().compareTo(user2.getName()); } } diff --git a/observe-services-model/src/main/java/fr/ird/observe/services/dto/constants/Role.java b/observe-services-model/src/main/java/fr/ird/observe/services/dto/constants/ObserveDbRole.java similarity index 71% rename from observe-services-model/src/main/java/fr/ird/observe/services/dto/constants/Role.java rename to observe-services-model/src/main/java/fr/ird/observe/services/dto/constants/ObserveDbRole.java index 896cba6..1519cc5 100644 --- a/observe-services-model/src/main/java/fr/ird/observe/services/dto/constants/Role.java +++ b/observe-services-model/src/main/java/fr/ird/observe/services/dto/constants/ObserveDbRole.java @@ -3,11 +3,12 @@ package fr.ird.observe.services.dto.constants; /** * @author Sylvain Bavencoff - bavencoff@codelutin.com */ -public enum Role { +public enum ObserveDbRole { UNUSED, REFERENTIAL, USER, - TECHNICAL; + TECHNICAL, + ADMINISTRATOR; } diff --git a/observe-services-model/src/main/xmi/observe-services-dto-common.zargo b/observe-services-model/src/main/xmi/observe-services-dto-common.zargo index 2bdd1d5..d0c8242 100644 Binary files a/observe-services-model/src/main/xmi/observe-services-dto-common.zargo and b/observe-services-model/src/main/xmi/observe-services-dto-common.zargo differ diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/ObserveJdbcHelper.java b/observe-services-topia/src/main/java/fr/ird/observe/services/ObserveJdbcHelper.java index d2961b6..1efa7bf 100644 --- a/observe-services-topia/src/main/java/fr/ird/observe/services/ObserveJdbcHelper.java +++ b/observe-services-topia/src/main/java/fr/ird/observe/services/ObserveJdbcHelper.java @@ -2,8 +2,8 @@ package fr.ird.observe.services; import com.google.common.collect.Lists; import com.google.common.collect.Sets; -import fr.ird.observe.services.dto.UserDto; -import fr.ird.observe.services.dto.constants.Role; +import fr.ird.observe.services.dto.ObserveDbUserDto; +import fr.ird.observe.services.dto.constants.ObserveDbRole; import org.apache.commons.lang3.tuple.Pair; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -97,23 +97,27 @@ public class ObserveJdbcHelper extends JdbcHelper { } - public List<UserDto> getUsers() { + public List<ObserveDbUserDto> getUsers() { Connection connection = null; PreparedStatement preparedStatement = null; - List<UserDto> users = Lists.newLinkedList(); + List<ObserveDbUserDto> users = Lists.newLinkedList(); try { connection = openConnection(); // la connexion est reussie, on recherche les droits de // récupération de la version de la base - preparedStatement = connection.prepareStatement("SELECT rolname FROM pg_catalog.pg_roles where rolname <> current_user;"); + preparedStatement = connection.prepareStatement("SELECT rolname FROM pg_catalog.pg_roles;"); ResultSet resultSet = preparedStatement.executeQuery(); while (resultSet.next()) { String name = resultSet.getString(1); - UserDto user = new UserDto(); + ObserveDbUserDto user = new ObserveDbUserDto(); user.setName(name); - user.setRole(Role.UNUSED); + if (jdbcConfiguration.getJdbcConnectionUser().equals(name)) { + user.setRole(ObserveDbRole.ADMINISTRATOR); + } else { + user.setRole(ObserveDbRole.UNUSED); + } users.add(user); } @@ -230,7 +234,6 @@ public class ObserveJdbcHelper extends JdbcHelper { preparedStatement.executeUpdate(); - connection.commit(); } catch (SQLException e) { throw new RuntimeException(e); } finally { diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/ObserveSecurityHelper.java b/observe-services-topia/src/main/java/fr/ird/observe/services/ObserveSecurityHelper.java index 10d6b04..37ce8c4 100644 --- a/observe-services-topia/src/main/java/fr/ird/observe/services/ObserveSecurityHelper.java +++ b/observe-services-topia/src/main/java/fr/ird/observe/services/ObserveSecurityHelper.java @@ -4,9 +4,9 @@ import com.google.common.base.Function; import com.google.common.collect.Iterables; import com.google.common.collect.Sets; import fr.ird.observe.entities.Entities; -import fr.ird.observe.services.dto.UserDto; -import fr.ird.observe.services.dto.UserDtos; -import fr.ird.observe.services.dto.constants.Role; +import fr.ird.observe.services.dto.ObserveDbUserDto; +import fr.ird.observe.services.dto.ObserveDbUserDtos; +import fr.ird.observe.services.dto.constants.ObserveDbRole; import org.apache.commons.lang3.tuple.Pair; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -87,7 +87,7 @@ public class ObserveSecurityHelper { this.jdbcHelper = new ObserveJdbcHelper(jdbcConfiguration); } - public void applySecurity(Set<UserDto> users, boolean showSql) { + public void applySecurity(Set<ObserveDbUserDto> users, boolean showSql) { if (users == null) { throw new NullPointerException("users can not be null"); } @@ -102,7 +102,7 @@ public class ObserveSecurityHelper { } - protected String createSecurityScript(Set<UserDto> users) { + protected String createSecurityScript(Set<ObserveDbUserDto> users) { List<Pair<String, String>> tables = jdbcHelper.getTables(SCHEMAS, EXTRA_TABLES); @@ -111,12 +111,11 @@ public class ObserveSecurityHelper { return ""; } - String administratorName = jdbcConfiguration.getJdbcConnectionUser(); - - Iterable<String> technicalNames = Iterables.transform(Iterables.filter(users, UserDtos.newRolePredicate(Role.TECHNICAL)), UserDtos.getNameFunction()); - Iterable<String> usersNames = Iterables.transform(Iterables.filter(users, UserDtos.newRolePredicate(Role.USER)), UserDtos.getNameFunction()); - Iterable<String> referentialNames = Iterables.transform(Iterables.filter(users, UserDtos.newRolePredicate(Role.REFERENTIAL)), UserDtos.getNameFunction()); - Iterable<String> unusedNames = Iterables.transform(Iterables.filter(users, UserDtos.newRolePredicate(Role.UNUSED)), UserDtos.getNameFunction()); + String administratorName = Iterables.get(getUserNamesByRole(users, ObserveDbRole.ADMINISTRATOR), 0); + Iterable<String> technicalNames = getUserNamesByRole(users, ObserveDbRole.TECHNICAL); + Iterable<String> usersNames = getUserNamesByRole(users, ObserveDbRole.USER); + Iterable<String> referentialNames = getUserNamesByRole(users, ObserveDbRole.REFERENTIAL); + Iterable<String> unusedNames = getUserNamesByRole(users, ObserveDbRole.UNUSED); if (log.isInfoEnabled()) { @@ -202,6 +201,10 @@ public class ObserveSecurityHelper { } + protected Iterable<String> getUserNamesByRole(Set<ObserveDbUserDto> users, ObserveDbRole role) { + return Iterables.transform(Iterables.filter(users, ObserveDbUserDtos.newRolePredicate(role)), ObserveDbUserDtos.getNameFunction()); + } + protected Set<String> escapedNames(Iterable<String> names) { Iterable<String> transform = Iterables.transform(names, ESCAPE_STRING); return Sets.newHashSet(transform); diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/dto/ObserveDtosInitializer.java b/observe-services-topia/src/main/java/fr/ird/observe/services/dto/ObserveDtosInitializer.java index 92ec5bd..164b6d8 100644 --- a/observe-services-topia/src/main/java/fr/ird/observe/services/dto/ObserveDtosInitializer.java +++ b/observe-services-topia/src/main/java/fr/ird/observe/services/dto/ObserveDtosInitializer.java @@ -351,7 +351,7 @@ public class ObserveDtosInitializer implements ObserveModelInitializer { } @Override - public void initUserDto() { + public void initObserveDbUserDto() { // Rien à faire } 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 9c5c750..a531565 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 @@ -41,7 +41,7 @@ import fr.ird.observe.services.configuration.ObserveDataSourceConnectionTopia; 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.UserDto; +import fr.ird.observe.services.dto.ObserveDbUserDto; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.topia.persistence.jdbc.JdbcHelper; @@ -275,9 +275,9 @@ public class DataSourceServiceTopia extends ObserveServiceTopia implements DataS } @Override - public Set<UserDto> getUsers() { + public Set<ObserveDbUserDto> getUsers() { - Set<UserDto> users = Sets.newHashSet(); + Set<ObserveDbUserDto> users = Sets.newHashSet(); ObserveDataSourceConfigurationTopiaSupport dataSourceConfiguration = serviceContext.getDataSourceConfiguration(); @@ -301,7 +301,7 @@ public class DataSourceServiceTopia extends ObserveServiceTopia implements DataS } @Override - public void applySecurity(Set<UserDto> users) { + public void applySecurity(Set<ObserveDbUserDto> users) { ObserveDataSourceConfigurationTopiaSupport dataSourceConfiguration = serviceContext.getDataSourceConfiguration(); // pas de securité pour les bases autres que postgresql -- 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 develop in repository observe. See http://git.codelutin.com/observe.git commit 8ec40fefe7b49a496b5ca95cae8326ce9a9d420b Author: Sylvain Bavencoff <bavencoff@codelutin.com> Date: Wed Sep 30 09:46:03 2015 +0200 ajout du converter pour les DTO (refs #7549) --- .../web/ObserveWebApplicationListener.java | 3 ++ .../controller/v1/DataSourceServiceController.java | 6 ++-- .../ObserveDtoConverter.java} | 34 ++++++++++++---------- .../web/injector/ObserveDtoInjector.java | 30 ++++++++++++++++++- 4 files changed, 53 insertions(+), 20 deletions(-) diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveWebApplicationListener.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveWebApplicationListener.java index 37bd2ea..5f90a88 100644 --- a/observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveWebApplicationListener.java +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveWebApplicationListener.java @@ -23,8 +23,10 @@ package fr.ird.observe.application.web; */ import com.google.gson.Gson; +import fr.ird.observe.application.web.converter.ObserveDtoConverter; import fr.ird.observe.application.web.injector.ObserveDataSourceConfigurationInjector; import fr.ird.observe.application.web.injector.ObserveDtoInjector; +import fr.ird.observe.services.dto.ObserveDbUserDto; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.debux.webmotion.server.WebMotionServerListener; @@ -58,6 +60,7 @@ public class ObserveWebApplicationListener implements WebMotionServerListener { context.addInjector(new ObserveDataSourceConfigurationInjector(gson)); context.addInjector(new ObserveDtoInjector(gson)); + context.addConverter(new ObserveDtoConverter(gson), ObserveDbUserDto.class); context.getServletContext().setAttribute( ObserveWebApplicationContext.APPLICATION_CONTEXT_PARAMETER, applicationContext); 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 6e713c8..6225f59 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 @@ -34,7 +34,7 @@ import fr.ird.observe.services.configuration.ObserveDataSourceConnectionRest; 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.UserDto; +import fr.ird.observe.services.dto.ObserveDbUserDto; import fr.ird.observe.services.service.DataSourceService; import fr.ird.observe.services.service.DatabaseConnexionNotAuthorizedException; import fr.ird.observe.services.service.DatabaseNotFoundException; @@ -111,12 +111,12 @@ public class DataSourceServiceController extends ObserveServiceControllerSupport } @Override - public Set<UserDto> getUsers() { + public Set<ObserveDbUserDto> getUsers() { return getAuthenticatedService().getUsers(); } @Override - public void applySecurity(Set<UserDto> users) { + public void applySecurity(Set<ObserveDbUserDto> users) { getAuthenticatedService().applySecurity(users); } diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/injector/ObserveDtoInjector.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/converter/ObserveDtoConverter.java similarity index 59% copy from observe-application-web/src/main/java/fr/ird/observe/application/web/injector/ObserveDtoInjector.java copy to observe-application-web/src/main/java/fr/ird/observe/application/web/converter/ObserveDtoConverter.java index 8efd2ed..a892019 100644 --- a/observe-application-web/src/main/java/fr/ird/observe/application/web/injector/ObserveDtoInjector.java +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/converter/ObserveDtoConverter.java @@ -1,4 +1,4 @@ -package fr.ird.observe.application.web.injector; +package fr.ird.observe.application.web.converter; /* * #%L @@ -24,49 +24,51 @@ package fr.ird.observe.application.web.injector; import com.google.gson.Gson; import fr.ird.observe.services.dto.ObserveDto; +import org.apache.commons.beanutils.converters.AbstractConverter; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.debux.webmotion.server.call.Call; -import org.debux.webmotion.server.handler.ExecutorParametersInjectorHandler; -import org.debux.webmotion.server.mapping.Mapping; - -import java.lang.reflect.Type; /** * Created on 07/09/15. * * @author Tony Chemit - chemit@codelutin.com */ -public class ObserveDtoInjector implements ExecutorParametersInjectorHandler.Injector { +public class ObserveDtoConverter extends AbstractConverter { /** Logger. */ - private static final Log log = LogFactory.getLog(ObserveDtoInjector.class); + private static final Log log = LogFactory.getLog(ObserveDtoConverter.class); protected final Gson gson; - public ObserveDtoInjector(Gson gson) { + public ObserveDtoConverter(Gson gson) { this.gson = gson; } + @Override - public Object getValue(Mapping mapping, Call call, String name, Class<?> type, Type generic) { + protected <T> T convertToType(Class<T> type, Object value) throws Throwable { + T observeDto = null; - ObserveDto observeDto = null; if (ObserveDto.class.isAssignableFrom(type)) { - Call.ParameterTree parameterTree = call.getParameterTree().getObject().get(name); - - String gsonContent= ((String[])parameterTree.getValue())[0]; + String gsonContent = value.toString(); - observeDto = gson.fromJson(gsonContent, generic); + observeDto = gson.fromJson(gsonContent, type); if (log.isInfoEnabled()) { - log.info("Inject observeDto: " + observeDto); + log.info("convert observeDto: " + observeDto); } + } else { + throw conversionException(type, value); } return observeDto; } + + @Override + protected Class<?> getDefaultType() { + return ObserveDto.class; + } } diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/injector/ObserveDtoInjector.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/injector/ObserveDtoInjector.java index 8efd2ed..5694eee 100644 --- a/observe-application-web/src/main/java/fr/ird/observe/application/web/injector/ObserveDtoInjector.java +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/injector/ObserveDtoInjector.java @@ -24,6 +24,7 @@ package fr.ird.observe.application.web.injector; import com.google.gson.Gson; import fr.ird.observe.services.dto.ObserveDto; +import org.apache.commons.beanutils.converters.AbstractConverter; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.debux.webmotion.server.call.Call; @@ -37,7 +38,7 @@ import java.lang.reflect.Type; * * @author Tony Chemit - chemit@codelutin.com */ -public class ObserveDtoInjector implements ExecutorParametersInjectorHandler.Injector { +public class ObserveDtoInjector extends AbstractConverter implements ExecutorParametersInjectorHandler.Injector { /** Logger. */ private static final Log log = LogFactory.getLog(ObserveDtoInjector.class); @@ -69,4 +70,31 @@ public class ObserveDtoInjector implements ExecutorParametersInjectorHandler.Inj return observeDto; } + + @Override + protected <T> T convertToType(Class<T> type, Object value) throws Throwable { + T observeDto = null; + + if (ObserveDto.class.isAssignableFrom(type)) { + + String gsonContent = value.toString(); + + observeDto = gson.fromJson(gsonContent, type); + + if (log.isInfoEnabled()) { + log.info("convert observeDto: " + observeDto); + } + + } else { + throw conversionException(type, value); + } + + return observeDto; + + } + + @Override + protected Class<?> getDefaultType() { + return ObserveDto.class; + } } -- 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 develop in repository observe. See http://git.codelutin.com/observe.git commit bfcd27c09e6ba89f6879d500b611f953fbe88ba4 Author: Sylvain Bavencoff <bavencoff@codelutin.com> Date: Wed Sep 30 09:50:39 2015 +0200 migration des tâches administratives, mise ren place de la Sécurité (refs #7549) --- .../main/java/fr/ird/observe/ObserveCLAction.java | 6 - .../ird/observe/business/util/SecurityModel.java | 217 ---------- .../fr/ird/observe/db/ObserveSwingDataSource.java | 23 +- .../ird/observe/ui/storage/ObstunaAdminAction.java | 458 ++++++++++++--------- .../ird/observe/ui/storage/RemoteUILauncher.java | 48 +-- .../ird/observe/ui/storage/StorageUIHandler.java | 96 +++-- .../fr/ird/observe/ui/storage/StorageUIModel.java | 18 +- .../observe/ui/storage/tabs/RolesTableModel.java | 62 ++- .../fr/ird/observe/ui/storage/tabs/RolesUI.css | 2 +- .../fr/ird/observe/ui/storage/tabs/RolesUI.jaxx | 2 +- .../ird/observe/ui/storage/tabs/SecurityModel.java | 149 +++++++ 11 files changed, 565 insertions(+), 516 deletions(-) diff --git a/observe-application-swing/src/main/java/fr/ird/observe/ObserveCLAction.java b/observe-application-swing/src/main/java/fr/ird/observe/ObserveCLAction.java index a8c6130..d9c78c6 100644 --- a/observe-application-swing/src/main/java/fr/ird/observe/ObserveCLAction.java +++ b/observe-application-swing/src/main/java/fr/ird/observe/ObserveCLAction.java @@ -174,12 +174,6 @@ public class ObserveCLAction { public ObserveCLAction() { } - public void useJMX() throws Exception { - - // just set the useJMX flag - ObserveServiceHelper.setUseJMX(true); - } - /** Désactiver la possiblite de lancer l'ui principale. */ public void disableMainUI() { if (log.isDebugEnabled()) { diff --git a/observe-application-swing/src/main/java/fr/ird/observe/business/util/SecurityModel.java b/observe-application-swing/src/main/java/fr/ird/observe/business/util/SecurityModel.java deleted file mode 100644 index 878c1ff..0000000 --- a/observe-application-swing/src/main/java/fr/ird/observe/business/util/SecurityModel.java +++ /dev/null @@ -1,217 +0,0 @@ -/* - * #%L - * ObServe :: Business - * %% - * Copyright (C) 2008 - 2010 IRD, Codelutin, Tony Chemit - * %% - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program. If not, see - * <http://www.gnu.org/licenses/gpl-3.0.html>. - * #L% - */ -package fr.ird.observe.business.util; - -import com.google.common.base.Function; -import com.google.common.collect.Iterables; -import com.google.common.collect.Sets; - -import java.beans.PropertyChangeListener; -import java.beans.PropertyChangeSupport; -import java.io.Serializable; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; -import java.util.SortedMap; -import java.util.TreeMap; - -/** - * Le modèle la sécurité à appliquer sur une base postgres - * - * @author Tony Chemit - chemit@codelutin.com - * @since 1.4 - */ -public class SecurityModel implements Serializable { - - public static final String PROPERTY_ADMINISTRATEUR = "administrateur"; - - public static final String PROPERTY_ROLE = "role"; - - public static final String PROPERTY_ASSIGNED = "assigned"; - - private static final long serialVersionUID = 1L; - - public static final Function<String, String> ESCAPE_STRING = new Function<String, String>() { - @Override - public String apply(String input) { - return "\"" + input + "\""; - } - }; - - public enum Role { - unused, - referentiel, - utilisateur, - technicien - } - - protected String administrateur; - - protected SortedMap<String, Role> map; - - protected PropertyChangeSupport pcs = new PropertyChangeSupport(this); - - public SecurityModel() { - map = new TreeMap<String, Role>(); - } - - public String getAdministrateur() { - return administrateur; - } - - public Role getRole(String role) { - return map.get(role); - } - - public Set<String> getRole(Role role) { - Set<String> roles = new HashSet<String>(); - for (Map.Entry<String, Role> entry : map.entrySet()) { - if (role.equals(entry.getValue())) { - roles.add(entry.getKey()); - } - } - return roles; - } - - public Set<String> getRole() { - return map.keySet(); - } - - public Set<String> getTechnicien() { - return getRole(Role.technicien); - } - - public Set<String> getUtilisateur() { - return getRole(Role.utilisateur); - } - - public Set<String> getReferentiel() { - return getRole(Role.referentiel); - } - - public Set<String> getEscapedReferentiel() { - Set<String> result = Sets.newHashSet( - Iterables.transform(getReferentiel(), ESCAPE_STRING)); - return result; - } - - public Set<String> getEscapedTechnicien() { - Set<String> result = Sets.newHashSet( - Iterables.transform(getTechnicien(), ESCAPE_STRING)); - return result; - } - - public Set<String> getEscapedUtilisateur() { - Set<String> result = Sets.newHashSet( - Iterables.transform(getUtilisateur(), ESCAPE_STRING)); - return result; - } - - public String getEscapedAdministrateur() { - return ESCAPE_STRING.apply(getAdministrateur()); - } - - public Set<String> getUnused() { - return getRole(Role.unused); - } - - public Set<String> getEscapedUnused() { - Set<String> result = Sets.newHashSet( - Iterables.transform(getUnused(), ESCAPE_STRING)); - return result; - } - - public boolean isRole(Role r, String role) { - return r.equals(getRole(role)); - } - - public void setAdministrateur(String administrateur) { - Object oldvalue = this.administrateur; - this.administrateur = administrateur; - firePropertyChange(PROPERTY_ADMINISTRATEUR, oldvalue, administrateur); - } - - public void init(Iterable<String> role) { - map.clear(); - if (role != null) { - for (String r : role) { - // by default let's say that any role is not used - // (make it quicker then to only give correct access) - map.put(r, Role.unused); - } - } - firePropertyChange(PROPERTY_ROLE, null, getRole()); - firePropertyChange(PROPERTY_ASSIGNED, null, getAssigned()); - } - - public void setRole(String name, Role role, boolean fire) { - map.put(name, role); - if (fire) { - if (role != null) { - firePropertyChange(role.name(), null, getRole(role)); - } - firePropertyChange(PROPERTY_ASSIGNED, null, getAssigned()); - } - } - - public void setRole(Iterable<String> roles, Role role) { - for (String r : roles) { - setRole(r, role, false); - } - firePropertyChange(role.name(), null, getRole(role)); - firePropertyChange(PROPERTY_ASSIGNED, null, getAssigned()); - } - - public int getAssigned() { - int count = 0; - for (Map.Entry<String, Role> entry : map.entrySet()) { - if (entry.getValue() != null) { - count++; - } - } - return count; - } - - public void addPropertyChangeListener(PropertyChangeListener listener) { - pcs.addPropertyChangeListener(listener); - } - - public void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) { - pcs.addPropertyChangeListener(propertyName, listener); - } - - public void removePropertyChangeListener(PropertyChangeListener listener) { - pcs.removePropertyChangeListener(listener); - } - - public void removePropertyChangeListener(String propertyName, PropertyChangeListener listener) { - pcs.removePropertyChangeListener(propertyName, listener); - } - - protected void firePropertyChange(String propertyName, Object oldValue, Object newValue) { - pcs.firePropertyChange(propertyName, oldValue, newValue); - } - - protected void firePropertyChange(String propertyName, Object newValue) { - firePropertyChange(propertyName, null, newValue); - } -} 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 7906baa..b49a5b4 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 @@ -17,6 +17,7 @@ import fr.ird.observe.services.configuration.ObserveDataSourceConnection; 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.dto.constants.ReferentialLocale; import fr.ird.observe.services.service.DataSourceService; import fr.ird.observe.services.service.DatabaseConnexionNotAuthorizedException; @@ -29,6 +30,7 @@ import org.nuiton.util.version.Version; import javax.swing.event.EventListenerList; import java.io.File; import java.util.Locale; +import java.util.Set; import static org.nuiton.i18n.I18n.t; @@ -168,6 +170,25 @@ public class ObserveSwingDataSource extends AbstractSerializableBean { } + public Set<ObserveDbUserDto> getUsers() { + Preconditions.checkState(isOpen(), "Connection is not open"); + + DataSourceService dataSourceService = newService(DataSourceService.class); + + Set<ObserveDbUserDto> users = dataSourceService.getUsers(); + + return users; + } + + + public void applySecurity(Set<ObserveDbUserDto> users) { + Preconditions.checkState(isOpen(), "Connection is not open"); + + DataSourceService dataSourceService = newService(DataSourceService.class); + + dataSourceService.applySecurity(users); + } + public boolean isOpen() { return connection != null; } @@ -300,6 +321,4 @@ public class ObserveSwingDataSource extends AbstractSerializableBean { listener.onClosed(evt); } } - - } 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 d3a23f3..4f68ed6 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 @@ -21,6 +21,20 @@ */ package fr.ird.observe.ui.storage; +import com.google.common.base.Preconditions; +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Iterables; +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.configuration.ObserveDataSourceConfigurationRest; +import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationTopiaPG; +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.DatabaseConnexionNotAuthorizedException; +import fr.ird.observe.services.service.DatabaseNotFoundException; +import fr.ird.observe.ui.storage.tabs.DataSelectionModel; import jaxx.runtime.JAXXContext; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -28,8 +42,10 @@ import org.nuiton.util.version.Version; import org.nuiton.util.version.Versions; import java.awt.Window; +import java.util.Set; import static org.nuiton.i18n.I18n.n; +import static org.nuiton.i18n.I18n.t; /** * Les différents types d'actions d'administration possible sur une base @@ -50,128 +66,139 @@ public enum ObstunaAdminAction { null) { @Override public RemoteUILauncher newLauncher(JAXXContext context, Window frame) { - //FIXME -// return new RemoteUILauncher(this, context, frame, t(getLabel())) { -// @Override -// protected void init(StorageUI ui) { -// StorageUIModel model = ui.getModel(); -// -// // on autorise le mode de creation import referentiel -// // depuis une source distante -// model.getPgConfig().setCreationMode(CreationMode.IMPORT_REMOTE_STORAGE); -// model.getPgConfig().setCanMigrate(true); -// super.init(ui); -// } -// -// protected void checkImportDbVersion(StorageUIModel model, DataSourceConfig dataSourceConfig) throws DataSourceException { -// -// DataSource importDatasource = DataSourceFactory.newService(dataSourceConfig); -// -// try { -// importDatasource.doOpen(); -// -// model.checkImportDbVersion(importDatasource); -// -// } finally { -// importDatasource.doClose(false); -// } -// -// } -// -// protected void initTask(StorageUIModel model, -// PGInstall task) throws Exception { -// -// -// PGDataSourceConfig pgConfig = model.getPgConfig(); -// -// // pas autorise a migrer automatiquement -// pgConfig.setCanMigrate(false); -// -// // references import -// pgConfig.setCreationMode(model.getReferentielImportMode()); -// -// DataSourceConfig importReferenceConfig = model.toImportReferentielSourceConfig(); -// pgConfig.setImportConfig(importReferenceConfig); -// -// if (importReferenceConfig != null) { -// -// if (log.isInfoEnabled()) { -// log.info("Use referentiel import data source " + importReferenceConfig.getLabel()); -// } -// -// checkImportDbVersion(model, importReferenceConfig); -// -// } -// -// // data import -// -// DataSourceConfig importDataConfig = model.toImportDataSourceConfig(); -// pgConfig.setImportDataConfig(importDataConfig); -// -// Set<String> importDataIds = null; -// -// if (importDataConfig != null) { -// -// if (log.isInfoEnabled()) { -// log.info("Use data import data source " + importDataConfig.getLabel()); -// } -// -// checkImportDbVersion(model, importDataConfig); -// -// DataSelectionModel dataModel = model.getSelectDataModel(); -// -// if (!dataModel.isDataFull()) { -// // on renseigne les marees a importer uniquement si -// // on en a selectionner, de plus si on a selectionne -// // toutes les marees, on le les passe pas : car c un dump -// // complet de la base. -// importDataIds = dataModel.getSelectedData(); -// } -// pgConfig.setImportDataIds(importDataIds); -// } -// pgConfig.setImportDataIds(importDataIds); -// -// super.initTask(model, task); -// } -// -// @Override -// protected String getPgLabel() { -// return t("observe.storage.label.db.to.create"); -// } -// -// @Override -// protected void execute(PGInstall task) throws Exception { -// if (log.isInfoEnabled()) { -// log.info("Create db..."); -// } -// -// // on commence par supprimer toute table gérée par ObServe -// task.dropDb(); -// -// // ici on ne fait qu'ouvrir la base (qui va créer le schema -// // puis importer le référentiel) -// PGDataSourceConfig config = task.getDataSourceConfig(); -// PGDataSource service = DataSourceFactory.newService(config); -// if (log.isInfoEnabled()) { -// log.info("Open [" + service.getLabel() + "] and create it."); -// } -// -// try { -// service.doOpen(); -// } finally { -// service.doClose(false); -// } -// } -// -// @Override -// protected void applySecurity(PGInstall task) throws SQLException { -// if (log.isInfoEnabled()) { -// log.info("Apply security..."); -// } -// task.applySecurity(); -// } -// }; - return null; + return new RemoteUILauncher(this, context, frame, t(getLabel())) { + + protected DataSourceCreateConfigurationDto createConfigurationDto; + protected ObserveSwingDataSource dataSource; + protected Set<ObserveDbUserDto> users; + + @Override + protected void init(StorageUI ui) { + StorageUIModel model = ui.getModel(); + + // on autorise le mode de creation import referentiel + // depuis une source distante + model.getPgConfig().setCanMigrate(true); + super.init(ui); + } + + protected void checkImportDbVersion(StorageUIModel model, ObserveDataSourceConfiguration dataSourceConfig) throws DatabaseConnexionNotAuthorizedException, DatabaseNotFoundException { + + ObserveSwingDataSource importDataSource = new ObserveSwingDataSource(dataSourceConfig); + + Preconditions.checkState(importDataSource != null, "Can't select data on a null dataSource"); + + try { + + importDataSource.open(); + + model.checkImportDbVersion(importDataSource); + + } finally { + + importDataSource.close(); + } + + } + + protected void initTask(StorageUIModel model) throws Exception { + + if (DbMode.USE_REMOTE.equals(model.getDbMode())) { + ObserveDataSourceConfigurationTopiaPG pgConfig = model.getPgConfig(); + + // pas autorise a migrer automatiquement + pgConfig.setCanMigrate(false); + + dataSource = new ObserveSwingDataSource(pgConfig); + } else { + ObserveDataSourceConfigurationRest restConfig = model.getRestConfig(); + + dataSource = new ObserveSwingDataSource(restConfig); + } + + // references import + model.setCreationMode(model.getReferentielImportMode()); + + createConfigurationDto = model.toImportReferentielSourceConfig(); + + ObserveDataSourceConfiguration importReferentialConfig = createConfigurationDto.getImportReferentialDataSourceConfiguration(); + + + if (importReferentialConfig != null) { + + if (log.isInfoEnabled()) { + log.info("Use referentiel import data source " + importReferentialConfig.getLabel()); + } + + checkImportDbVersion(model, importReferentialConfig); + + } + + // data import + + ObserveSwingDataSource importDataConfig = model.toImportDataSourceConfig(); + + + ImmutableSet<String> importDataIds = null; + + if (importDataConfig != null) { + + if (log.isInfoEnabled()) { + log.info("Use data import data source " + importDataConfig.getLabel()); + } + + checkImportDbVersion(model, importDataConfig.getConfiguration()); + + DataSelectionModel dataModel = model.getSelectDataModel(); + + if (!dataModel.isDataFull()) { + // on renseigne les marees a importer uniquement si + // on en a selectionner, de plus si on a selectionne + // toutes les marees, on le les passe pas : car c un dump + // complet de la base. + importDataIds = ImmutableSet.copyOf(Iterables.transform(dataModel.getSelectedData(), IdDtos.getIdFunction())); + } + + createConfigurationDto.setImportDataConfiguration(importDataConfig.getConfiguration(), importDataIds); + } + + + super.initTask(model); + } + + @Override + protected String getPgLabel() { + return t("observe.storage.label.db.to.create"); + } + + @Override + protected void execute() throws Exception { + if (log.isInfoEnabled()) { + log.info("Create db..."); + } + + try { + dataSource.create(createConfigurationDto); + + if (log.isInfoEnabled()) { + log.info("Open [" + dataSource.getLabel() + "] and create it."); + } + + } finally { + if (dataSource.isOpen()) { + dataSource.close(); + } + } + } + + @Override + protected void applySecurity() throws Exception { + if (log.isInfoEnabled()) { + log.info("Apply security..."); + } + dataSource.applySecurity(users); + } + }; } }, /** @@ -184,40 +211,67 @@ public enum ObstunaAdminAction { Versions.valueOf("1.0")) { @Override public RemoteUILauncher newLauncher(JAXXContext context, Window frame) { - //FIXME -// return new RemoteUILauncher(this, context, frame, t(getLabel())) { -// -// @Override -// protected void execute(PGInstall task) throws Exception { -// -// // ici on ne fait qu'ouvrir la base (qui va faire les mise à jour) -// PGDataSourceConfig config = task.getDataSourceConfig(); -// PGDataSource service = DataSourceFactory.newService(config); -// if (log.isInfoEnabled()) { -// log.info("Open [" + service.getLabel() + "] and update it."); -// } -// -// try { -// service.doOpen(); -// } finally { -// service.doClose(false); -// } -// } -// -// @Override -// protected String getPgLabel() { -// return t("observe.storage.label.db.to.update"); -// } -// -// @Override -// protected void applySecurity(PGInstall task) throws SQLException { -// if (log.isInfoEnabled()) { -// log.info("Apply security..."); -// } -// task.applySecurity(); -// } -// }; - return null; + return new RemoteUILauncher(this, context, frame, t(getLabel())) { + + protected ObserveSwingDataSource dataSource; + protected Version targetVersion; + protected Set<ObserveDbUserDto> users; + + @Override + protected void initTask(StorageUIModel model) throws Exception { + + ObserveDataSourceConfigurationTopiaPG pgConfig = model.getPgConfig(); + + // pas autorise a migrer automatiquement + pgConfig.setCanMigrate(false); + + dataSource = new ObserveSwingDataSource(pgConfig); + + targetVersion = model.getConfig().getModelVersion(); + + users = model.getSecurityModel().getUsers(); + + } + + @Override + protected void execute() throws Exception { + + try { + + dataSource.open(); + + Version dataSourceVersion = dataSource.getVersion(); + + if (dataSourceVersion.before(targetVersion)) { + + if (log.isInfoEnabled()) { + log.info("Migrate data source " + dataSource.getLabel() + " in " + dataSourceVersion + " to " + targetVersion); + } + + // todo + + } + + } finally { + if (dataSource.isOpen()) { + dataSource.close(); + } + } + } + + @Override + protected String getPgLabel() { + return t("observe.storage.label.db.to.update"); + } + + @Override + protected void applySecurity() throws Exception { + if (log.isInfoEnabled()) { + log.info("Apply security..."); + } + dataSource.applySecurity(users); + } + }; } }, /** @@ -230,53 +284,53 @@ public enum ObstunaAdminAction { Versions.valueOf("1.4")) { @Override public RemoteUILauncher newLauncher(JAXXContext context, Window frame) { - //FIXME -// return new RemoteUILauncher(this, context, frame, t(getLabel())) { -// -// @Override -// protected String getPgLabel() { -// return t("observe.storage.label.db.to.update.security"); -// } -// -// @Override -// protected void applySecurity(PGInstall task) throws SQLException { -// if (log.isInfoEnabled()) { -// log.info("Apply security..."); -// } -// task.applySecurity(); -// } -// }; - return null; - } - }, - /** - * pour supprimer une base obstuna. - * <p/> - */ - DROP(n("observe.obstuna.action.drop"), - n("observe.obstuna.action.drop.description"), - null) { - @Override - public RemoteUILauncher newLauncher(JAXXContext context, Window frame) { - //FIXME -// return new RemoteUILauncher(this, context, frame, t(getLabel())) { -// -// @Override -// protected String getPgLabel() { -// return t("observe.storage.label.db.to.drop"); -// } -// -// @Override -// protected void execute(PGInstall task) throws Exception { -// if (log.isInfoEnabled()) { -// log.info("Drop db..."); -// } -// task.dropDb(); -// } -// }; - return null; + return new RemoteUILauncher(this, context, frame, t(getLabel())) { + + protected ObserveSwingDataSource dataSource; + protected Set<ObserveDbUserDto> users; + + @Override + protected void initTask(StorageUIModel model) throws Exception { + + if (DbMode.USE_REMOTE.equals(model.getDbMode())) { + ObserveDataSourceConfigurationTopiaPG pgConfig = model.getPgConfig(); + + // pas autorise a migrer automatiquement + pgConfig.setCanMigrate(false); + + dataSource = new ObserveSwingDataSource(pgConfig); + } else { + ObserveDataSourceConfigurationRest restConfig = model.getRestConfig(); + + dataSource = new ObserveSwingDataSource(restConfig); + } + + users = model.getSecurityModel().getUsers(); + + } + + @Override + protected String getPgLabel() { + return t("observe.storage.label.db.to.update.security"); + } + + @Override + protected void applySecurity() throws Exception { + if (log.isInfoEnabled()) { + log.info("Apply security..."); + } + try { + dataSource.open(); + dataSource.applySecurity(users); + } finally { + if (dataSource.isOpen()) { + dataSource.close(); + } + } + } + }; } - },; + }; /** Logger */ static private Log log = LogFactory.getLog(ObstunaAdminAction.class); diff --git a/observe-application-swing/src/main/java/fr/ird/observe/ui/storage/RemoteUILauncher.java b/observe-application-swing/src/main/java/fr/ird/observe/ui/storage/RemoteUILauncher.java index a3aedde..efd349d 100644 --- a/observe-application-swing/src/main/java/fr/ird/observe/ui/storage/RemoteUILauncher.java +++ b/observe-application-swing/src/main/java/fr/ird/observe/ui/storage/RemoteUILauncher.java @@ -22,7 +22,7 @@ package fr.ird.observe.ui.storage; import fr.ird.observe.db.constantes.DbMode; -import fr.ird.observe.business.util.SecurityModel; +import fr.ird.observe.ui.storage.tabs.SecurityModel; import jaxx.runtime.JAXXContext; import jaxx.runtime.swing.ErrorDialogUI; import org.apache.commons.logging.Log; @@ -65,14 +65,9 @@ public abstract class RemoteUILauncher extends StorageUILauncher { model.setCanUseServerService(true); model.setDbMode(DbMode.USE_REMOTE); model.setAdminAction(action); -// model.setPgInstall(new PGInstall() { -// @Override -// public void execute() throws Exception { -// RemoteUILauncher.this.execute(this); -// } -// }); List<StorageStep> steps = new ArrayList<StorageStep>(); + steps.add(StorageStep.CHOOSE_DB_MODE); steps.add(StorageStep.CONFIG); if (action == ObstunaAdminAction.CREATE) { @@ -103,11 +98,9 @@ public abstract class RemoteUILauncher extends StorageUILauncher { log.info("Will use security model " + securityModel); } -// PGInstall install = model.getPgInstall(); - try { -//FIXME -// initTask(model, install); + + initTask(model); } catch (Exception e) { if (log.isErrorEnabled()) { log.error("Could not init task.", e); @@ -117,8 +110,7 @@ public abstract class RemoteUILauncher extends StorageUILauncher { } try { - //FIXME -// execute(install); + execute(); } catch (Exception e) { if (log.isErrorEnabled()) { @@ -129,8 +121,7 @@ public abstract class RemoteUILauncher extends StorageUILauncher { } try { - //FIXME -// applySecurity(install); + applySecurity(); } catch (Exception e) { if (log.isErrorEnabled()) { log.error("Could not apply security to db.", e); @@ -147,20 +138,15 @@ public abstract class RemoteUILauncher extends StorageUILauncher { // } protected abstract String getPgLabel(); -//FIXME -// protected void initTask(StorageUIModel model, -// PGInstall task) throws Exception { -// -// task.init(model.toPostgresStorageConfig(getPgLabel()), model.getSecurityModel(), false); -// } -//FIXME -// protected void execute(PGInstall task) throws Exception { -// } -////FIXME -// protected void applySecurity(PGInstall task) throws Exception { -// } -////FIXME -// protected DataService getDataService() { -// return ObserveContext.get().getDataService(); -// } + + protected void initTask(StorageUIModel model) throws Exception { + // FIXME + // task.init(model.toPostgresStorageConfig(getPgLabel()), model.getSecurityModel(), false); + } + + protected void execute() throws Exception { + } + + protected void applySecurity() throws Exception { + } } 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 03530f4..c1463a1 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 @@ -31,7 +31,6 @@ import fr.ird.observe.ObserveSwingApplicationContext; import fr.ird.observe.ObserveTextGenerator; import fr.ird.observe.business.db.DataSource; import fr.ird.observe.business.db.DataSourceException; -import fr.ird.observe.business.util.SecurityModel; import fr.ird.observe.configuration.ObserveSwingApplicationConfig; import fr.ird.observe.db.ObserveSwingDataSource; import fr.ird.observe.db.constantes.ConnexionStatus; @@ -40,17 +39,20 @@ import fr.ird.observe.db.constantes.DbMode; import fr.ird.observe.db.event.ObserveSwingDataSourceEvent; import fr.ird.observe.db.event.ObserveSwingDataSourceListenerAdapter; import fr.ird.observe.services.configuration.ObserveDataSourceConfiguration; +import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationRest; import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationTopiaH2; import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationTopiaPG; import fr.ird.observe.services.dto.DataSourceCreateConfigurationDto; import fr.ird.observe.services.dto.IdDto; import fr.ird.observe.services.dto.IdDtos; +import fr.ird.observe.services.dto.ObserveDbUserDto; import fr.ird.observe.services.service.DataSourceDumpProducerService; import fr.ird.observe.ui.DecoratorService; import fr.ird.observe.ui.ObserveMainUI; import fr.ird.observe.ui.UIHelper; import fr.ird.observe.ui.storage.tabs.DataSelectionModel; import fr.ird.observe.ui.storage.tabs.RolesTableModel; +import fr.ird.observe.ui.storage.tabs.SecurityModel; import fr.ird.observe.ui.storage.tabs.SelectDataUI; import fr.ird.observe.ui.storage.tabs.StorageTabUI; import jaxx.runtime.JAXXContext; @@ -870,6 +872,36 @@ public class StorageUIHandler { addCloseTag("ul", sb); } + protected void computeCanMigrateAction(StorageUIModel model, StringBuilder sb) { + addTag("h3", sb, t("observe.storage.report.action.migrate") + " :"); + addOpenTag("ul", sb); + if (model.isCanMigrate()) { + Version version = model.getModelVersion(); + addTag("li", sb, t("observe.storage.report.can.migrate", version)); + if (model.isShowMigrationProgression()) { + addTag("li", sb, t("observe.storage.showMigrationProgression")); + } + if (model.isShowMigrationSql()) { + addTag("li", sb, t("observe.storage.showMigrationSql")); + } + } else { + addTag("li", sb, t("observe.storage.report.can.not.migrate")); + } + addCloseTag("ul", sb); + } + + protected void computeSecurityreport(StorageUIModel model, StringBuilder sb) { + + addTag("h3", sb, t("observe.storage.report.selected.security")); + addOpenTag("ul", sb); + SecurityModel security = model.getSecurityModel(); + addTag("li", sb, t("observe.storage.report.security.owner", security.getAdministrateur())); + addTag("li", sb, t("observe.storage.report.security.techniciens", security.getTechnicien())); + addTag("li", sb, t("observe.storage.report.security.readers", security.getUtilisateur())); + addTag("li", sb, t("observe.storage.report.security.referentiels", security.getReferentiel())); + addCloseTag("ul", sb); + } + public static void addTag(String tag, StringBuilder sb, String message) { sb.append('<').append(tag).append('>'); sb.append(message); @@ -966,31 +998,43 @@ public class StorageUIHandler { protected void updateSecurity(StorageUIModel model, RolesTableModel roleModel) { SecurityModel security = model.getSecurityModel(); - //FIXME -// PGInstall pgInstall = model.getPgInstall(); -// PGDataSourceConfig config = model.getPgConfig(); -// pgInstall.init(config, security); -// security.setAdministrateur(config.getLogin()); -// try { -// Set<String> roles = pgInstall.getRoles(); -// -// String ownerRole = security.getAdministrateur(); -// if (!roles.contains(ownerRole)) { -// if (log.isWarnEnabled()) { -// log.warn("Could not find owner role : " + ownerRole); -// } -// } else { -// roles.remove(ownerRole); -// } -// if (log.isInfoEnabled()) { -// log.info("Db roles : " + roles); -// } -// security.init(roles); -// roleModel.init(security); -// -// } catch (SQLException e) { -// throw new RuntimeException("Could not obtain db roles", e); -// } + + ObserveSwingDataSource dataSource = null; + + switch (model.getDbMode()) { + case USE_REMOTE: + ObserveDataSourceConfigurationTopiaPG pgConfig = model.getPgConfig(); + + dataSource = new ObserveSwingDataSource(pgConfig); + break; + case USE_SERVER: + ObserveDataSourceConfigurationRest restConfig = model.getRestConfig(); + dataSource = new ObserveSwingDataSource(restConfig); + + } + + if (dataSource != null) { + try { + + dataSource.open(); + + Set<ObserveDbUserDto> users = dataSource.getUsers(); + + if (log.isInfoEnabled()) { + log.info("Db roles : " + users); + } + + security.init(users); + roleModel.init(security); + + } catch (Exception e) { + throw new RuntimeException("Could not obtain db roles", e); + } finally { + if (dataSource.isOpen()) { + dataSource.close(); + } + } + } } diff --git a/observe-application-swing/src/main/java/fr/ird/observe/ui/storage/StorageUIModel.java b/observe-application-swing/src/main/java/fr/ird/observe/ui/storage/StorageUIModel.java index b4fe772..ec2e4d6 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 @@ -22,7 +22,6 @@ package fr.ird.observe.ui.storage; import fr.ird.observe.ObserveSwingApplicationContext; -import fr.ird.observe.business.util.SecurityModel; import fr.ird.observe.configuration.ObserveSwingApplicationConfig; import fr.ird.observe.db.ObserveSwingDataSource; import fr.ird.observe.db.constantes.ConnexionStatus; @@ -35,11 +34,13 @@ import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationTopia import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationTopiaPG; import fr.ird.observe.services.configuration.ObserveDataSourceConnection; import fr.ird.observe.services.dto.DataSourceCreateConfigurationDto; +import fr.ird.observe.services.dto.ObserveDbUserDto; import fr.ird.observe.services.service.DataSourceDumpProducerService; import fr.ird.observe.services.service.DatabaseConnexionNotAuthorizedException; import fr.ird.observe.services.service.DatabaseNotFoundException; import fr.ird.observe.services.service.PingService; import fr.ird.observe.ui.storage.tabs.DataSelectionModel; +import fr.ird.observe.ui.storage.tabs.SecurityModel; import jaxx.runtime.JAXXContext; import jaxx.runtime.context.JAXXContextEntryDef; import jaxx.runtime.swing.wizard.WizardModel; @@ -279,6 +280,7 @@ public class StorageUIModel extends WizardModel<StorageStep> { @Override public void propertyChange(PropertyChangeEvent evt) { setConnexionStatus(ConnexionStatus.UNTESTED); + connection = null; } }; @@ -808,11 +810,7 @@ public class StorageUIModel extends WizardModel<StorageStep> { return; } List<StorageStep> universe = new ArrayList<StorageStep>(); - if (adminAction == null) { - - // when doing an admin mode we do not choose db mode, we always work on remote - universe.add(StorageStep.CHOOSE_DB_MODE); - } + universe.add(StorageStep.CHOOSE_DB_MODE); boolean canBackup = localStorageExist; switch (dbMode) { @@ -869,9 +867,7 @@ public class StorageUIModel extends WizardModel<StorageStep> { universe.add(StorageStep.SELECT_DATA); } } - if (adminAction != ObstunaAdminAction.DROP) { - universe.add(StorageStep.ROLES); - } + universe.add(StorageStep.ROLES); } universe.add(StorageStep.CONFIRM); if (excludeSteps != null) { @@ -1017,7 +1013,7 @@ public class StorageUIModel extends WizardModel<StorageStep> { break; case ROLES: - Set<String> role = getSecurityModel().getRole(); + Set<ObserveDbUserDto> role = getSecurityModel().getUsers(); int assigned = getSecurityModel().getAssigned(); @@ -1683,6 +1679,8 @@ public class StorageUIModel extends WizardModel<StorageStep> { dataSource.open(); + connection = dataSource.getConnection(); + Version versionDataSource = dataSource.getVersion(); if (getModelVersion().equals(versionDataSource)) { diff --git a/observe-application-swing/src/main/java/fr/ird/observe/ui/storage/tabs/RolesTableModel.java b/observe-application-swing/src/main/java/fr/ird/observe/ui/storage/tabs/RolesTableModel.java index 9272a74..ed6c9d3 100644 --- a/observe-application-swing/src/main/java/fr/ird/observe/ui/storage/tabs/RolesTableModel.java +++ b/observe-application-swing/src/main/java/fr/ird/observe/ui/storage/tabs/RolesTableModel.java @@ -21,11 +21,13 @@ */ package fr.ird.observe.ui.storage.tabs; -import fr.ird.observe.business.util.SecurityModel; + +import com.google.common.collect.Lists; +import fr.ird.observe.services.dto.ObserveDbUserDto; +import fr.ird.observe.services.dto.ObserveDbUserDtos; +import fr.ird.observe.services.dto.constants.ObserveDbRole; import javax.swing.table.AbstractTableModel; -import java.util.ArrayList; -import java.util.Collections; import java.util.List; import static org.nuiton.i18n.I18n.n; @@ -67,7 +69,7 @@ public class RolesTableModel extends AbstractTableModel { protected SecurityModel model; - protected String[] roles; + protected List<ObserveDbUserDto> roles; public RolesTableModel() { } @@ -88,9 +90,8 @@ public class RolesTableModel extends AbstractTableModel { public void init(SecurityModel model) { this.model = model; - List<String> roles = new ArrayList<String>(model.getRole()); - Collections.sort(roles); - this.roles = roles.toArray(new String[roles.size()]); + this.roles = Lists.newArrayList(model.getUsersWithoutAdministrator()); + this.roles.sort(ObserveDbUserDtos.getUserDtoComparator()); fireTableDataChanged(); } @@ -102,7 +103,7 @@ public class RolesTableModel extends AbstractTableModel { @Override public int getRowCount() { - return roles == null ? 0 : roles.length; + return roles == null ? 0 : roles.size(); } @Override @@ -114,19 +115,24 @@ public class RolesTableModel extends AbstractTableModel { public Object getValueAt(int rowIndex, int columnIndex) { Object value = null; - String p = getRole(rowIndex); - if (p != null) { + ObserveDbUserDto user = getUser(rowIndex); + if (user != null) { switch (columnIndex) { case 0: - value = p; + value = user.getName(); break; case 1: + value = ObserveDbRole.UNUSED.equals(user.getRole()); + break; case 2: + value = ObserveDbRole.REFERENTIAL.equals(user.getRole()); + break; case 3: + value = ObserveDbRole.USER.equals(user.getRole()); + break; case 4: - SecurityModel.Role r = SecurityModel.Role.values()[columnIndex - 1]; - value = model.isRole(r, p); + value = ObserveDbRole.TECHNICAL.equals(user.getRole()); break; default: throw new IllegalStateException( @@ -147,21 +153,37 @@ public class RolesTableModel extends AbstractTableModel { } Boolean value = (Boolean) aValue; - String role = getRole(rowIndex); - SecurityModel.Role r = SecurityModel.Role.values()[columnIndex - 1]; + ObserveDbUserDto userDto = getUser(rowIndex); + + ObserveDbRole role; if (!value) { - r = null; + role = null; + } else { + switch (columnIndex) { + case 2: + role = ObserveDbRole.REFERENTIAL; + break; + case 3: + role = ObserveDbRole.USER; + break; + case 4: + role = ObserveDbRole.TECHNICAL; + break; + default: + role = ObserveDbRole.UNUSED; + } } - model.setRole(role, r, true); + + model.setRole(userDto, role, true); // toute la ligne (sauf le role change) fireTableRowsUpdated(rowIndex, rowIndex); } - protected String getRole(int rowIndex) { - String role = roles == null ? null : roles[rowIndex]; - return role; + protected ObserveDbUserDto getUser(int rowIndex) { + ObserveDbUserDto user = roles == null ? null : roles.get(rowIndex); + return user; } } diff --git a/observe-application-swing/src/main/java/fr/ird/observe/ui/storage/tabs/RolesUI.css b/observe-application-swing/src/main/java/fr/ird/observe/ui/storage/tabs/RolesUI.css index b03b72c..f16ae5d 100644 --- a/observe-application-swing/src/main/java/fr/ird/observe/ui/storage/tabs/RolesUI.css +++ b/observe-application-swing/src/main/java/fr/ird/observe/ui/storage/tabs/RolesUI.css @@ -30,7 +30,7 @@ } #administrateur { - text:{securityModel.getAdministrateur()}; + text:{securityModel.getAdministrateur().getName()}; } #roles { diff --git a/observe-application-swing/src/main/java/fr/ird/observe/ui/storage/tabs/RolesUI.jaxx b/observe-application-swing/src/main/java/fr/ird/observe/ui/storage/tabs/RolesUI.jaxx index 50c1ee3..1df8560 100644 --- a/observe-application-swing/src/main/java/fr/ird/observe/ui/storage/tabs/RolesUI.jaxx +++ b/observe-application-swing/src/main/java/fr/ird/observe/ui/storage/tabs/RolesUI.jaxx @@ -27,7 +27,7 @@ <StorageTabUI> <import> - fr.ird.observe.business.util.SecurityModel + fr.ird.observe.ui.storage.tabs.SecurityModel fr.ird.observe.ui.storage.StorageStep fr.ird.observe.ui.storage.StorageUIModel </import> diff --git a/observe-application-swing/src/main/java/fr/ird/observe/ui/storage/tabs/SecurityModel.java b/observe-application-swing/src/main/java/fr/ird/observe/ui/storage/tabs/SecurityModel.java new file mode 100644 index 0000000..2b4aa4d --- /dev/null +++ b/observe-application-swing/src/main/java/fr/ird/observe/ui/storage/tabs/SecurityModel.java @@ -0,0 +1,149 @@ +/* + * #%L + * ObServe :: Business + * %% + * Copyright (C) 2008 - 2010 IRD, Codelutin, Tony Chemit + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/gpl-3.0.html>. + * #L% + */ +package fr.ird.observe.ui.storage.tabs; + +import com.google.common.base.Function; +import com.google.common.base.Predicates; +import com.google.common.collect.Iterables; +import com.google.common.collect.Sets; +import fr.ird.observe.services.dto.ObserveDbUserDto; +import fr.ird.observe.services.dto.ObserveDbUserDtos; +import fr.ird.observe.services.dto.constants.ObserveDbRole; + +import java.beans.PropertyChangeListener; +import java.beans.PropertyChangeSupport; +import java.io.Serializable; +import java.util.Collection; +import java.util.Set; + +/** + * Le modèle la sécurité à appliquer sur une base postgres + * + * @author Tony Chemit - chemit@codelutin.com + * @since 1.4 + */ +public class SecurityModel implements Serializable { + + public static final String PROPERTY_ADMINISTRATEUR = "administrateur"; + + public static final String PROPERTY_ROLE = "role"; + + public static final String PROPERTY_ASSIGNED = "assigned"; + + private static final long serialVersionUID = 1L; + + public static final Function<String, String> ESCAPE_STRING = new Function<String, String>() { + @Override + public String apply(String input) { + return "\"" + input + "\""; + } + }; + + protected ObserveDbUserDto administrateur; + + protected Set<ObserveDbUserDto> users; + + protected PropertyChangeSupport pcs = new PropertyChangeSupport(this); + + public SecurityModel() { + users = Sets.newHashSet(); + } + + public ObserveDbUserDto getAdministrateur() { + return administrateur; + } + + public Set<ObserveDbUserDto> getUsersByRole(ObserveDbRole role) { + Set<ObserveDbUserDto> roles = Sets.newHashSet(Iterables.filter(users, ObserveDbUserDtos.newRolePredicate(role))); + return roles; + } + + public Set<ObserveDbUserDto> getUsers() { + return Sets.newHashSet(users); + } + + public Set<ObserveDbUserDto> getUsersWithoutAdministrator() { + return Sets.newHashSet(Iterables.filter(users, Predicates.not(ObserveDbUserDtos.newRolePredicate(ObserveDbRole.ADMINISTRATOR)))); + } + + public boolean isRole(ObserveDbRole r, ObserveDbUserDto user) { + return r.equals(user.getRole()); + } + + public void init(Collection<ObserveDbUserDto> users) { + this.users.clear(); + this.users.addAll(users); + + this.administrateur = Iterables.find(users, ObserveDbUserDtos.newRolePredicate(ObserveDbRole.ADMINISTRATOR)); + firePropertyChange(PROPERTY_ROLE, null, getUsers()); + firePropertyChange(PROPERTY_ADMINISTRATEUR, null, getAdministrateur()); + firePropertyChange(PROPERTY_ASSIGNED, null, getAssigned()); + } + + public void setRole(ObserveDbUserDto user, ObserveDbRole role, boolean fire) { + user.setRole(role); + if (fire) { + if (role != null) { + firePropertyChange(role.name(), null, getUsersByRole(role)); + } + firePropertyChange(PROPERTY_ASSIGNED, null, getAssigned()); + } + } + + public void setRole(Iterable<ObserveDbUserDto> users, ObserveDbRole role) { + for (ObserveDbUserDto user : users) { + setRole(user, role, false); + } + firePropertyChange(role.name(), null, getUsersByRole(role)); + firePropertyChange(PROPERTY_ASSIGNED, null, getAssigned()); + } + + public int getAssigned() { + int countNotAssigned = Iterables.size(Iterables.filter(users, ObserveDbUserDtos.newRolePredicate(null))); + int count = users.size() - countNotAssigned; + return count; + } + + public void addPropertyChangeListener(PropertyChangeListener listener) { + pcs.addPropertyChangeListener(listener); + } + + public void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) { + pcs.addPropertyChangeListener(propertyName, listener); + } + + public void removePropertyChangeListener(PropertyChangeListener listener) { + pcs.removePropertyChangeListener(listener); + } + + public void removePropertyChangeListener(String propertyName, PropertyChangeListener listener) { + pcs.removePropertyChangeListener(propertyName, listener); + } + + protected void firePropertyChange(String propertyName, Object oldValue, Object newValue) { + pcs.firePropertyChange(propertyName, oldValue, newValue); + } + + protected void firePropertyChange(String propertyName, Object newValue) { + firePropertyChange(propertyName, null, newValue); + } +} -- 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 develop in repository observe. See http://git.codelutin.com/observe.git commit 600a69cdb2419cf151c743a91177d65c88b88004 Author: Sylvain Bavencoff <bavencoff@codelutin.com> Date: Wed Sep 30 16:07:44 2015 +0200 miragtion des base de données (refs #7549) --- .../fr/ird/observe/db/ObserveSwingDataSource.java | 17 +++++- .../ird/observe/ui/storage/ObstunaAdminAction.java | 69 ++++++++++++++++------ .../fr/ird/observe/ui/storage/StorageUIModel.java | 40 ++++++------- .../observe-application-swing_en_GB.properties | 4 ++ .../observe-application-swing_es_ES.properties | 4 ++ .../observe-application-swing_fr_FR.properties | 4 ++ .../controller/v1/DataSourceServiceController.java | 12 +++- .../migration/AbstractDataSourceMigration.java | 57 +++++++----------- .../i18n/observe-entities_en_GB.properties | 4 -- .../i18n/observe-entities_es_ES.properties | 4 -- .../i18n/observe-entities_fr_FR.properties | 4 -- .../services/service/DataSourceService.java | 10 +++- .../ObserveDataSourceInformation.java | 62 +++++++++++++++++++ .../services/service/DataSourceServiceTopia.java | 65 ++++++++++++++++---- 14 files changed, 251 insertions(+), 105 deletions(-) diff --git a/observe-application-swing/src/main/java/fr/ird/observe/db/ObserveSwingDataSource.java b/observe-application-swing/src/main/java/fr/ird/observe/db/ObserveSwingDataSource.java index b49a5b4..40bffc7 100644 --- a/observe-application-swing/src/main/java/fr/ird/observe/db/ObserveSwingDataSource.java +++ b/observe-application-swing/src/main/java/fr/ird/observe/db/ObserveSwingDataSource.java @@ -14,6 +14,7 @@ import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationRest; import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationTopiaH2; import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationTopiaPG; import fr.ird.observe.services.configuration.ObserveDataSourceConnection; +import fr.ird.observe.services.configuration.ObserveDataSourceInformation; import fr.ird.observe.services.dto.DataSourceCreateConfigurationDto; import fr.ird.observe.services.dto.DataSourceCreateWithNoReferentialImportException; import fr.ird.observe.services.dto.IncompatibleDataSourceCreateConfigurationException; @@ -189,6 +190,16 @@ public class ObserveSwingDataSource extends AbstractSerializableBean { dataSourceService.applySecurity(users); } + public void migrateData() { + + Preconditions.checkState(isOpen(), "Connection is not open"); + + DataSourceService dataSourceService = newService(DataSourceService.class); + + dataSourceService.migrateData(); + + } + public boolean isOpen() { return connection != null; } @@ -228,13 +239,15 @@ public class ObserveSwingDataSource extends AbstractSerializableBean { } - public void checkCanConnect() throws DatabaseConnexionNotAuthorizedException, DatabaseNotFoundException { + public ObserveDataSourceInformation checkCanConnect() throws DatabaseConnexionNotAuthorizedException, DatabaseNotFoundException { Preconditions.checkState(connection == null, "Connection is alredy open"); DataSourceService dataSourceService = newService(DataSourceService.class); - dataSourceService.checkCanConnect(configuration); + ObserveDataSourceInformation dataSourceInformation = dataSourceService.checkCanConnect(configuration); + + return dataSourceInformation; } diff --git a/observe-application-swing/src/main/java/fr/ird/observe/ui/storage/ObstunaAdminAction.java b/observe-application-swing/src/main/java/fr/ird/observe/ui/storage/ObstunaAdminAction.java index 4f68ed6..6783328 100644 --- a/observe-application-swing/src/main/java/fr/ird/observe/ui/storage/ObstunaAdminAction.java +++ b/observe-application-swing/src/main/java/fr/ird/observe/ui/storage/ObstunaAdminAction.java @@ -29,6 +29,7 @@ import fr.ird.observe.db.constantes.DbMode; import fr.ird.observe.services.configuration.ObserveDataSourceConfiguration; import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationRest; import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationTopiaPG; +import fr.ird.observe.services.configuration.ObserveDataSourceInformation; import fr.ird.observe.services.dto.DataSourceCreateConfigurationDto; import fr.ird.observe.services.dto.IdDtos; import fr.ird.observe.services.dto.ObserveDbUserDto; @@ -41,6 +42,7 @@ import org.apache.commons.logging.LogFactory; import org.nuiton.util.version.Version; import org.nuiton.util.version.Versions; +import javax.swing.JOptionPane; import java.awt.Window; import java.util.Set; @@ -214,47 +216,73 @@ public enum ObstunaAdminAction { return new RemoteUILauncher(this, context, frame, t(getLabel())) { protected ObserveSwingDataSource dataSource; + protected ObserveDataSourceInformation dataSourceInformation; protected Version targetVersion; protected Set<ObserveDbUserDto> users; @Override protected void initTask(StorageUIModel model) throws Exception { - ObserveDataSourceConfigurationTopiaPG pgConfig = model.getPgConfig(); + if (DbMode.USE_REMOTE.equals(model.getDbMode())) { + ObserveDataSourceConfigurationTopiaPG pgConfig = model.getPgConfig(); + + dataSource = new ObserveSwingDataSource(pgConfig); - // pas autorise a migrer automatiquement - pgConfig.setCanMigrate(false); + } else { - dataSource = new ObserveSwingDataSource(pgConfig); + ObserveDataSourceConfigurationRest restConfig = model.getRestConfig(); + + dataSource = new ObserveSwingDataSource(restConfig); + } targetVersion = model.getConfig().getModelVersion(); users = model.getSecurityModel().getUsers(); + dataSourceInformation = model.getDataSourceInformation(); + } @Override protected void execute() throws Exception { - try { + Version dbVersion = dataSourceInformation.getVersion(); + if (! dataSourceInformation.getMigrations().isEmpty()) { - dataSource.open(); + if (dbVersion.before(dataSourceInformation.getMinnimumVersion())) { - Version dataSourceVersion = dataSource.getVersion(); + JOptionPane.showMessageDialog( + null, + t("observe.storage.migrate.not.possible.before.version.3.0.message", targetVersion, dbVersion), + t("observe.storage.migrate.not.possible.before.version.3.0.title", targetVersion), + JOptionPane.WARNING_MESSAGE); - if (dataSourceVersion.before(targetVersion)) { + } else { - if (log.isInfoEnabled()) { - log.info("Migrate data source " + dataSource.getLabel() + " in " + dataSourceVersion + " to " + targetVersion); - } + int answer = JOptionPane.showConfirmDialog( + null, + t("observe.storage.migrate.askUser.message", dbVersion, targetVersion, dataSourceInformation.getMigrations()), + t("observe.storage.migrate.askUser.title", targetVersion), + JOptionPane.YES_NO_OPTION, + JOptionPane.WARNING_MESSAGE); - // todo + if (answer == JOptionPane.YES_OPTION) { - } + try { - } finally { - if (dataSource.isOpen()) { - dataSource.close(); + dataSource.open(); + + if (log.isInfoEnabled()) { + log.info("Migrate data source " + dataSource.getLabel() + " in " + dbVersion + " to " + targetVersion); + } + + dataSource.migrateData(); + } finally { + if (dataSource.isOpen()) { + dataSource.close(); + } + } + } } } } @@ -269,7 +297,14 @@ public enum ObstunaAdminAction { if (log.isInfoEnabled()) { log.info("Apply security..."); } - dataSource.applySecurity(users); + try { + dataSource.open(); + dataSource.applySecurity(users); + } finally { + if (dataSource.isOpen()) { + dataSource.close(); + } + } } }; } diff --git a/observe-application-swing/src/main/java/fr/ird/observe/ui/storage/StorageUIModel.java b/observe-application-swing/src/main/java/fr/ird/observe/ui/storage/StorageUIModel.java index ec2e4d6..723c720 100644 --- a/observe-application-swing/src/main/java/fr/ird/observe/ui/storage/StorageUIModel.java +++ b/observe-application-swing/src/main/java/fr/ird/observe/ui/storage/StorageUIModel.java @@ -32,7 +32,7 @@ import fr.ird.observe.services.configuration.ObserveDataSourceConfiguration; import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationRest; import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationTopiaH2; import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationTopiaPG; -import fr.ird.observe.services.configuration.ObserveDataSourceConnection; +import fr.ird.observe.services.configuration.ObserveDataSourceInformation; import fr.ird.observe.services.dto.DataSourceCreateConfigurationDto; import fr.ird.observe.services.dto.ObserveDbUserDto; import fr.ird.observe.services.service.DataSourceDumpProducerService; @@ -196,7 +196,7 @@ public class StorageUIModel extends WizardModel<StorageStep> { protected String serverUrl; /** Les information de connextion a la base**/ - protected ObserveDataSourceConnection connection; + protected ObserveDataSourceInformation dataSourceInformation; /** le fichier d'import des donné */ protected File dumpFile; @@ -280,7 +280,7 @@ public class StorageUIModel extends WizardModel<StorageStep> { @Override public void propertyChange(PropertyChangeEvent evt) { setConnexionStatus(ConnexionStatus.UNTESTED); - connection = null; + dataSourceInformation = null; } }; @@ -916,10 +916,11 @@ public class StorageUIModel extends WizardModel<StorageStep> { if (getAdminAction() != null) { // il faut des droits rw sur la base distante - validate = connection.canReadReferential() && - connection.canWriteReferential() && - connection.canWriteData() && - connection.canReadData(); + validate = dataSourceInformation != null && + dataSourceInformation.canReadReferential() && + dataSourceInformation.canWriteReferential() && + dataSourceInformation.canWriteData() && + dataSourceInformation.canReadData(); } } } @@ -955,7 +956,7 @@ public class StorageUIModel extends WizardModel<StorageStep> { } if (validate) { - validate = centralSourceModel.getConnection().canReadReferential(); + validate = centralSourceModel.getDataSourceInformation().canReadReferential(); } break; } @@ -993,7 +994,7 @@ public class StorageUIModel extends WizardModel<StorageStep> { if (validate) { - validate = centralSourceModel.getConnection().canReadData(); + validate = centralSourceModel.getDataSourceInformation().canReadData(); } @@ -1083,13 +1084,11 @@ public class StorageUIModel extends WizardModel<StorageStep> { switch (dbMode) { case USE_LOCAL: case CREATE_LOCAL: - result = h2Config.isCanMigrate(); + result = true; break; case USE_REMOTE: - result = pgConfig.isCanMigrate(); - break; case USE_SERVER: - result = false; + result = ObstunaAdminAction.UPDATE.equals(adminAction); break; } } @@ -1675,15 +1674,12 @@ public class StorageUIModel extends WizardModel<StorageStep> { } - dataSource.checkCanConnect(); - - dataSource.open(); - - connection = dataSource.getConnection(); + dataSourceInformation = dataSource.checkCanConnect(); - Version versionDataSource = dataSource.getVersion(); + Version versionDataSource = dataSourceInformation.getVersion(); - if (getModelVersion().equals(versionDataSource)) { + // en mise a jour de la base on ne test pas la version + if (getModelVersion().equals(versionDataSource) || isCanMigrate()) { setConnexionStatus(ConnexionStatus.SUCCESS); @@ -1887,7 +1883,7 @@ public class StorageUIModel extends WizardModel<StorageStep> { } - public ObserveDataSourceConnection getConnection() { - return connection; + public ObserveDataSourceInformation getDataSourceInformation() { + return dataSourceInformation; } } diff --git a/observe-application-swing/src/main/resources/i18n/observe-application-swing_en_GB.properties b/observe-application-swing/src/main/resources/i18n/observe-application-swing_en_GB.properties index 04ff1c7..f7f395d 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 @@ -1833,6 +1833,10 @@ observe.storage.message.destroying= observe.storage.message.opened= observe.storage.message.opening= observe.storage.message.provider.detected= +observe.storage.migrate.askUser.message=Database use version %1$s,\n\nYou need to migrate to version %2$s.\nWould you like to execute migration ?\n\nNote\: Following migrations will be applied\: %3$s. +observe.storage.migrate.askUser.title=Database update to version %1$s is required +observe.storage.migrate.not.possible.before.version.3.0.message=<html><body>The application version requires a database in minimum version <strong>3.0</strong>. You database is actually in version %s<br/>Do first a migration using ObServe 3.0 or 3.1, you will then be able to migrate your database using this version of ObServe</body></html> +observe.storage.migrate.not.possible.before.version.3.0.title=Can not migrate to databse in version %s observe.storage.no.creationMode= observe.storage.no.creationMode.required= observe.storage.no.dbMode= diff --git a/observe-application-swing/src/main/resources/i18n/observe-application-swing_es_ES.properties b/observe-application-swing/src/main/resources/i18n/observe-application-swing_es_ES.properties index 424014b..415352f 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 @@ -1835,6 +1835,10 @@ observe.storage.message.destroying= observe.storage.message.opened= observe.storage.message.opening= observe.storage.message.provider.detected= +observe.storage.migrate.askUser.message=La base de datos tiene la versión %1$s,\n\n Es necesario una migración a la versión %2$s.\n¿Quiere migrar la base de datos ?\n\nNota \: Se aplicarán las siguientes actualizaciones \: %3$s. +observe.storage.migrate.askUser.title=Se requiera la actualización de la base de datos a la versión %1$s. +observe.storage.migrate.not.possible.before.version.3.0.message=<html><body>La version %s d'ObServe nécessite une base de version au moins <strong>3.0</strong>. Votre base est en version %s<br/>Veuillez dans un premier temps utiliser ObServe 3.0 ou 3.1 pour effectuer la migration puis réouvrir la base avec cette nouvelle version d'ObServe</body></html> +observe.storage.migrate.not.possible.before.version.3.0.title=Migration de base impossible en version %s observe.storage.no.creationMode=No se ha seleccionado ningún modo de creación observe.storage.no.creationMode.required=No requerido. observe.storage.no.dbMode=Ningún tipo de origen de datos seleccionado diff --git a/observe-application-swing/src/main/resources/i18n/observe-application-swing_fr_FR.properties b/observe-application-swing/src/main/resources/i18n/observe-application-swing_fr_FR.properties index eb26822..d342090 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 @@ -1833,6 +1833,10 @@ observe.storage.message.destroying=Suppression de la source de données [%1$s] observe.storage.message.opened=Le service de persistence [%1$s] est ouvert observe.storage.message.opening=Ouverture de la connexion [%1$s] observe.storage.message.provider.detected= +observe.storage.migrate.askUser.message=La base de données est en version %1$s,\n\nUne migration en version %2$s est nécéssaire.\nVoulez vous migrer la base de données ?\n\nNote \: Les mises à jour suivantes seront appliquées \: %3$s. +observe.storage.migrate.askUser.title=Mise à jour de la base en version %1$s requise +observe.storage.migrate.not.possible.before.version.3.0.message=<html><body>La version %s d'ObServe nécessite une base de version au moins <strong>3.0</strong>. Votre base est en version %s<br/>Veuillez dans un premier temps utiliser ObServe 3.0 ou 3.1 pour effectuer la migration puis réouvrir la base avec cette nouvelle version d'ObServe</body></html> +observe.storage.migrate.not.possible.before.version.3.0.title=Migration de base impossible en version %s observe.storage.no.creationMode=Aucun mode de création sélectionné observe.storage.no.creationMode.required=Non requis. observe.storage.no.dbMode=Aucun type de source de données sélectionné diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/DataSourceServiceController.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/DataSourceServiceController.java index 6225f59..e1cef71 100644 --- a/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/DataSourceServiceController.java +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/DataSourceServiceController.java @@ -31,6 +31,7 @@ import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationAndCo import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationRest; import fr.ird.observe.services.configuration.ObserveDataSourceConnection; import fr.ird.observe.services.configuration.ObserveDataSourceConnectionRest; +import fr.ird.observe.services.configuration.ObserveDataSourceInformation; import fr.ird.observe.services.dto.DataSourceCreateConfigurationDto; import fr.ird.observe.services.dto.DataSourceCreateWithNoReferentialImportException; import fr.ird.observe.services.dto.IncompatibleDataSourceCreateConfigurationException; @@ -58,11 +59,13 @@ public class DataSourceServiceController extends ObserveServiceControllerSupport } @Override - public void checkCanConnect(ObserveDataSourceConfiguration dataSourceConfiguration) throws DatabaseConnexionNotAuthorizedException, DatabaseNotFoundException { + public ObserveDataSourceInformation checkCanConnect(ObserveDataSourceConfiguration dataSourceConfiguration) throws DatabaseConnexionNotAuthorizedException, DatabaseNotFoundException { ObserveDataSourceConfiguration dataSourceConfigurationTopia = getTopiaDataSourceConfiguration(dataSourceConfiguration); - getAnonymousService(dataSourceConfigurationTopia).checkCanConnect(dataSourceConfigurationTopia); + ObserveDataSourceInformation information = getAnonymousService(dataSourceConfigurationTopia).checkCanConnect(dataSourceConfigurationTopia); + + return information; } @Override @@ -121,6 +124,11 @@ public class DataSourceServiceController extends ObserveServiceControllerSupport } + @Override + public void migrateData() { + getAuthenticatedService().migrateData(); + } + protected ObserveDataSourceConfiguration getTopiaDataSourceConfiguration(ObserveDataSourceConfiguration dataSourceConfigurationFromRequest) { Preconditions.checkArgument(dataSourceConfigurationFromRequest instanceof ObserveDataSourceConfigurationRest); diff --git a/observe-entities/src/main/java/fr/ird/observe/entities/migration/AbstractDataSourceMigration.java b/observe-entities/src/main/java/fr/ird/observe/entities/migration/AbstractDataSourceMigration.java index d89d5fe..56934e9 100644 --- a/observe-entities/src/main/java/fr/ird/observe/entities/migration/AbstractDataSourceMigration.java +++ b/observe-entities/src/main/java/fr/ird/observe/entities/migration/AbstractDataSourceMigration.java @@ -21,19 +21,16 @@ */ package fr.ird.observe.entities.migration; +import com.google.common.collect.ImmutableList; import fr.ird.observe.ObserveTopiaApplicationContext; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.topia.migration.TopiaMigrationCallbackByClass; import org.nuiton.util.version.Version; -import org.nuiton.util.version.VersionBuilder; import org.nuiton.util.version.Versions; -import javax.swing.JOptionPane; import java.util.List; -import static org.nuiton.i18n.I18n.t; - /** * AbstractDataSourceMigration * @@ -94,6 +91,23 @@ public abstract class AbstractDataSourceMigration extends TopiaMigrationCallback V_4_0_RC3, V_4_0_RC4, V_4_0_RC6, V_4_0_RC7, V_4_0, V_4_0_1, V_4_0_2, V_5_0 }; + + public static ImmutableList<Version> getVersionsAfter(Version current) { + + ImmutableList.Builder<Version> builder = ImmutableList.builder(); + + for (Version version : availableVersions) { + + if (version.after(current)) { + + builder.add(version); + + } + } + + return builder.build(); + } + protected ObserveTopiaApplicationContext topiaApplicationContext; protected AbstractDataSourceMigration(MigrationCallBackForVersionResolver callBackResolver) { @@ -110,39 +124,8 @@ public abstract class AbstractDataSourceMigration extends TopiaMigrationCallback @Override public boolean askUser(Version dbVersion, List<Version> versions) { - - Version applicationVersion = VersionBuilder.create(topiaApplicationContext.getModelVersion()).build(); - - if (dbVersion.before(V_3_0)) { - - JOptionPane.showMessageDialog( - null, - t("observe.storage.migrate.not.possible.before.version.3.0.message", applicationVersion, dbVersion), - t("observe.storage.migrate.not.possible.before.version.3.0.title", applicationVersion), - JOptionPane.WARNING_MESSAGE); - - return false; - - } - - boolean autoMigrate = topiaApplicationContext.isAutoMigrate(); - - if (autoMigrate) { - - if (log.isInfoEnabled()) { - log.info("auto migrate mode"); - } - return true; - } - - int answer = JOptionPane.showConfirmDialog( - null, - t("observe.storage.migrate.askUser.message", dbVersion, applicationVersion, versions), - t("observe.storage.migrate.askUser.title", applicationVersion), - JOptionPane.YES_NO_OPTION, - JOptionPane.WARNING_MESSAGE); - - return answer == JOptionPane.YES_OPTION; + // on autorise les migrations dès quelles sont demandée pour une version égale ou superieur à la V3.0. + return dbVersion.afterOrEquals(V_3_0); } public void setTopiaApplicationContext(ObserveTopiaApplicationContext topiaApplicationContext) { diff --git a/observe-entities/src/main/resources/i18n/observe-entities_en_GB.properties b/observe-entities/src/main/resources/i18n/observe-entities_en_GB.properties index fd9fc16..42275ef 100644 --- a/observe-entities/src/main/resources/i18n/observe-entities_en_GB.properties +++ b/observe-entities/src/main/resources/i18n/observe-entities_en_GB.properties @@ -35,7 +35,3 @@ observe.persistence.oldCode3L=Old code\: observe.persistence.schoolType.libre=Free school type observe.persistence.schoolType.objet=Object school type observe.persistence.schoolType.undefined=Undefined school type -observe.storage.migrate.askUser.message=Database use version %1$s,\n\nYou need to migrate to version %2$s.\nWould you like to execute migration ?\n\nNote\: Following migrations will be applied\: %3$s. -observe.storage.migrate.askUser.title=Database update to version %1$s is required -observe.storage.migrate.not.possible.before.version.3.0.message=<html><body>The application version requires a database in minimum version <strong>3.0</strong>. You database is actually in version %s<br/>Do first a migration using ObServe 3.0 or 3.1, you will then be able to migrate your database using this version of ObServe</body></html> -observe.storage.migrate.not.possible.before.version.3.0.title=Can not migrate to databse in version %s diff --git a/observe-entities/src/main/resources/i18n/observe-entities_es_ES.properties b/observe-entities/src/main/resources/i18n/observe-entities_es_ES.properties index 87540c4..c12ab41 100644 --- a/observe-entities/src/main/resources/i18n/observe-entities_es_ES.properties +++ b/observe-entities/src/main/resources/i18n/observe-entities_es_ES.properties @@ -35,7 +35,3 @@ observe.persistence.oldCode3L=Antiguo código\: observe.persistence.schoolType.libre=Banco libre observe.persistence.schoolType.objet=Banco a objeto observe.persistence.schoolType.undefined=Banco indeterminado -observe.storage.migrate.askUser.message=La base de datos tiene la versión %1$s,\n\n Es necesario una migración a la versión %2$s.\n¿Quiere migrar la base de datos ?\n\nNota \: Se aplicarán las siguientes actualizaciones \: %3$s. -observe.storage.migrate.askUser.title=Se requiera la actualización de la base de datos a la versión %1$s. -observe.storage.migrate.not.possible.before.version.3.0.message=<html><body>La version %s d'ObServe nécessite une base de version au moins <strong>3.0</strong>. Votre base est en version %s<br/>Veuillez dans un premier temps utiliser ObServe 3.0 ou 3.1 pour effectuer la migration puis réouvrir la base avec cette nouvelle version d'ObServe</body></html> -observe.storage.migrate.not.possible.before.version.3.0.title=Migration de base impossible en version %s diff --git a/observe-entities/src/main/resources/i18n/observe-entities_fr_FR.properties b/observe-entities/src/main/resources/i18n/observe-entities_fr_FR.properties index 5f5de26..0fa154d 100644 --- a/observe-entities/src/main/resources/i18n/observe-entities_fr_FR.properties +++ b/observe-entities/src/main/resources/i18n/observe-entities_fr_FR.properties @@ -35,7 +35,3 @@ observe.persistence.oldCode3L=ancien code \: observe.persistence.schoolType.libre=Banc libre observe.persistence.schoolType.objet=Banc objet observe.persistence.schoolType.undefined=Banc indéterminé -observe.storage.migrate.askUser.message=La base de données est en version %1$s,\n\nUne migration en version %2$s est nécéssaire.\nVoulez vous migrer la base de données ?\n\nNote \: Les mises à jour suivantes seront appliquées \: %3$s. -observe.storage.migrate.askUser.title=Mise à jour de la base en version %1$s requise -observe.storage.migrate.not.possible.before.version.3.0.message=<html><body>La version %s d'ObServe nécessite une base de version au moins <strong>3.0</strong>. Votre base est en version %s<br/>Veuillez dans un premier temps utiliser ObServe 3.0 ou 3.1 pour effectuer la migration puis réouvrir la base avec cette nouvelle version d'ObServe</body></html> -observe.storage.migrate.not.possible.before.version.3.0.title=Migration de base impossible en version %s diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/DataSourceService.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/DataSourceService.java index bd380d0..bca26c5 100644 --- a/observe-services-api/src/main/java/fr/ird/observe/services/service/DataSourceService.java +++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/DataSourceService.java @@ -25,6 +25,7 @@ package fr.ird.observe.services.service; import fr.ird.observe.services.ObserveService; import fr.ird.observe.services.configuration.ObserveDataSourceConfiguration; import fr.ird.observe.services.configuration.ObserveDataSourceConnection; +import fr.ird.observe.services.configuration.ObserveDataSourceInformation; import fr.ird.observe.services.dto.DataSourceCreateConfigurationDto; import fr.ird.observe.services.dto.DataSourceCreateWithNoReferentialImportException; import fr.ird.observe.services.dto.IncompatibleDataSourceCreateConfigurationException; @@ -46,7 +47,7 @@ import java.util.Set; public interface DataSourceService extends ObserveService { @NoDataAccess - void checkCanConnect(ObserveDataSourceConfiguration dataSourceConfiguration) throws DatabaseNotFoundException, DatabaseConnexionNotAuthorizedException; + ObserveDataSourceInformation checkCanConnect(ObserveDataSourceConfiguration dataSourceConfiguration) throws DatabaseNotFoundException, DatabaseConnexionNotAuthorizedException; @NoDataAccess ObserveDataSourceConnection create(ObserveDataSourceConfiguration dataSourceConfiguration, DataSourceCreateConfigurationDto dataSourceCreateConfiguration) throws IncompatibleDataSourceCreateConfigurationException, DataSourceCreateWithNoReferentialImportException; @@ -70,4 +71,11 @@ public interface DataSourceService extends ObserveService { @WriteDataPermission @Write void applySecurity(Set<ObserveDbUserDto> users); + + @ReadReferentialPermission + @WriteReferentialPermission + @ReadDataPermission + @WriteDataPermission + @Write + void migrateData(); } diff --git a/observe-services-configuration-api/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceInformation.java b/observe-services-configuration-api/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceInformation.java new file mode 100644 index 0000000..91b7651 --- /dev/null +++ b/observe-services-configuration-api/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceInformation.java @@ -0,0 +1,62 @@ +package fr.ird.observe.services.configuration; + +import com.google.common.collect.ImmutableList; +import org.nuiton.util.version.Version; + +/** + * @author Sylvain Bavencoff - bavencoff@codelutin.com + */ +public class ObserveDataSourceInformation { + + protected final boolean readReferential; + + protected final boolean writeReferential; + + protected final boolean readData; + + protected final boolean writeData; + + protected final Version minnimumVersion; + + protected final Version version; + + protected final ImmutableList<Version> migrations; + + public ObserveDataSourceInformation(boolean readReferential, boolean writeReferential, boolean readData, boolean writeData, Version minnimumVersion, Version version, ImmutableList<Version> migrations) { + this.readReferential = readReferential; + this.writeReferential = writeReferential; + this.readData = readData; + this.writeData = writeData; + this.minnimumVersion = minnimumVersion; + this.version = version; + this.migrations = migrations; + } + + public boolean canReadReferential() { + return readReferential; + } + + public boolean canWriteReferential() { + return writeReferential; + } + + public boolean canReadData() { + return readData; + } + + public boolean canWriteData() { + return writeData; + } + + public Version getMinnimumVersion() { + return minnimumVersion; + } + + public Version getVersion() { + return version; + } + + public ImmutableList<Version> getMigrations() { + return migrations; + } +} diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/service/DataSourceServiceTopia.java b/observe-services-topia/src/main/java/fr/ird/observe/services/service/DataSourceServiceTopia.java index a531565..b238073 100644 --- a/observe-services-topia/src/main/java/fr/ird/observe/services/service/DataSourceServiceTopia.java +++ b/observe-services-topia/src/main/java/fr/ird/observe/services/service/DataSourceServiceTopia.java @@ -29,6 +29,7 @@ import com.google.common.collect.Sets; import fr.ird.observe.ObserveTopiaApplicationContext; import fr.ird.observe.ObserveTopiaConfiguration; import fr.ird.observe.ObserveTopiaConfigurationFactory; +import fr.ird.observe.entities.migration.AbstractDataSourceMigration; import fr.ird.observe.services.ObserveJdbcHelper; import fr.ird.observe.services.ObserveSecurityHelper; import fr.ird.observe.services.ObserveServiceTopia; @@ -38,6 +39,7 @@ import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationTopia import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationTopiaPG; import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationTopiaSupport; import fr.ird.observe.services.configuration.ObserveDataSourceConnectionTopia; +import fr.ird.observe.services.configuration.ObserveDataSourceInformation; import fr.ird.observe.services.dto.DataSourceCreateConfigurationDto; import fr.ird.observe.services.dto.DataSourceCreateWithNoReferentialImportException; import fr.ird.observe.services.dto.IncompatibleDataSourceCreateConfigurationException; @@ -64,11 +66,13 @@ public class DataSourceServiceTopia extends ObserveServiceTopia implements DataS private static final Log log = LogFactory.getLog(DataSourceServiceTopia.class); @Override - public void checkCanConnect(ObserveDataSourceConfiguration dataSourceConfiguration) throws DatabaseNotFoundException, DatabaseConnexionNotAuthorizedException { + public ObserveDataSourceInformation checkCanConnect(ObserveDataSourceConfiguration dataSourceConfiguration) throws DatabaseNotFoundException, DatabaseConnexionNotAuthorizedException { Preconditions.checkState(dataSourceConfiguration instanceof ObserveDataSourceConfigurationTopiaSupport); ObserveDataSourceConfigurationTopiaSupport dataSourceConfigurationTopiaSupport = (ObserveDataSourceConfigurationTopiaSupport) dataSourceConfiguration; + ObserveDataSourceInformation dataSourceInformation; + if (dataSourceConfigurationTopiaSupport.isH2Database()) { ObserveDataSourceConfigurationTopiaH2 h2DataSourceConfiguration = (ObserveDataSourceConfigurationTopiaH2) dataSourceConfigurationTopiaSupport; @@ -112,6 +116,8 @@ public class DataSourceServiceTopia extends ObserveServiceTopia implements DataS } + dataSourceInformation = getDataSourceInformation(h2DataSourceConfiguration, topiaConfiguration); + } else { @@ -135,8 +141,12 @@ public class DataSourceServiceTopia extends ObserveServiceTopia implements DataS } + dataSourceInformation = getDataSourceInformation(pgDataSourceConfiguration, topiaConfiguration); + } + return dataSourceInformation; + } @Override @@ -241,17 +251,19 @@ public class DataSourceServiceTopia extends ObserveServiceTopia implements DataS } - return createDataSourceConnection((ObserveDataSourceConfigurationTopiaSupport) dataSourceConfiguration, topiaApplicationContext.getConfiguration(), topiaApplicationContext.getAuthenticationToken()); + ObserveDataSourceInformation dataSourceInformation = getDataSourceInformation((ObserveDataSourceConfigurationTopiaSupport) dataSourceConfiguration, topiaApplicationContext.getConfiguration()); + + return createDataSourceConnection(dataSourceInformation, topiaApplicationContext.getAuthenticationToken()); } @Override public ObserveDataSourceConnectionTopia open(ObserveDataSourceConfiguration dataSourceConfiguration) throws DatabaseNotFoundException, DatabaseConnexionNotAuthorizedException { - checkCanConnect(dataSourceConfiguration); + ObserveDataSourceInformation dataSourceInformation = checkCanConnect(dataSourceConfiguration); ObserveTopiaApplicationContext topiaApplicationContext = ObserveTopiaApplicationContextFactory.getOrCreateTopiaApplicationContext((ObserveDataSourceConfigurationTopiaSupport) dataSourceConfiguration); - return createDataSourceConnection((ObserveDataSourceConfigurationTopiaSupport) dataSourceConfiguration, topiaApplicationContext.getConfiguration(), topiaApplicationContext.getAuthenticationToken()); + return createDataSourceConnection(dataSourceInformation, topiaApplicationContext.getAuthenticationToken()); } @@ -323,6 +335,20 @@ public class DataSourceServiceTopia extends ObserveServiceTopia implements DataS } + @Override + public void migrateData() { + + ObserveDataSourceConfigurationTopiaSupport dataSourceConfiguration = serviceContext.getDataSourceConfiguration(); + + Optional<ObserveTopiaApplicationContext> optionalTopiaApplicationContext = ObserveTopiaApplicationContextFactory.getTopiaApplicationContextIfPresent(dataSourceConfiguration); + + if (optionalTopiaApplicationContext.isPresent()) { + + optionalTopiaApplicationContext.get().getMigrationService().runSchemaMigration(); + } + + } + protected void executeGzipSqlStatements(ObserveTopiaApplicationContext topiaApplicationContext, String temporaryFilePrefix, byte... content) { File temporaryDirectory = serviceContext.createTemporaryDirectory(temporaryFilePrefix); @@ -335,7 +361,20 @@ public class DataSourceServiceTopia extends ObserveServiceTopia implements DataS } - protected ObserveDataSourceConnectionTopia createDataSourceConnection(ObserveDataSourceConfigurationTopiaSupport dataSourceConfiguration, ObserveTopiaConfiguration topiaConfiguration, String authenticationToken) { + protected ObserveDataSourceConnectionTopia createDataSourceConnection(ObserveDataSourceInformation dataSourceInformation, String authenticationToken) { + + ObserveDataSourceConnectionTopia dataSourceConnection = new ObserveDataSourceConnectionTopia( + authenticationToken, + dataSourceInformation.canReadReferential(), + dataSourceInformation.canWriteReferential(), + dataSourceInformation.canReadData(), + dataSourceInformation.canWriteData(), + dataSourceInformation.getVersion()); + + return dataSourceConnection; + } + + protected ObserveDataSourceInformation getDataSourceInformation(ObserveDataSourceConfigurationTopiaSupport dataSourceConfiguration, ObserveTopiaConfiguration topiaConfiguration) { boolean readReferential; boolean writeReferential; @@ -395,21 +434,23 @@ public class DataSourceServiceTopia extends ObserveServiceTopia implements DataS if (log.isDebugEnabled()) { log.debug("User can read refererential : " + readReferential + ", " + - "write referential : " + writeReferential + ", " + - "read data : " + readData + ", " + - "write data : " + writeData + "."); + "write referential : " + writeReferential + ", " + + "read data : " + readData + ", " + + "write data : " + writeData + "."); } - ObserveDataSourceConnectionTopia dataSourceConnection = new ObserveDataSourceConnectionTopia( - authenticationToken, + ObserveDataSourceInformation information = new ObserveDataSourceInformation( readReferential, writeReferential, readData, writeData, - version); - return dataSourceConnection; + AbstractDataSourceMigration.V_3_0, + version, + AbstractDataSourceMigration.getVersionsAfter(version)); + return information; } + protected static boolean canWrite(Set<?> privileges) { boolean result = privileges != null && privileges.contains("DELETE") && -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@list.forge.codelutin.com>.
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 e3240813a121b70372f42468b30aff5ddfc0e987 Author: Sylvain Bavencoff <bavencoff@codelutin.com> Date: Wed Sep 30 17:53:37 2015 +0200 migrer une base sans l'ouvrir, verification de la version de la base local au chargement et migration si nécessaire (refs #7549) --- .../observe/ObserveSwingApplicationContext.java | 22 +++++++----- .../fr/ird/observe/db/ObserveSwingDataSource.java | 39 +++++++++++++++++--- .../ird/observe/ui/storage/ObstunaAdminAction.java | 41 +--------------------- .../ird/observe/ui/storage/StorageUIHandler.java | 10 ++++++ .../services/service/DataSourceService.java | 6 +--- .../services/service/DataSourceServiceTopia.java | 7 ++-- 6 files changed, 63 insertions(+), 62 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 614cec2..babe227 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 @@ -36,6 +36,7 @@ import fr.ird.observe.services.ObserveDataSourceConfigurationMainFactory; import fr.ird.observe.services.ObserveService; import fr.ird.observe.services.ObserveServiceMainFactory; import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationTopiaH2; +import fr.ird.observe.services.configuration.ObserveDataSourceInformation; import fr.ird.observe.services.dto.ReferenceDto; import fr.ird.observe.services.dto.ReferenceSetDto; import fr.ird.observe.services.dto.constants.ReferentialLocale; @@ -560,16 +561,21 @@ public class ObserveSwingApplicationContext extends DefaultApplicationContext { // création de la source de données sur la base locale ObserveSwingDataSource dataSource = ObserveServiceHelper.newLocalStorageService(getConfig()); - // la source sera utilisée dans les ui - prepareMainStorage(dataSource); - setDataSource(dataSource); + try { - if (log.isInfoEnabled()) { - log.info(t("observe.init.local.db.detected", dataSource.getLabel())); - } + ObserveDataSourceInformation dataSourceInformation = dataSource.checkCanConnect(); - // la base locale existe, on l'ouvre - try { + dataSource.migrateData(dataSourceInformation, getConfig().getModelVersion()); + + // la source sera utilisée dans les ui + prepareMainStorage(dataSource); + setDataSource(dataSource); + + if (log.isInfoEnabled()) { + log.info(t("observe.init.local.db.detected", dataSource.getLabel())); + } + + // la base locale existe, on l'ouvre dataSource.open(); success = true; } catch (DatabaseConnexionNotAuthorizedException | DatabaseNotFoundException e) { 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 40bffc7..9b3451b 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 @@ -28,6 +28,7 @@ import org.apache.commons.logging.LogFactory; import org.jdesktop.beans.AbstractSerializableBean; import org.nuiton.util.version.Version; +import javax.swing.JOptionPane; import javax.swing.event.EventListenerList; import java.io.File; import java.util.Locale; @@ -190,13 +191,43 @@ public class ObserveSwingDataSource extends AbstractSerializableBean { dataSourceService.applySecurity(users); } - public void migrateData() { + public void migrateData(ObserveDataSourceInformation dataSourceInformation, Version targetVersion) throws DatabaseConnexionNotAuthorizedException, DatabaseNotFoundException { - Preconditions.checkState(isOpen(), "Connection is not open"); + Preconditions.checkState(!isOpen(), "Connection is open"); - DataSourceService dataSourceService = newService(DataSourceService.class); + Version dbVersion = dataSourceInformation.getVersion(); + if (! dataSourceInformation.getMigrations().isEmpty()) { + + if (dbVersion.before(dataSourceInformation.getMinnimumVersion())) { + + JOptionPane.showMessageDialog( + null, + t("observe.storage.migrate.not.possible.before.version.3.0.message", targetVersion, dbVersion), + t("observe.storage.migrate.not.possible.before.version.3.0.title", targetVersion), + JOptionPane.WARNING_MESSAGE); + + } else { + + int answer = JOptionPane.showConfirmDialog( + null, + t("observe.storage.migrate.askUser.message", dbVersion, targetVersion, dataSourceInformation.getMigrations()), + t("observe.storage.migrate.askUser.title", targetVersion), + JOptionPane.YES_NO_OPTION, + JOptionPane.WARNING_MESSAGE); - dataSourceService.migrateData(); + if (answer == JOptionPane.YES_OPTION) { + + DataSourceService dataSourceService = newService(DataSourceService.class); + + + if (log.isInfoEnabled()) { + log.info("Migrate data source " + getLabel() + " in " + dbVersion + " to " + targetVersion); + } + + dataSourceService.migrateData(); + } + } + } } 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 6783328..59fb938 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 @@ -42,7 +42,6 @@ import org.apache.commons.logging.LogFactory; import org.nuiton.util.version.Version; import org.nuiton.util.version.Versions; -import javax.swing.JOptionPane; import java.awt.Window; import java.util.Set; @@ -246,45 +245,7 @@ public enum ObstunaAdminAction { @Override protected void execute() throws Exception { - Version dbVersion = dataSourceInformation.getVersion(); - if (! dataSourceInformation.getMigrations().isEmpty()) { - - if (dbVersion.before(dataSourceInformation.getMinnimumVersion())) { - - JOptionPane.showMessageDialog( - null, - t("observe.storage.migrate.not.possible.before.version.3.0.message", targetVersion, dbVersion), - t("observe.storage.migrate.not.possible.before.version.3.0.title", targetVersion), - JOptionPane.WARNING_MESSAGE); - - } else { - - int answer = JOptionPane.showConfirmDialog( - null, - t("observe.storage.migrate.askUser.message", dbVersion, targetVersion, dataSourceInformation.getMigrations()), - t("observe.storage.migrate.askUser.title", targetVersion), - JOptionPane.YES_NO_OPTION, - JOptionPane.WARNING_MESSAGE); - - if (answer == JOptionPane.YES_OPTION) { - - try { - - dataSource.open(); - - if (log.isInfoEnabled()) { - log.info("Migrate data source " + dataSource.getLabel() + " in " + dbVersion + " to " + targetVersion); - } - - dataSource.migrateData(); - } finally { - if (dataSource.isOpen()) { - dataSource.close(); - } - } - } - } - } + dataSource.migrateData(dataSourceInformation, targetVersion); } @Override 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 c1463a1..4a07366 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 @@ -42,6 +42,7 @@ import fr.ird.observe.services.configuration.ObserveDataSourceConfiguration; import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationRest; import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationTopiaH2; import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationTopiaPG; +import fr.ird.observe.services.configuration.ObserveDataSourceInformation; import fr.ird.observe.services.dto.DataSourceCreateConfigurationDto; import fr.ird.observe.services.dto.IdDto; import fr.ird.observe.services.dto.IdDtos; @@ -490,6 +491,15 @@ public class StorageUIHandler { currentDataSource = newDataSourceFromModel(model); + // 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(); + + currentDataSource.migrateData(dataSourceInformation, config.getModelVersion()); + + } + observeContext.setDataSource(currentDataSource); observeContext.prepareMainStorage(currentDataSource); 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 bca26c5..8753db9 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 @@ -72,10 +72,6 @@ public interface DataSourceService extends ObserveService { @Write void applySecurity(Set<ObserveDbUserDto> users); - @ReadReferentialPermission - @WriteReferentialPermission - @ReadDataPermission - @WriteDataPermission - @Write + @NoDataAccess void migrateData(); } 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 b238073..7308a30 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 @@ -340,12 +340,9 @@ public class DataSourceServiceTopia extends ObserveServiceTopia implements DataS ObserveDataSourceConfigurationTopiaSupport dataSourceConfiguration = serviceContext.getDataSourceConfiguration(); - Optional<ObserveTopiaApplicationContext> optionalTopiaApplicationContext = ObserveTopiaApplicationContextFactory.getTopiaApplicationContextIfPresent(dataSourceConfiguration); - - if (optionalTopiaApplicationContext.isPresent()) { + ObserveTopiaApplicationContext topiaApplicationContext = ObserveTopiaApplicationContextFactory.createTopiaApplicationContext(dataSourceConfiguration, false); - optionalTopiaApplicationContext.get().getMigrationService().runSchemaMigration(); - } + topiaApplicationContext.getMigrationService().runSchemaMigration(); } -- 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 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>.
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 6910618ff8f85c397bda93c616688cda3a9058b6 Author: Sylvain Bavencoff <bavencoff@codelutin.com> Date: Fri Oct 2 15:16:33 2015 +0200 adapter le rapport de connexion au base a la gestion de la sécurité (suite au rebase) (refs #7549) --- .../ird/observe/ui/storage/StorageUIHandler.java | 12 ----------- .../ird/observe/ui/storage/tabs/SecurityModel.java | 25 ++++++++++++++++++++++ .../ftl/dataSourceConnectionReport_fr.ftl | 20 ++++++++--------- 3 files changed, 35 insertions(+), 22 deletions(-) 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 1068a85..1ce6ffc 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 @@ -900,18 +900,6 @@ public class StorageUIHandler { addCloseTag("ul", sb); } - protected void computeSecurityreport(StorageUIModel model, StringBuilder sb) { - - addTag("h3", sb, t("observe.storage.report.selected.security")); - addOpenTag("ul", sb); - SecurityModel security = model.getSecurityModel(); - addTag("li", sb, t("observe.storage.report.security.owner", security.getAdministrateur())); - addTag("li", sb, t("observe.storage.report.security.techniciens", security.getTechnicien())); - addTag("li", sb, t("observe.storage.report.security.readers", security.getUtilisateur())); - addTag("li", sb, t("observe.storage.report.security.referentiels", security.getReferentiel())); - addCloseTag("ul", sb); - } - public static void addTag(String tag, StringBuilder sb, String message) { sb.append('<').append(tag).append('>'); sb.append(message); diff --git a/observe-application-swing/src/main/java/fr/ird/observe/ui/storage/tabs/SecurityModel.java b/observe-application-swing/src/main/java/fr/ird/observe/ui/storage/tabs/SecurityModel.java index 2b4aa4d..96b3fa0 100644 --- a/observe-application-swing/src/main/java/fr/ird/observe/ui/storage/tabs/SecurityModel.java +++ b/observe-application-swing/src/main/java/fr/ird/observe/ui/storage/tabs/SecurityModel.java @@ -24,6 +24,7 @@ package fr.ird.observe.ui.storage.tabs; import com.google.common.base.Function; import com.google.common.base.Predicates; import com.google.common.collect.Iterables; +import com.google.common.collect.Lists; import com.google.common.collect.Sets; import fr.ird.observe.services.dto.ObserveDbUserDto; import fr.ird.observe.services.dto.ObserveDbUserDtos; @@ -33,6 +34,7 @@ import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; import java.io.Serializable; import java.util.Collection; +import java.util.List; import java.util.Set; /** @@ -77,6 +79,29 @@ public class SecurityModel implements Serializable { return roles; } + public List<String> getUserNamesByRole(ObserveDbRole role) { + List<String> names = Lists.newLinkedList(Iterables.transform( + Iterables.filter(users, ObserveDbUserDtos.newRolePredicate(role)), + ObserveDbUserDtos.getNameFunction())); + return names; + } + + public List<String> getDataUserNames() { + return getUserNamesByRole(ObserveDbRole.USER); + } + + public List<String> getReferentialUserNames() { + return getUserNamesByRole(ObserveDbRole.REFERENTIAL); + } + + public List<String> getTechnicalUserNames() { + return getUserNamesByRole(ObserveDbRole.TECHNICAL); + } + + public List<String> getUnusedUserNames() { + return getUserNamesByRole(ObserveDbRole.UNUSED); + } + public Set<ObserveDbUserDto> getUsers() { return Sets.newHashSet(users); } diff --git a/observe-application-swing/src/main/resources/ftl/dataSourceConnectionReport_fr.ftl b/observe-application-swing/src/main/resources/ftl/dataSourceConnectionReport_fr.ftl index 3d578a4..5209f90 100644 --- a/observe-application-swing/src/main/resources/ftl/dataSourceConnectionReport_fr.ftl +++ b/observe-application-swing/src/main/resources/ftl/dataSourceConnectionReport_fr.ftl @@ -194,12 +194,12 @@ </#if> <h3>Sécurité</h3> - <ul> - <li><strong>Propriétaire : : </strong>${securityModel.administrateu}</li> - <li><strong>Techniciens : : </strong>${securityModel.technicien}</li> - <li><strong>Lecteurs : : </strong>${securityModel.utilisateur}</li> - <li><strong>Référentiels : : </strong>${securityModel.referentiel}</li> - </ul> + <ul> + <li><strong>Propriétaire : </strong>${securityModel.administrateur.name}</li> + <li><strong>Techniciens : </strong>${securityModel.technicalUserNames?join(", ")}</li> + <li><strong>Lecteurs : </strong>${securityModel.dataUserNames?join(", ")}</li> + <li><strong>Référentiels : </strong>${securityModel.referentialUserNames?join(", ")}</li> + </ul> </#if> @@ -306,10 +306,10 @@ <h3>Sécurité</h3> <ul> - <li><strong>Propriétaire : : </strong>${securityModel.administrateu}</li> - <li><strong>Techniciens : : </strong>${securityModel.technicien}</li> - <li><strong>Lecteurs : : </strong>${securityModel.utilisateur}</li> - <li><strong>Référentiels : : </strong>${securityModel.referentiel}</li> + <li><strong>Propriétaire : </strong>${securityModel.administrateur.name}</li> + <li><strong>Techniciens : </strong>${securityModel.technicalUserNames?join(", ")}</li> + <li><strong>Lecteurs : </strong>${securityModel.dataUserNames?join(", ")}</li> + <li><strong>Référentiels : </strong>${securityModel.referentialUserNames?join(", ")}</li> </ul> </#if> -- 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 develop in repository observe. See http://git.codelutin.com/observe.git commit 5d38d122e12394d59e6afcaf9c9ad091a446bb1b Author: Tony CHEMIT <chemit@codelutin.com> Date: Fri Oct 2 16:48:03 2015 +0200 rendre serializable la connexion a une source de donnees --- .../observe/services/configuration/ObserveDataSourceConnection.java | 4 +++- .../services/configuration/ObserveDataSourceConnectionSupport.java | 2 ++ .../services/configuration/ObserveDataSourceConnectionRest.java | 2 ++ .../services/configuration/ObserveDataSourceConnectionTopia.java | 2 ++ .../ird/observe/services/ObserveDataSourceConnectionTopiaTaiste.java | 2 ++ 5 files changed, 11 insertions(+), 1 deletion(-) diff --git a/observe-services-configuration-api/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConnection.java b/observe-services-configuration-api/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConnection.java index c151292..a9db404 100644 --- a/observe-services-configuration-api/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConnection.java +++ b/observe-services-configuration-api/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConnection.java @@ -24,6 +24,8 @@ package fr.ird.observe.services.configuration; import org.nuiton.util.version.Version; +import java.io.Serializable; + /** * Représente une source de donnée une fois la connexion acceptée. * @@ -31,7 +33,7 @@ import org.nuiton.util.version.Version; * * @author Tony Chemit - chemit@codelutin.com */ -public interface ObserveDataSourceConnection { +public interface ObserveDataSourceConnection extends Serializable { /** * @return le jeton qui identifie cette connexion diff --git a/observe-services-configuration-api/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConnectionSupport.java b/observe-services-configuration-api/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConnectionSupport.java index a7b52fb..d63e56f 100644 --- a/observe-services-configuration-api/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConnectionSupport.java +++ b/observe-services-configuration-api/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConnectionSupport.java @@ -34,6 +34,8 @@ import java.util.Objects; */ public abstract class ObserveDataSourceConnectionSupport implements ObserveDataSourceConnection { + private static final long serialVersionUID = 1L; + protected final String authenticationToken; protected final boolean readReferential; diff --git a/observe-services-configuration-rest/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConnectionRest.java b/observe-services-configuration-rest/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConnectionRest.java index 1cca594..f91e7f4 100644 --- a/observe-services-configuration-rest/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConnectionRest.java +++ b/observe-services-configuration-rest/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConnectionRest.java @@ -33,6 +33,8 @@ import java.net.URL; */ public class ObserveDataSourceConnectionRest extends ObserveDataSourceConnectionSupport { + private static final long serialVersionUID = 1L; + protected final URL serverUrl; public ObserveDataSourceConnectionRest(URL serverUrl, diff --git a/observe-services-configuration-topia/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConnectionTopia.java b/observe-services-configuration-topia/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConnectionTopia.java index 26d13c0..204164b 100644 --- a/observe-services-configuration-topia/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConnectionTopia.java +++ b/observe-services-configuration-topia/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConnectionTopia.java @@ -31,6 +31,8 @@ import org.nuiton.util.version.Version; */ public class ObserveDataSourceConnectionTopia extends ObserveDataSourceConnectionSupport { + private static final long serialVersionUID = 1L; + public ObserveDataSourceConnectionTopia(String authenticationToken, boolean readReferential, boolean writeReferential, diff --git a/observe-services-topia/src/test/java/fr/ird/observe/services/ObserveDataSourceConnectionTopiaTaiste.java b/observe-services-topia/src/test/java/fr/ird/observe/services/ObserveDataSourceConnectionTopiaTaiste.java index 735aa5c..10368c3 100644 --- a/observe-services-topia/src/test/java/fr/ird/observe/services/ObserveDataSourceConnectionTopiaTaiste.java +++ b/observe-services-topia/src/test/java/fr/ird/observe/services/ObserveDataSourceConnectionTopiaTaiste.java @@ -8,6 +8,8 @@ import org.nuiton.util.version.Version; */ public class ObserveDataSourceConnectionTopiaTaiste extends ObserveDataSourceConnectionTopia { + private static final long serialVersionUID = 1L; + public ObserveDataSourceConnectionTopiaTaiste(String authenticationToken) { // on se donne tout les droit pour pouvoir tout tester super(authenticationToken, true, true, true, true, Version.VZERO); -- 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 develop in repository observe. See http://git.codelutin.com/observe.git commit 61939e6ecf4092efe258e27e7316f43c5eba59cb Author: Tony CHEMIT <chemit@codelutin.com> Date: Fri Oct 2 16:48:44 2015 +0200 fix typo --- .../src/main/java/fr/ird/observe/db/constantes/DbMode.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/observe-application-swing/src/main/java/fr/ird/observe/db/constantes/DbMode.java b/observe-application-swing/src/main/java/fr/ird/observe/db/constantes/DbMode.java index a7a2876..8755192 100644 --- a/observe-application-swing/src/main/java/fr/ird/observe/db/constantes/DbMode.java +++ b/observe-application-swing/src/main/java/fr/ird/observe/db/constantes/DbMode.java @@ -45,7 +45,7 @@ public enum DbMode { n("observe.storage.dbMode.useRemote"), n("observe.storage.dbMode.useRemote.description") ), - /** Pour utiliser une un serveur web distante */ + /** Pour utiliser une base via un serveur web distant */ USE_SERVER( n("observe.storage.dbMode.useServer"), n("observe.storage.dbMode.useServer.description") -- 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 develop in repository observe. See http://git.codelutin.com/observe.git commit 9ca1de5071aceb4ec8b4fe32326fe4771714ca4c Author: Tony CHEMIT <chemit@codelutin.com> Date: Fri Oct 2 16:59:19 2015 +0200 Renommage des méthodes qui font appels à nos listeners pour respecter la norme JavaBean --- .../observe/ObserveSwingApplicationContext.java | 10 ++--- .../fr/ird/observe/db/ObserveSwingDataSource.java | 44 +++++++++++----------- .../fr/ird/observe/ui/admin/AdminTabUIHandler.java | 8 ++-- .../ird/observe/ui/storage/StorageUIHandler.java | 2 +- 4 files changed, 32 insertions(+), 32 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 965b0ee..77fee7f 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 @@ -599,7 +599,7 @@ public class ObserveSwingApplicationContext extends DefaultApplicationContext { public void prepareMainStorage(ObserveSwingDataSource dataSource) { - dataSource.addDataSourceListener(new ObserveSwingDataSourceListenerAdapter() { + dataSource.addObserveSwingDataSourceListener(new ObserveSwingDataSourceListenerAdapter() { @Override public void onOpening(ObserveSwingDataSourceEvent event) { @@ -735,15 +735,15 @@ public class ObserveSwingApplicationContext extends DefaultApplicationContext { ReferenceSetDto<TripSeineStubDto> tripSeines = tripSeineService.getTripSeineByProgram(programDtoRef.getId()); for (ReferenceDto tripSeine : tripSeines.getReference()) { log.info(" - " + tripSeine.getPropertyValue(TripSeineStubDto.PROPERTY_VESSEL_LABEL) - + " " + tripSeine.getPropertyValue(TripSeineStubDto.PROPERTY_START_DATE) - + " - " + tripSeine.getPropertyValue(TripSeineStubDto.PROPERTY_END_DATE)); + + " " + tripSeine.getPropertyValue(TripSeineStubDto.PROPERTY_START_DATE) + + " - " + tripSeine.getPropertyValue(TripSeineStubDto.PROPERTY_END_DATE)); } } else if (ProgramDtos.isProgramLongline(programDtoRef)) { ReferenceSetDto<TripLonglineStubDto> tripLonglines = tripLonglineService.getTripLonglineStubByProgram(programDtoRef.getId()); for (ReferenceDto tripLongline : tripLonglines.getReference()) { log.info(" - " + tripLongline.getPropertyValue(TripLonglineStubDto.PROPERTY_VESSEL_LABEL) - + " " + tripLongline.getPropertyValue(TripLonglineStubDto.PROPERTY_START_DATE) - + " - " + tripLongline.getPropertyValue(TripLonglineStubDto.PROPERTY_END_DATE)); + + " " + tripLongline.getPropertyValue(TripLonglineStubDto.PROPERTY_START_DATE) + + " - " + tripLongline.getPropertyValue(TripLonglineStubDto.PROPERTY_END_DATE)); } } } 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 748fbb3..79b781c 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 @@ -42,6 +42,8 @@ import static org.nuiton.i18n.I18n.t; */ public class ObserveSwingDataSource extends AbstractSerializableBean { + private static final long serialVersionUID = 1L; + private static final Log log = LogFactory.getLog(ObserveSwingDataSource.class); /** le conteneur de listeners */ @@ -54,7 +56,6 @@ public class ObserveSwingDataSource extends AbstractSerializableBean { public ObserveSwingDataSource(ObserveDataSourceConfiguration configuration) { this.configuration = configuration; this.listenerList = new EventListenerList(); - this.connection = null; } public ObserveDataSourceConfiguration getConfiguration() { @@ -85,8 +86,7 @@ public class ObserveSwingDataSource extends AbstractSerializableBean { public Version getVersion() { Version result = null; if (connection != null) { - //FIXME -// result = connection.getVersion(); + result = connection.getVersion(); } return result; } @@ -108,7 +108,7 @@ public class ObserveSwingDataSource extends AbstractSerializableBean { public void open() throws DatabaseConnexionNotAuthorizedException, DatabaseNotFoundException, BabModelVersionException { - Preconditions.checkState(!isOpen(), "Connection is alredy open"); + Preconditions.checkState(!isOpen(), "Connection is already open"); fireNewMessage(t("observe.storage.message.opening", getLabel())); fireOpening(); @@ -122,16 +122,16 @@ public class ObserveSwingDataSource extends AbstractSerializableBean { fireOpened(); } - public void create(DataSourceCreateConfigurationDto creatDto) throws IncompatibleDataSourceCreateConfigurationException, DataSourceCreateWithNoReferentialImportException { + public void create(DataSourceCreateConfigurationDto createDto) throws IncompatibleDataSourceCreateConfigurationException, DataSourceCreateWithNoReferentialImportException { - Preconditions.checkState(!isOpen(), "Connection is alredy open"); + Preconditions.checkState(!isOpen(), "Connection is already open"); fireNewMessage(t("observe.storage.message.creating", getLabel())); fireOpening(); DataSourceService dataSourceService = newService(DataSourceService.class); - connection = dataSourceService.create(configuration, creatDto); + connection = dataSourceService.create(configuration, createDto); fireNewMessage(t("observe.storage.message.created", getLabel())); fireOpened(); @@ -197,7 +197,7 @@ public class ObserveSwingDataSource extends AbstractSerializableBean { Preconditions.checkState(!isOpen(), "Connection is open"); Version dbVersion = dataSourceInformation.getVersion(); - if (! dataSourceInformation.getMigrations().isEmpty()) { + if (!dataSourceInformation.getMigrations().isEmpty()) { if (dbVersion.before(dataSourceInformation.getMinnimumVersion())) { @@ -273,7 +273,7 @@ public class ObserveSwingDataSource extends AbstractSerializableBean { public ObserveDataSourceInformation checkCanConnect() throws DatabaseConnexionNotAuthorizedException, DatabaseNotFoundException { - Preconditions.checkState(connection == null, "Connection is alredy open"); + Preconditions.checkState(connection == null, "Connection is already open"); DataSourceService dataSourceService = newService(DataSourceService.class); @@ -296,12 +296,12 @@ public class ObserveSwingDataSource extends AbstractSerializableBean { } - public void addDataSourceListener(ObserveSwingDataSourceListener listener) { + public void addObserveSwingDataSourceListener(ObserveSwingDataSourceListener listener) { listenerList.add(ObserveSwingDataSourceListener.class, listener); } - public boolean containsDataSourceListener(ObserveSwingDataSourceListener listener) { - ObserveSwingDataSourceListener[] listeners = getDataSourceListeners(); + public boolean containsObserveSwingDataSourceListener(ObserveSwingDataSourceListener listener) { + ObserveSwingDataSourceListener[] listeners = getObserveSwingDataSourceListener(); for (ObserveSwingDataSourceListener l : listeners) { if (l.equals(listener)) { return true; @@ -310,21 +310,21 @@ public class ObserveSwingDataSource extends AbstractSerializableBean { return false; } - public ObserveSwingDataSourceListener[] getDataSourceListeners() { + public ObserveSwingDataSourceListener[] getObserveSwingDataSourceListener() { return listenerList.getListeners(ObserveSwingDataSourceListener.class); } - public void removeDataSourceListener(ObserveSwingDataSourceListener listener) { + public void removeObserveSwingDataSourceListener(ObserveSwingDataSourceListener listener) { listenerList.remove(ObserveSwingDataSourceListener.class, listener); } - protected void removeDataSourceListeners() { + protected void removeObserveSwingDataSourceListeners() { // remove all listeners - for (ObserveSwingDataSourceListener listener : getDataSourceListeners()) { + for (ObserveSwingDataSourceListener listener : getObserveSwingDataSourceListener()) { if (log.isInfoEnabled()) { log.info("removing listener " + listener); } - removeDataSourceListener(listener); + removeObserveSwingDataSourceListener(listener); } } @@ -334,35 +334,35 @@ public class ObserveSwingDataSource extends AbstractSerializableBean { public void fireNewMessage(String message, ObserveSwingDataSourceEvent.MessageLevel level) { ObserveSwingDataSourceEvent evt = new ObserveSwingDataSourceEvent(this, message, level); - for (ObserveSwingDataSourceListener listener : getDataSourceListeners()) { + for (ObserveSwingDataSourceListener listener : getObserveSwingDataSourceListener()) { listener.onNewMessage(evt); } } protected void fireOpening() { ObserveSwingDataSourceEvent evt = new ObserveSwingDataSourceEvent(this); - for (ObserveSwingDataSourceListener listener : getDataSourceListeners()) { + for (ObserveSwingDataSourceListener listener : getObserveSwingDataSourceListener()) { listener.onOpening(evt); } } protected void fireOpened() { ObserveSwingDataSourceEvent evt = new ObserveSwingDataSourceEvent(this); - for (ObserveSwingDataSourceListener listener : getDataSourceListeners()) { + for (ObserveSwingDataSourceListener listener : getObserveSwingDataSourceListener()) { listener.onOpened(evt); } } protected void fireClosing() { ObserveSwingDataSourceEvent evt = new ObserveSwingDataSourceEvent(this); - for (ObserveSwingDataSourceListener listener : getDataSourceListeners()) { + for (ObserveSwingDataSourceListener listener : getObserveSwingDataSourceListener()) { listener.onClosing(evt); } } protected void fireClosed() { ObserveSwingDataSourceEvent evt = new ObserveSwingDataSourceEvent(this); - for (ObserveSwingDataSourceListener listener : getDataSourceListeners()) { + for (ObserveSwingDataSourceListener listener : getObserveSwingDataSourceListener()) { listener.onClosed(evt); } } 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 6d0d29f..e67bd3a 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 @@ -366,14 +366,14 @@ public class AdminTabUIHandler implements SendMessageAble { protected void addStorageServiceLogger(ObserveSwingDataSource service) { //FIXME -// if (!service.containsDataSourceListener(serviceLogger)) { -// service.addDataSourceListener(serviceLogger); +// if (!service.containsObserveSwingDataSourceListener(serviceLogger)) { +// service.addObserveSwingDataSourceListener(serviceLogger); // } } protected void removeStorageServiceLogger(DataSource service) { -// if (service.containsDataSourceListener(serviceLogger)) { -// service.removeDataSourceListener(serviceLogger); +// if (service.containsObserveSwingDataSourceListener(serviceLogger)) { +// service.removeObserveSwingDataSourceListener(serviceLogger); // } } 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 1ce6ffc..7a47fa6 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 @@ -114,7 +114,7 @@ public class StorageUIHandler { dataSource = new ObserveSwingDataSource(configuration); - dataSource.addDataSourceListener( + dataSource.addObserveSwingDataSourceListener( new ObserveSwingDataSourceListenerAdapter() { @Override -- 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 develop in repository observe. See http://git.codelutin.com/observe.git commit 3ba428e4cd137332f29ec010b37567281f63775f Merge: f83390a 9ca1de5 Author: Tony CHEMIT <chemit@codelutin.com> Date: Fri Oct 2 17:24:41 2015 +0200 Retour sur develop pour pouvoir utiliser la partie ouverture de base (RAF la creation d'une base locale). Merge branch 'feature/7549' into develop .../main/java/fr/ird/observe/ObserveCLAction.java | 6 - .../observe/ObserveSwingApplicationContext.java | 38 +- .../ird/observe/business/util/SecurityModel.java | 217 ---------- .../ObserveSwingApplicationConfig.java | 9 +- .../fr/ird/observe/db/ObserveSwingDataSource.java | 116 ++++-- .../java/fr/ird/observe/db/constantes/DbMode.java | 2 +- .../fr/ird/observe/ui/admin/AdminTabUIHandler.java | 11 +- .../java/fr/ird/observe/ui/admin/AdminUIModel.java | 3 +- .../observe/ui/admin/report/ReportUIHandler.java | 3 +- .../ird/observe/ui/storage/ObstunaAdminAction.java | 455 ++++++++++++--------- .../ird/observe/ui/storage/RemoteUILauncher.java | 48 +-- .../ird/observe/ui/storage/StorageUIHandler.java | 96 +++-- .../fr/ird/observe/ui/storage/StorageUIModel.java | 94 +++-- .../observe/ui/storage/tabs/RolesTableModel.java | 62 ++- .../fr/ird/observe/ui/storage/tabs/RolesUI.css | 2 +- .../fr/ird/observe/ui/storage/tabs/RolesUI.jaxx | 2 +- .../ird/observe/ui/storage/tabs/SecurityModel.java | 174 ++++++++ .../ftl/dataSourceConnectionReport_fr.ftl | 20 +- .../observe-application-swing_en_GB.properties | 5 + .../observe-application-swing_es_ES.properties | 5 + .../observe-application-swing_fr_FR.properties | 5 + .../web/ObserveWebApplicationContext.java | 6 +- .../web/ObserveWebApplicationListener.java | 3 + .../ObserveWebApplicationConfiguration.java | 10 + .../ObserveWebApplicationConfigurationOption.java | 2 + .../controller/v1/DataSourceServiceController.java | 29 +- .../web/controller/v1/PingServiceController.java | 11 +- .../ObserveDtoConverter.java} | 34 +- .../web/injector/ObserveDtoInjector.java | 30 +- .../ObserveWebSecurityApplicationContext.java | 6 +- .../src/main/resources/observeweb.conf | 3 +- .../migration/AbstractDataSourceMigration.java | 61 ++- .../i18n/observe-entities_en_GB.properties | 4 - .../i18n/observe-entities_es_ES.properties | 4 - .../i18n/observe-entities_fr_FR.properties | 4 - .../services/service/BabModelVersionException.java | 34 ++ .../services/service/DataSourceService.java | 28 +- .../ird/observe/services/service/PingService.java | 5 +- .../ObserveDataSourceConfiguration.java | 4 + .../configuration/ObserveDataSourceConnection.java | 4 +- .../ObserveDataSourceConnectionSupport.java | 2 + .../ObserveDataSourceInformation.java | 62 +++ .../ObserveDataSourceConfigurationRest.java | 17 + .../ObserveDataSourceConnectionRest.java | 2 + ...ObserveDataSourceConfigurationTopiaSupport.java | 13 + .../ObserveDataSourceConnectionTopia.java | 2 + .../observe/services/dto/ObserveDbUserDtos.java | 22 + .../services/dto/constants/ObserveDbRole.java | 14 + .../src/main/xmi/observe-services-dto-common.zargo | Bin 36919 -> 39020 bytes .../fr/ird/observe/services/TestClassResource.java | 5 + .../ird/observe/services/TestMethodResource.java | 10 +- .../service/DataSourceServiceRestTest.java | 4 +- .../ObserveDataSourceConfigurationMainFactory.java | 13 +- .../fr/ird/observe/services/ObserveJdbcHelper.java | 154 +++++++ .../observe/services/ObserveSecurityHelper.java | 306 ++++++++++++++ .../services/dto/ObserveDtosInitializer.java | 5 + .../services/service/DataSourceServiceTopia.java | 141 ++++++- .../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 + .../ObserveDataSourceConnectionTopiaTaiste.java | 2 + .../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 + 67 files changed, 1777 insertions(+), 737 deletions(-) -- 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