package net.techreadiness.service.common; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import net.techreadiness.persistence.criteriaquery.Criteria; import net.techreadiness.persistence.criteriaquery.CriteriaFilter; import net.techreadiness.persistence.criteriaquery.CriteriaFilter.FilterType; import org.springframework.transaction.annotation.Transactional; import com.google.common.collect.Lists; import com.google.common.collect.Multimap; @Transactional(readOnly = true) public abstract class DataGridItemProviderImpl<T> implements DataGridItemProvider<T> { int totalNumberOfItems = 0; @Override public int getTotalNumberOfItems(DataGrid<T> grid) { return totalNumberOfItems; } protected Criteria createCriteria(DataGrid<T> grid, String... ignoredFilters) { Criteria criteria = new Criteria(); Multimap<String, String> filters = grid.getFilters(); ViewDef viewDef = grid.getViewDef(); List<String> filterKeys = Lists.newArrayList(filters.keys()); filterKeys.removeAll(Arrays.asList(ignoredFilters)); for (String key : filterKeys) { ViewField field = viewDef == null ? null : viewDef.getField(key); FilterType type = CriteriaFilter.FilterType.LIKE; List<String> filterValues = new ArrayList<>(); if (field != null && field.getOptions() != null && field.getOptions().size() > 0) { type = CriteriaFilter.FilterType.EQUALS; filterValues.addAll(filters.get(key)); } else { for (String value : filters.get(key)) { if (field != null && ViewField.DataType.BOOLEAN.toString().equals(field.getDataType())) { // for boolean, use the string value (likely "true" or "false") // and add in the int 0 or 1 as well. Boolean b = Boolean.valueOf(value); filterValues.add(value); filterValues.add(b ? "1" : "0"); } else { filterValues.add(value += "%"); } } } criteria.addFilter(new CriteriaFilter(key, type, filterValues)); } criteria.setFullTextSearch(grid.getSearch()); criteria.setFirstResults((grid.getPage() - 1) * grid.getPageSize()); criteria.setPageSize(grid.getPageSize()); return criteria; } public int getTotalNumberOfItems() { return totalNumberOfItems; } public void setTotalNumberOfItems(int totalNumberOfItems) { this.totalNumberOfItems = totalNumberOfItems; } }