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 */
017package org.apache.commons.el;
018
019import java.util.List;
020import java.util.ArrayList;
021
022import javax.servlet.jsp.el.ELException;
023import javax.servlet.jsp.el.FunctionMapper;
024import javax.servlet.jsp.el.VariableResolver;
025
026/**
027 *
028 * <p>Represents a dynamic value, which consists of a prefix and an
029 * optional set of ValueSuffix elements.  A prefix is something like
030 * an identifier, and a suffix is something like a "property of" or
031 * "indexed element of" operator.
032 * 
033 * @author Nathan Abramson - Art Technology Group
034 * @author Shawn Bayern
035 * @version $Change: 181177 $$DateTime: 2001/06/26 08:45:09 $$Author: bayard $
036 **/
037
038public class ComplexValue
039  extends Expression
040{
041  //-------------------------------------
042  // Properties
043  //-------------------------------------
044  // property prefix
045
046  Expression mPrefix;
047  public Expression getPrefix ()
048  { return mPrefix; }
049  public void setPrefix (Expression pPrefix)
050  { mPrefix = pPrefix; }
051
052  //-------------------------------------
053  // property suffixes
054
055  List mSuffixes;
056  public List getSuffixes ()
057  { return mSuffixes; }
058  public void setSuffixes (List pSuffixes)
059  { mSuffixes = pSuffixes; }
060
061  //-------------------------------------
062  /**
063   *
064   * Constructor
065   **/
066  public ComplexValue (Expression pPrefix,
067                       List pSuffixes)
068  {
069    mPrefix = pPrefix;
070    mSuffixes = pSuffixes;
071  }
072
073  //-------------------------------------
074  // Expression methods
075  //-------------------------------------
076  /**
077   *
078   * Returns the expression in the expression language syntax
079   **/
080  public String getExpressionString ()
081  {
082    StringBuffer buf = new StringBuffer ();
083    buf.append (mPrefix.getExpressionString ());
084
085    for (int i = 0; mSuffixes != null && i < mSuffixes.size (); i++) {
086      ValueSuffix suffix = (ValueSuffix) mSuffixes.get (i);
087      buf.append (suffix.getExpressionString ());
088    }
089
090    return buf.toString ();
091  }
092
093  //-------------------------------------
094  /**
095   *
096   * Evaluates by evaluating the prefix, then applying the suffixes
097   **/
098  public Object evaluate (VariableResolver pResolver,
099                          FunctionMapper functions)
100    throws ELException
101  {
102    Object ret = mPrefix.evaluate (pResolver, functions);
103
104    // Apply the suffixes
105    for (int i = 0; mSuffixes != null && i < mSuffixes.size (); i++) {
106      ValueSuffix suffix = (ValueSuffix) mSuffixes.get (i);
107      ret = suffix.evaluate (ret, pResolver, functions);
108    }
109
110    return ret;
111  }
112
113  public Expression bindFunctions(final FunctionMapper functions) throws ELException {
114      final List suffixes = new ArrayList(mSuffixes.size());
115      for (int i = 0; mSuffixes != null && i < mSuffixes.size (); i++) {
116          ValueSuffix suffix = (ValueSuffix) mSuffixes.get (i);
117          suffixes.add(suffix.bindFunctions(functions));
118      }
119      return new ComplexValue(mPrefix.bindFunctions(functions), suffixes);
120  }
121
122  //-------------------------------------
123}