/*
* Copyright 2015 herd contributors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.finra.herd.dao.config;
import javax.sql.DataSource;
import org.apache.commons.dbcp2.BasicDataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import org.springframework.jdbc.datasource.init.DataSourceInitializer;
import org.springframework.jdbc.datasource.init.DatabasePopulatorUtils;
import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator;
import org.finra.herd.dao.Ec2Operations;
import org.finra.herd.dao.EmrDao;
import org.finra.herd.dao.EmrDaoImplTest;
import org.finra.herd.dao.EmrOperations;
import org.finra.herd.dao.HttpClientOperations;
import org.finra.herd.dao.JdbcOperations;
import org.finra.herd.dao.KmsOperations;
import org.finra.herd.dao.LdapOperations;
import org.finra.herd.dao.Log4jOverridableConfigurer;
import org.finra.herd.dao.S3Operations;
import org.finra.herd.dao.SqsOperations;
import org.finra.herd.dao.StsOperations;
import org.finra.herd.dao.impl.MockEc2OperationsImpl;
import org.finra.herd.dao.impl.MockEmrOperationsImpl;
import org.finra.herd.dao.impl.MockHttpClientOperationsImpl;
import org.finra.herd.dao.impl.MockJdbcOperations;
import org.finra.herd.dao.impl.MockKmsOperationsImpl;
import org.finra.herd.dao.impl.MockLdapOperations;
import org.finra.herd.dao.impl.MockS3OperationsImpl;
import org.finra.herd.dao.impl.MockSqsOperationsImpl;
import org.finra.herd.dao.impl.MockStsOperationsImpl;
/**
* DAO environment test specific Spring module configuration.
*/
@Configuration
public class DaoEnvTestSpringModuleConfig
{
/**
* The Log4J configuration location for the JUnit tests.
*/
public static final String TEST_LOG4J_CONFIG_RESOURCE_LOCATION = "classpath:herd-log4j-test.xml";
/**
* This is a data source initializer which is used to make changes to the auto-created schema based on JPA annotations and to insert reference data. This
* bean is an InitializingBean which means it will automatically get invoked when the Spring test context creates all its beans. This approach will work for
* making changes to the auto-created schema which got created based on other DAO beans having been created.
*
* @return the data source initializer.
*/
@Bean
public static DataSourceInitializer dataSourceInitializer()
{
ResourceDatabasePopulator resourceDatabasePopulator = new ResourceDatabasePopulator();
resourceDatabasePopulator.addScript(new ClassPathResource("alterJpaTablesAndInsertReferenceData.sql"));
DataSourceInitializer dataSourceInitializer = new DataSourceInitializer();
dataSourceInitializer.setDataSource(herdDataSource());
dataSourceInitializer.setDatabasePopulator(resourceDatabasePopulator);
return dataSourceInitializer;
}
/**
* Get a new herd data source based on an in-memory HSQLDB database. This data source is used for loading the configuration table as an environment property
* source as well as for the JPA entity manager. It will therefore create/re-create the configuration table which is required for the former. It also
* inserts required values for both scenarios.
*
* @return the test herd data source.
*/
@Bean
public static DataSource herdDataSource()
{
// Create and return a data source that can connect directly to a JDBC URL.
BasicDataSource basicDataSource = new BasicDataSource();
basicDataSource.setDriverClassName(org.h2.Driver.class.getName());
basicDataSource.setUsername("");
basicDataSource.setPassword("");
basicDataSource.setUrl("jdbc:h2:mem:herdTestDb");
// Create and populate the configuration table.
// This is needed for all data source method calls since it is used to create the environment property source which happens before
// JPA and other non-static beans are initialized.
ResourceDatabasePopulator resourceDatabasePopulator = new ResourceDatabasePopulator();
resourceDatabasePopulator.addScript(new ClassPathResource("createConfigurationTableAndData.sql"));
DatabasePopulatorUtils.execute(resourceDatabasePopulator, basicDataSource); // This is what the DataSourceInitializer does.
return basicDataSource;
}
/**
* Gets the Hibernate HBM2DDL Auto param. This method returns "create" which is used to create the schema from the JPA annotations. Valid values are:
* <p/>
* <pre>
* validate: validate that the schema matches, make no changes to the schema of the database, you probably want this for production.
* update: update the schema to reflect the entities being persisted
* create: creates the schema necessary for your entities, destroying any previous data.
* create-drop: create the schema as in create above, but also drop the schema at the end of the session. This is great in early development or for
* testing.
* </pre>
*
* @return the Hibernate HBM2DDL Auto param.
*/
@Bean
public static String hibernateHbm2DdlAutoParam()
{
return "create";
}
/**
* The Log4J configuration used by JUnits. It is defined in the DAO tier so all tiers that extend it can take advantage of it.
* <p/>
* IMPORTANT: Ensure this method is static since the returned Log4jOverridableConfigurer is a bean factory post processor (BFPP). If it weren't static,
* autowiring and injection on this @Configuration class won't work due to lifecycle issues. See "Bootstrapping" comment in @Bean annotation for more
* details.
*
* @return the Log4J overridable configurer.
*/
@Bean
public static Log4jOverridableConfigurer log4jConfigurer()
{
Log4jOverridableConfigurer log4jConfigurer = new Log4jOverridableConfigurer();
log4jConfigurer.setDefaultResourceLocation(TEST_LOG4J_CONFIG_RESOURCE_LOCATION);
log4jConfigurer.setOverrideResourceLocation("non_existent_override_location");
return log4jConfigurer;
}
@Bean
public S3Operations s3Operations()
{
return new MockS3OperationsImpl();
}
@Bean
public EmrOperations emrOperations()
{
return new MockEmrOperationsImpl();
}
@Bean
public Ec2Operations ec2Operations()
{
return new MockEc2OperationsImpl();
}
@Bean
public SqsOperations sqsOperations()
{
return new MockSqsOperationsImpl();
}
@Bean
public StsOperations stsOperations()
{
return new MockStsOperationsImpl();
}
@Bean
public JdbcOperations jdbcOperations()
{
return new MockJdbcOperations();
}
@Bean
public LdapOperations ldapOperations()
{
return new MockLdapOperations();
}
@Bean
public KmsOperations kmsOperations()
{
return new MockKmsOperationsImpl();
}
@Bean
public HttpClientOperations httpClientOperations()
{
return new MockHttpClientOperationsImpl();
}
@Bean
public EmrDao emrDao()
{
return new EmrDaoImplTest();
}
}