package com.eactive.eai.adapter;

import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Vector;

import com.eactive.eai.common.dao.BaseDAO;
import com.eactive.eai.common.dao.DAOException;
import com.eactive.eai.common.exception.ExceptionUtil;
import com.eactive.eai.common.util.Logger;
import com.eactive.eai.common.util.NullControl;

/**
* 1. 기능 : 업무데이터로 부터 아래와 같은 특정 필드를 추출하기 위한 어댑터 정보 테이블에
*       대한 Data Access Object 이다.
* 2. 처리 개요 :  어댑터 정보 테이블에 대한 Create, Read, Update, Delete 를 처리한다.
*
* 3. 주의사항
*
* @author  :
* @version : v 1.0.0
* @see : AdapterQuery.java
* @since   :
*/
public class AdapterDAO extends BaseDAO implements AdapterQuery
{

    /**
     * Default Logger
     */
    static Logger logger = Logger.getLogger(Logger.LOGGER_ADAPTER);

    /**
    * 1. 기능 :  어댑터 그룹 정보 전체를 메모리에 로딩하기 위해 테이블 전체 내용을 SELECT해서
    *       AdapterGroupVO 객체 리스트로 생성 반환하는 메서드.
    * 2. 처리 개요 : 어댑터 그룹 정보 전체를 SELECT해서 한 레코드를 AdapterGroupVO로 생성 ArrayList에
    *       저장하여 반환한다.
    * 3. 주의사항
    *
    * @return   ArrayList 어댑터 그룹 정보 전체데이터로 AdapterGroupVO Collection
    * @exception    DAOExcepiton    DB SELECT 관련 SQLException을 포함한 어댑터 그룹 정보를 가져오다 발생되는 모든 에러
    **/
    public ArrayList<AdapterGroupVO> getAllAdapterGroups() throws DAOException {
        ArrayList<AdapterGroupVO> al = new ArrayList<AdapterGroupVO>();
        ResultSet rs = null;
        AdapterGroupVO vo = null;
        try {
            this.connect(SELECT_ALL_GROUPS);
            //logger.debug("SELECT_ALL_GROUPS: "+ SELECT_ALL_GROUPS);

            rs = this.executeQuery();
            while(rs.next()) {
                vo = new AdapterGroupVO();
                vo.setName          (rs.getString(1));
                vo.setType          (rs.getString(2));
                vo.setUsedFlag      ("1".equals(rs.getString(3)));
                vo.setDescription   (NullControl.trimSpace(rs.getString(4)));
				vo.setBatchProcessCode    (rs.getString(5));     //TSEAIBJ06테이블 PK 값 
				vo.setBatchInstitutionCode(rs.getString(6));     //TSEAIBJ06테이블 PK 값 
                al.add(vo);
            }

            return al;
        } catch(Exception e) {
            throw new DAOException(ExceptionUtil.getErrorCode(e, "BECEAIMAD001"));
        } finally {
            this.disconnect();
        }
    }

    /**
    * 1. 기능 :  어댑터 정보 전체를 메모리에 로딩하기 위해 테이블 전체 내용을 SELECT해서
    *       AdapterGroupVO 객체 리스트로 생성 반환하는 메서드.
    * 2. 처리 개요 : 어댑터 정보 전체를 SELECT해서 한 레코드를 AdapterGroupVO로 생성 ArrayList에
    *       저장하여 반환한다.
    * 3. 주의사항
    *
    * @param    adapterGroupName    어댑터 그룹 이름
    * @return   ArrayList 어댑터 정보 전체데이터로 AdapterGroupVO Collection
    * @exception    DAOExcepiton    DB SELECT 관련 SQLException을 포함한 어댑터 정보를 가져오다 발생되는 모든 에러
    **/
	public ArrayList<AdapterVO> getAllAdapters(String adapterGroupName) throws DAOException {
        ArrayList<AdapterVO> al = new ArrayList<AdapterVO>();
        ResultSet rs = null;
        AdapterVO vo = null;
        try {
            this.connect(SELECT_ADAPTERS_BY_GROUP);
            //logger.debug("[AdapterDAO:getAllAdapters]SELECT_ADAPTERS_BY_GROUP: "+ SELECT_ADAPTERS_BY_GROUP);

            this.preparedStatement.setString(1, adapterGroupName);
			logger.debug("바인드[1]: "+ adapterGroupName);



            rs = this.executeQuery();
            while(rs.next()) {
                vo = new AdapterVO();
                vo.setAdapterGroupName    (rs.getString("AdptrBzwkGroupName"));
                vo.setName                (rs.getString("AdptrBzwkName"));
                vo.setListenerClass       (NullControl.trimSpace(rs.getString("LstnerClsName")));
                vo.setPropGroupName       (NullControl.trimSpace(rs.getString("PrptyGroupName")));
                vo.setDescription         (NullControl.trimSpace(rs.getString("AdptrDesc")));
                vo.setBatchSystemConnCode (rs.getString("SysLnkgDstcd"));
                vo.setBatchProcessCode    (rs.getString("BjobBzwkDstcd"));
                vo.setBatchInstitutionCode(rs.getString("OsidInstiDstcd"));
                vo.setBatchServerIP       (rs.getString("LnkgIPInfoName"));
                vo.setBatchServerPortNo   (rs.getString("LnkgPortInfoName"));
                vo.setBatchInterMsgTimeout(rs.getInt   ("ToutVal"));
                vo.setBatchRcvFlowRuleCode(rs.getString("RecvPrcssRuleCd"));
                vo.setBatchInstitutionName(rs.getString("OsidInstiName"));
                vo.setLnkID(rs.getString  ("LnkgID"));
                vo.setLnkPwd(rs.getString ("LnkgPwd"));
                vo.setPacketSize          (rs.getInt("TelgmPcketSize"));
                vo.setRqstRspnsDstcd      (rs.getString("RqstRspnsDstcd"));
                vo.setBatchProcessName    (rs.getString("BjobBzwkName"));
                al.add(vo);
            }

            return al;
        } catch(Exception e) {
            throw new DAOException(ExceptionUtil.getErrorCode(e, "BECEAIMAD002"));
        } finally {
            this.disconnect();
        }
    }

    /**
    * 1. 기능 :  어댑터 그룹 및 그룹에 속한 어댑터 정보 리스트에 대한 상세 조회를 하는
    *        메서드. by 전홍성
    * 2. 처리 개요 :
    *
    * 3. 주의사항
    *
    * @param    adapterGroupName 어댑터 그룹 이름
    * @param    serverName  서버 이름
    * @exception    DAOExcepiton    DB SELECT 관련 SQLException을 포함한 어댑터 그룹 정보를 가져오다 발생되는 모든 에러
    **/
    public AdapterGroupVO getAdapterGroup(String adapterGroupName) throws DAOException {

        ResultSet rs = null;
        try {
            this.connect(GET_ADAPTER_GROUP);
            this.preparedStatement.setString(1, adapterGroupName);
            rs = this.executeQuery();

            if(!rs.next()) {
                String code = "BECEAIMAD008";
                String[] msgArgs = new String[1];
                msgArgs[0] = adapterGroupName;
                String errText = ExceptionUtil.make(code, msgArgs);
                if (logger.isError()) logger.error(errText);
                throw new DAOException(errText);
            }

            AdapterGroupVO gvo = new AdapterGroupVO();
            gvo.setName(adapterGroupName);
            gvo.setType(rs.getString("AdptrCd"));
            try {
                gvo.setUsedFlag(rs.getString("AdptrUseYn").equals("1"));
            } catch(NullPointerException e) {}
            gvo.setDescription(NullControl.trimSpace(rs.getString("AdptrBzwkGroupDesc")));
            gvo.setBatchProcessCode(rs.getString("BjobBzwkDstcd"));
            gvo.setBatchInstitutionCode(rs.getString("OsidInstiDstcd"));

            rs.close();

            this.prepareStatement(GET_ADAPTERS);
            this.preparedStatement.setString(1,adapterGroupName);
            rs = this.executeQuery();

            while(rs.next()) {
                AdapterVO vo = new AdapterVO();
                vo.setAdapterGroupName(adapterGroupName);
                vo.setName(rs.getString("AdptrBzwkName"));
                vo.setListenerClass(NullControl.trimSpace(rs.getString("LstnerClsName")));
                vo.setPropGroupName(NullControl.trimSpace(rs.getString("PrptyGroupName")));
                vo.setDescription(NullControl.trimSpace(rs.getString("AdptrDesc")));
                vo.setPropGroupDesc(NullControl.trimSpace(rs.getString("PrptyGroupDesc")));
                gvo.addAdapterVO(vo);
            }


            return gvo;
        } catch(Exception e) {
            throw new DAOException(ExceptionUtil.getErrorCode(e, "BECEAIMAD009"));
        } finally {
            this.disconnect();
        }
    }

    /**
    * 1. 기능 :  어댑터 그룹 정보 테이블 전체 내용을 SELECT해서
    *       AdapterGroupVO 객체 Vector로 생성 반환하는 메서드.
    * 2. 처리 개요 : 어댑터 그룹 정보 전체를 SELECT해서 한 레코드를 AdapterGroupVO로 생성 Vector에
    *       저장하여 반환한다.
    * 3. 주의사항
    *
    * @return   Vector 어댑터 그룹 정보 전체데이터로 AdapterGroupVO Collection
    * @exception    DAOExcepiton    DB SELECT 관련 SQLException을 포함한 어댑터 그룹 정보를 가져오다 발생되는 모든 에러
    **/
    public Vector<AdapterGroupVO> getAdptGroupNM() throws DAOException {
        Vector<AdapterGroupVO> all = new Vector<AdapterGroupVO>();
        ResultSet rs = null;
        try {
            this.connect(SELECT_ADPT_GROUP_NAMES);
            rs  = executeQuery();
            AdapterGroupVO vo = null;

            while(rs.next()) {
                vo = new AdapterGroupVO();
                vo.setName(rs.getString(1));
                all.addElement(vo);
            }

        } catch(Exception e) {
            throw new DAOException(ExceptionUtil.getErrorCode(e, "BECEAIMAD014"));
        } finally {
            this.disconnect();
        }

        return all;
    }
}
