/*
|
* 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;
|
}
|
}
|