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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.megatim.fdxconsultation.core.impl.utils;
 
import com.megatim.fdxcommons.model.enumeration.TypeDonnee;
import com.megatim.fdxcommons.model.search.SearchColumn;
import com.megatim.fdxcommons.tools.utils.SqlUtilities;
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 com.megatim.fdxcommons.model.search.CriteriaEntitySearch;
import java.util.Collections;
 
/**
 *
 * @author ASUS
 */
public class CriteriaEntitySearchUtil {
 
    private CriteriaEntitySearchUtil() {
 
    }
 
    public static List<SearchColumn> getSearchColumns(Class<?> 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 && searchAnn.visible()) {
                SearchColumn searchColumn = new SearchColumn();
                searchColumn.setLibelle(searchAnn.libelle());
                searchColumn.setRang(searchAnn.rang());
                searchColumn.setFieldName(searchAnn.fieldName() == null || searchAnn.fieldName().isEmpty() ? f.getName() : searchAnn.fieldName());
 
                TypeDonnee typeDonnee = getTypeDonnee(f, searchAnn);
 
                if (typeDonnee != null) {
                    searchColumn.setTypeDonnee(typeDonnee);
                    searchColumns.add(searchColumn);
 
                    if (typeDonnee.equals(TypeDonnee.ENUM)) {
                        List<String> valuesOfEnum = new ArrayList<>();
                        Class<? extends Enum> enumClasse = (Class<? extends Enum>) f.getType();
                        List<Enum> enums = Arrays.asList(enumClasse.getEnumConstants());
 
                        enums.stream().forEach(e -> valuesOfEnum.add(e.toString()));
                        searchColumn.setValuesOfEnum(valuesOfEnum);
                    }
                }
 
            }
        }
        Collections.sort(searchColumns, (SearchColumn s1, SearchColumn s2) -> Integer.valueOf(s1.getRang()).compareTo(s2.getRang()));
        return searchColumns;
    }
 
    private 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()) {
            typeDonnee = TypeDonnee.ENUM;
 
        } 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;
    }
 
    private 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;
        }
    }
}