Search in sources :

Example 1 with ResourceDatabasePopulator

use of org.springframework.jdbc.datasource.init.ResourceDatabasePopulator in project spring-framework by spring-projects.

the class SqlScriptsTestExecutionListener method executeSqlScripts.

/**
	 * Execute the SQL scripts configured via the supplied {@link Sql @Sql}
	 * annotation for the given {@link ExecutionPhase} and {@link TestContext}.
	 * <p>Special care must be taken in order to properly support the configured
	 * {@link SqlConfig#transactionMode}.
	 * @param sql the {@code @Sql} annotation to parse
	 * @param executionPhase the current execution phase
	 * @param testContext the current {@code TestContext}
	 * @param classLevel {@code true} if {@link Sql @Sql} was declared at the class level
	 */
private void executeSqlScripts(Sql sql, ExecutionPhase executionPhase, TestContext testContext, boolean classLevel) throws Exception {
    if (executionPhase != sql.executionPhase()) {
        return;
    }
    MergedSqlConfig mergedSqlConfig = new MergedSqlConfig(sql.config(), testContext.getTestClass());
    if (logger.isDebugEnabled()) {
        logger.debug(String.format("Processing %s for execution phase [%s] and test context %s.", mergedSqlConfig, executionPhase, testContext));
    }
    final ResourceDatabasePopulator populator = new ResourceDatabasePopulator();
    populator.setSqlScriptEncoding(mergedSqlConfig.getEncoding());
    populator.setSeparator(mergedSqlConfig.getSeparator());
    populator.setCommentPrefix(mergedSqlConfig.getCommentPrefix());
    populator.setBlockCommentStartDelimiter(mergedSqlConfig.getBlockCommentStartDelimiter());
    populator.setBlockCommentEndDelimiter(mergedSqlConfig.getBlockCommentEndDelimiter());
    populator.setContinueOnError(mergedSqlConfig.getErrorMode() == ErrorMode.CONTINUE_ON_ERROR);
    populator.setIgnoreFailedDrops(mergedSqlConfig.getErrorMode() == ErrorMode.IGNORE_FAILED_DROPS);
    String[] scripts = getScripts(sql, testContext, classLevel);
    scripts = TestContextResourceUtils.convertToClasspathResourcePaths(testContext.getTestClass(), scripts);
    List<Resource> scriptResources = TestContextResourceUtils.convertToResourceList(testContext.getApplicationContext(), scripts);
    for (String stmt : sql.statements()) {
        if (StringUtils.hasText(stmt)) {
            stmt = stmt.trim();
            scriptResources.add(new ByteArrayResource(stmt.getBytes(), "from inlined SQL statement: " + stmt));
        }
    }
    populator.setScripts(scriptResources.toArray(new Resource[scriptResources.size()]));
    if (logger.isDebugEnabled()) {
        logger.debug("Executing SQL scripts: " + ObjectUtils.nullSafeToString(scriptResources));
    }
    String dsName = mergedSqlConfig.getDataSource();
    String tmName = mergedSqlConfig.getTransactionManager();
    DataSource dataSource = TestContextTransactionUtils.retrieveDataSource(testContext, dsName);
    PlatformTransactionManager txMgr = TestContextTransactionUtils.retrieveTransactionManager(testContext, tmName);
    boolean newTxRequired = (mergedSqlConfig.getTransactionMode() == TransactionMode.ISOLATED);
    if (txMgr == null) {
        Assert.state(!newTxRequired, () -> String.format("Failed to execute SQL scripts for test context %s: " + "cannot execute SQL scripts using Transaction Mode " + "[%s] without a PlatformTransactionManager.", testContext, TransactionMode.ISOLATED));
        Assert.state(dataSource != null, () -> String.format("Failed to execute SQL scripts for test context %s: " + "supply at least a DataSource or PlatformTransactionManager.", testContext));
        // Execute scripts directly against the DataSource
        populator.execute(dataSource);
    } else {
        DataSource dataSourceFromTxMgr = getDataSourceFromTransactionManager(txMgr);
        // Ensure user configured an appropriate DataSource/TransactionManager pair.
        if (dataSource != null && dataSourceFromTxMgr != null && !dataSource.equals(dataSourceFromTxMgr)) {
            throw new IllegalStateException(String.format("Failed to execute SQL scripts for test context %s: " + "the configured DataSource [%s] (named '%s') is not the one associated with " + "transaction manager [%s] (named '%s').", testContext, dataSource.getClass().getName(), dsName, txMgr.getClass().getName(), tmName));
        }
        if (dataSource == null) {
            dataSource = dataSourceFromTxMgr;
            Assert.state(dataSource != null, () -> String.format("Failed to execute SQL scripts for " + "test context %s: could not obtain DataSource from transaction manager [%s] (named '%s').", testContext, txMgr.getClass().getName(), tmName));
        }
        final DataSource finalDataSource = dataSource;
        int propagation = (newTxRequired ? TransactionDefinition.PROPAGATION_REQUIRES_NEW : TransactionDefinition.PROPAGATION_REQUIRED);
        TransactionAttribute txAttr = TestContextTransactionUtils.createDelegatingTransactionAttribute(testContext, new DefaultTransactionAttribute(propagation));
        new TransactionTemplate(txMgr, txAttr).execute(status -> {
            populator.execute(finalDataSource);
            return null;
        });
    }
}
Also used : TransactionAttribute(org.springframework.transaction.interceptor.TransactionAttribute) DefaultTransactionAttribute(org.springframework.transaction.interceptor.DefaultTransactionAttribute) DefaultTransactionAttribute(org.springframework.transaction.interceptor.DefaultTransactionAttribute) ResourceDatabasePopulator(org.springframework.jdbc.datasource.init.ResourceDatabasePopulator) ClassPathResource(org.springframework.core.io.ClassPathResource) ByteArrayResource(org.springframework.core.io.ByteArrayResource) Resource(org.springframework.core.io.Resource) TransactionTemplate(org.springframework.transaction.support.TransactionTemplate) ByteArrayResource(org.springframework.core.io.ByteArrayResource) PlatformTransactionManager(org.springframework.transaction.PlatformTransactionManager) DataSource(javax.sql.DataSource)

Example 2 with ResourceDatabasePopulator

use of org.springframework.jdbc.datasource.init.ResourceDatabasePopulator in project spring-framework by spring-projects.

the class ProgrammaticTxMgmtTests method executeSqlScript.

protected void executeSqlScript(String sqlResourcePath, boolean continueOnError) throws DataAccessException {
    Resource resource = this.applicationContext.getResource(sqlResourcePath);
    new ResourceDatabasePopulator(continueOnError, false, this.sqlScriptEncoding, resource).execute(jdbcTemplate.getDataSource());
}
Also used : ResourceDatabasePopulator(org.springframework.jdbc.datasource.init.ResourceDatabasePopulator) Resource(org.springframework.core.io.Resource)

Example 3 with ResourceDatabasePopulator

use of org.springframework.jdbc.datasource.init.ResourceDatabasePopulator in project spring-security by spring-projects.

the class JdbcUserDetailsManagerConfigurer method getDatabasePopulator.

protected DatabasePopulator getDatabasePopulator() {
    ResourceDatabasePopulator dbp = new ResourceDatabasePopulator();
    dbp.setScripts(initScripts.toArray(new Resource[initScripts.size()]));
    return dbp;
}
Also used : ResourceDatabasePopulator(org.springframework.jdbc.datasource.init.ResourceDatabasePopulator) ClassPathResource(org.springframework.core.io.ClassPathResource) Resource(org.springframework.core.io.Resource)

Example 4 with ResourceDatabasePopulator

use of org.springframework.jdbc.datasource.init.ResourceDatabasePopulator in project vladmihalcea.wordpress.com by vladmihalcea.

the class DatabaseScriptLifecycleHandler method runDestroyScripts.

private void runDestroyScripts() {
    final ResourceDatabasePopulator resourceDatabasePopulator = createResourceDatabasePopulator();
    jdbcTemplate.execute(new ConnectionCallback<Void>() {

        @Override
        public Void doInConnection(Connection con) throws SQLException, DataAccessException {
            resourceDatabasePopulator.setScripts(getDestroyScripts());
            resourceDatabasePopulator.populate(con);
            return null;
        }
    });
}
Also used : SQLException(java.sql.SQLException) ResourceDatabasePopulator(org.springframework.jdbc.datasource.init.ResourceDatabasePopulator) Connection(java.sql.Connection) DataAccessException(org.springframework.dao.DataAccessException)

Example 5 with ResourceDatabasePopulator

use of org.springframework.jdbc.datasource.init.ResourceDatabasePopulator in project gs-spring-security-3.2 by rwinch.

the class DataConfiguration method initDatabase.

@Bean
@DependsOn("entityManagerFactory")
public ResourceDatabasePopulator initDatabase(DataSource dataSource) throws Exception {
    ResourceDatabasePopulator populator = new ResourceDatabasePopulator();
    populator.addScript(new ClassPathResource("data.sql"));
    populator.populate(dataSource.getConnection());
    return populator;
}
Also used : ResourceDatabasePopulator(org.springframework.jdbc.datasource.init.ResourceDatabasePopulator) ClassPathResource(org.springframework.core.io.ClassPathResource) DependsOn(org.springframework.context.annotation.DependsOn) Bean(org.springframework.context.annotation.Bean) LocalContainerEntityManagerFactoryBean(org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean)

Aggregations

ResourceDatabasePopulator (org.springframework.jdbc.datasource.init.ResourceDatabasePopulator)17 Resource (org.springframework.core.io.Resource)7 ClassPathResource (org.springframework.core.io.ClassPathResource)6 DataSource (javax.sql.DataSource)3 Bean (org.springframework.context.annotation.Bean)3 DependsOn (org.springframework.context.annotation.DependsOn)3 LocalContainerEntityManagerFactoryBean (org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean)3 Connection (java.sql.Connection)2 SQLException (java.sql.SQLException)2 Test (org.junit.Test)2 DataAccessException (org.springframework.dao.DataAccessException)2 PostConstruct (javax.annotation.PostConstruct)1 ByteArrayResource (org.springframework.core.io.ByteArrayResource)1 JdbcTemplate (org.springframework.jdbc.core.JdbcTemplate)1 PlatformTransactionManager (org.springframework.transaction.PlatformTransactionManager)1 Transactional (org.springframework.transaction.annotation.Transactional)1 DefaultTransactionAttribute (org.springframework.transaction.interceptor.DefaultTransactionAttribute)1 TransactionAttribute (org.springframework.transaction.interceptor.TransactionAttribute)1 TransactionTemplate (org.springframework.transaction.support.TransactionTemplate)1