/*
* Copyright 2008-2009 the original author or authors.
*
* 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 net.hasor.data.orm.mybatis3;
import net.hasor.core.*;
import net.hasor.core.provider.InfoAwareProvider;
import net.hasor.core.provider.InstanceProvider;
import net.hasor.core.provider.SingleProvider;
import net.hasor.core.utils.StringUtils;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.sql.DataSource;
import java.io.IOException;
import java.io.Reader;
/**
* mybatis 插件
* @version : 2016年1月10日
* @author 赵永春(zyc@hasor.net)
*/
public class MyBatisModule implements Module {
protected Logger logger = LoggerFactory.getLogger(getClass());
private String dataSourceID = null;
private Provider<SqlSessionFactory> sessionFactory = null;
//
public MyBatisModule(String sqlmapConfig) throws IOException {
this(null, defaultSessionFactory(sqlmapConfig));
}
public MyBatisModule(SqlSessionFactory sessionFactory) {
this(null, new InstanceProvider<SqlSessionFactory>(Hasor.assertIsNotNull(sessionFactory, "sessionFactory is null.")));
}
public MyBatisModule(Provider<SqlSessionFactory> sessionFactory) {
this(null, sessionFactory);
}
public MyBatisModule(String dataSourceID, String sqlmapConfig) throws IOException {
this(dataSourceID, defaultSessionFactory(sqlmapConfig));
}
public MyBatisModule(String dataSourceID, SqlSessionFactory sessionFactory) {
this(dataSourceID, new InstanceProvider<SqlSessionFactory>(Hasor.assertIsNotNull(sessionFactory, "sessionFactory is null.")));
}
public MyBatisModule(String dataSourceID, Provider<SqlSessionFactory> sessionFactory) {
this.dataSourceID = dataSourceID;
this.sessionFactory = Hasor.assertIsNotNull(sessionFactory, "sessionFactory is null.");
}
//
private static SingleProvider<SqlSessionFactory> defaultSessionFactory(final String sqlmapConfig) throws IOException {
Hasor.assertIsNotNull(sqlmapConfig, "sqlmapConfig is null.");
ClassLoader loader = Thread.currentThread().getContextClassLoader();
final Reader reader = Hasor.assertIsNotNull(Resources.getResourceAsReader(loader, sqlmapConfig), "could not find resource '" + sqlmapConfig + "'");
return new SingleProvider<SqlSessionFactory>(new Provider<SqlSessionFactory>() {
public SqlSessionFactory get() {
return new SqlSessionFactoryBuilder().build(reader);
}
});
}
//
public void loadModule(ApiBinder apiBinder) {
if (StringUtils.isBlank(this.dataSourceID)) {
// .检测依赖
BindInfo<DataSource> bindInfo = apiBinder.getBindInfo(DataSource.class);
if (bindInfo == null) {
throw new IllegalStateException("need to rely on DataModule plug-in.");
}
// .初始化MyBatis绑定
Provider<DataSource> dataSource = Hasor.autoAware(apiBinder.getEnvironment(), new InfoAwareProvider<DataSource>(bindInfo));
final SqlExecutorTemplateProvider templateProvider = new SqlExecutorTemplateProvider(this.sessionFactory, dataSource);
apiBinder.bindType(SqlExecutorTemplate.class).toProvider(templateProvider);
apiBinder.bindType(SqlExecutorOperations.class).toProvider(new Provider<SqlExecutorOperations>() {
public SqlExecutorOperations get() {
return templateProvider.get();
}
});
} else {
// .检测依赖
BindInfo<DataSource> bindInfo = apiBinder.findBindingRegister(this.dataSourceID, DataSource.class);
if (bindInfo == null) {
throw new IllegalStateException("need to rely on DataModule plug-in.");
}
// .初始化MyBatis绑定
Provider<DataSource> dataSource = Hasor.autoAware(apiBinder.getEnvironment(), new InfoAwareProvider<DataSource>(bindInfo));
final SqlExecutorTemplateProvider templateProvider = new SqlExecutorTemplateProvider(this.sessionFactory, dataSource);
apiBinder.bindType(SqlExecutorTemplate.class).nameWith(this.dataSourceID).toProvider(templateProvider);
apiBinder.bindType(SqlExecutorOperations.class).nameWith(this.dataSourceID).toProvider(new Provider<SqlExecutorOperations>() {
public SqlExecutorOperations get() {
return templateProvider.get();
}
});
}
}
}