/*
 * Copyright 2002,2004 The Apache Software Foundation.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.commons.jexl.parser;

import org.apache.commons.jexl.JexlContext;


/**
 *  -
 *
 *  @author <a href="mailto:mhw@kremvax.net">Mark H. Wilkinson</a>
 *  @version $Id$
 */
public class ASTUnaryMinusNode extends SimpleNode 
{
    public ASTUnaryMinusNode(int id)
    {
        super(id);
    }

    public ASTUnaryMinusNode(Parser p, int id)
    {
        super(p, id);
    }

    /** Accept the visitor. **/
    public Object jjtAccept(ParserVisitor visitor, Object data)
    {
        return visitor.visit(this, data);
    }

    public Object value(JexlContext jc)
        throws Exception
    {
        Object val = ((SimpleNode) jjtGetChild(0)).value(jc);

        if (val instanceof Byte)
        {
        	byte valueAsByte = ((Byte) val).byteValue();
            return new Byte((byte) -valueAsByte);
        } 
        else if (val instanceof Short)
        {
        	short valueAsShort = ((Short) val).shortValue(); 
            return new Short((short) -valueAsShort);
        }
        else if (val instanceof Integer)
        {
        	int valueAsInt = ((Integer) val).intValue();
            return new Integer(-valueAsInt);
        }
        else if (val instanceof Long)
        {
        	long valueAsLong = ((Long) val).longValue();
            return new Long(-valueAsLong);
        }
        else if (val instanceof Float)
        {
        	float valueAsFloat = ((Float) val).floatValue(); 
        	return new Float( -valueAsFloat  );
        }
        else if (val instanceof Double)
        {
        	double valueAsDouble = ((Double) val).doubleValue();  
        	return new Double( -valueAsDouble );
        }
        throw new Exception("expression not a number");
    }
}


@@ -658,16 +658,75 @@
 arser;%0A%0A
+import java.math.BigDecimal;%0Aimport java.math.BigInteger;%0A%0A
 import o
@@ -2323,32 +2323,338 @@
 le );%0A        %7D%0A
+        else if (val instanceof BigDecimal)%0A        %7B%0A        %09BigDecimal valueAsBigD = (BigDecimal)val;%0A        %09return valueAsBigD.negate();%0A        %7D%0A        else if (val instanceof BigInteger)%0A        %7B%0A        %09BigInteger valueAsBigI = (BigInteger)val;%0A        %09return valueAsBigI.negate();%0A        %7D%0A
         throw ne

Add support for BigDecimal/BigInteger to UnaryMinus