package org.akaza.openclinica.control.managestudy; import org.akaza.openclinica.bean.core.Status; import org.akaza.openclinica.bean.login.UserAccountBean; import org.akaza.openclinica.bean.managestudy.StudyBean; import org.akaza.openclinica.bean.managestudy.StudySubjectBean; import org.akaza.openclinica.bean.submit.SubjectBean; import org.akaza.openclinica.control.AbstractTableFactory; import org.akaza.openclinica.control.DefaultActionsEditor; import org.akaza.openclinica.dao.hibernate.AuditUserLoginDao; import org.akaza.openclinica.dao.login.UserAccountDAO; import org.akaza.openclinica.dao.managestudy.StudyAuditLogFilter; import org.akaza.openclinica.dao.managestudy.StudyAuditLogSort; import org.akaza.openclinica.dao.managestudy.StudySubjectDAO; import org.akaza.openclinica.dao.submit.SubjectDAO; import org.akaza.openclinica.i18n.util.I18nFormatUtil; import org.akaza.openclinica.i18n.util.ResourceBundleProvider; import org.jmesa.core.filter.DateFilterMatcher; import org.jmesa.core.filter.FilterMatcher; import org.jmesa.core.filter.MatcherKey; import org.jmesa.facade.TableFacade; import org.jmesa.limit.Filter; import org.jmesa.limit.FilterSet; import org.jmesa.limit.Limit; import org.jmesa.limit.Sort; import org.jmesa.limit.SortSet; import org.jmesa.view.component.Row; import org.jmesa.view.editor.CellEditor; import org.jmesa.view.editor.DateCellEditor; import org.jmesa.view.html.editor.DroplistFilterEditor; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Collection; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.ResourceBundle; import javax.servlet.http.HttpServletResponse; public class StudyAuditLogTableFactory extends AbstractTableFactory { private AuditUserLoginDao auditUserLoginDao; private StudySubjectDAO studySubjectDao; private UserAccountDAO userAccountDao; private SubjectDAO subjectDao; private StudyBean currentStudy; private ResourceBundle resword; private ResourceBundle resformat; @Override protected String getTableName() { return "studyAuditLogs"; } @Override protected void configureColumns(TableFacade tableFacade, Locale locale) { tableFacade.setColumnProperties("studySubject.label", "studySubject.secondaryLabel", "studySubject.oid", "subject.dateOfBirth", "subject.uniqueIdentifier", "studySubject.owner", "studySubject.status", "actions"); Row row = tableFacade.getTable().getRow(); configureColumn(row.getColumn("studySubject.label"), resword.getString("study_subject_ID"), null, null); configureColumn(row.getColumn("studySubject.secondaryLabel"), resword.getString("secondary_subject_ID"), null, null); configureColumn(row.getColumn("studySubject.oid"), resword.getString("study_subject_oid"), null, null); configureColumn(row.getColumn("subject.dateOfBirth"), resword.getString("date_of_birth"), new DateCellEditor(getDateFormat()), null); configureColumn(row.getColumn("subject.uniqueIdentifier"), resword.getString("person_ID"), null, null); configureColumn(row.getColumn("studySubject.owner"), resword.getString("created_by"), new OwnerCellEditor(), null, true, false); configureColumn(row.getColumn("studySubject.status"), resword.getString("status"), new StatusCellEditor(), new StatusDroplistFilterEditor()); String actionsHeader = resword.getString("actions") + "           "; configureColumn(row.getColumn("actions"), actionsHeader, new ActionsCellEditor(), new DefaultActionsEditor(locale), true, false); } @Override public void configureTableFacade(HttpServletResponse response, TableFacade tableFacade) { super.configureTableFacade(response, tableFacade); tableFacade.addFilterMatcher(new MatcherKey(Date.class, "subject.dateOfBirth"), new DateFilterMatcher(getDateFormat())); tableFacade.addFilterMatcher(new MatcherKey(Status.class, "studySubject.status"), new GenericFilterMatecher()); tableFacade.addFilterMatcher(new MatcherKey(UserAccountBean.class, "studySubject.owner"), new GenericFilterMatecher()); } @Override public void setDataAndLimitVariables(TableFacade tableFacade) { // initialize i18n resword = ResourceBundleProvider.getWordsBundle(getLocale()); resformat = ResourceBundleProvider.getFormatBundle(getLocale()); Limit limit = tableFacade.getLimit(); StudyAuditLogFilter auditLogStudyFilter = getAuditLogStudyFilter(limit); if (!limit.isComplete()) { int totalRows = getStudySubjectDao().getCountWithFilter(auditLogStudyFilter, getCurrentStudy()); tableFacade.setTotalRows(totalRows); } StudyAuditLogSort auditLogStudySort = getAuditLogStudySort(limit); /* * if (auditLogStudySort.getSorts().size() == 0) { * auditLogStudySort.addSort("loginAttemptDate", "desc"); } */ int rowStart = limit.getRowSelect().getRowStart(); int rowEnd = limit.getRowSelect().getRowEnd(); Collection<StudySubjectBean> items = getStudySubjectDao().getWithFilterAndSort(getCurrentStudy(), auditLogStudyFilter, auditLogStudySort, rowStart, rowEnd); Collection<HashMap<Object, Object>> theItems = new ArrayList<HashMap<Object, Object>>(); for (StudySubjectBean studySubjectBean : items) { SubjectBean subject = (SubjectBean) getSubjectDao().findByPK(studySubjectBean.getSubjectId()); UserAccountBean owner = (UserAccountBean) getUserAccountDao().findByPK(studySubjectBean.getOwnerId()); HashMap<Object, Object> h = new HashMap<Object, Object>(); h.put("studySubject", studySubjectBean); h.put("studySubject.label", studySubjectBean.getLabel()); h.put("studySubject.secondaryLabel", studySubjectBean.getSecondaryLabel()); h.put("studySubject.oid", studySubjectBean.getOid()); h.put("studySubject.owner", owner); h.put("studySubject.status", studySubjectBean.getStatus()); h.put("subject", subject); h.put("subject.dateOfBirth", resolveBirthDay(subject.getDateOfBirth(),subject.isDobCollected(),getLocale())); h.put("subject.uniqueIdentifier", subject.getUniqueIdentifier()); theItems.add(h); } tableFacade.setItems(theItems); } /** * A very custom way to filter the items. The AuditUserLoginFilter acts as a * command for the Hibernate criteria object. Take the Limit information and * filter the rows. * * @param limit * The Limit to use. */ protected StudyAuditLogFilter getAuditLogStudyFilter(Limit limit) { StudyAuditLogFilter auditLogStudyFilter = new StudyAuditLogFilter(getDateFormat()); FilterSet filterSet = limit.getFilterSet(); Collection<Filter> filters = filterSet.getFilters(); for (Filter filter : filters) { String property = filter.getProperty(); String value = filter.getValue(); if("studySubject.status".equalsIgnoreCase(property)) { value = Status.getByName(value).getId()+""; } auditLogStudyFilter.addFilter(property, value); } return auditLogStudyFilter; } /** * A very custom way to sort the items. The AuditUserLoginSort acts as a * command for the Hibernate criteria object. Take the Limit information and * sort the rows. * * @param limit * The Limit to use. */ protected StudyAuditLogSort getAuditLogStudySort(Limit limit) { StudyAuditLogSort auditLogStudySort = new StudyAuditLogSort(); SortSet sortSet = limit.getSortSet(); Collection<Sort> sorts = sortSet.getSorts(); for (Sort sort : sorts) { String property = sort.getProperty(); String order = sort.getOrder().toParam(); auditLogStudySort.addSort(property, order); } return auditLogStudySort; } public AuditUserLoginDao getAuditUserLoginDao() { return auditUserLoginDao; } public void setAuditUserLoginDao(AuditUserLoginDao auditUserLoginDao) { this.auditUserLoginDao = auditUserLoginDao; } private class StatusDroplistFilterEditor extends DroplistFilterEditor { @Override protected List<Option> getOptions() { List<Option> options = new ArrayList<Option>(); for (Object status : Status.toActiveArrayList()) { options.add(new Option(((Status) status).getName(), ((Status) status).getName())); } return options; } } private class GenericFilterMatecher implements FilterMatcher { public boolean evaluate(Object itemValue, String filterValue) { return true; } } private class StatusCellEditor implements CellEditor { @SuppressWarnings("unchecked") public Object getValue(Object item, String property, int rowcount) { String value = ""; Status status = (Status) ((HashMap<Object, Object>) item).get("studySubject.status"); if (status != null) { value = status.getName(); } return value; } } private class OwnerCellEditor implements CellEditor { @SuppressWarnings("unchecked") public Object getValue(Object item, String property, int rowcount) { String value = ""; UserAccountBean user = (UserAccountBean) ((HashMap<Object, Object>) item).get("studySubject.owner"); if (user != null) { value = user.getName(); } return value; } } private class ActionsCellEditor implements CellEditor { @SuppressWarnings("unchecked") public Object getValue(Object item, String property, int rowcount) { String value = ""; StudySubjectBean studySubjectBean = (StudySubjectBean) ((HashMap<Object, Object>) item).get("studySubject"); Integer studySubjectId = studySubjectBean.getId(); if (studySubjectBean != null) { StringBuilder url = new StringBuilder(); url .append("<a onmouseup=\"javascript:setImage('bt_View1','images/bt_View.gif');\" onmousedown=\"javascript:setImage('bt_View1','images/bt_View_d.gif');\" href=\"javascript:openDocWindow('ViewStudySubjectAuditLog?id="); url.append(studySubjectId); url.append("')\"><img hspace=\"6\" border=\"0\" align=\"left\" title=\"View\" alt=\"View\" src=\"images/bt_View.gif\" name=\"bt_View1\"/></a>"); value = url.toString(); } return value; } } private String formatDate(Date date) { String format = resformat.getString("date_format_string"); SimpleDateFormat sdf = new SimpleDateFormat(format); return sdf.format(date); } private String getDateFormat() { return resformat.getString("date_format_string"); } public StudySubjectDAO getStudySubjectDao() { return studySubjectDao; } public void setStudySubjectDao(StudySubjectDAO studySubjectDao) { this.studySubjectDao = studySubjectDao; } public SubjectDAO getSubjectDao() { return subjectDao; } public void setSubjectDao(SubjectDAO subjectDao) { this.subjectDao = subjectDao; } public StudyBean getCurrentStudy() { return currentStudy; } public void setCurrentStudy(StudyBean currentStudy) { this.currentStudy = currentStudy; } public UserAccountDAO getUserAccountDao() { return userAccountDao; } public void setUserAccountDao(UserAccountDAO userAccountDao) { this.userAccountDao = userAccountDao; } private String resolveBirthDay(Date birthDate, boolean isDobCollected, Locale locale) { if(birthDate == null) { return ""; }else { if(isDobCollected) { return I18nFormatUtil.getDateFormat(locale).format(birthDate); } else { Calendar c = Calendar.getInstance(locale); c.setTime(birthDate); return c.get(Calendar.YEAR)+""; } } } }