package net.techreadiness.el; import java.beans.FeatureDescriptor; import java.util.Iterator; import javax.el.BeanELResolver; import javax.el.ELContext; import javax.el.ELResolver; import javax.el.PropertyNotFoundException; import com.opensymphony.xwork2.ActionContext; public class StrutsActionELResolver extends ELResolver { private final ELResolver beanResolver; public StrutsActionELResolver() { beanResolver = new BeanELResolver(); } @Override public Object getValue(ELContext context, Object base, Object property) { Object action = getAction(); if (base == null && property != null && action != null) { try { Object value = beanResolver.getValue(context, action, property); return value; } catch (PropertyNotFoundException e) { context.setPropertyResolved(false); return null; } catch (RuntimeException e) { context.setPropertyResolved(false); throw e; } } return null; } @Override public Class<?> getType(ELContext context, Object base, Object property) { Object action = getAction(); if (base == null && property != null && action != null) { try { return beanResolver.getType(context, action, property); } catch (PropertyNotFoundException e) { context.setPropertyResolved(false); return null; } catch (RuntimeException e) { context.setPropertyResolved(false); throw e; } } return null; } @Override public void setValue(ELContext context, Object base, Object property, Object value) { Object action = getAction(); if (base == null && property != null && action != null) { try { beanResolver.setValue(context, action, property, value); } catch (PropertyNotFoundException e) { context.setPropertyResolved(false); } catch (RuntimeException e) { context.setPropertyResolved(false); throw e; } } } @Override public boolean isReadOnly(ELContext context, Object base, Object property) { Object action = getAction(); if (base == null && property != null && action != null) { try { return beanResolver.isReadOnly(context, action, property); } catch (PropertyNotFoundException e) { context.setPropertyResolved(false); return false; } catch (RuntimeException e) { context.setPropertyResolved(false); throw e; } } return false; } @Override public Iterator<FeatureDescriptor> getFeatureDescriptors(ELContext context, Object base) { // It is not possible to resolve a Struts action at design time. return null; } @Override public Class<?> getCommonPropertyType(ELContext context, Object base) { if (base == null && getAction() != null) { return String.class; } return null; } @Override public Object invoke(ELContext context, Object base, Object method, Class<?>[] paramTypes, Object[] params) { if (base == null && getAction() != null) { // TODO This needs to be looked at return beanResolver.invoke(context, getAction(), method, paramTypes, params); } return null; } private static Object getAction() { try { return ActionContext.getContext().getActionInvocation().getAction(); } catch (NullPointerException e) { return null; } } }