/*
|
* 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.fdxcommons.core.ifaces.abstracts;
|
|
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 javax.persistence.EnumType;
|
import javax.persistence.Enumerated;
|
import com.megatim.fdxcommons.dao.ifaces.abstracts.CustomDAOIfaces;
|
import com.megatim.fdxcommons.model.search.CriteriaEntitySearch;
|
|
/**
|
*
|
* @author ASUS
|
* @param <T> : Entite reelle
|
* @param <ID> : Classe de l'identifiant
|
* @param <S> : entité de recherche
|
* @param <U> : entité qui représente un utilisateur
|
*/
|
public interface CustomManagerIFaces<T, ID, S, U> {
|
|
<R extends CustomDAOIfaces<T, ID, S>> R getDao();
|
|
default T save(T entity) {
|
return getDao().save(entity);
|
}
|
|
default void delete(T entity) {
|
getDao().delete(entity);
|
}
|
|
public default T getById(ID id, U connectedUser) {
|
T entity = getDao().getById(id);
|
return entity;
|
}
|
|
public default T getById(ID id) {
|
|
return getDao().getById(id);
|
}
|
|
public default List<T> findWithPagination(Integer pageNumber, Integer pagesize, S searchEntity, U connectedUser) {
|
return getDao().findWithPagination(pageNumber, pagesize, searchEntity);
|
}
|
|
public default List<T> getAll(S searchEntity, U connectedUser) {
|
List<T> data = getDao().getAll(searchEntity);
|
return data;
|
}
|
|
public default List<T> getAll(S searchEntity) {
|
List<T> data = getDao().getAll(searchEntity);
|
return data;
|
}
|
|
public default List<T> getAll() {
|
return getDao().getAll(null);
|
}
|
|
public default Long count(S searchEntity) {
|
return getDao().count(searchEntity);
|
}
|
|
public default List<SearchColumn> getSearchColumns(Class<T> classe) {
|
List<SearchColumn> searchColumns = new ArrayList<>();
|
List<Field> 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());
|
// searchColumn.setName(searchAnn.fieldName().isEmpty() ? f.getName() : searchAnn.fieldName());
|
|
TypeDonnee typeDonnee = getTypeDonnee(f, searchAnn);
|
|
if (typeDonnee != null) {
|
searchColumn.setTypeDonnee(typeDonnee);
|
searchColumns.add(searchColumn);
|
}
|
|
}
|
}
|
return searchColumns;
|
}
|
|
public default 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 default Class<?> getFieldType(Class<?> classe, String[] fieldPath) {
|
String fieldName = fieldPath[0];
|
List<Field> fields = Arrays.asList(classe.getDeclaredFields());
|
Optional<Field> 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;
|
}
|
}
|
}
|