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

import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;

import com.eactive.eai.rms.common.context.MonitoringContext;
import com.eactive.eai.rms.onl.adapter.common.vo.ErrorContentForm;
import com.eactive.eai.rms.onl.adapter.socket2.vo.ErrorContentVO;
import com.eactive.eai.rms.onl.common.util.CharsetDecoderUtil;

/**
 * 
 * <pre>
 * 1. 기능 : 
 * 2. 처리 개요 : 
 *     - 
 * 3. 주의사항 : 
 * </pre>
 * @author  : 박기섭, 이동철
 * @version : $Revision: 1.4 $
 * @since : rts 1.0
 */

@Service("socket2LogContentService")
public class SocketLogContentService {
    /**
     * Logger for this class
     */
    private static final Logger logger = Logger.getLogger(SocketLogContentService.class);

    @Autowired
    @Qualifier("monitoringContext")
    private transient MonitoringContext monitoringContext;

    public List execute(ErrorContentForm form) {

        int count = 0;

        String logLevel = form.getLogLevel();

        //---------------------------------------------------------
        // 대상 파일명
        // (Was 도메인 경로 + Was인스턴스명 + 파일경로) - 이동철
        //---------------------------------------------------------

        String file_name = monitoringContext.getStringProperty(
            MonitoringContext.DEFAULT_LOG_PATH, "/fslog/eai/")
                + form.getEaiSvrInstNm()
                + "/"
                + monitoringContext.getStringProperty(
                    MonitoringContext.SOCKET_LOG_FILE, "netAdapter.log");

        if (logLevel.equals("TOTAL"))
            logLevel = "";

        RandomAccessFile randomaccessfile = null;
        ArrayList errorContentList = new ArrayList();
        ErrorContentVO errorContent = null;

        try {
            File file = new File(file_name);
            randomaccessfile = new RandomAccessFile(file, "r");
            long currentPoint = 0L;
            randomaccessfile.getFilePointer();
            String currentText = null;
            //---------------------------------------------------------
            // 버프의 내용을 라인씩 읽어 들인다.
            //---------------------------------------------------------
            do {
                // 마지막지점 검색
                randomaccessfile.seek(currentPoint);
                // 마지막지점의 라인을 읽어온다.
                currentText = randomaccessfile.readLine();
                if(currentText != null) { //취약점소스 수정 2020.08.27
                	currentText = currentText.trim();
                }
                currentPoint = randomaccessfile.getFilePointer();

                count++;

                if (currentText == null) {
                    break;
                }
                if (currentText.length() == 0 || currentText.indexOf("[") != 0) {
                    continue;
                }

                // 만약 현 라인에 해당 로그 level 이 존재 하지 않거나  
                if (currentText.indexOf(logLevel) >= 0
                        && currentText.indexOf(form.getSearchText()) >= 0) {
                    errorContent = new ErrorContentVO();

                    // TODO SOCKET 로그 파싱부
                    // ---> 현재 이 로그로 파싱함
                    // ---> 향후 바뀔수 있음 
                    //[2005-08-03 13:44:18 FileLogger{NET}_EAI_DSVR0101] INFO   - SOCKET_B2B_IN session stopped with SOCKET_B2B_IN-SESSION-14

                    errorContent.setSline(count + ":"
                            + CharsetDecoderUtil.toKor(currentText));

                    //가장 최근이 맨 상단으로 가기 위해(이동철)
                    //errorContentList.add(errorContent);
                    errorContentList.add(0, errorContent);

                }
            } while (currentText != null);
        } catch (Exception e) {
            logger.error(e.getMessage());
        } finally {
            if (randomaccessfile != null) {
                try {
                    randomaccessfile.close();
                } catch (IOException e) {
                }
            }
        }
        return errorContentList;
    }

}
