/*
* 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.jdbi.v3.spring4;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import javax.annotation.PostConstruct;
import javax.sql.DataSource;
import org.jdbi.v3.core.Jdbi;
import org.jdbi.v3.core.spi.JdbiPlugin;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.datasource.DataSourceUtils;
/**
* Utility class which constructs an {@link Jdbi} instance which can conveniently participate
* in Spring's transaction management system.
*/
public class JdbiFactoryBean implements FactoryBean<Jdbi>
{
private DataSource dataSource;
private final Map<String, Object> globalDefines = new HashMap<>();
private Collection<JdbiPlugin> plugins = Collections.emptyList();
public JdbiFactoryBean() {
}
public JdbiFactoryBean(DataSource dataSource) {
this.dataSource = dataSource;
}
/**
* See {@link org.springframework.beans.factory.FactoryBean#getObject}
*/
@Override
public Jdbi getObject() throws Exception
{
final Jdbi db = Jdbi.create(() -> DataSourceUtils.getConnection(dataSource));
plugins.forEach(db::installPlugin);
globalDefines.forEach(db::define);
return db;
}
/**
* See {@link org.springframework.beans.factory.FactoryBean#getObjectType}
*/
@Override
public Class<Jdbi> getObjectType()
{
return Jdbi.class;
}
/**
* See {@link org.springframework.beans.factory.FactoryBean#isSingleton}
*
* @return false
*/
@Override
public boolean isSingleton()
{
return true;
}
/**
* The datasource, which should be managed by spring's transaction system, from which
* the {@link Jdbi} will obtain connections
*
* @param dataSource the data source.
*/
public JdbiFactoryBean setDataSource(DataSource dataSource)
{
this.dataSource = dataSource;
return this;
}
@Autowired(required=false)
public JdbiFactoryBean setPlugins(Collection<JdbiPlugin> plugins)
{
this.plugins = plugins;
return this;
}
public void setGlobalDefines(Map<String, Object> defines) {
globalDefines.putAll(defines);
}
/**
* Verifies that a dataSource has been set
*/
@PostConstruct
private void afterPropertiesSet()
{
if (dataSource == null) {
throw new IllegalStateException("'dataSource' property must be set");
}
}
}