001    /*
002     * Licensed to the Apache Software Foundation (ASF) under one or more
003     * contributor license agreements.  See the NOTICE file distributed with
004     * this work for additional information regarding copyright ownership.
005     * The ASF licenses this file to You under the Apache License, Version 2.0
006     * (the "License"); you may not use this file except in compliance with
007     * the License.  You may obtain a copy of the License at
008     *
009     *     http://www.apache.org/licenses/LICENSE-2.0
010     *
011     * Unless required by applicable law or agreed to in writing, software
012     * distributed under the License is distributed on an "AS IS" BASIS,
013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     * See the License for the specific language governing permissions and
015     * limitations under the License.
016     */
017    package org.apache.commons.el;
018    
019    import java.math.BigDecimal;
020    import java.math.BigInteger;
021    
022    import javax.servlet.jsp.el.ELException;
023    
024    import org.apache.commons.logging.Log;
025    import org.apache.commons.logging.LogFactory;
026    
027    /**
028     *
029     * <p>The implementation of the unary minus operator
030     * 
031     * @author Nathan Abramson - Art Technology Group
032     * @version $Change: 181177 $$DateTime: 2001/06/26 08:45:09 $$Author: bayard $
033     **/
034    
035    public class UnaryMinusOperator
036      extends UnaryOperator
037    {
038        
039        //-------------------------------------
040        // Constants
041        //-------------------------------------
042        private static Log log = LogFactory.getLog(UnaryMinusOperator.class);
043        
044      //-------------------------------------
045      // Singleton
046      //-------------------------------------
047    
048      public static final UnaryMinusOperator SINGLETON =
049        new UnaryMinusOperator ();
050    
051      //-------------------------------------
052      /**
053       *
054       * Constructor
055       **/
056      public UnaryMinusOperator ()
057      {
058      }
059    
060      //-------------------------------------
061      // Expression methods
062      //-------------------------------------
063      /**
064       *
065       * Returns the symbol representing the operator
066       **/
067      public String getOperatorSymbol ()
068      {
069        return "-";
070      }
071    
072      //-------------------------------------
073      /**
074       *
075       * Applies the operator to the given value
076       **/
077      public Object apply (Object pValue)
078        throws ELException
079      {
080        if (pValue == null) {
081        
082          return PrimitiveObjects.getInteger (0);
083        }
084    
085        else if (pValue instanceof BigInteger) {
086            return ((BigInteger) pValue).negate();
087        }
088    
089        else if (pValue instanceof BigDecimal) {
090            return ((BigDecimal) pValue).negate();
091        }
092    
093        else if (pValue instanceof String) {
094          if (Coercions.isFloatingPointString (pValue)) {
095            double dval =
096              ((Number) 
097               (Coercions.coerceToPrimitiveNumber 
098                (pValue, Double.class))).
099              doubleValue ();
100            return PrimitiveObjects.getDouble (-dval);
101          }
102          else {
103            long lval =
104              ((Number) 
105               (Coercions.coerceToPrimitiveNumber 
106                (pValue, Long.class))).
107              longValue ();
108            return PrimitiveObjects.getLong (-lval);
109          }
110        }
111    
112        else if (pValue instanceof Byte) {
113          return PrimitiveObjects.getByte 
114            ((byte) -(((Byte) pValue).byteValue ()));
115        }
116        else if (pValue instanceof Short) {
117          return PrimitiveObjects.getShort 
118            ((short) -(((Short) pValue).shortValue ()));
119        }
120        else if (pValue instanceof Integer) {
121          return PrimitiveObjects.getInteger 
122            ((int) -(((Integer) pValue).intValue ()));
123        }
124        else if (pValue instanceof Long) {
125          return PrimitiveObjects.getLong 
126            ((long) -(((Long) pValue).longValue ()));
127        }
128        else if (pValue instanceof Float) {
129          return PrimitiveObjects.getFloat 
130            ((float) -(((Float) pValue).floatValue ()));
131        }
132        else if (pValue instanceof Double) {
133          return PrimitiveObjects.getDouble 
134            ((double) -(((Double) pValue).doubleValue ()));
135        }
136    
137        else {
138            if (log.isErrorEnabled()) {
139                String message = MessageUtil.getMessageWithArgs(
140                    Constants.UNARY_OP_BAD_TYPE,
141                    getOperatorSymbol(),
142                    pValue.getClass().getName());
143                log.error(message);
144                throw new ELException(message);
145            }     
146          return PrimitiveObjects.getInteger (0);
147        }
148      }
149    
150      //-------------------------------------
151    }