/*
* OpenClinica is distributed under the
* GNU Lesser General Public License (GNU LGPL).
* For details see: http://www.openclinica.org/license
* copyright 2003-2005 Akaza Research
*/
package org.akaza.openclinica.service.managestudy;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
import org.jmesa.limit.Filter;
import org.jmesa.limit.FilterSet;
import org.jmesa.limit.Limit;
import org.jmesa.limit.RowSelect;
/**
* @author Doug Rodrigues (douglas.rodrigues@openclinica.com)
*
*/
public class ViewNotesFilterCriteria {
private static final Map<String, String> FILTER_BY_TABLE_COLUMN = new HashMap<String, String>();
private static final String[] NUMERIC_FILTERS = {
"discrepancy_note_type_id","resolution_status_id","days","age"
};
private static final String[] DATE_FILTERS = {
"date_created", "date_updated"
};
static {
FILTER_BY_TABLE_COLUMN.put("studySubject.label", "label");
FILTER_BY_TABLE_COLUMN.put("discrepancyNoteBean.disType", "discrepancy_note_type_id");
FILTER_BY_TABLE_COLUMN.put("discrepancyNoteBean.resolutionStatus", "resolution_status_id");
FILTER_BY_TABLE_COLUMN.put("siteId", "site_id");
FILTER_BY_TABLE_COLUMN.put("discrepancyNoteBean.createdDate", "date_created");
FILTER_BY_TABLE_COLUMN.put("discrepancyNoteBean.updatedDate", "date_updated");
FILTER_BY_TABLE_COLUMN.put("days", "days");
FILTER_BY_TABLE_COLUMN.put("age", "age");
FILTER_BY_TABLE_COLUMN.put("eventName", "event_name");
FILTER_BY_TABLE_COLUMN.put("crfName", "crf_name");
FILTER_BY_TABLE_COLUMN.put("entityName", "entity_name");
FILTER_BY_TABLE_COLUMN.put("entityValue", "value");
FILTER_BY_TABLE_COLUMN.put("discrepancyNoteBean.entityType", "entity_type");
FILTER_BY_TABLE_COLUMN.put("discrepancyNoteBean.description", "description");
FILTER_BY_TABLE_COLUMN.put("discrepancyNoteBean.user", "user");
}
private final Map<String, Object> filters = new HashMap<String, Object>();
private Integer pageNumber;
private Integer pageSize;
public static ViewNotesFilterCriteria buildFilterCriteria(
Map<String,String> filters,
String datePattern,
Map<String, String> discrepancyNoteTypeDecoder,
Map<String, String> resolutionTypeDecoder) {
DateFormat df = new SimpleDateFormat(datePattern);
ViewNotesFilterCriteria criteria = new ViewNotesFilterCriteria();
for (Map.Entry<String, String> e: filters.entrySet()) {
String columnName = e.getKey();
String filterName = FILTER_BY_TABLE_COLUMN.get(columnName);
if (filterName == null) {
throw new IllegalArgumentException("No query fragment available for column '" + columnName + "'");
}
String value = e.getValue();
if (filterName.equals("discrepancy_note_type_id")) {
value = discrepancyNoteTypeDecoder.get(value);
} else if (filterName.equals("resolution_status_id")) {
value = resolutionTypeDecoder.get(value);
}
criteria.getFilters().put(filterName, processValue(filterName, value, df));
}
return criteria;
}
public static ViewNotesFilterCriteria buildFilterCriteria(Limit limit, String datePattern,
Map<String, String> discrepancyNoteTypeDecoder, Map<String, String> resolutionTypeDecoder) {
ViewNotesFilterCriteria criteria = new ViewNotesFilterCriteria();
FilterSet filterSet = limit.getFilterSet();
if (filterSet != null) {
DateFormat df = new SimpleDateFormat(datePattern);
for (Filter filter : filterSet.getFilters()) {
String columnName = filter.getProperty();
String filterName = FILTER_BY_TABLE_COLUMN.get(columnName);
if (filterName == null) {
throw new IllegalArgumentException("No query fragment available for column '" + columnName + "'");
}
String value = filter.getValue();
if (filterName.equals("discrepancy_note_type_id")) {
value = discrepancyNoteTypeDecoder.get(value);
} else if (filterName.equals("resolution_status_id")) {
value = resolutionTypeDecoder.get(value);
}
criteria.getFilters().put(filterName, processValue(filterName, value, df));
}
}
RowSelect rowSelect = limit.getRowSelect();
if (rowSelect != null) {
criteria.pageNumber = rowSelect.getPage();
criteria.pageSize = rowSelect.getMaxRows();
}
return criteria;
}
public Map<String, Object> getFilters() {
return filters;
}
/**
* Processes a filter value selected by the user, converting it to the appropriate type to be used in the SQL query.
* @param filterName
* @param value
* @param df
* @return
*/
protected static Object processValue(String filterName, String value, DateFormat df) {
if (Arrays.asList(NUMERIC_FILTERS).contains(filterName)) {
// Check if the numeric value is a comma-separated list of values.
String multipleValues[] = StringUtils.split(value, ',');
if (multipleValues != null && multipleValues.length > 1) {
// Parse value to a list of integers.
List<Integer> intList = new ArrayList<Integer>(multipleValues.length);
for (int i = 0; i < multipleValues.length; i++) {
intList.add(Integer.parseInt(multipleValues[i]));
}
return intList;
} else {
return Integer.parseInt(value);
}
} else if (Arrays.asList(DATE_FILTERS).contains(filterName)) {
try {
return df.parse(value);
} catch (ParseException e) {
return new Date(0); // Returns January 1, 1970 whenever the date cannot be parsed
}
}
return "%" + StringUtils.trim(value) + "%";
}
public Integer getPageNumber() {
return pageNumber;
}
public Integer getPageSize() {
return pageSize;
}
}