package com.megatim.fdxcommons.tools.utils; import com.megatim.fdxcommons.model.enumeration.TypeDonnee; import com.megatim.fdxcommons.model.search.SearchColumn; 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 javax.persistence.EnumType; import javax.persistence.Enumerated; import org.apache.poi.ss.formula.functions.T; import com.megatim.fdxcommons.model.search.CriteriaEntitySearch; /** * * @author Gabuntu */ public class SearchColumnUtil { private SearchColumnUtil() { } 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) { SearchColumn searchColumn = new SearchColumn(); searchColumn.setLibelle(searchAnn.libelle()); TypeDonnee typeDonnee = getTypeDonnee(f, searchAnn); if (typeDonnee != null) { searchColumn.setTypeDonnee(typeDonnee); searchColumns.add(searchColumn); } } } return searchColumns; } public 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()) { Enumerated enumerated = field.getAnnotation(Enumerated.class); typeDonnee = enumerated == null || enumerated.value().equals(EnumType.ORDINAL) ? TypeDonnee.NUMERIQUE : TypeDonnee.ALPHANUMERIQUE; } 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; } public 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; } } }