Kenmegne
7 days ago 23a46b4be35277e06ec89f48730eeb694e686be8
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
package com.megatim.fdxcommons.tools.utils;
 
import com.megatim.fdxcommons.model.enumeration.TypeDonnee;
import com.megatim.fdxcommons.model.search.SearchColumn;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import org.apache.poi.ss.formula.functions.T;
import com.megatim.fdxcommons.model.search.CriteriaEntitySearch;
 
/**
 *
 * @author Gabuntu
 */
public class SearchColumnUtil {
 
    private SearchColumnUtil() {
    }
 
    public static List<SearchColumn> getSearchColumns(Class<T> classe) {
        List<SearchColumn> searchColumns = new ArrayList<>();
        List<Field> fields = Arrays.asList(classe.getDeclaredFields());
 
        for (Field f : fields) {
            CriteriaEntitySearch searchAnn = f.getAnnotation(CriteriaEntitySearch.class);
            if (searchAnn != null) {
                SearchColumn searchColumn = new SearchColumn();
                searchColumn.setLibelle(searchAnn.libelle());
 
                TypeDonnee typeDonnee = getTypeDonnee(f, searchAnn);
 
                if (typeDonnee != null) {
                    searchColumn.setTypeDonnee(typeDonnee);
                    searchColumns.add(searchColumn);
                }
 
            }
        }
        return searchColumns;
    }
 
    public static TypeDonnee getTypeDonnee(Field field, CriteriaEntitySearch searchAnn) {
        Class<?> fieldClass = field.getType();
        TypeDonnee typeDonnee = null;
 
        if (fieldClass.isPrimitive()) {
            typeDonnee = SqlUtilities.typeDonneeFromJavaClass(fieldClass);
 
        } else if (fieldClass.isEnum()) {
            Enumerated enumerated = field.getAnnotation(Enumerated.class);
            typeDonnee = enumerated == null || enumerated.value().equals(EnumType.ORDINAL) ? TypeDonnee.NUMERIQUE : TypeDonnee.ALPHANUMERIQUE;
 
        } else if (!fieldClass.isInterface() && !Collection.class.isAssignableFrom(fieldClass) && !Map.class.isAssignableFrom(fieldClass)) {
            String[] fieldPath = searchAnn.fieldName().split("\\.");
            if (fieldPath.length < 2) {
                typeDonnee = SqlUtilities.typeDonneeFromJavaClass(fieldClass);
            } else {
                typeDonnee = SqlUtilities.typeDonneeFromJavaClass(getFieldType(fieldClass, Arrays.copyOfRange(fieldPath, 1, fieldPath.length)));
            }
        }
 
        return typeDonnee;
    }
 
    public static Class<?> getFieldType(Class<?> classe, String[] fieldPath) {
        String fieldName = fieldPath[0];
        List<Field> fields = Arrays.asList(classe.getDeclaredFields());
        Optional<Field> optField = fields.stream().filter(f -> f.getName().equals(fieldName)).findFirst();
 
        if (optField.isPresent()) {
            Field field = optField.get();
            if (fieldPath.length == 1) {
                return field.getType();
            } else {
                return getFieldType(field.getType(), Arrays.copyOfRange(fieldPath, 1, fieldPath.length));
            }
        } else {
            return null;
        }
    }
 
}