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 58b458282a1b94169cc9d7b061fb1056c57ffb63 Author: Tony CHEMIT <chemit@codelutin.com> Date: Sun Aug 23 19:54:23 2015 +0200 Ajout d'une usine de ObserveTopiaConfiguration Ajout d'un test de chargement d'une base Ajout d'une méthode sur le context applicatif pour charger un script sql gzippé --- observe-entities/pom.xml | 21 ++- .../observe/ObserveTopiaApplicationContext.java | 55 +++++++- .../fr/ird/observe/ObserveTopiaConfiguration.java | 25 ++++ .../observe/ObserveTopiaConfigurationFactory.java | 143 +++++++++++++++++++++ .../ObserveTopiaApplicationContextTest.java | 69 ++++++++++ 5 files changed, 304 insertions(+), 9 deletions(-) diff --git a/observe-entities/pom.xml b/observe-entities/pom.xml index 9a144a5..fa721f8 100644 --- a/observe-entities/pom.xml +++ b/observe-entities/pom.xml @@ -38,6 +38,13 @@ <dependencies> + <!-- sibling dependencies --> + <dependency> + <groupId>${project.groupId}</groupId> + <artifactId>observe-test-data</artifactId> + <version>${project.version}</version> + </dependency> + <!-- Nuiton --> <dependency> <groupId>org.nuiton</groupId> @@ -114,6 +121,17 @@ <scope>test</scope> </dependency> + <dependency> + <groupId>com.h2database</groupId> + <artifactId>h2</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>postgresql</groupId> + <artifactId>postgresql</artifactId> + <scope>test</scope> + </dependency> + </dependencies> <build> @@ -170,9 +188,6 @@ org.nuiton.topia.templates.TopiaMetaTransformer, org.nuiton.topia.templates.BinderHelperTransformer </templates> - - <!-- Using some unsafe tag values --> - <failIfUnsafe>false</failIfUnsafe> </configuration> <goals> <goal>generate</goal> 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 b135233..4eccb1e 100644 --- a/observe-entities/src/main/java/fr/ird/observe/ObserveTopiaApplicationContext.java +++ b/observe-entities/src/main/java/fr/ird/observe/ObserveTopiaApplicationContext.java @@ -6,10 +6,19 @@ import org.apache.commons.logging.LogFactory; import org.hibernate.HibernateException; import org.hibernate.cfg.Configuration; import org.hibernate.tool.hbm2ddl.SchemaExport; -import org.nuiton.topia.persistence.TopiaConfiguration; import org.nuiton.topia.persistence.TopiaException; +import org.nuiton.topia.persistence.jdbc.JdbcH2Helper; import org.nuiton.topia.replication.TopiaReplicationService; +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; +import java.util.zip.GZIPInputStream; + public class ObserveTopiaApplicationContext extends AbstractObserveTopiaApplicationContext { /** Logger. */ @@ -33,10 +42,15 @@ public class ObserveTopiaApplicationContext extends AbstractObserveTopiaApplicat */ protected boolean open; - public ObserveTopiaApplicationContext(TopiaConfiguration topiaConfiguration) { + public ObserveTopiaApplicationContext(ObserveTopiaConfiguration topiaConfiguration) { super(topiaConfiguration); } + @Override + public ObserveTopiaConfiguration getConfiguration() { + return (ObserveTopiaConfiguration) super.getConfiguration(); + } + public boolean isAutoMigrate() { return autoMigrate; } @@ -70,7 +84,6 @@ public class ObserveTopiaApplicationContext extends AbstractObserveTopiaApplicat } topiaFiresSupport.firePreCreateSchema(this); try (ObserveTopiaPersistenceContext topiaPersistenceContext = newPersistenceContext()) { - topiaPersistenceContext.getSqlSupport().executeSql(CREATE_SCHEMA_SCRIPT); } @@ -78,9 +91,39 @@ public class ObserveTopiaApplicationContext extends AbstractObserveTopiaApplicat new SchemaExport(hibernateConfiguration).execute(showSchema, true, false, true); topiaFiresSupport.firePostCreateSchema(this); } catch (HibernateException eee) { - throw new TopiaException( - String.format("Could not create schema for reason: %s", - eee.getMessage()), eee); + throw new TopiaException(String.format("Could not create schema for reason: %s", eee.getMessage()), eee); } } + + public void executeGzipSqlStatements(File temporaryDirectory, byte... content) throws IOException { + + Path sqlScriptFile = new File(temporaryDirectory, "script_" + System.nanoTime() + ".sql").toPath(); + + if (log.isInfoEnabled()) { + log.info("script: " + sqlScriptFile); + } + + try (InputStream inputSream = new BufferedInputStream(new GZIPInputStream(new ByteArrayInputStream(content)))) { + Files.copy(inputSream, sqlScriptFile); + } + + ObserveTopiaConfiguration topiaConfiguration = getConfiguration(); + + if (topiaConfiguration.isH2Configuration()) { + + JdbcH2Helper jdbcH2Helper = new JdbcH2Helper(topiaConfiguration); + jdbcH2Helper.restore(sqlScriptFile.toFile()); + + } else { + + String sqlScript = new String(Files.readAllBytes(sqlScriptFile)); + + try (ObserveTopiaPersistenceContext persistenceContext = newPersistenceContext()) { + persistenceContext.getSqlSupport().executeSql(sqlScript); + } + + } + + } + } diff --git a/observe-entities/src/main/java/fr/ird/observe/ObserveTopiaConfiguration.java b/observe-entities/src/main/java/fr/ird/observe/ObserveTopiaConfiguration.java new file mode 100644 index 0000000..9a5c28c --- /dev/null +++ b/observe-entities/src/main/java/fr/ird/observe/ObserveTopiaConfiguration.java @@ -0,0 +1,25 @@ +package fr.ird.observe; + +import org.nuiton.topia.persistence.BeanTopiaConfiguration; +import org.nuiton.topia.persistence.jdbc.JdbcConfiguration; + +/** + * Created on 23/08/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class ObserveTopiaConfiguration extends BeanTopiaConfiguration { + + private static final long serialVersionUID = 1L; + + protected final boolean h2Configuration; + + public ObserveTopiaConfiguration(JdbcConfiguration jdbcConfiguration, boolean h2Configuration) { + super(jdbcConfiguration); + this.h2Configuration = h2Configuration; + } + + public boolean isH2Configuration() { + return h2Configuration; + } +} diff --git a/observe-entities/src/main/java/fr/ird/observe/ObserveTopiaConfigurationFactory.java b/observe-entities/src/main/java/fr/ird/observe/ObserveTopiaConfigurationFactory.java new file mode 100644 index 0000000..54d3488 --- /dev/null +++ b/observe-entities/src/main/java/fr/ird/observe/ObserveTopiaConfigurationFactory.java @@ -0,0 +1,143 @@ +package fr.ird.observe; + +import com.google.common.collect.ImmutableMap; +import fr.ird.observe.entities.migration.H2DataSourceMigration; +import fr.ird.observe.entities.migration.ObserveMigrationEngine; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.topia.persistence.jdbc.JdbcConfiguration; +import org.nuiton.topia.persistence.jdbc.JdbcConfigurationBuilder; +import org.nuiton.topia.replication.TopiaReplicationServiceImpl; + +import java.io.File; + +/** + * Created on 23/08/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class ObserveTopiaConfigurationFactory { + + /** Logger. */ + private static final Log log = LogFactory.getLog(ObserveTopiaConfigurationFactory.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(); + + public static ObserveTopiaConfiguration forPostgresqlDatabase(String jdbcUrl, + String username, + String password, + boolean initSchema, + boolean autoMigrate, + boolean showMigrationSql, + boolean showMigrationProgression) { + + JdbcConfiguration jdbcConfiguration = JDBC_CONFIGURATION_BUILDER.forPostgresqlDatabase(jdbcUrl, username, password); + + ObserveTopiaConfiguration topiaConfiguration = createTopiaConfiguration(jdbcConfiguration, + initSchema, + autoMigrate, + showMigrationSql, + showMigrationProgression, + false); + + if (log.isInfoEnabled()) { + log.info("PG topia configuration: " + topiaConfiguration); + } + return topiaConfiguration; + + } + + public static ObserveTopiaConfiguration forH2Database(File dbDirectory, + String dbName, + String username, + String password, + boolean initSchema, + boolean autoMigrate, + boolean showMigrationSql, + boolean showMigrationProgression) { + + String dbPath = new File(dbDirectory, dbName).getPath(); + String jdbcUrl = String.format(H2_LOCAL_URL, dbPath); + + JdbcConfiguration jdbcConfiguration = JDBC_CONFIGURATION_BUILDER.forH2Database(jdbcUrl, username, password); + + ObserveTopiaConfiguration topiaConfiguration = createTopiaConfiguration(jdbcConfiguration, + initSchema, + autoMigrate, + showMigrationSql, + showMigrationProgression, + true); + + if (log.isInfoEnabled()) { + log.info("H2 topia configuration: " + topiaConfiguration); + } + return topiaConfiguration; + + } + + protected static ObserveTopiaConfiguration createTopiaConfiguration(JdbcConfiguration jdbcConfiguration, + boolean initSchema, + boolean autoMigrate, + boolean showMigrationSql, + boolean showMigrationProgression, + boolean h2Configuration) { + + ObserveTopiaConfiguration topiaConfiguration = new ObserveTopiaConfiguration(jdbcConfiguration, h2Configuration); + topiaConfiguration.setTopiaIdFactoryClass(ObserveTopiaIdFactory.class); + topiaConfiguration.setInitSchema(initSchema); + topiaConfiguration.setValidateSchema(false); + + if (log.isDebugEnabled()) { + log.debug("jdbcUrl: " + topiaConfiguration.getJdbcConnectionUrl()); + } + + ImmutableMap<String, String> migrationServiceConfiguration = ImmutableMap.of( + ObserveMigrationEngine.MIGRATION_CALLBACK, H2DataSourceMigration.class.getName(), + ObserveMigrationEngine.MIGRATION_SHOW_PROGRESSION, String.valueOf(showMigrationProgression), + ObserveMigrationEngine.MIGRATION_SHOW_SQL, String.valueOf(showMigrationSql), + ObserveTopiaApplicationContext.AUTO_MIGRATE, String.valueOf(autoMigrate) + ); + topiaConfiguration.addDeclaredService(ObserveTopiaApplicationContext.MIGRATION_SERVICE_NAME, ObserveMigrationEngine.class, migrationServiceConfiguration); + topiaConfiguration.addDeclaredService(ObserveTopiaApplicationContext.REPLICATION_SERVICE_NAME, TopiaReplicationServiceImpl.class); + return topiaConfiguration; + + } + +} diff --git a/observe-entities/src/test/java/fr/ird/observe/ObserveTopiaApplicationContextTest.java b/observe-entities/src/test/java/fr/ird/observe/ObserveTopiaApplicationContextTest.java new file mode 100644 index 0000000..5049c73 --- /dev/null +++ b/observe-entities/src/test/java/fr/ird/observe/ObserveTopiaApplicationContextTest.java @@ -0,0 +1,69 @@ +package fr.ird.observe; + +import fr.ird.observe.test.TestHelper; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TestName; + +import java.io.File; + +/** + * Created on 23/08/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class ObserveTopiaApplicationContextTest { + + /** Logger. */ + private static final Log log = LogFactory.getLog(ObserveTopiaApplicationContextTest.class); + + @Rule + public final TestName testName = new TestName(); + + protected File testDirectory; + + @BeforeClass + public static void setUpClass() throws Exception { + + TestHelper.initTest(ObserveTopiaApplicationContextTest.class); + } + + @Before + public void setUp() throws Exception { + testDirectory = TestHelper.newFile(testName.getMethodName()); + } + + @Test + public void testOpenEmptyDatabase() { + + File dbDirectory = new File(testDirectory, "db"); + + if (log.isInfoEnabled()) { + log.info("database directory: " + dbDirectory); + } + + ObserveTopiaConfiguration topiaConfiguration = ObserveTopiaConfigurationFactory.forH2Database( + dbDirectory, + "obstuna", + TestHelper.TEST_H2_LOGIN, + String.valueOf(TestHelper.TEST_H2_PASSWORD), + true, + true, + true, + true + ); + + ObserveTopiaApplicationContext topiaApplicationContext = new ObserveTopiaApplicationContext(topiaConfiguration); + + try (ObserveTopiaPersistenceContext topiaPersistenceContext = topiaApplicationContext.newPersistenceContext()) { + + TestHelper.assertSchemaCreated(topiaApplicationContext, topiaPersistenceContext, false); + + } + + } +} \ 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>.