org.jdesktop.el.impl.parser.AstValue Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of swixml Show documentation
Show all versions of swixml Show documentation
GUI generating engine for Java applications
The newest version!
/*
* Copyright (C) 2007 Sun Microsystems, Inc. All rights reserved. Use is
* subject to license terms.
*
*//* Generated By:JJTree: Do not edit this line. AstValue.java */
package org.jdesktop.el.impl.parser;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import org.jdesktop.el.ELContext;
import org.jdesktop.el.ELException;
import org.jdesktop.el.ELResolver;
import org.jdesktop.el.MethodInfo;
import org.jdesktop.el.PropertyNotFoundException;
import org.jdesktop.el.impl.lang.EvaluationContext;
import org.jdesktop.el.impl.util.MessageFactory;
import org.jdesktop.el.impl.util.ReflectionUtil;
/**
* @author Jacob Hookom [[email protected]]
* @version $Change: 181177 $$DateTime: 2001/06/26 08:45:09 $$Author: kchung $
*/
public final class AstValue extends SimpleNode {
protected static class Target {
protected Object base;
protected Object property;
}
public AstValue(int id) {
super(id);
}
public Class getType(EvaluationContext ctx) throws ELException {
Target t = getTarget(ctx);
ctx.setPropertyResolved(false);
return ctx.getELResolver().getType(ctx, t.base, t.property);
}
private final Target getTarget(EvaluationContext ctx) throws ELException {
// evaluate expr-a to value-a
Object base = this.children[0].getValue(ctx);
// if our base is null (we know there are more properites to evaluate)
if (base == null || base == ELContext.UNRESOLVABLE_RESULT) {
throw new PropertyNotFoundException(MessageFactory.get(
"error.unreachable.base", this.children[0].getImage()));
}
// set up our start/end
Object property = null;
int propCount = this.jjtGetNumChildren() - 1;
int i = 1;
// evaluate any properties before our target
ELResolver resolver = ctx.getELResolver();
if (propCount > 1) {
while (base != null && base != ELContext.UNRESOLVABLE_RESULT && i < propCount) {
property = this.children[i].getValue(ctx);
ctx.setPropertyResolved(false);
base = resolver.getValue(ctx, base, property);
i++;
}
// if we are in this block, we have more properties to resolve,
// but our base was null
if (base == ELContext.UNRESOLVABLE_RESULT || base == null || property == null) {
throw new PropertyNotFoundException(MessageFactory.get(
"error.unreachable.property", property));
}
}
property = this.children[i].getValue(ctx);
if (property == null) {
throw new PropertyNotFoundException(MessageFactory.get(
"error.unreachable.property", this.children[i]));
}
Target t = new Target();
t.base = base;
t.property = property;
return t;
}
public Object getValue(EvaluationContext ctx) throws ELException {
Object base = this.children[0].getValue(ctx);
int propCount = this.jjtGetNumChildren();
if (base == ELContext.UNRESOLVABLE_RESULT || (base == null && propCount > 1)) {
ctx.clearResolvedProperties();
return ELContext.UNRESOLVABLE_RESULT;
}
int i = 1;
Object property = null;
ELResolver resolver = ctx.getELResolver();
while (base != null && i < propCount) {
property = this.children[i].getValue(ctx);
if (property == null) {
return null;
} else {
ctx.setPropertyResolved(false);
Object origBase = base;
base = resolver.getValue(ctx, base, property);
if (base == ELContext.UNRESOLVABLE_RESULT) {
ctx.clearResolvedProperties();
return base;
} else {
ctx.resolvedProperty(origBase, property);
}
}
i++;
}
if (base == null && i < propCount) {
ctx.clearResolvedProperties();
return ELContext.UNRESOLVABLE_RESULT;
}
return base;
}
public boolean isReadOnly(EvaluationContext ctx) throws ELException {
Target t = getTarget(ctx);
ctx.setPropertyResolved(false);
return ctx.getELResolver().isReadOnly(ctx, t.base, t.property);
}
public void setValue(EvaluationContext ctx, Object value)
throws ELException {
Target t = getTarget(ctx);
ctx.setPropertyResolved(false);
ctx.getELResolver().setValue(ctx, t.base, t.property, value);
}
public MethodInfo getMethodInfo(EvaluationContext ctx, Class[] paramTypes)
throws ELException {
Target t = getTarget(ctx);
Method m = ReflectionUtil.getMethod(t.base, t.property, paramTypes);
return new MethodInfo(m.getName(), m.getReturnType(), m
.getParameterTypes());
}
public Object invoke(EvaluationContext ctx, Class[] paramTypes,
Object[] paramValues) throws ELException {
Target t = getTarget(ctx);
Method m = ReflectionUtil.getMethod(t.base, t.property, paramTypes);
Object result = null;
try {
result = m.invoke(t.base, (Object[]) paramValues);
} catch (IllegalAccessException iae) {
throw new ELException(iae);
} catch (InvocationTargetException ite) {
throw new ELException(ite.getCause());
}
return result;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy