package org.akaza.openclinica.control.admin; 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.StudyDAO; import org.akaza.openclinica.dao.managestudy.StudySubjectDAO; import org.akaza.openclinica.dao.submit.ListSubjectFilter; import org.akaza.openclinica.dao.submit.ListSubjectSort; 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.HtmlBuilder; import org.jmesa.view.html.editor.DroplistFilterEditor; import java.text.SimpleDateFormat; import java.util.ArrayList; 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 ListSubjectTableFactory extends AbstractTableFactory { private AuditUserLoginDao auditUserLoginDao; private StudySubjectDAO studySubjectDao; private UserAccountDAO userAccountDao; private StudyDAO studyDao; private SubjectDAO subjectDao; private StudyBean currentStudy; private ResourceBundle resword; private ResourceBundle resformat; @Override protected String getTableName() { return "listSubjects"; } @Override protected void configureColumns(TableFacade tableFacade, Locale locale) { tableFacade.setColumnProperties("subject.uniqueIdentifier", "studySubjectIdAndStudy", "subject.gender", "subject.createdDate", "subject.owner", "subject.updatedDate", "subject.updater", "subject.status", "actions"); Row row = tableFacade.getTable().getRow(); configureColumn(row.getColumn("subject.uniqueIdentifier"), resword.getString("person_ID"), null, null); configureColumn(row.getColumn("studySubjectIdAndStudy"), resword.getString("Protocol_Study_subject_IDs"), null, null, true, false); configureColumn(row.getColumn("subject.gender"), resword.getString("gender"), null, null); configureColumn(row.getColumn("subject.createdDate"), resword.getString("date_created"), new DateCellEditor(getDateFormat()), null); configureColumn(row.getColumn("subject.owner"), resword.getString("owner"), new OwnerCellEditor(), null, true, false); configureColumn(row.getColumn("subject.updatedDate"), resword.getString("date_updated"), new DateCellEditor(getDateFormat()), null); configureColumn(row.getColumn("subject.updater"), resword.getString("last_updated_by"), new UpdaterCellEditor(), null, true, false); configureColumn(row.getColumn("subject.status"), resword.getString("status"), new StatusCellEditor(), new StatusDroplistFilterEditor()); configureColumn( row.getColumn("actions"), resword.getString("actions") // + // "                " + "                                 ", new ActionsCellEditor(), new DefaultActionsEditor(locale), true, false); // >> tbh #4003, 08/2009 } @Override public void configureTableFacade(HttpServletResponse response, TableFacade tableFacade) { super.configureTableFacade(response, tableFacade); tableFacade.addFilterMatcher(new MatcherKey(Date.class, "subject.createdDate"), new DateFilterMatcher(getDateFormat())); tableFacade.addFilterMatcher(new MatcherKey(Date.class, "subject.updatedDate"), new DateFilterMatcher(getDateFormat())); //tableFacade.addFilterMatcher(new MatcherKey(Status.class, "subject.status"), new GenericFilterMatecher()); tableFacade.addFilterMatcher(new MatcherKey(Status.class, "subject.status"), new StatusFilterMatecher()); tableFacade.addFilterMatcher(new MatcherKey(UserAccountBean.class, "subject.owner"), new GenericFilterMatecher()); tableFacade.addFilterMatcher(new MatcherKey(UserAccountBean.class, "subject.updater"), new GenericFilterMatecher()); } @SuppressWarnings("unchecked") @Override public void setDataAndLimitVariables(TableFacade tableFacade) { // initialize i18n resword = ResourceBundleProvider.getWordsBundle(getLocale()); resformat = ResourceBundleProvider.getFormatBundle(getLocale()); Limit limit = tableFacade.getLimit(); ListSubjectFilter listSubjectFilter = getListSubjectFilter(limit); if (!limit.isComplete()) { int totalRows = getSubjectDao().getCountWithFilter(listSubjectFilter, getCurrentStudy()); tableFacade.setTotalRows(totalRows); } ListSubjectSort listSubjectSort = getListSubjectSort(limit); int rowStart = limit.getRowSelect().getRowStart(); int rowEnd = limit.getRowSelect().getRowEnd(); Collection<SubjectBean> items = getSubjectDao().getWithFilterAndSort(getCurrentStudy(), listSubjectFilter, listSubjectSort, rowStart, rowEnd); Collection<HashMap<Object, Object>> theItems = new ArrayList<HashMap<Object, Object>>(); for (SubjectBean subject : items) { UserAccountBean owner = (UserAccountBean) getUserAccountDao().findByPK(subject.getOwnerId()); UserAccountBean updater = subject.getUpdaterId() == 0 ? null : (UserAccountBean) getUserAccountDao().findByPK(subject.getUpdaterId()); HashMap<Object, Object> h = new HashMap<Object, Object>(); String studySubjectIdAndStudy = ""; List<StudySubjectBean> studySubjects = getStudySubjectDao().findAllBySubjectId(subject.getId()); for (StudySubjectBean studySubjectBean : studySubjects) { StudyBean study = (StudyBean) getStudyDao().findByPK(studySubjectBean.getStudyId()); studySubjectIdAndStudy += studySubjectIdAndStudy.length() == 0 ? "" : ","; studySubjectIdAndStudy += study.getIdentifier() + "-" + studySubjectBean.getLabel(); } h.put("studySubjectIdAndStudy", studySubjectIdAndStudy); h.put("subject", subject); h.put("subject.uniqueIdentifier", subject.getUniqueIdentifier()); h.put("subject.gender", subject.getGender()); Date tempDate = subject.getCreatedDate(); String tempDateStr = tempDate == null ? "" : I18nFormatUtil.getDateFormat(getLocale()).format(tempDate); h.put("subject.createdDate", tempDateStr); h.put("subject.owner", owner); tempDate = subject.getUpdatedDate(); tempDateStr = tempDate == null ? "" : I18nFormatUtil.getDateFormat(getLocale()).format(tempDate); h.put("subject.updatedDate", tempDateStr); h.put("subject.updater", updater); h.put("subject.status", subject.getStatus()); 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 ListSubjectFilter getListSubjectFilter(Limit limit) { ListSubjectFilter listSubjectFilter = new ListSubjectFilter(getDateFormat()); FilterSet filterSet = limit.getFilterSet(); Collection<Filter> filters = filterSet.getFilters(); for (Filter filter : filters) { String property = filter.getProperty(); String value = filter.getValue(); listSubjectFilter.addFilter(property, value); } return listSubjectFilter; } /** * 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 ListSubjectSort getListSubjectSort(Limit limit) { ListSubjectSort listSubjectSort = new ListSubjectSort(); SortSet sortSet = limit.getSortSet(); Collection<Sort> sorts = sortSet.getSorts(); for (Sort sort : sorts) { String property = sort.getProperty(); String order = sort.getOrder().toParam(); listSubjectSort.addSort(property, order); } return listSubjectSort; } 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.toSubjectDropDownArrayList()) { //options.add(new Option(String.valueOf(((Status) status).getId()), ((Status) status).getName())); 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 StatusFilterMatecher implements FilterMatcher { public boolean evaluate(Object itemValue, String filterValue) { int itemStatusId = ((Status)itemValue).getId(); return itemStatusId == Status.getByName(filterValue).getId(); } } 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("subject.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("subject.owner"); if (user != null) { value = user.getName(); } return value; } } private class UpdaterCellEditor implements CellEditor { @SuppressWarnings("unchecked") public Object getValue(Object item, String property, int rowcount) { String value = ""; UserAccountBean user = (UserAccountBean) ((HashMap<Object, Object>) item).get("subject.updater"); 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 = ""; SubjectBean subjectBean = (SubjectBean) ((HashMap<Object, Object>) item).get("subject"); Integer subjectId = subjectBean.getId(); if (subjectBean != null) { value += viewSubjectLink(subjectId); if (subjectBean.getStatus() != Status.DELETED) { value += updateSubjectLink(subjectId); value += removeSubjectLink(subjectId); } else { value += restoreSubjectLink(subjectId); } } return value; } } private String updateSubjectLink(Integer subjectId) { HtmlBuilder builder = new HtmlBuilder(); builder.a().href("UpdateSubject?action=show&id=" + subjectId); builder.onmouseout("javascript:setImage('bt_Edit1','images/bt_Edit_d.gif');"); builder.onmouseover("javascript:setImage('bt_Edit1','images/bt_Edit.gif');"); builder.close(); builder.img().name("bt_Edit1").src("images/bt_Edit.gif").border("0").alt(resword.getString("edit")).title(resword.getString("edit")).align("left").append("hspace=\"6\"").close(); builder.aEnd(); return builder.toString(); } private String removeSubjectLink(Integer subjectId) { HtmlBuilder builder = new HtmlBuilder(); builder.a().href("RemoveSubject?action=confirm&id=" + subjectId); builder.onmouseout("javascript:setImage('bt_Remove1','images/bt_Remove_d.gif');"); builder.onmouseover("javascript:setImage('bt_Remove1','images/bt_Remove.gif');"); builder.close(); builder.img().name("bt_Remove1").src("images/bt_Remove.gif").border("0").alt(resword.getString("remove")).title(resword.getString("remove")).append("hspace=\"2\"").close(); builder.aEnd(); return builder.toString(); } private String viewSubjectLink(Integer subjectId) { HtmlBuilder builder = new HtmlBuilder(); builder.a().href("ViewSubject?action=show&id=" + subjectId); builder.onmouseout("javascript:setImage('bt_View1','images/bt_View_d.gif');"); builder.onmouseover("javascript:setImage('bt_View1','images/bt_View.gif');"); builder.close(); builder.img().name("bt_View1").src("images/bt_View.gif").border("0").alt(resword.getString("view")).title(resword.getString("view")).align("left").append("hspace=\"6\"").close(); builder.aEnd(); return builder.toString(); } private String restoreSubjectLink(Integer subjectId) { HtmlBuilder builder = new HtmlBuilder(); builder.a().href("RestoreSubject?action=confirm&id=" + subjectId); builder.onmouseout("javascript:setImage('bt_Restor3','images/bt_Restore_d.gif');"); builder.onmouseover("javascript:setImage('bt_Restore3','images/bt_Restore.gif');"); builder.close(); builder.img().name("bt_Restore3").src("images/bt_Restore.gif").border("0").alt(resword.getString("restore")).title(resword.getString("restore")).align("left").append("hspace=\"6\"").close(); builder.aEnd(); return builder.toString(); } 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 StudyDAO getStudyDao() { return studyDao; } public void setStudyDao(StudyDAO studyDao) { this.studyDao = studyDao; } 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; } }