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 net.techreadiness.service.object.BaseObjectWithExts;
public class ExtendedAttributeELResolver extends ELResolver {
private final ELResolver beanResolver;
public ExtendedAttributeELResolver() {
beanResolver = new BeanELResolver();
}
@Override
public Object getValue(ELContext context, Object base, Object property) {
if (isResolvable(base, property)) {
try {
Object value = beanResolver.getValue(context, base, property);
return value;
} catch (PropertyNotFoundException e) {
context.setPropertyResolved(true);
BaseObjectWithExts<?> entity = (BaseObjectWithExts<?>) base;
return entity.getExtendedAttributes().get(property);
} catch (RuntimeException e) {
context.setPropertyResolved(false);
throw e;
}
}
return null;
}
@Override
public Class<?> getType(ELContext context, Object base, Object property) {
if (isResolvable(base, property)) {
try {
Class<?> value = beanResolver.getType(context, base, property);
return value;
} catch (PropertyNotFoundException e) {
context.setPropertyResolved(true);
return String.class;
} catch (RuntimeException e) {
context.setPropertyResolved(false);
throw e;
}
}
return null;
}
private static boolean isResolvable(Object base, Object property) {
return base instanceof BaseObjectWithExts && property instanceof String;
}
@Override
public void setValue(ELContext context, Object base, Object property, Object value) {
if (isResolvable(base, property)) {
try {
beanResolver.setValue(context, base, property, value);
} catch (PropertyNotFoundException e) {
String prop = (String) property;
BaseObjectWithExts<?> entity = (BaseObjectWithExts<?>) base;
// TODO Is formatting necessary?
entity.getExtendedAttributes().put(prop, value == null ? null : value.toString());
context.setPropertyResolved(true);
} catch (RuntimeException e) {
context.setPropertyResolved(false);
throw e;
}
}
}
@Override
public boolean isReadOnly(ELContext context, Object base, Object property) {
if (isResolvable(base, property)) {
try {
return beanResolver.isReadOnly(context, base, property);
} catch (PropertyNotFoundException e) {
context.setPropertyResolved(true);
return false;
} catch (RuntimeException e) {
context.setPropertyResolved(false);
throw e;
}
}
return true;
}
@Override
public Iterator<FeatureDescriptor> getFeatureDescriptors(ELContext context, Object base) {
return beanResolver.getFeatureDescriptors(context, base);
}
@Override
public Class<?> getCommonPropertyType(ELContext context, Object base) {
return beanResolver.getCommonPropertyType(context, base);
}
}