/*
* Copyright 2012 SURFnet bv, The Netherlands
*
* 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.surfnet.oaaas.repository;
import java.util.HashMap;
import java.util.Map;
import javax.persistence.EntityManager;
import com.googlecode.flyway.core.Flyway;
import org.apache.openjpa.persistence.PersistenceProviderImpl;
import org.apache.tomcat.jdbc.pool.DataSource;
import org.junit.BeforeClass;
import org.springframework.data.jpa.repository.support.JpaRepositoryFactory;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
/**
* Test the flyway migrations.
*
*/
public class AbstractTestRepository {
private static final String PERSISTENCE_UNIT_NAME = "oaaas";
private static final Class<PersistenceProviderImpl> PERSISTENCE_PROVIDER_CLASS = PersistenceProviderImpl.class;
private static JpaRepositoryFactory factory;
protected static EntityManager entityManager;
@BeforeClass
public static void beforeClass() {
DataSource dataSource = dataSource();
entityManager = entityManager(dataSource);
initFlyway(dataSource);
factory = new JpaRepositoryFactory(entityManager);
}
public <T> T getRepository(Class<T> repositoryInterface) {
return factory.getRepository(repositoryInterface);
}
private static void initFlyway(DataSource dataSource) {
final Flyway flyway = new Flyway();
flyway.setInitOnMigrate(true);
flyway.setDataSource(dataSource);
flyway.setLocations("db/migration/hsqldb");
flyway.migrate();
}
@SuppressWarnings({ "rawtypes", "unchecked" })
private static EntityManager entityManager(DataSource dataSource) {
LocalContainerEntityManagerFactoryBean emfBean = new LocalContainerEntityManagerFactoryBean();
emfBean.setDataSource(dataSource);
emfBean.setPersistenceUnitName(PERSISTENCE_UNIT_NAME);
emfBean.setPersistenceProviderClass(PERSISTENCE_PROVIDER_CLASS);
emfBean.afterPropertiesSet();
Map map = new HashMap<String, String>();
map.put("openjpa.ConnectionFactoryProperties", "PrintParameters=true");
return emfBean.getObject().createEntityManager(map);
}
private static DataSource dataSource() {
DataSource dataSource = new DataSource();
dataSource.setDriverClassName("org.hsqldb.jdbcDriver");
dataSource.setUrl("jdbc:hsqldb:file:target/db;shutdown=true");
dataSource.setUsername("sa");
dataSource.setPassword("");
return dataSource;
}
/**
* @return the entityManager
*/
public static EntityManager getEntityManager() {
return entityManager;
}
}