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;
|
||||
|
||||
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 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.entity_graph.EntityColumn;
|
||||
import ru.cg.webbpm.modules.database.bean.filter.EntityFilter;
|
||||
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
|
||||
implements ContainerValueLoaderService {
|
||||
|
||||
public LoadDao loadDao;
|
||||
public class ContainerValueLoaderServiceImpl extends ContainerValueLoaderServiceBase {
|
||||
@LocalGraphSource(sourceFieldName = "loadDao")
|
||||
public EntityColumn[] entityColumns;
|
||||
|
||||
@Override
|
||||
public List<FieldData> loadOnEventData(Object[] params, List<String> guids) {
|
||||
if (params.length > 1 && (entityColumns == null || params.length != entityColumns.length)) {
|
||||
protected void validateParametersNumber(int parametersLength) {
|
||||
if (entityColumns != null && entityColumns.length > 0
|
||||
&& parametersLength > entityColumns.length) {
|
||||
throw new UnsupportedOperationException(
|
||||
"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
|
||||
public void start() {
|
||||
super.start();
|
||||
protected boolean loadByPkCondition() {
|
||||
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