From 52bbb1e66a14bd5a63a05fd32cd5685f11defad9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A0=D0=B0=D1=83=D1=84=20=D0=9B=D0=B0=D1=82=D1=8B=D0=BF?= =?UTF-8?q?=D0=BE=D0=B2?= Date: Tue, 25 Mar 2025 20:48:19 +0300 Subject: [PATCH] =?UTF-8?q?SUPPORT-8811:=20=D0=BE=D0=B1=D0=BD=D0=BE=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=81=D0=B5=D1=80=D0=B2=D0=B8?= =?UTF-8?q?=D1=81=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ContainerValueLoaderServiceBase.java | 109 ++++++++++++++++ .../ContainerValueLoaderServiceImpl.java | 117 +++--------------- 2 files changed, 125 insertions(+), 101 deletions(-) create mode 100644 backend/src/main/java/service/loading/ContainerValueLoaderServiceBase.java diff --git a/backend/src/main/java/service/loading/ContainerValueLoaderServiceBase.java b/backend/src/main/java/service/loading/ContainerValueLoaderServiceBase.java new file mode 100644 index 0000000..536a9fc --- /dev/null +++ b/backend/src/main/java/service/loading/ContainerValueLoaderServiceBase.java @@ -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 loadOnEventData(Object[] params, List 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 createEntityFilters(Object[] params); + + private Map idToColumnMapping(List guids) { + Map> byColumnMapping = getScriptsMapping(guids, + fieldDefaultValue -> fieldDefaultValue.loadType == LoadType.BY_COLUMN + ); + if (byColumnMapping.isEmpty()) { + throw new IllegalArgumentException("No control data to load"); + } + Map idToColumnMapping = byColumnMapping.entrySet().stream() + .collect(Collectors.toMap( + Map.Entry::getKey, + entry -> entry.getValue().getValueColumn() + ) + ); + return idToColumnMapping; + } + + private List loadData(Object[] params, Map idToColumnMapping) { + Set columns = new HashSet<>(idToColumnMapping.values()); + Map columnToDataMapping; + if (loadByPkCondition()) { + columnToDataMapping = loadDao.loadByPK(columns, params[0].toString()).getColumnToDataMap(); + } + else { + LoadOptions loadOptions = new LoadOptions(); + loadOptions.setEntityFilters(createEntityFilters(params)); + List 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> getScriptsMapping(List guids, + final Predicate> 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; + } + } +} diff --git a/backend/src/main/java/service/loading/ContainerValueLoaderServiceImpl.java b/backend/src/main/java/service/loading/ContainerValueLoaderServiceImpl.java index 4702a2e..ab201a2 100644 --- a/backend/src/main/java/service/loading/ContainerValueLoaderServiceImpl.java +++ b/backend/src/main/java/service/loading/ContainerValueLoaderServiceImpl.java @@ -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 loadOnEventData(Object[] params, List 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 loadValuesByParamAndColumn(Object[] params, List guids) { - Map> byColumnMapping = getScriptsMapping(guids, - fieldDefaultValue -> fieldDefaultValue.loadType == LoadType.BY_COLUMN - ); - if (byColumnMapping.isEmpty()) { - throw new IllegalArgumentException("No control data to load"); - } - Map idToColumnMapping = byColumnMapping.entrySet().stream() - .collect(Collectors.toMap( - Map.Entry::getKey, - entry -> entry.getValue().getValueColumn() - ) - ); - return loadData(params, idToColumnMapping); - } - - private List loadData(Object[] params, Map idToColumnMapping) { - - if (loadDao == null || params == null || params.length == 0) { - return Collections.emptyList(); - } - - Set columns = new HashSet<>(idToColumnMapping.values()); - Map columnToDataMapping; - if (entityColumns == null || entityColumns.length == 0) { - columnToDataMapping = loadDao.loadByPK( - columns, - params[0].toString() - ).getColumnToDataMap(); - } - else { - LoadOptions loadOptions = new LoadOptions(); - List 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 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> getScriptsMapping(List guids, - final Predicate> 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 createEntityFilters(Object[] params) { + List entityFilters = new ArrayList<>(); + for (int i = 0; i < params.length; i++) { + entityFilters.add(new EntityFilter(params[i], FilterOperation.EQUAL, entityColumns[i])); + } + return entityFilters; } }