oglimmer/ggo

View on GitHub
core/src/main/java/de/oglimmer/ggo/util/ObjectAttributeCopy.java

Summary

Maintainability
A
0 mins
Test Coverage
package de.oglimmer.ggo.util;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class ObjectAttributeCopy {

    @SuppressWarnings("unchecked")
    public static <T> void copyAllFields(T to, T from, Class<?> filter) {
        Class<T> clazz = (Class<T>) from.getClass();
        // OR:
        // Class<T> clazz = (Class<T>) to.getClass();
        List<Field> fields = getAllModelFields(clazz, filter);

        for (Field field : fields) {
            try {
                field.setAccessible(true);
                field.set(to, field.get(from));
            } catch (IllegalAccessException e) {
                log.error("Failed to copy field {}", field.getName());
            }
        }
    }

    private static List<Field> getAllModelFields(Class<?> clazz, Class<?> filter) {
        List<Field> allCollectedFields = new ArrayList<>();
        do {
            if (filter == null || clazz.equals(filter)) {
                Collections.addAll(allCollectedFields, clazz.getDeclaredFields());
            }
            clazz = clazz.getSuperclass();
        } while (clazz != null);
        return allCollectedFields;
    }

}