package jef.database.meta.extension; import java.lang.reflect.Type; import java.util.HashMap; import java.util.Map; import jef.database.EntityExtensionSupport; import jef.database.Field; import jef.database.dialect.type.ColumnMapping; import jef.database.meta.DynamicMetadata; import jef.database.meta.ExtensionConfig; import jef.database.meta.ExtensionConfigFactory; import jef.database.meta.KvExtensionImpl; import jef.database.meta.ExtensionTemplate; import jef.database.meta.MetaHolder; import jef.database.meta.TupleMetadata; import jef.database.meta.TupleModificationListener; import jef.tools.reflect.Property; public class EfPropertiesExtensionProvider implements BeanExtensionProvider { private static final EfPropertiesExtensionProvider extensionContext = new EfPropertiesExtensionProvider(); public static EfPropertiesExtensionProvider getInstance() { return extensionContext; } private final Map<Class<?>, ExtensionConfigFactory> extensions = new HashMap<Class<?>, ExtensionConfigFactory>(); @Override public boolean isDynamicExtensionClass(Class<?> javaBean) { ExtensionConfigFactory cf = extensions.get(javaBean); return cf != null && (cf instanceof ExtensionTemplate); } public ExtensionConfigFactory getExtensionFactory(Class<?> javaBean){ return extensions.get(javaBean); } public static class ExtensionProperty implements Property { private String name; private Class<?> type; private Type genericType; public ExtensionProperty(String fieldName, Type genericType, Class<?> type) { this.name = fieldName; this.genericType = genericType; this.type = type; } @Override public String getName() { return name; } @Override public boolean isReadable() { return true; } @Override public boolean isWriteable() { return true; } @Override public Object get(Object obj) { return ((EntityExtensionSupport) obj).getAtribute(name); } @Override public void set(Object obj, Object value) { ((EntityExtensionSupport) obj).setAtribute(name, value); } @Override public Class<?> getType() { return type; } @Override public Type getGenericType() { return genericType; } } @Override public String getStaticExtensionName(Class<?> clz) { ExtensionConfigFactory cf = extensions.get(clz); if (cf instanceof KvExtensionImpl) { ((KvExtensionImpl) cf).getName(); } return null; } @Override public Map<String, Property> getExtensionProperties(Class<?> type, String extensionName, ExtensionModificationListener listener) { ExtensionConfigFactory cf = extensions.get(type); if (cf != null) { Map<String, Property> props = new HashMap<String, Property>(); ExtensionConfig config = cf.getExtension(extensionName); TupleMetadata extension = config.getExtensionMeta(); for (ColumnMapping f : extension.getColumns()) { props.put(f.fieldName(), new ExtensionProperty(f.fieldName(), f.getFieldType(), f.getFieldType())); } extension.addListener(new Adapter(config, listener)); return props; } throw new IllegalArgumentException(); } class Adapter implements TupleModificationListener { private ExtensionModificationListener ext; private ExtensionConfig config; public Adapter(ExtensionConfig config, ExtensionModificationListener ext) { this.ext = ext; this.config=config; } @Override public void onDelete(DynamicMetadata meta, Field field) { event(meta); } @Override public void onUpdate(DynamicMetadata meta, Field field) { event(meta); } private void event(DynamicMetadata meta) { Map<String, Property> props = new HashMap<String, Property>(); for (ColumnMapping f : meta.getColumns()) { props.put(f.fieldName(), new ExtensionProperty(f.fieldName(), f.getFieldType(), f.getFieldType())); } config.flush(meta); ext.setExtProperties(props); } } public void register(Class<?> clz, ExtensionConfigFactory ef) { ExtensionConfigFactory old=this.extensions.put(clz, ef); // if(old!=null){ // LogUtil.warn("重复注册?"+clz+" "+ef); // } } public ExtensionConfigFactory getEF(Class<? extends EntityExtensionSupport> clz) { ExtensionConfigFactory ef=extensions.get(clz); if(ef==null){ MetaHolder.initMetadata(clz,null,null); ef=extensions.get(clz); } return ef; } }