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.util.List;
020    
021    import javax.servlet.jsp.el.ELException;
022    import javax.servlet.jsp.el.FunctionMapper;
023    import javax.servlet.jsp.el.VariableResolver;
024    
025    /**
026     *
027     * <p>An expression representing one or more unary operators on a
028     * value
029     * 
030     * @author Nathan Abramson - Art Technology Group
031     * @author Shawn Bayern
032     * @version $Change: 181177 $$DateTime: 2001/06/26 08:45:09 $$Author: bayard $
033     **/
034    
035    public class UnaryOperatorExpression
036      extends Expression
037    {
038      //-------------------------------------
039      // Properties
040      //-------------------------------------
041      // property operator
042    
043      UnaryOperator mOperator;
044      public UnaryOperator getOperator ()
045      { return mOperator; }
046      public void setOperator (UnaryOperator pOperator)
047      { mOperator = pOperator; }
048    
049      //-------------------------------------
050      // property operators
051    
052      List mOperators;
053      public List getOperators ()
054      { return mOperators; }
055      public void setOperators (List pOperators)
056      { mOperators = pOperators; }
057    
058      //-------------------------------------
059      // property expression
060    
061      Expression mExpression;
062      public Expression getExpression ()
063      { return mExpression; }
064      public void setExpression (Expression pExpression)
065      { mExpression = pExpression; }
066    
067      //-------------------------------------
068      /**
069       *
070       * Constructor
071       **/
072      public UnaryOperatorExpression (UnaryOperator pOperator,
073                                      List pOperators,
074                                      Expression pExpression)
075      {
076        mOperator = pOperator;
077        mOperators = pOperators;
078        mExpression = pExpression;
079      }
080    
081      //-------------------------------------
082      // Expression methods
083      //-------------------------------------
084      /**
085       *
086       * Returns the expression in the expression language syntax
087       **/
088      public String getExpressionString ()
089      {
090        StringBuffer buf = new StringBuffer ();
091        buf.append ("(");
092        if (mOperator != null) {
093          buf.append (mOperator.getOperatorSymbol ());
094          buf.append (" ");
095        }
096        else {
097          for (int i = 0, size = mOperators.size(); i < size; i++) {
098            UnaryOperator operator = (UnaryOperator) mOperators.get (i);
099            buf.append (operator.getOperatorSymbol ());
100            buf.append (" ");
101          }
102        }
103        buf.append (mExpression.getExpressionString ());
104        buf.append (")");
105        return buf.toString ();
106      }
107    
108      //-------------------------------------
109      /**
110       *
111       * Evaluates to the literal value
112       **/
113      public Object evaluate (VariableResolver pResolver, FunctionMapper functions)
114        throws ELException
115      {
116        Object value = mExpression.evaluate (pResolver, functions);
117        if (mOperator != null) {
118          value = mOperator.apply (value);
119        }
120        else {
121          for (int i = mOperators.size () - 1; i >= 0; i--) {
122            UnaryOperator operator = (UnaryOperator) mOperators.get (i);
123            value = operator.apply (value);
124          }
125        }
126        return value;
127      }
128    
129      public Expression bindFunctions(final FunctionMapper functions) throws ELException {
130          return new UnaryOperatorExpression(
131                  mOperator,
132                  mOperators,
133                  mExpression.bindFunctions(functions));
134      }
135    
136      //-------------------------------------
137    }