org.pssframework.dao.SqlSessionFactoryFactoryBean.java Source code

Java tutorial

Introduction

Here is the source code for org.pssframework.dao.SqlSessionFactoryFactoryBean.java

Source

/*******************************************************************************
 * Copyright (c) 2010 PSS Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     PSS Corporation - initial API and implementation
 *******************************************************************************/
package org.pssframework.dao;

import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.HashMap;
import java.util.Map;

import javax.sql.DataSource;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.ibatis.builder.xml.XMLMapperBuilder;
import org.apache.ibatis.mapping.Environment;
import org.apache.ibatis.parsing.XNode;
import org.apache.ibatis.session.Configuration;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.apache.ibatis.transaction.managed.ManagedTransactionFactory;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.core.io.Resource;
import org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy;
import org.springframework.util.Assert;

public class SqlSessionFactoryFactoryBean implements FactoryBean, InitializingBean {
    Log logger = LogFactory.getLog(SqlSessionFactoryFactoryBean.class);
    private Resource configLocation;
    private Resource[] mapperLocations;
    private DataSource dataSource;
    private boolean useTransactionAwareDataSource = true;

    SqlSessionFactory sqlSessionFactory;

    public void afterPropertiesSet() throws Exception {
        Assert.notNull(configLocation, "configLocation must be not null");

        sqlSessionFactory = createSqlSessionFactory();
    }

    private SqlSessionFactory createSqlSessionFactory() throws IOException {
        Reader reader = new InputStreamReader(getConfigLocation().getInputStream());
        try {
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
            Configuration conf = sqlSessionFactory.getConfiguration();
            if (dataSource != null) {
                DataSource dataSourceToUse = this.dataSource;
                if (this.useTransactionAwareDataSource
                        && !(this.dataSource instanceof TransactionAwareDataSourceProxy)) {
                    dataSourceToUse = new TransactionAwareDataSourceProxy(this.dataSource);
                }

                conf.setEnvironment(
                        new Environment("development", new ManagedTransactionFactory(), dataSourceToUse));
                sqlSessionFactory = new SqlSessionFactoryBuilder().build(conf);
            }

            if (mapperLocations != null) {
                Map<String, XNode> sqlFragments = new HashMap<String, XNode>();
                for (Resource r : mapperLocations) {
                    logger.info("Loading iBatis3 mapper xml from file[" + r.getFile().getAbsolutePath() + "]");

                    Reader mapperReader = new InputStreamReader(r.getInputStream());
                    try {
                        XMLMapperBuilder mapperBuilder = new XMLMapperBuilder(mapperReader, conf,
                                r.getFile().getAbsolutePath(), sqlFragments);
                        mapperBuilder.parse();
                    } finally {
                        mapperReader.close();
                    }
                }
            }
            return sqlSessionFactory;
        } finally {
            reader.close();
        }
    }

    public Object getObject() throws Exception {
        return sqlSessionFactory;
    }

    public DataSource getDataSource() {
        return dataSource;
    }

    public void setDataSource(DataSource dataSource) {
        this.dataSource = dataSource;
    }

    public Class<?> getObjectType() {
        return SqlSessionFactory.class;
    }

    public boolean isSingleton() {
        return true;
    }

    public Resource getConfigLocation() {
        return configLocation;
    }

    public void setConfigLocation(Resource configurationFile) {
        this.configLocation = configurationFile;
    }

    public void setMapperLocations(Resource[] mapperLocations) {
        this.mapperLocations = mapperLocations;
    }

}