Please wait. This can take some minutes ...
Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance.
Project price only 1 $
You can buy this project and download/modify it how often you want.
org.apache.jasper.el.JasperELResolver Maven / Gradle / Ivy
package org.apache.jasper.el;
import java.beans.FeatureDescriptor;
import java.lang.reflect.Method;
import java.util.Iterator;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.atomic.AtomicInteger;
import javax.el.ArrayELResolver;
import javax.el.BeanELResolver;
import javax.el.CompositeELResolver;
import javax.el.ELContext;
import javax.el.ELException;
import javax.el.ELResolver;
import javax.el.ListELResolver;
import javax.el.MapELResolver;
import javax.el.PropertyNotFoundException;
import javax.el.ResourceBundleELResolver;
import javax.el.StaticFieldELResolver;
import javax.servlet.jsp.el.ImplicitObjectELResolver;
import javax.servlet.jsp.el.ScopedAttributeELResolver;
import org.apache.jasper.runtime.ExceptionUtils;
import org.apache.jasper.runtime.JspRuntimeLibrary;
public class JasperELResolver extends CompositeELResolver {
private static final int STANDARD_RESOLVERS_COUNT = 9 ;
private AtomicInteger resolversSize = new AtomicInteger(0 );
private volatile ELResolver[] resolvers;
private final int appResolversSize;
public JasperELResolver (List appResolvers,
ELResolver streamResolver ) {
appResolversSize = appResolvers.size();
resolvers = new ELResolver[appResolversSize + STANDARD_RESOLVERS_COUNT];
add (new ImplicitObjectELResolver());
for (ELResolver appResolver : appResolvers) {
add (appResolver);
}
add (streamResolver);
add (new StaticFieldELResolver());
add (new MapELResolver());
add (new ResourceBundleELResolver());
add (new ListELResolver());
add (new ArrayELResolver());
if (JspRuntimeLibrary.GRAAL) {
add (new GraalBeanELResolver());
}
add (new BeanELResolver());
add (new ScopedAttributeELResolver());
}
@Override
public synchronized void add (ELResolver elResolver ) {
super.add (elResolver);
int size = resolversSize.get ();
if (resolvers.length > size) {
resolvers[size] = elResolver;
} else {
ELResolver[] nr = new ELResolver[size + 1 ];
System.arraycopy(resolvers, 0 , nr, 0 , size);
nr[size] = elResolver;
resolvers = nr;
}
resolversSize.incrementAndGet();
}
@Override
public Object getValue (ELContext context, Object base , Object property )
throws NullPointerException, PropertyNotFoundException, ELException {
context.setPropertyResolved(false );
int start;
Object result = null ;
if (base == null ) {
int index = 1 + appResolversSize;
for (int i = 0 ; i < index; i++) {
result = resolvers[i].getValue(context, base , property);
if (context.isPropertyResolved()) {
return result;
}
}
start = index + 7 ;
if (JspRuntimeLibrary.GRAAL) {
start++;
}
} else {
start = 1 ;
}
int size = resolversSize.get ();
for (int i = start; i < size; i++) {
result = resolvers[i].getValue(context, base , property);
if (context.isPropertyResolved()) {
return result;
}
}
return null ;
}
@Override
public Object invoke (ELContext context, Object base , Object method,
Class[] paramTypes, Object[] params ) {
String targetMethod = coerceToString(method);
if (targetMethod.length() == 0 ) {
throw new ELException(new NoSuchMethodException());
}
context.setPropertyResolved(false );
Object result = null ;
int index = 1 + appResolversSize +
2 ;
for (int i = 1 ; i < index; i++) {
result = resolvers[i].invoke(
context, base , targetMethod, paramTypes, params );
if (context.isPropertyResolved()) {
return result;
}
}
index += 4 ;
int size = resolversSize.get ();
for (int i = index; i < size; i++) {
result = resolvers[i].invoke(
context, base , targetMethod, paramTypes, params );
if (context.isPropertyResolved()) {
return result;
}
}
return null ;
}
private static String coerceToString (final Object obj ) {
if (obj == null ) {
return "" ;
} else if (obj instanceof String) {
return (String) obj;
} else if (obj instanceof Enum) {
return ((Enum) obj).name();
} else {
return obj.toString();
}
}
public static class GraalBeanELResolver extends ELResolver {
@Override
public Object getValue (ELContext context, Object base ,
Object property ) {
Objects.requireNonNull(context);
if (base == null || property == null ) {
return null ;
}
Object value = null ;
Method method = getReadMethod(base .getClass(), property.toString());
if (method != null ) {
context.setPropertyResolved(base , property);
try {
method.setAccessible(true );
value = method.invoke(base , (Object[]) null );
} catch (Exception ex) {
Throwable thr = ExceptionUtils.unwrapInvocationTargetException(ex);
ExceptionUtils.handleThrowable(thr);
}
}
return value ;
}
@Override
public void setValue (ELContext context, Object base , Object property,
Object value ) {
Objects.requireNonNull(context);
if (base == null || property == null ) {
return ;
}
Method method = getWriteMethod(base .getClass(), property.toString(), value .getClass());
if (method != null ) {
context.setPropertyResolved(base , property);
try {
method.invoke(base , value );
} catch (Exception ex) {
Throwable thr = ExceptionUtils.unwrapInvocationTargetException(ex);
ExceptionUtils.handleThrowable(thr);
}
}
}
@Override
public boolean isReadOnly (ELContext context, Object base ,
Object property ) {
Objects.requireNonNull(context);
if (base == null || property == null ) {
return false ;
}
Class beanClass = base .getClass();
String prop = property.toString();
Method readMethod = getReadMethod(beanClass, prop);
return readMethod == null || !(getWriteMethod(beanClass, prop, readMethod.getReturnType()) != null );
}
private static Method getReadMethod (Class beanClass, String prop ) {
Method methods[] = beanClass.getMethods();
String isGetter = "is" + capitalize(prop);
String getter = "get" + capitalize(prop);
for (Method method : methods) {
if (method.getParameterCount() == 0 ) {
if (isGetter.equals (method.getName()) && method.getReturnType().equals (boolean.class)) {
return method;
} else if (getter.equals (method.getName())) {
return method;
}
}
}
return null ;
}
private static Method getWriteMethod (Class beanClass, String prop, Class valueClass ) {
String setter = "set" + capitalize(prop);
Method methods[] = beanClass.getMethods();
for (Method method : methods) {
if (method.getParameterCount() == 1 && setter.equals (method.getName())
&& (valueClass == null || valueClass.isAssignableFrom(method.getParameterTypes()[0 ]))) {
return method;
}
}
return null ;
}
private static String capitalize (String name ) {
if (name == null || name.length() == 0 ) {
return name;
}
char chars[] = name.toCharArray();
chars[0 ] = Character.toUpperCase(chars[0 ]);
return new String(chars);
}
@Override
public Class getType (ELContext context, Object base ,
Object property ) {
return null ;
}
@Override
public Iterator getFeatureDescriptors (
ELContext context, Object base ) {
return null ;
}
@Override
public Class getCommonPropertyType (ELContext context, Object base ) {
if (base != null ) {
return Object.class;
}
return null ;
}
}
}