package foundation.data.meta.property; import java.util.Collections; import java.util.Comparator; import java.util.Date; import java.util.Iterator; import java.util.List; import foundation.data.meta.template.Indexes; import foundation.util.MapList; public abstract class IPropertyMetasSet implements Iterable { protected Indexes indexes; protected String dataName; protected String scene; protected String capacity; protected IPropertyMetasSet master; protected Level level; protected boolean initialized; protected MapList allItems; protected PropertysRuntime listPropertys; protected PropertysRuntime formPropertys; protected PropertysRuntime exportPropertys; protected PropertysRuntime importPropertys; protected Date loadLastTime; protected IPropertyMetasSet() { } public IPropertyMetasSet(Indexes indexes) { this.indexes = indexes; this.allItems = new MapList(); this.listPropertys = new PropertysRuntime(indexes.getListIndex()); this.formPropertys = new PropertysRuntime(indexes.getFormIndex()); } public abstract void loadOne(Property property); public void build(IPropertyMetasSet master) throws Exception { if (master == null) { return; } this.master = master; //1. 初始化导入属性 initImportPropertys(); //2. 初始化导出属性 initExportPropertys(); //3. 初始化 List Property initListPropertys(); //4. 初始化 Form Property initFormPropertys(); //5. initialized = true; loadLastTime = new Date(); } // 导入Property整个系统只有一个 protected void initImportPropertys() { this.importPropertys = master.importPropertys; } // 导出Property,系统默认一套,每个角色可以有自己的 protected abstract void initExportPropertys() throws Exception; // List Property,系统默认一套,每个角色可以有自己的,每个用户也可以有自己的 protected void initListPropertys() throws Exception { doInitPropertys(MetaType.List, this.listPropertys, master.listPropertys, false); } // Form Property,系统默认一套,每个角色可以有自己的,每个用户也可以有自己的 protected void initFormPropertys() throws Exception { doInitPropertys(MetaType.Form, this.formPropertys, master.formPropertys, false); } protected void doInitPropertys(MetaType type, PropertysRuntime propertys, PropertysRuntime masterPropertys, boolean autoAddLocal) throws Exception { //1. 如果本地有,master不存在,删除掉本地且设置刷新标志, 并设置关联关系 String fieldName; boolean dirty = false; for (Property property: propertys) { fieldName = property.getFieldName(); Property masterProperty = masterPropertys.get(fieldName); if (masterProperty == null) { dirty = true; propertys.remove(fieldName); continue; } property.setMaster(masterProperty); } //2. 如果master有,本地不存在,添加到本地且设置刷新标志, 并设置关联关系 if (autoAddLocal) { for (Property masterProperty: masterPropertys) { fieldName = masterProperty.getFieldName(); Property property = propertys.get(fieldName); if (property == null) { property = new Property(); property.setMaster(masterProperty); propertys.add(fieldName, property); dirty = true; } } } //3. 保存变化 if (dirty) { saveChange(); } //4. 排序 List list = propertys.getItemList(); list = orderByIndexNo(list, type); propertys.setList(list); } private List orderByIndexNo(List list, MetaType type) { final MetaType metaType = type; Collections.sort(list, new Comparator() { @Override public int compare(Property o1, Property o2) { int orderNo1 = 0; int orderNo2 = 0; if (MetaType.List == metaType) { orderNo1 = o1.getListOrderNo(); orderNo2 = o2.getListOrderNo(); } else if (MetaType.Form == metaType) { orderNo1 = o1.getFormOrderNo(); orderNo2 = o2.getFormOrderNo(); } else if (MetaType.Export == metaType) { orderNo1 = o1.getExportOrderNo(); orderNo2 = o2.getExportOrderNo(); } else if (MetaType.Import== metaType) { orderNo1 = o1.getExportOrderNo(); orderNo2 = o2.getExportOrderNo(); } return orderNo1 - orderNo2; } }); return list; } public abstract void saveChange() throws Exception; public void clear() { if (listPropertys != null) { listPropertys.clear(); } if (formPropertys != null) { formPropertys.clear(); } if (exportPropertys != null) { exportPropertys.clear(); } if (importPropertys != null) { importPropertys.clear(); } } public PropertysRuntime getPropertys(MetaType type) { if (MetaType.List == type) { return listPropertys; } else if (MetaType.Form == type) { return formPropertys; } else if (MetaType.Export == type) { return exportPropertys; } else if (MetaType.Import == type) { return importPropertys; } return null; } public Level getLevel() { return level; } public boolean isInitialized(Date latestTime) { if (initialized && latestTime == null) { return true; } if (!initialized) { return false; } if (loadLastTime == null) { return false; } return loadLastTime.getTime() >= latestTime.getTime(); } public String getDataName() { return dataName; } public String getScene() { return scene; } public String getCapacity() { return capacity; } @Override public Iterator iterator() { return allItems.iterator(); } }