From 282b1b583a7fc13785f0a3ec74892d8e5cb0dcad Mon Sep 17 00:00:00 2001 From: =?utf8?q?V=C3=A1s=C3=A1ry=20D=C3=A1niel?= Date: Mon, 4 Mar 2024 13:48:20 +0100 Subject: [PATCH] EntitySelector bug fixed --- .../service/data/EntityDataServiceBase.java | 59 +++++++++++++------ .../editor/selector/EntitySelectorModel.java | 4 +- 2 files changed, 43 insertions(+), 20 deletions(-) diff --git a/sly-crm-service/src/main/java/hu/user/lis/service/data/EntityDataServiceBase.java b/sly-crm-service/src/main/java/hu/user/lis/service/data/EntityDataServiceBase.java index 6c5397c..9e6e488 100644 --- a/sly-crm-service/src/main/java/hu/user/lis/service/data/EntityDataServiceBase.java +++ b/sly-crm-service/src/main/java/hu/user/lis/service/data/EntityDataServiceBase.java @@ -1,27 +1,46 @@ package hu.user.lis.service.data; import lombok.extern.log4j.Log4j2; +import org.apache.commons.collections4.map.HashedMap; import org.springframework.stereotype.Service; import java.lang.reflect.Field; import java.util.AbstractMap; import java.util.Arrays; -import java.util.Optional; +import java.util.Map; +import java.util.Objects; +import java.util.function.Function; +import java.util.stream.Collectors; @Log4j2 @Service public class EntityDataServiceBase { + private Map getFields(Class type) { + Map fields = new HashedMap<>(); + getAllFields(fields, type); + return fields; + } + + private void getAllFields(Map fields, Class type) { + Map declaredFields = Arrays.stream(type.getDeclaredFields()).collect(Collectors.toMap(Field::getName, Function.identity())); + fields.putAll(declaredFields); + if (type.getSuperclass() != null) { + getAllFields(fields, type.getSuperclass()); + } + } + private Object getMemberEntity(Object parent, String property) throws IllegalAccessException, NoSuchFieldException { Object result = parent; if (property.contains(".")) { String[] tokens = property.split("\\."); for (int i = 0; i < tokens.length - 1; i++) { String fieldName = tokens[i]; - Optional declaredField = Optional.of(result.getClass().getDeclaredField(fieldName)); - Field field = declaredField.get(); - field.setAccessible(true); - result = field.get(result); + Field field = getField(result, fieldName); + if (Objects.nonNull(field)) { + field.setAccessible(true); + result = field.get(result); + } } } return result; @@ -37,15 +56,9 @@ public class EntityDataServiceBase { } - private Field getField(Object entity, String property) throws NoSuchFieldException { - Field field; - boolean hasField = Arrays.stream(entity.getClass().getDeclaredFields()).anyMatch(f -> f.getName().equals(property)); - if (hasField) { - field = entity.getClass().getDeclaredField(property); - } else { - field = entity.getClass().getSuperclass().getDeclaredField(property); - } - return field; + private Field getField(Object entity, String fieldName) throws NoSuchFieldException { + Map fields = getFields(entity.getClass()); + return fields.get(fieldName); } public AbstractMap.SimpleEntry setFieldValue(Object entity, String property, Object value) { @@ -54,9 +67,13 @@ public class EntityDataServiceBase { String memberPropertyName = getPropertyName(property); Object memberEntity = getMemberEntity(entity, property); Field field = getField(memberEntity, memberPropertyName); - field.setAccessible(true); - field.set(memberEntity, value); - result = new AbstractMap.SimpleEntry(memberEntity, memberPropertyName); + if (Objects.nonNull(field)) { + field.setAccessible(true); + field.set(memberEntity, value); + result = new AbstractMap.SimpleEntry<>(memberEntity, memberPropertyName); + } else { + log.error("Property not found {} {}", entity.getClass().getSimpleName(), property); + } } catch (Exception e) { log.error(e); } @@ -69,8 +86,12 @@ public class EntityDataServiceBase { String memberPropertyName = getPropertyName(property); Object memberEntity = getMemberEntity(entity, property); Field field = getField(memberEntity, memberPropertyName); - field.setAccessible(true); - result = field.get(memberEntity); + if (Objects.nonNull(field)) { + field.setAccessible(true); + result = field.get(memberEntity); + } else { + log.error("Property not found {} {}", entity.getClass().getSimpleName(), property); + } } catch (Exception e) { log.error(e); } diff --git a/sly-crm-ui/src/main/java/hu/user/lis/ui/editor/selector/EntitySelectorModel.java b/sly-crm-ui/src/main/java/hu/user/lis/ui/editor/selector/EntitySelectorModel.java index 2c1c85e..ddaa9c1 100644 --- a/sly-crm-ui/src/main/java/hu/user/lis/ui/editor/selector/EntitySelectorModel.java +++ b/sly-crm-ui/src/main/java/hu/user/lis/ui/editor/selector/EntitySelectorModel.java @@ -78,7 +78,9 @@ public abstract class EntitySelectorModel { public void setSelectedEntity(T selectedEntity) { this.selectedEntity = selectedEntity; AbstractMap.SimpleEntry info = entityDataServiceBase.setFieldValue(formDocument, member, selectedEntity); - BindUtils.postNotifyChange(info.getKey(), info.getValue()); + if (Objects.nonNull(info)) { + BindUtils.postNotifyChange(info.getKey(), info.getValue()); + } } public void configureSelector(Object formDocument, String member) { -- 2.54.0