package com.eactive.eai.adapter.socket;

import com.eactive.eai.adapter.WLIDefaultAdapter;
import com.eactive.eai.adapter.socket.common.CommonLib;
import com.eactive.eai.adapter.socket.service.OutboundControl;

import java.util.Properties;

/**
* 1. 기능 : Outbound Socket Adapter를 Access하기 위한 Java Class로 SocketControl에서 사용함.
* 2. 처리 개요 :
* *     - OutboundControl Object를 통해 Outbound Socket을 통해 수동시스템과 Socket인터페이스를 위한
*         SocketAdapter Class
* 3. 주의사항
*       - Outbound Process에서 Outbound Socket의 Adapter Group Name에 대한 Property를 지정해야한다.
* @author  :
* @version : v 1.0.0
* @see : 관련 기능을 참조
* @since   :
*/
public class SocketAdapter extends WLIDefaultAdapter
{
    public static final String ADAPTER_GORUP_NAME="ADAPTER_GROUP_NAME";

    static SocketAdapter    socketAdapter = new SocketAdapter();

    private SocketAdapter() {}

    public static SocketAdapter getInstance()
	{
		return socketAdapter;
    }

    /**
    * 1. 기능 : SocketAdapter의 실행 Method
    * 2. 처리 개요 :
    *     - OutboundControl Object를 생성 후 요청된 메시지를 Assign한 후 CallService를 통해
    *       해당 Outbound Adapter Group의 Socket Connection을 얻은 후 메시지 송수신에 따른 결과를
    *       리턴한다.
    * 3. 주의사항
    *
    * @param    prop WLI OutboundAdapter의 Property정보, SocketAdapter의 경우 ADAPTER_GROUP_NAME
    *                Property Key에 Adapter Group Name을 지정한다.
    * @param    message Outbound process에서 요청하는 메시지 Object로 byte[] 속성의 메시지여야한다.
    * @return   결과메시지 Object로 SYNC 유형의 경우 byte[] 메시지가 리턴된다.
    * @exception Exception
    **/
    public Object execute(Properties prop, Object message) throws Exception {
        OutboundControl control = new OutboundControl();
        String adapterGroupName = prop.getProperty(ADAPTER_GORUP_NAME);
        control.setAdapterGroupName( adapterGroupName );

        byte[] msg = null;
        if ( message instanceof byte[]) {
            msg = (byte[]) message;
        } else {
            throw new Exception( CommonLib.getMessage("BECEAIASO003") );
        }

        return control.callService( adapterGroupName, msg );
    }
}
