Kenmegne
6 days ago 6494941037ae2670876de9940853d50538eb5129
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
104
105
106
107
108
109
110
111
112
113
114
115
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Interface.java to edit this template
 */
package com.megatim.reporting.adhoc.util;
 
import com.megatim.reporting.adhoc.annotations.PrintColumn;
import com.megatim.reporting.adhoc.annotations.PrintList;
import com.megatim.reporting.adhoc.pojo.CustomField;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
 
/**
 *
 * @author ASUS
 */
public class PrintableColumnExtractor {
 
    private PrintableColumnExtractor() {
    }
 
    public static List<CustomField> extract(Class<?> clazz) {
        List<CustomField> customFields = new ArrayList<>();
        customFields.addAll(extractFromFields(clazz));
        customFields.addAll(extractFromMethods(clazz));
        List<CustomField> sortedFields = customFields.stream()
            .sorted(Comparator.comparingInt(CustomField::getRang))
            .collect(Collectors.toList());
        return sortedFields;
    }
 
    public static List<CustomField> extractListFields(Class<?> clazz, CustomField printableListField) {
        List<CustomField> customFields = new ArrayList<>();
        List<Field> fields = Arrays.asList(clazz.getDeclaredFields());
        fields.stream()
                .filter(f -> {
                    PrintList printList = f.getAnnotation(PrintList.class);
                    return printList != null && printList.titre().equals(printableListField.getLibelle());
                })
                .findFirst()
                .ifPresent(c -> {
                    PrintList printList = c.getAnnotation(PrintList.class);
                    customFields.addAll(extract(printList.classe()));
                });
 
        return customFields;
    }
 
    private static List<CustomField> extractFromFields(Class<?> clazz) {
        List<CustomField> customFields = new ArrayList<>();
        Field[] fields = clazz.getDeclaredFields();
 
        for (Field f : fields) {
            PrintColumn printColumn = f.getAnnotation(PrintColumn.class);
            PrintList printList = f.getAnnotation(PrintList.class);
 
            if (printColumn != null) {
 
                CustomField customField = new CustomField(printColumn.libelle(), f.getName());
                customField.setClasse(f.getType());
                customField.setRang(printColumn.rang());
                customField.setWidth(printColumn.width());
 
                customFields.add(customField);
            } else {
                if (printList != null
                        && (java.util.List.class.isAssignableFrom(f.getType()) || java.util.Set.class.isAssignableFrom(f.getType()))) {
                    CustomField customField = new CustomField(printList.titre(), f.getName());
                    customField.setClasse(f.getType());
                    customFields.add(customField);
                }
            }
        }
 
        return customFields;
    }
 
    private static List<CustomField> extractFromMethods(Class<?> clazz) {
        List<CustomField> customFields = new ArrayList<>();
        Method[] methods = clazz.getDeclaredMethods();
 
        for (Method m : methods) {
            PrintColumn printColumn = m.getAnnotation(PrintColumn.class);
            String fieldName = extractFieldNameFromMethod(m);
 
            if (printColumn != null && fieldName != null) {
 
                CustomField customField = new CustomField(printColumn.libelle(), fieldName);
                customField.setClasse(m.getReturnType());
                customField.setRang(printColumn.rang());
 
                customFields.add(customField);
            }
        }
 
        return customFields;
    }
 
    private static String extractFieldNameFromMethod(Method method) {
        String methodName = method.getName();
 
        if (methodName.length() > 4 && methodName.startsWith("get")
                && ((int) methodName.charAt(3) >= 65 && (int) methodName.charAt(3) <= 90)) {
            String firstChar = methodName.charAt(3) + "";
 
            return firstChar.toLowerCase() + methodName.substring(4);
        }
        return null;
    }
}