//package com.eactive.eai.adapter.socket.service;
//
//import java.io.IOException;
//import java.net.Socket;
//import java.nio.BufferOverflowException;
//import java.nio.ByteBuffer;
//import java.nio.channels.ClosedSelectorException;
//import java.nio.channels.SelectionKey;
//import java.nio.channels.Selector;
//import java.nio.channels.SocketChannel;
//import java.util.Iterator;
//
//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;
//
//public class OutboundServer extends Thread implements SocketService {
//
//	private	ConfigurationContext	context;
//	private SocketChannel 			socketChannel;
//	private SocketServer 			proxy;
//	private Selector                selector;
//    private SelectionKey            key;
//    private boolean					active;
//
//    private int					 	sendCount;
//	private int					 	recvCount;
//    private long				 	firstActivity;
//    private long				 	lastActivity;
//
//    private ByteBuffer              incomingMessage;
//    private ByteBuffer              outgoingMessage;
//
//    private ByteBuffer              lenBuffer;
//    private ByteBuffer              pendingMessage;
//
//    private Exception 				lastError;
//    private Logger                  logger;
//    private static Logger           errLogger = SocketLogManager.getInstance().getErrLogger();
//
//	private OutboundControl         control;
//    private int                     currentState;
//    private boolean                 shutdownFlag;
//    private String                  remoteIPAddress;
//
//    public OutboundServer(ConfigurationContext context, SocketChannel socketChannel, SocketServer proxy) {
//        String name = this.getName();
//    	this.setName( context.getAdapterName() + "-CONNECTION" + name.substring( name.lastIndexOf("-")) );
//
//    	this.context 		= context;
//    	this.socketChannel 	= socketChannel;
//    	this.proxy 			= proxy;
//
//    	sendCount			= 0;
//        recvCount			= 0;
//        firstActivity		= System.currentTimeMillis();
//        lastActivity		= System.currentTimeMillis();
//
//		incomingMessage 	= null;
//        outgoingMessage     = null;
//
//		lenBuffer 			= ByteBuffer.allocate( this.context.getLlFieldLength() );
//		lenBuffer.clear();
//        pendingMessage      = ByteBuffer.allocate( 4096 );
//        pendingMessage.clear();
//
//    	this.control        = null;
//        this.currentState   = isAckProtocol() ? CommonLib.NEGOTIATING_PROTOCOL : CommonLib.PROCESSING_PROTOCOL;
//
//        remoteIPAddress     = this.socketChannel.socket().getInetAddress().getHostAddress();
//		active              = true;
//        shutdownFlag        = false;
//        logger              = SocketLogManager.getInstance().getLogger( this.context.getAdapterGroupName());
//    }
//
//    private boolean isSyncMode() {
//    	return this.context.isSyncMode();
//    }
//
//    private boolean isAckProtocol() {
//    	return this.context.isAckProtocol();
//    }
//
//    private int getTraceLevel() {
//    	return context.getTraceLevel();
//    }
//
//    private long getTimeout() {
//    	return	( this.context.getTimeout() * 1000L );
//    }
//
//    private boolean isSocketReuse() {
//    	return this.context.getSocketReuse().equals( ConfigurationContext.TRUE_FLAG );
//	}
//
//	/**
//	 * @return Returns the context.
//	 */
//	public ConfigurationContext getContext() {
//		return context;
//	}
//
//    public void run() {
//    	SocketAdapterManager.getInstance().addConnection( this );
//    	String  socketInfo = this.getSocketInfo(this.socketChannel);
//
//        if ( getTraceLevel() >= DiagLogger.INFO ) {
//            logger.info( CommonLib.getMessage("BICEAIASO001", new String[]{ context.getAdapterName(), socketInfo , Thread.currentThread().getName() }) );
//        }
//
//        while ( active ) {
//            try {
//            	openSelector();
//
//                if ( currentState == CommonLib.NEGOTIATING_PROTOCOL ) {
//                    if ( !negotiateProtocol() ) {
//                        active = false;
//                        continue;
//                    } else {
//                        currentState = CommonLib.PROCESSING_PROTOCOL;
//                    }
//                }
//
//            	onMessage();
//
//            	if ( control == null ) continue;
//
//            	doRequest();
//
//                if ( shutdownFlag ) {
//                    active = false;
//                }
//
//                if ( !isSocketReuse() ) {
//                    active = false;
//                }
//
//            } catch (Exception e) {
//                String errMsg = CommonLib.getMessage("BECEAIASO001", new String[]{context.getAdapterName(), "openSelector", e.getMessage(), "", "" } );
//                logger.error( errMsg, e );
//                active = false;
//                if ( this.control != null ) {
//                    lastError = new SocketAdapterException( errMsg );
//                    wakeup();
//                }
//                continue;
//            }
//        }
//
//        try {
//            closeSelector();
//        } catch(Throwable e) { }
//
//        SocketAdapterManager.getInstance().removeConnection( this );
//
//        if ( getTraceLevel() >= DiagLogger.INFO ) {
//            logger.info( CommonLib.getMessage("BICEAIASO002", new String[]{ context.getAdapterName(), socketInfo, Thread.currentThread().getName() }) );
//        }
//
//        proxy.quiesceShutdown(this);
//
//        interrupt();
//
//    }
//
//    private 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;
//    }
//
//    private 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;
//    }
//
//    private String  getSocketInfo(SocketChannel channel) {
//        StringBuffer connInfo = new StringBuffer();
//
//        connInfo.append("Local Address=");
//        connInfo.append( channel.socket().getLocalAddress().getHostAddress()).append(":").append(channel.socket().getLocalPort()).append(", ");
//        connInfo.append("Remote Address=");
//        connInfo.append( channel.socket().getInetAddress().getHostAddress()).append(":").append(channel.socket().getPort());
//
//        return connInfo.toString();
//    }
//
//    private synchronized void onMessage() {
//    	try {
//            if ( this.control == null ) {
//                this.wait( 1000L );
//            }
//            if ( !shutdownFlag && 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 ( !shutdownFlag && active ) {
//            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() );
//    }
//
//    private void checkConnection() {
//        try {
//            boolean flag = false;
//            if ( this.control != null ) return;
//
//            synchronized ( this ) {
//                flag = isConnected();
//            }
//            if ( this.control == null && !flag ) {
//                this.active = false;
//                this.control = null;
//            }
//        } catch( Exception e ) {
//            this.active = false;
//            this.control = null;
//        }
//    }
//
//    private boolean negotiateProtocol() {
//        boolean     success = false;
//        boolean     goon    = true;
//        long        start = System.currentTimeMillis();
//        lenBuffer.clear();
//
//        while( goon ) {
//            try {
//                int selected = selector.select( 1000L );
//                if( selected == 0 ) {
//                    long waitTime = System.currentTimeMillis() - start;
//                	if ( lenBuffer.position() > 0 && waitTime >= getTimeout() ) {
//                        String errMsg = CommonLib.getMessage("BECEAIASO004", new String[]{context.getAdapterName(), getSocketInfo( this.socketChannel), Long.toString(getTimeout()), "수신", getReadingMessage()  });
//                        logger.error( errMsg );
//                        if ( logger != errLogger ) {
//                            errLogger.error( errMsg );
//                        }
//                    	goon = false;
//                	} else {
//                        goon = isConnected();
//                    }
//                    continue;
//                }
//            } catch(IOException e) {
//                if ( lenBuffer.position() > 0 ) {
//                    String errMsg = CommonLib.getMessage("BECEAIASO001", new String[]{context.getAdapterName(), "negotiateProtocol의 select", e.getMessage(), "수신메시지", getReadingMessage() } );
//                    logger.error( errMsg , e);
//                    if ( logger != errLogger ) {
//                        errLogger.error( errMsg, e );
//                    }
//                }
//                goon = false;
//            } catch(ClosedSelectorException e ) {
//            	goon = false;
//                continue;
//            } catch(Exception e) {}
//
//            if ( selector == null || !selector.isOpen() ) {
//                goon = false;
//                continue;
//            }
//
//            Iterator<SelectionKey> iterator = selector.selectedKeys().iterator();
//
//            while( iterator.hasNext() ) {
//                key    = iterator.next();
//                iterator.remove();
//                socketChannel   = (SocketChannel)key.channel();
//                if(key.isReadable()) {   	// is Readable ? - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //
//                    try {
//
//                        start   = System.currentTimeMillis();
//                        if( processReadMessage() ) {    	    // Read Done
//                            byte[]	message  = incomingMessage.array();
//
//
//                            if ( getTraceLevel() >= DiagLogger.DEBUG ) {
//                                logger.debug( CommonLib.getMessage("BDCEAIASO001", new String[]{context.getAdapterName(), "RECV", CommonLib.getTimestamp(), this.getSocketInfo(this.socketChannel), CommonLib.getDumpMessage(incomingMessage.array())}));
//                            }
//                            this.checkActivity();
//                            lastActivity	= System.currentTimeMillis();
//                			recvCount++;
//
//                            start   = System.currentTimeMillis();
//
//                            incomingMessage.clear();
//                            lenBuffer.clear();
//
//                            if ( this.context.getResponseType().equals( new String(message) ) ) {
//                                makeFormat( CommonLib.ACK_MESSAGE );
//                                success     = true;
//                            } else {
//                                makeFormat( CommonLib.NACK_MESSAGE );
//                                logger.error( CommonLib.getMessage("BECEAIASO005", new String[]{context.getAdapterName(), getSocketInfo(this.socketChannel)}) );
//                            }
//                            socketChannel.register(selector, SelectionKey.OP_READ | SelectionKey.OP_WRITE);
//                        }
//                    } catch(Exception e) {
//                        if ( lenBuffer.position() > 0 ) {
//                            String errMsg = CommonLib.getMessage("BECEAIASO001", new String[]{context.getAdapterName(), "negotiateProtocol의 processReadMessage", e.getMessage(), "수신메시지", getReadingMessage() } );
//                            logger.error( errMsg , e);
//                            if ( logger != errLogger ) {
//                                errLogger.error( errMsg, e );
//                            }
//                        }
//                        goon    = false;
//                        success = false;
//                    } finally {
//                        if(!goon) continue;
//                    }
//                } // end of readable...
//
//                if( key.isWritable() ) { // is Writable ? - - - - - - - - - - - - - - - - - - - //
//                    try {
//                        if( processWriteMessage() ) {
//
//                        	sendCount++;
//
//                            if ( getTraceLevel() >= DiagLogger.DEBUG ) {
//                                logger.debug( CommonLib.getMessage("BDCEAIASO001", new String[]{context.getAdapterName(), "SEND", CommonLib.getTimestamp(), this.getSocketInfo(this.socketChannel), getWritingMessage()}));
//                            }
//
//                            outgoingMessage.clear();
//                            lenBuffer.clear();
//                            socketChannel.register(selector, SelectionKey.OP_READ); // write end. so read only.
//                            return success;
//                        }
//                    } catch(IOException e) {
//                        String errMsg = CommonLib.getMessage("BECEAIASO001", new String[]{context.getAdapterName(), "negotiateProtocol의 processWriteMessage", e.getMessage(), "송신메시지", getWritingMessage() } );
//                        logger.error( errMsg , e);
//                        if ( logger != errLogger ) {
//                            errLogger.error( errMsg, e );
//                        }
//                        goon    = false;
//                        success = false;
//                    }
//                } // end of writables...
//            } // End of while(iterator.hasNext())
//        } // enf of while - active
//        return  success;
//    }
//
//    private void processWriteAckMessage() throws Exception {
//        try {
//            makeFormat( CommonLib.ACK_MESSAGE );
//            socketChannel.register(selector, SelectionKey.OP_READ | SelectionKey.OP_WRITE );
//            processWriteMessage();
//            sendCount++;
//        } 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(this.socketChannel), CommonLib.getDumpMessage(CommonLib.ACK_MESSAGE) }));
//        }
//
//    }
//
//    private void processReadAckMessage() throws Exception {
//
//        long        start   = System.currentTimeMillis();
//        boolean     goon    = true;
////        boolean     isRight = true;
//
//        lenBuffer.clear();
//        socketChannel.register(selector, SelectionKey.OP_READ);
//
//        while( goon ) {
//            try {
//                int selected = selector.select( 1000L );
//                if( selected == 0 ) {
//                    long waitTime = System.currentTimeMillis() - start;
//                	if ( lenBuffer.position() > 0 && waitTime >= getTimeout() ) {
//                        String errMsg = CommonLib.getMessage("BECEAIASO004", new String[]{context.getAdapterName(), getSocketInfo(this.socketChannel), Long.toString(getTimeout()), "수신", getReadingMessage()  });
//                        logger.error( errMsg );
//                        if ( logger != errLogger ) {
//                            errLogger.error( errMsg );
//                        }
//                    	goon = false;
//                	} else {
//                        goon = isConnected();
//                    }
//                    continue;
//                }
//            } catch(IOException e) {
//                goon = false;
//            } catch(ClosedSelectorException e ) {
//                goon = false;
//            	continue;
//            } catch(Exception e) {}
//
//            if ( selector == null || !selector.isOpen() ) {
//                goon = false;
//                continue;
//            }
//
//            Iterator<SelectionKey> iterator = selector.selectedKeys().iterator();
//
//            while( iterator.hasNext() ) {
//                key    = iterator.next();
//                iterator.remove();
//                socketChannel   = (SocketChannel)key.channel();
//                if(key.isReadable()) {   	// is Readable ? - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //
//                    try {
//
//                        start   = System.currentTimeMillis();
//
//                        if( processReadMessage() ) {    	    // Read Done
//
//                            if ( getTraceLevel() >= DiagLogger.DEBUG ) {
//                                logger.debug( CommonLib.getMessage("BDCEAIASO001", new String[]{context.getAdapterName(), "RECV", CommonLib.getTimestamp(), getSocketInfo(this.socketChannel), CommonLib.getDumpMessage(incomingMessage.array())}));
//                            }
//
//                			recvCount++;
//
//                            if ( CommonLib.compare( incomingMessage.array(), CommonLib.ACK_MESSAGE ) ) {
//                                lenBuffer.clear();
//                                return;
//                            } else {
////                                isRight = false;
//                                goon    = false;
//                                logger.error( CommonLib.getMessage("BECEAIASO006", new String[]{context.getAdapterName(), getSocketInfo(this.socketChannel), CommonLib.getDumpMessage(incomingMessage.array())}));
//                                if ( logger != errLogger ) {
//                                    errLogger.error( CommonLib.getMessage("BECEAIASO006", new String[]{context.getAdapterName(), getSocketInfo(this.socketChannel), CommonLib.getDumpMessage(incomingMessage.array())}));
//                                }
//                            }
//                        }
//                    } catch(IOException e) {
//                        goon    = false;
//                    } catch(SocketAdapterException e) {
//                        goon    = false;
//                    } catch(Exception e) { }
//                } // end of readable...
//            } // End of while(iterator.hasNext())
//        } // enf of while - active
//
//        lenBuffer.clear();
//
//        String errMsg = CommonLib.getMessage("BECEAIASO001", new String[]{context.getAdapterName(), "processReadAckMessage", "", "송신메시지", getWritingMessage() } );
//        logger.error( errMsg );
//        if ( logger != errLogger ) {
//            errLogger.error( errMsg );
//        }
//        throw new IOException("송신에 대한 ACK 메시지 수신에러");
//
//    }
//
//    public void doRequest() {
//
//    	Iterator<SelectionKey> iterator;
//    	makeFormat( this.control.getRequest() );
//
//    	boolean isDone = false;
//    	this.checkActivity();
//
//    	lastActivity	= System.currentTimeMillis();
//        long start = System.currentTimeMillis();
//        while( !isDone ) {
//            try {
//                if( selector.select( getTimeout() ) == 0) {
//                    if ( ( start - System.currentTimeMillis() ) <= getTimeout() ) continue;
//
//                    isDone = true;
//                    active = false;
//                    String errMsg = CommonLib.getMessage("BECEAIASO004", new String[]{context.getAdapterName(), getSocketInfo(this.socketChannel), Long.toString(getTimeout()), "수신", getReadingMessage()  });
//                    logger.error( errMsg );
//                    if ( logger != errLogger ) {
//                        errLogger.error( errMsg );
//                    }
//
//                    lastError	= new SocketAdapterException( errMsg );
//                    wakeup();
//                    continue;
//                }
//            } catch(Exception e) {
//                String errMsg = "";
//                if ( lenBuffer.position() > 0 ) {
//                    errMsg = CommonLib.getMessage("BECEAIASO001", new String[]{context.getAdapterName(), "select", e.getMessage(), "수신메시지", getReadingMessage() } );
//                } else {
//                    errMsg = CommonLib.getMessage("BECEAIASO001", new String[]{context.getAdapterName(), "select", e.getMessage(), "송신메시지", getWritingMessage() } );
//                }
//                logger.error( errMsg , e);
//
//                if ( logger != errLogger ) {
//                    errLogger.error( errMsg, e );
//                }
//
//                lastError = new SocketAdapterException( errMsg );
//
//                active = false;
//                isDone = true;
//                wakeup();
//                continue;
//            }
//
//            if ( selector == null || !selector.isOpen() ) {
//                isDone = true;
//                continue;
//            }
//
//            iterator = selector.selectedKeys().iterator();
//
//            while(iterator.hasNext()) {
//                key    = iterator.next();
//                iterator.remove();
//                socketChannel   = (SocketChannel)key.channel();
//
//                /**
//                 * Write the message to the target
//                 */
//                if( key.isWritable() ) { // is Writable ? - - - - - - - - - - - - - - - - - - - //
//                    try {
//                        if( processWriteMessage() ) {
//
//                            sendCount++;
//
//                            if ( getTraceLevel() >= DiagLogger.DEBUG) {
//                                logger.debug( CommonLib.getMessage("BDCEAIASO001", new String[]{context.getAdapterName(), "SEND", CommonLib.getTimestamp(), getSocketInfo(this.socketChannel), getWritingMessage()}));
//                            }
//
//                            if ( isAckProtocol() ) {
//                                processReadAckMessage();
//                            }
//
//                            if ( !isSyncMode() ) {
//                                wakeup();
//                                return;
//                            }
//
//                            outgoingMessage.clear();
//                            lenBuffer.clear();
//
//                            socketChannel.register(selector, SelectionKey.OP_READ);
//                        }
//                    } catch(Exception e) {
//                        String errMsg = CommonLib.getMessage("BECEAIASO001", new String[]{context.getAdapterName(), "processWriteMessage", e.getMessage(), "송신메시지", getWritingMessage() } );
//                        logger.error( errMsg , e);
//                        if ( logger != errLogger ) {
//                            errLogger.error( errMsg, e );
//                        }
//
//                        lastError = new SocketAdapterException( errMsg );
//
//                        active = false;
//                        wakeup();
//                        return;
//                    }
//                } // end of writables...
//
//                if(key.isReadable()) {   	// is Readable ? - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //
//                    try {
//                        if( processReadMessage() ) {   // Read Done
//
//                        	recvCount++;
//                        	if ( isSyncMode() ) {
//                        		this.control.setResponse( incomingMessage.array() );
//                        	}
//
//                            if ( getTraceLevel() >= DiagLogger.DEBUG ) {
//                                logger.debug( CommonLib.getMessage("BDCEAIASO001", new String[]{context.getAdapterName(), "RECV", CommonLib.getTimestamp(), getSocketInfo(this.socketChannel), CommonLib.getDumpMessage(incomingMessage.array())}));
//                            }
//
//                            if ( isAckProtocol() ) {
//                                processWriteAckMessage();
//                            }
//
//                            socketChannel.register(selector, SelectionKey.OP_READ | SelectionKey.OP_WRITE ); // write end. so read only.
//                            isDone = true;
//                            wakeup();
//                            return;
//                        }
//                    } 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 );
//                            }
//                        }
//
//                        this.lastError = new SocketAdapterException( errMsg );
//                        active = false;
//                        wakeup();
//                        return;
//                    }
//                } // end of readable...
//            } // End of while(iterator.hasNext())
//        } // enf of while - isDone
//    }
//
//    public synchronized void shutdown() {
//        //*2005.10.17
//        active          = false;
//        shutdownFlag    = true;
//        //this.currentState   = CommonLib.NEGOTIATING_PROTOCOL;
//
//        try {
//            notify();
//        } catch ( Exception e ) {}
//
//        try {
//            closeSelector();
//        } catch( Exception e ) {}
//
//        //*/
//        // interrupt();
//    }
//
//    public Socket getCurrentSocket() {
//    	return socketChannel.socket();
//    }
//
//    public boolean connect() {
//    	return true;
//    }
//
//    public boolean isActive() {
//        return (!shutdownFlag);
//    }
//
//    public void disconnect() {
//    	shutdown();
//        proxy.quiesceShutdown(this);
//        interrupt();
//    }
//
//    public boolean idle(long timeout) {
//        long idleTime   = System.currentTimeMillis() - this.lastActivity;
//
//        return ( idleTime > timeout );
//    }
//
//    public String getRemoteIPAddress() {
//        return this.remoteIPAddress;
//    }
//
//    private void openSelector() throws IOException {
//
//    	if ( selector == null || !selector.isOpen() ) {
//    		selector = Selector.open();
//
//            // Connection 시 통계자료 RESET
//            this.firstActivity  = System.currentTimeMillis();
//            this.lastActivity   = this.firstActivity;
//            this.sendCount      = 0;
//            this.recvCount      = 0;
//
//    		socketChannel.socket().setTcpNoDelay(true);
//            socketChannel.configureBlocking(false);
//            socketChannel.register(selector, SelectionKey.OP_WRITE | SelectionKey.OP_READ );
//    	}
//    }
//
//    private void closeSelector() throws IOException {
//        if(selector != null) {
//            selector.wakeup();
//
//            for(Iterator<SelectionKey> iterator = selector.keys().iterator(); iterator.hasNext();)
//                try {
//                    key    = iterator.next();
//                    iterator.remove();
//                    socketChannel   = (SocketChannel)key.channel();
//                    key.cancel();
//                    if(socketChannel != null) {
//                        Socket socket = socketChannel.socket();
//                        if(socket != null) {
//                            socket.setSoLinger(true, 0);
//                            try { socket.close(); } catch(Exception e) {}
//                        }
//                        socketChannel.close();
//                    }
//                } catch(IOException ioexception) { }
//
//            selector.close();
//        }
//    }
//
//    private boolean processReadMessage() throws Exception {
//        int     i = 0;
//        boolean flag = false;
//
//        if ( pendingMessage.position() > 0 && lenBuffer.hasRemaining() ) {
//            if ( pendingMessage.position() <= lenBuffer.remaining() ) {
//                byte[] data = new byte[ pendingMessage.position() ];
//                pendingMessage.flip();
//                pendingMessage.get( data );
//                lenBuffer.put( data );
//                pendingMessage.clear();
//            } else {
//                byte[] data = new byte[ lenBuffer.remaining() ];
//                pendingMessage.flip();
//                pendingMessage.get( data );
//                lenBuffer.put( data );
//                pendingMessage.position( pendingMessage.limit() );
//                shiftBuffer( pendingMessage, data.length );
//            }
//            if ( lenBuffer.position() == lenBuffer.capacity() ) flag = true;
//        }
//
//        while ( lenBuffer.position() < lenBuffer.capacity() ) {
//            i = socketChannel.read( lenBuffer );
//            if ( i <= 0 ) break;
//            if ( lenBuffer.position() == lenBuffer.capacity() ) flag = true;
//        }
//
//        if(i == -1) {
//            if ( lenBuffer.position() > 0 ) {
//                throw new SocketAdapterException( CommonLib.getMessage("BECEAIASO002", new String[]{context.getAdapterName(), getSocketInfo(this.socketChannel)}) );
//            } else {
//                String errMsg = CommonLib.getMessage("BICEAIASO003", new String[]{context.getAdapterName(), getSocketInfo(this.socketChannel)});
//                if ( getTraceLevel() >= DiagLogger.INFO ) {
//                    logger.info( errMsg );
//                }
//                throw new SocketAdapterException( errMsg  );
//            }
//        }
//        if ( lenBuffer.position() != lenBuffer.capacity() )     return false;
//
//        int length = 0;
//
//        try {
//            if ( flag ) {
//                length = checkLengthField( lenBuffer );
//                incomingMessage = ByteBuffer.allocate( length );
//                incomingMessage.clear();
//            }
//        } catch(Exception le) {
//            throw le;
//        }
//
//        i = 0;
//
//        if ( pendingMessage.position() > 0 && incomingMessage.hasRemaining()) {
//            if ( pendingMessage.position() <= incomingMessage.remaining() ) {
//                byte[] data = new byte[ pendingMessage.position() ];
//                pendingMessage.flip();
//                pendingMessage.get( data );
//                incomingMessage.put( data );
//                pendingMessage.clear();
//            } else {
//                byte[] data = new byte[ incomingMessage.remaining() ];
//                pendingMessage.flip();
//                pendingMessage.get( data );
//                lenBuffer.put( data );
//                pendingMessage.position( pendingMessage.limit() );
//                shiftBuffer( pendingMessage, data.length );
//            }
//            if ( incomingMessage.position() == incomingMessage.capacity() ) return true;
//        }
//
//        while ( incomingMessage.position() < incomingMessage.capacity()) {
//            i = socketChannel.read(incomingMessage);
//            if ( i <= 0 ) break;
//        }
//
//        if(i == -1) {
//        	throw new SocketAdapterException( CommonLib.getMessage("BECEAIASO002", new String[]{context.getAdapterName(), getSocketInfo(this.socketChannel)}) );
//        } else {
//              if ( incomingMessage.position() == incomingMessage.capacity() ) {
//                return true;
//            } else {
//                return false;
//            }
//        }
//    }
//
//    private void shiftBuffer(ByteBuffer buffer, int shiftBytes) {
//        int pos = buffer.position();
//        if ( pos <= shiftBytes ) {
//            buffer.clear();
//            return;
//        }
//        byte[] tmpBuff = new byte[ pos ];
//        buffer.flip();
//        buffer.get( tmpBuff );
//
//        buffer.clear();
//        buffer.put( tmpBuff, shiftBytes, tmpBuff.length - shiftBytes );
//    }
//
//    private boolean processWriteMessage() throws IOException {
//
//        outgoingMessage.flip();
//
//        long writeStart     = System.currentTimeMillis();
//        int  expectedWrite  = outgoingMessage.capacity();
//        int  writtenByte    = socketChannel.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 +=  write( buf );
//                if ( expectedWrite == writtenByte ) return true;
//                long  waitTime = System.currentTimeMillis() - writeStart;
//                if ( waitTime >= getTimeout() ) {
//                    throw new IOException("메시지 송신 타임아웃");
//                }
//            }
//        }
//        return true;
//    }
//
//    public int write(ByteBuffer src) throws IOException {
//
//		this.socketChannel.register( this.selector, SelectionKey.OP_WRITE  );
////        int	 selected = 0;
//
//        try {
////        	selected = 
//        	selector.select( getTimeout() );
//        } catch(Exception e) {
//        	throw new IOException("Write Select Error");
//        }
//
//        Iterator<SelectionKey> it = selector.selectedKeys().iterator();
//        int		 		writtenBytes = 0;
//        SelectionKey 	key = null;
//
//        while ( it.hasNext() ) {
//        	key	= (SelectionKey)it.next();
//        	it.remove();
//        	if ( key.isWritable() ) {
//        		writtenBytes = this.socketChannel.write( src );
//        	}
//        }
//        return  writtenBytes;
//    }
//
//    // Writing전에 확인...
//    public boolean isConnected() throws IOException {
//    	boolean	flag = true;
//
//    	if ( socketChannel.isConnected() && socketChannel.socket().isBound() ) {
//    		ByteBuffer tmpBuffer = ByteBuffer.allocate( 1 );
//            tmpBuffer.clear();
//    		int i = socketChannel.read( tmpBuffer );
//            if ( i > 0 ) {
//                try {
//                    pendingMessage.put( tmpBuffer.array() );
//                } catch ( BufferOverflowException e ) {
//                    throw new IOException("Socket 어플리케이션 프로토콜에러 발생 : " + e.getMessage());
//                }
//            }
//            if ( i == -1 ) {
//    			flag = false;
//    		}
//    	} else {
//    		flag = false;
//    	}
//
//    	return flag;
//    }
//
//    public int getCurrentState() {
//        return this.currentState;
//    }
//
//    private void resetCount() {
//        this.recvCount = 0;
//        this.sendCount = 0;
//    }
//
//    public void checkActivity() {
//        long currentTime = System.currentTimeMillis();
//        if ( !CommonLib.getDate( this.lastActivity ).equals( CommonLib.getDate( currentTime )) ) {
//            this.resetCount();
//        }
//    }
//
//    private byte[] makeLengthField(int length) {
//    	byte[] lenField = new byte[ lenBuffer.capacity() ];
//
//    	if ( lenBuffer.capacity() == 2 ) {
//            ByteBuffer tmpBuffer = ByteBuffer.allocate( lenBuffer.capacity() );
//            tmpBuffer.clear();
//    		tmpBuffer.putShort( (short) (length & 0xFFFF) );
//            lenField    = tmpBuffer.array();
//    	} else if ( lenBuffer.capacity() == 4 ) {
//            ByteBuffer tmpBuffer = ByteBuffer.allocate( lenBuffer.capacity() );
//            tmpBuffer.clear();
//    		tmpBuffer.putInt( length );
//            lenField    = tmpBuffer.array();
//    	} else {
//    		String lenStr = CommonLib.getFormatString( length, lenBuffer.capacity() );
//    		lenField	= lenStr.getBytes();
//    	}
//
//    	return lenField;
//    }
//
//    private 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(this.socketChannel), 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(this.socketChannel), CommonLib.byte2Hex( buffer.array() ) }) );
//    		}
//    	}
//
//    	return length;
//	}
//
//    private void makeFormat( byte[] data ) {
//
//    	int i = data.length + lenBuffer.capacity();
//
//        if(outgoingMessage == null) {
//            outgoingMessage = ByteBuffer.allocate( data.length + lenBuffer.capacity() );
//        } else {
//            if( i != outgoingMessage.capacity() )
//                outgoingMessage = ByteBuffer.allocate( i );
//        }
//        outgoingMessage.clear();
//        outgoingMessage.put( makeLengthField( data.length ) );
//        outgoingMessage.put( data );
//    }
//
//	/**
//	 * @return Returns the socketchannel.
//	 */
//	public SocketChannel getSocketchannel() {
//		return socketChannel;
//	}
//	/**
//	 * @param socketchannel The socketchannel to set.
//	 */
//	public void setSocketchannel(SocketChannel socketchannel) {
//		this.socketChannel = socketchannel;
//	}
//
//    // 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;
//    }
//}
