package org.nutz.lang.util;
import java.lang.reflect.Field;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.nutz.castor.Castors;
import org.nutz.lang.Mirror;
public abstract class AbstractContext implements Context {
public AbstractContext() {
super();
}
public boolean isEmpty() {
return size() == 0;
}
public Object get(String name, Object dft) {
Object obj = get(name);
if (null == obj)
return dft;
return obj;
}
public <T> T getAs(Class<T> type, String name) {
return Castors.me().castTo(get(name), type);
}
public <T> T getAs(Class<T> type, String name, T dft) {
Object obj = get(name);
if (null == obj)
return dft;
return Castors.me().castTo(obj, type);
}
public int getInt(String name) {
return getInt(name, -1);
}
public String getString(String name) {
return getString(name, null);
}
public boolean getBoolean(String name) {
return getBoolean(name, false);
}
public float getFloat(String name) {
return getFloat(name, 0.0f);
}
public double getDouble(String name) {
return getDouble(name, 0.0);
}
public double getDouble(String name, double dft) {
Object obj = get(name);
if (null == obj)
return dft;
return Double.parseDouble(obj.toString());
}
public int getInt(String name, int dft) {
Object obj = get(name);
if (null == obj)
return dft;
return Integer.parseInt(obj.toString());
}
public String getString(String name, String dft) {
Object obj = get(name);
if (null == obj)
return dft;
return obj.toString();
}
public boolean getBoolean(String name, boolean dft) {
Object obj = get(name);
if (null == obj)
return dft;
return Boolean.parseBoolean(obj.toString());
}
public float getFloat(String name, float dft) {
Object obj = get(name);
if (null == obj)
return dft;
return Float.parseFloat(obj.toString());
}
public Context putAll(Object obj) {
return putAll(null, obj);
}
public Context putAll(String prefix, Object obj) {
if (null != obj) {
// Context
if (obj instanceof Context) {
for (String key : ((Context) obj).keys()) {
if (null != prefix)
key = prefix + key;
this.set(key, ((Context) obj).get(key));
}
}
// Map
else if (obj instanceof Map<?, ?>) {
for (Map.Entry<?, ?> en : ((Map<?, ?>) obj).entrySet()) {
Object oKey = en.getKey();
if (null == oKey)
continue;
String key = oKey.toString();
if (null != prefix)
key = prefix + key;
this.set(key.toString(), en.getValue());
}
}
// 普通 Java 对象
else {
Mirror<?> mirror = Mirror.me(obj);
// 需要被忽略的 Java 对象
if (mirror.getType().isArray()
|| mirror.isNumber()
|| mirror.isBoolean()
|| mirror.isChar()
|| mirror.isStringLike()
|| mirror.isDateTimeLike()
|| Collection.class.isAssignableFrom(mirror.getType())) {}
// 普通 Java 对象,应该取其每个字段
else {
for (Field field : mirror.getFields()) {
String key = field.getName();
if (null != prefix)
key = prefix + key;
this.set(key, mirror.getValue(obj, field));
}
}
}
}
return this;
}
public Map<String, Object> getInnerMap() {
Map<String, Object> map = new HashMap<String, Object>();
for (String key : this.keys())
map.put(key, this.get(key));
return map;
}
@SuppressWarnings("unchecked")
public Map<String, Object> getMap(String name) {
return getAs(Map.class, name);
}
@SuppressWarnings("unchecked")
public List<Object> getList(String name) {
return getAs(List.class, name);
}
@SuppressWarnings("unchecked")
public <T> List<T> getList(Class<T> classOfT, String name) {
return (List<T>) getList(name);
}
public abstract AbstractContext clone();
}