package com.ejie.x38.dto;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import org.springframework.beans.BeanWrapper;
import org.springframework.beans.BeanWrapperImpl;
/**
* DTO encargado de facilitar la recogida de los parámetros de filtrado y búsqueda en la acción search del componente tabla.
*
* @author UDA
*
* @param <T> Tipo de bean utlizado para recoger los parámetros de filtado.
* @param <U> Tipo de bean utilizado para recoger los parámetros de búsqueda.
*/
public class SearchDto<T, U> {
private Map<String, Object> filterParams;
private Map<String, Object> searchParams;
/**
* Constructor.
*/
public SearchDto(){
}
/**
* Constructor.
*
* @param filterParams
* Parámetros de filtrado.
* @param searchParams
* Parámetros de búsqueda.
*/
public SearchDto(Map<String, Object> filterParams, Map<String, Object> searchParams){
this.filterParams = filterParams;
this.searchParams = searchParams;
}
/**
* Getter de filterParams;
*
* @return filterParams.
*/
public Map<String, Object> getFilterParams() {
return filterParams;
}
/**
* Setter de filterParams.
*
* @param filterParams
* Parámetros de filtrado.
*/
public void setFilterParams(Map<String, Object> filterParams) {
this.filterParams = filterParams;
}
/**
* Getter de searchParams;
*
* @return searchParams.
*/
public Map<String, Object> getSearchParams() {
return this.searchParams;
}
/**
* Setter de searchParams.
*
* @param searchParams
* Parámetros de búsqueda.
*/
public void setSearchParams(Map<String, Object> searchParams) {
this.searchParams = searchParams;
}
/**
* Devuelve un bean del tipo indicado como parámetro, con los criterios de
* filtrado.
*
* @param clazz
* Tipo de bean.
* @return Parámetros de filtrado.
*/
public T getFilterParams(Class<T> clazz) {
return this.fromMapToBean(clazz, this.filterParams);
}
/**
* Devuelve un bean del tipo indicado como parámetro, con los criterios de
* búsqueda.
*
* @param clazz
* Tipo de bean.
* @return Parámetros de búsqueda.
*/
public U getSearchParams(Class<U> clazz) {
return this.fromMapToBean(clazz, this.searchParams);
}
/**
* Devuelve un bean del tipo Pagination, con los parámetros de paginación-
*
* @return Parámetros de paginación.
*/
public Pagination getPagination() {
return this.fromMapToBean(Pagination.class, this.filterParams);
}
@SuppressWarnings("unchecked")
private <V> V fromMapToBean(Class<V> clazz, Map<String, Object> propertyMap){
BeanWrapper beanWrapper = new BeanWrapperImpl(clazz);
Set<String> keySet = propertyMap.keySet();
for (Iterator<String> iterator = keySet.iterator(); iterator.hasNext();) {
String key = iterator.next();
if (beanWrapper.isWritableProperty(key)){
beanWrapper.setPropertyValue(key, propertyMap.get(key));
}
}
return (V) beanWrapper.getWrappedInstance();
}
}