/* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * Copyright (c) 2013, MPL CodeInside http://codeinside.ru */ package ru.codeinside.gses.migrations; import liquibase.exception.LiquibaseException; import org.activiti.engine.ProcessEngine; import org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration; import org.jboss.arquillian.junit.Arquillian; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import ru.codeinside.gses.activiti.CustomStandaloneProcessEngineConfiguration; import ru.codeinside.gses.liquibase.impl.DbConfig; import ru.codeinside.gses.liquibase.impl.LegacyMigrationService; import ru.codeinside.gses.liquibase.impl.Migration; import javax.naming.InitialContext; import javax.naming.NamingException; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; import javax.sql.DataSource; import javax.sql.XADataSource; import java.io.File; import java.io.IOException; import java.io.PrintStream; import java.sql.SQLException; import java.util.LinkedHashMap; import java.util.Map; import static org.activiti.engine.ProcessEngineConfiguration.HISTORY_FULL; /** * Запускать вручную, например: * <pre></pre>mvn test -Dtest=GenerateSchema -Darquillian.launch=xeodon</pre> */ @RunWith(Arquillian.class) public class GenerateSchema extends Assert { /** * Внимание! Генерация не атомарна, так как JTA НЕ используется! */ static void generate(boolean drop) throws NamingException, LiquibaseException, IOException, SQLException { final Migration assistance = new LegacyMigrationService().create(); for (final String entry : Databases.UNITS) { final DataSource ds = InitialContext.doLookup(Databases.ADMIN); if (drop) { assistance.drop(new DbConfig(ds.unwrap(XADataSource.class))); } final Map<String, String> props = new LinkedHashMap<String, String>(); props.put("eclipselink.ddl-generation", "create-tables"); props.put("eclipselink.ddl-generation.output-mode", "database"); props.put("eclipselink.logging.level", "SEVERE"); EntityManagerFactory emf = Persistence.createEntityManagerFactory(entry, props); emf.createEntityManager().close(); emf.close(); } { final DataSource ds = InitialContext.doLookup(Databases.ADMIN); if (drop) { assistance.drop(new DbConfig(ds.unwrap(XADataSource.class))); } StandaloneProcessEngineConfiguration cfg = new CustomStandaloneProcessEngineConfiguration(); cfg.setHistory(HISTORY_FULL); cfg.setDatabaseSchemaUpdate("true"); cfg.setDataSource(ds); ProcessEngine engine = cfg.buildProcessEngine(); engine.close(); } } static void generateToFiles() throws Exception { String appDir = "target"; for (final String entry : Databases.UNITS) { String createName = "createDDL_" + entry + ".jdbc"; String dropName = "dropDDL_" + entry + ".jdbc"; final Map<String, String> props = new LinkedHashMap<String, String>(); props.put("eclipselink.ddl-generation", "create-tables"); props.put("eclipselink.ddl-generation.output-mode", "sql-script"); props.put("eclipselink.logging.level", "SEVERE"); props.put("eclipselink.application-location", appDir); props.put("eclipselink.create-ddl-jdbc-file-name", createName); props.put("eclipselink.drop-ddl-jdbc-file-name", dropName); EntityManagerFactory emf = Persistence.createEntityManagerFactory(entry, props); emf.createEntityManager().close(); emf.close(); } } static void createDiff0() throws Exception { final Migration assistance = new LegacyMigrationService().create(); final DataSource tmp = InitialContext.doLookup(Databases.TMP); final DbConfig emptyDb = new DbConfig(tmp.unwrap(XADataSource.class)); assistance.drop(emptyDb); File target = new File("target"); for (final String dbName : Databases.ALL) { final DataSource ds = InitialContext.doLookup(dbName); final DbConfig db = new DbConfig(ds.unwrap(XADataSource.class)); final PrintStream ps = new PrintStream(new File(target, "migration_" + dbName.substring(dbName.indexOf('/') + 1) + ".diff")); boolean ok = assistance.validate(emptyDb, db, ps); ps.close(); assertFalse(ok); } } @Test public void generateAll() throws Exception { generate(false); createDiff0(); } }