package com.eactive.eai.rms.onl.adapter;

import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

import org.apache.log4j.Logger;

/**
 * <pre>
 * 1. 기능 : 시스템상의 해당명령을 수행하여 결과를 반환한다.
 * 2. 처리 개요 : 
 *     - 시스템상의 해당명령을 수행하여 결과를 반환한다.
 * 3. 주의사항 :
 * </pre>
 * @author  : 이동철
 * @version : $Revision: 1.2 $
 * @since : rts 1.0
 */
public abstract class AgentExecCommand {

    private final Logger logger = Logger.getLogger(AgentExecCommand.class);

    // YUN_DEBUG : execCommand 함수에 오류가 있어서 수정함 (2008.04.14)
    // 내용 : Runtime.exec() 의 결과를 1 KByte 밖에 못얻어오는 현상.

    public String execCommand(String command) {

        String result = "";

        Runtime rt = Runtime.getRuntime();
        Process ps = null;
        InputStream is = null;
        byte[] buff = null;

        int len;
        ByteArrayOutputStream baos = null;

        try {

            // 명령어 수행
            if (logger.isDebugEnabled()) {
                logger.debug("Command Exec : " + command);
            }
            ps = rt.exec(command);
            
            if (!isError(ps)) {

                // 명령 수행에 문제가 없었을 경우
                is = ps.getInputStream();

                len = 0;
                buff = new byte[4096];
                baos = new ByteArrayOutputStream();

                while ((len = is.read(buff)) > 0) {
                    baos.write(buff, 0, len);
                }

                result = new String(baos.toByteArray());
                if (logger.isDebugEnabled()) {
                    logger.debug("AgentExecCommand result =" + result);
                }
            } // end of else

        } catch (Exception e) {
            // 예외 상황 발생
            logger.error(e.toString());

        } finally {

            if (baos != null) {
                try {
                    baos.close();
                } catch (IOException e) {
                    baos = null;
                    logger.error(e.toString());
                }
            }

            if (is != null) {
                try {
                    is.close();
                } catch (IOException e) {
                    is = null;
                    logger.error(e.toString());
                }
            }

            if (ps != null) {
                ps.destroy();
            }
        }
        return result;
    }

    public String execCommand_test(String command) {

        StringBuffer sb = new StringBuffer();

        Runtime runtime = null;
        Process process = null;
        try {
            runtime = Runtime.getRuntime();

            process = runtime.exec(command);
            InputStream is = process.getInputStream();
            InputStreamReader isr = new InputStreamReader(is);
            BufferedReader br = new BufferedReader(isr);

            String line;
            while ((line = br.readLine()) != null) {
                sb.append(line);
            }
        } catch (Exception e) {
            logger.error( e );
        }

        return sb.toString();

    }

    /**
     * <pre>
     * 1. 기능 : 명령분 수행에 대한 에러 체크
     * 2. 처리 개요 : 
     *     - 명령문 수행에 대한 에러 체크
     * 3. 주의사항 : 
     * </pre>
     * @author  : 이동철
     * @version : $Revision: 1.2 $
     * @since : rts 1.0
     * @param ps
     * @return
     */
    private boolean isError(Process ps) {

        boolean result = true;
        InputStream es = ps.getErrorStream();
        byte[] buff = new byte[1024];

        try {
        	
        	// check
        	if(es.available() <= 0) {
        		 if (logger.isDebugEnabled()) {
                     logger.debug("isError = false");
                 }
        		return false;
        	}
        	
            if (es.read(buff) != -1) {
                // 명령 수행에 문제가 있을 경우
                String s = new String(buff);

                logger.error(s);
                result = true;
            } else {
                // 명령 수행에 문제가 없을 경우
                result = false;
            }
        } catch (IOException e) {
            result = true;
            logger.error(e.toString());
        } finally {
            if (es != null) {
                try {
                    es.close();
                } catch (IOException e) {
                    es = null;
                    logger.error(e.toString());
                }
            }
        }
        if (logger.isDebugEnabled()) {
            logger.debug("isError = " + result);
        }
        return result;

    }

}
