package com.eactive.eai.adapter.wca.util;

import com.eactive.eai.adapter.wca.exception.WCAException;
import com.eactive.eai.adapter.wca.global.WCADefine;
import com.eactive.eai.adapter.wca.servlet.TableInfoEx;
import com.eactive.eai.common.property.PropManager;
import com.eactive.eai.common.util.Logger;

import java.io.BufferedReader;
import java.io.IOException;

/**
 * 1. 기능 : 프로세스를 생성하여 명령어 실행
 * 2. 처리 개요 :
 * 		- 독립적인 프로세스로 명령어를 실행한다.
 * 3. 주의사항
 * 
 * @author : 
 * @version :
 * @see :
 * @since : 
 */
public class RuntimeUtil 
{ 
    /**
     * RuntimeUtil Single Instance
     */
    static RuntimeUtil instance = new RuntimeUtil();
    
    Logger trc_logger = Logger.getLogger(Logger.LOGGER_ADAPTER);
    
    /** 
    * 1. 기능 :  RuntimeUtil Singleton Object 반환
    * 2. 처리 개요 : RuntimeUtil Singleton Object 반환한다.
    * 3. 주의사항 
    *
    * @return   RuntimeUtil Singleton object
    **/
    public static RuntimeUtil getInstance(){		
		return instance;
    }   
    
    /**
     * 1. 기능 : Softman과 command 전송을 위해 프로세스를 생성하여 command를 실행
     * 2. 처리 개요 : 
     *       - 파라미터로 받은 명령어를 실행한다.
     *       - 실행결과가 "정상"이 아닐경우만 결과를 반환한다.
     *       --> 호출하고 실행결과는 받지 않도록 수정.
     * 3. 주의사항 
     *
     * @param    shell 명령어
     * @return   실행 결과
     **/
 	public String runTimeProcEx(String shell) throws IOException 
 	{	
 		StringBuffer 	sbResult  = new StringBuffer();
 		BufferedReader 	br = null;
        BufferedReader 	errBr = null;
// 		String 			sResultData;
 	
 		Runtime rt = Runtime.getRuntime();
 		Process o_process = null;
 	
 		try {
 			o_process = rt.exec(shell);
 			rt.runFinalization();
 			return sbResult.toString();
 		}
 		catch(IOException e) 
 		{
// 			System.out.println("runTimeProcEx> Exception Msg = " + e.toString());
// 			e.printStackTrace(); 			
 			throw e;
 		}
         /*
         catch(java.lang.InterruptedException i) 
         {
             throw new WCAException(WCAException.E_PROCESS_CALL, i.toString());
         }
         */
         finally {
             try {
             	if (br != null) br.close();
             	if (errBr != null) errBr.close();
             	//if (o_process != null) o_process.destroy();
             } catch(Exception e) {}
         }
 	}
 	
    /**
    * 1. 기능 : Softman과 command 전송을 위해 프로세스를 생성하여 command를 실행
    * 2. 처리 개요 : 
    *       - 파라미터로 받은 명령어를 실행한다.
    *       - 실행결과가 "정상"이 아닐경우만 결과를 반환한다.
    *       --> 호출하고 실행결과는 받지 않도록 수정.
    * 3. 주의사항 
    *
    * @param    shell 명령어
    * @return   실행 결과
    **/
	public String runTimeProc(String shell) throws WCAException 
	{	
		StringBuffer 	sbResult  = new StringBuffer();
		BufferedReader 	br = null;
        BufferedReader 	errBr = null;
//		String 			sResultData;
	
		Runtime rt = Runtime.getRuntime();
		Process o_process = null;
	
		try {
			o_process = rt.exec(shell);
            /* (2005/12/01)
             * 호출만하고 실행결과는 받지 않도록 수정 
             * (softman에서 다른 프로세스를 fork 시키므로 결과 return 안함)
             */
            /*
            errBr = new BufferedReader(new InputStreamReader(o_process.getErrorStream()));
			while (errBr.ready())
			{
                sResultData = errBr.readLine();
                if(trc_logger.isDebug())  trc_logger.debug("error recv data : " + sResultData);
                sbResult.append(sResultData + "\n");
			}
            int exitVal = o_process.waitFor();
            if(trc_logger.isDebug())  trc_logger.debug("Process Exit Value : " + exitVal);
            if (exitVal == 0) 
            {   
                br = new BufferedReader(new InputStreamReader(o_process.getInputStream()));		
                while((sResultData = br.readLine()) != null)
                {
                    if (!sResultData.trim().equals(""))
                    {
                        if(trc_logger.isDebug())  trc_logger.debug("recv data : " + sResultData);
                        if(sResultData.indexOf("정상") == -1) // 정상처리가 아닌경우
                            sbResult.append(sResultData + "\n");
                    }
                }
            }
            */
			rt.runFinalization();
			return sbResult.toString();
		}
		catch(IOException e) 
		{
			throw new WCAException(WCAException.E_PROCESS_CALL, e.toString());
		}
        /*
        catch(java.lang.InterruptedException i) 
        {
            throw new WCAException(WCAException.E_PROCESS_CALL, i.toString());
        }
        */
        finally {
            try {
            	if (br != null) br.close();
            	if (errBr != null) errBr.close();
            	//if (o_process != null) o_process.destroy();
            } catch(Exception e) {}
        }
	}
      
	// 20080612 Start 
    /** 
    * 1. 기능 : 특정 노드의 Softlink 전체 설정 정보 디시 로드
    * 2. 처리 개요 : 
    *       - 프로퍼티 정보에서 softlink 홈디렉토리 get하여 명령어 수행 (SnaUpdateCfg -a)
    *       - 에러 발생시 그 메세지를 exception으로 발생시킨다.
    * 3. 주의사항 
    *
    * @exception    WCAException
    **/
    public void notifyAllSoftlink(String sSoftlinkHome, String sIP) throws IOException
    {
        try {
            StringBuffer sbCommand = new StringBuffer();
            
            // String sSoftlinkHome = PropManager.getInstance().getProperty(TableInfo.T_SNAADPTER_PROP_GROUP_NAME, "softlink.home");
            
            sbCommand.append(sSoftlinkHome + "/bin" + WCADefine.SOFTLINK_CFG_UPDATE_COMMAND + " -a -host " + sIP); 
            
            // if(trc_logger.isInfo())  trc_logger.info(sbCommand.toString() + " is excuting");
//            System.out.println("notifyAllSoftlink> Command = " + sbCommand.toString());
            runTimeProcEx(sbCommand.toString());
        }
        catch(IOException e) {
//        	System.out.println("notifyAllSoftlink> Exception Msg = " + e.toString());
//            e.printStackTrace();
            throw e;
        }
    }
	// 20080612 End 
    
	// 20080827 Start 
    /** 
    * 1. 기능 : 특정 노드의 Softlink 전체 설정 정보 디시 로드
    * 2. 처리 개요 : 
    *       - 프로퍼티 정보에서 softlink 홈디렉토리 get하여 명령어 수행 (SnaUpdateCfg -a)
    *       - 에러 발생시 그 메세지를 exception으로 발생시킨다.
    * 3. 주의사항 
    *
    * @exception    WCAException
    **/
    public void notifyAllSoftlink(String sSoftlinkHome, String sIP, String sAdapterGroupName, String sLuGroupName) throws IOException
    {
        try {
            StringBuffer sbCommand = new StringBuffer();
            
            // String sSoftlinkHome = PropManager.getInstance().getProperty(TableInfo.T_SNAADPTER_PROP_GROUP_NAME, "softlink.home");
            
            sbCommand.append(sSoftlinkHome + "/bin" + WCADefine.SOFTLINK_CFG_UPDATE_COMMAND + " -t " + sAdapterGroupName + " -g " + sLuGroupName + " -host " + sIP); 
            
            // if(trc_logger.isInfo())  trc_logger.info(sbCommand.toString() + " is excuting");
//            System.out.println("notifyAllSoftlink> Command = " + sbCommand.toString());
            runTimeProcEx(sbCommand.toString());
        }
        catch(IOException e) {
//        	System.out.println("notifyAllSoftlink> Exception Msg = " + e.toString());
            throw e;
        }
    }
	// 20080827 End 
    
    
    /** 
    * 1. 기능 : Softlink 전체 설정 정보 디시 로드
    * 2. 처리 개요 : 
    *       - 프로퍼티 정보에서 softlink 홈디렉토리 get하여 명령어 수행 (SnaUpdateCfg -a)
    *       - 에러 발생시 그 메세지를 exception으로 발생시킨다.
    * 3. 주의사항 
    *
    * @exception    WCAException
    **/
    public void notifyAllSoftlink() throws WCAException
    {
        String sResult;
        
        try
        {
            StringBuffer sbCommand = new StringBuffer();
            String sSoftlinkHome = PropManager.getInstance().getProperty(TableInfoEx.T_SNAADPTER_PROP_GROUP_NAME, "softlink.home");
            
            sbCommand.append(sSoftlinkHome + "/bin" + WCADefine.SOFTLINK_CFG_UPDATE_COMMAND + " -a"); 
            
            if(trc_logger.isInfo())  trc_logger.info(sbCommand.toString() + " is excuting");
            sResult = runTimeProc(sbCommand.toString());
            if(trc_logger.isDebug())  trc_logger.debug(sResult);
        }
        catch(WCAException e)
        {
            //e.printStackTrace();
            WCAException exception = new WCAException();
            exception.setMessage(e.toString());
            throw exception;
        }
        
        if (sResult.length()>0) // 정상이 아닐경우
        {
            WCAException exception = new WCAException();
            exception.setMessage(sResult);
            throw exception;
        }
    }
    
    /** 
    * 1. 기능 : Softlink 해당 그룹에 설정 정보 디시 로드
    * 2. 처리 개요 : 
    *       - 프로퍼티 정보에서 softlink 홈디렉토리 get하여 명령어 수행 
    *         (SnaUpdateCfg -a -t 어댑터 그룹 이름 -g LU 그룹 이름)
    *       - 에러 발생시 그 메세지를 exception으로 발생시킨다.
    * 3. 주의사항 
    *
    * @param    sAdapterGrpName     어댑터 그룹 이름
    * @param    sGroupCode          LU 그룹 이름
    * @exception    WCAException
    **/
    public void notifySoftlink(String sAdapterGrpName, String sGroupCode) throws WCAException
    {
        String sResult;
        
        try
        {
            StringBuffer sbCommand = new StringBuffer();
            String sSoftlinkHome = PropManager.getInstance().getProperty(TableInfoEx.T_SNAADPTER_PROP_GROUP_NAME, "softlink.home");
            
            sbCommand.append(sSoftlinkHome + "/bin" + WCADefine.SOFTLINK_CFG_UPDATE_COMMAND)
                     .append(" -t " + sAdapterGrpName + " -g " + sGroupCode);
            if(trc_logger.isInfo())  trc_logger.info(sbCommand.toString() + " is excuting");
            sResult = runTimeProc(sbCommand.toString());
            if(trc_logger.isDebug())  trc_logger.debug(sResult);
        }
        catch(WCAException e)
        {
            //e.printStackTrace();
            WCAException exception = new WCAException();
            exception.setMessage(e.toString());
            throw exception;
        }
        
        if (sResult.length()>0) // 정상이 아닐경우
        {
            WCAException exception = new WCAException();
            exception.setMessage(sResult);
            throw exception;
        }
    }
    
    /** 
    * 1. 기능 : Softlink 시작 
    * 2. 처리 개요 : 
    *       - 프로퍼티 정보에서 softlink 홈디렉토리 get하여 명령어 수행 
    *         (SnaStart -a)
    *       - 에러 발생시 그 메세지를 exception으로 발생시킨다.
    * 3. 주의사항 
    *
    * @exception    WCAException
    **/
    public void startSoftlink() throws WCAException
    {
        String sResult;
        
        try
        {
            StringBuffer sbCommand = new StringBuffer();
            String sSoftlinkHome = PropManager.getInstance().getProperty(TableInfoEx.T_SNAADPTER_PROP_GROUP_NAME, "softlink.home");
            
			sbCommand.append(sSoftlinkHome + "/bin" + WCADefine.SOFTLINK_START_COMMAND);
            if(trc_logger.isInfo())  trc_logger.info(sbCommand.toString() + " is excuting");
            sResult = runTimeProc(sbCommand.toString());
            if(trc_logger.isDebug())  trc_logger.debug(sResult);
        }
        catch(WCAException e)
        {
            WCAException exception = new WCAException();
            exception.setMessage(e.toString());
            throw exception;
        }
        
        if (sResult.length()>0) // 정상이 아닐경우
        {
            WCAException exception = new WCAException();
            exception.setMessage(sResult);
            throw exception;
        }
    }
    
    /** 
    * 1. 기능 : Softlink 종료
    * 2. 처리 개요 : 
    *       - 프로퍼티 정보에서 softlink 홈디렉토리 get하여 명령어 수행 
    *         (SnaStop -a)
    *       - 에러 발생시 그 메세지를 exception으로 발생시킨다.
    * 3. 주의사항 
    *
    * @exception    WCAException
    **/
    public void stopSoftlink() throws WCAException
    {
        String sResult;
        
        try
        {
            StringBuffer sbCommand = new StringBuffer();
            String sSoftlinkHome = PropManager.getInstance().getProperty(TableInfoEx.T_SNAADPTER_PROP_GROUP_NAME, "softlink.home");
            
            sbCommand.append(sSoftlinkHome + "/bin" + WCADefine.SOFTLINK_STOP_COMMAND + " -a ");
            if(trc_logger.isInfo())  trc_logger.info(sbCommand.toString() + " is excuting");
            sResult = runTimeProc(sbCommand.toString());
            if(trc_logger.isDebug())  trc_logger.debug(sResult);
        }
        catch(WCAException e)
        {
            //e.printStackTrace();
            WCAException exception = new WCAException();
            exception.setMessage(e.toString());
            throw exception;
        }
        
        if (sResult.length()>0) // 정상이 아닐경우
        {
            WCAException exception = new WCAException();
            exception.setMessage(sResult);
            throw exception;
        }
    }
}

