* @author Jacob Hookom [jacob@hookom.net]
* @version $Change: 181177 $$Date$$Author$
*/
-public final class AstBracketSuffix extends SimpleNode {
+public final class AstBracketSuffix extends SimpleNode implements Suffix {
public AstBracketSuffix(int id) {
super(id);
}
* @author Jacob Hookom [jacob@hookom.net]
* @version $Change: 181177 $$Date$$Author$
*/
-public final class AstDotSuffix extends SimpleNode {
+public final class AstDotSuffix extends SimpleNode implements Suffix {
public AstDotSuffix(int id) {
super(id);
}
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
+import java.util.ArrayList;
import javax.el.ELException;
import javax.el.ELResolver;
Object base = this.children[0].getValue(ctx);
int propCount = this.jjtGetNumChildren();
int i = 1;
- Object property = null;
+ Object suffix = null;
ELResolver resolver = ctx.getELResolver();
while (base != null && i < propCount) {
- property = this.children[i].getValue(ctx);
- if (property == null) {
- return null;
+ suffix = this.children[i].getValue(ctx);
+ if (i + 1 < propCount && !(this.children[i+1] instanceof Suffix)) {
+ // Looking for a method
+ ArrayList<Object> params = new ArrayList<Object>();
+ ArrayList<Class<?>> paramTypes = new ArrayList<Class<?>>();
+ while (i + 1 < propCount &&
+ !(this.children[i+1] instanceof Suffix)) {
+ params.add(this.children[i+1].getValue(ctx));
+ paramTypes.add(this.children[i+1].getType(ctx));
+ i++;
+ }
+ base = resolver.invoke(ctx, base, suffix,
+ paramTypes.toArray(new Class<?>[paramTypes.size()]),
+ params.toArray(new Object[params.size()]));
+ i++;
} else {
- ctx.setPropertyResolved(false);
- base = resolver.getValue(ctx, base, property);
+ // Looking for a property
+ if (suffix == null) {
+ return null;
+ } else {
+ ctx.setPropertyResolved(false);
+ base = resolver.getValue(ctx, base, suffix);
+ }
+ i++;
}
- i++;
}
return base;
}
*/
void ValueSuffix() : {}
{
- DotSuffix() | BracketSuffix()
+ ( DotSuffix() | BracketSuffix() ) ( MethodParameters())?
}
/*
}
/*
+ * MethodParameters
+ */
+void MethodParameters() : {}
+{
+ <LPAREN> ( Expression() ( <COMMA> Expression())* )? <RPAREN>
+}
+
+/*
* NonLiteral
* For Grouped Operations, Identifiers, and Functions
*/
--- /dev/null
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.el.parser;
+
+/**
+ * Marker interface used to simplfy the implementation of
+ * {@link AstValue#getValue(org.apache.el.lang.EvaluationContext).
+ */
+public interface Suffix {
+ // Marker interface - defines no methods
+}