This is an automated email from the git hooks/post-receive script. New commit to branch feature/7464 in repository observe. See http://git.codelutin.com/observe.git commit 0572571b00be9242682f9ed7a5d234f4660e7a2c Author: Tony CHEMIT <chemit@codelutin.com> Date: Sun Aug 23 01:34:49 2015 +0200 Implantation de création d'une base (See #7464) --- .../observe/ObserveTopiaApplicationContext.java | 5 +- .../services/ObserveServiceApplicationContext.java | 37 ++++ .../observe/services/ObserveServiceContext.java | 18 ++ .../service/DataSourceDumpProducerService.java | 16 ++ .../services/service/DataSourceService.java | 5 +- observe-services-configuration-api/pom.xml | 7 - .../ObserveDataSourceConfiguration.java | 2 + ...ObserveDataSourceConfigurationTopiaSupport.java | 1 + observe-services-model/pom.xml | 7 + .../dto/DataSourceCreateConfigurationDto.java | 81 ++++++++ .../services/ObserveServiceContextTopia.java | 28 ++- .../services/ObserveServiceFactoryTopia.java | 180 +--------------- .../ObserveTopiaApplicationContextFactory.java | 230 +++++++++++++++++++++ .../DataSourceDumpProducerServiceTopia.java | 21 ++ .../services/service/DataSourceServiceTopia.java | 91 +++++++- .../services/ObserveServiceFactoryTopiaTaiste.java | 30 --- .../service/ApplicationContextResource.java | 9 +- .../services/service/DataSourceResource.java | 34 +-- .../service/DataSourceServiceTopiaTest.java | 50 +++++ .../service/ReferentialServiceTopiaTest.java | 6 +- 20 files changed, 602 insertions(+), 256 deletions(-) diff --git a/observe-entities/src/main/java/fr/ird/observe/ObserveTopiaApplicationContext.java b/observe-entities/src/main/java/fr/ird/observe/ObserveTopiaApplicationContext.java index cff5f03..7c66d03 100644 --- a/observe-entities/src/main/java/fr/ird/observe/ObserveTopiaApplicationContext.java +++ b/observe-entities/src/main/java/fr/ird/observe/ObserveTopiaApplicationContext.java @@ -14,7 +14,7 @@ public class ObserveTopiaApplicationContext extends AbstractObserveTopiaApplicat public static final String AUTO_MIGRATE = "auto.migrate"; - //FIXME Voir comment remplir ça. + //FIXME Voir comment remplir ça (probablement pour les tests ?) protected boolean autoMigrate; /** @@ -35,8 +35,7 @@ public class ObserveTopiaApplicationContext extends AbstractObserveTopiaApplicat } public boolean isOpen() { - //FIXME utiliser le flag open - return !isClosed(); + return isOpened() && open; } public void setOpen(boolean open) { diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/ObserveServiceApplicationContext.java b/observe-services-api/src/main/java/fr/ird/observe/services/ObserveServiceApplicationContext.java index 542f8e3..49a84ee 100644 --- a/observe-services-api/src/main/java/fr/ird/observe/services/ObserveServiceApplicationContext.java +++ b/observe-services-api/src/main/java/fr/ird/observe/services/ObserveServiceApplicationContext.java @@ -2,6 +2,15 @@ package fr.ird.observe.services; import fr.ird.observe.services.dto.constants.ReferentialLocale; +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.attribute.FileAttribute; +import java.nio.file.attribute.PosixFilePermission; +import java.nio.file.attribute.PosixFilePermissions; +import java.util.Set; + /** * Created on 19/08/15. * @@ -14,6 +23,16 @@ public class ObserveServiceApplicationContext { */ protected ReferentialLocale referentialLocale; + /** + * L'usine de services principale (celle au dessus de toutes les usines d'implantation). + */ + protected ObserveServiceFactory mainServiceFactory; + + /** + * Le répertoire où créer les répertoires temporaires. + */ + protected Path temporaryDirectoryRoot; + public ReferentialLocale getReferentialLocale() { return referentialLocale; } @@ -21,4 +40,22 @@ public class ObserveServiceApplicationContext { public void setReferentialLocale(ReferentialLocale referentialLocale) { this.referentialLocale = referentialLocale; } + + public ObserveServiceFactory getMainServiceFactory() { + return mainServiceFactory; + } + + public void setMainServiceFactory(ObserveServiceFactory mainServiceFactory) { + this.mainServiceFactory = mainServiceFactory; + } + + public void setTemporaryDirectoryRoot(Path temporaryDirectoryRoot) { + this.temporaryDirectoryRoot = temporaryDirectoryRoot; + } + + public File createTemporaryDirectory(String prefix) throws IOException { + Set<PosixFilePermission> posixFilePermissions = PosixFilePermissions.fromString("rwxr-x---"); + FileAttribute<Set<PosixFilePermission>> fileAttribute = PosixFilePermissions.asFileAttribute(posixFilePermissions); + return Files.createTempDirectory(temporaryDirectoryRoot, prefix, fileAttribute).toFile(); + } } diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/ObserveServiceContext.java b/observe-services-api/src/main/java/fr/ird/observe/services/ObserveServiceContext.java index d854949..cd959c9 100644 --- a/observe-services-api/src/main/java/fr/ird/observe/services/ObserveServiceContext.java +++ b/observe-services-api/src/main/java/fr/ird/observe/services/ObserveServiceContext.java @@ -1,7 +1,10 @@ package fr.ird.observe.services; +import fr.ird.observe.services.configuration.ObserveDataSourceConfiguration; import fr.ird.observe.services.dto.constants.ReferentialLocale; +import java.io.File; +import java.io.IOException; import java.util.Date; /** @@ -15,4 +18,19 @@ public interface ObserveServiceContext { Date now(); + /** + * Pour créer un service à partir de la data source courante. + */ + <S extends ObserveService> S newService(Class<S> serviceType); + + /** + * Pour créer un service à partir de la data source donnée. + */ + <S extends ObserveService> S newService(ObserveDataSourceConfiguration dataSourceConfiguration, Class<S> serviceType); + + /** + * Pour créer un répertoire temporaire dont le nom commence par le préfixe donné. + */ + File createTemporaryDirectory(String prefix) throws IOException; + } diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/DataSourceDumpProducerService.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/DataSourceDumpProducerService.java new file mode 100644 index 0000000..163d414 --- /dev/null +++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/DataSourceDumpProducerService.java @@ -0,0 +1,16 @@ +package fr.ird.observe.services.service; + +import fr.ird.observe.services.ObserveService; + +/** + * Created on 23/08/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public interface DataSourceDumpProducerService extends ObserveService{ + + byte[] getReferentialDump(); + + byte[] getDataDump(String... importDataIds); + +} 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 dac2dc6..1e41b82 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 @@ -1,6 +1,9 @@ package fr.ird.observe.services.service; import fr.ird.observe.services.ObserveService; +import fr.ird.observe.services.dto.DataSourceCreateConfigurationDto; + +import java.io.IOException; /** * Created on 21/08/15. @@ -11,7 +14,7 @@ public interface DataSourceService extends ObserveService { boolean exist(); - void create(); + void create(DataSourceCreateConfigurationDto dataSourceCreateConfiguration) throws IOException; void open(); diff --git a/observe-services-configuration-api/pom.xml b/observe-services-configuration-api/pom.xml index 07c10a3..ebce096 100644 --- a/observe-services-configuration-api/pom.xml +++ b/observe-services-configuration-api/pom.xml @@ -17,13 +17,6 @@ <dependencies> - <!-- sibling dependencies --> - <dependency> - <groupId>${project.groupId}</groupId> - <artifactId>observe-services-model</artifactId> - <version>${project.version}</version> - </dependency> - <!-- commons dependencies --> <dependency> 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 b611428..8b898a2 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 @@ -7,4 +7,6 @@ package fr.ird.observe.services.configuration; */ public interface ObserveDataSourceConfiguration { + String getLabel(); + } 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 cb8de02..aab2ebe 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 @@ -56,6 +56,7 @@ public abstract class ObserveDataSourceConfigurationTopiaSupport implements Obse this.password = password; } + @Override public String getLabel() { return label; } diff --git a/observe-services-model/pom.xml b/observe-services-model/pom.xml index 7c25fff..a0486c1 100644 --- a/observe-services-model/pom.xml +++ b/observe-services-model/pom.xml @@ -39,6 +39,13 @@ <dependencies> + <!-- sibling dependencies --> + <dependency> + <groupId>${project.groupId}</groupId> + <artifactId>observe-services-configuration-api</artifactId> + <version>${project.version}</version> + </dependency> + <!-- Nuiton --> <dependency> <groupId>org.nuiton</groupId> diff --git a/observe-services-model/src/main/java/fr/ird/observe/services/dto/DataSourceCreateConfigurationDto.java b/observe-services-model/src/main/java/fr/ird/observe/services/dto/DataSourceCreateConfigurationDto.java new file mode 100644 index 0000000..6c1580c --- /dev/null +++ b/observe-services-model/src/main/java/fr/ird/observe/services/dto/DataSourceCreateConfigurationDto.java @@ -0,0 +1,81 @@ +package fr.ird.observe.services.dto; + +import com.google.common.base.Optional; +import com.google.common.base.Preconditions; +import fr.ird.observe.services.configuration.ObserveDataSourceConfiguration; + +/** + * Created on 22/08/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class DataSourceCreateConfigurationDto extends AbstractObserveDto { + + private static final long serialVersionUID = 1L; + + /** + * Le contenu de la base à importer (Optionel). + */ + protected Optional<byte[]> optionalImportDatabase; + + /** + * Une configuration de la dataSource à utiliser pour importer le référentiel (Optionel). + */ + protected Optional<ObserveDataSourceConfiguration> optionalImportReferentialDataSourceConfiguration; + + /** + * Une configuration de la dataSource à utiliser pour importer des données (Optionel). + */ + protected Optional<ObserveDataSourceConfiguration> optionalImportDataDataSourceConfiguration; + + /** + * Les données à importer (ids des marées) (Optionel). + */ + protected Optional<String[]> optionalImportDataIds; + + public boolean isImportDatabase() { + return optionalImportDatabase.isPresent(); + } + + public boolean isImportReferential() { + return optionalImportReferentialDataSourceConfiguration.isPresent(); + } + + public boolean isImportData() { + return optionalImportDataDataSourceConfiguration.isPresent(); + } + + public byte[] getImportDatabase() { + return optionalImportDatabase.get(); + } + + public ObserveDataSourceConfiguration getImportReferentialDataSourceConfiguration() { + return optionalImportReferentialDataSourceConfiguration.get(); + } + + public ObserveDataSourceConfiguration getImportDataDataSourceConfiguration() { + return optionalImportDataDataSourceConfiguration.get(); + } + + public String[] getImportDataIds() { + return optionalImportDataIds.get(); + } + + public void setImportDatabase(byte... importDatabase) { + Preconditions.checkNotNull(importDatabase, "'importDatabase' can't be null."); + this.optionalImportDatabase = Optional.of(importDatabase); + } + + public void setImportReferentialDataSourceConfiguration(ObserveDataSourceConfiguration importReferentialDataSourceConfiguration) { + Preconditions.checkNotNull(importReferentialDataSourceConfiguration, "'importReferentialDataSourceConfiguration' can't be null."); + this.optionalImportReferentialDataSourceConfiguration = Optional.of(importReferentialDataSourceConfiguration); + } + + public void setImportDataConfiguration(ObserveDataSourceConfiguration importDataDataSourceConfiguration, String... importDataIds) { + Preconditions.checkNotNull(importDataDataSourceConfiguration, "'importDataDataSourceConfiguration' can't be null."); + Preconditions.checkNotNull(importDataIds, "'importDataIds' can't be null."); + this.optionalImportDataDataSourceConfiguration = Optional.of(importDataDataSourceConfiguration); + this.optionalImportDataIds = Optional.of(importDataIds); + } + +} 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 960a636..5bec7f8 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 @@ -2,9 +2,12 @@ package fr.ird.observe.services; import fr.ird.observe.ObserveTopiaApplicationContext; import fr.ird.observe.ObserveTopiaPersistenceContext; +import fr.ird.observe.services.configuration.ObserveDataSourceConfiguration; import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationTopiaSupport; import fr.ird.observe.services.dto.constants.ReferentialLocale; +import java.io.File; +import java.io.IOException; import java.util.Date; /** @@ -16,6 +19,8 @@ public class ObserveServiceContextTopia implements ObserveServiceContext { protected ObserveServiceApplicationContext applicationContext; + protected ObserveServiceFactory serviceFactory; + protected ObserveDataSourceConfigurationTopiaSupport dataSourceConfiguration; protected ObserveTopiaPersistenceContext topiaPersistenceContext; @@ -36,8 +41,23 @@ public class ObserveServiceContextTopia implements ObserveServiceContext { return new Date(); } - public ObserveServiceApplicationContext getApplicationContext() { - return applicationContext; + @Override + public <S extends ObserveService> S newService(Class<S> serviceType) { + return serviceFactory.newService(applicationContext, dataSourceConfiguration, serviceType); + } + + @Override + public <S extends ObserveService> S newService(ObserveDataSourceConfiguration dataSourceConfiguration, Class<S> serviceType) { + return applicationContext.getMainServiceFactory().newService(applicationContext, dataSourceConfiguration, serviceType); + } + + @Override + public File createTemporaryDirectory(String prefix) throws IOException { + return applicationContext.createTemporaryDirectory(prefix); + } + + public ObserveDataSourceConfigurationTopiaSupport getDataSourceConfiguration() { + return dataSourceConfiguration; } public ObserveTopiaPersistenceContext getTopiaPersistenceContext() { @@ -60,10 +80,12 @@ public class ObserveServiceContextTopia implements ObserveServiceContext { this.dataSourceConfiguration = dataSourceConfiguration; } + public void setServiceFactory(ObserveServiceFactory serviceFactory) { + this.serviceFactory = serviceFactory; + } public void closeTopiaPersistenceContext() { topiaPersistenceContext.close(); topiaPersistenceContext = null; } - } 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 9da62c1..ccf5e1b 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,23 @@ 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.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.google.common.reflect.Reflection; import fr.ird.observe.ObserveTopiaApplicationContext; -import fr.ird.observe.ObserveTopiaIdFactory; import fr.ird.observe.ObserveTopiaPersistenceContext; -import fr.ird.observe.entities.migration.H2DataSourceMigration; -import fr.ird.observe.entities.migration.ObserveMigrationEngine; -import fr.ird.observe.entities.migration.PGDataSourceMigration; import fr.ird.observe.services.configuration.ObserveDataSourceConfiguration; -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.persistence.BeanTopiaConfiguration; -import org.nuiton.topia.persistence.TopiaApplicationContext; -import org.nuiton.topia.persistence.TopiaConfiguration; -import org.nuiton.topia.persistence.jdbc.JdbcConfiguration; -import org.nuiton.topia.persistence.jdbc.JdbcConfigurationBuilder; -import org.nuiton.topia.replication.TopiaReplicationServiceImpl; import java.io.Closeable; -import java.io.File; import java.lang.reflect.InvocationHandler; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; -import java.util.Collections; import java.util.Set; -import java.util.concurrent.ExecutionException; /** * FIXME Supprimer les DataSourceConfig et DataSource et directement utiliser TopiaConfiguration. @@ -46,71 +28,11 @@ import java.util.concurrent.ExecutionException; */ public class ObserveServiceFactoryTopia extends ObserveServiceFactorySupport implements Closeable { - /** l'url d'acces a la base locale */ - public static final String h2LocalUrl = - "jdbc:h2:file:%s;" + - // on peut aussi utiliser file, socket - "FILE_LOCK=file;" + - //1 or 2 is needed to restore avec crash - // 0: logging is disabled (faster), - // 1: logging of the data is enabled, but logging of the index - // changes is disabled (default), 2: logging of both data and index - // changes are enabled - "LOG=0;" + - // on peut aussi utiliser hsqldb, mysql ou postgresql - "MODE=postgresql;" + - //"MODE=hsqldb;" + - // Sets the default lock timeout (in milliseconds) in this - // database that is used for the new sessions. - "DEFAULT_LOCK_TIMEOUT=2000;" + - // -1: the database is never closed until the close delay is set to - // some other rev or SHUTDOWN is called., 0: no delay (default; the - // database is closed if the last connection to it is closed)., n: - // the database is left open for n second after the last connection - // is closed. - "DB_CLOSE_DELAY=0;" + - // 0: no locking (should only be used for testing), - // 1: table level locking (default), - // 2: table level locking with garbage collection (if the - // application does not close all connections). - // LOCK_MODE 3 (READ_COMMITTED). Table level locking, but only when - // writing (no read locks). - "LOCK_MODE=3;" + - // Levels: 0=off, 1=error, 2=info, 3=debug. - "TRACE_LEVEL_FILE=0;" + - // on system.out: 0=off, 1=error, 2=info, 3=debug. - "TRACE_LEVEL_SYSTEM_OUT=0;" + - // maximumn cache to improve performance... - "CACHE_SIZE=65536"; - /** Logger. */ private static final Log log = LogFactory.getLog(ObserveServiceFactoryTopia.class); protected static final LoadingCache<Class<?>, Class<?>> serviceTypeCache = newServiceImplementationTypesCache("Topia"); - protected final LoadingCache<ObserveDataSourceConfigurationTopiaSupport, ObserveTopiaApplicationContext> topiaApplicationContextCache = CacheBuilder - .newBuilder() - .build(new CacheLoader<ObserveDataSourceConfigurationTopiaSupport, ObserveTopiaApplicationContext>() { - - @Override - public ObserveTopiaApplicationContext load(ObserveDataSourceConfigurationTopiaSupport key) throws Exception { - - ObserveTopiaApplicationContext dataSource = null; - if (key instanceof ObserveDataSourceConfigurationTopiaH2) { - dataSource = createTopiaApplicationContext((ObserveDataSourceConfigurationTopiaH2) key); - } - - if (key instanceof ObserveDataSourceConfigurationTopiaPG) { - dataSource = createTopiaApplicationContext((ObserveDataSourceConfigurationTopiaPG) key); - } - - Preconditions.checkState(dataSource != null, "No dataSource found for configuration: " + key); - return dataSource; - } - }); - - protected final JdbcConfigurationBuilder jdbcConfigurationBuilder = new JdbcConfigurationBuilder(); - @Override public <S extends ObserveService> boolean accept(ObserveDataSourceConfiguration dataSourceConfiguration, Class<S> serviceType) { @@ -143,95 +65,16 @@ public class ObserveServiceFactoryTopia extends ObserveServiceFactorySupport imp ObserveServiceContextTopia serviceContext = new ObserveServiceContextTopia(); serviceContext.setApplicationContext(applicationContext); - ObserveDataSourceConfigurationTopiaSupport dataSourceConfigurationTopia = dataSourceConfiguration; - serviceContext.setDataSourceConfiguration(dataSourceConfigurationTopia); + serviceContext.setDataSourceConfiguration(dataSourceConfiguration); + serviceContext.setServiceFactory(this); - ObserveTopiaApplicationContext dataSource = getTopiaApplicationContext(dataSourceConfigurationTopia); - serviceContext.setTopiaApplicationContext(dataSource); + ObserveTopiaApplicationContext topiaApplicationContext = ObserveTopiaApplicationContextFactory.getTopiaApplicationContext(dataSourceConfiguration); + serviceContext.setTopiaApplicationContext(topiaApplicationContext); return serviceContext; } - protected ObserveTopiaApplicationContext createTopiaApplicationContext(ObserveDataSourceConfigurationTopiaPG configuration) { - - TopiaConfiguration topiaConfiguration = getTopiaConfiguration(configuration); - - if (log.isInfoEnabled()) { - log.info("PG Topia configuration: " + topiaConfiguration); - } - - ObserveTopiaApplicationContext topiaApplicationContext = new ObserveTopiaApplicationContext(topiaConfiguration); - return topiaApplicationContext; - - } - - protected TopiaConfiguration getTopiaConfiguration(ObserveDataSourceConfigurationTopiaPG configuration) { - - JdbcConfiguration jdbcConfiguration = getJdbcConfiguration(configuration, configuration.getJdbcUrl()); - - BeanTopiaConfiguration topiaConfiguration = new BeanTopiaConfiguration(jdbcConfiguration); - topiaConfiguration.setTopiaIdFactoryClass(ObserveTopiaIdFactory.class); - topiaConfiguration.setInitSchema(false); - topiaConfiguration.setValidateSchema(false); - - ImmutableMap<String, String> migrationServiceConfiguration = ImmutableMap.of(ObserveTopiaApplicationContext.MIGRATION_SERVICE_NAME + '.' + ObserveMigrationEngine.MIGRATION_CALLBACK, PGDataSourceMigration.class.getName()); - topiaConfiguration.addDeclaredService(ObserveTopiaApplicationContext.MIGRATION_SERVICE_NAME, ObserveMigrationEngine.class, migrationServiceConfiguration); - topiaConfiguration.addDeclaredService(ObserveTopiaApplicationContext.REPLICATION_SERVICE_NAME, TopiaReplicationServiceImpl.class, Collections.<String, String>emptyMap()); - return topiaConfiguration; - } - - protected JdbcConfiguration getJdbcConfiguration(ObserveDataSourceConfigurationTopiaPG configuration, String jdbcUrl) { - return jdbcConfigurationBuilder.forH2Database(jdbcUrl, - configuration.getUsername(), - String.valueOf(configuration.getPassword())); - } - - protected ObserveTopiaApplicationContext createTopiaApplicationContext(ObserveDataSourceConfigurationTopiaH2 configuration) { - - TopiaConfiguration topiaConfiguration = getTopiaConfiguration(configuration); - - if (log.isInfoEnabled()) { - log.info("H2 Topia configuration: " + topiaConfiguration); - } - ObserveTopiaApplicationContext topiaApplicationContext = new ObserveTopiaApplicationContext(topiaConfiguration); - return topiaApplicationContext; - - } - - protected TopiaConfiguration getTopiaConfiguration(ObserveDataSourceConfigurationTopiaH2 configuration) { - - String dbPath = new File(configuration.getDirectory(), configuration.getDbName()).getPath(); - - String jdbcUrl = String.format(h2LocalUrl, dbPath); - - JdbcConfiguration jdbcConfiguration = jdbcConfigurationBuilder.forH2Database(jdbcUrl, - configuration.getUsername(), - String.valueOf(configuration.getPassword())); - - BeanTopiaConfiguration topiaConfiguration = new BeanTopiaConfiguration(jdbcConfiguration); - topiaConfiguration.setTopiaIdFactoryClass(ObserveTopiaIdFactory.class); - topiaConfiguration.setInitSchema(false); - topiaConfiguration.setValidateSchema(false); - - ImmutableMap<String, String> migrationServiceConfiguration = ImmutableMap.of(ObserveTopiaApplicationContext.MIGRATION_SERVICE_NAME + '.' + ObserveMigrationEngine.MIGRATION_CALLBACK, H2DataSourceMigration.class.getName()); - topiaConfiguration.addDeclaredService(ObserveTopiaApplicationContext.MIGRATION_SERVICE_NAME, ObserveMigrationEngine.class, migrationServiceConfiguration); - topiaConfiguration.addDeclaredService(ObserveTopiaApplicationContext.REPLICATION_SERVICE_NAME, TopiaReplicationServiceImpl.class, Collections.<String, String>emptyMap()); - return topiaConfiguration; - } - - protected ObserveTopiaApplicationContext getTopiaApplicationContext(ObserveDataSourceConfigurationTopiaSupport dataSourceConfiguration) { - - try { - ObserveTopiaApplicationContext dataSource = topiaApplicationContextCache.get(dataSourceConfiguration); - return dataSource; - } catch (ExecutionException e) { - //FIXME Avoir une vraie execption - throw new RuntimeException("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); @@ -243,20 +86,7 @@ public class ObserveServiceFactoryTopia extends ObserveServiceFactorySupport imp @Override public void close() { - for (TopiaApplicationContext dataSource : topiaApplicationContextCache.asMap().values()) { - - if (!dataSource.isClosed()) { - try { - dataSource.close(); - } catch (Exception e) { - if (log.isErrorEnabled()) { - log.error("Could not close data source: " + dataSource, e); - } - } - } - } - - topiaApplicationContextCache.invalidateAll(); + ObserveTopiaApplicationContextFactory.close(); } diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/ObserveTopiaApplicationContextFactory.java b/observe-services-topia/src/main/java/fr/ird/observe/services/ObserveTopiaApplicationContextFactory.java new file mode 100644 index 0000000..7b5c316 --- /dev/null +++ b/observe-services-topia/src/main/java/fr/ird/observe/services/ObserveTopiaApplicationContextFactory.java @@ -0,0 +1,230 @@ +package fr.ird.observe.services; + +import com.google.common.base.Optional; +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.ImmutableMap; +import fr.ird.observe.ObserveTopiaApplicationContext; +import fr.ird.observe.ObserveTopiaIdFactory; +import fr.ird.observe.entities.migration.H2DataSourceMigration; +import fr.ird.observe.entities.migration.ObserveMigrationEngine; +import fr.ird.observe.entities.migration.PGDataSourceMigration; +import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationTopiaH2; +import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationTopiaPG; +import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationTopiaSupport; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.topia.persistence.BeanTopiaConfiguration; +import org.nuiton.topia.persistence.TopiaApplicationContext; +import org.nuiton.topia.persistence.TopiaConfiguration; +import org.nuiton.topia.persistence.jdbc.JdbcConfiguration; +import org.nuiton.topia.persistence.jdbc.JdbcConfigurationBuilder; +import org.nuiton.topia.replication.TopiaReplicationServiceImpl; + +import java.io.File; +import java.util.Collections; +import java.util.concurrent.ExecutionException; + +/** + * Created on 23/08/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class ObserveTopiaApplicationContextFactory { + + /** Logger. */ + private static final Log log = LogFactory.getLog(ObserveTopiaApplicationContextFactory.class); + + /** l'url d'acces a la base locale */ + public static final String H2_LOCAL_URL = + "jdbc:h2:file:%s;" + + // on peut aussi utiliser file, socket + "FILE_LOCK=file;" + + //1 or 2 is needed to restore avec crash + // 0: logging is disabled (faster), + // 1: logging of the data is enabled, but logging of the index + // changes is disabled (default), 2: logging of both data and index + // changes are enabled + "LOG=0;" + + // on peut aussi utiliser hsqldb, mysql ou postgresql + "MODE=postgresql;" + + //"MODE=hsqldb;" + + // Sets the default lock timeout (in milliseconds) in this + // database that is used for the new sessions. + "DEFAULT_LOCK_TIMEOUT=2000;" + + // -1: the database is never closed until the close delay is set to + // some other rev or SHUTDOWN is called., 0: no delay (default; the + // database is closed if the last connection to it is closed)., n: + // the database is left open for n second after the last connection + // is closed. + "DB_CLOSE_DELAY=0;" + + // 0: no locking (should only be used for testing), + // 1: table level locking (default), + // 2: table level locking with garbage collection (if the + // application does not close all connections). + // LOCK_MODE 3 (READ_COMMITTED). Table level locking, but only when + // writing (no read locks). + "LOCK_MODE=3;" + + // Levels: 0=off, 1=error, 2=info, 3=debug. + "TRACE_LEVEL_FILE=0;" + + // on system.out: 0=off, 1=error, 2=info, 3=debug. + "TRACE_LEVEL_SYSTEM_OUT=0;" + + // maximumn cache to improve performance... + "CACHE_SIZE=65536"; + + protected static final JdbcConfigurationBuilder JDBC_CONFIGURATION_BUILDER = new JdbcConfigurationBuilder(); + + protected static final LoadingCache<ObserveDataSourceConfigurationTopiaSupport, ObserveTopiaApplicationContext> TOPIA_APPLICATION_CONTEXT_CACHE = CacheBuilder + .newBuilder() + .build(new CacheLoader<ObserveDataSourceConfigurationTopiaSupport, ObserveTopiaApplicationContext>() { + + @Override + public ObserveTopiaApplicationContext load(ObserveDataSourceConfigurationTopiaSupport key) throws Exception { + + ObserveTopiaApplicationContext dataSource = createTopiaApplicationContext(key); + return dataSource; + + } + }); + + public static ObserveTopiaApplicationContext getTopiaApplicationContext(ObserveDataSourceConfigurationTopiaSupport dataSourceConfiguration) { + + try { + ObserveTopiaApplicationContext topiaApplicationContext = TOPIA_APPLICATION_CONTEXT_CACHE.get(dataSourceConfiguration); + return topiaApplicationContext; + } catch (ExecutionException e) { + //FIXME Avoir une vraie execption + throw new RuntimeException("Could not get dataSource for configuration: " + dataSourceConfiguration, e); + } + + } + + public static Optional<ObserveTopiaApplicationContext> getTopiaApplicationContextIfPresent(ObserveDataSourceConfigurationTopiaSupport dataSourceConfiguration) { + + ObserveTopiaApplicationContext topiaApplicationContext = TOPIA_APPLICATION_CONTEXT_CACHE.getIfPresent(dataSourceConfiguration); + return Optional.fromNullable(topiaApplicationContext); + + } + + public static void close() { + + for (TopiaApplicationContext dataSource : TOPIA_APPLICATION_CONTEXT_CACHE.asMap().values()) { + + if (!dataSource.isClosed()) { + try { + dataSource.close(); + } catch (Exception e) { + if (log.isErrorEnabled()) { + log.error("Could not close data source: " + dataSource, e); + } + } + } + } + + TOPIA_APPLICATION_CONTEXT_CACHE.invalidateAll(); + + } + + protected static ObserveTopiaApplicationContext createTopiaApplicationContext(ObserveDataSourceConfigurationTopiaSupport configuration) { + + ObserveTopiaApplicationContext topiaApplicationContext = null; + + if (configuration instanceof ObserveDataSourceConfigurationTopiaH2) { + topiaApplicationContext = createTopiaApplicationContext((ObserveDataSourceConfigurationTopiaH2) configuration); + } else if (configuration instanceof ObserveDataSourceConfigurationTopiaPG) { + topiaApplicationContext = createTopiaApplicationContext((ObserveDataSourceConfigurationTopiaPG) configuration); + } + Preconditions.checkState(topiaApplicationContext != null, "Did not find how to create ObserveTopiaApplicationContext from: " + configuration); + return topiaApplicationContext; + + } + + protected static TopiaConfiguration createTopiaConfiguration(ObserveDataSourceConfigurationTopiaPG configuration) { + + JdbcConfiguration jdbcConfiguration = createJdbcConfiguration(configuration, configuration.getJdbcUrl()); + + BeanTopiaConfiguration topiaConfiguration = new BeanTopiaConfiguration(jdbcConfiguration); + topiaConfiguration.setTopiaIdFactoryClass(ObserveTopiaIdFactory.class); + topiaConfiguration.setInitSchema(false); + topiaConfiguration.setValidateSchema(false); + + ImmutableMap<String, String> migrationServiceConfiguration = ImmutableMap.of(ObserveTopiaApplicationContext.MIGRATION_SERVICE_NAME + '.' + ObserveMigrationEngine.MIGRATION_CALLBACK, PGDataSourceMigration.class.getName()); + topiaConfiguration.addDeclaredService(ObserveTopiaApplicationContext.MIGRATION_SERVICE_NAME, ObserveMigrationEngine.class, migrationServiceConfiguration); + topiaConfiguration.addDeclaredService(ObserveTopiaApplicationContext.REPLICATION_SERVICE_NAME, TopiaReplicationServiceImpl.class, Collections.<String, String>emptyMap()); + return topiaConfiguration; + + } + + protected static TopiaConfiguration createTopiaConfiguration(ObserveDataSourceConfigurationTopiaH2 configuration) { + + String dbPath = new File(configuration.getDirectory(), configuration.getDbName()).getPath(); + + String jdbcUrl = String.format(H2_LOCAL_URL, dbPath); + + JdbcConfiguration jdbcConfiguration = JDBC_CONFIGURATION_BUILDER.forH2Database(jdbcUrl, + configuration.getUsername(), + String.valueOf(configuration.getPassword())); + + BeanTopiaConfiguration topiaConfiguration = new BeanTopiaConfiguration(jdbcConfiguration); + topiaConfiguration.setTopiaIdFactoryClass(ObserveTopiaIdFactory.class); + topiaConfiguration.setInitSchema(false); + topiaConfiguration.setValidateSchema(false); + + ImmutableMap<String, String> migrationServiceConfiguration = ImmutableMap.of(ObserveTopiaApplicationContext.MIGRATION_SERVICE_NAME + '.' + ObserveMigrationEngine.MIGRATION_CALLBACK, H2DataSourceMigration.class.getName()); + topiaConfiguration.addDeclaredService(ObserveTopiaApplicationContext.MIGRATION_SERVICE_NAME, ObserveMigrationEngine.class, migrationServiceConfiguration); + topiaConfiguration.addDeclaredService(ObserveTopiaApplicationContext.REPLICATION_SERVICE_NAME, TopiaReplicationServiceImpl.class, Collections.<String, String>emptyMap()); + return topiaConfiguration; + + } + + protected static JdbcConfiguration createJdbcConfiguration(ObserveDataSourceConfigurationTopiaPG configuration, String jdbcUrl) { + return JDBC_CONFIGURATION_BUILDER.forH2Database(jdbcUrl, + configuration.getUsername(), + String.valueOf(configuration.getPassword())); + } + + protected static ObserveTopiaApplicationContext createTopiaApplicationContext(ObserveDataSourceConfigurationTopiaPG configuration) { + + TopiaConfiguration topiaConfiguration = createTopiaConfiguration(configuration); + + if (log.isInfoEnabled()) { + log.info("PG Topia configuration: " + topiaConfiguration); + } + + ObserveTopiaApplicationContext topiaApplicationContext = new MyObserveTopiaApplicationContext(topiaConfiguration); + return topiaApplicationContext; + + } + + protected static ObserveTopiaApplicationContext createTopiaApplicationContext(ObserveDataSourceConfigurationTopiaH2 configuration) { + + TopiaConfiguration topiaConfiguration = createTopiaConfiguration(configuration); + + if (log.isInfoEnabled()) { + log.info("H2 Topia configuration: " + topiaConfiguration); + } + ObserveTopiaApplicationContext topiaApplicationContext = new MyObserveTopiaApplicationContext(topiaConfiguration); + return topiaApplicationContext; + + } + + protected static class MyObserveTopiaApplicationContext extends ObserveTopiaApplicationContext { + + public MyObserveTopiaApplicationContext(TopiaConfiguration topiaConfiguration) { + super(topiaConfiguration); + } + + @Override + public void close() { + try { + super.close(); + } finally { + // remove from cache + TOPIA_APPLICATION_CONTEXT_CACHE.invalidate(getConfiguration()); + } + } + + } +} diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/service/DataSourceDumpProducerServiceTopia.java b/observe-services-topia/src/main/java/fr/ird/observe/services/service/DataSourceDumpProducerServiceTopia.java new file mode 100644 index 0000000..c4fb15f --- /dev/null +++ b/observe-services-topia/src/main/java/fr/ird/observe/services/service/DataSourceDumpProducerServiceTopia.java @@ -0,0 +1,21 @@ +package fr.ird.observe.services.service; + +import fr.ird.observe.services.ObserveServiceTopia; + +/** + * Created on 23/08/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class DataSourceDumpProducerServiceTopia extends ObserveServiceTopia implements DataSourceDumpProducerService { + + @Override + public byte[] getReferentialDump() { + return new byte[0]; + } + + @Override + public byte[] getDataDump(String... importDataIds) { + return new byte[0]; + } +} 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 f3b58e6..b8bc87a 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 @@ -1,7 +1,21 @@ package fr.ird.observe.services.service; -import fr.ird.observe.services.ObserveServiceContext; +import com.google.common.base.Optional; +import fr.ird.observe.ObserveTopiaApplicationContext; import fr.ird.observe.services.ObserveServiceTopia; +import fr.ird.observe.services.ObserveTopiaApplicationContextFactory; +import fr.ird.observe.services.configuration.ObserveDataSourceConfiguration; +import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationTopiaSupport; +import fr.ird.observe.services.dto.DataSourceCreateConfigurationDto; +import org.nuiton.topia.persistence.jdbc.JdbcH2Helper; + +import java.io.BufferedInputStream; +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Files; +import java.nio.file.Path; /** * Created on 21/08/15. @@ -12,28 +26,87 @@ public class DataSourceServiceTopia extends ObserveServiceTopia implements DataS @Override public boolean exist() { + + ObserveDataSourceConfigurationTopiaSupport dataSourceConfiguration = serviceContext.getDataSourceConfiguration(); return false; } @Override - public void create() { + public void create(DataSourceCreateConfigurationDto dataSourceCreateConfiguration) throws IOException { + + ObserveDataSourceConfigurationTopiaSupport dataSourceConfiguration = serviceContext.getDataSourceConfiguration(); + ObserveTopiaApplicationContext topiaApplicationContext = ObserveTopiaApplicationContextFactory.getTopiaApplicationContext(dataSourceConfiguration); + + JdbcH2Helper jdbcH2Helper = new JdbcH2Helper(topiaApplicationContext.getConfiguration()); + + if (dataSourceCreateConfiguration.isImportDatabase()) { + + byte[] importDatabase = dataSourceCreateConfiguration.getImportDatabase(); + + executeSqlScript(jdbcH2Helper, "ImportDatabase_" + dataSourceConfiguration.getLabel(), importDatabase); + + } else { + + // Creer une base + + //FIXME Voir si ça convient + topiaApplicationContext.createSchema(); + + if (dataSourceCreateConfiguration.isImportReferential()) { + + ObserveDataSourceConfiguration importDataSourceConfiguration = dataSourceCreateConfiguration.getImportReferentialDataSourceConfiguration(); + + DataSourceDumpProducerService dumpProducerService = serviceContext.newService(importDataSourceConfiguration, DataSourceDumpProducerService.class); + + byte[] referentialDump = dumpProducerService.getReferentialDump(); + + executeSqlScript(jdbcH2Helper, "ImportReferential_" + importDataSourceConfiguration.getLabel(), referentialDump); + + } + + if (dataSourceCreateConfiguration.isImportData()) { + + ObserveDataSourceConfiguration importDataSourceConfiguration = dataSourceCreateConfiguration.getImportDataDataSourceConfiguration(); + String[] importDataIds = dataSourceCreateConfiguration.getImportDataIds(); + + DataSourceDumpProducerService dumpProducerService = serviceContext.newService(importDataSourceConfiguration, DataSourceDumpProducerService.class); + + byte[] dataDump = dumpProducerService.getDataDump(importDataIds); + + executeSqlScript(jdbcH2Helper, "ImportData_" + importDataSourceConfiguration.getLabel(), dataDump); + + } + + } } @Override public void open() { + ObserveDataSourceConfigurationTopiaSupport dataSourceConfiguration = serviceContext.getDataSourceConfiguration(); + ObserveTopiaApplicationContextFactory.getTopiaApplicationContext(dataSourceConfiguration); + } @Override public void close() { + ObserveDataSourceConfigurationTopiaSupport dataSourceConfiguration = serviceContext.getDataSourceConfiguration(); + Optional<ObserveTopiaApplicationContext> optionalTopiaApplicationContext = ObserveTopiaApplicationContextFactory.getTopiaApplicationContextIfPresent(dataSourceConfiguration); + + if (optionalTopiaApplicationContext.isPresent()) { + optionalTopiaApplicationContext.get().close(); + } + } @Override public boolean canConnect() { + ObserveDataSourceConfigurationTopiaSupport dataSourceConfiguration = serviceContext.getDataSourceConfiguration(); return false; + } @Override @@ -41,8 +114,18 @@ public class DataSourceServiceTopia extends ObserveServiceTopia implements DataS } - @Override - public void setServiceContext(ObserveServiceContext serviceContext) { + protected void executeSqlScript(JdbcH2Helper jdbcH2Helper, String temporaryFilePrefix, byte... content) throws IOException { + + File temporaryDirectory = serviceContext.createTemporaryDirectory(temporaryFilePrefix); + + Path sqlScript = new File(temporaryDirectory, "script.sql").toPath(); + + try (InputStream inputSream = new BufferedInputStream(new ByteArrayInputStream(content))) { + Files.copy(inputSream, sqlScript); + } + + jdbcH2Helper.restore(sqlScript.toFile()); } + } 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 deleted file mode 100644 index 5f784c5..0000000 --- a/observe-services-topia/src/test/java/fr/ird/observe/services/ObserveServiceFactoryTopiaTaiste.java +++ /dev/null @@ -1,30 +0,0 @@ -package fr.ird.observe.services; - -import fr.ird.observe.ObserveTopiaApplicationContext; -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 ObserveTopiaApplicationContext getExistingDataSource(ObserveDataSourceConfigurationTopiaH2 dataSourceConfiguration) { - ObserveTopiaApplicationContext dataSource = topiaApplicationContextCache.getIfPresent(dataSourceConfiguration); - return dataSource; - } - - @Override - protected ObserveTopiaApplicationContext getTopiaApplicationContext(ObserveDataSourceConfigurationTopiaSupport dataSourceConfiguration) { - - ObserveTopiaApplicationContext dataSource = super.getTopiaApplicationContext(dataSourceConfiguration); - - if (!dataSource.isClosed()) { - dataSource.close(); - } - 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 e15620e..3743844 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 @@ -1,7 +1,7 @@ package fr.ird.observe.services.service; import fr.ird.observe.services.ObserveServiceApplicationContext; -import fr.ird.observe.services.ObserveServiceFactoryTopiaTaiste; +import fr.ird.observe.services.ObserveServiceFactoryTopia; import fr.ird.observe.services.dto.constants.ReferentialLocale; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -24,12 +24,12 @@ public class ApplicationContextResource implements TestRule { protected final ObserveServiceApplicationContext serviceApplicationContext; - protected final ObserveServiceFactoryTopiaTaiste serviceFactory; + protected final ObserveServiceFactoryTopia serviceFactory; public ApplicationContextResource(Version databaseVersion) { this.databaseVersion = databaseVersion; this.serviceApplicationContext = new ObserveServiceApplicationContext(); - this.serviceFactory = new ObserveServiceFactoryTopiaTaiste(); + this.serviceFactory = new ObserveServiceFactoryTopia(); } public String getScriptPath(String classifier) { @@ -40,7 +40,7 @@ public class ApplicationContextResource implements TestRule { return serviceApplicationContext; } - public ObserveServiceFactoryTopiaTaiste getServiceFactory() { + public ObserveServiceFactoryTopia getServiceFactory() { return serviceFactory; } @@ -74,6 +74,7 @@ public class ApplicationContextResource implements TestRule { // ObserveServiceTopia.init(); serviceApplicationContext.setReferentialLocale(ReferentialLocale.FR); + serviceApplicationContext.setMainServiceFactory(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 f7b899c..90a4597 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 @@ -2,7 +2,7 @@ package fr.ird.observe.services.service; import fr.ird.observe.ObserveTopiaApplicationContext; import fr.ird.observe.ObserveTopiaPersistenceContext; -import fr.ird.observe.services.ObserveServiceFactoryTopiaTaiste; +import fr.ird.observe.services.ObserveTopiaApplicationContextFactory; import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationTopiaH2; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -42,13 +42,13 @@ public class DataSourceResource implements TestRule { return dataSourceConfiguration; } - public ObserveTopiaPersistenceContext newTransaction(String name) { + public ObserveTopiaPersistenceContext newTransaction(String name) { - ObserveServiceFactoryTopiaTaiste serviceFactory = applicationContextResource.getServiceFactory(); - ObserveTopiaApplicationContext dataSource = serviceFactory.getExistingDataSource(dataSourceConfiguration); + ObserveTopiaApplicationContext dataSource = ObserveTopiaApplicationContextFactory.getTopiaApplicationContext(dataSourceConfiguration); ObserveTopiaPersistenceContext persistenceContext = dataSource.newPersistenceContext(); transactions.put(name, persistenceContext); return persistenceContext; + } public Statement apply(final Statement base, final Description description) { @@ -80,8 +80,7 @@ public class DataSourceResource implements TestRule { // File localDbFile = TestHelper.newLocalDB(methodName); - ObserveServiceFactoryTopiaTaiste serviceFactory = applicationContextResource.getServiceFactory(); - ObserveTopiaApplicationContext existingDataSource = serviceFactory.getExistingDataSource(dataSourceConfiguration); + ObserveTopiaApplicationContext dataSource = ObserveTopiaApplicationContextFactory.getTopiaApplicationContext(dataSourceConfiguration); // // H2DataSource dataSource = DBTestHelper.createAndOpenFromDump( @@ -116,30 +115,11 @@ public class DataSourceResource implements TestRule { log.debug("Ends " + testClass.getName() + "::" + methodName); } - ObserveTopiaApplicationContext dataSource = getDataSource(); - if (dataSource != null && dataSource.isOpen()) { - - for (Map.Entry<String, ObserveTopiaPersistenceContext> entry : transactions.entrySet()) { - ObserveTopiaPersistenceContext topiaContext = entry.getValue(); - if (!topiaContext.isClosed()) { - String transactionKey = entry.getKey(); - try { - topiaContext.close(); - } catch (Exception e) { - if (log.isErrorEnabled()) { - log.error("Could not close transaction: " + transactionKey, e); - } - } - } - } - - } - applicationContextResource.getServiceFactory().close(); } - private ObserveTopiaApplicationContext getDataSource() { - return applicationContextResource.getServiceFactory().getExistingDataSource(dataSourceConfiguration); + private ObserveTopiaApplicationContext getTopiaApplicationContext() { + return ObserveTopiaApplicationContextFactory.getTopiaApplicationContext(dataSourceConfiguration); } } 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 new file mode 100644 index 0000000..fdfdb25 --- /dev/null +++ b/observe-services-topia/src/test/java/fr/ird/observe/services/service/DataSourceServiceTopiaTest.java @@ -0,0 +1,50 @@ +package fr.ird.observe.services.service; + +import fr.ird.observe.entities.migration.H2DataSourceMigration; +import fr.ird.observe.services.ObserveServiceApplicationContext; +import fr.ird.observe.services.ObserveServiceFactoryTopia; +import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationTopiaH2; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.junit.Before; +import org.junit.ClassRule; +import org.junit.Rule; +import org.junit.Test; + +/** + * Created on 23/08/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class DataSourceServiceTopiaTest { + + /** Logger. */ + private static final Log log = LogFactory.getLog(DataSourceServiceTopiaTest.class); + + @ClassRule + public static final ApplicationContextResource applicationContextResource = new ApplicationContextResource(H2DataSourceMigration.V_4_0); + + @Rule + public final DataSourceResource dataSourceResource = new DataSourceResource(applicationContextResource, applicationContextResource.getScriptPath("referentiel")); + + protected DataSourceService service; + + @Before + public void setUp() throws Exception { + + ObserveServiceFactoryTopia serviceFactory = applicationContextResource.getServiceFactory(); + + ObserveServiceApplicationContext serviceApplicationContext = applicationContextResource.getServiceApplicationContext(); + + ObserveDataSourceConfigurationTopiaH2 dataSourceConfiguration = dataSourceResource.getDataSourceConfiguration(); + + service = serviceFactory.newService(serviceApplicationContext, dataSourceConfiguration, DataSourceService.class); + + } + + @Test + public void testCreateDataSource() { + + } + +} \ No newline at end of file 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 47fd2e0..458e68f 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 @@ -5,7 +5,7 @@ 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.ObserveServiceFactoryTopiaTaiste; +import fr.ird.observe.services.ObserveServiceFactoryTopia; import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationTopiaH2; import fr.ird.observe.services.dto.FormDto; import fr.ird.observe.services.dto.IdDto; @@ -18,6 +18,7 @@ import org.apache.commons.logging.LogFactory; import org.junit.Assert; import org.junit.Before; import org.junit.ClassRule; +import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; import org.nuiton.topia.persistence.TopiaDao; @@ -30,6 +31,7 @@ import java.util.Map; * * @author Tony Chemit - chemit@codelutin.com */ +@Ignore public class ReferentialServiceTopiaTest { /** Logger. */ @@ -46,7 +48,7 @@ public class ReferentialServiceTopiaTest { @Before public void setUp() throws Exception { - ObserveServiceFactoryTopiaTaiste serviceFactory = applicationContextResource.getServiceFactory(); + ObserveServiceFactoryTopia serviceFactory = applicationContextResource.getServiceFactory(); ObserveServiceApplicationContext serviceApplicationContext = applicationContextResource.getServiceApplicationContext(); -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@list.forge.codelutin.com>.