View Javadoc

1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *     http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  package org.apache.commons.el;
18  
19  import javax.servlet.jsp.el.ELException;
20  
21  import org.apache.commons.logging.Log;
22  import org.apache.commons.logging.LogFactory;
23  
24  /**
25   *
26   * <p>The implementation of the integer divide operator
27   * 
28   * @author Nathan Abramson - Art Technology Group
29   * @version $Change: 181177 $$DateTime: 2001/06/26 08:45:09 $$Author: bayard $
30   **/
31  
32  public class IntegerDivideOperator
33    extends BinaryOperator
34  {
35      //-------------------------------------
36      // Constants
37      //-------------------------------------
38      private static Log log = LogFactory.getLog(IntegerDivideOperator.class);
39      
40    //-------------------------------------
41    // Singleton
42    //-------------------------------------
43  
44    public static final IntegerDivideOperator SINGLETON =
45      new IntegerDivideOperator ();
46  
47    //-------------------------------------
48    /**
49     *
50     * Constructor
51     **/
52    public IntegerDivideOperator ()
53    {
54    }
55  
56    //-------------------------------------
57    // Expression methods
58    //-------------------------------------
59    /**
60     *
61     * Returns the symbol representing the operator
62     **/
63    public String getOperatorSymbol ()
64    {
65      return "idiv";
66    }
67  
68    //-------------------------------------
69    /**
70     *
71     * Applies the operator to the given value
72     **/
73    public Object apply (Object pLeft, Object pRight)
74      throws ELException
75    {
76      if (pLeft == null &&
77  	pRight == null) {
78          if (log.isWarnEnabled()) {
79              log.warn(
80                  MessageUtil.getMessageWithArgs(
81                      Constants.ARITH_OP_NULL, 
82                      getOperatorSymbol()));
83          }     
84        return PrimitiveObjects.getInteger (0);
85      }
86  
87      long left =
88        Coercions.coerceToPrimitiveNumber (pLeft, Long.class).
89        longValue ();
90      long right =
91        Coercions.coerceToPrimitiveNumber (pRight, Long.class).
92        longValue ();
93  
94      try {
95        return PrimitiveObjects.getLong (left / right);
96      }
97      catch (Exception exc) {
98          if (log.isErrorEnabled()) {
99              String message = MessageUtil.getMessageWithArgs(
100                 Constants.ARITH_ERROR,
101                 getOperatorSymbol(),
102                 "" + left,
103                 "" + right);
104             log.error(message);
105         }    
106       return PrimitiveObjects.getInteger (0);
107     }
108   }
109 
110   //-------------------------------------
111 }