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}