package com.eactive.eai.common.logger;

import com.eactive.eai.common.exception.ExceptionUtil;
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;

/** 
* 1. 기능 : LogListener를 생성 관리하는 Manager 클래스
* 2. 처리 개요 : LogListener를 생성 관리한다.
* 3. 주의사항 
*
* @author  : 
* @version : v 1.0.0
* @see : 관련 기능을 참조
* @since   : 
*  : 
*/
public class LogListenerManager implements Lifecycle
{ 

    /**
     * Default Logger
     */
//    private static Logger logger = Logger.getLogger(Logger.LOGGER_DEFAULT);
    
    /**
     * LogListener생성 count.  LogListener생성시 증가시킴
     */
    private int count;
    
    
//    private ArrayList listeners;
    
    /**
     * LifeccyleSupport object
     */ 
    private LifecycleSupport lifecycle = new LifecycleSupport(this);

    /**
     * 기동 여부
     */ 
    private boolean started;
    
    /**
     * LogListener생성시 동기화를 위한 lock
     */
    private Object lock = new Object();
    
    /** 
    * 1. 기능 :  Lifecycle의 start 메서드로 LogListenerManager를 초기화하는 메서드
    * 2. 처리 개요 : Lifecycle의 start
    * 3. 주의사항 
    *
    * @exception    LifecycleException  이미 시작되었을 경우 발생(RECEAICLG111)
    * 
    **/
    public void start() throws LifecycleException {
        if (started)
            throw new LifecycleException("RECEAICLG111");
        // Notify our interested LifecycleListeners
        lifecycle.fireLifecycleEvent(STARTING_EVENT, null);
        
//        this.listeners = new ArrayList();
        this.count = 0;
        
        started = true;
        // Notify our interested LifecycleListeners
        lifecycle.fireLifecycleEvent(STARTED_EVENT, null);
    }
    
    /** 
    * 1. 기능 :  Lifecycle의 stop 메서드로 LogListenerManager를 종료하는 메서드
    * 2. 처리 개요 : Lifecycle의 stop 메서드로 LogListenerManager를 종료
    * 3. 주의사항 
    *
    * @exception    LifecycleException  이미 종료된 경우 발생(RECEAICLG112)
    **/
    public void stop() throws LifecycleException {
        // Validate and update our current component state
        if (!started)
            throw new LifecycleException("RECEAICLG112");
            	
        // Notify our interested LifecycleListeners
        lifecycle.fireLifecycleEvent(STOPING_EVENT, null);
        
        
        
        started = false;
        // Notify our interested LifecycleListeners
        lifecycle.fireLifecycleEvent(STOPPED_EVENT, null);
    }
    
    /** 
    * 1. 기능 :  LifecycleListener를 등록하는 메서드
    * 2. 처리 개요 : LifecycleListener를 등록한다.
    * 3. 주의사항 
    *
    * @param    listener    LifecycleEvent를 수신한 LifecycleListener
    **/
    public void addLifecycleListener(LifecycleListener listener)
    {
        lifecycle.addLifecycleListener(listener);
    }

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

    /** 
    * 1. 기능 :  등록된 LifecycleListener를 삭제하는 메서드
    * 2. 처리 개요 : 파라미터의 LifecycleListener를 삭제한다.
    * 3. 주의사항 
    *
    * @param    listener    삭제할 LifecycleListener
    **/
    public void removeLifecycleListener(LifecycleListener listener)
    {
        lifecycle.removeLifecycleListener(listener);
    }
    
    /** 
    * 1. 기능 :  LogListenerManager의 초기화 여부를 반환하는 getter 메서드
    * 2. 처리 개요 : LogListenerManager의 초기화 여부를 반환한다.
    * 3. 주의사항 
    *
    * @return   초기화 여부
    **/
    public boolean isStarted() {
        return this.started;   
    }
    
    
    /** 
    * 1. 기능 :  LogListener를 생성하고 초기화하는 메서드
    * 2. 처리 개요 : LogListener를 생성하고 생성한 LogListener를 start하여 초기화 시킨다.
    * 3. 주의사항 
    *
    **/
    public void addLogListener() {
        LogListener listener = createLogListener();
        if(listener instanceof Lifecycle) {
            try {
                listener.start();   
            } catch(Exception e) {
                String code = "RECEAICLG113";
                //if (logger.isError()) logger.error(ExceptionUtil.make(code, CodeMessageHandler.getMessage(code)));
                throw new RuntimeException(ExceptionUtil.getErrorCode(e, code));
            }
        }
    }
    
    /** 
    * 1. 기능 :  LogListener를 생성하는 메서드
    * 2. 처리 개요 : LogListener를 생성시 생성 카운트를 증가시킨다
    *     - 
    * 3. 주의사항 
    * @return 	LogListener	생성된 LogListener
    **/
    private LogListener createLogListener() {
        String name = null;
        synchronized(lock) {
            name = "LogListener["+(++count)+"]";
        }
        LogListener listener = new LogListener(name);
        
        return listener;
    }
} 
