package com.towel.el;
import java.util.HashMap;
import java.util.Map;
import com.towel.bean.DefaultFormatter;
import com.towel.bean.Formatter;
import com.towel.el.handler.FieldAccessHandler;
import com.towel.el.handler.FieldHandler;
import com.towel.reflec.ClassIntrospector;
/**
* The class to access the field value.
*
* @author Marcos Vasconcelos
*/
public class FieldResolver {
private String fieldName;// The field Name.
private String name;// A name for this field column.
private Formatter formatter;
private FieldAccessHandler method;
private Class<?> owner;
private static Class<? extends FieldAccessHandler> defaultHandler;
private static Class<? extends Formatter> defaultFormatter;
static {
defaultHandler = FieldHandler.class;
defaultFormatter = DefaultFormatter.class;
}
public static void setDefaultHandler(
Class<? extends FieldAccessHandler> handler) {
if (handler == null)
throw new RuntimeException("Handler can not be null!");
defaultHandler = handler;
}
public static void setDefaultFormatter(Class<? extends Formatter> formatter) {
if (formatter == null)
throw new RuntimeException("Formatter can not be null!");
defaultFormatter = formatter;
}
public FieldResolver(Class<?> clazz, String fieldName, String name) {
this(clazz, fieldName, name, null);
}
public FieldResolver(Class<?> clazz, String fieldName) {
this(clazz, fieldName, "", null);
}
public FieldResolver(Class<?> clazz, String fieldName,
FieldAccessHandler handler) {
this(clazz, fieldName, "", handler);
}
public FieldResolver(Class<?> clazz, String fieldName, String name,
FieldAccessHandler handler) {
if (handler == null)
try {
handler = defaultHandler.newInstance();
} catch (Exception e) {
e.printStackTrace();
}
owner = clazz;
this.fieldName = fieldName;
this.name = name;
method = handler;
method.resolveField(clazz, fieldName);
try {
setFormatter(defaultFormatter.newInstance());
} catch (Exception e) {
e.printStackTrace();
}
}
public FieldResolver setFormatter(Formatter formatter) {
if (formatter == null)
throw new IllegalArgumentException("Formatter can't be null!");
this.formatter = formatter;
return this;
}
public void setValue(Object t, Object value) {
method.setValue(t, value, formatter);
}
public Object getValue(Object t) {
return method.getValue(t, formatter);
}
public String getName() {
return name;
}
public Class<?> getFieldType() {
Class<?> clazz;
if (formatter instanceof DefaultFormatter)
clazz = method.getFieldType();
else {
ClassIntrospector instro = new ClassIntrospector(
formatter.getClass());
clazz = instro.getMethodReturnClass("format", Object.class);
}
if (clazz.isPrimitive())
return primitiveWrapers.get(clazz);
return clazz;
}
public String getFieldName() {
return fieldName;
}
public Class<?> getOwnerClass() {
return owner;
}
public Formatter getFormatter() {
return formatter;
}
public Class<?> getTraceClassAt(int idx) {
return method.getTraceClassAt(idx);
}
private static final Map<Class<?>, Class<?>> primitiveWrapers;
static {
primitiveWrapers = new HashMap<Class<?>, Class<?>>();
primitiveWrapers.put(char.class, Character.class);
primitiveWrapers.put(byte.class, Byte.class);
primitiveWrapers.put(short.class, Short.class);
primitiveWrapers.put(int.class, Integer.class);
primitiveWrapers.put(long.class, Long.class);
primitiveWrapers.put(float.class, Float.class);
primitiveWrapers.put(double.class, Double.class);
primitiveWrapers.put(boolean.class, Boolean.class);
}
}