package com.eactive.eai.adapter;

import java.util.Properties;

import com.eactive.eai.common.exception.ExceptionUtil;
import com.eactive.eai.common.util.Logger;

/**
* 1. 기능 : WLIAdapter Interface를 implements 한 Default WLIAdapter
* 2. 처리 개요 :
*     - execute hookup method를 실행한다.
*     - 실재 어댑터를 통해 통신 한다.
* 3. 주의사항
*
* @author  :
* @version : v 1.0.0
* @see : WLIAdapter, AdapterManager
* @since   :
*/
public class WLIDefaultAdapter implements WLIAdapter
{
    /**
     * Default Logger
     */
    static Logger logger = Logger.getLogger(Logger.LOGGER_ADAPTER);

    /**
     * AdapterManager instance
     */
    private AdapterManager manager;

    /**
    * 1. 기능 :  Default Constructor
    * 2. 처리 개요 :
    *     - AdapterManager instance를 생성한다.
    * 3. 주의사항
    *
    **/
    public WLIDefaultAdapter() {
        this.manager = AdapterManager.getInstance();
    }
    /*
    public Object callService(Properties prop, Object message) throws Exception {
        return callService(null,prop,message);
    }
    */

    /**
    * 1. 기능 :  execute hookup method를 실행한다.
    * 2. 처리 개요 :
    *     - execute hookup method를 실행한다.
    * 3. 주의사항
    *
    * @param    adapterGroupName    어댑터 그룹명
    * @param    prop    어댑터 Property
    * @param    message 전문 메시지
    **/
    public Object callService(String adapterGroupName, Properties prop, Object message) throws Exception{
        AdapterGroupVO group = this.manager.getAdapterGroupVO(adapterGroupName);
        if(group==null) {
            String code = "BECEAIMAD027";
            String[] msgArgs = new String[1];
            msgArgs[0] = adapterGroupName;
            String errText = ExceptionUtil.make(code, msgArgs);
            if (logger.isError()) logger.error(errText);
            throw new Exception(errText);
        }

        if(group!=null) group.increase();
        try {
            return execute(prop, message);
        } catch(Throwable e) {
            throw new Exception(ExceptionUtil.getErrorCode(e, "BECEAIMAD028"));
        } finally {
            if(group!=null) group.decrease();
        }
    }

    /**
    * 1. 기능 :  실재 어댑터를 통해 통신하는 로직을 구현한다.
    * 2. 처리 개요 :
    *     - 실재 어댑터를 통해 통신하는 로직을 구현한다.
    * 3. 주의사항
    *
    * @param    prop    어댑터 Property
    * @param    message 전문 메시지
    **/
    public Object execute(Properties prop, Object message) throws Exception {
        throw new java.lang.UnsupportedOperationException("BECEAIMAD029");
    }
}
