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;


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

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

        Object param = inStack.pop();

        byte[] value = null;

        if (param instanceof String) {
            value = ((String) param).getBytes();
        } else if (param instanceof byte[]) {
            value = (byte[]) param;
        } else {
            throw new ParseException("Function의 파라미터 인수가 byte[], String이 아닙니다. : " + param);
        }
        
        
        try {
        	boolean isSpaceAll = true;
        	
        	for(int i=0; i<value.length; i++) {
        		if(value[i] != (byte)0x20) {
        			isSpaceAll = false;
        			break;
        		}
        	}
        	
        	byte[] result = IConv.asciiToEBCDIC(new String(value));
        	
        	
        	if(isSpaceAll) {
        		inStack.push(result);
        	}
        	else {
	        	if( result.length == (value.length+2) ) {
	        		byte[] result_nososi = new byte[value.length];
	        		System.arraycopy(result, 1, result_nososi, 0, result_nososi.length);        		
	        		inStack.push(result_nososi);
	        	}
	        	else {
	        		throw new Exception("Invalid source data, not Seal["+new String(value)+"]");
	        	}
        	}
        } catch (Exception e) {
            //throw new ExecutionException(e.getMessage(), parameters, e);
            throw new ParseException(e.getMessage(), e);
        }
    }
}
