package com.eactive.eai.adapter.wca; 

import com.eactive.eai.adapter.listener.AdapterException;
import com.eactive.eai.adapter.listener.AdapterListenerSupport;
import com.eactive.eai.adapter.wca.cfg.SNAAdapter;
import com.eactive.eai.adapter.wca.cfg.SNAAdapterManager;
import com.eactive.eai.adapter.wca.global.WCADefine;
import com.eactive.eai.common.util.ContainerUtil;
import com.eactive.eai.common.util.Logger;

/** 
* 1. 기능 : SNAAdapter 어댑터 그룹 시작, 종료시 수행되어야 할 작업
* 2. 처리 개요 : 
*      - 어댑터 그룹 시작시 SNAAdapterManager에 등록하며 세션 정보를 초기화한다.
*      - 어댑터 그룹 종료시 세션 종료한다.
* 3. 주의사항 
*
* @author  : 
* @version : v 1.0.0
* @see     : 
* @since   : 
*/
public class SNAAdapterListener extends AdapterListenerSupport
{ 
    /**
     * SNAAdapter critical한 정보 로깅을 위한 logger 
     */
    Logger adapter_logger = Logger.getLogger(WCADefine.ADAPTER_LOGGER_NAME);
    
    /** 
     * 1. 기능 : 어댑터 시작 메소드
     * 2. 처리 개요 : 
     *     - SNAAdapterManager 등록 및 초기화, INBOUND handler 등록
     * 3. 주의사항 
     *    
     * @exception    AdapterException  
     **/   
    public void start() throws AdapterException {
    	int		nRet = 0;
    	
    	if (ContainerUtil.get() == ContainerUtil.TOMCAT) {
    		return;
    	}
    	
       	adapter_logger.warn("SNAAdapterListener:start> Try To Start Adapter, AdapterInfo = " + info);
        
        SNAAdapterManager smanager = SNAAdapterManager.getInstance();        
        
        String sAdapterGroupName = this.info.getAdapterGroupName();
        String sAdapterName = this.info.getName();        
        // String eventListenerClass = PropManager.getInstance().getProperty(TableInfoEx.T_SNAADPTER_PROP_GROUP_NAME, "sna.event.listener.class");
                                            
        // 어댑터 그룹:어댑터에 해당하는 SNA Adapter 추가 및 설정
        try {
            // 기존에 해당 어댑터 그룹에 어댑터가 존재하는지 검사
        	/*
            SNAAdapter prevSnaAdapter = smanager.selectSnaAdapter(sAdapterGroupName);
            if(prevSnaAdapter != null) {
            	adapter_logger.error("SNAAdapterListener:start> Already Adapter Exist, So Don't Create New Adapter, Adapter Group Name = " + sAdapterGroupName);        	
            	return;
            }
            */
            
        	// 새로운 SNAAdapter 오브젝트 생성
            SNAAdapter snaAdapter = new SNAAdapter(sAdapterGroupName, sAdapterName);
                  
            // SNA Adapter에 해당하는 LU 그룹 정보 정보를 저장하기 위한 오브젝트 생성 및 LU 그룹에 대한 정보 Load             
            nRet = snaAdapter.initAdapter();
            if (nRet <= 0) {
                adapter_logger.warn("SNAAdapterListener:start> " + info + " LU 세션 그룹 정보가 존재하지 않습니다.");
                return;
            }
            
            // SNA 어댑터 맵에 새롭게 생성한 SNA 어댑터 추가 
            smanager.insertSnaAdapter(sAdapterGroupName, snaAdapter);
           
            // SNA 어댑터 시작 (어댑터에 속한 세션 Pool을 초기화하고 세션 Pool을 시작)
            snaAdapter.startAdapter();
            
            // sAdapter.registerEventHandler((WCAEventListener)(Class.forName(eventListenerClass).newInstance()));
            
           	adapter_logger.warn("SNAAdapterListener:start> Success To Start Adapter, AdapterInfo = " + info);           
        }
        catch (Exception e) {
           	adapter_logger.error("SNAAdapterListener:start> Exception Occurred, AdapterInfo = " + info + ", Msg = " + e.getMessage(), e);
        }
    }
    
    /** 
     * 1. 기능 : 어댑터 종료 메소드
     * 2. 처리 개요 : 
     *     - 세션 종료
     * 3. 주의사항 
     *    
     * @exception    AdapterException  
     **/   
    public void stop() throws AdapterException {
    	if (ContainerUtil.get() == ContainerUtil.TOMCAT) {
    		return;
    	}
    	
       	adapter_logger.warn("SNAAdapterListener:stop> Try To Stop Adapter, AdapterInfo = " + info);
        
        String adapterGroupName = this.info.getAdapterGroupName();
        String adapterName = this.info.getName();        
        
        SNAAdapterManager.getInstance().stopAdapter(adapterGroupName, adapterName);        

       	adapter_logger.warn("SNAAdapterListener:stop> Success To Stop Adapter, AdapterInfo = " + info);        
    }
}
