package com.eactive.eai.rms.onl.common.util;

import java.nio.ByteBuffer;
import java.nio.charset.CharacterCodingException;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;

import org.apache.log4j.Logger;

/**
 * <pre>
 * 1. 기능 : 해당 Charset으로 Buffer를 decode해 준다.
 * 2. 처리 개요 : 
 *     - Util 클래스로서 필요에 의해서 호출 한다. 
 * 3. 주의사항 :
 * </pre>
 * @author  : 박기섭
 * @version : $Revision: 1.1 $
 * @since : rts 1.0
 */
public class CharsetDecoderUtil {
    /** nio charset */
    private Charset charset = null;

    /** nio decoder */
    private CharsetDecoder decoder = null;
    
    private static final Logger logger = Logger.getLogger(CharsetDecoderUtil.class);

    /**
     * @param encoding
     * @spring.constructor-arg value="utf-8"
     */
    public CharsetDecoderUtil(String encoding) {
        this.charset = Charset.forName(encoding);
        this.decoder = charset.newDecoder();
    }

    /**
     * 1. 기능 : 8859_1을 한글코드 (KSC5601)로 변환
     * @param s 변환을 원하는 문자열
     * @return  캐릭터 셋이 변환된 문자열
     */
    public static String toKor(String s) {
        if (s != null) {
            return changeCode(s, "iso_8859-1", "KSC5601");
        } else {
            return null;
        }
    } // end of toKor

    /**
     * 1. 기능 : charater set 체계를 바꿔주는 메쏘드
     * ex) ChatSet.changeCode(string, "KSC5601", "iso_8859_1");
     * @param s 변환을 원하는 문자열
     * @param s1 현재 캐릭터 셋
     * @param s2 바뀔 캐릿터 셋
     * @return  캐릭터 셋이 변환된 문자열
     */
    public static String changeCode(String s, String s1, String s2) {
        String convString = null;
        if (s != null) {
            try {
                convString = new String(s.getBytes(s1), s2);
            } catch (Exception exception) {
            	//취약점소스 수정 2020.08.24
            	logger.error(" error", exception); 
            }
        }
        return convString;
    } // end of changeCode

    /**
     * <pre>
     * 1. 기능 : ByteBuffer를 decode한다. 
     * 2. 처리 개요 : 
     *     - 
     * 3. 주의사항 : 
     * </pre>
     * @author  : 박기섭
     * @version : $Revision: 1.1 $
     * @since : rts 1.0
     * @param byteBuffer ByteBuffer
     * @return string ByteBuffer에 담겨진 값을 문자열로 decode한 값
     */
    public String decode(ByteBuffer buffer) {

        String string = null;
        // buffer가 null일 경우 return한다. 
        if (buffer == null) {
            return "";
        }
        try {
            // buffer를 decode한다. 
            string = decoder.decode(buffer).toString();
        } catch (CharacterCodingException e) {
            //e.printStackTrace();
        	logger.error(" error", e); 
        }
        // decode한 값이 null일 경우 ""를 리턴 한다. 
        if (string == null) {
            return "";
        } else {
            return string;
        }
    }
}
