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 341e3dc1a85922868f5b753ea9c530bc4b3d375e Author: Tony CHEMIT <chemit@codelutin.com> Date: Thu Aug 20 15:54:00 2015 +0200 Mise en place de la configuration de la data source des service topia --- observe-services-configuration-topia/pom.xml | 28 ----- .../ObserveDataSourceConfigurationTopia.java | 21 ---- .../ObserveDataSourceConfigurationTopiaH2.java | 51 ++++++++ .../ObserveDataSourceConfigurationTopiaPG.java | 64 +++++++++++ ...ObserveDataSourceConfigurationTopiaSupport.java | 88 ++++++++++++++ .../services/ObserveServiceFactoryRest.java | 2 +- .../services/ObserveServiceContextTopia.java | 18 +-- .../services/ObserveServiceFactoryTopia.java | 128 +++++++++++++++++++-- .../services/ObserveServiceFactoryTopiaTaiste.java | 37 ++++++ .../service/ApplicationContextResource.java | 13 ++- .../services/service/DataSourceResource.java | 54 ++++++--- .../service/ReferentialServiceTopiaTest.java | 26 ++--- 12 files changed, 430 insertions(+), 100 deletions(-) diff --git a/observe-services-configuration-topia/pom.xml b/observe-services-configuration-topia/pom.xml index 6446501..db80d13 100644 --- a/observe-services-configuration-topia/pom.xml +++ b/observe-services-configuration-topia/pom.xml @@ -20,37 +20,9 @@ <!-- sibling dependencies --> <dependency> <groupId>${project.groupId}</groupId> - <artifactId>observe-services-model</artifactId> - <version>${project.version}</version> - </dependency> - <dependency> - <groupId>${project.groupId}</groupId> <artifactId>observe-services-configuration-api</artifactId> <version>${project.version}</version> </dependency> - <dependency> - <groupId>${project.groupId}</groupId> - <artifactId>observe-services-api</artifactId> - <version>${project.version}</version> - </dependency> - <dependency> - <groupId>${project.groupId}</groupId> - <artifactId>observe-entities</artifactId> - <version>${project.version}</version> - </dependency> - <dependency> - <groupId>${project.groupId}</groupId> - <artifactId>observe-business</artifactId> - <version>${project.version}</version> - </dependency> - - <dependency> - <groupId>${project.groupId}</groupId> - <artifactId>observe-business</artifactId> - <version>${project.version}</version> - <classifier>tests</classifier> - </dependency> - <!-- commons dependencies --> diff --git a/observe-services-configuration-topia/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConfigurationTopia.java b/observe-services-configuration-topia/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConfigurationTopia.java deleted file mode 100644 index 434bc4d..0000000 --- a/observe-services-configuration-topia/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConfigurationTopia.java +++ /dev/null @@ -1,21 +0,0 @@ -package fr.ird.observe.services.configuration; - -import fr.ird.observe.db.DataSource; - -/** - * Created on 19/08/15. - * - * @author Tony Chemit - chemit@codelutin.com - */ -public class ObserveDataSourceConfigurationTopia implements ObserveDataSourceConfiguration { - - private DataSource dataSource; - - public void setDataSource(DataSource dataSource) { - this.dataSource = dataSource; - } - - public DataSource getDataSource() { - return dataSource; - } -} diff --git a/observe-services-configuration-topia/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConfigurationTopiaH2.java b/observe-services-configuration-topia/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConfigurationTopiaH2.java new file mode 100644 index 0000000..59d029c --- /dev/null +++ b/observe-services-configuration-topia/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConfigurationTopiaH2.java @@ -0,0 +1,51 @@ +package fr.ird.observe.services.configuration; + +import com.google.common.base.MoreObjects; + +import java.io.File; +import java.util.Objects; + +/** + * Created on 19/08/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class ObserveDataSourceConfigurationTopiaH2 extends ObserveDataSourceConfigurationTopiaSupport { + + /** + * Le répertoire où se trouve la base (le nom de la base est {@code obstuna}). + */ + protected File directory; + + public File getDirectory() { + return directory; + } + + public void setDirectory(File directory) { + this.directory = directory; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof ObserveDataSourceConfigurationTopiaH2)) return false; + ObserveDataSourceConfigurationTopiaH2 that = (ObserveDataSourceConfigurationTopiaH2) o; + return Objects.equals(directory, that.directory) && + Objects.equals(username, that.username) && + Objects.equals(password, that.password); + } + + @Override + public int hashCode() { + return Objects.hash(directory, username, password); + } + + @Override + public String toString() { + return MoreObjects.toStringHelper(this) + .add("directory", directory) + .add("username", username) + .add("password", "***") + .toString(); + } +} diff --git a/observe-services-configuration-topia/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConfigurationTopiaPG.java b/observe-services-configuration-topia/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConfigurationTopiaPG.java new file mode 100644 index 0000000..5779441 --- /dev/null +++ b/observe-services-configuration-topia/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConfigurationTopiaPG.java @@ -0,0 +1,64 @@ +package fr.ird.observe.services.configuration; + +import com.google.common.base.MoreObjects; + +import java.util.Objects; + +/** + * Created on 19/08/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class ObserveDataSourceConfigurationTopiaPG extends ObserveDataSourceConfigurationTopiaSupport { + + /** + * L'url jdbc de la source. + */ + protected String jdbcUrl; + + /** + * Est-ce que l'on doit utiliser une connexion ssl ? + */ + protected boolean useSsl; + + public String getJdbcUrl() { + return jdbcUrl; + } + + public void setJdbcUrl(String jdbcUrl) { + this.jdbcUrl = jdbcUrl; + } + + public boolean isUseSsl() { + return useSsl; + } + + public void setUseSsl(boolean useSsl) { + this.useSsl = useSsl; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof ObserveDataSourceConfigurationTopiaPG)) return false; + ObserveDataSourceConfigurationTopiaPG that = (ObserveDataSourceConfigurationTopiaPG) o; + return Objects.equals(jdbcUrl, that.jdbcUrl) && + Objects.equals(username, that.username) && + Objects.equals(password, that.password); + } + + @Override + public int hashCode() { + return Objects.hash(jdbcUrl, username, password); + } + + @Override + public String toString() { + return MoreObjects.toStringHelper(this) + .add("jdbcUrl", jdbcUrl) + .add("username", username) + .add("password", "***") + .add("useSsl", useSsl) + .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 new file mode 100644 index 0000000..228fa7c --- /dev/null +++ b/observe-services-configuration-topia/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConfigurationTopiaSupport.java @@ -0,0 +1,88 @@ +package fr.ird.observe.services.configuration; + +/** + * Created on 19/08/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public abstract class ObserveDataSourceConfigurationTopiaSupport implements ObserveDataSourceConfiguration { + + /** + * Le nom de la data source. + */ + protected String label; + + /** + * L'utilisateur pour se connecter à la source. + */ + protected String username; + + /** + * Le mot de passe pour se connecter à la source. + */ + protected char[] password; + + /** + * Est-ce que la base doit être migrée à son ouverture? + */ + protected boolean canMigrate; + + /** + * Est-ce que l'on peut voir la progression lors d'une migration ? + */ + protected boolean showMigrationProgression; + + /** + * Est-ce que l'on peut voir le script sql de migration à appliquer ? + */ + protected boolean showMigrationSql; + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public char[] getPassword() { + return password; + } + + public void setPassword(char... password) { + this.password = password; + } + + public String getLabel() { + return label; + } + + public void setLabel(String label) { + this.label = label; + } + + public boolean isCanMigrate() { + return canMigrate; + } + + public void setCanMigrate(boolean canMigrate) { + this.canMigrate = canMigrate; + } + + public boolean isShowMigrationProgression() { + return showMigrationProgression; + } + + public void setShowMigrationProgression(boolean showMigrationProgression) { + this.showMigrationProgression = showMigrationProgression; + } + + public boolean isShowMigrationSql() { + return showMigrationSql; + } + + public void setShowMigrationSql(boolean showMigrationSql) { + this.showMigrationSql = showMigrationSql; + } + +} diff --git a/observe-services-rest/src/main/java/fr/ird/observe/services/ObserveServiceFactoryRest.java b/observe-services-rest/src/main/java/fr/ird/observe/services/ObserveServiceFactoryRest.java index ec4e350..cf14936 100644 --- a/observe-services-rest/src/main/java/fr/ird/observe/services/ObserveServiceFactoryRest.java +++ b/observe-services-rest/src/main/java/fr/ird/observe/services/ObserveServiceFactoryRest.java @@ -12,7 +12,7 @@ import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationRest; */ public class ObserveServiceFactoryRest extends ObserveServiceFactorySupport { - protected final LoadingCache<Class<?>, Class<?>> serviceTypeCache = newAddSuffixClassCache("fr.ird.observe.services.service.", "Rest"); + protected static final LoadingCache<Class<?>, Class<?>> serviceTypeCache = newServiceImplementationTypesCache("Rest"); @Override public <S extends ObserveService> boolean accept(ObserveDataSourceConfiguration dataSourceConfiguration, Class<S> serviceType) { diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/ObserveServiceContextTopia.java b/observe-services-topia/src/main/java/fr/ird/observe/services/ObserveServiceContextTopia.java index 048cb67..cd76d41 100644 --- a/observe-services-topia/src/main/java/fr/ird/observe/services/ObserveServiceContextTopia.java +++ b/observe-services-topia/src/main/java/fr/ird/observe/services/ObserveServiceContextTopia.java @@ -1,9 +1,7 @@ package fr.ird.observe.services; import fr.ird.observe.db.DataSource; -import fr.ird.observe.services.ObserveServiceApplicationContext; -import fr.ird.observe.services.ObserveServiceContext; -import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationTopia; +import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationTopiaSupport; import fr.ird.observe.services.dto.constants.ReferentialLocale; import org.nuiton.topia.TopiaContext; @@ -18,13 +16,15 @@ public class ObserveServiceContextTopia implements ObserveServiceContext { protected ObserveServiceApplicationContext applicationContext; - protected ObserveDataSourceConfigurationTopia dataSourceConfiguration; + protected ObserveDataSourceConfigurationTopiaSupport dataSourceConfiguration; protected TopiaContext transaction; + //TODO A supprimer -> utiliser une TopiaApplicationContext + protected DataSource dataSource; + public DataSource getDataSource() { - //TODO A supprimer -> utiliser une TopiaApplicationContext - return dataSourceConfiguration.getDataSource(); + return dataSource; } public TopiaContext getTransaction() { @@ -49,7 +49,11 @@ public class ObserveServiceContextTopia implements ObserveServiceContext { this.applicationContext = applicationContext; } - public void setDataSourceConfiguration(ObserveDataSourceConfigurationTopia dataSourceConfiguration) { + public void setDataSourceConfiguration(ObserveDataSourceConfigurationTopiaSupport dataSourceConfiguration) { this.dataSourceConfiguration = dataSourceConfiguration; } + + public void setDataSource(DataSource dataSource) { + this.dataSource = dataSource; + } } diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/ObserveServiceFactoryTopia.java b/observe-services-topia/src/main/java/fr/ird/observe/services/ObserveServiceFactoryTopia.java index 07f6271..16a0a9c 100644 --- a/observe-services-topia/src/main/java/fr/ird/observe/services/ObserveServiceFactoryTopia.java +++ b/observe-services-topia/src/main/java/fr/ird/observe/services/ObserveServiceFactoryTopia.java @@ -1,41 +1,78 @@ package fr.ird.observe.services; import com.google.common.base.Preconditions; +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; import com.google.common.collect.ImmutableSet; +import fr.ird.observe.ObserveTechnicalException; import fr.ird.observe.db.DataSource; +import fr.ird.observe.db.DataSourceException; +import fr.ird.observe.db.DataSourceFactory; +import fr.ird.observe.db.constants.CommonDataSourceConfigParam; +import fr.ird.observe.db.impl.H2DataSourceConfig; +import fr.ird.observe.db.impl.H2DataSourceConfigParam; +import fr.ird.observe.db.impl.PGDataSourceConfig; +import fr.ird.observe.db.impl.PGDataSourceConfigParam; import fr.ird.observe.services.configuration.ObserveDataSourceConfiguration; -import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationTopia; +import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationTopiaH2; +import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationTopiaPG; +import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationTopiaSupport; import fr.ird.observe.services.spi.NoDataAccess; import fr.ird.observe.services.spi.Write; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.topia.TopiaContext; +import java.io.Closeable; import java.lang.reflect.InvocationHandler; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.util.Set; +import java.util.concurrent.ExecutionException; /** + * FIXME Supprimer les DataSourceConfig et DataSource et directement utiliser TopiaConfiguration. + * * Created on 16/08/15. * * @author Tony Chemit - chemit@codelutin.com */ -public class ObserveServiceFactoryTopia extends ObserveServiceFactorySupport { +public class ObserveServiceFactoryTopia extends ObserveServiceFactorySupport implements Closeable { /** Logger. */ private static final Log log = LogFactory.getLog(ObserveServiceFactoryTopia.class); - protected final LoadingCache<Class<?>, Class<?>> serviceTypeCache = newAddSuffixClassCache("fr.ird.observe.services.topia.service.", "Topia"); + protected static final LoadingCache<Class<?>, Class<?>> serviceTypeCache = newServiceImplementationTypesCache("Topia"); + + protected final LoadingCache<ObserveDataSourceConfigurationTopiaSupport, DataSource> dataSourceCache = CacheBuilder + .newBuilder() + .build(new CacheLoader<ObserveDataSourceConfigurationTopiaSupport, DataSource>() { + + @Override + public DataSource load(ObserveDataSourceConfigurationTopiaSupport key) throws Exception { + + DataSource dataSource = null; + if (key instanceof ObserveDataSourceConfigurationTopiaH2) { + dataSource = createH2DataSource((ObserveDataSourceConfigurationTopiaH2) key); + } + + if (key instanceof ObserveDataSourceConfigurationTopiaPG) { + dataSource = createPGDataSource((ObserveDataSourceConfigurationTopiaPG) key); + } + + Preconditions.checkState(dataSource != null, "No dataSource found for configuration: " + key); + return dataSource; + } + }); @Override public <S extends ObserveService> boolean accept(ObserveDataSourceConfiguration dataSourceConfiguration, Class<S> serviceType) { Preconditions.checkNotNull(dataSourceConfiguration, "dataSourceConfiguration can't be null."); Preconditions.checkNotNull(serviceType, "serviceType can't be null."); - return dataSourceConfiguration instanceof ObserveDataSourceConfigurationTopia; + return dataSourceConfiguration instanceof ObserveDataSourceConfigurationTopiaSupport; } @@ -44,15 +81,13 @@ public class ObserveServiceFactoryTopia extends ObserveServiceFactorySupport { Preconditions.checkNotNull(applicationContext, "applicationContext can't be null."); Preconditions.checkNotNull(dataSourceConfiguration, "dataSourceConfiguration can't be null."); - Preconditions.checkArgument(dataSourceConfiguration instanceof ObserveDataSourceConfigurationTopia, "dataSourceConfiguration must be of type " + ObserveDataSourceConfigurationTopia.class.getName()); + Preconditions.checkArgument(dataSourceConfiguration instanceof ObserveDataSourceConfigurationTopiaSupport, "dataSourceConfiguration must be of type " + ObserveDataSourceConfigurationTopiaSupport.class.getName()); Preconditions.checkNotNull(serviceType, "serviceType can't be null."); Class<S> serviceTypeImpl = getServiceClassType(serviceTypeCache, serviceType); Preconditions.checkNotNull(serviceTypeImpl, "serviceTypeImpl not found for : " + serviceType.getName()); - ObserveServiceContextTopia serviceContext = new ObserveServiceContextTopia(); - serviceContext.setApplicationContext(applicationContext); - serviceContext.setDataSourceConfiguration((ObserveDataSourceConfigurationTopia) dataSourceConfiguration); + ObserveServiceContextTopia serviceContext = createServiceContext(applicationContext, (ObserveDataSourceConfigurationTopiaSupport) dataSourceConfiguration); S service = newServiceInstance(serviceTypeImpl, serviceContext); service = newServiceTransactionalProxy(serviceType, service, serviceContext); @@ -60,6 +95,62 @@ public class ObserveServiceFactoryTopia extends ObserveServiceFactorySupport { } + protected ObserveServiceContextTopia createServiceContext(ObserveServiceApplicationContext applicationContext, ObserveDataSourceConfigurationTopiaSupport dataSourceConfiguration) { + + ObserveServiceContextTopia serviceContext = new ObserveServiceContextTopia(); + serviceContext.setApplicationContext(applicationContext); + ObserveDataSourceConfigurationTopiaSupport dataSourceConfigurationTopia = dataSourceConfiguration; + + serviceContext.setDataSourceConfiguration(dataSourceConfigurationTopia); + + DataSource dataSource = getDataSource(dataSourceConfigurationTopia); + serviceContext.setDataSource(dataSource); + return serviceContext; + + } + + protected DataSource createPGDataSource(ObserveDataSourceConfigurationTopiaPG key) { + + PGDataSourceConfig result = DataSourceFactory.newPGConfig( + key.getLabel(), + CommonDataSourceConfigParam.LOGIN, key.getUsername(), + CommonDataSourceConfigParam.PASSWORD, key.getPassword(), + CommonDataSourceConfigParam.CAN_MIGRATE, key.isCanMigrate(), + CommonDataSourceConfigParam.SHOW_MIGRATION_PROGRESSION, key.isShowMigrationProgression(), + CommonDataSourceConfigParam.SHOW_MIGRATION_SQL, key.isShowMigrationSql(), + PGDataSourceConfigParam.URL, key.getJdbcUrl(), + PGDataSourceConfigParam.USE_SSL, key.isUseSsl() + ); + return DataSourceFactory.newService(result); + + } + + protected DataSource createH2DataSource(ObserveDataSourceConfigurationTopiaH2 key) { + + H2DataSourceConfig result = DataSourceFactory.newH2Config( + key.getLabel(), + CommonDataSourceConfigParam.LOGIN, key.getUsername(), + CommonDataSourceConfigParam.PASSWORD, key.getPassword(), + CommonDataSourceConfigParam.CAN_MIGRATE, key.isCanMigrate(), + CommonDataSourceConfigParam.SHOW_MIGRATION_PROGRESSION, key.isShowMigrationProgression(), + CommonDataSourceConfigParam.SHOW_MIGRATION_SQL, key.isShowMigrationSql(), + H2DataSourceConfigParam.DIRECTORY, key.getDirectory() + ); + return DataSourceFactory.newService(result); + + } + + protected DataSource getDataSource(ObserveDataSourceConfigurationTopiaSupport dataSourceConfiguration) { + + try { + DataSource dataSource = dataSourceCache.get(dataSourceConfiguration); + return dataSource; + } catch (ExecutionException e) { + throw new ObserveTechnicalException("Could not get dataSource for configuration: " + dataSourceConfiguration, e); + } + + } + protected <S extends ObserveService> S newServiceTransactionalProxy(Class<S> serviceType, S service, ObserveServiceContextTopia serviceContext) { ObserveServiceInvocationHandler invocationHandler = new ObserveServiceInvocationHandler(serviceContext, service); @@ -68,6 +159,27 @@ public class ObserveServiceFactoryTopia extends ObserveServiceFactorySupport { } + @Override + public void close() { + + for (DataSource dataSource : dataSourceCache.asMap().values()) { + + if (dataSource.isOpen()) { + try { + dataSource.doClose(false); + } catch (DataSourceException e) { + if (log.isErrorEnabled()) { + log.error("Could not close data source: " + dataSource, e); + } + } + } + } + + dataSourceCache.invalidateAll(); + + + } + protected static class ObserveServiceInvocationHandler implements InvocationHandler { private final ObserveServiceContextTopia serviceContext; diff --git a/observe-services-topia/src/test/java/fr/ird/observe/services/ObserveServiceFactoryTopiaTaiste.java b/observe-services-topia/src/test/java/fr/ird/observe/services/ObserveServiceFactoryTopiaTaiste.java new file mode 100644 index 0000000..2b22b88 --- /dev/null +++ b/observe-services-topia/src/test/java/fr/ird/observe/services/ObserveServiceFactoryTopiaTaiste.java @@ -0,0 +1,37 @@ +package fr.ird.observe.services; + +import fr.ird.observe.ObserveTechnicalException; +import fr.ird.observe.db.DataSource; +import fr.ird.observe.db.DataSourceException; +import fr.ird.observe.db.impl.H2DataSource; +import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationTopiaH2; +import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationTopiaSupport; + +/** + * Created on 20/08/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class ObserveServiceFactoryTopiaTaiste extends ObserveServiceFactoryTopia { + + public H2DataSource getExistingDataSource(ObserveDataSourceConfigurationTopiaH2 dataSourceConfiguration) { + H2DataSource dataSource = (H2DataSource) dataSourceCache.getIfPresent(dataSourceConfiguration); + return dataSource; + } + + @Override + protected DataSource getDataSource(ObserveDataSourceConfigurationTopiaSupport dataSourceConfiguration) { + + DataSource dataSource = super.getDataSource(dataSourceConfiguration); + + if (!dataSource.isOpen()) { + try { + dataSource.doOpen(); + } catch (DataSourceException e) { + throw new ObserveTechnicalException("Could not open dataSource: " + dataSourceConfiguration, e); + } + } + return dataSource; + + } +} diff --git a/observe-services-topia/src/test/java/fr/ird/observe/services/service/ApplicationContextResource.java b/observe-services-topia/src/test/java/fr/ird/observe/services/service/ApplicationContextResource.java index 4071f76..04ab6ca 100644 --- a/observe-services-topia/src/test/java/fr/ird/observe/services/service/ApplicationContextResource.java +++ b/observe-services-topia/src/test/java/fr/ird/observe/services/service/ApplicationContextResource.java @@ -2,9 +2,9 @@ package fr.ird.observe.services.service; import fr.ird.observe.IObserveConfig; import fr.ird.observe.services.ObserveServiceApplicationContext; -import fr.ird.observe.services.ObserveServiceFactoryTopia; -import fr.ird.observe.services.dto.constants.ReferentialLocale; +import fr.ird.observe.services.ObserveServiceFactoryTopiaTaiste; import fr.ird.observe.services.ObserveServiceTopia; +import fr.ird.observe.services.dto.constants.ReferentialLocale; import fr.ird.observe.test.TestHelper; import fr.ird.observe.util.Scripts; import org.apache.commons.logging.Log; @@ -28,11 +28,12 @@ public class ApplicationContextResource implements TestRule { protected final ObserveServiceApplicationContext serviceApplicationContext; - protected final ObserveServiceFactoryTopia serviceFactory; + protected final ObserveServiceFactoryTopiaTaiste serviceFactory; + public ApplicationContextResource(Version databaseVersion) { this.databaseVersion = databaseVersion; - this.serviceApplicationContext= new ObserveServiceApplicationContext(); - this.serviceFactory = new ObserveServiceFactoryTopia(); + this.serviceApplicationContext = new ObserveServiceApplicationContext(); + this.serviceFactory = new ObserveServiceFactoryTopiaTaiste(); } public String getScriptPath(String classifier) { @@ -43,7 +44,7 @@ public class ApplicationContextResource implements TestRule { return serviceApplicationContext; } - public ObserveServiceFactoryTopia getServiceFactory() { + public ObserveServiceFactoryTopiaTaiste getServiceFactory() { return serviceFactory; } diff --git a/observe-services-topia/src/test/java/fr/ird/observe/services/service/DataSourceResource.java b/observe-services-topia/src/test/java/fr/ird/observe/services/service/DataSourceResource.java index e699a79..fcc50fb 100644 --- a/observe-services-topia/src/test/java/fr/ird/observe/services/service/DataSourceResource.java +++ b/observe-services-topia/src/test/java/fr/ird/observe/services/service/DataSourceResource.java @@ -1,9 +1,11 @@ package fr.ird.observe.services.service; -import fr.ird.observe.ObserveTechnicalException; import fr.ird.observe.db.DBTestHelper; -import fr.ird.observe.db.DataSource; import fr.ird.observe.db.DataSourceException; +import fr.ird.observe.db.impl.H2DataSource; +import fr.ird.observe.db.impl.H2DataSourceConfig; +import fr.ird.observe.services.ObserveServiceFactoryTopiaTaiste; +import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationTopiaH2; import fr.ird.observe.test.TestHelper; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -12,6 +14,8 @@ import org.junit.rules.TestRule; import org.junit.runner.Description; import org.junit.runners.model.Statement; import org.nuiton.topia.TopiaContext; +import org.nuiton.topia.persistence.TopiaDAO; +import org.nuiton.topia.persistence.TopiaEntity; import java.io.File; import java.net.URL; @@ -28,21 +32,27 @@ public class DataSourceResource implements TestRule { /** Logger. */ private static final Log log = LogFactory.getLog(DataSourceResource.class); - protected final String dbPath; + protected final ApplicationContextResource applicationContextResource; - protected DataSource dataSource; + protected final String dbPath; protected Map<String, TopiaContext> transactions = new LinkedHashMap<>(); - public DataSourceResource(String dbPath) { + protected ObserveDataSourceConfigurationTopiaH2 dataSourceConfiguration; + + public DataSourceResource(ApplicationContextResource applicationContextResource, String dbPath) { + this.applicationContextResource = applicationContextResource; this.dbPath = dbPath; } - public DataSource getDataSource() { - return dataSource; + public ObserveDataSourceConfigurationTopiaH2 getDataSourceConfiguration() { + return dataSourceConfiguration; } public TopiaContext newTransaction(String name) throws DataSourceException { + + ObserveServiceFactoryTopiaTaiste serviceFactory = applicationContextResource.getServiceFactory(); + H2DataSource dataSource = serviceFactory.getExistingDataSource(dataSourceConfiguration); TopiaContext topiaContext = dataSource.beginTransaction(name); transactions.put(name, topiaContext); return topiaContext; @@ -63,6 +73,11 @@ public class DataSourceResource implements TestRule { }; } + public <E extends TopiaEntity> TopiaDAO<E> getDAO(TopiaContext tx, Class<E> entityType) { + H2DataSource dataSource = getDataSource(); + return dataSource.getDAO(tx, entityType); + } + protected void before(Description description) throws Throwable { Class<?> testClass = description.getTestClass(); @@ -78,7 +93,7 @@ public class DataSourceResource implements TestRule { File localDbFile = TestHelper.newLocalDB(methodName); - dataSource = DBTestHelper.createAndOpenFromDump( + H2DataSource dataSource = DBTestHelper.createAndOpenFromDump( localDbFile, dbUrl, false, @@ -87,6 +102,18 @@ public class DataSourceResource implements TestRule { true, true); + H2DataSourceConfig dataSourceConfig = dataSource.getConfig(); + + dataSourceConfiguration = new ObserveDataSourceConfigurationTopiaH2(); + dataSourceConfiguration.setLabel(dataSourceConfig.getLabel()); + dataSourceConfiguration.setUsername(dataSourceConfig.getLogin()); + dataSourceConfiguration.setPassword(dataSourceConfig.getPassword()); + dataSourceConfiguration.setDirectory(dataSourceConfig.getStorageDirectory()); + dataSourceConfiguration.setCanMigrate(dataSourceConfig.isCanMigrate()); + dataSourceConfiguration.setShowMigrationProgression(dataSourceConfig.isShowMigrationProgression()); + dataSourceConfiguration.setShowMigrationSql(dataSourceConfig.isShowMigrationSql()); + + dataSource.doClose(false); } @@ -98,6 +125,7 @@ public class DataSourceResource implements TestRule { log.debug("Ends " + testClass.getName() + "::" + methodName); } + H2DataSource dataSource = getDataSource(); if (dataSource != null && dataSource.isOpen()) { for (Map.Entry<String, TopiaContext> entry : transactions.entrySet()) { @@ -114,13 +142,13 @@ public class DataSourceResource implements TestRule { } } - try { - dataSource.doClose(false); - } catch (DataSourceException e) { - throw new ObserveTechnicalException("Could not close datasource: " + dataSource, e); - } } + applicationContextResource.getServiceFactory().close(); + } + private H2DataSource getDataSource() { + return applicationContextResource.getServiceFactory().getExistingDataSource(dataSourceConfiguration); + } } diff --git a/observe-services-topia/src/test/java/fr/ird/observe/services/service/ReferentialServiceTopiaTest.java b/observe-services-topia/src/test/java/fr/ird/observe/services/service/ReferentialServiceTopiaTest.java index 8220d53..e78a353 100644 --- a/observe-services-topia/src/test/java/fr/ird/observe/services/service/ReferentialServiceTopiaTest.java +++ b/observe-services-topia/src/test/java/fr/ird/observe/services/service/ReferentialServiceTopiaTest.java @@ -1,12 +1,11 @@ package fr.ird.observe.services.service; -import fr.ird.observe.db.DataSource; import fr.ird.observe.entities.migration.H2DataSourceMigration; import fr.ird.observe.entities.referentiel.LengthWeightParameter; import fr.ird.observe.entities.referentiel.Program; import fr.ird.observe.services.ObserveServiceApplicationContext; -import fr.ird.observe.services.ObserveServiceFactory; -import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationTopia; +import fr.ird.observe.services.ObserveServiceFactoryTopiaTaiste; +import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationTopiaH2; import fr.ird.observe.services.dto.FormDto; import fr.ird.observe.services.dto.IdDto; import fr.ird.observe.services.dto.ReferenceSetDto; @@ -40,22 +39,18 @@ public class ReferentialServiceTopiaTest { public static final ApplicationContextResource applicationContextResource = new ApplicationContextResource(H2DataSourceMigration.V_4_0); @Rule - public final DataSourceResource dataSourceResource = new DataSourceResource(applicationContextResource.getScriptPath("referentiel")); + public final DataSourceResource dataSourceResource = new DataSourceResource(applicationContextResource, applicationContextResource.getScriptPath("referentiel")); protected ReferentialService service; @Before public void setUp() throws Exception { - DataSource localDataSource = dataSourceResource.getDataSource(); - - - ObserveServiceFactory serviceFactory = applicationContextResource.getServiceFactory(); + ObserveServiceFactoryTopiaTaiste serviceFactory = applicationContextResource.getServiceFactory(); ObserveServiceApplicationContext serviceApplicationContext = applicationContextResource.getServiceApplicationContext(); - ObserveDataSourceConfigurationTopia dataSourceConfiguration = new ObserveDataSourceConfigurationTopia(); - dataSourceConfiguration.setDataSource(localDataSource); + ObserveDataSourceConfigurationTopiaH2 dataSourceConfiguration = dataSourceResource.getDataSourceConfiguration(); service = serviceFactory.newService(serviceApplicationContext, dataSourceConfiguration, ReferentialService.class); @@ -73,7 +68,7 @@ public class ReferentialServiceTopiaTest { } Class entityType = entry.getValue(); - TopiaDAO dao = dataSourceResource.getDataSource().getDAO(tx, entityType); + TopiaDAO dao = dataSourceResource.getDAO(tx, entityType); long expectedCount = dao.count(); if (log.isInfoEnabled()) { @@ -132,11 +127,10 @@ public class ReferentialServiceTopiaTest { delete(tx, ProgramDto.class, Program.class); delete(tx, LengthWeightParameterDto.class, LengthWeightParameter.class); - } protected void loadToRead(TopiaContext tx, Class dtoType, Class entityType) { - TopiaDAO<?> dao = dataSourceResource.getDataSource().getDAO(tx, entityType); + TopiaDAO<?> dao = dataSourceResource.getDAO(tx, entityType); long expectedCount = dao.count(); if (log.isInfoEnabled()) { @@ -165,7 +159,7 @@ public class ReferentialServiceTopiaTest { } protected void loadToEdit(TopiaContext tx, Class dtoType, Class entityType) { - TopiaDAO<?> dao = dataSourceResource.getDataSource().getDAO(tx, entityType); + TopiaDAO<?> dao = dataSourceResource.getDAO(tx, entityType); long expectedCount = dao.count(); if (log.isInfoEnabled()) { @@ -189,7 +183,7 @@ public class ReferentialServiceTopiaTest { for (ReferenceSetDto labelSetDto : formDto.getLabels()) { Class refEntityType = ReferentialServiceTopia.getEntityType(labelSetDto.getType()); - long refExpected = dataSourceResource.getDataSource().getDAO(tx, refEntityType).count(); + long refExpected = dataSourceResource.getDAO(tx, refEntityType).count(); Assert.assertEquals(refExpected, labelSetDto.sizeReference()); } @@ -199,7 +193,7 @@ public class ReferentialServiceTopiaTest { protected void delete(TopiaContext tx, Class dtoType, Class entityType) { - TopiaDAO<?> dao = dataSourceResource.getDataSource().getDAO(tx, entityType); + TopiaDAO<?> dao = dataSourceResource.getDAO(tx, entityType); long expectedCount = dao.count(); TopiaEntity entity = dao.iterator().next(); -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@list.forge.codelutin.com>.