
org.javabeanstack.web.jsf.controller.LazyDataRows Maven / Gradle / Ivy
The newest version!
/*
* JavaBeanStack FrameWork
*
* Copyright (C) 2018 Jorge Enciso
* Email: [email protected]
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 3 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301 USA
*/
package org.javabeanstack.web.jsf.controller;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.log4j.Logger;
import org.primefaces.model.LazyDataModel;
import org.primefaces.model.SortMeta;
import org.primefaces.model.SortOrder;
import org.javabeanstack.data.DataInfo;
import org.javabeanstack.data.IDataRow;
import org.javabeanstack.util.Strings;
import org.javabeanstack.error.ErrorManager;
import org.javabeanstack.util.Dates;
import org.javabeanstack.util.Fn;
import org.javabeanstack.util.LocalDates;
import org.javabeanstack.web.model.IColumnModel;
/**
*
* @author jenciso
* @param
*/
public class LazyDataRows extends LazyDataModel {
private static final Logger LOGGER = Logger.getLogger(LazyDataRows.class);
public AbstractDataController context;
private boolean noCount = false;
public LazyDataRows(AbstractDataController context) {
this.context = context;
}
public boolean isNoCount() {
return noCount;
}
public void setNoCount(boolean noCount) {
this.noCount = noCount;
}
public List getRows() {
if (context != null) {
return context.getDataRows();
}
return null;
}
@Override
public T getRowData(String rowKey) {
//Si no hay rowKey
if (rowKey == null || rowKey.isEmpty()) {
return null;
}
Object id;
String rowKeyValue = rowKey.substring(rowKey.indexOf("}") + 1);
String rowKeyType = rowKey.substring(1, rowKey.indexOf("}"));
if (context.getRow() != null) {
//Verificar si el registro actual posicionado es igual al rowKeyValue
id = context.getRow().getId();
if (rowKeyValue != null && rowKeyValue.equals(id.toString())) {
return (T) context.getRow();
}
}
id = getIdValue(rowKeyType, rowKeyValue);
//Buscar el registro que coincida con el id en la lista de registros
for (T row : getRows()) {
if (row.getId().equals(id)) {
return row;
}
}
return null;
}
protected Object getIdValue(String type, String value) {
if (type.equals("Long")) {
return Long.parseLong(value);
}
if (type.equals("Integer")) {
return Integer.parseInt(value);
}
if (type.equals("Short")) {
return Short.parseShort(value);
}
if (type.equals("String")) {
return value;
}
try {
//Tipo DataRow
Class clazz = Class.forName(type);
Long id = Long.parseLong(value);
Object row = context.getDAO().findById(clazz, id);
return row;
} catch (Exception ex) {
ErrorManager.showError(ex, LOGGER);
}
return null;
}
@Override
public Object getRowKey(T row) {
if (row == null) {
return "";
}
return row.getRowkey();
}
public Class getEntityClass() {
if (context != null) {
return context.getType();
}
return null;
}
/**
* Devuelve una lista de datos. Es un evento ejecutado desde el primeface
* cuando se puebla por primera vez la grilla, o cuando se pasa de una
* pagina a otra, o se filtra los datos en la grilla
*
* @param first a partir de que nro de registro va a devolver los datos.
* @param pageSize cantidad de registros a devolver.
* @param multiSortMeta
* @param filters filtros (campo, valor)
* @return lista de datos resultante de los parametros introducidos.
*/
@Override
public List load(int first, int pageSize, final List multiSortMeta, Map filters) {
try {
String order = "";
if (multiSortMeta != null) {
for (SortMeta sortMeta : multiSortMeta) {
final SortOrder orders = sortMeta.getSortOrder();
if (orders == SortOrder.ASCENDING || orders == SortOrder.DESCENDING) {
order = order + " " + sortMeta.getSortField() + ((orders == SortOrder.ASCENDING) ? " asc" : " desc") + ",";
}
}
if (!Strings.isNullorEmpty(order)) {
order = order.substring(0, order.length() - 1);
}
} else {
order = context.getOrder();
}
return load(first, pageSize, order, filters);
} catch (Exception ex) {
ErrorManager.showError(ex, LOGGER);
}
return null;
}
@Override
public List load(int first, int pageSize, String sortField, SortOrder sortOrder, Map filters) {
try {
String order;
if (sortField != null) {
order = sortField;
order += (sortOrder == SortOrder.ASCENDING) ? " asc" : " desc";
} else {
order = context.getOrder();
}
return load(first, pageSize, order, filters);
} catch (Exception ex) {
ErrorManager.showError(ex, LOGGER);
}
return null;
}
private List load(int first, int pageSize, String order, Map filters) {
try {
if (!context.beforeLazyRowsLoad() || !context.isOpen()){
return new ArrayList();
}
if (context.getNoLazyRowsLoad()) {
return context.getDataRows();
}
if (context.getFacesCtx().getFacesContext().getAttributes().get("nolazyload") != null) {
Boolean noLazyLoad = (Boolean) context.getFacesCtx().getFacesContext().getAttributes().get("nolazyload");
if (noLazyLoad) {
return context.getDataRows();
}
context.getFacesCtx().getFacesContext().getAttributes().put("nolazyload", false);
}
String extraFilter = "";
Map params = getParams(filters);
if (!filters.isEmpty()) {
extraFilter = getFilterString(filters);
}
context.setFirstRow(first);
context.setMaxRows(pageSize);
context.removeFilter("borrar");
context.addFilter("borrar",extraFilter);
if (params != null && !params.isEmpty()) {
context.addFilterParams(params);
}
if (Strings.isNullorEmpty(order)
&& !Strings.isNullorEmpty(context.getOrder())) {
context.setOrder(context.getOrder());
} else {
context.setOrder(order);
}
context.requery();
List rows = context.getDataRows();
setRowCount(pageSize);
if (!noCount) {
setRowCount(context.getDAO().getCount(context.getLastQuery(), context.getFilterParams()).intValue());
} else {
if (rows != null && noCount) {
if (rows.size() < pageSize){
setRowCount(first + rows.size());
}
else {
setRowCount(first + pageSize + 1);
}
}
}
context.setRowSelected(null);
return rows;
} catch (Exception ex) {
ErrorManager.showError(ex, LOGGER);
}
return null;
}
/**
* Utilizado por el metodo load, devuelve un map con el nombre del campo
* como clave y el valor del campo con su tipo de dato correspondiente.
*
* @param filters filtro (campo, valor)
* @return
*/
private Map getParams(Map filters) {
Map params = new HashMap<>();
for (Map.Entry e : filters.entrySet()) {
Class clase;
String key = e.getKey().toString().replace(".", "");
clase = DataInfo.getFieldType(getEntityClass(), (String) e.getKey());
Object value = e.getValue();
//Si es alfanumerico, ver si tiene mascara de busqueda
if (String.class.isAssignableFrom(clase)) {
value = getValueWithFilterMask((String) value, (String) e.getKey());
}
//Si el tipo de busqueda es contenida en la porción izquierda
if (String.class.isAssignableFrom(clase)
&& (getFilterMode(e.getKey().toString()).equalsIgnoreCase("contain_ltrim"))) {
params.put(key, ((String) value) + "%");
} //Si el tipo de busqueda es contenida en la porción derecha
else if (String.class.isAssignableFrom(clase)
&& (getFilterMode(e.getKey().toString()).equalsIgnoreCase("contain_rtrim"))) {
params.put(key, "%" + ((String) value));
} //Si el tipo de busqueda es contenida dentro del campo
else if (String.class.isAssignableFrom(clase)
&& (Fn.nvl(getFilterMode(e.getKey().toString()), "").isEmpty()
|| getFilterMode(e.getKey().toString()).equalsIgnoreCase("contain"))
|| getFilterMode(e.getKey().toString()).equalsIgnoreCase("contain_trim")) {
params.put(key, "%" + ((String) value) + "%");
} else if (String.class.isAssignableFrom(clase)) {
params.put(key, ((String) value));
} else if (Long.class.isAssignableFrom(clase)) {
params.put(key, Long.valueOf((String) e.getValue()));
} else if (Integer.class.isAssignableFrom(clase)) {
params.put(key, Integer.valueOf((String) e.getValue()));
} else if (Short.class.isAssignableFrom(clase)) {
params.put(key, Short.valueOf((String) e.getValue()));
} else if (BigDecimal.class.isAssignableFrom(clase)) {
params.put(key, new BigDecimal((String) e.getValue()));
} else if (LocalDateTime.class.isAssignableFrom(clase)) {
params.put(key, LocalDates.toDateTime((String) e.getValue()));
} else if (Date.class.isAssignableFrom(clase)) {
params.put(key, Dates.toDate((String) e.getValue()));
} else {
params.put(key, e.getValue());
}
}
return params;
}
/**
* Utilizado en el metodo load, devuelve la sentencia WHERE que filtra los
* datos de la lista
*
* @param filters filtros (campo, valor)
* @return
*/
private String getFilterString(Map filters) {
String queryWhere;
// Si en el controller se define los filtros
queryWhere = context.onGetFilterString(filters);
if (!queryWhere.isEmpty()) {
return queryWhere;
}
String filter;
String separador = "";
for (Map.Entry e : filters.entrySet()) {
Class clase = DataInfo.getFieldType(getEntityClass(), (String) e.getKey());
String key = e.getKey().toString().replace(".", "");
if (clase != null && String.class.isAssignableFrom(clase)) {
String filterMode = getFilterMode(e.getKey().toString());
if (Fn.nvl(filterMode, "").equals("exact")) {
// Si el tipo de busqueda es exacta
filter = separador + " o." + e.getKey() + " = :" + key;
} else if (Fn.nvl(filterMode, "").equals("exact_trim")) {
// Si el tipo de busqueda exacta
filter = separador + " trim(o." + e.getKey() + ") = :" + key;
} else if (Fn.nvl(filterMode, "").equals("exact_ltrim")) {
// Si el tipo de busqueda es exacta
filter = separador + " ltrim(o." + e.getKey() + ") = :" + key;
} else if (Fn.nvl(filterMode, "").equals("contain_ltrim")) {
// Si el tipo de busqueda contenida
filter = separador + " ltrim(upper(o." + e.getKey() + ")) like upper(:" + key + ")";
} else if (Fn.nvl(filterMode, "").equals("contain_rtrim")) {
// Si el tipo de busqueda contenida
filter = separador + " rtrim(upper(o." + e.getKey() + ")) like upper(:" + key + ")";
} else {
// Si el campo es string buscar un valor contenido en el campo
filter = separador + " upper(o." + e.getKey() + ") like upper(:" + key + ")";
}
} else {
filter = separador + " o." + e.getKey() + " = :" + key;
}
queryWhere += filter;
separador = " and ";
}
return queryWhere;
}
private String getFilterMode(String columnName) {
List columns = context.getDataTable().getColumns();
// Buscar por el campo filter
for (IColumnModel column : columns) {
if (column.getFilter().equalsIgnoreCase(columnName)) {
return column.getFilterMode();
}
}
// Buscar por el nombre de la columna
for (IColumnModel column : columns) {
if (column.getName().equalsIgnoreCase(columnName)) {
return column.getFilterMode();
}
}
return "";
}
private String getFilterMask(String columnName) {
List columns = context.getDataTable().getColumns();
// Buscar por el campo filter
for (IColumnModel column : columns) {
if (column.getFilter().equalsIgnoreCase(columnName)) {
return column.getFilterMask();
}
}
// Buscar por el nombre de la columna
for (IColumnModel column : columns) {
if (column.getName().equalsIgnoreCase(columnName)) {
return column.getFilterMask();
}
}
return "";
}
private String getValueWithFilterMask(String value, String columnName) {
if (Fn.nvl(value, "").isEmpty()) {
return value;
}
String filterMask = getFilterMask(columnName);
if (Fn.nvl(filterMask, "").isEmpty()) {
return value.trim();
}
try {
if (filterMask.toLowerCase().contains("_blank_")) {
String[] parts = filterMask.split("_");
Integer size = Integer.valueOf(parts[2]);
if (parts[0].equalsIgnoreCase("right")) {
value = Strings.rightPad(value.trim(), size, " ");
} else if (parts[0].equalsIgnoreCase("left")) {
value = Strings.leftPad(value.trim(), size, " ");
}
}
else if (filterMask.toLowerCase().contains("replace")){
String[] parts = filterMask.split(",");
parts[0] = Strings.substr(parts[0], 8).replace("'", "");
parts[1] = Strings.substr(parts[1],0,parts[1].trim().length()-1).replace("'", "");
value = value.replace(parts[0], parts[1]);
}
return value;
} catch (Exception exp) {
//nada
}
return value.trim();
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy