/**
 * 
 */
package ognl;

import ognl.enhance.UnsupportedCompilationException;


/**
 *  Base class for types that compare values.
 */
public abstract class ComparisonExpression extends BooleanExpression
{

    public ComparisonExpression(int id) {
        super(id);
    }

    public ComparisonExpression(OgnlParser p, int id) {
        super(p, id);
    }
    
    public abstract String getComparisonFunction();
    
    public String toGetSourceString(OgnlContext context, Object target)
    {
        if (target == null)
            throw new UnsupportedCompilationException("Current target is null, can't compile.");
        
        try {
            
            Object value = getValueBody(context, target);
            
            if (value != null && Boolean.class.isAssignableFrom(value.getClass()))
                _getterClass = Boolean.TYPE;
            else if (value != null)
                _getterClass = value.getClass();
            else
                _getterClass = Boolean.TYPE;
            
            // iterate over children to make numeric type detection work properly
            
            OgnlRuntime.getChildSource(context, target, _children[0]);
            OgnlRuntime.getChildSource(context, target, _children[1]);
            
//            System.out.println("comparison expression currentType: " + context.getCurrentType() + " previousType: " + context.getPreviousType());

            boolean conversion = OgnlRuntime.shouldConvertNumericTypes(context);

            String result = conversion ? "(" + getComparisonFunction() + "( ($w) (" : "(";
            
            result += OgnlRuntime.getChildSource(context, target, _children[0], conversion)
            + " "
            + (conversion ? "), ($w) " : getExpressionOperator(0)) + " " 
            + OgnlRuntime.getChildSource(context, target, _children[1], conversion);
            
            result += conversion ? ")" : "";

            context.setCurrentType(Boolean.TYPE);

            result += ")";

            return result;
        } catch (NullPointerException e) {
            
            // expected to happen in some instances
            
            throw new UnsupportedCompilationException("evaluation resulted in null expression.");
        } catch (Throwable t)
        {
            throw OgnlOps.castToRuntime(t);
        }
    }
}
