/*
* Copyright 2013 GiavaCms.org.
*
* Licensed under the Eclipse Public License version 1.0, available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package org.giavacms.common.model;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.giavacms.common.repository.Repository;
import org.primefaces.model.LazyDataModel;
import org.primefaces.model.SortOrder;
/**
* To make this class work, use p:dataTable as follows:
*
*
* <p:dataTable rowIndexVar="rowIndex" var="r" value="#{handler.model}" * * * * * * * * rows="#{handler.pageSize}"
* paginator="true" dynamic="true" lazy="true">
*
* @author pisi79
*
* @param <T>
*/
public class LocalLazyDataModel<T> extends LazyDataModel<T> implements
Serializable
{
private static final long serialVersionUID = 1L;
private List<T> list;
private Search<T> search;
private Repository<T> repository;
private List<DataProcessor<T>> processors = new ArrayList<DataProcessor<T>>();
public LocalLazyDataModel(List<T> list)
{
this.list = list;
setRowCount(list.size());
}
/**
* @param search
* @param repository
*/
public LocalLazyDataModel(Search<T> search, Repository<T> repository)
{
super();
// Sel l'oggetto search non ha la flag di attivo, la lista deve essere
// vuota
setRowCount(search.isActive() ? repository.getListSize(search) : 0);
this.search = search;
this.repository = repository;
}
/*
* (non-Javadoc)
*
* @see org.primefaces.model.LazyDataModel#load(int, int, java.lang.String, boolean, java.util.Map)
*/
public List<T> load(int first, int pageSize, String sortField,
boolean sortOrder, Map<String, Object> filters)
{
List<T> data = null;
if (search.isActive())
{
// Imposto il campo di ordinamento
search.setOrder(sortField);
// Imposto la direzione di ordinamento
search.setOrderAsc(sortOrder);
data = repository.getList(search, first, pageSize);
// --- aggiunta per permettere elaborazioni personalizzate sul dm
// prima
// di mostrarlo nella view ----
for (DataProcessor<T> processor : processors)
{
processor.process(data, search);
}
}
return data;
}
/**
* @param processor
*/
public void addProcessor(DataProcessor<T> processor)
{
if (processor != null)
this.processors.add(processor);
}
@Override
public List<T> load(int first, int pageSize, String arg2, SortOrder arg3,
Map<String, Object> arg4)
{
if (repository != null)
{
return load(first, pageSize, arg2, SortOrder.ASCENDING == arg3, arg4);
}
else
{
// paginiamo la lista originale, senza applicare i filtri di ricerca o di ordinamento... andrebbe fatto se si
// vuole anche filtrare in ram e non solo paginare
List<T> page = new ArrayList<T>();
for (int i = first; i < (first + pageSize) && i < list.size(); i++)
{
page.add(list.get(i));
}
return page;
}
}
@Override
public void setRowIndex(int rowIndex)
{
if (getPageSize() != 0)
{
super.setRowIndex(rowIndex);
}
}
}