package jpaoletti.jpm.core.operations;
import java.util.ArrayList;
import java.util.List;
import jpaoletti.jpm.converter.Converter;
import jpaoletti.jpm.converter.ConverterException;
import jpaoletti.jpm.converter.IgnoreConvertionException;
import jpaoletti.jpm.core.*;
import jpaoletti.jpm.core.message.MessageFactory;
import jpaoletti.jpm.util.DisplacedList;
/**
*
* @author jpaoletti
*/
public class PMFilterOperation extends OperationCommandSupport {
public PMFilterOperation(String operationId) {
super(operationId);
}
@Override
protected boolean prepare(PMContext ctx) throws PMException {
super.prepare(ctx);
ctx.getEntityContainer().setSelected(null);
if (ctx.getParameter("finish") == null) {
if (ctx.getEntityContainer().getFilter() == null) {
//Creates filter bean and put it in session
ctx.getEntityContainer().setFilter(ctx.getEntity().getDataAccess().createFilter(ctx));
}
return false;
} else {
final EntityFilter filter = ctx.getEntityContainer().getFilter();
filter.clear();
for (Field field : ctx.getEntity().getAllFields()) {
if (field.shouldDisplay(ctx.getOperation().getId(), ctx.getUser())) {
final List<Object> filterValues = getFilterValues(ctx, field);
if (filterValues != null && !filterValues.isEmpty()) {
filter.addFilter(field.getId(), filterValues, getFilterOperation(ctx, field));
}
}
}
filter.process(ctx.getEntity());
return true;
}
}
@Override
protected void doExecute(PMContext ctx) throws PMException {
super.doExecute(ctx);
final PaginatedList pmlist = ctx.getList();
final DisplacedList<Object> contents = new DisplacedList<Object>();
Long total = null;
contents.addAll((List<Object>) ctx.getEntity().getList(ctx, ctx.getEntityContainer().getFilter(), pmlist.getSort(), pmlist.from(), pmlist.rpp()));
if (!ctx.getEntity().getNoCount()) {
total = ctx.getEntity().getDataAccess().count(ctx);
}
PaginatedList pmList = ctx.getList();
pmList.setContents(contents);
pmList.setTotal(total);
}
private FilterOperation getFilterOperation(final PMContext ctx, final Field field) {
String eid = "filter_oper_f_" + field.getId();
String oper = (String) ctx.getParameter(eid);
if (oper != null) {
try {
int i = Integer.parseInt(oper);
switch (i) {
case 0:
return FilterOperation.EQ;
case 1:
return FilterOperation.NE;
case 2:
return FilterOperation.LIKE;
case 3:
return FilterOperation.GT;
case 4:
return FilterOperation.GE;
case 5:
return FilterOperation.LT;
case 6:
return FilterOperation.LE;
case 7:
return FilterOperation.BETWEEN;
default:
return FilterOperation.EQ;
}
} catch (Exception e) {
return FilterOperation.EQ;
}
} else {
return FilterOperation.EQ;
}
}
private List<Object> getFilterValues(PMContext ctx, Field field) throws ConverterException {
final List<Object> parameterValues = getParameterValues(ctx, field);
final List<Object> values = new ArrayList<Object>();
int i = 0;
for (Object value : parameterValues) {
try {
final Converter converter = field.getConverter(ctx.getOperation().getId());
Object converted = getConvertedValue(ctx, field, value, null, converter);
if (converted != null) {
values.add(converted);
}
} catch (IgnoreConvertionException e) {
//Do nothing, just ignore conversion.
} catch (ConverterException e) {
ctx.getPresentationManager().error(e);
ctx.addMessage(MessageFactory.error(ctx.getEntity(), field, e.getKey()));
} catch (Exception e) {
ctx.getPresentationManager().error(e);
ctx.addMessage(MessageFactory.error(ctx.getEntity(), field, UNESPECTED_ERROR));
}
i++;
}
if (values.isEmpty()) {
return null;
} else {
return values;
}
}
@Override
protected boolean checkEntity() {
return true;
}
}