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;
}
- 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) {
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);
}
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);
}