public void processRequest() throws Exception { FormProcessor fp = new FormProcessor(request); int itemId = fp.getInt(ITEM_ID); ItemDAO idao = new ItemDAO(sm.getDataSource()); ItemFormMetadataDAO ifmdao = new ItemFormMetadataDAO(sm.getDataSource()); CRFVersionDAO cvdao = new CRFVersionDAO(sm.getDataSource()); CRFDAO cdao = new CRFDAO(sm.getDataSource()); if (itemId == 0) { addPageMessage("Please choose an item first."); forwardPage(Page.ITEM_DETAIL); return; } ItemBean item = (ItemBean) idao.findByPK(itemId); ArrayList versions = idao.findAllVersionsByItemId(item.getId()); ArrayList versionItems = new ArrayList(); // finds each item metadata for each version for (int i = 0; i < versions.size(); i++) { Integer versionId = (Integer) versions.get(i); CRFVersionBean version = (CRFVersionBean) cvdao.findByPK(versionId.intValue()); if (versionId != null && versionId.intValue() > 0) { ItemFormMetadataBean imfBean = ifmdao.findByItemIdAndCRFVersionId(item.getId(), versionId.intValue()); imfBean.setCrfVersionName(version.getName()); CRFBean crf = (CRFBean) cdao.findByPK(version.getCrfId()); imfBean.setCrfName(crf.getName()); versionItems.add(imfBean); } } request.setAttribute(VERSION_ITEMS, versionItems); request.setAttribute(ITEM_BEAN, item); forwardPage(Page.ITEM_DETAIL); }
/** * Performs calculation. <br> * Notice: both parameter 'itemdata' and parameter 'errs' might be updated in this method. * * @param displayItems * @param items * @param itemdata * @param errs * @return * @author ywang (Jan. 2008) */ public String doCalculation( DisplayItemBean displayItem, HashMap<String, ItemBean> items, HashMap<String, String> itemdata, HashMap<Integer, TreeSet<Integer>> itemOrdinals, StringBuffer errs, int ordinal) { if (itemdata == null) { logger.error("In DataEntryServlet doCalculation(), itemdata map is empty!"); errs.append("Calculation cannot be started because needed items are empty" + "; "); return ""; } String value = ""; NumberFormat nf = NumberFormat.getInstance(); Parser parser = new Parser(items, itemdata); ItemBean ib = displayItem.getItem(); ItemFormMetadataBean ifm = displayItem.getMetadata(); ResponseOptionBean rob = (ResponseOptionBean) ifm.getResponseSet().getOptions().get(0); ArrayList<ScoreToken> parsedExp = new ArrayList<ScoreToken>(); int type = ifm.getResponseSet().getResponseTypeId(); if (type == 8) { parsedExp = parser.assignVariables(parser.parseScoreTokens(rob.getValue()), ordinal); } else if (type == 9) { // YW, 1-16-2008, for group-calculation type. Current restrictions: // 1. only calculate sum(), avg(), min(), max(), median(), stdev() // 2. formula arguments only contain item beans // 3. only one item bean per argument parsedExp = parser.assignVariables(parser.parseScoreTokens(rob.getValue()), itemOrdinals); } if (parser.getErrors().length() > 0) { errs.append(parser.getErrors()); } else { try { value = ScoreUtil.eval(parsedExp); } catch (ScoreException se) { logger.error(se.getMessage()); } ItemDataType idt = ib.getDataType(); if (value == null || value.length() == 0) { value = ""; String exp = rob.getValue(); exp = exp.replace("##", ","); errs.append("Result is empty in" + " " + exp + "; "); // errors.append(resexception.getString("result_is_empty_in") + // " " + exp + "; "); } else { value = this.getMathContextValue(value, ifm, idt, errs); } // idb.setStatus(Status.UNAVAILABLE); itemdata.put(ib.getId() + "_" + ordinal, value); } return value; }
protected String getMathContextValue( String value, ItemFormMetadataBean ifm, ItemDataType idt, StringBuffer errorMessage) { ResponseOptionBean rob = (ResponseOptionBean) ifm.getResponseSet().getOptions().get(0); String widthDecimal = ifm.getWidthDecimal(); int width = Validator.parseWidth(widthDecimal); int decimal = Validator.parseDecimal(widthDecimal); NumberFormat nf = NumberFormat.getInstance(); if (idt.equals(ItemDataType.INTEGER)) { try { Double d = nf.parse(value).doubleValue(); int p = 0; if (width > 0) { p = d >= 0 ? width : width - 1; } else { p = BigDecimal.valueOf(d).precision(); } MathContext mc = new MathContext(p, RoundingMode.valueOf(BigDecimal.ROUND_HALF_UP)); value = (new BigDecimal(d, mc)).setScale(0, BigDecimal.ROUND_HALF_UP).toPlainString(); } catch (ParseException e) { logger.error("Number was expected in " + rob.getValue() + " : " + value); String exp = rob.getValue(); exp = exp.replace("##", ","); errorMessage.append("Number was expected in" + " " + exp + " : " + value + "; "); // errors.append(resexception.getString("number_expected_in") // + " " + exp + ": " + value + "; "); value = ""; } } else if (idt.equals(ItemDataType.REAL)) { try { Double d = nf.parse(value).doubleValue(); // there should be no width specify for calculation item int p = BigDecimal.valueOf(d).precision(); // set default scale as 4 int scale = decimal > 0 ? decimal : DEFAULT_DECIMAL; MathContext mc = new MathContext(p, RoundingMode.valueOf(BigDecimal.ROUND_HALF_UP)); value = (new BigDecimal(d, mc)).setScale(scale, BigDecimal.ROUND_HALF_UP).toPlainString(); } catch (Exception ee) { String exp = rob.getValue(); exp = exp.replace("##", ","); logger.error("Number was expected in " + exp + " : " + value); errorMessage.append("Number was expected in" + " " + exp + " : " + value + "; "); // errors.append(resexception.getString("number_expected_in") // + " " + exp + ": " + value + "; "); value = ""; } } return value; }
public ArrayList findAllActiveByCRF(CRFBean crf) { HashMap variables = new HashMap(); this.setTypesExpected(); this.setTypeExpected(14, TypeNames.INT); // crf_version_id this.setTypeExpected(15, TypeNames.STRING); // version name variables.put(new Integer(1), new Integer(crf.getId())); String sql = digester.getQuery("findAllActiveByCRF"); ArrayList alist = this.select(sql, variables); ArrayList al = new ArrayList(); Iterator it = alist.iterator(); while (it.hasNext()) { HashMap hm = (HashMap) it.next(); ItemBean eb = (ItemBean) this.getEntityFromHashMap(hm); Integer versionId = (Integer) hm.get("crf_version_id"); String versionName = (String) hm.get("cvname"); ItemFormMetadataBean imf = new ItemFormMetadataBean(); imf.setCrfVersionName(versionName); // logger.info("versionName" + imf.getCrfVersionName()); imf.setCrfVersionId(versionId.intValue()); eb.setItemMeta(imf); al.add(eb); } return al; }
/** * Re-do calculations if funcs include changed item(s) and funcs are not included in the current * section. If calculation can not sucessfully redo, old value will be erased and "<erased>" will * be saved in database. <br> * The parameter 'itemdata' might be overwritten. * * @param itemGroupSizes * @param items * @param itemdata * @param oldItemdata * @param updatedData * @param sectionId * @return ArrayList<String> which records left_item_text of items who failed to be updated into * database. */ public ArrayList<String> redoCalculations( HashMap<String, ItemBean> items, HashMap<String, String> itemdata, TreeSet<String> changedItems, HashMap<Integer, TreeSet<Integer>> itemOrdinals, int sectionId) { ArrayList<String> updateFailedItems = new ArrayList<String>(); if (itemdata == null) { logger.error("In ScoreCalculator redoCalculations(), itemdata is empty!"); errors.add("In ScoreCalculator redoCalculations(), 'itemdata' map is empty!"); return updateFailedItems; } if (changedItems == null) { logger.error("In ScoreCalculator redoCalculations(), 'changeItems' set is empty!"); errors.add("In ScoreCalculator redoCalculations(), 'changeItems' set is empty!"); return updateFailedItems; } ItemFormMetadataDAO ifmdao = new ItemFormMetadataDAO(sm.getDataSource()); ItemDAO idao = new ItemDAO(sm.getDataSource()); ItemDataDAO iddao = new ItemDataDAO(sm.getDataSource()); NumberFormat nf = NumberFormat.getInstance(); Parser parser = new Parser(items, itemdata); try { // for calculation type List<ItemFormMetadataBean> derivedItemList = ifmdao.findAllByCRFVersionIdAndResponseTypeId( ecb.getCRFVersionId(), ResponseType.CALCULATION.getId()); if (derivedItemList.size() > 0) { Collections.sort(derivedItemList); for (ItemFormMetadataBean ifmb : derivedItemList) { if (ifmb.getSectionId() != sectionId) { ItemBean ib = (ItemBean) idao.findByPK(ifmb.getItemId()); ResponseOptionBean rob = (ResponseOptionBean) ifmb.getResponseSet().getOptions().get(0); int groupsize = 1; if (itemOrdinals.containsKey(ib.getId())) { groupsize = itemOrdinals.get(ib.getId()).size(); } String value = ""; ArrayList<ScoreToken> parsedExp = new ArrayList<ScoreToken>(); for (int i = 0; i < groupsize; ++i) { ItemDataBean idb = iddao.findByItemIdAndEventCRFIdAndOrdinal(ifmb.getItemId(), ecb.getId(), i + 1); // is there any changed item Parser p = new Parser(items, itemdata); parsedExp = parser.parseScoreTokens(rob.getValue()); if (p.isChanged(changedItems, parsedExp)) { StringBuffer err = new StringBuffer(); parsedExp = parser.assignVariables(parsedExp, i + 1); // if parser has error and has been calculated // before, set "<erased>" if (parser.getErrors().length() > 0) { err.append(parser.getErrors()); if (idb.isActive()) { idb.setValue("<erased>"); idb.setStatus(Status.UNAVAILABLE); idb = (ItemDataBean) iddao.update(idb); if (!idb.isActive()) { String key = i + 1 > 1 ? ifmb.getLeftItemText() + "_" + (i + 1) : ifmb.getLeftItemText(); updateFailedItems.add(key); } } parser.setErrors(new StringBuffer()); } // otherwise do calculation else { try { value = ScoreUtil.eval(parsedExp); } catch (ScoreException se) { logger.error(se.getMessage()); } String exp = rob.getValue(); exp = exp.replace("##", ","); if (writeToDB(ib, ifmb, idb, exp, value, err)) { changedItems.add(ib.getName()); itemdata.put(ib.getId() + "_" + (i + 1), idb.getValue()); } else { String key = i + 1 > 1 ? ifmb.getLeftItemText() + "_" + (i + 1) : ifmb.getLeftItemText(); updateFailedItems.add(key); } } if (err.length() > 0) { String key = i + 1 > 1 ? ifmb.getLeftItemText() + "_" + (i + 1) : ifmb.getLeftItemText(); errors.add("Item " + key + " contains calculation errors: " + err.toString()); } } } } } } List<ItemFormMetadataBean> itemList = ifmdao.findAllByCRFVersionIdAndResponseTypeId( ecb.getCRFVersionId(), ResponseType.GROUP_CALCULATION.getId()); if (itemList.size() > 0) { Collections.sort(itemList); for (ItemFormMetadataBean ifmb : itemList) { if (ifmb.getSectionId() != sectionId) { ItemBean ib = (ItemBean) idao.findByPK(ifmb.getItemId()); ResponseOptionBean rob = (ResponseOptionBean) ifmb.getResponseSet().getOptions().get(0); String value = ""; Parser p = new Parser(items, itemdata); ArrayList<ScoreToken> parsedExp = parser.parseScoreTokens(rob.getValue()); if (p.isChanged(changedItems, parsedExp)) { StringBuffer err = new StringBuffer(); parser.setErrors(err); parsedExp = parser.assignVariables(parsedExp, itemOrdinals); ItemDataBean idb = iddao.findByItemIdAndEventCRFIdAndOrdinal(ifmb.getItemId(), ecb.getId(), 1); if (parser.getErrors().length() > 0) { err.append(parser.getErrors()); if (idb.isActive()) { idb.setValue("<erased>"); idb.setStatus(Status.UNAVAILABLE); idb = (ItemDataBean) iddao.update(idb); if (!idb.isActive()) { updateFailedItems.add(ifmb.getLeftItemText()); } } } else { try { value = ScoreUtil.eval(parsedExp); } catch (ScoreException se) { logger.error(se.getMessage()); } String exp = rob.getValue(); exp = exp.replace("##", ","); if (writeToDB(ib, ifmb, idb, exp, value, err)) { changedItems.add(ib.getName()); itemdata.put(ib.getId() + "_" + idb.getOrdinal(), idb.getValue()); } else { updateFailedItems.add(ifmb.getLeftItemText()); } } if (err.length() > 0) { errors.add( "Item " + ifmb.getLeftItemText() + " contains calculation errors: " + err.toString()); } } } } } } catch (OpenClinicaException e) { logger.error(e.getMessage()); } return updateFailedItems; }
public boolean prepareRequestForResolution( HttpServletRequest request, DataSource ds, StudyBean currentStudy, DiscrepancyNoteBean note, boolean isCompleted) { String entityType = note.getEntityType().toLowerCase(); int id = note.getEntityId(); if ("subject".equalsIgnoreCase(entityType)) { StudySubjectDAO ssdao = new StudySubjectDAO(ds); StudySubjectBean ssb = ssdao.findBySubjectIdAndStudy(id, currentStudy); request.setAttribute("action", "show"); request.setAttribute("id", String.valueOf(note.getEntityId())); request.setAttribute("studySubId", String.valueOf(ssb.getId())); } else if ("studysub".equalsIgnoreCase(entityType)) { request.setAttribute("action", "show"); request.setAttribute("id", String.valueOf(note.getEntityId())); } else if ("eventcrf".equalsIgnoreCase(entityType)) { request.setAttribute("editInterview", "1"); EventCRFDAO ecdao = new EventCRFDAO(ds); EventCRFBean ecb = (EventCRFBean) ecdao.findByPK(id); request.setAttribute(TableOfContentsServlet.INPUT_EVENT_CRF_BEAN, ecb); // If the request is passed along to ViewSectionDataEntryServlet, // that code needs // an event crf id; the (ecb.getId()+"") is necessary because // FormProcessor throws // a ClassCastException without the casting to a String request.setAttribute(ViewSectionDataEntryServlet.EVENT_CRF_ID, ecb.getId() + ""); } else if ("studyevent".equalsIgnoreCase(entityType)) { StudyEventDAO sedao = new StudyEventDAO(ds); StudyEventBean seb = (StudyEventBean) sedao.findByPK(id); request.setAttribute(EnterDataForStudyEventServlet.INPUT_EVENT_ID, String.valueOf(id)); request.setAttribute(UpdateStudyEventServlet.EVENT_ID, String.valueOf(id)); request.setAttribute( UpdateStudyEventServlet.STUDY_SUBJECT_ID, String.valueOf(seb.getStudySubjectId())); } // this is for item data else if ("itemdata".equalsIgnoreCase(entityType)) { ItemDataDAO iddao = new ItemDataDAO(ds); ItemDataBean idb = (ItemDataBean) iddao.findByPK(id); EventCRFDAO ecdao = new EventCRFDAO(ds); EventCRFBean ecb = (EventCRFBean) ecdao.findByPK(idb.getEventCRFId()); StudySubjectDAO ssdao = new StudySubjectDAO(sm.getDataSource()); StudySubjectBean ssb = (StudySubjectBean) ssdao.findByPK(ecb.getStudySubjectId()); ItemFormMetadataDAO ifmdao = new ItemFormMetadataDAO(ds); ItemFormMetadataBean ifmb = ifmdao.findByItemIdAndCRFVersionId(idb.getItemId(), ecb.getCRFVersionId()); if (currentRole.getRole().equals(Role.MONITOR) || !isCompleted) { StudyEventDAO sedao = new StudyEventDAO(ds); StudyEventBean seb = (StudyEventBean) sedao.findByPK(id); request.setAttribute(EVENT_CRF_ID, String.valueOf(idb.getEventCRFId())); request.setAttribute(STUDY_SUB_ID, String.valueOf(seb.getStudySubjectId())); } else { request.setAttribute( DataEntryServlet.INPUT_EVENT_CRF_ID, String.valueOf(idb.getEventCRFId())); request.setAttribute( DataEntryServlet.INPUT_SECTION_ID, String.valueOf(ifmb.getSectionId())); } DataEntryStage stage = ecb.getStage(); // if (!stage.equals(DataEntryStage.DOUBLE_DATA_ENTRY_COMPLETE)) { // return false; // } } return true; }