SUPPORT-8811: обновление сервиса
This commit is contained in:
parent
9593171588
commit
52bbb1e66a
2 changed files with 125 additions and 101 deletions
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue