/* * GNU Lesser General Public License (GNU LGPL). * For details see: http://www.openclinica.org/license * copyright 2003-2011 Akaza Research */ package org.akaza.openclinica.control.admin; import static org.jmesa.facade.TableFacadeFactory.createTableFacade; import org.akaza.openclinica.bean.admin.CRFBean; import org.akaza.openclinica.bean.core.Role; import org.akaza.openclinica.bean.managestudy.StudyBean; import org.akaza.openclinica.bean.submit.CRFVersionBean; import org.akaza.openclinica.control.SpringServletAccess; import org.akaza.openclinica.control.core.SecureController; import org.akaza.openclinica.control.form.FormProcessor; import org.akaza.openclinica.core.util.ItemGroupCrvVersionUtil; import org.akaza.openclinica.dao.admin.CRFDAO; import org.akaza.openclinica.dao.managestudy.StudyDAO; import org.akaza.openclinica.dao.submit.CRFVersionDAO; import org.akaza.openclinica.dao.submit.ItemDAO; import org.akaza.openclinica.domain.rule.RuleSetBean; import org.akaza.openclinica.domain.rule.RuleSetRuleBean; import org.akaza.openclinica.domain.rule.action.RuleActionBean; import org.akaza.openclinica.service.rule.RuleSetServiceInterface; import org.akaza.openclinica.view.Page; import org.akaza.openclinica.web.InsufficientPermissionException; import org.akaza.openclinica.web.table.sdv.SDVUtil; import org.jmesa.facade.TableFacade; import org.jmesa.view.component.Column; import org.jmesa.view.component.Row; import org.jmesa.view.component.Table; import org.jmesa.view.editor.BasicCellEditor; import org.jmesa.view.editor.CellEditor; import org.jmesa.view.html.HtmlBuilder; import org.jmesa.view.html.component.HtmlColumn; import org.jmesa.view.html.component.HtmlRow; import org.jmesa.view.html.component.HtmlTable; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.List; /** * @author jxu * * TODO To change the template for this generated type comment go to Window - * Preferences - Java - Code Style - Code Templates */ public class ViewCRFServlet extends SecureController { private static String CRF_ID = "crfId"; private static String CRF = "crf"; private RuleSetServiceInterface ruleSetService; /** * */ @Override public void mayProceed() throws InsufficientPermissionException { if (ub.isSysAdmin()) { return; } if (currentRole.getRole().equals(Role.STUDYDIRECTOR) || currentRole.getRole().equals(Role.COORDINATOR)) { return; } addPageMessage(respage.getString("no_have_correct_privilege_current_study") + respage.getString("change_study_contact_sysadmin")); throw new InsufficientPermissionException(Page.MENU_SERVLET, resexception.getString("not_study_director"), "1"); } @Override public void processRequest() throws Exception { resetPanel(); panel.setStudyInfoShown(false); panel.setOrderedData(true); panel.setSubmitDataModule(false); panel.setExtractData(false); panel.setCreateDataset(false); setToPanel(resword.getString("create_CRF"), respage.getString("br_create_new_CRF_entering")); setToPanel(resword.getString("create_CRF_version"), respage.getString("br_create_new_CRF_uploading")); setToPanel(resword.getString("revise_CRF_version"), respage.getString("br_if_you_owner_CRF_version")); setToPanel(resword.getString("CRF_spreadsheet_template"), respage.getString("br_download_blank_CRF_spreadsheet_from")); setToPanel(resword.getString("example_CRF_br_spreadsheets"), respage.getString("br_download_example_CRF_instructions_from")); FormProcessor fp = new FormProcessor(request); // checks which module the requests are from, manage or admin String module = fp.getString(MODULE); request.setAttribute(MODULE, module); int crfId = fp.getInt(CRF_ID); List<StudyBean> studyBeans = null; if (crfId == 0) { addPageMessage(respage.getString("please_choose_a_CRF_to_view")); forwardPage(Page.CRF_LIST); } else { CRFDAO cdao = new CRFDAO(sm.getDataSource()); CRFVersionDAO vdao = new CRFVersionDAO(sm.getDataSource()); CRFBean crf = (CRFBean) cdao.findByPK(crfId); request.setAttribute("crfName", crf.getName()); ArrayList<CRFVersionBean> versions = (ArrayList<CRFVersionBean>) vdao.findAllByCRF(crfId); crf.setVersions(versions); ArrayList< ItemGroupCrvVersionUtil> items_verified = verifyUniqueItemPlacementInGroups( crf.getName()); request.setAttribute("items", items_verified); if ("admin".equalsIgnoreCase(module)) { //BWP 3279: generate a table showing a list of studies associated with the CRF>> StudyDAO studyDAO = new StudyDAO(sm.getDataSource()); studyBeans = findStudiesForCRFId(crfId, studyDAO); //Create the Jmesa table for the studies associated with the CRF String studyHtml = renderStudiesTable(studyBeans); request.setAttribute("studiesTableHTML", studyHtml); //>> } Collection<TableColumnHolder> items = populate(crf, versions); request.setAttribute(CRF, crf); forwardPage(Page.VIEW_CRF); } } private ArrayList< ItemGroupCrvVersionUtil> verifyUniqueItemPlacementInGroups( String crfName){ //get all items with group / version info from db ItemDAO idao = new ItemDAO(sm.getDataSource()); int check_group_count = 0; StringBuffer item_messages = null; String temp_buffer=null; //use for first record in the group ArrayList< ItemGroupCrvVersionUtil> results = new ArrayList< ItemGroupCrvVersionUtil>(); ItemGroupCrvVersionUtil cur_item = null; StringBuffer error_message = null; ArrayList<ItemGroupCrvVersionUtil> item_group_crf_records= idao.findAllWithItemDetailsGroupCRFVersionMetadataByCRFId( crfName) ; for ( ItemGroupCrvVersionUtil check_group : item_group_crf_records){ if (results.size() == 0 || !check_group.getItemName().equals(cur_item.getItemName()) ){ //delete ',' from versions property cur_item = new ItemGroupCrvVersionUtil(check_group.getItemName(),check_group.getGroupName(), check_group.getGroupOID() , check_group.getCrfVersionName() , check_group.getCrfVersionStatus(), check_group.getItemOID(), check_group.getItemDescription(), check_group.getItemDataType(),check_group.getId()); cur_item.setVersions( check_group.getCrfVersionName()); temp_buffer=respage.getString("verifyUniqueItemPlacementInGroups_4") + check_group.getGroupName() + respage.getString("verifyUniqueItemPlacementInGroups_5")+check_group.getCrfVersionName()+"'"; results.add(cur_item); }else { if ( check_group.getItemName().equals(cur_item.getItemName()) && ! check_group.getGroupName().equals(cur_item.getGroupName())){ // add message for the first item error_message = new StringBuffer(); error_message.append(respage.getString("verifyUniqueItemPlacementInGroups_4") + check_group.getGroupName() ); error_message.append( respage.getString("verifyUniqueItemPlacementInGroups_5")); error_message.append( check_group.getCrfVersionName()); // if ( temp_buffer != null){cur_item.setErrorMesages(cur_item.getErrorMesages() + temp_buffer);} if ( temp_buffer != null){cur_item.getArrErrorMesages().add( temp_buffer);} temp_buffer=null; cur_item.getArrErrorMesages().add( error_message); if (check_group.getCrfVersionStatus() == 1 && cur_item.getCrfVersionStatus()!= 1){ cur_item.setCrfVersionStatus(1); } } cur_item.setVersions(cur_item.getVersions()+","+check_group.getCrfVersionName()); } } return results; } /* Create a JMesa-based table for showing the studies associated with a CRF. */ private String renderStudiesTable(List<StudyBean> studyBeans) { Collection<StudyRowContainer> items = getStudyRows(studyBeans); TableFacade tableFacade = createTableFacade("studies", request); tableFacade.setColumnProperties("name", "uniqueProtocolid", "actions"); tableFacade.setItems(items); //Fix column titles HtmlTable table = (HtmlTable) tableFacade.getTable(); //i18n caption; TODO: convert to Spring messages /* ResourceBundle resourceBundle = ResourceBundle.getBundle("org.akaza.openclinica.i18n.words", LocaleResolver.getLocale(request)); String captionText = resourceBundle.getString("studies_using_crf"); if (captionText == null || "".equalsIgnoreCase(captionText)) { captionText = "Studies Using this CRF for Data Entry"; } table.setCaption(captionText); */ HtmlRow row = table.getRow(); SDVUtil sDVUtil = new SDVUtil(); String[] colNames = new String[] { "name", "uniqueProtocolid", "actions" }; sDVUtil.setHtmlCellEditors(tableFacade, colNames, true); HtmlColumn firstName = row.getColumn("name"); firstName.setTitle("Study Name"); HtmlColumn protocol = row.getColumn("uniqueProtocolid"); protocol.setTitle("Unique Protocol Id"); HtmlColumn actions = row.getColumn("actions"); actions.setTitle("Actions"); return tableFacade.render(); } /* Generate the rows for the study table. Each row represents a StudyBean domain object. */ private Collection<StudyRowContainer> getStudyRows(List<StudyBean> studyBeans) { Collection<StudyRowContainer> allRows = new ArrayList<StudyRowContainer>(); StudyRowContainer tempBean = null; StringBuilder actions = new StringBuilder(""); for (StudyBean studBean : studyBeans) { tempBean = new StudyRowContainer(); tempBean.setName(studBean.getName()); tempBean.setUniqueProtocolid(studBean.getIdentifier()); tempBean.setStudyBean(studBean); actions.append(StudyRowContainer.VIEW_STUDY_DETAILS_URL).append(studBean.getId()).append(StudyRowContainer.VIEW_STUDY_DETAILS_SUFFIX); tempBean.setActions(actions.toString()); allRows.add(tempBean); actions = new StringBuilder(""); } return allRows; } /* Fetch the studies associated with a CRF, via an event definition that uses the CRF. */ private List<StudyBean> findStudiesForCRFId(int crfId, StudyDAO studyDao) { List<StudyBean> studyBeans = new ArrayList<StudyBean>(); if (crfId == 0 || studyDao == null) { return studyBeans; } ArrayList<Integer> studyIds = studyDao.getStudyIdsByCRF(crfId); StudyBean tempBean = new StudyBean(); for (Integer id : studyIds) { tempBean = (StudyBean) studyDao.findByPK(id); studyBeans.add(tempBean); } return studyBeans; } private Collection<TableColumnHolder> populate(CRFBean crf, ArrayList<CRFVersionBean> versions) { HashMap<CRFVersionBean, ArrayList<TableColumnHolder>> hm = new HashMap<CRFVersionBean, ArrayList<TableColumnHolder>>(); List<TableColumnHolder> tableColumnHolders = new ArrayList<TableColumnHolder>(); for (CRFVersionBean versionBean : versions) { hm.put(versionBean, new ArrayList<TableColumnHolder>()); } List<RuleSetBean> ruleSets = getRuleSetService().getRuleSetsByCrfAndStudy(crf, currentStudy); ruleSets = getRuleSetService().filterByStatusEqualsAvailable(ruleSets); for (RuleSetBean ruleSetBean : ruleSets) { if (ruleSetBean.getCrfVersion() == null) { for (CRFVersionBean key : hm.keySet()) { hm.get(key).addAll(createFromRuleSet(ruleSetBean, key)); } } if (ruleSetBean.getCrfVersion() != null) { hm.get(ruleSetBean.getCrfVersion()).addAll(createFromRuleSet(ruleSetBean, ruleSetBean.getCrfVersion())); } } for (ArrayList<TableColumnHolder> list : hm.values()) { tableColumnHolders.addAll(list); } return tableColumnHolders; } private List<TableColumnHolder> createFromRuleSet(RuleSetBean ruleSet, CRFVersionBean crfVersion) { List<TableColumnHolder> tchs = new ArrayList<TableColumnHolder>(); for (RuleSetRuleBean ruleSetRule : ruleSet.getRuleSetRules()) { String ruleExpression = ruleSetRule.getRuleBean().getExpression().getValue(); String ruleName = ruleSetRule.getRuleBean().getName(); TableColumnHolder tch = new TableColumnHolder(crfVersion.getName(), crfVersion.getId(), ruleName, ruleExpression, ruleSetRule.getActions(), ruleSetRule.getId()); tchs.add(tch); } return tchs; } private String html(TableFacade tableFacade) { // set the column properties tableFacade.setColumnProperties("versionName", "ruleName", "ruleExpression", "executeOnPlaceHolder", "actionTypePlaceHolder", "actionSummaryPlaceHolder", "link"); HtmlTable table = (HtmlTable) tableFacade.getTable(); table.setCaption(resword.getString("rule_rules")); table.getTableRenderer().setWidth("800px"); HtmlRow row = table.getRow(); HtmlColumn versionName = row.getColumn("versionName"); versionName.setTitle(resword.getString("CRF_version")); HtmlColumn ruleName = row.getColumn("ruleName"); ruleName.setTitle(resword.getString("rule_name")); HtmlColumn career = row.getColumn("ruleExpression"); career.setWidth("100px"); career.setTitle(resword.getString("rule_expression")); HtmlColumn executeOn = row.getColumn("executeOnPlaceHolder"); executeOn.setSortable(false); executeOn.setFilterable(false); executeOn.setTitle(resword.getString("rule_execute_on")); executeOn.getCellRenderer().setCellEditor(new CellEditor() { @SuppressWarnings("unchecked") public Object getValue(Object item, String property, int rowcount) { String value = ""; List<RuleActionBean> ruleActions = (List<RuleActionBean>) new BasicCellEditor().getValue(item, "actions", rowcount); for (int i = 0; i < ruleActions.size(); i++) { value += ruleActions.get(i).getExpressionEvaluatesTo(); // Do not add horizontal line after last Summary if (i != ruleActions.size() - 1) { value += "<hr>"; } } return value; } }); HtmlColumn actionTypePlaceHolder = row.getColumn("actionTypePlaceHolder"); actionTypePlaceHolder.setSortable(false); actionTypePlaceHolder.setFilterable(false); actionTypePlaceHolder.setTitle(resword.getString("rule_action_type")); actionTypePlaceHolder.getCellRenderer().setCellEditor(new CellEditor() { @SuppressWarnings("unchecked") public Object getValue(Object item, String property, int rowcount) { String value = ""; List<RuleActionBean> ruleActions = (List<RuleActionBean>) new BasicCellEditor().getValue(item, "actions", rowcount); for (int i = 0; i < ruleActions.size(); i++) { value += ruleActions.get(i).getActionType().name(); // Do not add horizontal line after last Summary if (i != ruleActions.size() - 1) { value += "<hr>"; } } return value; } }); HtmlColumn actionSummaryPlaceHolder = row.getColumn("actionSummaryPlaceHolder"); actionSummaryPlaceHolder.setSortable(false); actionSummaryPlaceHolder.setFilterable(false); actionSummaryPlaceHolder.setTitle(resword.getString("rule_action_summary")); actionSummaryPlaceHolder.getCellRenderer().setCellEditor(new CellEditor() { @SuppressWarnings("unchecked") public Object getValue(Object item, String property, int rowcount) { String value = ""; List<RuleActionBean> ruleActions = (List<RuleActionBean>) new BasicCellEditor().getValue(item, "actions", rowcount); for (int i = 0; i < ruleActions.size(); i++) { value += ruleActions.get(i).getSummary(); // Do not add horizontal line after last Summary if (i != ruleActions.size() - 1) { value += "<hr>"; } } return value; } }); HtmlColumn link = row.getColumn("link"); link.setSortable(false); link.setFilterable(false); link.setTitle(resword.getString("action")); link.getCellRenderer().setCellEditor(new CellEditor() { @SuppressWarnings("unchecked") public Object getValue(Object item, String property, int rowcount) { String param1 = (String) new BasicCellEditor().getValue(item, "ruleSetRuleId", rowcount); String param2 = (String) new BasicCellEditor().getValue(item, "versionId", rowcount); HtmlBuilder html = new HtmlBuilder(); html.a().href().quote().append(request.getContextPath() + "/RunRule?ruleSetRuleId=" + param1 + "&versionId=" + param2 + "&action=dryRun") .quote().close(); html.img().name("bt_View1").src("images/bt_ExexuteRules.gif").border("0").end(); html.aEnd(); return html.toString(); } }); return tableFacade.render(); // Return the Html. } private void export(TableFacade tableFacade) { // set the column properties tableFacade.setColumnProperties("versionName", "ruleName", "ruleExpression", "executeOnPlaceHolder", "actionTypePlaceHolder", "actionSummaryPlaceHolder"); Table table = tableFacade.getTable(); table.setCaption("Rules"); Row row = table.getRow(); Column executeOn = row.getColumn("executeOnPlaceHolder"); executeOn.setTitle("Execute On"); executeOn.getCellRenderer().setCellEditor(new CellEditor() { @SuppressWarnings("unchecked") public Object getValue(Object item, String property, int rowcount) { String value = ""; List<RuleActionBean> ruleActions = (List<RuleActionBean>) new BasicCellEditor().getValue(item, "actions", rowcount); for (int i = 0; i < ruleActions.size(); i++) { value += ruleActions.get(i).getExpressionEvaluatesTo(); // Do not add horizontal line after last Summary if (i != ruleActions.size() - 1) { value += " | "; } } return value; } }); Column actionTypePlaceHolder = row.getColumn("actionTypePlaceHolder"); actionTypePlaceHolder.setTitle("Action Type"); actionTypePlaceHolder.getCellRenderer().setCellEditor(new CellEditor() { @SuppressWarnings("unchecked") public Object getValue(Object item, String property, int rowcount) { String value = ""; List<RuleActionBean> ruleActions = (List<RuleActionBean>) new BasicCellEditor().getValue(item, "actions", rowcount); for (int i = 0; i < ruleActions.size(); i++) { value += ruleActions.get(i).getActionType().name(); // Do not add horizontal line after last Summary if (i != ruleActions.size() - 1) { value += " | "; } } return value; } }); Column actionSummaryPlaceHolder = row.getColumn("actionSummaryPlaceHolder"); actionSummaryPlaceHolder.setTitle("Action Summary"); actionSummaryPlaceHolder.getCellRenderer().setCellEditor(new CellEditor() { @SuppressWarnings("unchecked") public Object getValue(Object item, String property, int rowcount) { String value = ""; List<RuleActionBean> ruleActions = (List<RuleActionBean>) new BasicCellEditor().getValue(item, "actions", rowcount); for (int i = 0; i < ruleActions.size(); i++) { value += ruleActions.get(i).getSummary(); // Do not add horizontal line after last Summary if (i != ruleActions.size() - 1) { value += " | "; } } return value; } }); tableFacade.render(); } @Override protected String getAdminServlet() { if (ub.isSysAdmin()) { return SecureController.ADMIN_SERVLET_CODE; } else { return ""; } } private RuleSetServiceInterface getRuleSetService() { ruleSetService = this.ruleSetService != null ? ruleSetService : (RuleSetServiceInterface) SpringServletAccess.getApplicationContext(context).getBean( "ruleSetService"); /*ruleSetService = this.ruleSetService != null ? ruleSetService : new RuleSetService(sm.getDataSource(), getRequestURLMinusServletPath(), getContextPath());*/ return ruleSetService; } }