package com.eactive.eai.rms.common.base;

import java.sql.SQLException;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.dao.DataAccessException;
import org.springframework.dao.NonTransientDataAccessResourceException;
import org.springframework.jdbc.support.SQLStateSQLExceptionTranslator;
import org.springframework.orm.ibatis.SqlMapClientTemplate;

import com.eactive.kakao.rolling.TableSuffixResolver;
import com.ibatis.sqlmap.client.SqlMapClient;

/**
 * 아이바티스 + 스프링 연동을 통해 
 * SqlMapClientTemplate객체를 얻기 위한 
 * DAO 최상위 클래스입니다.
 * 아이바티스로 개발하는 모든 Dao클래스는 본 클래스를 
 * 상속받아 구현 바랍니다.
 * 
 */
@SuppressWarnings("deprecation")
public class SqlMapClientTemplateDao extends SqlMapClientBaseTemplateDao{

	protected SqlMapClientTemplate template;

    @Autowired
    protected void daoInit(@Qualifier("sqlMapClient")
    SqlMapClient sqlMapClient, TableSuffixResolver tableSuffixResolver) {
        template = new SchemaIdConfiguredSqlMapTemplate(sqlMapClient, tableSuffixResolver);
        template.setExceptionTranslator(new DefaultSQLStateSQLExceptionTranslator());
    }

    /**
     * 기본 Spring SQLStateSQLExceptionTranslator 에서 MACTH되는 CASE가 존재하지 않을 시 NULL을 리턴하여
     * Exception Message 가 출력되지 않아 오류추적에 문제가 있어 Null case 발생 시 원 sql excpeiton을 리턴하는 Translator를 작성함
     */
    class DefaultSQLStateSQLExceptionTranslator extends SQLStateSQLExceptionTranslator {
        @Override
        protected DataAccessException doTranslate(String task, String sql, SQLException ex) {
            DataAccessException dataAccessException = super.doTranslate(task, sql, ex);
            if(dataAccessException == null){
                return new NonTransientDataAccessResourceException(sql, ex);
            }
            return dataAccessException;
        }
    }
}
