das.orm.ORMBackendConnector.java Source code

Java tutorial

Introduction

Here is the source code for das.orm.ORMBackendConnector.java

Source

/*
 * Copyright 2015 serg.
 *
 * 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 das.orm;

/*
http://mybatis.github.io/mybatis-3/
http://mybatis.github.io/generator/
http://blog.mybatis.org/p/products.html
*/

import das.dao.props.BeanPropertyMapping;

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;

import org.apache.ibatis.exceptions.PersistenceException;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.mapping.ResultFlag;
import org.apache.ibatis.mapping.ResultMap;
import org.apache.ibatis.mapping.ResultMapping;
import org.apache.ibatis.session.Configuration;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class ORMBackendConnector {

    protected static Logger log = LoggerFactory.getLogger(ORMBackendConnector.class);
    protected static Map<String, Class<?>> sqlTypeClassMap;
    protected static Map<Class<?>, String> classSqlTypeMap;
    private SqlSessionFactory sqlSessionFactory;
    private Connection connection;
    private final boolean keepDBConnection;

    public ORMBackendConnector(String configURI) throws IOException, PersistenceException {
        this(configURI, null);
    }

    public ORMBackendConnector(String configURI, Connection conn) throws IOException, PersistenceException {
        log.trace(">>> constructor");
        if ((configURI == null) || configURI.length() == 0) {
            //String fs = System.getProperty("file.separator"); //  ? ?  ??
            String fs = "/";
            configURI = getClass().getPackage().getName().replace(".", fs).concat(fs).concat("orm-config.xml");
        }
        log.debug("configURI=" + configURI);
        InputStream config = Resources.getResourceAsStream(configURI);
        log.debug("config ready");
        this.sqlSessionFactory = new SqlSessionFactoryBuilder().build(config);
        log.debug("SqlSessionFactoryBuilder created");
        connection = conn;
        if (conn != null) {
            this.keepDBConnection = true;
        } else {
            Configuration conf = getConfiguration();
            Properties props = conf.getVariables();
            //   ?  ?   "" ??.
            // ?    ? ? ? ? SqlSession 
            //  ??  ?,   ? ,  
            //  ?     ? - ? ?, 
            //       . 
            // ?   ,   ? ? ?
            String prop = props.getProperty("keepDBConnection", "false");
            this.keepDBConnection = Boolean.parseBoolean(prop);
        }
        log.debug("keepDBConnection=" + keepDBConnection);
    }

    public SqlSessionFactory getSqlSessionFactory() {
        return sqlSessionFactory;
    }

    public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
        this.sqlSessionFactory = sqlSessionFactory;
    }

    public Configuration getConfiguration() {
        log.trace(">>> getConfiguration");
        if (sqlSessionFactory != null) {
            return sqlSessionFactory.getConfiguration();
        } else
            return null;
    }

    public SqlSession createDBSession() {
        return createDBSession(null, false);
    }

    public SqlSession createDBSession(Connection conn, boolean keepThisConnection) {
        log.trace(">>> createDBSession");
        if (sqlSessionFactory != null) {
            SqlSession ses;
            if (conn != null) {
                if (keepThisConnection) {
                    connection = conn;
                }
                ses = sqlSessionFactory.openSession(conn);
            } else {
                if ((keepDBConnection || keepThisConnection) && (connection != null)) {
                    ses = sqlSessionFactory.openSession(connection);
                } else {
                    ses = sqlSessionFactory.openSession();
                    connection = ses.getConnection();
                }
            }
            return ses;
        } else
            return null;
    }

    public Connection getConnection() {
        return connection;
    }

    /*
    private void checkORMapperClass(Class<?> mapperClass, Object dao) {
    //?,   ? mapperClass  dao.
    //? ,  ? . ? , ??
    log.trace(">>> checkMapperClass");
    Configuration conf = getConfiguration();
    //conf.getMapperRegistry().getMappers();
    if (conf != null) {
        if (mapperClass == null) {
            if (dao != null) {
                // ??  ?.    - ? ?  ? MyBatis
                Class<?>[] itf = dao.getClass().getInterfaces();
                log.debug("Interfaces.length="+itf.length);
                for (int i=0; i < itf.length; i++) {
                    log.debug("Interfaces["+i+"]="+itf[i].getName());
                    if (conf.hasMapper(itf[i])) {
                        mapperClass = itf[i];
                        log.debug("mapperClass="+mapperClass.getName());
                        break;
                    }
                }
            } else {
                throw new IllegalArgumentException("Wrong parameter dao = NULL");
            }
        } else {
            if (! conf.hasMapper(mapperClass)) {
                throw new IllegalArgumentException("Wrong mapperClass="+mapperClass.getName());
            } else {
                log.debug("mapperClass="+mapperClass.getName());
            }
        }
    } else {
        log.debug("getConfiguration == null. checkMapperClass failed.");
    }
    }
    */

    private boolean isCompatibleMap(ResultMap rm, Class<?> beanClass) {
        // ?, ??   ResultMap ??   beanClass
        if ((rm != null) && (beanClass != null)) {
            return (beanClass == rm.getType());
        } else
            return false;
    }

    public List<BeanPropertyMapping> getBeanPropertiesMapping(Class<?> beanClass) {
        log.trace(">>> getBeanPropertiesMapping()");
        List<BeanPropertyMapping> DAOprops = new ArrayList<BeanPropertyMapping>();
        Configuration conf = getConfiguration();
        if (conf != null) {
            //
            //checkDAOMapperClass(mapperClass, dao);
            Collection<ResultMap> rmc = conf.getResultMaps();
            //log.debug("ResultMaps size="+rmc.size());
            Iterator<ResultMap> rmci = rmc.iterator();
            while (rmci.hasNext()) {
                ResultMap rm = rmci.next();
                // ID=com.example.server.dao.UserMapper.UserMap, Type=com.example.server.dao.UserDTO
                log.debug("ResultMap ID=" + rm.getId() + ", Type=" + rm.getType().getName());
                // ?, ??   ResultMap ??   beanClass
                if (isCompatibleMap(rm, beanClass)) {
                    List<ResultMapping> r = rm.getResultMappings();
                    Iterator<ResultMapping> i2 = r.iterator();
                    while (i2.hasNext()) {
                        ResultMapping r2 = i2.next();
                        // ? ?? (?)  . 
                        //  ?  ?? ? ? ??   
                        DAOprops.add(new BeanPropertyMapping(r2.getProperty(), r2.getColumn(), r2.getJavaType(),
                                r2.getFlags(), r2.getNotNullColumns()));
                        StringBuilder s = new StringBuilder();
                        s.append("Column=").append(r2.getColumn());
                        s.append(", Property=").append(r2.getProperty());
                        s.append(", JavaType=").append(r2.getJavaType());
                        s.append(", Flags=[");
                        List<ResultFlag> flags = r2.getFlags();
                        for (ResultFlag rf : flags) {
                            s.append(rf.name()).append(", ");
                        }
                        s.append("]");
                        s.append(", NotNullColumns=[");
                        Set<String> nncs = r2.getNotNullColumns();
                        for (String nnc : nncs) {
                            s.append(nnc).append(", ");
                        }
                        s.append("]");
                        log.debug(s.toString());
                    }
                    break; //    ?? , ? 
                }
            }
        }
        return DAOprops;
    }

    /**
     *  ?       java
     * @param sqlTypeName  ?    
     * @param javaClass ?? java
     */
    public void setSqlTypeForClass(String sqlTypeName, Class<?> javaClass) {
        if (sqlTypeClassMap == null) {
            synchronized (this) {
                sqlTypeClassMap = new HashMap<String, Class<?>>();
            }
            log.debug("sqlTypeClassMap == null");
        } else {
            log.debug("sqlTypeClassMap != null");
        }
        if (classSqlTypeMap == null) {
            synchronized (this) {
                classSqlTypeMap = new HashMap<Class<?>, String>();
            }
            log.debug("classSqlTypeMap == null");
        } else {
            log.debug("classSqlTypeMap != null");
        }
        sqlTypeClassMap.put(sqlTypeName, javaClass);
        classSqlTypeMap.put(javaClass, sqlTypeName);
    }

    public String getSqlTypeForClass(Class<?> javaClass) {
        String res = null;
        if (classSqlTypeMap != null) {
            res = classSqlTypeMap.get(javaClass);
        }
        return res;
    }

    public Class<?> getClassForSqlType(String sqlTypeName) {
        Class<?> res = null;
        if (sqlTypeClassMap != null) {
            res = sqlTypeClassMap.get(sqlTypeName);
        }
        return res;
    }

    /**
     *  
     */
    public void getParameterMapNames() {
        log.debug(">> getParameterMapNames()");
        Configuration conf = getConfiguration();
        if (conf != null) {
            log.debug("conf != null");
            Collection<String> pmn = conf.getParameterMapNames();
            if (pmn != null) {
                log.debug("pmn != null. pmn.size={}", pmn.size());
                for (String n : pmn) {
                    log.debug("ParameterMapName={}", n);
                }
            } else {
                log.debug("pmn = null");
            }
        } else {
            log.debug("conf = null");
        }
    }
}