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<PackageItem> {
|
|
protected static Logger logger;
|
protected static IVersionProvider versionProvider;
|
protected static IStateProvider stateProvider;
|
protected DataPackageMeta meta;
|
protected DataPackageMeta sourceMeta;
|
protected PackageItem master;
|
protected MapList<String, PackageItem> allItems;
|
protected List<PackageItem> 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<String, PackageItem>();
|
slaveItems = new ArrayList<PackageItem>();
|
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<String> loadItemLimits() throws Exception {
|
return loadItemLimits(true);
|
}
|
|
public Set<String> 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<String> 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<String> 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<String> 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<String> 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<String> 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<String> 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<PackageItem> iterator() {
|
return allItems.iterator();
|
}
|
|
public PackageItem getItem(String name) {
|
if (Util.isEmpty(name)) {
|
return master;
|
}
|
|
return allItems.get(name);
|
}
|
|
public List<PackageItem> 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;
|
}
|
|
}
|