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 1facc96d0d6a64c022cb1e90f269c033d407b612 Author: Tony CHEMIT <chemit@codelutin.com> Date: Wed Aug 26 14:26:00 2015 +0200 Implantation de l'export du référentiel --- .../service/DataSourceDumpProducerService.java | 2 +- .../DataSourceDumpProducerServiceTopia.java | 106 ++++++++++++++++++++- .../DataSourceDumpProducerServiceTopiaTest.java | 52 ++++++++++ 3 files changed, 158 insertions(+), 2 deletions(-) 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 index 163d414..816dd3d 100644 --- 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 @@ -12,5 +12,5 @@ public interface DataSourceDumpProducerService extends ObserveService{ byte[] getReferentialDump(); byte[] getDataDump(String... importDataIds); - + } 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 index c4fb15f..62d3df0 100644 --- 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 @@ -1,6 +1,24 @@ package fr.ird.observe.services.service; +import fr.ird.observe.ObserveTopiaApplicationContext; +import fr.ird.observe.ObserveTopiaPersistenceContext; +import fr.ird.observe.entities.Entities; import fr.ird.observe.services.ObserveServiceTopia; +import fr.ird.observe.services.ObserveTopiaApplicationContextFactory; +import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationTopiaH2; +import fr.ird.observe.services.dto.DataSourceCreateConfigurationDto; +import fr.ird.observe.services.dto.DataSourceCreateWithNoReferentialImportException; +import fr.ird.observe.services.dto.IncompatibleDataSourceCreateConfigurationException; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.topia.replication.TopiaReplicationService; +import org.nuiton.topia.replication.model.ReplicationModel; +import org.nuiton.util.StringUtil; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; /** * Created on 23/08/15. @@ -9,9 +27,95 @@ import fr.ird.observe.services.ObserveServiceTopia; */ public class DataSourceDumpProducerServiceTopia extends ObserveServiceTopia implements DataSourceDumpProducerService { + /** Logger. */ + private static final Log log = LogFactory.getLog(DataSourceDumpProducerServiceTopia.class); + + public static final String EXPORT_SQL_STATEMENT = "SCRIPT NOPASSWORDS NOSETTINGS TO '%s' CHARSET 'UTF-8' SCHEMA OBSERVE_COMMON, OBSERVE_SEINE, OBSERVE_LONGLINE;"; + @Override public byte[] getReferentialDump() { - return new byte[0]; + + long t0 = now().getTime(); + + ObserveDataSourceConfigurationTopiaH2 temporaryDataSourceConfiguration = createTemporaryDatabase("referentialDump"); + + if (log.isInfoEnabled()) { + log.info(String.format("Referential temporary database created in %s", StringUtil.convertTime(t0, System.nanoTime()))); + } + + ObserveTopiaApplicationContext temporaryTopiaApplicationContext = ObserveTopiaApplicationContextFactory.getOrCreateTopiaApplicationContext(temporaryDataSourceConfiguration); + try { + + t0 = now().getTime(); + + TopiaReplicationService service = temporaryTopiaApplicationContext.getReplicationService(); + ReplicationModel model = service.prepareForAll(Entities.REFERENCE_ENTITIES); + + ObserveTopiaApplicationContext sourceTopiaApplicationContext = serviceContext.getTopiaApplicationContext(); + service.doReplicate(model, sourceTopiaApplicationContext); + + if (log.isInfoEnabled()) { + log.info(String.format("Referential replication done in %s", StringUtil.convertTime(t0, System.nanoTime()))); + } + + } catch (Exception e) { + throw new RuntimeException("Could not replicate referantial", e); + } + + Path dumpFile = exportToFile(temporaryDataSourceConfiguration, temporaryTopiaApplicationContext); + + try { + byte[] content = Files.readAllBytes(dumpFile); + return content; + } catch (IOException e) { + //TODO Avoir une exception concrete + throw new RuntimeException("Could not read file " + dumpFile + " content", e); + } + + } + + protected Path exportToFile(ObserveDataSourceConfigurationTopiaH2 temporaryDataSourceConfiguration, + ObserveTopiaApplicationContext temporaryTopiaApplicationContext) { + + Path dumpFile = temporaryDataSourceConfiguration.getDirectory().toPath().resolve("dump.sql"); + + if (log.isInfoEnabled()) { + log.info("Export sql to file: " + dumpFile); + } + try (ObserveTopiaPersistenceContext temporaryPersistenceContext = temporaryTopiaApplicationContext.newPersistenceContext()) { + + String scriptSqlQuery = String.format(EXPORT_SQL_STATEMENT, dumpFile); + + temporaryPersistenceContext.getSqlSupport().executeSql(scriptSqlQuery); + + } + return dumpFile; + + } + + protected ObserveDataSourceConfigurationTopiaH2 createTemporaryDatabase(String prefix) { + + ObserveDataSourceConfigurationTopiaH2 temporaryDataSourceConfiguration = new ObserveDataSourceConfigurationTopiaH2(); + temporaryDataSourceConfiguration.setDbName("obstuna"); + temporaryDataSourceConfiguration.setLabel(prefix); + temporaryDataSourceConfiguration.setUsername("sa"); + temporaryDataSourceConfiguration.setPassword('s', 'a'); + File temporaryDataSourceDirectory = serviceContext.createTemporaryDirectory(prefix); + temporaryDataSourceConfiguration.setDirectory(temporaryDataSourceDirectory); + + DataSourceService dataSourceService = serviceContext.newService(temporaryDataSourceConfiguration, DataSourceService.class); + + try { + DataSourceCreateConfigurationDto dataSourceCreateConfiguration = new DataSourceCreateConfigurationDto(); + dataSourceCreateConfiguration.setCanCreateEmptyDatabase(true); + dataSourceService.create(dataSourceCreateConfiguration); + } catch (IncompatibleDataSourceCreateConfigurationException | DataSourceCreateWithNoReferentialImportException e) { + //FIXME Avoir une exception plus concrete + throw new RuntimeException("Could not create temporary database: " + prefix, e); + } + + return temporaryDataSourceConfiguration; + } @Override diff --git a/observe-services-topia/src/test/java/fr/ird/observe/services/service/DataSourceDumpProducerServiceTopiaTest.java b/observe-services-topia/src/test/java/fr/ird/observe/services/service/DataSourceDumpProducerServiceTopiaTest.java new file mode 100644 index 0000000..2ab540c --- /dev/null +++ b/observe-services-topia/src/test/java/fr/ird/observe/services/service/DataSourceDumpProducerServiceTopiaTest.java @@ -0,0 +1,52 @@ +package fr.ird.observe.services.service; + +import com.google.common.collect.ImmutableSet; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import java.util.Set; + +/** + * Created on 26/08/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class DataSourceDumpProducerServiceTopiaTest extends AbstractServiceTopiaTest { + + protected DataSourceDumpProducerService service; + + @Override + public Set<String> getTestNamesChangeDataBase() { + return ImmutableSet.of(); + } + + @Override + public String getScriptName() { + return "referentiel"; + } + + @Before + public void setUp() throws Exception { + + super.setUp(); + service = newService(DataSourceDumpProducerService.class); + } + + @Test + public void testGetReferentialDump() throws Exception { + + byte[] referentialDump = service.getReferentialDump(); + Assert.assertNotNull(referentialDump); + + } + + @Test + public void testGetDataDump() throws Exception { + + byte[] referentialDump = service.getDataDump(); + Assert.assertNotNull(referentialDump); + + + } +} \ 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>.