EntitySelector bug fixed
authorVásáry Dániel <vasary@elgekko.net>
Mon, 4 Mar 2024 12:48:20 +0000 (13:48 +0100)
committerVásáry Dániel <vasary@elgekko.net>
Mon, 4 Mar 2024 12:48:20 +0000 (13:48 +0100)
sly-crm-service/src/main/java/hu/user/lis/service/data/EntityDataServiceBase.java
sly-crm-ui/src/main/java/hu/user/lis/ui/editor/selector/EntitySelectorModel.java

index 6c5397c82668d56a2d37f18a09542f1b8ae17cbe..9e6e488023f83af978cd8c2093b5effdf10ef214 100644 (file)
@@ -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<String, Field> getFields(Class<?> type) {
+        Map<String, Field> fields = new HashedMap<>();
+        getAllFields(fields, type);
+        return fields;
+    }
+
+    private void getAllFields(Map<String, Field> fields, Class<?> type) {
+        Map<String, Field> 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<Field> 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<String, Field> fields = getFields(entity.getClass());
+        return fields.get(fieldName);
     }
 
     public AbstractMap.SimpleEntry<Object, String> 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<Object, String>(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);
         }
index 2c1c85e01c69ccad90f788438920c533e8f6441c..ddaa9c1453c487748c6522370c1583205fd25937 100644 (file)
@@ -78,7 +78,9 @@ public abstract class EntitySelectorModel<T> {
     public void setSelectedEntity(T selectedEntity) {
         this.selectedEntity = selectedEntity;
         AbstractMap.SimpleEntry<Object, String> 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) {