/*
* Copyright (c) 2011-2014 Jeppetto and Jonathan Thompson
*
* 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.iternine.jeppetto.testsupport;
import org.iternine.jeppetto.testsupport.db.Database;
import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.support.GenericApplicationContext;
import org.springframework.core.io.ClassPathResource;
import java.io.Closeable;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
public class TestContext {
//-------------------------------------------------------------
// Variables - Private
//-------------------------------------------------------------
private GenericApplicationContext applicationContext;
private List<Database> databases = new ArrayList<Database>();
//-------------------------------------------------------------
// Constructors
//-------------------------------------------------------------
public TestContext(String configurationFilename, String propertiesFilename) {
this(configurationFilename, propertiesFilename, (String) null);
}
public TestContext(String configurationFilename, String propertiesFilename, String driverClassNameProperty) {
this(configurationFilename, propertiesFilename,
(driverClassNameProperty == null) ? null : new DatabaseProvider[] { new JdbcDatabaseProvider(driverClassNameProperty) }
);
}
public TestContext(String configurationFilename, String propertiesFilename, DatabaseProvider... databaseProviders) {
XmlBeanFactory xmlBeanFactory = new XmlBeanFactory(new ClassPathResource(configurationFilename));
xmlBeanFactory.setBeanClassLoader(this.getClass().getClassLoader());
Properties properties = new Properties();
try {
properties.load(new ClassPathResource(propertiesFilename).getInputStream());
} catch (IOException e) {
throw new RuntimeException(e);
}
if (databaseProviders != null) {
for (DatabaseProvider databaseProvider : databaseProviders) {
properties = databaseProvider.modifyProperties(properties);
}
}
PropertyPlaceholderConfigurer configurer = new PropertyPlaceholderConfigurer();
configurer.setProperties(properties);
configurer.postProcessBeanFactory(xmlBeanFactory);
try {
applicationContext = new GenericApplicationContext(xmlBeanFactory);
applicationContext.refresh();
if (databaseProviders != null) {
for (DatabaseProvider databaseProvider : databaseProviders) {
databases.add(databaseProvider.getDatabase(properties, applicationContext));
}
}
} catch (RuntimeException e) {
if (databaseProviders != null) {
for (DatabaseProvider databaseProvider : databaseProviders) {
if (databaseProvider instanceof Closeable) {
try {
((Closeable) databaseProvider).close();
} catch (IOException e1) {
// ignore
}
}
}
}
throw e;
}
}
//-------------------------------------------------------------
// Methods - Public
//-------------------------------------------------------------
public void close() {
for (Database database : databases) {
if (database != null) {
database.close();
}
}
applicationContext.close();
}
public Object getBean(String beanName) {
return applicationContext.getBean(beanName);
}
public Database getDatabase() {
return databases.get(0);
}
}