package net.techreadiness.ognl;
import java.util.Map;
import net.techreadiness.service.object.BaseObjectWithExts;
import ognl.ObjectPropertyAccessor;
import ognl.OgnlContext;
import ognl.OgnlException;
import ognl.PropertyAccessor;
import com.google.common.collect.Iterables;
public class BaseObjectWithExtsPropertyAccessor implements PropertyAccessor {
private final ObjectPropertyAccessor accessor;
public BaseObjectWithExtsPropertyAccessor() {
accessor = new ObjectPropertyAccessor();
}
@Override
public Object getProperty(Map context, Object target, Object name) throws OgnlException {
if (accessor.hasGetProperty(context, target, name)) {
return accessor.getProperty(context, target, name);
}
BaseObjectWithExts<?> t = (BaseObjectWithExts<?>) target;
return t.getExtendedAttributes().get(name);
}
@Override
public void setProperty(Map context, Object target, Object name, Object value) throws OgnlException {
if (accessor.hasSetProperty(context, target, name)) {
accessor.setProperty(context, target, name, value);
} else {
BaseObjectWithExts<?> t = (BaseObjectWithExts<?>) target;
Object toConvert = null;
if (value.getClass().isArray()) {
Object[] array = (Object[]) value;
toConvert = array[0];
} else if (value instanceof Iterable<?>) {
toConvert = Iterables.getFirst((Iterable<?>) value, null);
} else {
toConvert = value;
}
if (toConvert == null) {
t.getExtendedAttributes().put((String) name, null);
} else {
t.getExtendedAttributes().put((String) name, String.valueOf(toConvert));
}
}
}
@Override
public String getSourceAccessor(OgnlContext context, Object target, Object index) {
return null;
}
@Override
public String getSourceSetter(OgnlContext context, Object target, Object index) {
return null;
}
}