package com.eactive.eai.common.server;

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

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

/**
* 1. 기능 : EAI서버 정보 테이블에 대한 Data Access Object 이다.
* 2. 처리 개요 :  EAI서버 정보 테이블에 대한 Create, Read, Update, Delete 를 처리한다.
*
* 3. 주의사항
*/
public class EAIServerDAO extends BaseDAO implements EAIServerQuery
{
    
    /** 
    * 1. 기능 :  EAI서버 정보 전체를 메모리에 로딩하기 위해 테이블 전체 내용을 SELECT해서 
    *       EAIBatServerVO 객체 리스트로 생성 반환하는 메서드.
    * 2. 처리 개요 : EAI서버 정보 전체를 SELECT해서 한 레코드를 EAIBatServerVO로 생성 List에 
    *       저장하여 반환한다.
    * 3. 주의사항 
    *
    * @return   List EAI서버 정보 전체데이터로 EAIBatServerVO Collection
    * @exception    DAOExcepiton    DB SELECT 관련 SQLException을 포함한 EAI서버 정보를 가져오다 발생되는 모든 에러[RECEAICSM101]
    **/
    public HashMap<String, EAIServerVO> getAllServers() throws DAOException {
        HashMap<String, EAIServerVO> all = new HashMap<String, EAIServerVO>();
        ResultSet rs = null;
        try {
            this.connect(GET_ALL_SERVERS);   
            rs  = executeQuery();
            EAIServerVO vo = null;
            while(rs.next()) {
                vo = new EAIServerVO(rs.getString(1));
                vo.setAddress(rs.getString(2));
                vo.setPort(rs.getString(3));
                vo.setFailoverSvr(rs.getString(4));    
                vo.setHostName(rs.getString(5));
                all.put(vo.getName(), vo);
            }
        } catch(Exception e) {
            throw new DAOException(ExceptionUtil.getErrorCode(e, "BECEAIUSV001"));
        } finally {
            this.disconnect();   
        }
        return all;    
    }

    /**
     * <pre>
     * 1. 기능 : EAI서버정보 리스트를 조회 
     * 2. 처리 개요 : 
     *     - 
     * 3. 주의사항 : 
     * </pre>
     * @author  : 
     * @since : rts 1.0
     * @return
     * @throws DAOException
     */
    public ArrayList<EAIServerVO> getAllServerList() throws DAOException {
        ArrayList<EAIServerVO> arr = new ArrayList<EAIServerVO>();
        ResultSet rs = null;
        try {
            this.connect(GET_ALL_SERVERS);   
            rs  = executeQuery();
            EAIServerVO vo = null;
            while(rs.next()) {
                vo = new EAIServerVO(rs.getString(1));
                vo.setAddress(rs.getString(2));
                vo.setPort(rs.getString(3));
                vo.setFailoverSvr(rs.getString(4));    
                vo.setHostName(rs.getString(5));                 
                arr.add(vo);
            }
        } catch(Exception e) {
            throw new DAOException(ExceptionUtil.getErrorCode(e, "BECEAIUSV002"));
        } finally {
            this.disconnect();   
        }
        return arr;    
    }    
    
    /** 
    * 1. 기능 : 관리 기능을 위해 EAI서버정보 리스트를 가져오는 메서드
    * 2. 처리 개요 : 특정 page에 대한 리스트 정보를 조회와 전체 레코드 수를 HashMap에 저장 반환한다.
    *     - Total Count를 SELECT 해서 HashMap에 "TOTCNT"로 저장한다.
    *     - 파라미터의 PageInfo에 저장된 page에 해당하는 추출정보리스트를 ArrayList로 만들어 HashMap에
    *       "LIST"로 저장한다. 
    * 3. 주의사항 
    *
    * @param    page    리스트 보기 기능에서 사용하는 페이지수, 검색 항목을 저장하기 위한 Value object
    * @return   TotalCount와 페이지 리스트 정보를 저장하고 있는 HashMap
    * @exception    DAOException    DB SELECT 관련 SQLException을 포함한 페이지 리스트를 생성하다 발생하는 모든 에러 
    **/

    /*
    public HashMap getServerPageList(PageInfo page,String likeKey) throws DAOException {
        ResultSet rs = null;
        try {
            this.connect(SELECT_SERVER_TOTALCOUNT);
            this.preparedStatement.setString(1, "%"+likeKey+"%");
            rs = this.executeQuery();
            rs.next();
            int totalCount = rs.getInt(1);
            rs.close();
            
            this.prepareStatement(SELECT_SERVER_PAGELIST);
            this.preparedStatement.setString(1, "%"+likeKey+"%");
            this.preparedStatement.setInt(2, page.startrow());
			this.preparedStatement.setInt(3, page.endrow());
			rs = this.executeQuery();

            ArrayList al = new ArrayList();            
            EAIServerVO vo = null;
            while(rs.next()) {
                vo = new EAIServerVO();
                vo.setName(rs.getString(2));
                vo.setAddress(rs.getString(3));
                vo.setPort(rs.getString(4)); 
                vo.setFailoverSvr(rs.getString(5));  
                vo.setHostName(rs.getString(6));
                al.add(vo);
            }
            
            HashMap map = new HashMap();
			map.put("TOTCNT", new Integer(totalCount));
			map.put("LIST", al);
			return (map);
        }  catch(Exception e) {
            throw new DAOException(ExceptionUtil.getErrorCode(e, "BECEAIUSV003"));
            
        } finally {
            this.disconnect();
        } 
    }
    */
    
	/** 
    * 1. 기능 : EAI서버 Rule 정보를 등록하는 메서드
    * 2. 처리 개요 : 파라미터의 EAI서버 Rule 정보를 DB 테이블에 INSERT한다.
    * 3. 주의사항 
    *
    * @param    EAIBatServerVO
    * @exception    DAOException    DB INSERT 시 발생하는 SQLException을 포함한 EAI서버 저장시 발생되는 모든 에러
    **/
    public void addServer(EAIServerVO vo) throws DAOException {
        try {
            this.connect(ADD_SERVER);
            this.preparedStatement.setString(1,vo.getName());
            this.preparedStatement.setString(2,vo.getAddress());
            this.preparedStatement.setString(3,vo.getPort());    
            this.preparedStatement.setString(4,vo.getFailoverSvr());
            this.preparedStatement.setString(5,vo.getHostName());
            executeUpdate();
        } catch(Exception e) {
            throw new DAOException(ExceptionUtil.getErrorCode(e, "BECEAIUSV004"));
        } finally {
            this.disconnect();   
        }   
    }
    
    /** 
    * 1. 기능 : 특정 EAI서버 Rule 상세 정보를 가져오는 메서드
    * 2. 처리 개요 : 파라미터의 bwkClsCd에 따른 EAI서버 상세정보를
    *       조회하여 EAIBatServerVO 객체를 생성 반환
    * 3. 주의사항 
    *
    * @param    name    EAI서버명
    * @return EAI서버 Rule 정보를 표현한 EAIBatServerVO 객체 반환 
    * @exception    DAOException    DB SELECT 시 발생하는 SQLException을 포함한 EAI서버 Rule 상세정보 생성 시 발생하는 모든 에러(RECEAICBM205)
    **/
    public EAIServerVO getServer(String name) throws DAOException {
        try {
            ResultSet rs = null;
            EAIServerVO svr = new EAIServerVO(name);
            this.connect(GET_SERVER);
            this.preparedStatement.setString(1, name);
            rs = executeQuery();
            if(!rs.next()) throw new DAOException("RECEAICSM104");
            svr.setAddress(rs.getString(1));
            svr.setPort(rs.getString(2));         
            svr.setFailoverSvr(rs.getString(3));
            svr.setHostName(rs.getString(4));

            return svr;
        } catch(Exception e) {
            throw new DAOException(ExceptionUtil.getErrorCode(e, "BECEAIUSV005"));
        } finally {
            this.disconnect();   
        }           
    }
    
    /** 
    * 1. 기능 : EAI서버 Rule 정보를 변경하는 메서드
    * 2. 처리 개요 : 파라미터의 해당하는 EAI서버 Rule 정보의 상세 정보를 변경한다.
    * 3. 주의사항 
    *
    * @param    EAIBatServerVO    EAIBatServerVO
    * @exception    DAOException    DB UPDATE 시 발생하는 SQLException을 포함한 EAI서버 정보 변경시 발생되는 모든 에러
    **/
    public void updateServer(EAIServerVO vo) throws DAOException {
        try {

        	this.connect(UPDATE_SERVER);
            this.preparedStatement.setString(1,vo.getAddress());
            this.preparedStatement.setString(2,vo.getPort());
            this.preparedStatement.setString(3,vo.getFailoverSvr());
            this.preparedStatement.setString(4,vo.getHostName());
            this.preparedStatement.setString(5,vo.getName());
            
            int result = executeUpdate();
            if(result!=1) throw new Exception("update fail");
        } catch(Exception e) {
            throw new DAOException(ExceptionUtil.getErrorCode(e, "BECEAIUSV006"));
        } finally {
            this.disconnect();   
        }
    }
    
    /** 
    * 1. 기능 : EAI서버 정보 삭제하는 메서드 
    * 2. 처리 개요 : 파라미터의 EAI서버 Rule 정보를 DB 테이블에서 삭제한다.
    * 3. 주의사항 
    *
    * @param    bwkClsCd    EAI서버코드
    * @exception    DAOException    DB DELETE 시 발생하는 SQLException을 포함한 추출정보 삭제시 발생되는 모든 에러
   **/
    public void removeServer(String name) throws DAOException {
        try {
            this.connect(REMOVE_SERVER);
            this.preparedStatement.setString(1,name);
            executeUpdate();
        } catch(Exception e) {
            throw new DAOException(ExceptionUtil.getErrorCode(e, "BECEAIUSV007"));
        } finally {
            this.disconnect();   
        }   
    }
    
    /** 
    * 1. 기능 : EAI서버 Rule 정보에서 EAI서버명 리스트를 조회
    * 2. 처리 개요 : EAI서버 Rule 정보에서 EAI서버명 리스트를 조회한다.
    * 3. 주의사항 
    *
    * @return   Vector EAI서버명 리스트
    * @exception    DAOException    DB DELETE 시 발생하는 SQLException을 포함한 추출정보 삭제시 발생되는 모든 에러
   **/
    
    /*
    public Vector getServerNm() throws DAOException {
        Vector all = new Vector();
        ResultSet rs = null;
        try {
            this.connect(GET_SERVERS_NAME);   
            rs  = executeQuery();
            EAIServerVO vo = null;
            
            while(rs.next()) {  
                vo = new EAIServerVO();            
                vo.setName(rs.getString(1));
                all.addElement(vo);                                          
            }
          
        } catch(Exception e) {
            throw new DAOException(ExceptionUtil.getErrorCode(e, "BECEAIUSV008"));
        } finally {
            this.disconnect();   
        }
        
        return all;  
    } 
    */       
} 
