SUPPORT-8811: обновление сервиса

This commit is contained in:
Рауф Латыпов 2025-03-25 20:48:19 +03:00
parent 9593171588
commit 52bbb1e66a
2 changed files with 125 additions and 101 deletions

View file

@ -0,0 +1,109 @@
package service.loading;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import component.field.dataconvert.DataConverter;
import component.field.dataconvert.DataConverterProvider;
import component.field.loading.FieldValueByContainer;
import component.field.loading.LoadType;
import model.FieldData;
import ru.cg.webbpm.modules.database.api.bean.TableRow;
import ru.cg.webbpm.modules.database.api.dao.LoadDao;
import ru.cg.webbpm.modules.database.api.dao.option.LoadOptions;
import ru.cg.webbpm.modules.database.bean.entity_graph.EntityColumn;
import ru.cg.webbpm.modules.database.bean.filter.EntityFilter;
import ru.cg.webbpm.modules.webkit.beans.Behavior;
import ru.cg.webbpm.modules.webkit.beans.PageObjectNotFoundException;
/**
* @author r.latypov
*/
public abstract class ContainerValueLoaderServiceBase extends Behavior
implements ContainerValueLoaderService {
public LoadDao loadDao;
@Override
public List<FieldData> loadOnEventData(Object[] params, List<String> guids) {
if (loadDao == null || params == null || params.length == 0) {
return Collections.emptyList();
}
validateParametersNumber(params.length);
return new ArrayList<>(loadData(params, idToColumnMapping(guids)));
}
protected abstract void validateParametersNumber(int parametersLength);
protected abstract boolean loadByPkCondition();
protected abstract List<EntityFilter> createEntityFilters(Object[] params);
private Map<String, EntityColumn> idToColumnMapping(List<String> guids) {
Map<String, FieldValueByContainer<?>> byColumnMapping = getScriptsMapping(guids,
fieldDefaultValue -> fieldDefaultValue.loadType == LoadType.BY_COLUMN
);
if (byColumnMapping.isEmpty()) {
throw new IllegalArgumentException("No control data to load");
}
Map<String, EntityColumn> idToColumnMapping = byColumnMapping.entrySet().stream()
.collect(Collectors.toMap(
Map.Entry::getKey,
entry -> entry.getValue().getValueColumn()
)
);
return idToColumnMapping;
}
private List<FieldData> loadData(Object[] params, Map<String, EntityColumn> idToColumnMapping) {
Set<EntityColumn> columns = new HashSet<>(idToColumnMapping.values());
Map<EntityColumn, Object> columnToDataMapping;
if (loadByPkCondition()) {
columnToDataMapping = loadDao.loadByPK(columns, params[0].toString()).getColumnToDataMap();
}
else {
LoadOptions loadOptions = new LoadOptions();
loadOptions.setEntityFilters(createEntityFilters(params));
List<TableRow> tableRows = loadDao.load(columns, loadOptions);
columnToDataMapping = tableRows.size() > 0
? tableRows.get(0).getColumnToDataMap()
: Collections.emptyMap();
}
return idToColumnMapping.entrySet().stream()
.map(entry -> {
DataConverter dataConverter = DataConverterProvider.getDataConverter(
entry.getValue().getType());
Object convertedValue = dataConverter.convertValueForLoad(
columnToDataMapping.get(entry.getValue()));
return new FieldData(entry.getKey(), convertedValue);
})
.collect(Collectors.toList());
}
private Map<String, FieldValueByContainer<?>> getScriptsMapping(List<String> guids,
final Predicate<FieldValueByContainer<?>> predicate) {
return guids.stream()
.map(guid -> new HashMap.SimpleEntry<>(guid, getFieldOnEventValueScript(guid)))
.filter(entry -> entry.getValue() != null)
.filter(entry -> predicate.test(entry.getValue()))
.collect(Collectors.toMap(HashMap.SimpleEntry::getKey, HashMap.SimpleEntry::getValue));
}
private FieldValueByContainer<?> getFieldOnEventValueScript(String guid) {
try {
return getScriptInObject(guid, FieldValueByContainer.class);
}
catch (PageObjectNotFoundException e) {
return null;
}
}
}

View file

@ -1,126 +1,41 @@
package service.loading; package service.loading;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import component.field.dataconvert.DataConverter;
import component.field.dataconvert.DataConverterProvider;
import component.field.loading.FieldValueByContainer;
import component.field.loading.LoadType;
import model.FieldData;
import service.loading.ContainerValueLoaderService;
import ru.cg.webbpm.modules.database.api.bean.TableRow;
import ru.cg.webbpm.modules.database.api.dao.LoadDao;
import ru.cg.webbpm.modules.database.api.dao.option.LoadOptions;
import ru.cg.webbpm.modules.database.bean.annotation.LocalGraphSource; import ru.cg.webbpm.modules.database.bean.annotation.LocalGraphSource;
import ru.cg.webbpm.modules.database.bean.entity_graph.EntityColumn; import ru.cg.webbpm.modules.database.bean.entity_graph.EntityColumn;
import ru.cg.webbpm.modules.database.bean.filter.EntityFilter; import ru.cg.webbpm.modules.database.bean.filter.EntityFilter;
import ru.cg.webbpm.modules.database.bean.filter.FilterOperation; import ru.cg.webbpm.modules.database.bean.filter.FilterOperation;
import ru.cg.webbpm.modules.webkit.beans.Behavior;
import ru.cg.webbpm.modules.webkit.beans.PageObjectNotFoundException;
/** /**
* @author Eduard Tihomirov * @author r.latypov
*/ */
public class ContainerValueLoaderServiceImpl extends Behavior public class ContainerValueLoaderServiceImpl extends ContainerValueLoaderServiceBase {
implements ContainerValueLoaderService {
public LoadDao loadDao;
@LocalGraphSource(sourceFieldName = "loadDao") @LocalGraphSource(sourceFieldName = "loadDao")
public EntityColumn[] entityColumns; public EntityColumn[] entityColumns;
@Override @Override
public List<FieldData> loadOnEventData(Object[] params, List<String> guids) { protected void validateParametersNumber(int parametersLength) {
if (params.length > 1 && (entityColumns == null || params.length != entityColumns.length)) { if (entityColumns != null && entityColumns.length > 0
&& parametersLength > entityColumns.length) {
throw new UnsupportedOperationException( throw new UnsupportedOperationException(
"Can't support multiple params without matching entity columns"); "Can't support multiple params without matching entity columns");
} }
return new ArrayList<>(loadValuesByParamAndColumn(params, guids));
}
private List<FieldData> loadValuesByParamAndColumn(Object[] params, List<String> guids) {
Map<String, FieldValueByContainer<?>> byColumnMapping = getScriptsMapping(guids,
fieldDefaultValue -> fieldDefaultValue.loadType == LoadType.BY_COLUMN
);
if (byColumnMapping.isEmpty()) {
throw new IllegalArgumentException("No control data to load");
}
Map<String, EntityColumn> idToColumnMapping = byColumnMapping.entrySet().stream()
.collect(Collectors.toMap(
Map.Entry::getKey,
entry -> entry.getValue().getValueColumn()
)
);
return loadData(params, idToColumnMapping);
}
private List<FieldData> loadData(Object[] params, Map<String, EntityColumn> idToColumnMapping) {
if (loadDao == null || params == null || params.length == 0) {
return Collections.emptyList();
}
Set<EntityColumn> columns = new HashSet<>(idToColumnMapping.values());
Map<EntityColumn, Object> columnToDataMapping;
if (entityColumns == null || entityColumns.length == 0) {
columnToDataMapping = loadDao.loadByPK(
columns,
params[0].toString()
).getColumnToDataMap();
}
else {
LoadOptions loadOptions = new LoadOptions();
List<EntityFilter> entityFilters = new ArrayList<>();
for(int i = 0; i < entityColumns.length; i++) {
entityFilters.add(new EntityFilter(params[i], FilterOperation.EQUAL, entityColumns[i]));
}
loadOptions.setEntityFilters(entityFilters);
List<TableRow> tableRows = loadDao.load(columns, loadOptions);
columnToDataMapping = tableRows.size() > 0
? tableRows.get(0).getColumnToDataMap()
: Collections.emptyMap();
}
return idToColumnMapping.entrySet().stream()
.map(entry -> {
DataConverter dataConverter = DataConverterProvider.getDataConverter(
entry.getValue().getType());
Object convertedValue = dataConverter.convertValueForLoad(
columnToDataMapping.get(entry.getValue()));
return new FieldData(entry.getKey(), convertedValue);
})
.collect(Collectors.toList());
}
private Map<String, FieldValueByContainer<?>> getScriptsMapping(List<String> guids,
final Predicate<FieldValueByContainer<?>> predicate) {
return guids.stream()
.map(guid -> new HashMap.SimpleEntry<>(guid, getFieldOnEventValueScript(guid)))
.filter(entry -> entry.getValue() != null)
.filter(entry -> predicate.test(entry.getValue()))
.collect(Collectors.toMap(HashMap.SimpleEntry::getKey, HashMap.SimpleEntry::getValue));
}
private FieldValueByContainer<?> getFieldOnEventValueScript(String guid) {
try {
return getScriptInObject(guid, FieldValueByContainer.class);
}
catch (PageObjectNotFoundException e) {
return null;
}
} }
@Override @Override
public void start() { protected boolean loadByPkCondition() {
super.start(); return entityColumns == null || entityColumns.length == 0;
}
@Override
protected List<EntityFilter> createEntityFilters(Object[] params) {
List<EntityFilter> entityFilters = new ArrayList<>();
for (int i = 0; i < params.length; i++) {
entityFilters.add(new EntityFilter(params[i], FilterOperation.EQUAL, entityColumns[i]));
}
return entityFilters;
} }
} }