package jef.database.meta.extension;
import java.lang.reflect.Field;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import jef.common.log.LogUtil;
import jef.database.EntityExtensionSupport;
import jef.database.VarObject;
import jef.database.annotation.DynamicKeyValueExtension;
import jef.database.dialect.type.ColumnMapping;
import jef.database.meta.AbstractMetadata;
import jef.database.meta.ITableMetadata;
import jef.database.meta.TupleMetadata;
import jef.tools.reflect.BeanUtils;
import jef.tools.reflect.ClassEx;
import jef.tools.reflect.FieldAccessor;
import jef.tools.reflect.GenericUtils;
import jef.tools.reflect.Property;
import jef.tools.reflect.ConvertUtils;
public class KvEntensionProperty implements Property {
private String kColumn;
private String vColumn;
private TupleMetadata extKvMeta;
private ITableMetadata baseResourceMeta;
private TupleMetadata extensionMeta;
private static FieldAccessor accessor;
static {
try {
Field field = EntityExtensionSupport.class.getDeclaredField("attributes");
accessor = BeanUtils.getFieldAccessor(field, false);
} catch (Exception e) {
LogUtil.error("init field error.", e);
}
}
public KvEntensionProperty(String string, TupleMetadata containerTuple, AbstractMetadata parent, TupleMetadata extensionMeta, DynamicKeyValueExtension config) {
this.kColumn = config.keyColumn();
this.vColumn = config.valueColumn();
this.baseResourceMeta = parent;
this.extensionMeta = extensionMeta;
this.extKvMeta = containerTuple;
}
@Override
public String getName() {
return "attributes";
}
@Override
public boolean isReadable() {
return true;
}
@Override
public boolean isWriteable() {
return true;
}
@Override
public Object get(Object obj) {
@SuppressWarnings("unchecked")
Map<String, Object> attributes = (Map<String, Object>) accessor.getObject(obj);
if (attributes == null) {
return Collections.EMPTY_LIST;
}
List<VarObject> attrs = new ArrayList<VarObject>();
for (Entry<String, Object> entry : attributes.entrySet()) {
VarObject v = new VarObject(extKvMeta);
v.put(kColumn, entry.getKey());
v.put(vColumn, String.valueOf(entry.getValue()));
// for (ColumnMapping mapping : baseResourceMeta.getPKFields()) {
// Object idValue = mapping.getFieldAccessor().get(obj);
// if (idValue != null) {
// v.put(mapping.fieldName(), idValue);
// }
// }
attrs.add(v);
}
return attrs;
}
@Override
public void set(Object obj, Object value) {
@SuppressWarnings("rawtypes")
Collection<?> values = (Collection) value;
EntityExtensionSupport support = (EntityExtensionSupport) obj;
for (Object entry : values) {
if (entry instanceof VarObject) {
VarObject var = (VarObject) entry;
String key = var.getString(kColumn);
String text = var.getString(vColumn);
support.setAtribute(key, fixValue(key,text));
} else {
throw new IllegalArgumentException();
}
}
}
private Object fixValue(String key,String text) {
ColumnMapping mapping=extensionMeta.getColumnDef(extensionMeta.getField(key));
if(mapping==null)return text;
return ConvertUtils.toProperType(text, new ClassEx(mapping.getFieldType()), null);
}
@Override
public Class<?> getType() {
return List.class;
}
@Override
public Type getGenericType() {
return GenericUtils.newListType(VarObject.class);
}
}