//package com.eactive.eai.adapter.socket.service;
//
//import java.io.IOException;
//import java.net.InetAddress;
//import java.net.Socket;
//import java.nio.ByteBuffer;
//
////import com.eactive.eai.adapter.socket.common.BoundedLinkedQueue;
//import com.eactive.eai.adapter.socket.common.CommonLib;
//import com.eactive.eai.adapter.socket.common.DiagLogger;
//import com.eactive.eai.adapter.socket.common.SocketAdapterException;
//import com.eactive.eai.adapter.socket.config.ConfigurationContext;
//import com.eactive.eai.adapter.socket.config.SocketAdapterManager;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
////import com.eactive.eai.adapter.socket.common.DiagLogger;
//import java.net.InetSocketAddress;
//import java.nio.channels.SocketChannel;
//
//public class OutboundClient extends Thread implements SocketService {
//
//    protected ConfigurationContext context;
//    protected boolean              active;
//    protected NBChannel            channel;
//    protected Exception            lastError;
//    protected boolean              retryFlag;
//    protected int                  sendCount;
//    protected int                  recvCount;
//    protected long                 firstActivity;
//    protected long                 lastActivity;
//    protected ByteBuffer           incomingMessage;
//    protected ByteBuffer           outgoingMessage;
//    protected ByteBuffer           lenBuffer;
//    protected int                  currentState;
//    protected Logger               logger;
//    protected static Logger        errLogger = SocketLogManager.getInstance().getErrLogger();
//    protected OutboundControl      control;
//
//    public OutboundClient(ConfigurationContext context) {
//        String name = this.getName();
//        this.setName( context.getAdapterName() + "-CONNECTION" + name.substring( name.lastIndexOf("-")) );
//
//        this.context      = context;
//        active            = true;
//        retryFlag         = true;
//
//        sendCount         = 0;
//        recvCount         = 0;
//        firstActivity     = System.currentTimeMillis();
//        lastActivity      = System.currentTimeMillis();
//
//        incomingMessage   = null;
//        outgoingMessage   = null;
//        lenBuffer         = ByteBuffer.allocate( this.context.getLlFieldLength() );
//        lenBuffer.clear();
//        this.control      = null;
//        this.currentState = isAckProtocol() ? CommonLib.NEGOTIATING_PROTOCOL : CommonLib.PROCESSING_PROTOCOL;
//        logger            = SocketLogManager.getInstance().getLogger( this.context.getAdapterGroupName());
//    }
//
//    protected int getTraceLevel() {
//        return context.getTraceLevel();
//    }
//    /**
//     * @return Returns the context.
//     */
//    public ConfigurationContext getContext() {
//        return context;
//    }
//
//    protected boolean isSyncMode() {
//        return context.isSyncMode();
//    }
//
//    protected boolean isAckProtocol() {
//        return context.isAckProtocol();
//    }
//
//    protected long getTimeout() {
//        return ( this.context.getTimeout() * 1000L );
//    }
//
//    protected boolean isSocketReuse() {
//        return this.context.getSocketReuse().equals( ConfigurationContext.TRUE_FLAG );
//    }
//
//    public void run() {
//
//        String  socketInfo = "";
//
//        while ( active && retryFlag ) {
//            try {
//                openChannel();
//                if ( !socketInfo.equals( getSocketInfo(this.getCurrentSocket()) ) ) {
//                    socketInfo = getSocketInfo( this.getCurrentSocket() );
//                    if ( getTraceLevel() >= DiagLogger.INFO ) {
//                        logger.info( CommonLib.getMessage("BICEAIASO001", new String[]{ context.getAdapterName(), socketInfo , Thread.currentThread().getName() }) );
//                    }
//                }
//                if ( currentState == CommonLib.NEGOTIATING_PROTOCOL ) {
//                    if ( !negotiateProtocol() ) {
//                        if ( active ) {
//                            waitRecoverConnection();
//                        }
//                        continue;
//                    } else {
//                        currentState = CommonLib.PROCESSING_PROTOCOL;
//                    }
//                }
//
//                onMessage();
//
//                if ( control == null ) {
//                    continue;
//                }
//
//                doRequest();
//
//                if ( !isSocketReuse() ) {
//                    closeChannel();
//                }
//
//            } catch (Exception e) {
//                String errMsg = CommonLib.getMessage("BECEAIASO001", new String[]{context.getAdapterName(), "openChannel", e.getMessage(), "", "" } );
//                logger.error( errMsg, e );
//
//                if ( this.control != null ) {
//                    lastError = new SocketAdapterException( errMsg );
//                    wakeup();
//                }
//                if ( active && retryFlag ) {
//                    waitRecoverConnection();
//                }
//            }
//        }
//
//        try {
//            closeChannel();
//        } catch( Throwable e ) {}
//
//        SocketAdapterManager.getInstance().removeConnection( this );
//
//        if ( getTraceLevel() >= DiagLogger.INFO ) {
//            logger.info( CommonLib.getMessage("BICEAIASO002", new String[]{ context.getAdapterName(), socketInfo, Thread.currentThread().getName() }) );
//        }
//
//        interrupt();
//    }
//
//    protected String  getReadingMessage() {
//        String rMsg = "";
//        if ( incomingMessage != null && incomingMessage.position() > 0 ) {
//            byte[] dMsg = new byte[ incomingMessage.position() ];
//            System.arraycopy( incomingMessage.array(), 0, dMsg, 0, dMsg.length );
//            rMsg = CommonLib.getDumpMessage( dMsg );
//        }
//        return rMsg;
//    }
//
//    protected String  getWritingMessage() {
//        String rMsg = "";
//        if ( outgoingMessage != null ) {
//            byte[] debugMsg = new byte[ outgoingMessage.capacity() - lenBuffer.capacity() ];
//            System.arraycopy( outgoingMessage.array(), lenBuffer.capacity(), debugMsg, 0, debugMsg.length );
//            rMsg = CommonLib.getDumpMessage( debugMsg );
//        }
//        return rMsg;
//    }
//
//    protected String  getSocketInfo(Socket socket) {
//        StringBuffer connInfo = new StringBuffer();
//
//        connInfo.append("Local Address=");
//        connInfo.append( socket.getLocalAddress().getHostAddress()).append(":").append(socket.getLocalPort()).append(", ");
//        connInfo.append("Remote Address=");
//        connInfo.append( socket.getInetAddress().getHostAddress()).append(":").append(socket.getPort());
//
//        return connInfo.toString();
//    }
//
//    protected synchronized void onMessage() {
//        try {
//            if ( this.control == null ) {
//                this.wait( 1000L );
//            }
//            if ( retryFlag && this.control == null ) {
//                checkConnection();
//            }
//            this.lastError = null;
//        } catch ( InterruptedException ie ) {}
//    }
//
//    public void wakeup() {
//        this.control.setLastError( this.lastError );
//        this.control.wakeup();
//        this.control = null;
//        if ( retryFlag ) {
//            OutboundChannelManager.getInstance().addConnection(context.getAdapterGroupName(), this );
//        }
//    }
//
//    public synchronized void notifyMessage() {
//        this.notify();
//    }
//
//    public synchronized void setControl(Object control) {
//        this.control = (OutboundControl) control;
//        this.control.setRespTimeout( getTimeout() );
//    }
//
//
//    public int getCurrentState() {
//        return this.currentState;
//    }
//
//    protected void resetCount() {
//        this.recvCount = 0;
//        this.sendCount = 0;
//    }
//
//    public boolean isConnected() {
//        boolean flag = false;
//        try {
//            flag = this.channel.isConnected();
//        } catch( Exception e ) {}
//        return flag;
//    }
//
//    public void checkActivity() {
//        long currentTime = System.currentTimeMillis();
//        if ( !CommonLib.getDate( this.lastActivity ).equals( CommonLib.getDate( currentTime )) ) {
//            this.resetCount();
//        }
//    }
//    /**
//     * NEGOTIATING PROTOCOL WITH REMOTE SERVER, WITH ACK-PROTOCOL
//     * 1.  SEND '<SYNC>|<ASYN>'
//     * 2.  RECV 'ACK|NACK ...'
//     * 3.  RETURN TRUE/FALSE
//     */
//
//    protected boolean negotiateProtocol() {
//
//        boolean success = false;
//        this.checkActivity();
//        lastActivity    = System.currentTimeMillis();
//        try {
//            if ( isSyncMode() ) {
//                processWriteMessage( CommonLib.SYNC_PROTOCOL_MESSAGE );
//            } else {
//                processWriteMessage( CommonLib.ASYNC_PROTOCOL_MESSAGE );
//            }
//            sendCount++;
//
//            if ( getTraceLevel() >= DiagLogger.DEBUG ) {
//                logger.debug( CommonLib.getMessage("BDCEAIASO001", new String[]{context.getAdapterName(), "SEND", CommonLib.getTimestamp(), this.getSocketInfo( getCurrentSocket() ), getWritingMessage()}));
//            }
//
//            lenBuffer.clear();
//            incomingMessage = ByteBuffer.allocate( readLength( lenBuffer ) );
//            processReadMessage( incomingMessage );
//            recvCount++;
//
//            if ( getTraceLevel() >= DiagLogger.DEBUG ) {
//                logger.debug( CommonLib.getMessage("BDCEAIASO001", new String[]{context.getAdapterName(), "RECV", CommonLib.getTimestamp(), this.getSocketInfo( getCurrentSocket() ), getReadingMessage()}));
//            }
//
//            if ( CommonLib.compare( incomingMessage.array(), CommonLib.ACK_MESSAGE ) ) {
//                success = true;
//            } else {
//                // 메시지수신
//                logger.error( CommonLib.getMessage("BECEAIASO005", new String[]{context.getAdapterName(), getSocketInfo(getCurrentSocket())}) );
//                logger.error( CommonLib.getMessage("BDCEAIASO001", new String[]{context.getAdapterName(), "RECV", CommonLib.getTimestamp(), this.getSocketInfo(getCurrentSocket()), getReadingMessage()}));
//            }
//
//        } catch ( Exception e ) {
//            String errMsg = "";
//            if ( lenBuffer.position() > 0 ) {
//                errMsg = CommonLib.getMessage("BECEAIASO001", new String[]{context.getAdapterName(), "negotiateProtocol", e.getMessage(), "수신메시지", getReadingMessage() } );
//            } else {
//                errMsg = CommonLib.getMessage("BECEAIASO001", new String[]{context.getAdapterName(), "negotiateProtocol", e.getMessage(), "송신메시지", getWritingMessage() } );
//            }
//            logger.error( errMsg , e);
//        }
//        lenBuffer.clear();
//        return success;
//    }
//
//    protected void processWriteAckMessage() throws Exception {
//        try {
//            processWriteMessage( CommonLib.ACK_MESSAGE );
//        } catch( Exception e ) {
//            String errMsg = CommonLib.getMessage("BECEAIASO001", new String[]{context.getAdapterName(), "processWriteAckMessage", e.getMessage(), "수신메시지", getReadingMessage() } );
//            logger.error( errMsg , e);
//            if ( logger != errLogger ) {
//                errLogger.error( errMsg, e );
//            }
//            throw new Exception("ACK메시지 송신에러 : " + e.getMessage() );
//        }
//        if ( getTraceLevel() >= DiagLogger.DEBUG ) {
//            logger.debug( CommonLib.getMessage("BDCEAIASO001", new String[]{context.getAdapterName(), "SEND", CommonLib.getTimestamp(), this.getSocketInfo(getCurrentSocket()), CommonLib.getDumpMessage(CommonLib.ACK_MESSAGE) }));
//        }
//    }
//
//    protected void processReadAckMessage() throws Exception {
//
//        try {
//            lenBuffer.clear();
//            incomingMessage = ByteBuffer.allocate( readLength( lenBuffer ) );
//            processReadMessage( incomingMessage );
//        } catch (Exception e) {
//            String errMsg = CommonLib.getMessage("BECEAIASO001", new String[]{context.getAdapterName(), "processReadAckMessage", e.getMessage(), "송신메시지", getWritingMessage() } );
//            logger.error( errMsg , e);
//            if ( logger != errLogger ) {
//                errLogger.error( errMsg, e );
//            }
//            lenBuffer.clear();
//            throw new Exception("ACK메시지 수신에러 : " + e.getMessage() );
//        }
//
//        if ( getTraceLevel() >= DiagLogger.DEBUG ) {
//            logger.debug( CommonLib.getMessage("BDCEAIASO001", new String[]{context.getAdapterName(), "RECV", CommonLib.getTimestamp(), getSocketInfo(getCurrentSocket()), CommonLib.getDumpMessage(incomingMessage.array())}));
//        }
//
//        if ( CommonLib.compare( incomingMessage.array(), CommonLib.ACK_MESSAGE ) ) {
//            lenBuffer.clear();
//            return;
//        } else {
//            // 메시지수신
//            logger.error( CommonLib.getMessage("BECEAIASO006", new String[]{context.getAdapterName(), getSocketInfo(getCurrentSocket()), CommonLib.getDumpMessage(incomingMessage.array())}));
//            if ( logger != errLogger ) {
//                errLogger.error( CommonLib.getMessage("BECEAIASO006", new String[]{context.getAdapterName(), getSocketInfo(getCurrentSocket()), CommonLib.getDumpMessage(incomingMessage.array())}));
//            }
//            lenBuffer.clear();
//            throw new IOException("송신에 대한 ACK 메시지 수신에러");
//        }
//    }
//
//    protected void checkConnection() {
//        try {
//            boolean flag = false;
//            if ( this.control != null ) return;
//
//            synchronized ( this ) {
//                if ( channel == null ) return;
//                flag = channel.isConnected();
//            }
//
//            if ( active && this.control == null && !flag ) {
//                waitRecoverConnection();
//            }
//        } catch( Exception e ) {
//            if ( active ) {
//                waitRecoverConnection();
//            }
//        }
//    }
//
//
//    // RESPONSE MODE의 경우
//    protected void doRequest() throws Exception {
//
//        try {
//            openChannel();
//        } catch(IOException e) {
//            String errMsg = CommonLib.getMessage("BECEAIASO001", new String[]{context.getAdapterName(), "doRequest의 openChannel", e.getMessage(), "", "" } );
//            logger.error( errMsg, e );
//            lastError = new SocketAdapterException( errMsg );
//            wakeup();
//            if ( active ) {
//                waitRecoverConnection();
//            }
//            return;
//        }
//
//        this.checkActivity();
//        lastActivity    = System.currentTimeMillis();
//
//        try {
//
//            processWriteMessage( this.control.getRequest() );
//
//            sendCount++;
//
//            if ( getTraceLevel() >= DiagLogger.DEBUG ) {
//                logger.debug( CommonLib.getMessage("BDCEAIASO001", new String[]{context.getAdapterName(), "SEND", CommonLib.getTimestamp(), getSocketInfo(getCurrentSocket()), getWritingMessage()}));
//            }
//
//            if ( isAckProtocol() ) {
//                processReadAckMessage();
//            }
//
//            if ( !isSyncMode() ) {
//                wakeup();
//                return;
//            }
//
//            outgoingMessage.clear();
//            lenBuffer.clear();
//
//            // 동기인 경우, SYNC
//            incomingMessage = ByteBuffer.allocate( readLength( lenBuffer ) );
//            processReadMessage( incomingMessage );
//
//            recvCount++;
//
//            this.control.setResponse( incomingMessage.array() );
//
//            if ( getTraceLevel() >= DiagLogger.DEBUG ) {
//                logger.debug( CommonLib.getMessage("BDCEAIASO001", new String[]{context.getAdapterName(), "RECV", CommonLib.getTimestamp(), getSocketInfo(getCurrentSocket()), CommonLib.getDumpMessage(incomingMessage.array())}));
//            }
//
//            if ( isAckProtocol() ) {
//                processWriteAckMessage();
//            }
//
//            incomingMessage.clear();
//            lenBuffer.clear();
//
//            wakeup();
//
//        } catch( Exception  e) {
//            String errMsg = "";
//            errMsg = CommonLib.getMessage("BECEAIASO001", new String[]{context.getAdapterName(), "processReadMessage", e.getMessage(), "송신메시지", CommonLib.getDumpMessage( this.control.getRequest() ) } );
//            logger.error( errMsg , e);
//            if ( logger != errLogger ) {
//                errLogger.error( errMsg, e );
//            }
//
//            if ( lenBuffer.position() > 0 ) {
//                errMsg = CommonLib.getMessage("BECEAIASO001", new String[]{context.getAdapterName(), "processReadMessage", e.getMessage(), "수신메시지", getReadingMessage() } );
//                logger.error( errMsg , e);
//                if ( logger != errLogger ) {
//                    errLogger.error( errMsg, e );
//                }
//            }
//
//            lastError = new SocketAdapterException( errMsg );
//
//            wakeup();
//
//            if ( active ) {
//                waitRecoverConnection();
//            }
//        }
//    } // end of doRequest()
//
//    /**
//     * Socket Recovery Manager에 의해 Connection Recovery가 되도록 기다린다.
//     *
//     */
//    public synchronized void waitRecoverConnection() {
//        try {
//            if ( !retryFlag ) return;
//            this.currentState   = CommonLib.NEGOTIATING_PROTOCOL;
//            try { closeChannel(); } catch(Exception ie) {}
//            if ( retryFlag && SocketAdapterManager.getInstance().addError( this ) ) {
//                this.wait();
//                this.currentState = isAckProtocol() ? CommonLib.NEGOTIATING_PROTOCOL : CommonLib.PROCESSING_PROTOCOL;
//            }
//        } catch ( InterruptedException e ) {}
//    }
//
//    /**
//     * Socket Recovery Manager에 의해 recovery되면 Socket Recovery Manager에 의해 통지된다.
//     *
//     */
//    public synchronized void notifyRecoverConnection() {
//
//        if ( !this.retryFlag ) return;
//
//        this.currentState = isAckProtocol() ? CommonLib.NEGOTIATING_PROTOCOL : CommonLib.PROCESSING_PROTOCOL;
//
//        this.notify();
//    }
//
//    public boolean idle(long timeout) {
//        long idleTime   = System.currentTimeMillis() - this.lastActivity;
//
//        return ( idleTime > timeout );
//    }
//
//    /**
//     * @param buffer
//     * @return
//     * @throws Exception
//     */
//    protected int readLength( ByteBuffer buffer ) throws Exception {
//        int length = 0;
//
//        long waitTime    = ( getTimeout() <= 0 ) ? System.currentTimeMillis() : getTimeout();
//        long start        = System.currentTimeMillis();
//        long msecs        = waitTime;
//
//        while ( buffer.position() < buffer.capacity() ) {
//            while ( buffer.position() < buffer.capacity() ) {
//                length = channel.read( buffer );
//
//                waitTime = msecs - (System.currentTimeMillis() - start);
//
//                if ( waitTime <= 0 ) {
//                    byte[] lmsg = new byte[ buffer.position() ];
//                    System.arraycopy( buffer.array(), 0, lmsg, 0, lmsg.length );
//                    String errMsg = CommonLib.getMessage("BECEAIASO004", new String[]{context.getAdapterName(), getSocketInfo(getCurrentSocket()), Long.toString(getTimeout()), "수신",  "X'" + CommonLib.byte2Hex( lmsg )+ "'"  });
//                    logger.error( errMsg );
//
//                    if ( logger != errLogger ) {
//                        errLogger.error( errMsg );
//                    }
//                    throw new Exception( errMsg );
//                }
//
//                if ( length < 1 ) break;
//            }
//            if(length == -1) {
//                if ( buffer.position() > 0 ) {
//                    throw new Exception( CommonLib.getMessage("BECEAIASO002", new String[]{context.getAdapterName(), getSocketInfo(getCurrentSocket())}) );
//                } else {
//                    String errMsg = CommonLib.getMessage("BICEAIASO003", new String[]{context.getAdapterName(), getSocketInfo(getCurrentSocket())});
//                    if(logger.isInfoEnabled()){
//                        logger.info( errMsg );
//                    }
//                    throw new Exception( errMsg  );
//                }
//            }
//
//            if ( buffer.position() == buffer.capacity() ) {
//                length = checkLengthField( buffer );
//            }
//        }
//        return length;
//    }
//
//
//    protected void processReadMessage( ByteBuffer buffer ) throws Exception {
//        int i = 0;
//        boolean isDone = false;
//        buffer.clear();
//
//        long waitTime    = ( getTimeout() <= 0 ) ? System.currentTimeMillis() : getTimeout();
//        long start        = System.currentTimeMillis();
//        long msecs        = waitTime;
//
//        while ( !isDone  ) {
//
//            while ( buffer.position() < buffer.capacity() ) {
//                i = channel.read( buffer );
//
//                waitTime = msecs - (System.currentTimeMillis() - start);
//
//                if ( waitTime <= 0 ) {
//                    String errMsg = CommonLib.getMessage("BECEAIASI006", new String[]{context.getAdapterName(), getSocketInfo(getCurrentSocket()), Long.toString(getTimeout()), "수신",  getReadingMessage() });
//                    logger.error( errMsg );
//
//                    if ( logger != errLogger ) {
//                        errLogger.error( errMsg );
//                    }
//                    throw new Exception( CommonLib.getMessage("BECEAIASI006", new String[]{context.getAdapterName(), getSocketInfo(getCurrentSocket()), Long.toString(getTimeout()), "",  "" }) );
//                }
//
//                if ( i < 1 ) break;
//            }
//
//            if(i == -1) {
//                throw new Exception( CommonLib.getMessage("BECEAIASO002", new String[]{context.getAdapterName(), getSocketInfo(getCurrentSocket())}) );
//            } else if ( buffer.position() == buffer.capacity() ) {
//                isDone = true;
//            }
//        } // end of while
//    } // end of readData
//
//    protected void processWriteMessage( byte[] data ) throws IOException {
//
//        outgoingMessage      = ByteBuffer.allocate( data.length + lenBuffer.capacity() );
//        outgoingMessage.clear();
//        outgoingMessage.put( makeLengthField( data.length ) );
//        outgoingMessage.put( data );
//        outgoingMessage.flip();
//
//        long writeStart     = System.currentTimeMillis();
//
//        int  expectedWrite  = outgoingMessage.capacity();
//        int  writtenByte    = channel.write( outgoingMessage );
//
//        if ( expectedWrite != writtenByte ) {
//            ByteBuffer buf = null;
//            while ( writtenByte < expectedWrite ) {
//                buf = ByteBuffer.allocate( expectedWrite - writtenByte );
//                buf.clear();
//                buf.put( outgoingMessage.array(), writtenByte, buf.capacity() );
//                writtenByte += channel.write( buf );
//                if ( expectedWrite == writtenByte ) return;
//                long  waitTime = System.currentTimeMillis() - writeStart;
//                if ( waitTime >= getTimeout() ) {
//                    throw new IOException("메시지 송신 타임아웃");
//                }
//            }
//        }
//    }
//
//    protected byte[] makeLengthField(int length) {
//        byte[] lenField = new byte[ lenBuffer.capacity() ];
//
//        if ( lenField.length == 2 ) {
//            lenBuffer.clear();
//            lenBuffer.putShort( (short) (length & 0xFFFF) );
//            lenField = lenBuffer.array();
//        } else if ( lenField.length == 4 ) {
//            lenBuffer.clear();
//            lenBuffer.putInt( length );
//            lenField = lenBuffer.array();
//        } else {
//            String lenStr = CommonLib.getFormatString( length, lenField.length );
//            lenField    = lenStr.getBytes();
//        }
//
//        return lenField;
//    }
//
//    protected int checkLengthField(ByteBuffer buffer) throws SocketAdapterException {
//        int length = 0;
//
//        if ( buffer.capacity() == 2 ) {
//            length = ( buffer.getShort(0) & 0xFFFF );
//        } else if ( buffer.capacity() == 4 ) {
//            length = ( buffer.getInt(0) );
//            if ( length < 0 ) {
//                throw new SocketAdapterException( CommonLib.getMessage("BECEAIASO007", new String[]{context.getAdapterName(), getSocketInfo(getCurrentSocket()), CommonLib.byte2Hex( buffer.array() ) }) );
//            }
//        } else {
//            String lenStr = new String( buffer.array() );
//            try {
//                length = Integer.parseInt( lenStr );
//            } catch ( NumberFormatException e ) {
//                throw new SocketAdapterException( CommonLib.getMessage("BECEAIASO007", new String[]{context.getAdapterName(), getSocketInfo(getCurrentSocket()), CommonLib.byte2Hex( buffer.array() ) }) );
//            }
//        }
//
//        return length;
//    }
//
//    public boolean isActive() {
//        return retryFlag;
//    }
//
//    public synchronized void shutdown() {
//
//        active    = false;
//        retryFlag = false;
//        SocketAdapterManager.getInstance().removeError( this );
//        try {
//            this.notify();
//        } catch( Exception e ) {}
//
//        try {
//            if ( this.channel != null ) {
//                this.channel.wakeup();
//            }
//        } catch ( Throwable e ) {}
//
//        try {
//            closeChannel();
//        } catch (Exception e) {}
//
//        SocketAdapterManager.getInstance().removeError( this );
//    }
//
//    public Socket getCurrentSocket() {
//        return channel.getSocket();
//    }
//
//    public boolean connect() {
//
//        try {
//            openChannel();
//            return true;
//        } catch ( Exception e ) {
//            return false;
//        }
//    }
//
//    public void disconnect() {
//        shutdown();
//    }
//
//    protected synchronized void openChannel() throws IOException {
//
//        if ( channel != null ) {
//            try {
//                if ( !channel.isConnected() ) {
//                    SocketAdapterManager.getInstance().removeState( this );
//                    closeChannel();
//                }
//            } catch(Exception e) {
//            }
//        }
//
//        if ( channel == null || !channel.isOpen() ) {
//            if (!retryFlag) return;
//
//            SocketChannel socketChannel = SocketChannel.open();
//            if ( context.getLocalHostName() != null && !context.getLocalHostName().equals("") ) {
//                socketChannel.socket().bind( new InetSocketAddress( InetAddress.getAllByName(context.getLocalHostName())[0], context.getLocalPortNumber() ) );
//                socketChannel.connect( new InetSocketAddress( context.getHostName(), context.getPortNumber() ) );
//            } else {
//                socketChannel.connect( new InetSocketAddress( context.getHostName(), context.getPortNumber() ) );
//            }
//
//            socketChannel.socket().setTcpNoDelay(true);
//            socketChannel.configureBlocking(false);
//
//            if ( isSocketReuse() ) {
//                socketChannel.socket().setSoLinger(true, 0);
//            }
//
//            channel            = new NBChannel( socketChannel, getTimeout() );
//
//            // Connection 시 통계자료 RESET
//            this.firstActivity  = System.currentTimeMillis();
//            this.lastActivity   = this.firstActivity;
//            this.sendCount      = 0;
//            this.recvCount      = 0;
//
//            this.currentState = isAckProtocol() ? CommonLib.NEGOTIATING_PROTOCOL : CommonLib.PROCESSING_PROTOCOL;
//
//            try {
//                Thread.sleep( 300L );
//            } catch(Exception e ) {}
//
//            if ( !this.isConnected() ) {
//                throw new IOException("Closed by Server");
//            }
//
//            if ( retryFlag ) {
//                //
//                SocketAdapterManager.getInstance().addConnection( this );
//            } else {
//                closeChannel();
//            }
//
//        } // Open Selector....
//    }
//
//    public String getRemoteIPAddress() {
//        return null;
//    }
//    protected synchronized void closeChannel() throws IOException {
//
//        if(channel != null ) {
//            channel.close();
//        }
//        this.currentState = CommonLib.NEGOTIATING_PROTOCOL;
//
//        channel = null;
//    }
//
//    // 1. Connection 리스트정보 - AdapterGroupName,AdapterName,업무코드,INBOUND, CLIENT, LocalIP:Port, RemoteIP:Port, 송신건수, 수신건수, 상태, 최초연결시각, 최종사용시각
//    public String toString() {
//        boolean status = true;
//        StringBuffer strBuff = new StringBuffer();
//        strBuff.append(context.getAdapterGroupName()).append(",");
//        strBuff.append(context.getAdapterName()).append(",");
//        strBuff.append(context.getBwkClsCd()).append(",").append(context.getBoundUsage()).append(",");
//        strBuff.append(context.getSocketType()).append(",");
//        strBuff.append(context.getResponseType()).append(",");
//        try {
//            strBuff.append( getCurrentSocket().getLocalAddress().getHostAddress()).append(":").append(getCurrentSocket().getLocalPort()).append(",");
//        } catch( Throwable e ) {
//            status = false;
//            strBuff.append("?:?,");
//        }
//
//        try {
//            strBuff.append( getCurrentSocket().getInetAddress().getHostAddress()).append(":").append(getCurrentSocket().getPort()).append(",");
//        } catch( Throwable e ) {
//            status = false;
//            strBuff.append("?:?,");
//        }
//        strBuff.append(this.sendCount).append(",");
//        strBuff.append(this.recvCount).append(",");
//        strBuff.append( status ).append(",");
//        strBuff.append( CommonLib.getCurrentTime( this.firstActivity )).append(",");
//        strBuff.append(CommonLib.getCurrentTime( this.lastActivity ));
//
//        return strBuff.toString();
//    }
//    
//    public void setLastActivity() {
//    }
//
//    public long getFirstActivity() {
//        return firstActivity;
//    }
//
//    public long getLastActivity() {
//        return lastActivity;
//    }
//}
