package org.akaza.openclinica.dao.submit; import org.akaza.openclinica.dao.managestudy.CriteriaCommand; import org.apache.commons.lang.StringEscapeUtils; import org.joda.time.DateTime; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import org.akaza.openclinica.bean.core.Status; public class ListSubjectFilter implements CriteriaCommand { List<Filter> filters = new ArrayList<Filter>(); HashMap<String, String> columnMapping = new HashMap<String, String>(); Integer studyEventDefinitionId; String defaultFormat = "yyyy-MM-dd"; DateFormat theDefaultFormat; String i18Format; public ListSubjectFilter(String dateFormat) { theDefaultFormat = new SimpleDateFormat(defaultFormat); i18Format = dateFormat; columnMapping.put("subject.uniqueIdentifier", "s.unique_identifier"); columnMapping.put("subject.gender", "s.gender"); columnMapping.put("subject.createdDate", "s.date_created"); columnMapping.put("subject.owner", "ua.user_name"); columnMapping.put("subject.updatedDate", "s.date_updated"); columnMapping.put("subject.updater", "ua.user_name"); columnMapping.put("subject.status", "s.status_id"); columnMapping.put("studySubjectIdAndStudy", ""); } public void addFilter(String property, Object value) { filters.add(new Filter(property, value)); } public String execute(String criteria) { String theCriteria = ""; for (Filter filter : filters) { theCriteria += buildCriteria(criteria, filter.getProperty(), filter.getValue()); } return theCriteria; } private String buildCriteria(String criteria, String property, Object value) { value = StringEscapeUtils.escapeSql(value.toString()); if (value != null) { if (property.equals("subject.status")) { criteria = criteria + " and "; criteria = criteria + " " + columnMapping.get(property) + " = " + Status.getByName(value.toString()).getId() + " "; } else if (property.equals("subject.createdDate") || property.equals("subject.updatedDate")) { criteria += onlyYearAndMonthAndDay(String.valueOf(value), columnMapping.get(property)); criteria += onlyYear(String.valueOf(value), columnMapping.get(property)); } else if (property.equals("subject.owner")) { criteria = criteria + " and s.owner_id = ua.user_id and "; criteria = criteria + " UPPER(" + columnMapping.get(property) + ") like UPPER('%" + value.toString() + "%')" + " "; } else if (property.equals("subject.updater")) { criteria = criteria + " and s.update_id = ua.user_id and "; criteria = criteria + " UPPER(" + columnMapping.get(property) + ") like UPPER('%" + value.toString() + "%')" + " "; } else if (property.equals("studySubjectIdAndStudy")) { criteria = criteria + " and "; criteria = criteria + " ( UPPER(study.unique_identifier) like UPPER('%" + value.toString() + "%')" + " "; criteria = criteria + " or "; criteria = criteria + " UPPER(ss.label) like UPPER('%" + value.toString() + "%')" + " ) "; } else { criteria = criteria + " and "; criteria = criteria + " UPPER(" + columnMapping.get(property) + ") like UPPER('%" + value.toString() + "%')" + " "; } } return criteria; } private String onlyYear(String value, String column) { String criteria = ""; try { DateFormat format = new SimpleDateFormat("yyyy"); Date startDate = format.parse(value); DateTime dt = new DateTime(startDate.getTime()); dt = dt.plusYears(1); Date endDate = dt.toDate(); if (format.format(startDate).equals(value)) { criteria = " AND ( " + column + " between '" + theDefaultFormat.format(startDate) + "' and '" + theDefaultFormat.format(endDate) + "')"; } } catch (Exception e) { // Do nothing } return criteria; } private String onlyYearAndMonthAndDay(String value, String column) { String criteria = ""; try { DateFormat format = new SimpleDateFormat(i18Format); Date startDate = format.parse(value); DateTime dt = new DateTime(startDate.getTime()); dt = dt.plusDays(1); Date endDate = dt.toDate(); if (format.format(startDate).equals(value)) { criteria = " AND ( " + column + " between '" + theDefaultFormat.format(startDate) + "' and '" + theDefaultFormat.format(endDate) + "')"; } } catch (Exception e) { // Do nothing } return criteria; } private static class Filter { private final String property; private final Object value; public Filter(String property, Object value) { this.property = property; this.value = value; } public String getProperty() { return property; } public Object getValue() { return value; } } }