package com.eactive.eai.transformer.function.convert;

import java.util.Stack;

import org.nfunk.jep.ParseException;
import org.nfunk.jep.function.PostfixMathCommand;

import com.eactive.eai.transformer.util.IConv;

/**
 * SO-SI없는 EBCDIC(Graphic) 값을 전각 ASCII으로 변환하는 함수
 * 입력 값은 byte[], 결과는 byte[]임.
 * 2009.08.12 강길수 차장 요청
 * CDS업무을 위한 함수로 EBCDIC전체가 Space(0x40)인 경우 0x20으로 변환
 */
public class EBCDIC2ASCIINOSOSICDS extends PostfixMathCommand {
    public EBCDIC2ASCIINOSOSICDS() {
        numberOfParameters = 1;
    }

    public void run(Stack inStack) throws ParseException {
        checkStack(inStack);

        Object param = inStack.pop();
        byte[] value = null;
        
        try {
            if (param instanceof String) {
                value = ((String) param).getBytes();
            } else if (param instanceof byte[]) {
                value = (byte[]) param;
            } else {
                throw new ParseException("Function의 파라미터 인수가 byte[], String이 아닙니다. : " + param);
            }
            
            boolean isSpaceAll = true;
            
            for(int i=0; i<value.length; i++) {
        		if(value[i] != (byte)0x40) {
        			isSpaceAll = false;
        			break;
        		}
        	}
            if(isSpaceAll) {
            	inStack.push( IConv.ebcdicToASCII(value) );
            }
            else {
            	byte[] ebcdic = new byte[value.length + 2];
	            
	            System.arraycopy(value, 0, ebcdic, 1, value.length);
	            ebcdic[0] = (byte)0x0E;
	            ebcdic[ebcdic.length-1] = (byte)0x0F;
	            
	            inStack.push( IConv.ebcdicToASCII(ebcdic) );
            }
        } catch (Exception e) {
            //throw new ExecutionException(e.getMessage(), parameters, e);
            throw new ParseException(e.getMessage(), e);
        }
    }
}
