package com.eactive.eai.batch.eventscheduler.management;

import java.util.Timer;

import com.eactive.eai.common.lifecycle.Lifecycle;
import com.eactive.eai.common.lifecycle.LifecycleException;
import com.eactive.eai.common.lifecycle.LifecycleListener;
import com.eactive.eai.common.lifecycle.LifecycleSupport;
import com.eactive.eai.common.property.PropManager;
import com.eactive.eai.common.util.Logger;

public class HolidayMonitor implements Lifecycle{
	
	/** 
     * EAI FRAMEWORK DEFAULT FILE LOGGER
     */
	static Logger logger = Logger.getLogger(Logger.LOGGER_SCHEDULER);
    
    /**
     * EAIServiceMonitor의 Singleton object
     */
    private static HolidayMonitor instance = new HolidayMonitor();
    
    /**
     * EAIServiceMonitor의 Lifecycle Event 처리를 위한 LifecycleSupport object
     */
    private LifecycleSupport lifecycle = new LifecycleSupport(this);

    /**
     * EAIServiceMonitor에서 사용하는 Poprties Group의 Key
     */
    public static final String PROP_GROUP = "HolidayMonitor";
    
    /**
     * EAIServiceMonitor에서 사용하는 Property Key : MonitorChecker의 동작 주기
     */
    public static final String PROP_PERIOD = "monitor.checker.period";

    /**
     * 일일, 최근시간별 데이터 저장을 위해 주기적으로 실행 Monitor check를 하는 TimerTask object
     */
    private HolidayChecker checker;
    
    /**
     * MonitorChecker를 실제 실행하는 Timer object - add 20080618 by kscheon
     */
    private Timer timer;

    
    /**
     * EAIServiceMonitor starting 여부를 체크하는 flag 변수
     */
    private boolean started;
    
   
    
    /** 
     * 1. 기능 :  Default 생성자
     * 2. 처리 개요 : 
     *     - 
     * 3. 주의사항 
     *
     * @param 
     * @return 
     * @exception
     **/
    private HolidayMonitor() {
      
    }
    
    /**
     * 1. 기능 : EAIServiceMonitor Singleton object를 반환하는 메서드
     * 2. 처리 개요 : 
     *    - EAIServiceMonitor Singleton object의 reference 반환
     * 3. 주의사항
     *
     *@return    EAIServiceMonitor Singleton object
     **/
    public static HolidayMonitor getInstance() {
        if(instance==null) {
            synchronized(HolidayMonitor.class) {
                if(instance==null) {
                    instance = new HolidayMonitor();
                }
            }
        }
        
        return instance;
    }

 
    /**
     * 1. 기능 : EAIServiceMonitor의 초기화 작업을 실행하는 메서드
     * 2. 처리 개요 : 
     *    - MonitorChecker객체를 생성해 Timer에 등록 실행한다.
     * 3. 주의사항
     *
     *@exception    LifecycleException  EAIServiceMonitor 초기화 실패 시 발생
     **/
    public void start() throws LifecycleException {
        if (started) {
        	throw new LifecycleException("BECEAIMEH201");
        }
        
        // Notify our interested LifecycleListeners
        lifecycle.fireLifecycleEvent(STARTING_EVENT, this);
        
        PropManager pmanager = PropManager.getInstance();
        long period = 1000*60*60*1; //10분은 1000*60*10
        
        try {
            period = Long.parseLong(pmanager.getProperty(PROP_GROUP, PROP_PERIOD));
           
        } catch(Exception e) {}
        
        
        this.checker = new HolidayChecker();
        
        this.timer = new Timer();
        this.timer.schedule(this.checker, period, period);

  
        started = true;
        // Notify our interested LifecycleListeners
        lifecycle.fireLifecycleEvent(STARTED_EVENT, this);
    }
    
    /**
     * 1. 기능 : EAIServiceMonitor의 종료시 undo 작업을 실행하는 메서드
     * 2. 처리 개요 : 
     *    - 초기화 작업 시 생성한 MonitorChecker객체를 종료한다.
     * 3. 주의사항
     *
     *@exception    LifecycleException  EAIServiceMonitor undo 작업 실패 시 발생
     **/
    public void stop() throws LifecycleException {
        // Validate and update our current component state
    	if(!started){
            throw new LifecycleException("BECEAIMEH203");
        } else {
            lifecycle.fireLifecycleEvent("stoping", this);
            
            started = false;
            this.timer.cancel();
            this.timer = null;
            this.checker = null;
            
            lifecycle.fireLifecycleEvent("stopped", this);

            return;
        }

  
    }
    
    /**
     * 1. 기능 : LifecycleListener를 등록하는 메서드
     * 2. 처리 개요 : 
     *    - LifecycleListener를 등록한다.
     * 3. 주의사항
     *
     *@param    listener    Lifecycle Evnet를 받을 LifecycleListener
     **/
    public void addLifecycleListener(LifecycleListener listener)
    {
        lifecycle.addLifecycleListener(listener);
    }

     /**
     * 1. 기능 : 등록된 LifecycleListener를 반환하는 메서드
     * 2. 처리 개요 : 
     *    - 등록된 LifecycleListener를 반환한다.
     * 3. 주의사항
     *
     *@return   등록된 LifecycleListner들
     **/
    public LifecycleListener[] findLifecycleListeners()
    {
        return lifecycle.findLifecycleListeners();
    }

    /**
     * 1. 기능 : 등록된 LifecycleListener 중 특정 LifecyleListener를 삭제하는 메서드
     * 2. 처리 개요 : 
     *    - 등록된 특정 LifecycleListener를 삭제한다.
     * 3. 주의사항
     *
     *@param    listener    삭제할 LifecycleListener
     **/
    public void removeLifecycleListener(LifecycleListener listener)
    {
        lifecycle.removeLifecycleListener(listener);
    }
    
   /**
     * 1. 기능 : EAIServiceMonitor의 start 여부를 반환하는 getter method
     * 2. 처리 개요 : 
     *    - EAIServiceMonitor의 start 여부를 반환한다.
     * 3. 주의사항
     *
     *@return   EAIServiceMonitor의 start 여부
     **/
    public boolean isStarted() {
        return this.started;   
    }
   

}
