package foundation.dao; import java.util.ArrayList; import java.util.Date; import java.util.Iterator; import java.util.List; import java.util.Set; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import foundation.dao.bizlogic.IStateProvider; import foundation.dao.bizlogic.IVersionProvider; import foundation.dao.version.PackageChange; import foundation.dao.version.VersionBrowseType; import foundation.dao.version.VersionCompareType; import foundation.dao.version.VersionRequest; import foundation.data.entity.Entity; import foundation.data.entity.EntitySet; import foundation.data.object.DataObject; import foundation.data.object.EntitySaver; import foundation.data.object.IParamProvider; import foundation.handler.IMessageReporter; import foundation.json.JObjectReader; import foundation.json.JSONBuilder; import foundation.json.JType; import foundation.token.IOnlineUser; import foundation.util.MapList; import foundation.util.Util; import foundation.variant.provider.DataEvent; public class DataPackage implements Iterable { protected static Logger logger; protected static IVersionProvider versionProvider; protected static IStateProvider stateProvider; protected DataPackageMeta meta; protected DataPackageMeta sourceMeta; protected PackageItem master; protected MapList allItems; protected List slaveItems; protected DataPackage applyer; protected DataPackage host; protected PackageChange change; protected DataReader dataReader; protected VersionRequest versionRequest; protected Filter filter; protected Page page; protected OrderBy orderBy; protected PackageState state; static { logger = LogManager.getLogger(DataPackage.class); versionProvider = new IVersionProvider(); } public static DataPackage getInstance(String dataName) throws Exception { //1. get package meta DataPackageMetaContainer metaContainer = DataPackageMetaContainer.getInstance(); DataPackageMeta packageMeta = metaContainer.get(dataName); if (packageMeta == null) { return null; } DataPackage result = new DataPackage(); result.init(packageMeta); return result; } public static DataPackage getInstance(String dataName, String itemName) throws Exception { //1. get package meta DataPackageMetaContainer metaContainer = DataPackageMetaContainer.getInstance(); DataPackageMeta packageMeta = metaContainer.get(dataName); if (packageMeta == null) { return null; } DataPackage result = null; //2. 正常DataPackage创建 if (Util.isEmpty(itemName)) { result = new DataPackage(); result.init(packageMeta); return result; } //3. Partial DataPackage创建 PackageItemMeta itemMeta = packageMeta.getItem(itemName); DataPackageMeta partialMeta = new DataPackageMeta(itemMeta); result = new DataPackage(); result.sourceMeta = packageMeta; result.init(partialMeta); return result; } public static DataPackage refresh(String dataName) throws Exception { DataPackageMetaContainer metaContainer = DataPackageMetaContainer.getInstance(); DataPackageMeta packageMeta = metaContainer.refresh(dataName); if (packageMeta == null) { return null; } DataPackage result = new DataPackage(); result.init(packageMeta); return result; } protected DataPackage() { allItems = new MapList(); slaveItems = new ArrayList(); state = new PackageState(); filter = new Filter(); page = new Page(); orderBy = new OrderBy(); } protected void init(DataPackageMeta packageMeta) throws Exception { //1. meta this.meta = packageMeta; //2. create items createItems(); } public void rebuildItems() { //1. clear clearItems(); //2. create createItems(); } public void loadDataFromRequest() throws Exception { loadDataFromRequest("data"); } public void loadDataFromRequest(String name) throws Exception { JSONState jsonState = state.getJSONState(); if (jsonState.isDataLoaded()) { return; } JObjectReader packageReader = dataReader.getReader(name, JType.Object); if (packageReader == null) { return; } //1. master --> load JSON master.loadOneDataFromJSON(packageReader, DataSource.Request); //2. slaves --> load JSON for (PackageItem packageItem: slaveItems) { packageItem.loadOneDataFromJSON(packageReader, DataSource.Request); } //3. set state jsonState.setDataLoaded(true); } public void loadDataIdFromRequest() throws Exception { JSONState jsonState = state.getJSONState(); if (jsonState.isIdLoaded()) { return; } String id = master.getId(); if (!Util.isEmpty(id)) { jsonState.setIdLoaded(true); return; } Domain domain = dataReader.getDomain(); id = domain.getId(); //1. 为master设置ID if (master != null && !Util.isEmpty(id)) { master.setId(id); } //2. set state jsonState.setIdLoaded(!Util.isEmpty(id)); } public void loadFilterFromJSON() throws Exception { JSONState jsonState = state.getJSONState(); if (jsonState.isFilterLoaded() || (master == null)) { return; } DataObject dataObject = master.getDataObject(); //如果不是host才需要从请求里面加载参数 if (applyer == null) { //1. 默认加载ID loadDataIdFromRequest(); //2. 加载过滤条件 if (dataReader != null) { dataReader.loadFilterFromJSON(dataObject, filter); } } //3. 如果过滤条件为空,但是id不为空 String id = master.getId(); if (!Util.isEmpty(id)) { if (filter == null) { filter = new Filter(); } String tableName = dataObject.getTableOrViewName(); filter.add(DataReader.getFullFieldName(tableName, "id"), id); } //4. set state jsonState.setFilterLoaded(true); } public void loadPageOrderByFromJSON() throws Exception { JSONState jsonState = state.getJSONState(); if (jsonState.isPageOrderLoaded() || (master == null)) { return; } //1. load page order by DataObject dataObject = master.getDataObject(); dataReader.loadPageOrderByFromJSON(dataObject, page, orderBy); //2. set state jsonState.setPageOrderLoaded(true); } public void loadOrderByFromJSON() throws Exception { JSONState jsonState = state.getJSONState(); if (jsonState.isPageOrderLoaded() || (master == null)) { return; } //1. load page order by DataObject dataObject = master.getDataObject(); dataReader.loadOrderByFromJSON(dataObject, orderBy); //2. set state jsonState.setPageOrderLoaded(true); } private void loadVersionRequest() { this.versionRequest = dataReader.loadVersionRequest(); } public void loadFilterPageOrderByFromJSON() throws Exception { loadFilterFromJSON(); loadPageOrderByFromJSON(); } public void loadUserLineFilter() throws Exception { if (state.isUserFilterLoaded() || master == null) { return; } //1. load user line filter IOnlineUser user = IOnlineUser.getInstance(); DataObject dataObject = getMasterDataObject(); dataObject.loadUserLineFilter(user, filter); //2. set state state.setUserFilterLoaded(true); } public void loadBatchDataFromDB() throws Exception { DBState dbState = state.getDbState(); if (dbState.isBatchDataLoaded() || master == null) { return; } //1. 从请求中获取版本要求 loadVersionRequest(); //2. 从请求中加载过滤条件、分页、OrderBy loadFilterPageOrderByFromJSON(); //3. load user line limit loadUserLineFilter(); //4. 计算分页 calculatePage(); //5. load entitySet master.loadBatchDataFromDB(filter, page, orderBy); //6. set state dbState.setBatchDataLoaded(true); } public void loadTreeDataFromDB() throws Exception { DBState dbState = state.getDbState(); if (dbState.isBatchDataLoaded() || master == null) { return; } //1. 从请求中获取版本要求 loadVersionRequest(); //2. 从请求中加载过滤条件、分页、OrderBy loadFilterFromJSON(); loadOrderByFromJSON(); //3. load user line limit loadUserLineFilter(); //5. load entitySet master.loadTreeDataFromDB(filter, orderBy); //6. set state dbState.setBatchDataLoaded(true); } public boolean isDBExists() throws Exception { String masterId = getMasterId(); if (Util.isEmpty(masterId)) { return true; } DataObject dataObject = getMasterDataObject(); return dataObject.existsEntity(masterId); } public void loadOneDataFromPersist() throws Exception { String dataName = getName(); boolean versionActive = versionProvider.isVersionActive(dataName); //1. 如果没有版本管理 if (!versionActive) { loadOneDataFromDB(); } //2. 如果有版本管理 else { VersionRequest versionRequest = dataReader.getVersionRequest(); VersionBrowseType browseType = versionRequest.getBrowseType(); //2.1 如果要看最新数据, if (VersionBrowseType.Latest == browseType) { loadOneDataFromFile(); return; } //2.2 其他情况都从数据库取数据 loadOneDataFromDB(); //2.3 如果需要对比,获取指定数据对比 Domain domain = dataReader.getDomain(); VersionCompareType compareType = domain.getVersionCompareType(); if (VersionCompareType.DoNothing != compareType) { compare(DataSource.DB, DataSource.File); } } } public void loadOneDataFromDB() throws Exception { DBState dbState = state.getDbState(); if (dbState.isOneDataLoaded() || master == null) { return; } //1. load master entity master.loadOneDataFromDB(filter); dbState.setMasterLoaded(true); //2. slaves --> load persist for (PackageItem packageItem: slaveItems) { if (packageItem.isLasyLoad()) { continue; } packageItem.loadOneDataFromDB(); dbState.setItemLoaded(packageItem.getName(), true); } //3. set state dbState.setOneDataLoaded(true); } public void loadOneDataFromFile() throws Exception { FileState fileState = state.getFileState(); if (fileState.isOneDataLoaded() || master == null) { return; } //1. file reader String dataName = getName(), masterId = getMasterId(); String applyId = applyer.getMasterId(); IVersionIndex versionIndex = versionProvider.getIndex(dataName, masterId, applyId); IFileReader fileReader = versionIndex.getFileReader(); JObjectReader packageReader = fileReader.getJSONObjectReader(); //2. master --> load JSON master.loadOneDataFromJSON(packageReader, DataSource.File); //3. slaves --> load JSON for (PackageItem packageItem: slaveItems) { packageItem.loadOneDataFromJSON(packageReader, DataSource.File); } //4. set state fileState.setOneDataLoaded(true); } public void loadMasterFromDB() throws Exception { DBState dbState = state.getDbState(); if (dbState.isMasterLoaded() || master == null) { return; } else { String masterId = master.getId(); if (!Util.isEmpty(masterId)) { onSetMasterId(masterId); } } //1. 获取 master id loadFilterFromJSON(); if (filter == null || filter.isEmpty()) { return; } //2. load entitySet boolean loaded = master.loadOneDataFromDB(filter); //3. set state dbState.setMasterLoaded(loaded); } public void loadHostIdFromDB() throws Exception { if (host == null) { return; } String hostId = host.getMasterId(); if (!Util.isEmpty(hostId)) { return; } //1. 加载master loadMasterFromDB(); //2. 加载hostID Entity entity = getMasterEntity(); hostId = entity.getString("host_id"); host.setMasterId(hostId); } public void loadItemFromDB(String itemName) throws Exception { DBState dbState = state.getDbState(); if (dbState.isItemLoaded(itemName)) { return; } PackageItem item = getItem(itemName); if (item == null) { return; } //1. load item item.loadOneDataFromDB(); //2. set state dbState.setItemLoaded(itemName, true); } public Set loadItemLimits() throws Exception { return loadItemLimits(true); } public Set loadItemLimits(boolean includeReadOnly) throws Exception { if (!meta.containsHostItemLimits()) { return null; } //1. 获取 Type Code String typeCode = dataReader.getString(IDataLetter.TypeCode); if (Util.isEmpty(typeCode)) { Entity entity = getMasterEntity(); if (entity != null) { typeCode = entity.getString(IDataLetter.TypeCode); } } //2. 获取配置表里面定义的limits Set result = meta.getHostItemLimits(typeCode, includeReadOnly); //3. 返回结果 return result; } public void createDefaultOneData() throws Exception { CreateState createState = state.getCreateState(); if (createState.isDataCreated() || master == null) { return; } //1. master --> create default data master.createDefaultOneData(); //2. branch slaves --> create default data String masterId = master.getId(); for (PackageItem item: slaveItems) { if (PackageItemType.Branch != item.getType()) { continue; } Entity entity = item.createDefaultOneData(); entity.set(item.getParentField(), masterId); createState.setItemCreated(item.getName(), true); } //3. 加载页面传过来的值(例如type_code等) loadDataFromRequest(); //4.加载宿主 if (host != null) { Set itemLimits = loadItemLimits(); host.execItemLimits(itemLimits); host.loadOneDataFromDB(); host.setResultData(DataSource.DB); } //5. set state createState.setDataCreated(true); } public int saveOneDataToPersist() throws Exception { return saveOneDataToPersist(null, null); } public int saveOneDataToPersist(IParamProvider paramProvider, IMessageReporter reporter) throws Exception { //1. 如果有宿主,保存宿主到文件中 if (host != null) { //1.1 加载 host limit,重新构建items Set itemLimits = loadItemLimits(); host.execItemLimits(itemLimits); //1.2 加载host,保存到文件 host.loadDataFromRequest(IDataLetter.Host); if (!host.isEmpty(DataSource.Request)) { host.saveOneDataToFile(DataSource.Request); } } //2. 保存当前数据到数据库中 return saveOneDataToDB(DataSource.Request, paramProvider, reporter); } public void activateOneData() throws Exception { activateOneData(null, null); } public void activateOneData(IParamProvider iParamProvider, IMessageReporter reporter) throws Exception { String dataName = getName(); String masterId = getMasterId(); boolean versionActive = versionProvider.isVersionActive(dataName); //1. 如果没有版本管理,不需要操作 if (!versionActive) { logger.error("{} has no version managent, activate skip", dataName); return; } //2. 加载 host limit,重新构建items Set itemLimits = applyer.loadItemLimits(false); execItemLimits(itemLimits); //3. 如果版本管理,将最新的文件数据保存到数据库,并为当前生效数据设置正式版本号 loadOneDataFromFile(); saveOneDataToDB(DataSource.File, iParamProvider, reporter); String applyId = applyer.getMasterId(); versionProvider.activateVersion(dataName, masterId, applyId); } public void fallbackOneData() throws Exception { String dataName = getName(); String masterId = getMasterId(); boolean versionActive = versionProvider.isVersionActive(dataName); //1. 如果没有版本管理,不需要操作 if (!versionActive) { logger.error("{} has no version managent, fallback skip", dataName); return; } //2. 加载 host limit,重新构建items Set itemLimits = applyer.loadItemLimits(); execItemLimits(itemLimits); //3. 如果版本管理,删除文件数据,删除失效数据临时版本 deleteOneDataFromFile(); String applyId = applyer.getMasterId(); versionProvider.deleteVersion(dataName, masterId, applyId); } public int saveOneDataToDB(DataSource dataSource) throws Exception { return saveOneDataToDB(dataSource, null, null); } public int saveOneDataToDB(DataSource dataSource, IParamProvider paramProvider, IMessageReporter reporter) throws Exception { DBState dbState = state.getDbState(); if (dbState.isOneDataSaved() || master == null) { return 0; } int result = 0; //1. save to persist result = master.saveOneDataToDB(dataSource, paramProvider, reporter) + result; //2. save to persist for (PackageItem item: slaveItems) { result = item.saveOneDataToDB(dataSource, paramProvider, reporter) + result; } //3. set state dbState.setOneDataSaved(true); return result; } public DataPackage cloneOneData(DataSource... dataSource) throws Exception { DataPackage result = DataPackage.getInstance(meta.getName()); //1. clone master master.cloneDataTo(result.master, dataSource); //2. clone items for (PackageItem item: slaveItems) { String itemName = item.getName(); PackageItem targetItem = result.getItem(itemName); item.cloneDataTo(targetItem, dataSource); } return result; } private void compare(DataSource one, DataSource another) throws Exception { change = new PackageChange(); //1. compare master master.compare(change, one, another); //2. save to persist for (PackageItem item: slaveItems) { item.compare(change, one, another); } } public void saveOneDataToFile(DataSource dataSource) throws Exception { String dataName = getName(); String masterId = getMasterId(); String applyId = applyer.getMasterId(); //1. 创建版本索引(如果索引存在,就不再创建) IVersionIndex index = versionProvider.getIndex(dataName, masterId, applyId); if (index == null) { logger.error("{} can not get version index, save to file skip", dataName); return; } //2. 保存文件 IFileWriter fileWriter = index.getFileWriter(); JSONBuilder content = saveOneDataToString(dataSource); fileWriter.write(content); } public JSONBuilder saveOneDataToString(DataSource dataSource) throws Exception { JSONBuilder result = new JSONBuilder(); result.beginObject(); //1. save to string master.saveOneDataToString(dataSource, result); //2. save to persist for (PackageItem item: slaveItems) { item.saveOneDataToString(dataSource, result); } result.endObject(); //3. return return result; } public void deleteOneDataFromDB() throws Exception { DBState dbState = state.getDbState(); if (dbState.isOneDataDeleted() || master == null) { return; } //1. delete slave from persist for (PackageItem packageItem: slaveItems) { packageItem.deleteOneDataFromDB(); } //2. delete master from persist master.deleteOneDataFromDB(); //3. set state dbState.setOneDataDeleted(true); } public void deleteOneDataFromFile() throws Exception { String dataName = getName(); String masterId = getMasterId(); String applyId = applyer.getMasterId(); //1. 创建版本索引(如果索引存在,就不再创建) IVersionIndex index = versionProvider.getIndex(dataName, masterId, applyId); if (index == null) { logger.error("{} can not get version index, save to file skip", dataName); return; } //2. 保存文件 IFileWriter fileWriter = index.getFileWriter(); fileWriter.delete(); } protected void calculatePage() throws Exception { if (master == null || page == null) { return; } DataObject dataObject = master.getDataObject(); int count = dataObject.getCount(filter, dataReader.getUser()); page.setRecordCount(count); if (page.isEmpty()) { page = null; } } protected void addOneItem(PackageItem packageItem) { String name = packageItem.getName(); allItems.add(name, packageItem); } private void deleteOneItem(PackageItem packageItem) { slaveItems.remove(packageItem); allItems.remove(packageItem.getName()); } private void clearItems() { allItems.clear(); slaveItems.clear(); master = null; } private void createItems() { //1. create items for (PackageItemMeta itemMeta: meta) { PackageItem item = new PackageItem(this, itemMeta); addOneItem(item); } //2. 计算Master、Slave calculateMaster(); //3. set master relation for (PackageItem item: allItems) { item.setMaster(master); } } public void execItemLimits(Set itemNames) { if (itemNames == null || itemNames.isEmpty()) { return; } int max = slaveItems.size() - 1; for (int i = max; i >= 0; i--) { PackageItem item = slaveItems.get(i); String slaveName = item.getName(); slaveName = slaveName.toLowerCase(); if (!itemNames.contains(slaveName)) { deleteOneItem(item); } } } private void calculateMaster() { int size = allItems.size(); //1. 如果只有一个Item,直接就设置为Master if (size == 1) { master = allItems.get(0); return; } //2. 否则遍历所有,进行分类 for (PackageItem item: allItems) { PackageItemType type = item.getType(); if (PackageItemType.Master == type) { master = item; } else { slaveItems.add(item); } } } public boolean execValidateRules(IMessageReporter reporter) { boolean success = true; for (PackageItem packageItem: allItems) { Object value = packageItem.getData(DataSource.Request); if (value == null) { return true; } DataObject dataObject = packageItem.getDataObject(); if (value instanceof EntitySet) { EntitySet entitySet = (EntitySet)value; for (Entity entity: entitySet) { success = success && dataObject.validateEntity(entity, reporter); } } else if (value instanceof Entity) { Entity entity = (Entity)value; success = success && dataObject.validateEntity(entity, reporter); } } return success; } public void execDefaultValueRules(DataEvent dataEvent) { //1. 如果是New的数据 if (DataEvent.New == dataEvent) { for (PackageItem item: allItems) { Entity entity = item.getEntity(DataSource.New); if (entity == null) { return; } DataObject dataObject = item.getDataObject(); dataObject.setEntityDefaultValues(dataEvent, entity); return; } } //2. 如果是页面传过来要保存的数据 for (PackageItem item: allItems) { Entity entity = item.getEntity(DataSource.Request); if (entity == null) { return; } DataObject dataObject = item.getDataObject(); dataObject.setEntityDefaultValues(dataEvent, entity); return; } } public void lockMasterRecord() throws Exception { DataObject dataObject = getMasterDataObject(); Entity entity = dataObject.createTableEmptyEntity(); entity.set("id", getMasterId()); entity.set("update_time", new Date()); dataObject.updateEntity(entity); } @Override public Iterator iterator() { return allItems.iterator(); } public PackageItem getItem(String name) { if (Util.isEmpty(name)) { return master; } return allItems.get(name); } public List getSlaveItems() { return slaveItems; } public String getItemValue(String path) { //1. 获取package里面某个item的字段值(master.code/so_implant.code) int pos = path.indexOf("."); if (pos < 0) { return null; } String itemName = path.substring(0, pos); String fieldName = path.substring(pos + 1); PackageItem item = getItem(itemName); if (item == null) { return null; } return item.getValueString(fieldName); } public PackageItem getMaster() { return master; } public String getMasterId() { return master.getId(); } public void setMasterId(String masterId) throws Exception { master.setId(masterId); } public boolean existsMaster() { return master != null; } public DataObject getMasterDataObject() { return meta.getMasterDataObject(); } public DataObject getDetailDataObject() { PackageItem detailItem = getDetailItem(); return detailItem.getDataObject(); } public PackageItem getDetailItem() { //1. 尝试根据名字来获取 String detailName = master.getName() + "_detail"; PackageItem detail = getItem(detailName); if (detail != null) { return detail; } //2. 根据类型来获取 for (PackageItem item : slaveItems) { PackageItemType type = item.getType(); if (PackageItemType.Detail.equals(type)) { return item; } } return null; } public Entity getMasterEntity() { return getMasterEntity(DataSource.DB); } public Entity getMasterEntity(DataSource... dataSource) { PackageItem master = getMaster(); return master.getEntity(dataSource); } public EntitySaver createMasterEntitySaver() throws Exception { PackageItem master = getMaster(); EntitySaver saver = new EntitySaver(master.getDataObject(), master.getEntity(DataSource.DB, DataSource.Request)); return saver; } public EntitySaver createEntitySaver(String itemName) throws Exception { PackageItem item = getItem(itemName); EntitySaver saver = new EntitySaver(item.getDataObject(), item.getEntity(DataSource.DB, DataSource.Request)); return saver; } public Entity getItemEntity(String itemName) { PackageItem item = getItem(itemName); return item.getEntity(DataSource.DB); } public Entity getItemEntity(String itemName, DataSource dataSource) { PackageItem item = getItem(itemName); return item.getEntity(dataSource); } public EntitySet getItemEntitySet() { PackageItem item = slaveItems.get(0); return item.getEntitySet(DataSource.DB); } public EntitySet getItemEntitySet(String itemName) { PackageItem item = getItem(itemName); return item.getEntitySet(DataSource.DB); } public EntitySet getItemEntitySet(String itemName, DataSource... dataSource) { PackageItem item = getItem(itemName); return item.getEntitySet(dataSource); } public DataObject getDataObject(String itemName) { PackageItem item = allItems.get(itemName); DataObject result = item != null ? item.getDataObject() : null; return result; } public void setResultData(DataSource dataSource) { for (PackageItem item: allItems) { item.setResultData(dataSource); } } public boolean isEmpty(DataSource... dataSource) { if (allItems.isEmpty()) { return true; } for (PackageItem item: allItems) { if (!item.isEmpty(dataSource)) { return false; } } return true; } public void onSetMasterId(String masterId) { if (Util.isEmpty(masterId)) { return; } JSONState jsonState = state.getJSONState(); if (jsonState.isIdLoaded()) { return; } if (filter == null) { filter = new Filter(); } DataObject dataObject = master.getDataObject(); String tableName = dataObject.getTableOrViewName(); filter.add(DataReader.getFullFieldName(tableName, "id"), masterId); } public String getName() { return meta.getName(); } public Page getPage() { return page; } public void setPage(Page page) { this.page = page; } public OrderBy getOrderBy() { return orderBy; } public void setOrderBy(OrderBy orderBy) { this.orderBy = orderBy; } public PackagePrintType getResultPrintType() { if (master.isEntitySet(DataSource.Result)) { return PackagePrintType.BatchMaster; } return PackagePrintType.Package; } public void setDataReader(DataReader dataReader) throws Exception { this.dataReader = dataReader; } public DataReader getDataReader() { return dataReader; } public String getHostName() { return meta.getHostName(); } public void setHost(DataPackage host) { this.host = host; host.dataReader = dataReader; host.applyer = this; } public DataPackage getHost() { return host; } public DataPackage getApplyer() { return applyer; } public PackageChange getChange() { return change; } public static void registerVersionProvider(IVersionProvider provider) { versionProvider = provider; } public PackageState getState() { return state; } public void setState(PackageState state) { this.state = state; } public PackageStringMap toStringMap() { PackageStringMap result = new PackageStringMap(this); return result; } public String getHostID() { if (host == null) { return null; } return host.getMasterId(); } public String getString(String name, String defaultValue) { FieldName fieldName = new FieldName(name); if (fieldName.isEmpty()) { return defaultValue; } PackageItem item = getItem(fieldName.getTableName()); if (item == null) { item = master; } Entity entity = item.getEntity(DataSource.DB); if (entity == null) { return defaultValue; } return entity.getString(fieldName.getFieldName()); } public String getString(String name) { return getString(name, null); } public Filter getFilter() { return filter; } public void setFilter(Filter filter) { this.filter = filter; } }