package jef.database; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; import jef.database.annotation.EasyEntity; import jef.database.meta.ITableMetadata; import jef.database.support.VarObjAdapter; import jef.tools.Assert; @XmlJavaTypeAdapter(VarObjAdapter.class) @EasyEntity(checkEnhanced = false, refresh = false) public final class VarObject extends DataObject implements Map<String, Object>,MetadataContainer { private static final long serialVersionUID = 3915258646897359358L; private final HashMap<String, Object> map = new HashMap<String, Object>(); private ITableMetadata meta; public ITableMetadata getMeta() { return meta; } protected VarObject(){ } public VarObject(ITableMetadata meta) { Assert.notNull(meta); this.meta = meta; } public VarObject(ITableMetadata meta, boolean recordField) { this.meta = meta; this._recordUpdate = false; } public int size() { return map.size(); } public boolean isEmpty() { return map.isEmpty(); } public boolean containsKey(Object key) { return map.containsKey(key); } public boolean containsValue(Object value) { return map.containsValue(value); } /** * 得到一个字段值 * * @param key * @return */ public Object get(String key) { super.beforeGet(key); return map.get(key); } /** * 得到字段值,并转换为List<VarObject> * * @param key * @throws ClassCastException * 当目标类型不能转换为List时 * @return 将类型强制转换为List<VarObject>并返回。 由于泛型擦除机制,并不能保证每个元素都是VarObject */ @SuppressWarnings("unchecked") public List<VarObject> getList(String key) { Object obj = get(key); if (obj == null) return Collections.EMPTY_LIST; return (List<VarObject>) obj; } /** * 得到字段值,并转换为Collection<VarObject> * * @param key * @throws ClassCastException * 当目标类型不能转换为Collection时 * @return 将类型强制转换为Collection<VarObject>并返回。 由于泛型擦除机制,并不能保证每个元素都是VarObject */ @SuppressWarnings("unchecked") public Collection<VarObject> getCollection(String key) { Object obj = get(key); return (Collection<VarObject>) obj; } @SuppressWarnings("unchecked") public <T> List<T> getList(String key, Class<T> clz) { Object obj = get(key); return (List<T>) obj; } /** * 得到字段值,并转换为Collection<T> * * @param key * @throws ClassCastException * 当目标类型不能转换为Collection时 * @return 将类型强制转换为Collection<T>并返回。 由于泛型擦除机制,并不能保证每个元素都是T */ @SuppressWarnings("unchecked") public <T> Collection<T> getCollection(String key, Class<T> clz) { Object obj = get(key); return (Collection<T>) obj; } public Object get(Object key) { return map.get(key); } /** * 设置字段的值,增加了字段名和数据类型的校验,可以安全地设置数值 * * @param key * @param value * @return */ public VarObject set(String key, Object value) { Field field = meta.getField(key); if (field == null) { // Check field available if (!meta.getRefFieldsByName().containsKey(key)) { throw new IllegalArgumentException("Unknown field name '" + key + "' in table " + meta.getTableName(true) + ". Avaliable:" + meta.getAllFieldNames()); } } else { // Check the data type Class<?> expected = meta.getColumnDef(field).getFieldType(); if (value != null && !expected.isAssignableFrom(value.getClass())) { throw new IllegalArgumentException("Field value not match the column type in database. field name '" + key + "' value is a '" + value.getClass().getSimpleName() + "'. expected is " + expected.getSimpleName()); } if (_recordUpdate) { super.prepareUpdate(field, value); } } map.put(key, value); return this; } /** * 设置字段的值,不作数据类型和字段值的校验 */ public Object put(String key, Object value) { Field field = meta.getField(key); if (field != null) { if (_recordUpdate) { super.prepareUpdate(field, value); } } return map.put(key, value); } public Object remove(Object key) { Field field = meta.getField(String.valueOf(key)); if (field == null) { if (!meta.getRefFieldsByName().containsKey(key)) { throw new IllegalArgumentException("Unknown field name" + key); } } else { if (_recordUpdate) { super.prepareUpdate(field, null); } } return map.remove(key); } public void putAll(Map<? extends String, ? extends Object> m) { map.putAll(m); } public void clear() { map.clear(); } public Set<String> keySet() { return meta.getAllFieldNames(); } public Collection<Object> values() { return map.values(); } public Set<java.util.Map.Entry<String, Object>> entrySet() { return map.entrySet(); } /** * 得到字段值,类型转换为String * * @param key * @return */ public String getString(String key) { Object obj = get(key); if (obj == null) return null; return String.valueOf(obj); } /** * 得到字段值,类型转换为Integer * * @param key * @return */ public Integer getInteger(String key) { Object obj = get(key); return (Integer) obj; } /** * 得到字段值,类型转换为Long * * @param key * @return */ public Long getLong(String key) { Object obj = get(key); return (Long) obj; } /** * 得到字段值,类型转换为Double * * @param key * @return */ public Double getDouble(String key) { Object obj = get(key); return (Double) obj; } /** * 得到字段值,类型转换为Boolean * * @param key * @return */ public Boolean getBoolean(String key) { Object obj = get(key); return (Boolean) obj; } @Override public int hashCode() { return map.hashCode(); } @Override public boolean equals(Object obj) { return map.equals(obj); } @Override public String toString() { return map.toString(); } }