package org.akaza.openclinica.control.managestudy; import org.akaza.openclinica.bean.admin.CRFBean; import org.akaza.openclinica.bean.core.DataEntryStage; import org.akaza.openclinica.bean.core.Role; import org.akaza.openclinica.bean.core.Status; import org.akaza.openclinica.bean.core.SubjectEventStatus; import org.akaza.openclinica.bean.login.StudyUserRoleBean; import org.akaza.openclinica.bean.login.UserAccountBean; import org.akaza.openclinica.bean.managestudy.EventDefinitionCRFBean; import org.akaza.openclinica.bean.managestudy.StudyBean; import org.akaza.openclinica.bean.managestudy.StudyEventBean; import org.akaza.openclinica.bean.managestudy.StudyEventDefinitionBean; import org.akaza.openclinica.bean.managestudy.StudyGroupBean; import org.akaza.openclinica.bean.managestudy.StudyGroupClassBean; import org.akaza.openclinica.bean.managestudy.StudySubjectBean; import org.akaza.openclinica.bean.submit.CRFVersionBean; import org.akaza.openclinica.bean.submit.EventCRFBean; import org.akaza.openclinica.bean.submit.SubjectBean; import org.akaza.openclinica.bean.submit.SubjectGroupMapBean; import org.akaza.openclinica.control.AbstractTableFactory; import org.akaza.openclinica.control.DefaultActionsEditor; import org.akaza.openclinica.dao.admin.CRFDAO; import org.akaza.openclinica.dao.managestudy.EventDefinitionCRFDAO; import org.akaza.openclinica.dao.managestudy.ListEventsForSubjectFilter; import org.akaza.openclinica.dao.managestudy.ListEventsForSubjectSort; import org.akaza.openclinica.dao.managestudy.StudyDAO; import org.akaza.openclinica.dao.managestudy.StudyEventDAO; import org.akaza.openclinica.dao.managestudy.StudyEventDefinitionDAO; import org.akaza.openclinica.dao.managestudy.StudyGroupClassDAO; import org.akaza.openclinica.dao.managestudy.StudyGroupDAO; import org.akaza.openclinica.dao.managestudy.StudySubjectDAO; import org.akaza.openclinica.dao.submit.CRFVersionDAO; import org.akaza.openclinica.dao.submit.EventCRFDAO; import org.akaza.openclinica.dao.submit.SubjectDAO; import org.akaza.openclinica.dao.submit.SubjectGroupMapDAO; import org.akaza.openclinica.i18n.util.ResourceBundleProvider; import org.apache.commons.lang.StringUtils; 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.BasicCellEditor; import org.jmesa.view.editor.CellEditor; 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 ListEventsForSubjectTableFactory extends AbstractTableFactory { private StudyEventDefinitionDAO studyEventDefinitionDao; private StudySubjectDAO studySubjectDAO; private SubjectDAO subjectDAO; private StudyEventDAO studyEventDAO; private StudyGroupClassDAO studyGroupClassDAO; private SubjectGroupMapDAO subjectGroupMapDAO; private StudyDAO studyDAO; private StudyGroupDAO studyGroupDAO; private EventCRFDAO eventCRFDAO; private EventDefinitionCRFDAO eventDefintionCRFDAO; private CRFDAO crfDAO; private CRFVersionDAO crfVersionDAO; public CRFVersionDAO getCrfVersionDAO() { return crfVersionDAO; } public void setCrfVersionDAO(CRFVersionDAO crfVersionDAO) { this.crfVersionDAO = crfVersionDAO; } private StudyBean studyBean; private String[] columnNames = new String[] {}; private ArrayList<StudyEventDefinitionBean> studyEventDefinitions; private ArrayList<CRFBean> crfBeans; private ArrayList<EventDefinitionCRFBean> eventDefinitionCrfs; private ArrayList<StudyGroupClassBean> studyGroupClasses; private StudyUserRoleBean currentRole; private UserAccountBean currentUser; private boolean showMoreLink; private ResourceBundle resword; private ResourceBundle resformat; private StudyEventDefinitionBean selectedStudyEventDefinition; final HashMap<Integer, String> imageIconPaths = new HashMap<Integer, String>(8); final HashMap<Integer, String> crfColumnImageIconPaths = new HashMap<Integer, String>(8); public ListEventsForSubjectTableFactory(boolean showMoreLink) { imageIconPaths.put(1, "images/icon_Scheduled.gif"); imageIconPaths.put(2, "images/icon_NotStarted.gif"); imageIconPaths.put(3, "images/icon_InitialDE.gif"); imageIconPaths.put(4, "images/icon_DEcomplete.gif"); imageIconPaths.put(5, "images/icon_Stopped.gif"); imageIconPaths.put(6, "images/icon_Skipped.gif"); imageIconPaths.put(7, "images/icon_Locked.gif"); imageIconPaths.put(8, "images/icon_Signed.gif"); crfColumnImageIconPaths.put(0, "images/CRF_status_icon_Invalid.gif"); crfColumnImageIconPaths.put(1, "images/CRF_status_icon_Scheduled.gif"); crfColumnImageIconPaths.put(2, "images/CRF_status_icon_Started.gif"); crfColumnImageIconPaths.put(3, "images/CRF_status_icon_InitialDEcomplete.gif"); crfColumnImageIconPaths.put(4, "images/CRF_status_icon_DDE.gif"); crfColumnImageIconPaths.put(5, "images/CRF_status_icon_Complete.gif"); crfColumnImageIconPaths.put(6, "images/CRF_status_icon_Complete.gif"); crfColumnImageIconPaths.put(7, "images/CRF_status_icon_Locked.gif"); this.showMoreLink = showMoreLink; } @Override protected String getTableName() { return "listEventsForSubject"; } @Override protected void configureColumns(TableFacade tableFacade, Locale locale) { resword = ResourceBundleProvider.getWordsBundle(locale); resformat = ResourceBundleProvider.getFormatBundle(locale); tableFacade.setColumnProperties(columnNames); Row row = tableFacade.getTable().getRow(); int index = 0; configureColumn(row.getColumn(columnNames[index]), resword.getString("study_subject_ID"), null, null); ++index; configureColumn(row.getColumn(columnNames[index]), resword.getString("subject_status"), new StatusCellEditor(), new StatusDroplistFilterEditor()); ++index; configureColumn(row.getColumn(columnNames[index]), resword.getString("site_id"), null, null); ++index; configureColumn(row.getColumn(columnNames[index]), resword.getString("gender"), null, null, true, false); ++index; // group class columns for (int i = index; i < index + studyGroupClasses.size(); i++) { StudyGroupClassBean studyGroupClass = studyGroupClasses.get(i - index); configureColumn(row.getColumn(columnNames[i]), studyGroupClass.getName(), new StudyGroupClassCellEditor(studyGroupClass), new SubjectGroupClassDroplistFilterEditor(studyGroupClass), true, false); } configureColumn(row.getColumn(columnNames[index + studyGroupClasses.size()]), resword.getString("event_status"), new EventStatusCellEditor(), new SubjectEventStatusDroplistFilterEditor(), true, false); ++index; configureColumn(row.getColumn(columnNames[index + studyGroupClasses.size()]), resword.getString("event_date"), new EventStartDateCellEditor(), null); ++index; // crf columns for (int i = index + studyGroupClasses.size(); i < columnNames.length - 1; i++) { CRFBean crfBean = crfBeans.get(i - (index + studyGroupClasses.size())); configureColumn(row.getColumn(columnNames[i]), crfBean.getName(), new EventCrfCellEditor(), new SubjectEventCRFStatusDroplistFilterEditor(), true, false); } String actionsHeader = resword.getString("rule_actions") + "               "; configureColumn(row.getColumn(columnNames[columnNames.length - 1]), actionsHeader, new ActionsCellEditor(), new DefaultActionsEditor(locale), true, false); } @Override public void configureTableFacade(HttpServletResponse response, TableFacade tableFacade) { super.configureTableFacade(response, tableFacade); getColumnNamesMap(); tableFacade.addFilterMatcher(new MatcherKey(Character.class), new CharFilterMatcher()); tableFacade.addFilterMatcher(new MatcherKey(Status.class), new StatusFilterMatcher()); tableFacade.addFilterMatcher(new MatcherKey(String.class, "event.status"), new SubjectEventStatusFilterMatcher()); // subject group class filter matcher for (int i = 4; i < 4 + studyGroupClasses.size(); i++) { tableFacade.addFilterMatcher(new MatcherKey(String.class, columnNames[i]), new SubjectGroupFilterMatcher()); } // crf columns filtering for (int i = 6 + studyGroupClasses.size(); i < columnNames.length - 1; i++) { tableFacade.addFilterMatcher(new MatcherKey(String.class, columnNames[i]), new SubjectEventCRFStatusFilterMatcher()); } } @Override public void configureTableFacadePostColumnConfiguration(TableFacade tableFacade) { Role r = currentRole.getRole(); boolean addSubjectLinkShow = studyBean.getStatus().isAvailable() && !r.equals(Role.MONITOR); tableFacade.setToolbar(new ListEventsForSubjectTableToolbar(getStudyEventDefinitions(), getStudyGroupClasses(), selectedStudyEventDefinition, addSubjectLinkShow, showMoreLink)); } @SuppressWarnings("unchecked") @Override public void setDataAndLimitVariables(TableFacade tableFacade) { Limit limit = tableFacade.getLimit(); ListEventsForSubjectFilter eventsForSubjectFilter = getListEventsForSubjectFilter(limit); if (!limit.isComplete()) { int totalRows = getStudySubjectDAO().getCountWithFilter(eventsForSubjectFilter, getStudyBean()); tableFacade.setTotalRows(totalRows); } ListEventsForSubjectSort eventsForSubjectSort = getListEventsForSubjectSort(limit); int rowStart = limit.getRowSelect().getRowStart(); int rowEnd = limit.getRowSelect().getRowEnd(); Collection<StudySubjectBean> items = getStudySubjectDAO().getWithFilterAndSort(getStudyBean(), eventsForSubjectFilter, eventsForSubjectSort, rowStart, rowEnd); Collection<HashMap<Object, Object>> theItems = new ArrayList<HashMap<Object, Object>>(); for (StudySubjectBean studySubjectBean : items) { HashMap<Object, Object> theItem = new HashMap<Object, Object>(); theItem.put("studySubject", studySubjectBean); theItem.put("studySubject.label", studySubjectBean.getLabel()); theItem.put("studySubject.status", studySubjectBean.getStatus()); theItem.put("enrolledAt", ((StudyBean) getStudyDAO().findByPK(studySubjectBean.getStudyId())).getIdentifier()); SubjectBean subjectBean = (SubjectBean) getSubjectDAO().findByPK(studySubjectBean.getSubjectId()); theItem.put("subject", subjectBean); theItem.put("subject.charGender", subjectBean.getGender()); //study group classes SubjectGroupMapBean subjectGroupMapBean = new SubjectGroupMapBean(); for (StudyGroupClassBean studyGroupClass : getStudyGroupClasses()) { subjectGroupMapBean = getSubjectGroupMapDAO().findAllByStudySubjectAndStudyGroupClass(studySubjectBean.getId(), studyGroupClass.getId()); if (null != subjectGroupMapBean) { theItem.put("sgc_" + studyGroupClass.getId(), subjectGroupMapBean.getStudyGroupId()); theItem.put("grpName_sgc_" + studyGroupClass.getId(), subjectGroupMapBean.getStudyGroupName()); } } subjectGroupMapBean = null; // Get EventCrfs for study Subject List<EventCRFBean> eventCrfs = getEventCRFDAO().findAllByStudySubject(studySubjectBean.getId()); HashMap<String, EventCRFBean> crfAsKeyEventCrfAsValue = new HashMap<String, EventCRFBean>(); for (EventCRFBean eventCRFBean : eventCrfs) { CRFBean crf = getCrfDAO().findByVersionId(eventCRFBean.getCRFVersionId()); crfAsKeyEventCrfAsValue.put(crf.getId() + "_" + eventCRFBean.getStudyEventId(), eventCRFBean); } // Get the event Status List<StudyEventBean> eventsForStudySubjectAndEventDefinitions = getStudyEventDAO().findAllByDefinitionAndSubject(selectedStudyEventDefinition, studySubjectBean); List<DisplayBean> events = new ArrayList<DisplayBean>(); // study event size < 1 if (eventsForStudySubjectAndEventDefinitions.size() < 1) { DisplayBean d = new DisplayBean(); d.getProps().put("event", null); d.getProps().put("event.status", SubjectEventStatus.NOT_SCHEDULED); d.getProps().put("studySubject.createdDate", null); for (int i = 0; i < getCrfs(selectedStudyEventDefinition).size(); i++) { CRFBean crf = getCrfs(selectedStudyEventDefinition).get(i); d.getProps().put("crf_" + crf.getId(), DataEntryStage.UNCOMPLETED); d.getProps().put("crf_" + crf.getId() + "_eventCrf", null); d.getProps().put("crf_" + crf.getId() + "_crf", crf); //d.getProps().put("crf_" + crf.getId() + "_eventDefinitionCrf", eventDefinitionCrfs.get(i)); d.getProps().put("crf_" + crf.getId() + "_eventDefinitionCrf", getEventDefinitionCRFBean(selectedStudyEventDefinition.getId(), crf, studySubjectBean)); theItem.put("crf_" + crf.getId(), ""); } events.add(d); } // study event size >0 for (StudyEventBean studyEventBean : eventsForStudySubjectAndEventDefinitions) { DisplayBean d = new DisplayBean(); d.getProps().put("event", studyEventBean); d.getProps().put("event.status", studyEventBean.getSubjectEventStatus()); d.getProps().put("studySubject.createdDate", studyEventBean.getDateStarted()); for (int i = 0; i < getCrfs(selectedStudyEventDefinition).size(); i++) { CRFBean crf = getCrfs(selectedStudyEventDefinition).get(i); EventCRFBean eventCRFBean = crfAsKeyEventCrfAsValue.get(crf.getId() + "_" + studyEventBean.getId()); if (eventCRFBean != null) { d.getProps().put("crf_" + crf.getId(), eventCRFBean.getStage()); d.getProps().put("crf_" + crf.getId() + "_eventCrf", eventCRFBean); } else { d.getProps().put("crf_" + crf.getId(), DataEntryStage.UNCOMPLETED); d.getProps().put("crf_" + crf.getId() + "_eventCrf", null); } d.getProps().put("crf_" + crf.getId() + "_crf", crf); //d.getProps().put("crf_" + crf.getId() + "_eventDefinitionCrf", eventDefinitionCrfs.get(i)); d.getProps().put("crf_" + crf.getId() + "_eventDefinitionCrf", getEventDefinitionCRFBean(selectedStudyEventDefinition.getId(), crf, studySubjectBean)); theItem.put("crf_" + crf.getId(), ""); } events.add(d); } theItem.put("events", events); theItem.put("event.status", ""); theItem.put("studySubject.createdDate", ""); theItem.put("webappContext", tableFacade.getWebContext().getContextPath()); theItems.add(theItem); } // Do not forget to set the items back on the tableFacade. tableFacade.setItems(theItems); } private EventDefinitionCRFBean getEventDefinitionCRFBean(Integer studyEventDefinitionId, CRFBean crfBean, StudySubjectBean studySubject) { EventDefinitionCRFBean eventDefinitionCrf = getEventDefintionCRFDAO().findByStudyEventDefinitionIdAndCRFIdAndStudyId(studyEventDefinitionId, crfBean.getId(), studySubject.getStudyId()); if (eventDefinitionCrf.getId() == 0) { eventDefinitionCrf = getEventDefintionCRFDAO().findForStudyByStudyEventDefinitionIdAndCRFId(studyEventDefinitionId, crfBean.getId()); } CRFVersionBean defaultVersion = (CRFVersionBean) getCrfVersionDAO().findByPK(eventDefinitionCrf.getDefaultVersionId()); eventDefinitionCrf.setDefaultCRF(defaultVersion); return eventDefinitionCrf; } private void getColumnNamesMap() { ArrayList<String> columnNamesList = new ArrayList<String>(); columnNamesList.add("studySubject.label"); columnNamesList.add("studySubject.status"); columnNamesList.add("enrolledAt"); columnNamesList.add("subject.charGender"); for (StudyGroupClassBean studyGroupClass : getStudyGroupClasses()) { columnNamesList.add("sgc_" + studyGroupClass.getId()); } columnNamesList.add("event.status"); columnNamesList.add("studySubject.createdDate"); for (CRFBean crfBean : getCrfs(selectedStudyEventDefinition)) { columnNamesList.add("crf_" + crfBean.getId()); } columnNamesList.add("actions"); columnNames = columnNamesList.toArray(columnNames); } protected ListEventsForSubjectFilter getListEventsForSubjectFilter(Limit limit) { ListEventsForSubjectFilter listEventsForSubjectFilter = new ListEventsForSubjectFilter(selectedStudyEventDefinition.getId()); 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()+""; } else if("event.status".equalsIgnoreCase(property)) { value = SubjectEventStatus.getByName(value).getId()+""; } else if(property.startsWith("sgc_")){ int studyGroupClassId = property.endsWith("_")? 0 : Integer.valueOf(property.split("_")[1]); value = studyGroupDAO.findByNameAndGroupClassID(value, studyGroupClassId).getId()+""; } else if(property.startsWith("crf_")) { value = DataEntryStage.getByName(value).getId()+""; } listEventsForSubjectFilter.addFilter(property, value); } return listEventsForSubjectFilter; } protected ListEventsForSubjectSort getListEventsForSubjectSort(Limit limit) { ListEventsForSubjectSort listEventsForSubjectSort = new ListEventsForSubjectSort(); SortSet sortSet = limit.getSortSet(); Collection<Sort> sorts = sortSet.getSorts(); for (Sort sort : sorts) { String property = sort.getProperty(); String order = sort.getOrder().toParam(); listEventsForSubjectSort.addSort(property, order); } return listEventsForSubjectSort; } @SuppressWarnings("unchecked") private ArrayList<StudyEventDefinitionBean> getStudyEventDefinitions() { if (this.studyEventDefinitions == null) { if (studyBean.getParentStudyId() > 0) { StudyBean parentStudy = (StudyBean) getStudyDAO().findByPK(studyBean.getParentStudyId()); studyEventDefinitions = getStudyEventDefinitionDao().findAllByStudy(parentStudy); } else { studyEventDefinitions = getStudyEventDefinitionDao().findAllByStudy(studyBean); } } return this.studyEventDefinitions; } @SuppressWarnings("unchecked") private ArrayList<CRFBean> getCrfs(StudyEventDefinitionBean eventDefinition) { if (this.crfBeans == null) { crfBeans = new ArrayList<CRFBean>(); eventDefinitionCrfs = new ArrayList<EventDefinitionCRFBean>(); for (EventDefinitionCRFBean eventDefinitionCrf : (List<EventDefinitionCRFBean>) getEventDefintionCRFDAO().findAllActiveByEventDefinitionId( eventDefinition.getId())) { CRFBean crfBean = (CRFBean) getCrfDAO().findByPK(eventDefinitionCrf.getCrfId()); ArrayList<CRFVersionBean> crfVersions = (ArrayList<CRFVersionBean>)getCrfVersionDAO().findAllByCRFId(eventDefinitionCrf.getCrfId()); crfBean.setVersions(crfVersions); if (eventDefinitionCrf.getParentId() == 0) { crfBeans.add(crfBean); eventDefinitionCrfs.add(eventDefinitionCrf); } } return crfBeans; } return crfBeans; } @SuppressWarnings("unchecked") private ArrayList<StudyGroupClassBean> getStudyGroupClasses() { if (this.studyGroupClasses == null) { if (studyBean.getParentStudyId() > 0) { StudyBean parentStudy = (StudyBean) getStudyDAO().findByPK(studyBean.getParentStudyId()); studyGroupClasses = getStudyGroupClassDAO().findAllActiveByStudy(parentStudy); } else { studyGroupClasses = getStudyGroupClassDAO().findAllActiveByStudy(studyBean); } } return studyGroupClasses; } public StudyEventDefinitionDAO getStudyEventDefinitionDao() { return studyEventDefinitionDao; } public void setStudyEventDefinitionDao(StudyEventDefinitionDAO studyEventDefinitionDao) { this.studyEventDefinitionDao = studyEventDefinitionDao; } public StudyBean getStudyBean() { return studyBean; } public void setStudyBean(StudyBean studyBean) { this.studyBean = studyBean; } 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 StudyEventDAO getStudyEventDAO() { return studyEventDAO; } public void setStudyEventDAO(StudyEventDAO studyEventDAO) { this.studyEventDAO = studyEventDAO; } public StudyGroupClassDAO getStudyGroupClassDAO() { return studyGroupClassDAO; } public void setStudyGroupClassDAO(StudyGroupClassDAO studyGroupClassDAO) { this.studyGroupClassDAO = studyGroupClassDAO; } public SubjectGroupMapDAO getSubjectGroupMapDAO() { return subjectGroupMapDAO; } public void setSubjectGroupMapDAO(SubjectGroupMapDAO subjectGroupMapDAO) { this.subjectGroupMapDAO = subjectGroupMapDAO; } public StudyDAO getStudyDAO() { return studyDAO; } public void setStudyDAO(StudyDAO studyDAO) { this.studyDAO = studyDAO; } public StudyGroupDAO getStudyGroupDAO() { return studyGroupDAO; } public void setStudyGroupDAO(StudyGroupDAO studyGroupDAO) { this.studyGroupDAO = studyGroupDAO; } public StudyUserRoleBean getCurrentRole() { return currentRole; } public void setCurrentRole(StudyUserRoleBean currentRole) { this.currentRole = currentRole; } public EventCRFDAO getEventCRFDAO() { return eventCRFDAO; } public void setEventCRFDAO(EventCRFDAO eventCRFDAO) { this.eventCRFDAO = eventCRFDAO; } public EventDefinitionCRFDAO getEventDefintionCRFDAO() { return eventDefintionCRFDAO; } public void setEventDefintionCRFDAO(EventDefinitionCRFDAO eventDefintionCRFDAO) { this.eventDefintionCRFDAO = eventDefintionCRFDAO; } public CRFDAO getCrfDAO() { return crfDAO; } public void setCrfDAO(CRFDAO crfDAO) { this.crfDAO = crfDAO; } public UserAccountBean getCurrentUser() { return currentUser; } public void setCurrentUser(UserAccountBean currentUser) { this.currentUser = currentUser; } public StudyEventDefinitionBean getSelectedStudyEventDefinition() { return selectedStudyEventDefinition; } public void setSelectedStudyEventDefinition(StudyEventDefinitionBean selectedStudyEventDefinition) { this.selectedStudyEventDefinition = selectedStudyEventDefinition; } private class CharFilterMatcher implements FilterMatcher { public boolean evaluate(Object itemValue, String filterValue) { String item = StringUtils.lowerCase(String.valueOf(itemValue)); String filter = StringUtils.lowerCase(String.valueOf(filterValue)); if (StringUtils.contains(item, filter)) { return true; } return false; } } public class StatusFilterMatcher implements FilterMatcher { public boolean evaluate(Object itemValue, String filterValue) { String item = StringUtils.lowerCase(((Status) itemValue).getName()); String filter = StringUtils.lowerCase(filterValue); if (filter.equals(item)) { return true; } return false; } } public class SubjectEventStatusFilterMatcher implements FilterMatcher { public boolean evaluate(Object itemValue, String filterValue) { // No need to evaluate itemValue and filterValue. return true; } } public class SubjectGroupFilterMatcher implements FilterMatcher { public boolean evaluate(Object itemValue, String filterValue) { String itemSGName = studyGroupDAO.findByPK(Integer.valueOf(itemValue.toString())).getName(); return filterValue.equalsIgnoreCase(itemSGName); } } public class SubjectEventCRFStatusFilterMatcher implements FilterMatcher { public boolean evaluate(Object itemValue, String filterValue) { // No need to evaluate itemValue and filterValue. return true; } } private class StatusCellEditor implements CellEditor { public Object getValue(Object item, String property, int rowcount) { StudySubjectBean studySubject = (StudySubjectBean) new BasicCellEditor().getValue(item, "studySubject", rowcount); return studySubject.getStatus().getName(); } } private class StatusDroplistFilterEditor extends DroplistFilterEditor { @Override protected List<Option> getOptions() { List<Option> options = new ArrayList<Option>(); for (Object status : Status.toDropDownArrayList()) { options.add(new Option(((Status) status).getName(), ((Status) status).getName())); } return options; } } private class SubjectEventStatusDroplistFilterEditor extends DroplistFilterEditor { @Override protected List<Option> getOptions() { List<Option> options = new ArrayList<Option>(); for (Object subjectEventStatus : SubjectEventStatus.toArrayList()) { options.add(new Option(((SubjectEventStatus) subjectEventStatus).getName(), ((SubjectEventStatus) subjectEventStatus).getName())); } return options; } } private class SubjectEventCRFStatusDroplistFilterEditor extends DroplistFilterEditor { @Override protected List<Option> getOptions() { List<Option> options = new ArrayList<Option>(); for (Object eventCRFStatus : DataEntryStage.toArrayList()) { if (((DataEntryStage) eventCRFStatus).getId() != 0) { options.add(new Option(((DataEntryStage) eventCRFStatus).getName(), ((DataEntryStage) eventCRFStatus).getName())); } } return options; } } private class SubjectGroupClassDroplistFilterEditor extends DroplistFilterEditor { private StudyGroupClassBean studyGroupClass = new StudyGroupClassBean(); // constructor SubjectGroupClassDroplistFilterEditor(StudyGroupClassBean studyGroupClass) { this.studyGroupClass = studyGroupClass; } @Override protected List<Option> getOptions() { List<Option> options = new ArrayList<Option>(); StudyGroupDAO studyGroupDAO = getStudyGroupDAO(); ArrayList<StudyGroupBean> groups = studyGroupDAO.findAllByGroupClass(this.studyGroupClass); for (Object subjectStudyGroup : groups) { options.add(new Option(((StudyGroupBean) subjectStudyGroup).getName(), ((StudyGroupBean) subjectStudyGroup).getName())); } return options; } } private class StudyGroupClassCellEditor implements CellEditor { StudyGroupClassBean studyGroupClass; String groupName; public StudyGroupClassCellEditor(StudyGroupClassBean studyGroupClass) { this.studyGroupClass = studyGroupClass; } private String logic() { return groupName != null ? groupName : ""; } public Object getValue(Object item, String property, int rowcount) { groupName = (String) ((HashMap<Object, Object>) item).get("grpName_sgc_" + studyGroupClass.getId()); return logic(); } } private class EventStatusCellEditor implements CellEditor { SubjectEventStatus subjectEventStatus; StudyEventBean studyEvent; StudySubjectBean studySubjectBean; List<DisplayBean> events; SubjectBean subject; StudyEventDefinitionBean studyEventDefinition; @SuppressWarnings("unchecked") public Object getValue(Object item, String property, int rowcount) { events = (List<DisplayBean>) ((HashMap<Object, Object>) item).get("events"); studySubjectBean = (StudySubjectBean) ((HashMap<Object, Object>) item).get("studySubject"); subject = (SubjectBean) ((HashMap<Object, Object>) item).get("subject"); studyEventDefinition = selectedStudyEventDefinition; List<StudyEventBean> studyEvents; StringBuilder url = new StringBuilder(); for (int i = 0; i < events.size(); i++) { DisplayBean display = events.get(i); subjectEventStatus = (SubjectEventStatus) display.getProps().get("event.status"); studyEvent = (StudyEventBean) display.getProps().get("event"); studyEvents = new ArrayList<StudyEventBean>(); if (studyEvent != null) { studyEvents.add(studyEvent); } url.append(eventDivBuilder(subject, Integer.valueOf(rowcount + String.valueOf(i)), studyEvents, studyEventDefinition, studySubjectBean)); url.append("<img src='" + imageIconPaths.get(subjectEventStatus.getId()) + "' border='0' style='position: relative; left: 7px;'>"); url.append("</a></td></tr></table>"); } return url.toString(); } } private class EventStartDateCellEditor implements CellEditor { Date eventStartDate; List<DisplayBean> events; @SuppressWarnings("unchecked") public Object getValue(Object item, String property, int rowcount) { events = (List<DisplayBean>) ((HashMap<Object, Object>) item).get("events"); StringBuilder url = new StringBuilder(); for (DisplayBean display : events) { eventStartDate = (Date) display.getProps().get("studySubject.createdDate"); url.append("<table border='0' cellpadding='0' cellspacing='0' ><tr valign='top' ><td>"); url.append(eventStartDate == null ? "" : formatDate(eventStartDate)); url.append("</td></tr></table>"); } return url.toString(); } } private class EventCrfCellEditor implements CellEditor { SubjectEventStatus subjectEventStatus; DataEntryStage dataEntryStage; StudyEventBean studyEvent; StudySubjectBean studySubjectBean; List<DisplayBean> events; SubjectBean subject; CRFBean crf; EventCRFBean eventCrf; EventDefinitionCRFBean eventDefintionCrf; StudyEventDefinitionBean studyEventDefinition; @SuppressWarnings("unchecked") public Object getValue(Object item, String property, int rowcount) { events = (List<DisplayBean>) ((HashMap<Object, Object>) item).get("events"); studySubjectBean = (StudySubjectBean) ((HashMap<Object, Object>) item).get("studySubject"); subject = (SubjectBean) ((HashMap<Object, Object>) item).get("subject"); studyEventDefinition = selectedStudyEventDefinition; List<StudyEventBean> studyEvents; String path = (String)((HashMap<Object, Object>) item).get("webappContext"); StringBuilder url = new StringBuilder(); for (int i = 0; i < events.size(); i++) { DisplayBean display = events.get(i); dataEntryStage = (DataEntryStage) display.getProps().get(property); crf = (CRFBean) display.getProps().get(property + "_crf"); eventDefintionCrf = (EventDefinitionCRFBean) display.getProps().get(property + "_eventDefinitionCrf"); eventCrf = (EventCRFBean) display.getProps().get(property + "_eventCrf"); subjectEventStatus = (SubjectEventStatus) display.getProps().get("event.status"); studyEvent = (StudyEventBean) display.getProps().get("event"); studyEvents = new ArrayList<StudyEventBean>(); if (studyEvent != null) { studyEvents.add(studyEvent); } EventCrfLayerBuilder eventCrfLayerBuilder = new EventCrfLayerBuilder(subject, Integer.valueOf(rowcount + String.valueOf(i)), studyEvents, dataEntryStage, eventCrf, studySubjectBean, studyBean, currentRole, currentUser, eventDefintionCrf, crf,studyEventDefinition,path); url.append(eventCrfLayerBuilder.buid()); url.append("<img src='" + crfColumnImageIconPaths.get(dataEntryStage.getId()) + "' border='0'>"); url.append("</a></td></tr></table>"); } return url.toString(); } } 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 (studySubjectId != null) { StringBuilder url = new StringBuilder(); url.append(viewStudySubjectLinkBuilder(studySubjectBean)); if (getCurrentRole().getRole() != Role.MONITOR) { if (getStudyBean().getStatus() == Status.AVAILABLE && studySubjectBean.getStatus() != Status.DELETED) { url.append(removeStudySubjectLinkBuilder(studySubjectBean)); } if (getStudyBean().getStatus() == Status.AVAILABLE && studySubjectBean.getStatus() == Status.DELETED) { url.append(restoreStudySubjectLinkBuilder(studySubjectBean)); } if (getStudyBean().getStatus() == Status.AVAILABLE && studySubjectBean.getStatus() == Status.AVAILABLE) { if (currentRole.getRole() != Role.INVESTIGATOR && currentRole.getRole() != Role.RESEARCHASSISTANT && currentRole.getRole() != Role.RESEARCHASSISTANT2 ) { url.append(reAssignStudySubjectLinkBuilder(studySubjectBean)); } } } value = url.toString(); } return value; } } class DisplayBean { HashMap<String, Object> props = new HashMap<String, Object>(); public HashMap<String, Object> getProps() { return props; } public void setProps(HashMap<String, Object> props) { this.props = props; } } private String viewStudySubjectLinkBuilder(StudySubjectBean studySubject) { HtmlBuilder actionLink = new HtmlBuilder(); actionLink.a().href("ViewStudySubject?id=" + studySubject.getId()); actionLink.append("onMouseDown=\"javascript:setImage('bt_View1','images/bt_View_d.gif');\""); actionLink.append("onMouseUp=\"javascript:setImage('bt_View1','images/bt_View.gif');\"").close(); actionLink.img().name("bt_View1").src("images/bt_View.gif").border("0").alt(resword.getString("view")).title(resword.getString("view")).append("hspace=\"2\"").end().aEnd(); actionLink.append("   "); return actionLink.toString(); } private String removeStudySubjectLinkBuilder(StudySubjectBean studySubject) { HtmlBuilder actionLink = new HtmlBuilder(); actionLink.a().href( "RemoveStudySubject?action=confirm&id=" + studySubject.getId() + "&subjectId=" + studySubject.getSubjectId() + "&studyId=" + studySubject.getStudyId()); actionLink.append("onMouseDown=\"javascript:setImage('bt_Remove1','images/bt_Remove_d.gif');\""); actionLink.append("onMouseUp=\"javascript:setImage('bt_Remove1','images/bt_Remove.gif');\"").close(); actionLink.img().name("bt_Remove1").src("images/bt_Remove.gif").border("0").alt(resword.getString("remove")).title(resword.getString("remove")).append("hspace=\"2\"").end().aEnd(); actionLink.append("   "); return actionLink.toString(); } private String reAssignStudySubjectLinkBuilder(StudySubjectBean studySubject) { HtmlBuilder actionLink = new HtmlBuilder(); actionLink.a().href("ReassignStudySubject?id=" + studySubject.getId()); actionLink.append("onMouseDown=\"javascript:setImage('bt_Reassign1','images/bt_Reassign_d.gif');\""); actionLink.append("onMouseUp=\"javascript:setImage('bt_Reassign1','images/bt_Reassign.gif');\"").close(); actionLink.img().name("bt_Reassign1").src("images/bt_Reassign.gif").border("0").alt(resword.getString("reassign")).title(resword.getString("reassign")).append("hspace=\"2\"").end().aEnd(); actionLink.append("   "); return actionLink.toString(); } private String restoreStudySubjectLinkBuilder(StudySubjectBean studySubject) { HtmlBuilder actionLink = new HtmlBuilder(); actionLink.a().href( "RestoreStudySubject?action=confirm&id=" + studySubject.getId() + "&subjectId=" + studySubject.getSubjectId() + "&studyId=" + studySubject.getStudyId()); actionLink.append("onMouseDown=\"javascript:setImage('bt_Restor3','images/bt_Restore_d.gif');\""); actionLink.append("onMouseUp=\"javascript:setImage('bt_Restor3','images/bt_Restore_d.gif');\"").close(); actionLink.img().name("bt_Restore1").src("images/bt_Restore.gif").border("0").alt(resword.getString("restore")).title(resword.getString("restore")).append("hspace=\"2\"").end().aEnd(); return actionLink.toString(); } private String eventDivBuilder(SubjectBean subject, Integer rowCount, List<StudyEventBean> studyEvents, StudyEventDefinitionBean sed, StudySubjectBean studySubject) { String studySubjectLabel = studySubject.getLabel(); String divWidth = studyEvents.size() >= 3 ? "540" : studyEvents.size() == 2 ? "360" : "180"; HtmlBuilder eventDiv = new HtmlBuilder(); eventDiv.table(0).border("0").cellpadding("0").cellspacing("0").close(); // Lock Div eventDiv.div().id("S_Lock_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount).style( "position: absolute; visibility: hidden; z-index: 3; width: 50px; height: 30px; top: 0px;").close(); lockLinkBuilder(eventDiv, studySubjectLabel, rowCount, studyEvents, sed); eventDiv.divEnd(); eventDiv.tr(0).valign("top").close().td(0).close(); // Event Div eventDiv.div().id("S_Event_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount).style( "position: absolute; visibility: hidden; z-index: 3;width:" + divWidth + "px; top: 0px; float: left;").close(); eventDiv.div().styleClass("box_T").close().div().styleClass("box_L").close().div().styleClass("box_R").close().div().styleClass("box_B").close().div() .styleClass("box_TL").close().div().styleClass("box_TR").close().div().styleClass("box_BL").close().div().styleClass("box_BR").close(); eventDiv.div().styleClass("tablebox_center").close(); eventDiv.div().styleClass("ViewSubjectsPopup").style("color: rgb(91, 91, 91);").close(); eventDiv.table(0).border("0").cellpadding("0").cellspacing("0").close(); eventDiv.tr(0).valign("top").close(); singleEventDivBuilder(eventDiv, subject, rowCount, studyEvents, sed, studySubject); return eventDiv.toString(); } private void singleEventDivBuilder(HtmlBuilder eventDiv, SubjectBean subject, Integer rowCount, List<StudyEventBean> studyEvents, StudyEventDefinitionBean sed, StudySubjectBean studySubject) { String tableHeaderRowLeftStyleClass = "table_header_row_left"; String click_for_more_options = resword.getString("click_for_more_options"); String schedule = resword.getString("schedule"); String view = resword.getString("view")+"/"+resword.getString("enter_data"); String edit = resword.getString("edit");; String remove = resword.getString("remove");; String subjectText = resword.getString("subject");; String eventText = resword.getString("event");; SubjectEventStatus eventStatus = studyEvents.size() == 0 ? SubjectEventStatus.NOT_SCHEDULED : studyEvents.get(0).getSubjectEventStatus(); // String studyEventName = studyEvents.size() == 0 ? "" : studyEvents.get(0).getName(); String studyEventId = studyEvents.size() == 0 ? "" : String.valueOf(studyEvents.get(0).getId()); Status eventSysStatus = studySubject.getStatus(); String studySubjectLabel = studySubject.getLabel(); eventDiv.td(0).styleClass(tableHeaderRowLeftStyleClass).close(); eventDiv.append(subjectText).append(": ").append(studySubjectLabel).br(); eventDiv.append(eventText).append(": ").append(sed.getName()).br(); eventDiv.append(resword.getString("status")).append(":").append(eventStatus.getName()).br(); eventDiv.tdEnd(); eventDiv.td(0).styleClass(tableHeaderRowLeftStyleClass).align("right").close(); linkBuilder(eventDiv, studySubjectLabel, rowCount, studyEvents, sed); eventDiv.tdEnd(); eventDiv.trEnd(0); eventDiv.tr(0).id("S_Menu_off_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount).style("display: all").close(); eventDiv.td(0).styleClass("table_cell_left").colspan("2").close().append("<i>").append(click_for_more_options).append("</i>").tdEnd(); eventDiv.trEnd(0); eventDiv.tr(0).id("S_Menu_on_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount).style("display: none").close(); eventDiv.td(0).colspan("2").close(); eventDiv.table(0).border("0").cellpadding("0").cellspacing("0").width("100%").close(); if (eventSysStatus.getId() == Status.AVAILABLE.getId() || eventSysStatus == Status.SIGNED) { if (eventStatus == SubjectEventStatus.NOT_SCHEDULED && currentRole.getRole() != Role.MONITOR && !studyBean.getStatus().isFrozen()) { eventDiv.tr(0).valign("top").close(); eventDiv.td(0).styleClass("table_cell_left").close(); createNewStudyEventLinkBuilder(eventDiv, studySubject.getId(), sed, schedule); eventDiv.tdEnd().trEnd(0); } else if (eventStatus == SubjectEventStatus.COMPLETED) { eventDiv.tr(0).valign("top").close(); eventDiv.td(0).styleClass("table_cell_left").close(); enterDataForStudyEventLinkBuilder(eventDiv, studyEventId, view); eventDiv.tdEnd().trEnd(0); if ((currentRole.getRole() == Role.STUDYDIRECTOR || currentUser.isSysAdmin()) && studyBean.getStatus() == Status.AVAILABLE) { eventDiv.tr(0).valign("top").close(); eventDiv.td(0).styleClass("table_cell_left").close(); updateStudyEventLinkBuilder(eventDiv, studySubject.getId(), studyEventId, edit); eventDiv.tdEnd().trEnd(0); eventDiv.tr(0).valign("top").close(); eventDiv.td(0).styleClass("table_cell_left").close(); removeStudyEventLinkBuilder(eventDiv, studySubject.getId(), studyEventId, remove); eventDiv.tdEnd().trEnd(0); } } else if (eventStatus == SubjectEventStatus.LOCKED) { eventDiv.tdEnd().trEnd(0); if (currentRole.getRole() == Role.STUDYDIRECTOR || currentUser.isSysAdmin()) { eventDiv.tr(0).valign("top").close(); eventDiv.td(0).styleClass("table_cell_left").close(); enterDataForStudyEventLinkBuilder(eventDiv, studyEventId, view); eventDiv.tdEnd().trEnd(0); if (studyBean.getStatus() == Status.AVAILABLE) { eventDiv.tr(0).valign("top").close(); eventDiv.td(0).styleClass("table_cell_left").close(); removeStudyEventLinkBuilder(eventDiv, studySubject.getId(), studyEventId, remove); eventDiv.tdEnd().trEnd(0); } } } else { eventDiv.tr(0).valign("top").close(); eventDiv.td(0).styleClass("table_cell_left").close(); enterDataForStudyEventLinkBuilder(eventDiv, studyEventId, view); eventDiv.tdEnd().trEnd(0); if ((currentRole.getRole() == Role.STUDYDIRECTOR || currentUser.isSysAdmin()) && studyBean.getStatus() == Status.AVAILABLE) { eventDiv.tr(0).valign("top").close(); eventDiv.td(0).styleClass("table_cell_left").close(); updateStudyEventLinkBuilder(eventDiv, studySubject.getId(), studyEventId, edit); eventDiv.tdEnd().trEnd(0); eventDiv.tr(0).valign("top").close(); eventDiv.td(0).styleClass("table_cell_left").close(); removeStudyEventLinkBuilder(eventDiv, studySubject.getId(), studyEventId, remove); eventDiv.tdEnd().trEnd(0); } } } if (eventSysStatus == Status.DELETED || eventSysStatus == Status.AUTO_DELETED) { eventDiv.tr(0).valign("top").close(); eventDiv.td(0).styleClass("table_cell_left").close(); enterDataForStudyEventLinkBuilder(eventDiv, studyEventId, view); eventDiv.tdEnd().trEnd(0); } eventDiv.tableEnd(0).tdEnd().trEnd(0); eventDiv.tableEnd(0); eventDiv.divEnd().divEnd().divEnd().divEnd().divEnd().divEnd().divEnd().divEnd().divEnd().divEnd().divEnd(); iconLinkBuilder(eventDiv, studySubjectLabel, rowCount, studyEvents, sed); } private void updateStudyEventLinkBuilder(HtmlBuilder builder, Integer studySubjectId, String studyEventId, String edit) { String href1 = "UpdateStudyEvent?event_id=" + studyEventId + "&ss_id=" + studySubjectId; builder.a().href(href1); builder.close(); builder.img().src("images/bt_Edit.gif").border("0").align("left").close().aEnd(); builder.nbsp().nbsp().a().href(href1); builder.close().append(edit).aEnd(); } private void removeStudyEventLinkBuilder(HtmlBuilder builder, Integer studySubjectId, String studyEventId, String remove) { String href1 = "RemoveStudyEvent?action=confirm&id=" + studyEventId + "&studySubId=" + studySubjectId; builder.a().href(href1); builder.close(); builder.img().src("images/bt_Remove.gif").border("0").align("left").close().aEnd(); builder.nbsp().nbsp().a().href(href1); builder.close().append(remove).aEnd(); } private void createNewStudyEventLinkBuilder(HtmlBuilder builder, Integer studySubjectId, StudyEventDefinitionBean sed, String schedule) { String href1 = "CreateNewStudyEvent?studySubjectId=" + studySubjectId + "&studyEventDefinition=" + sed.getId(); builder.a().href(href1); builder.close(); builder.img().src("images/bt_Schedule.gif").border("0").align("left").close().aEnd(); builder.nbsp().nbsp().a().href(href1); builder.close().append(schedule).aEnd(); } private void enterDataForStudyEventLinkBuilder(HtmlBuilder builder, String studyEventId, String view) { String href1 = "EnterDataForStudyEvent?eventId=" + studyEventId; builder.a().href(href1); builder.close(); builder.img().src("images/bt_View.gif").border("0").align("left").close().aEnd(); builder.nbsp().nbsp().a().href(href1); builder.close().append(view).aEnd(); } private void lockLinkBuilder(HtmlBuilder builder, String studySubjectLabel, Integer rowCount, List<StudyEventBean> studyEvents, StudyEventDefinitionBean sed) { String href1 = "javascript:leftnavExpand('S_Menu_on_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "'); "; String href2 = "javascript:leftnavExpand('S_Menu_off_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "'); "; String onmouseover = "layersShowOrHide('visible','S_Event_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "'); "; onmouseover += "javascript:setImage('ExpandIcon_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "','images/icon_collapse.gif');"; String onClick1 = "layersShowOrHide('hidden','Lock_all'); "; String onClick2 = "layersShowOrHide('hidden','S_Event_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "'); "; String onClick3 = "layersShowOrHide('hidden','S_Lock_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "'); "; String onClick4 = "javascript:setImage('ExpandIcon_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "','images/icon_blank.gif'); "; builder.a().href(href1 + href2); builder.onmouseover(onmouseover); builder.onclick(onClick1 + onClick2 + onClick3 + onClick4); builder.close(); builder.img().src("images/spacer.gif").border("0").append("height=\"30\"").width("50").close().aEnd(); } private void iconLinkBuilder(HtmlBuilder builder, String studySubjectLabel, Integer rowCount, List<StudyEventBean> studyEvents, StudyEventDefinitionBean sed) { String href1Repeating = "javascript:ExpandEventOccurrences('" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "'," + studyEvents.size() + "); "; String href1 = "javascript:leftnavExpand('S_Menu_on_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "'); "; String href2 = "javascript:leftnavExpand('S_Menu_off_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "'); "; String onmouseover = "moveObject('S_Event_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "', event); "; onmouseover += "setImage('ExpandIcon_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "','images/icon_expand.gif');"; String onmouseout = "layersShowOrHide('hidden','S_Event_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "'); "; onmouseout += "setImage('ExpandIcon_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "','images/icon_blank.gif');"; String onClick1 = "layersShowOrHide('visible','Lock_all'); "; String onClick2 = "LockObject('S_Lock_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "',event); "; String href = studyEvents.size() > 1 ? href1Repeating + href2 : href1 + href2; builder.a().href(href); builder.onmouseover(onmouseover); builder.onmouseout(onmouseout); builder.onclick(onClick1 + onClick2); builder.close(); } private void linkBuilder(HtmlBuilder builder, String studySubjectLabel, Integer rowCount, List<StudyEventBean> studyEvents, StudyEventDefinitionBean sed) { String href1 = "javascript:leftnavExpand('S_Menu_on_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "'); "; String href2 = "javascript:leftnavExpand('S_Menu_off_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "'); "; String onClick1 = "layersShowOrHide('hidden','Lock_all'); "; String onClick2 = "layersShowOrHide('hidden','S_Event_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "'); "; String onClick3 = "layersShowOrHide('hidden','S_Lock_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "'); "; String onClick4 = "javascript:setImage('ExpandIcon_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "','images/icon_blank.gif'); "; builder.a().href(href1 + href2); builder.onclick(onClick1 + onClick2 + onClick3 + onClick4); builder.close().append("X").aEnd(); } private String formatDate(Date date) { String format = resformat.getString("date_format_string"); SimpleDateFormat sdf = new SimpleDateFormat(format); return sdf.format(date); } }