/**
*
*/
package net.conselldemallorca.helium.webapp.v3.helper;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import net.conselldemallorca.helium.v3.core.api.dto.PaginaDto;
import net.conselldemallorca.helium.v3.core.api.dto.PaginacioParamsDto;
import net.conselldemallorca.helium.v3.core.api.dto.PaginacioParamsDto.OrdreDireccioDto;
import net.conselldemallorca.helium.webapp.v3.datatables.DatatablesInfo;
import net.conselldemallorca.helium.webapp.v3.datatables.DatatablesPagina;
import org.apache.commons.beanutils.PropertyUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Utilitats per a la paginació de consultes.
*
* @author Limit Tecnologies <limit@limit.es>
*/
public class PaginacioHelper {
public static PaginacioParamsDto getPaginacioDtoFromDatatable(
HttpServletRequest request) {
return getPaginacioDtoFromDatatable(request, null);
}
public static PaginacioParamsDto getPaginacioDtoFromDatatable(
HttpServletRequest request,
Map<String, String[]> mapeigOrdenacions) {
DatatablesInfo dtInfo = new DatatablesInfo(request);
LOGGER.debug("Informació de la pàgina obtingudes de datatables (displayStart=" + dtInfo.getDisplayStart() + ", displayLength=" + dtInfo.getDisplayLength() + ", echo=" + dtInfo.getEcho() + ")");
PaginacioParamsDto paginacio = new PaginacioParamsDto();
int paginaNum = dtInfo.getDisplayStart() / dtInfo.getDisplayLength();
paginacio.setPaginaNum(paginaNum);
paginacio.setPaginaTamany(dtInfo.getDisplayLength());
for (int i = 0; i < dtInfo.getSortingCols(); i++) {
String columna = dtInfo.getProperty()[dtInfo.getSortCol()[i]];
OrdreDireccioDto direccio;
if ("asc".equals(dtInfo.getSortDir()[i]))
direccio = OrdreDireccioDto.ASCENDENT;
else
direccio = OrdreDireccioDto.DESCENDENT;
String[] columnes = new String[] {columna};
if (mapeigOrdenacions != null && mapeigOrdenacions.get(columna) != null) {
columnes = mapeigOrdenacions.get(columna);
}
for (String col: columnes) {
paginacio.afegirOrdre(col, direccio);
LOGGER.debug("Afegida ordenació a la paginació (columna=" + columna + ", direccio=" + direccio + ")");
}
}
LOGGER.debug("Informació de la pàgina sol·licitada (paginaNum=" + paginacio.getPaginaNum() + ", paginaTamany=" + paginacio.getPaginaTamany() + ")");
return paginacio;
}
public static PaginacioParamsDto getPaginacioDtoTotsElsResultats() {
PaginacioParamsDto paginacio = new PaginacioParamsDto();
paginacio.setPaginaNum(0);
paginacio.setPaginaTamany(-1);
return paginacio;
}
public static <T> DatatablesPagina<T> getPaginaPerDatatables(
HttpServletRequest request,
PaginaDto<T> pagina) {
LOGGER.debug("Informació de la pàgina (numero=" + pagina.getNumero() + ", tamany=" + pagina.getTamany() + ", total=" + pagina.getTotal() + ", elementsTotal=" + pagina.getElementsTotal() + ")");
DatatablesInfo dtInfo = new DatatablesInfo(request);
DatatablesPagina<T> resposta = new DatatablesPagina<T>();
resposta.setiTotalRecords(pagina.getElementsTotal());
resposta.setiTotalDisplayRecords(pagina.getElementsTotal());
resposta.setsEcho(dtInfo.getEcho());
List<Object[]> aaData = new ArrayList<Object[]>();
if (pagina.getContingut() != null) {
for (T registre: pagina.getContingut()) {
Object[] dadesRegistre = new Object[dtInfo.getProperty().length];
for (int i = 0; i < dtInfo.getProperty().length; i++) {
try {
String propietatNom = dtInfo.getProperty()[i];
// Si l'expressió conté múltiples termes separats per punt
// controla que el valor del primer terme no sigui null a
// l'objecte per evitar NullPointerException al PropertyUtils
boolean primerTermeNull = false;
if (propietatNom.contains(".")) {
String propietatTerme1 = propietatNom.substring(
0,
propietatNom.indexOf("."));
Object valorTerme1 = PropertyUtils.getProperty(registre, propietatTerme1);
primerTermeNull = valorTerme1 == null;
}
if (!primerTermeNull) {
Object valor = PropertyUtils.getProperty(registre, propietatNom);
dadesRegistre[i] = valor;
/*if (valor instanceof Date) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
dadesRegistre[i] = "new Date(" + sdf.format((Date)valor) + ")";
} else {
dadesRegistre[i] = (valor != null) ? valor.toString() : null;
}*/
}
} catch (Exception ex) {
dadesRegistre[i] = "(!)";
LOGGER.error(
"No s'ha pogut llegir la propietat de l'objecte (propietat=" + dtInfo.getProperty()[i] + ")",
ex);
}
}
aaData.add(dadesRegistre);
}
}
resposta.setAaData(aaData);
LOGGER.debug("Informació per a datatables (totalRecords=" + resposta.getiTotalRecords() + ", totalDisplayRecords=" + resposta.getiTotalDisplayRecords() + ", echo=" + resposta.getsEcho() + ")");
return resposta;
}
public static <T> DatatablesPagina<T> getPaginaPerDatatables(
HttpServletRequest request,
List<T> llista) {
if (llista != null)
LOGGER.debug("Informació de la llista (tamany=" + llista.size() + ")");
else
LOGGER.debug("Informació de la llista (null)");
PaginaDto<T> dto = new PaginaDto<T>();
dto.setNumero(0);
dto.setTamany((llista != null) ? llista.size() : 0);
dto.setTotal(1);
dto.setElementsTotal((llista != null) ? llista.size() : 0);
dto.setAnteriors(false);
dto.setPrimera(true);
dto.setPosteriors(false);
dto.setDarrera(true);
dto.setContingut(llista);
return getPaginaPerDatatables(request, dto);
}
private static final Logger LOGGER = LoggerFactory.getLogger(PaginacioHelper.class);
}