/* * 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 extract(Class clazz) { List customFields = new ArrayList<>(); customFields.addAll(extractFromFields(clazz)); customFields.addAll(extractFromMethods(clazz)); List sortedFields = customFields.stream() .sorted(Comparator.comparingInt(CustomField::getRang)) .collect(Collectors.toList()); return sortedFields; } public static List extractListFields(Class clazz, CustomField printableListField) { List customFields = new ArrayList<>(); List 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 extractFromFields(Class clazz) { List 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 extractFromMethods(Class clazz) { List 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; } }