/* * 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 getSearchColumns(Class classe) { List searchColumns = new ArrayList<>(); List 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 valuesOfEnum = new ArrayList<>(); Class enumClasse = (Class) f.getType(); List 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 fields = Arrays.asList(classe.getDeclaredFields()); Optional 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; } } }