use of org.akaza.openclinica.bean.submit.ItemFormMetadataBean in project OpenClinica by OpenClinica.
the class DataEntryServlet method validateDisplayItemBeanMultipleCV.
/**
* Peform validation on a item which has a RADIO or SINGLESELECT response type. This function checks that the input isn't blank, and that its value comes
* from the controlled vocabulary (ResponseSetBean) in the DisplayItemBean.
*
* @param v
* The Validator to add validations to.
* @param dib
* The DisplayItemBean to validate.
* @return The DisplayItemBean which is validated.
*/
protected DisplayItemBean validateDisplayItemBeanMultipleCV(DiscrepancyValidator v, DisplayItemBean dib, String inputName) {
if (StringUtil.isBlank(inputName)) {
inputName = getInputName(dib);
}
ItemFormMetadataBean ibMeta = dib.getMetadata();
ItemDataBean idb = dib.getData();
if (StringUtil.isBlank(idb.getValue())) {
if (ibMeta.isRequired() && ibMeta.isShowItem()) {
v.addValidation(inputName, Validator.IS_REQUIRED);
}
} else {
v.addValidation(inputName, Validator.IN_RESPONSE_SET, dib.getMetadata().getResponseSet());
}
customValidation(v, dib, inputName);
return dib;
}
use of org.akaza.openclinica.bean.submit.ItemFormMetadataBean in project OpenClinica by OpenClinica.
the class DataEntryServlet method validateShownSCDToBeHiddenSingle.
//validate simple-conditional-display item to be changed from shown to hidden
protected void validateShownSCDToBeHiddenSingle(DiscrepancyValidator v, DisplayItemBean dib) {
ItemFormMetadataBean ifmb = dib.getMetadata();
String value = dib.getData().getValue();
boolean hasDN = dib.getDiscrepancyNotes() != null && dib.getDiscrepancyNotes().size() > 0 ? true : false;
if (value != null && value.length() > 0 && !dib.getIsSCDtoBeShown() && !hasDN) {
//String message = ifmb.getConditionalDisplay().replaceAll("\\\\,", "##").split(",")[2].trim();
//message = message.replaceAll("##", "\\,");
String message = dib.getScdData().getScdItemMetadataBean().getMessage();
Validation vl = new Validation(Validator.TO_HIDE_CONDITIONAL_DISPLAY);
vl.setErrorMessage(message);
v.addValidation(getInputName(dib), vl);
}
}
use of org.akaza.openclinica.bean.submit.ItemFormMetadataBean in project OpenClinica by OpenClinica.
the class DataEntryServlet method getChildrenDisplayItems.
/**
* Get the DisplayItemBean objects corresponding to the items which are children of the specified parent.
*
* @param parent
* The item whose children are to be retrieved.
* @param request TODO
* @return An array of DisplayItemBean objects corresponding to the items which are children of parent, and are sorted by column number (ascending), then
* ordinal (ascending).
*/
private ArrayList getChildrenDisplayItems(DisplayItemBean parent, EventDefinitionCRFBean edcb, HttpServletRequest request) {
ArrayList answer = new ArrayList();
EventCRFBean ecb = (EventCRFBean) request.getAttribute(INPUT_EVENT_CRF);
int parentId = parent.getItem().getId();
ItemDAO idao = new ItemDAO(getDataSource());
ArrayList childItemBeans = idao.findAllByParentIdAndCRFVersionId(parentId, ecb.getCRFVersionId());
ItemDataDAO iddao = new ItemDataDAO(getDataSource(), locale);
ItemFormMetadataDAO ifmdao = new ItemFormMetadataDAO(getDataSource());
for (int i = 0; i < childItemBeans.size(); i++) {
ItemBean child = (ItemBean) childItemBeans.get(i);
ItemDataBean data = iddao.findByItemIdAndEventCRFId(child.getId(), ecb.getId());
ItemFormMetadataBean metadata = ifmdao.findByItemIdAndCRFVersionId(child.getId(), ecb.getCRFVersionId());
DisplayItemBean dib = new DisplayItemBean();
dib.setEventDefinitionCRF(edcb);
dib.setItem(child);
// tbh
if (!getServletPage(request).equals(Page.DOUBLE_DATA_ENTRY_SERVLET)) {
dib.setData(data);
}
// <<tbh 07/2009, bug #3883
// ItemDataBean dbData = iddao.findByItemIdAndEventCRFIdAndOrdinal(itemId, eventCRFId, ordinal)
dib.setDbData(data);
boolean showItem = getItemMetadataService().isShown(metadata.getItemId(), ecb, data);
if (getServletPage(request).equals(Page.DOUBLE_DATA_ENTRY_SERVLET)) {
showItem = getItemMetadataService().hasPassedDDE(metadata, ecb, data);
}
// boolean passedDDE = getItemMetadataService().hasPassedDDE(data);
if (showItem) {
LOGGER.debug("set show item: " + metadata.getItemId() + " data " + data.getId());
// metadata.setShowItem(showItem);
metadata.setShowItem(true);
}
// logger.debug("did not catch NPE");
dib.setMetadata(metadata);
if (shouldLoadDBValues(dib)) {
LOGGER.trace("should load db values is true, set value");
dib.loadDBValue();
LOGGER.trace("just loaded the child value: " + dib.getData().getValue());
}
answer.add(dib);
}
// this is a pretty slow and memory intensive way to sort... see if we
// can
// have the db do this instead
Collections.sort(answer);
return answer;
}
use of org.akaza.openclinica.bean.submit.ItemFormMetadataBean in project OpenClinica by OpenClinica.
the class DataEntryServlet method validateDisplayItemBeanText.
/**
* Peform validation on a item which has a TEXT or TEXTAREA response type. If the item has a null value, it's automatically validated. Otherwise, it's
* checked against its data type.
*
* @param v
* The Validator to add validations to.
* @param dib
* The DisplayItemBean to validate.
* @param request TODO
* @return The DisplayItemBean which is validated.
*/
protected DisplayItemBean validateDisplayItemBeanText(DiscrepancyValidator v, DisplayItemBean dib, String inputName, HttpServletRequest request) {
FormProcessor fp = new FormProcessor(request);
EventDefinitionCRFBean edcb = (EventDefinitionCRFBean) request.getAttribute(EVENT_DEF_CRF_BEAN);
if (StringUtil.isBlank(inputName)) {
// for single items
inputName = getInputName(dib);
}
ItemBean ib = dib.getItem();
ItemFormMetadataBean ibMeta = dib.getMetadata();
ItemDataType idt = ib.getDataType();
ItemDataBean idb = dib.getData();
boolean isNull = false;
ArrayList nullValues = edcb.getNullValuesList();
for (int i = 0; i < nullValues.size(); i++) {
NullValue nv = (NullValue) nullValues.get(i);
if (nv.getName().equals(fp.getString(inputName))) {
isNull = true;
}
}
if (!isNull) {
if (StringUtil.isBlank(idb.getValue())) {
// check required first
if (ibMeta.isRequired() && ibMeta.isShowItem()) {
v.addValidation(inputName, Validator.IS_REQUIRED);
}
} else {
if (idt.equals(ItemDataType.ST)) {
// a string's size could be more than 3999, which is more
// than
// the db field length
v.addValidation(inputName, Validator.LENGTH_NUMERIC_COMPARISON, NumericComparisonOperator.LESS_THAN_OR_EQUAL_TO, 3999);
} else if (idt.equals(ItemDataType.INTEGER)) {
v.addValidation(inputName, Validator.IS_AN_INTEGER);
v.alwaysExecuteLastValidation(inputName);
} else if (idt.equals(ItemDataType.REAL)) {
v.addValidation(inputName, Validator.IS_A_NUMBER);
v.alwaysExecuteLastValidation(inputName);
} else if (idt.equals(ItemDataType.BL)) {
// there is no validation here since this data type is
// explicitly
// allowed to be null
// if the string input for this field parses to a non-zero
// number, the
// value will be true; otherwise, 0
} else if (idt.equals(ItemDataType.BN)) {
} else if (idt.equals(ItemDataType.SET)) {
// v.addValidation(inputName, Validator.NO_BLANKS_SET);
v.addValidation(inputName, Validator.IN_RESPONSE_SET_SINGLE_VALUE, dib.getMetadata().getResponseSet());
} else if (idt.equals(ItemDataType.DATE)) {
v.addValidation(inputName, Validator.IS_A_DATE);
v.alwaysExecuteLastValidation(inputName);
} else if (idt.equals(ItemDataType.PDATE)) {
v.addValidation(inputName, Validator.IS_PARTIAL_DATE);
v.alwaysExecuteLastValidation(inputName);
}
if (ibMeta.getWidthDecimal().length() > 0) {
ArrayList<String> params = new ArrayList<String>();
params.add(0, idt.getName());
params.add(1, ibMeta.getWidthDecimal());
v.addValidation(inputName, Validator.IS_VALID_WIDTH_DECIMAL, params);
v.alwaysExecuteLastValidation(inputName);
}
// >> tbh 4/30/2010 #4963 removing custom validations firing during AE
customValidation(v, dib, inputName);
/*
* if (!StringUtil.isBlank(customValidationString)) { Validation customValidation = null; if (customValidationString.startsWith("func:")) { try
* { customValidation = Validator.processCRFValidationFunction(customValidationString ); } catch (Exception e) { e.printStackTrace(); } } else
* if (customValidationString.startsWith("regexp:")) { try { customValidation = Validator.processCRFValidationRegex(customValidationString); }
* catch (Exception e) { } } if (customValidation != null) { customValidation .setErrorMessage(dib.getMetadata().getRegexpErrorMsg());
* v.addValidation(inputName, customValidation); } }
*/
}
}
return dib;
}
use of org.akaza.openclinica.bean.submit.ItemFormMetadataBean in project OpenClinica by OpenClinica.
the class DataEntryServlet method processRequest.
@Override
protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
//JN:The following were the the global variables, moved as local.
locale = LocaleResolver.getLocale(request);
EventCRFBean ecb = (EventCRFBean) request.getAttribute(INPUT_EVENT_CRF);
SectionBean sb = (SectionBean) request.getAttribute(SECTION_BEAN);
ItemDataDAO iddao = new ItemDataDAO(getDataSource(), locale);
HttpSession session = request.getSession();
StudyBean currentStudy = (StudyBean) session.getAttribute("study");
StudyUserRoleBean currentRole = (StudyUserRoleBean) session.getAttribute("userRole");
SectionDAO sdao = new SectionDAO(getDataSource());
/**
* Determines whether the form was submitted. Calculated once in processRequest. The reason we don't use the normal means to determine if the form was
* submitted (ie FormProcessor.isSubmitted) is because when we use forwardPage, Java confuses the inputs from the just-processed form with the inputs for
* the forwarded-to page. This is a problem since frequently we're forwarding from one (submitted) section to the next (unsubmitted) section. If we use the
* normal means, Java will always think that the unsubmitted section is, in fact, submitted. This member is guaranteed to be calculated before
* shouldLoadDBValues() is called.
*/
boolean isSubmitted = false;
boolean hasGroup = false;
EventCRFDAO ecdao = null;
FormProcessor fp = new FormProcessor(request);
logMe("Enterting DataEntry Servlet" + System.currentTimeMillis());
EventDefinitionCRFDAO edcdao = new EventDefinitionCRFDAO(getDataSource());
FormDiscrepancyNotes discNotes;
panel.setStudyInfoShown(false);
String age = "";
UserAccountBean ub = (UserAccountBean) request.getSession().getAttribute(USER_BEAN_NAME);
String instantAtt = CV_INSTANT_META + ecb.getCRFVersionId();
//for 11958: repeating groups rows appear if validation returns to the same section
int isFirstTimeOnSection = fp.getInt("isFirstTimeOnSection");
request.setAttribute("isFirstTimeOnSection", isFirstTimeOnSection + "");
if (getCrfLocker().isLocked(ecb.getId())) {
int userId = getCrfLocker().getLockOwner(ecb.getId());
UserAccountDAO udao = new UserAccountDAO(getDataSource());
UserAccountBean ubean = (UserAccountBean) udao.findByPK(userId);
if (ubean.getId() != ub.getId()) {
addPageMessage(resword.getString("CRF_unavailable") + " " + ubean.getName() + " " + resword.getString("Currently_entering_data") + " " + resword.getString("Leave_the_CRF"), request);
forwardPage(Page.LIST_STUDY_SUBJECTS_SERVLET, request, response);
}
} else {
getCrfLocker().lock(ecb.getId(), ub.getId());
}
if (!ecb.isActive()) {
throw new InconsistentStateException(Page.LIST_STUDY_SUBJECTS_SERVLET, resexception.getString("event_not_exists"));
}
logMe("Enterting DataEntry Get the status/number of item discrepancy notes" + System.currentTimeMillis());
// Get the status/number of item discrepancy notes
DiscrepancyNoteDAO dndao = new DiscrepancyNoteDAO(getDataSource());
ArrayList<DiscrepancyNoteBean> allNotes = new ArrayList<DiscrepancyNoteBean>();
List<DiscrepancyNoteBean> eventCrfNotes = new ArrayList<DiscrepancyNoteBean>();
List<DiscrepancyNoteThread> noteThreads = new ArrayList<DiscrepancyNoteThread>();
// BWP: this try block is not necessary try {
dndao = new DiscrepancyNoteDAO(getDataSource());
allNotes = dndao.findAllTopNotesByEventCRF(ecb.getId());
eventCrfNotes = dndao.findOnlyParentEventCRFDNotesFromEventCRF(ecb);
if (!eventCrfNotes.isEmpty()) {
allNotes.addAll(eventCrfNotes);
}
logMe("Entering DataEntry Create disc note threads out of the various notes" + System.currentTimeMillis());
// Create disc note threads out of the various notes
DiscrepancyNoteUtil dNoteUtil = new DiscrepancyNoteUtil();
noteThreads = dNoteUtil.createThreadsOfParents(allNotes, getDataSource(), currentStudy, null, -1, true);
// variables that provide values for the CRF discrepancy note header
int updatedNum = 0;
int openNum = 0;
int closedNum = 0;
int resolvedNum = 0;
int notAppNum = 0;
DiscrepancyNoteBean tempBean;
for (DiscrepancyNoteThread dnThread : noteThreads) {
/*
* 3014: do not count parent beans, only the last child disc note of the thread.
*/
tempBean = dnThread.getLinkedNoteList().getLast();
if (tempBean != null) {
if (ResolutionStatus.UPDATED.equals(tempBean.getResStatus())) {
updatedNum++;
} else if (ResolutionStatus.OPEN.equals(tempBean.getResStatus())) {
openNum++;
} else if (ResolutionStatus.CLOSED.equals(tempBean.getResStatus())) {
// if (dn.getParentDnId() > 0){
closedNum++;
// }
} else if (ResolutionStatus.RESOLVED.equals(tempBean.getResStatus())) {
// if (dn.getParentDnId() > 0){
resolvedNum++;
// }
} else if (ResolutionStatus.NOT_APPLICABLE.equals(tempBean.getResStatus())) {
notAppNum++;
}
}
}
logMe("Entering DataEntry Create disc note threads out of the various notes DONE" + System.currentTimeMillis());
request.setAttribute("updatedNum", updatedNum + "");
request.setAttribute("openNum", openNum + "");
request.setAttribute("closedNum", closedNum + "");
request.setAttribute("resolvedNum", resolvedNum + "");
request.setAttribute("notAppNum", notAppNum + "");
String fromViewNotes = fp.getString("fromViewNotes");
if (fromViewNotes != null && "1".equals(fromViewNotes)) {
request.setAttribute("fromViewNotes", fromViewNotes);
}
logMe("Entering Create studySubjDao.. ++++stuff" + System.currentTimeMillis());
StudySubjectDAO ssdao = new StudySubjectDAO(getDataSource());
StudySubjectBean ssb = (StudySubjectBean) ssdao.findByPK(ecb.getStudySubjectId());
// YW 11-07-2007, data entry could not be performed if its study subject
// has been removed.
// Notice: ViewSectionDataEntryServelet, ViewSectionDataEntryPreview,
// PrintCRFServlet and PrintDataEntryServlet, have theirs own
// processRequest
Status s = ssb.getStatus();
if ("removed".equalsIgnoreCase(s.getName()) || "auto-removed".equalsIgnoreCase(s.getName())) {
addPageMessage(respage.getString("you_may_not_perform_data_entry_on_a_CRF") + respage.getString("study_subject_has_been_deleted"), request);
request.setAttribute("id", new Integer(ecb.getStudySubjectId()).toString());
session.removeAttribute(instantAtt);
forwardPage(Page.VIEW_STUDY_SUBJECT_SERVLET, request, response);
}
// YW >>
HashMap<String, String> newUploadedFiles = (HashMap<String, String>) session.getAttribute("newUploadedFiles");
if (newUploadedFiles == null) {
newUploadedFiles = new HashMap<String, String>();
}
request.setAttribute("newUploadedFiles", newUploadedFiles);
if (!fp.getString("exitTo").equals("")) {
request.setAttribute("exitTo", fp.getString("exitTo"));
}
//some EVENT CRF CHECK
logMe("Entering some EVENT CRF CHECK" + System.currentTimeMillis());
if (!fp.getString(GO_EXIT).equals("")) {
session.removeAttribute(GROUP_HAS_DATA);
session.removeAttribute("to_create_crf");
session.removeAttribute("mayProcessUploading");
//Removing the user and EventCRF from the locked CRF List
if (getCrfLocker().isLocked(ecb.getId()) && getCrfLocker().getLockOwner(ecb.getId()) == ub.getId())
getCrfLocker().unlock(ecb.getId());
if (newUploadedFiles.size() > 0) {
if (this.unloadFiles(newUploadedFiles)) {
} else {
String missed = "";
Iterator iter = newUploadedFiles.keySet().iterator();
while (iter.hasNext()) {
missed += " " + newUploadedFiles.get(iter.next());
}
addPageMessage(respage.getString("uploaded_files_not_deleted_or_not_exist") + ": " + missed, request);
}
}
session.removeAttribute("newUploadedFiles");
addPageMessage(respage.getString("exit_without_saving"), request);
// another servlet
if (fromViewNotes != null && "1".equals(fromViewNotes)) {
String viewNotesURL = (String) session.getAttribute("viewNotesURL");
if (viewNotesURL != null && viewNotesURL.length() > 0) {
response.sendRedirect(response.encodeRedirectURL(viewNotesURL));
}
return;
}
String fromResolvingNotes = fp.getString("fromResolvingNotes", true);
String winLocation = (String) session.getAttribute(ViewNotesServlet.WIN_LOCATION);
session.removeAttribute(instantAtt);
if (!StringUtil.isBlank(fromResolvingNotes) && !StringUtil.isBlank(winLocation)) {
response.sendRedirect(response.encodeRedirectURL(winLocation));
} else {
if (!fp.getString("exitTo").equals("")) {
response.sendRedirect(response.encodeRedirectURL(fp.getString("exitTo")));
} else
response.sendRedirect(response.encodeRedirectURL("ListStudySubjects"));
}
// forwardPage(Page.SUBMIT_DATA_SERVLET);
return;
}
logMe("Entering some EVENT CRF CHECK DONE" + System.currentTimeMillis());
// checks if the section has items in item group
// for repeating items
// hasGroup = getInputBeans();
hasGroup = checkGroups(fp, ecb);
Boolean b = (Boolean) request.getAttribute(INPUT_IGNORE_PARAMETERS);
isSubmitted = fp.isSubmitted() && b == null;
// variable is used for fetching any null values like "not applicable"
int eventDefinitionCRFId = 0;
if (fp != null) {
eventDefinitionCRFId = fp.getInt("eventDefinitionCRFId");
}
StudyBean study = (StudyBean) session.getAttribute("study");
// constructs the list of items used on UI
// tbh>>
// logger.trace("trying event def crf id: "+eventDefinitionCRFId);
logMe("Entering some EVENT DEF CRF CHECK " + System.currentTimeMillis());
if (eventDefinitionCRFId <= 0) {
// TODO we have to get that id before we can continue
EventDefinitionCRFBean edcBean = edcdao.findByStudyEventIdAndCRFVersionId(study, ecb.getStudyEventId(), ecb.getCRFVersionId());
eventDefinitionCRFId = edcBean.getId();
}
logMe("Entering some EVENT DEF CRF CHECK DONE " + System.currentTimeMillis());
logMe("Entering some Study EVENT DEF CRF CHECK " + System.currentTimeMillis());
StudyEventDAO seDao = new StudyEventDAO(getDataSource());
EventDefinitionCRFBean edcBean = (EventDefinitionCRFBean) edcdao.findByPK(eventDefinitionCRFId);
EventDefinitionCRFBean edcb = (EventDefinitionCRFBean) edcdao.findByPK(eventDefinitionCRFId);
//JN:Putting the event_def_crf_bean in the request attribute.
request.setAttribute(EVENT_DEF_CRF_BEAN, edcb);
StudyEventBean studyEventBean = (StudyEventBean) seDao.findByPK(ecb.getStudyEventId());
edcBean.setId(eventDefinitionCRFId);
StudyEventDefinitionDAO seddao = new StudyEventDefinitionDAO(getDataSource());
StudyEventDefinitionBean studyEventDefinition = (StudyEventDefinitionBean) seddao.findByPK(edcBean.getStudyEventDefinitionId());
CRFVersionDAO cvdao = new CRFVersionDAO(getDataSource());
CRFVersionBean crfVersionBean = (CRFVersionBean) cvdao.findByPK(ecb.getCRFVersionId());
Phase phase2 = Phase.INITIAL_DATA_ENTRY;
if (getServletPage(request).startsWith(Page.DOUBLE_DATA_ENTRY_SERVLET.getFileName())) {
phase2 = Phase.DOUBLE_DATA_ENTRY;
} else if (getServletPage(request).startsWith(Page.ADMIN_EDIT_SERVLET.getFileName())) {
phase2 = Phase.ADMIN_EDITING;
}
logMe("Entering ruleSets::: CreateAndInitializeRuleSet:::" + Thread.currentThread());
logMe("Entering ruleSets::: CreateAndInitializeRuleSet:::" + Thread.currentThread() + "currentStudy?" + currentStudy + "studyEventDefinition" + studyEventDefinition + "crfVersionBean" + crfVersionBean + "studyEventBean" + studyEventBean + "ecb" + ecb);
// List<RuleSetBean> ruleSets = createAndInitializeRuleSet(currentStudy, studyEventDefinition, crfVersionBean, studyEventBean, ecb, true, request, response);
// boolean shouldRunRules = getRuleSetService(request).shouldRunRulesForRuleSets(ruleSets, phase2);
logMe("Entering getDisplayBean:::::Thread::::" + Thread.currentThread());
DisplaySectionBean section = getDisplayBean(hasGroup, false, request, isSubmitted);
//hasSCDItem has been initialized in getDisplayBean() which is online above
VariableSubstitutionHelper.replaceVariables(section, study, ssb, studyEventDefinition, studyEventBean, dataSource);
if (section.getSection().hasSCDItem()) {
SimpleConditionalDisplayService cds0 = (SimpleConditionalDisplayService) SpringServletAccess.getApplicationContext(getServletContext()).getBean("simpleConditionalDisplayService");
section = cds0.initConditionalDisplays(section);
}
logMe("Entering Find out the id of the section's first field " + System.currentTimeMillis());
// 2790: Find out the id of the section's first field
String firstFieldId = getSectionFirstFieldId(section.getSection().getId());
request.setAttribute("formFirstField", firstFieldId);
// logger.trace("now trying event def crf id: "+eventDefinitionCRFId);
// above is necessary to give us null values during DDE
// ironically, this only covers vertical null value result sets
// horizontal ones are covered in FormBeanUtil, tbh 112007
logMe("Entering displayItemWithGroups " + System.currentTimeMillis());
//@pgawade 30-May-2012 Fix for issue 13963 - added an extra parameter 'isSubmitted' to method createItemWithGroups
List<DisplayItemWithGroupBean> displayItemWithGroups = createItemWithGroups(section, hasGroup, eventDefinitionCRFId, request, isSubmitted);
logMe("Entering displayItemWithGroups end " + System.currentTimeMillis());
this.getItemMetadataService().updateGroupDynamicsInSection(displayItemWithGroups, section.getSection().getId(), ecb);
section.setDisplayItemGroups(displayItemWithGroups);
DisplayTableOfContentsBean toc = TableOfContentsServlet.getDisplayBeanWithShownSections(getDataSource(), (DisplayTableOfContentsBean) request.getAttribute(TOC_DISPLAY), (DynamicsMetadataService) SpringServletAccess.getApplicationContext(getServletContext()).getBean("dynamicsMetadataService"));
request.setAttribute(TOC_DISPLAY, toc);
LinkedList<Integer> sectionIdsInToc = TableOfContentsServlet.sectionIdsInToc(toc);
// why do we get previousSec and nextSec here, rather than in
// getDisplayBeans?
// so that we can use them in forwarding the user to the previous/next
// section
// if the validation was successful
logMe("Entering displayItemWithGroups sdao.findPrevious " + System.currentTimeMillis());
int sIndex = TableOfContentsServlet.sectionIndexInToc(section.getSection(), toc, sectionIdsInToc);
SectionBean previousSec = this.prevSection(section.getSection(), ecb, toc, sIndex);
logMe("Entering displayItemWithGroups sdao.findPrevious end " + System.currentTimeMillis());
SectionBean nextSec = this.nextSection(section.getSection(), ecb, toc, sIndex);
section.setFirstSection(!previousSec.isActive());
section.setLastSection(!nextSec.isActive());
// this is for generating side info panel
// and the information panel under the Title
SubjectDAO subjectDao = new SubjectDAO(getDataSource());
StudyDAO studydao = new StudyDAO(getDataSource());
SubjectBean subject = (SubjectBean) subjectDao.findByPK(ssb.getSubjectId());
// Get the study then the parent study
logMe("Entering Get the study then the parent study " + System.currentTimeMillis());
if (study.getParentStudyId() > 0) {
// this is a site,find parent
StudyBean parentStudy = (StudyBean) studydao.findByPK(study.getParentStudyId());
request.setAttribute("studyTitle", parentStudy.getName());
request.setAttribute("siteTitle", study.getName());
} else {
request.setAttribute("studyTitle", study.getName());
}
logMe("Entering Get the study then the parent study end " + System.currentTimeMillis());
// Let us process the age
if (currentStudy.getStudyParameterConfig().getCollectDob().equals("1")) {
// YW 11-16-2007 erollment-date is used for calculating age.
Date enrollmentDate = ssb.getEnrollmentDate();
age = Utils.getInstacne().processAge(enrollmentDate, subject.getDateOfBirth());
}
//ArrayList beans = ViewStudySubjectServlet.getDisplayStudyEventsForStudySubject(ssb, getDataSource(), ub, currentRole);
request.setAttribute("studySubject", ssb);
request.setAttribute("subject", subject);
//request.setAttribute("beans", beans);
request.setAttribute("eventCRF", ecb);
request.setAttribute("age", age);
request.setAttribute("decryptedPassword", ((SecurityManager) SpringServletAccess.getApplicationContext(getServletContext()).getBean("securityManager")).encrytPassword("root", getUserDetails()));
// set up interviewer name and date
fp.addPresetValue(INPUT_INTERVIEWER, ecb.getInterviewerName());
if (ecb.getDateInterviewed() != null) {
DateFormat local_df = new SimpleDateFormat(resformat.getString("date_format_string"), ResourceBundleProvider.getLocale());
String idateFormatted = local_df.format(ecb.getDateInterviewed());
fp.addPresetValue(INPUT_INTERVIEW_DATE, idateFormatted);
} else {
fp.addPresetValue(INPUT_INTERVIEW_DATE, "");
}
setPresetValues(fp.getPresetValues(), request);
logMe("Entering Checks !submitted " + System.currentTimeMillis());
if (!isSubmitted) {
// TODO: prevent data enterer from seeing results of first round of
// data
// entry, if this is second round
// FLAG--SLOW HERE WHEN LOADING
logMe("Entering Checks !submitted entered " + System.currentTimeMillis());
long t = System.currentTimeMillis();
request.setAttribute(BEAN_DISPLAY, section);
request.setAttribute(BEAN_ANNOTATIONS, getEventCRFAnnotations(request));
session.setAttribute("shouldRunValidation", null);
session.setAttribute("rulesErrors", null);
session.setAttribute(DataEntryServlet.NOTE_SUBMITTED, null);
discNotes = new FormDiscrepancyNotes();
// discNotes = (FormDiscrepancyNotes) session.getAttribute(AddNewSubjectServlet.FORM_DISCREPANCY_NOTES_NAME);
// if (discNotes == null) {
// discNotes = new FormDiscrepancyNotes();
// }
// << tbh 01/2010
section = populateNotesWithDBNoteCounts(discNotes, section, request);
populateInstantOnChange(request.getSession(), ecb, section);
LOGGER.debug("+++ just ran populateNotes, printing field notes: " + discNotes.getFieldNotes().toString());
LOGGER.debug("found disc notes: " + discNotes.getNumExistingFieldNotes().toString());
session.setAttribute(AddNewSubjectServlet.FORM_DISCREPANCY_NOTES_NAME, discNotes);
if (section.getSection().hasSCDItem()) {
section = SCDItemDisplayInfo.generateSCDDisplayInfo(section, this.getServletPage(request).equals(Page.INITIAL_DATA_ENTRY) || this.getServletPage(request).equals(Page.ADMIN_EDIT_SERVLET) && !this.isAdminForcedReasonForChange(request));
}
int keyId = ecb.getId();
session.removeAttribute(DoubleDataEntryServlet.COUNT_VALIDATE + keyId);
setUpPanel(section);
if (newUploadedFiles.size() > 0) {
if (this.unloadFiles(newUploadedFiles)) {
} else {
String missed = "";
Iterator iter = newUploadedFiles.keySet().iterator();
while (iter.hasNext()) {
missed += " " + newUploadedFiles.get(iter.next());
}
addPageMessage(respage.getString("uploaded_files_not_deleted_or_not_exist") + ": " + missed, request);
}
}
logMe("Entering Checks !submitted entered end forwarding page " + System.currentTimeMillis());
logMe("Time Took for this block" + (System.currentTimeMillis() - t));
forwardPage(getJSPPage(), request, response);
return;
} else {
logMe("Entering Checks !submitted not entered " + System.currentTimeMillis());
//
// VALIDATION / LOADING DATA
//
// If validation is required for this round, we will go through
// each item and add an appropriate validation to the Validator
//
// Otherwise, we will just load the data into the DisplayItemBean
// so that we can write to the database later.
//
// Validation is required if two conditions are met:
// 1. The user clicked a "Save" button, not a "Confirm" button
// 2. In this type of data entry servlet, when the user clicks
// a Save button, the inputs are validated
//
boolean validate = fp.getBoolean(INPUT_CHECK_INPUTS) && validateInputOnFirstRound();
// did the user click a "Save" button?
// is validation required in this type of servlet when the user
// clicks
// "Save"?
// We can conclude that the user is trying to save data; therefore,
// set a request
// attribute indicating that default values for items shouldn't be
// displayed
// in the application UI that will subsequently be displayed
// TODO: find a better, less random place for this
// session.setAttribute(HAS_DATA_FLAG, true);
// section.setCheckInputs(fp.getBoolean(INPUT_CHECK_INPUTS));
errors = new HashMap();
// ArrayList items = section.getItems();
discNotes = (FormDiscrepancyNotes) session.getAttribute(AddNewSubjectServlet.FORM_DISCREPANCY_NOTES_NAME);
if (discNotes == null) {
discNotes = new FormDiscrepancyNotes();
}
// populateNotesWithDBNoteCounts(discNotes, section);
// all items- inlcude items in item groups and other single items
List<DisplayItemWithGroupBean> allItems = section.getDisplayItemGroups();
String attachedFilePath = Utils.getAttachedFilePath(currentStudy);
DiscrepancyValidator v = new DiscrepancyValidator(request, discNotes);
RuleValidator ruleValidator = new RuleValidator(request);
LOGGER.debug("SZE 1 :: " + allItems.size());
logMe("Looping inside !submitted " + System.currentTimeMillis());
for (int i = 0; i < allItems.size(); i++) {
LOGGER.trace("===itering through items: " + i);
DisplayItemWithGroupBean diwg = allItems.get(i);
if (diwg.isInGroup()) {
// for the items in groups
DisplayItemGroupBean dgb = diwg.getItemGroup();
List<DisplayItemGroupBean> dbGroups = diwg.getDbItemGroups();
//dbGroups = diwg.getItemGroups();
List<DisplayItemGroupBean> formGroups = new ArrayList<DisplayItemGroupBean>();
LOGGER.debug("got db item group size " + dbGroups.size());
if (validate) {
// int manualGroups = getManualRows(dbGroups2);
// logger.debug("+++ found manual rows from db group 2: " + manualGroups);
LOGGER.debug("===IF VALIDATE NOT A SINGLE ITEM: got to this part in the validation loop: " + dgb.getGroupMetaBean().getName());
// TODO next marker tbh 112007
// formGroups = validateDisplayItemGroupBean(v,
// dgb,dbGroups, formGroups,
// ruleValidator,groupOrdinalPLusItemOid);
formGroups = validateDisplayItemGroupBean(v, dgb, dbGroups, formGroups, request, response);
LOGGER.debug("form group size after validation " + formGroups.size());
} else {
LOGGER.debug("+++ELSE NOT A SINGLE ITEM: got to this part in the validation loop: " + dgb.getGroupMetaBean().getName());
formGroups = loadFormValueForItemGroup(dgb, dbGroups, formGroups, eventDefinitionCRFId, request);
LOGGER.debug("form group size without validation " + formGroups.size());
}
diwg.setItemGroup(dgb);
diwg.setItemGroups(formGroups);
allItems.set(i, diwg);
} else {
// other single items
DisplayItemBean dib = diwg.getSingleItem();
// dib = (DisplayItemBean) allItems.get(i);
if (validate) {
// generate input name here?
// DisplayItemGroupBean dgb = diwg.getItemGroup();
String itemName = getInputName(dib);
// no Item group for single item, so just use blank
// string as parameter for inputName
// this
dib = validateDisplayItemBean(v, dib, "", request);
// should be
// used,
// otherwise,
// DDE not
// working-jxu
LOGGER.debug("&&& found name: " + itemName);
LOGGER.debug("input VALIDATE " + itemName + ": " + fp.getString(itemName));
// dib.loadFormValue(fp.getString(itemName));
LOGGER.debug("input " + itemName + " has a response set of " + dib.getMetadata().getResponseSet().getOptions().size() + " options");
} else {
String itemName = getInputName(dib);
LOGGER.debug("input NONVALIDATE " + itemName + ": " + fp.getString(itemName));
// dib.loadFormValue(itemName);
dib = loadFormValue(dib, request);
// String itemName = getInputName(dib);
// dib = loadFormValue(itemName);
}
ArrayList children = dib.getChildren();
for (int j = 0; j < children.size(); j++) {
DisplayItemBean child = (DisplayItemBean) children.get(j);
// DisplayItemGroupBean dgb = diwg.getItemGroup();
String itemName = getInputName(child);
child.loadFormValue(fp.getString(itemName));
if (validate) {
// child = validateDisplayItemBean(v, child,
// itemName, ruleValidator, groupOrdinalPLusItemOid,
// false);
child = validateDisplayItemBean(v, child, itemName, request);
// was null changed value 092007 tbh
} else {
// child.loadFormValue(itemName);
child = loadFormValue(child, request);
}
LOGGER.debug("Checking child value for " + itemName + ": " + child.getData().getValue());
children.set(j, child);
}
dib.setChildren(children);
diwg.setSingleItem(runDynamicsItemCheck(dib, null, request));
// logger.trace("just set single item on line 447:
// "+dib.getData().getValue());
// items.set(i, dib);
LOGGER.debug(" I : " + i);
allItems.set(i, diwg);
}
}
logMe("Loop ended " + System.currentTimeMillis());
//JN: This is the list that contains all the scd-shown items.
List<ItemBean> itemBeansWithSCDShown = new ArrayList<ItemBean>();
if (validate && section.getSection().hasSCDItem()) {
logMe(" Validate and Loop " + System.currentTimeMillis());
for (int i = 0; i < allItems.size(); ++i) {
DisplayItemBean dib = allItems.get(i).getSingleItem();
ItemFormMetadataBean ifmb = dib.getMetadata();
if (ifmb.getParentId() == 0) {
if (dib.getScdData().getScdSetsForControl().size() > 0) {
//for control item
//dib has to loadFormValue first. Here loadFormValue has been done in validateDisplayItemBean(v, dib, "")
section.setShowSCDItemIds(SimpleConditionalDisplayService.conditionalDisplayToBeShown(dib, section.getShowSCDItemIds()));
}
if (dib.getScdData().getScdItemMetadataBean().getScdItemFormMetadataId() > 0) {
//for scd item
//a control item is always before its scd item
dib.setIsSCDtoBeShown(section.getShowSCDItemIds().contains(dib.getMetadata().getItemId()));
if (dib.getIsSCDtoBeShown())
itemBeansWithSCDShown.add(dib.getItem());
validateSCDItemBean(v, dib);
}
ArrayList<DisplayItemBean> children = dib.getChildren();
for (int j = 0; j < children.size(); j++) {
DisplayItemBean child = children.get(j);
if (child.getScdData().getScdSetsForControl().size() > 0) {
//for control item
//dib has to loadFormValue first. Here loadFormValue has been done in validateDisplayItemBean(v, dib, "")
section.setShowSCDItemIds(SimpleConditionalDisplayService.conditionalDisplayToBeShown(child, section.getShowSCDItemIds()));
}
if (child.getScdData().getScdItemMetadataBean().getScdItemFormMetadataId() > 0) {
//for scd item
//a control item is always before its scd item
child.setIsSCDtoBeShown(section.getShowSCDItemIds().contains(child.getMetadata().getItemId()));
if (child.getIsSCDtoBeShown())
itemBeansWithSCDShown.add(dib.getItem());
validateSCDItemBean(v, child);
}
}
}
}
logMe(" Validate and Loop end " + System.currentTimeMillis());
}
logMe(" Validate and Loop end " + System.currentTimeMillis());
//JN:calling again here, for the items with simple conditional display and rules.
List<RuleSetBean> ruleSets = createAndInitializeRuleSet(currentStudy, studyEventDefinition, crfVersionBean, studyEventBean, ecb, true, request, response, itemBeansWithSCDShown);
boolean shouldRunRules = getRuleSetService(request).shouldRunRulesForRuleSets(ruleSets, phase2);
// this.getItemMetadataService().resetItemCounter();
HashMap<String, ArrayList<String>> groupOrdinalPLusItemOid = null;
groupOrdinalPLusItemOid = runRules(allItems, ruleSets, true, shouldRunRules, MessageType.ERROR, phase2, ecb, request);
logMe("allItems Loop begin " + System.currentTimeMillis());
for (int i = 0; i < allItems.size(); i++) {
DisplayItemWithGroupBean diwg = allItems.get(i);
if (diwg.isInGroup()) {
// for the items in groups
DisplayItemGroupBean dgb = diwg.getItemGroup();
List<DisplayItemGroupBean> dbGroups = diwg.getDbItemGroups();
//dbGroups = diwg.getItemGroups();
// tbh 01/2010 change the group list?
List<DisplayItemGroupBean> formGroups = new ArrayList<DisplayItemGroupBean>();
// items again?
if (validate) {
// int manualGroups = getManualRows(dbGroups2);
// logger.debug("+++ found manual rows for db group2: " + manualGroups);
formGroups = validateDisplayItemGroupBean(v, dgb, dbGroups, formGroups, ruleValidator, groupOrdinalPLusItemOid, request, response);
// formGroups = validateDisplayItemGroupBean(v, dgb,
// dbGroups, formGroups);
LOGGER.debug("*** form group size after validation " + formGroups.size());
}
diwg.setItemGroup(dgb);
diwg.setItemGroups(formGroups);
allItems.set(i, diwg);
} else {
// other single items
DisplayItemBean dib = diwg.getSingleItem();
// dib = (DisplayItemBean) allItems.get(i);
if (validate) {
String itemName = getInputName(dib);
//
dib = validateDisplayItemBean(v, dib, "", ruleValidator, groupOrdinalPLusItemOid, false, null, request);
// / dib = validateDisplayItemBean(v, dib, "");// this
}
ArrayList children = dib.getChildren();
for (int j = 0; j < children.size(); j++) {
DisplayItemBean child = (DisplayItemBean) children.get(j);
// DisplayItemGroupBean dgb = diwg.getItemGroup();
String itemName = getInputName(child);
child.loadFormValue(fp.getString(itemName));
if (validate) {
child = validateDisplayItemBean(v, child, "", ruleValidator, groupOrdinalPLusItemOid, false, null, request);
// child = validateDisplayItemBean(v, child,
// itemName);
}
children.set(j, child);
LOGGER.debug(" J (children): " + j);
}
dib.setChildren(children);
diwg.setSingleItem(runDynamicsItemCheck(dib, null, request));
LOGGER.debug(" I : " + i);
allItems.set(i, diwg);
}
}
logMe("allItems Loop end " + System.currentTimeMillis());
// YW, 2-1-2008 <<
// A map from item name to item bean object.
HashMap<String, ItemBean> scoreItems = new HashMap<String, ItemBean>();
HashMap<String, String> scoreItemdata = new HashMap<String, String>();
HashMap<String, ItemDataBean> oldItemdata = prepareSectionItemdataObject(sb.getId(), request);
// hold all item names of changed ItemBean in current section
TreeSet<String> changedItems = new TreeSet<String>();
// holds complete disply item beans for checking against 'request
// for change' restriction
ArrayList<DisplayItemBean> changedItemsList = new ArrayList<DisplayItemBean>();
// key is repeating item name, value is its display item group bean
HashMap<String, DisplayItemGroupBean> changedItemsMap = new HashMap<String, DisplayItemGroupBean>();
// key is itemid, value is set of itemdata-ordinal
HashMap<Integer, TreeSet<Integer>> itemOrdinals = prepareItemdataOrdinals(request);
// prepare item data for scoring
updateDataOrdinals(allItems);
section.setDisplayItemGroups(allItems);
scoreItems = prepareScoreItems(request);
scoreItemdata = prepareScoreItemdata(request);
logMe("allItems 2 Loop begin " + System.currentTimeMillis());
for (int i = 0; i < allItems.size(); i++) {
DisplayItemWithGroupBean diwb = allItems.get(i);
if (diwb.isInGroup()) {
// for the items in groups
DisplayItemGroupBean digb = diwb.getItemGroup();
List<DisplayItemGroupBean> dbGroups = diwb.getDbItemGroups();
for (int j = 0; j < dbGroups.size(); j++) {
DisplayItemGroupBean displayGroup = dbGroups.get(j);
List<DisplayItemBean> items = displayGroup.getItems();
if ("remove".equalsIgnoreCase(displayGroup.getEditFlag())) {
for (DisplayItemBean displayItem : items) {
if (displayItem.getMetadata().isShowItem() && digb.getGroupMetaBean().isShowGroup()) {
int itemId = displayItem.getItem().getId();
int ordinal = displayItem.getData().getOrdinal();
if (itemOrdinals.containsKey(itemId)) {
itemOrdinals.get(itemId).remove(ordinal);
}
if (scoreItemdata.containsKey(itemId + "_" + ordinal)) {
scoreItemdata.remove(itemId + "_" + ordinal);
}
changedItems.add(displayItem.getItem().getName());
changedItemsList.add(displayItem);
String formName = displayItem.getItem().getName();
// logger.debug("SET: formName:" + formName);
if (displayGroup.isAuto()) {
formName = getGroupItemInputName(displayGroup, displayGroup.getFormInputOrdinal(), displayItem);
LOGGER.debug("GET: changed formName to " + formName);
} else {
formName = getGroupItemManualInputName(displayGroup, displayGroup.getFormInputOrdinal(), displayItem);
LOGGER.debug("GET-MANUAL: changed formName to " + formName);
}
changedItemsMap.put(formName, displayGroup);
LOGGER.debug("adding to changed items map: " + formName);
}
}
}
}
List<DisplayItemGroupBean> dgbs = diwb.getItemGroups();
int groupsize = dgbs.size();
HashMap<Integer, Integer> maxOrdinals = new HashMap<Integer, Integer>();
boolean first = true;
for (int j = 0; j < dgbs.size(); j++) {
DisplayItemGroupBean displayGroup = dgbs.get(j);
List<DisplayItemBean> items = displayGroup.getItems();
boolean isAdd = "add".equalsIgnoreCase(displayGroup.getEditFlag()) ? true : false;
for (DisplayItemBean displayItem : items) {
ItemBean ib = displayItem.getItem();
String itemName = ib.getName();
int itemId = ib.getId();
if (first) {
maxOrdinals.put(itemId, iddao.getMaxOrdinalForGroup(ecb, sb, displayGroup.getItemGroupBean()));
}
ItemDataBean idb = displayItem.getData();
String value = idb.getValue();
scoreItems.put(itemName, ib);
int ordinal = displayItem.getData().getOrdinal();
if (isAdd && scoreItemdata.containsKey(itemId + "_" + ordinal)) {
int formMax = 1;
if (maxOrdinals.containsKey(itemId)) {
formMax = maxOrdinals.get(itemId);
}
int dbMax = iddao.getMaxOrdinalForGroup(ecb, sb, displayGroup.getItemGroupBean());
ordinal = ordinal >= dbMax ? formMax + 1 : ordinal;
maxOrdinals.put(itemId, ordinal);
displayItem.getData().setOrdinal(ordinal);
scoreItemdata.put(itemId + "_" + ordinal, value);
} else {
scoreItemdata.put(itemId + "_" + ordinal, value);
}
if (itemOrdinals.containsKey(itemId)) {
itemOrdinals.get(itemId).add(ordinal);
} else {
TreeSet<Integer> ordinalSet = new TreeSet<Integer>();
ordinalSet.add(ordinal);
itemOrdinals.put(itemId, ordinalSet);
}
if (isChanged(displayItem, oldItemdata, attachedFilePath)) {
changedItems.add(itemName);
changedItemsList.add(displayItem);
String formName = displayItem.getItem().getName();
// logger.debug("SET: formName:" + formName);
if (displayGroup.isAuto()) {
formName = getGroupItemInputName(displayGroup, displayGroup.getFormInputOrdinal(), displayItem);
LOGGER.debug("RESET: formName group-item-input:" + formName);
} else {
formName = getGroupItemManualInputName(displayGroup, displayGroup.getFormInputOrdinal(), displayItem);
LOGGER.debug("RESET: formName group-item-input-manual:" + formName);
}
changedItemsMap.put(formName, displayGroup);
LOGGER.debug("adding to changed items map: " + formName);
}
}
first = false;
}
} else {
DisplayItemBean dib = diwb.getSingleItem();
ItemBean ib = dib.getItem();
ItemDataBean idb = dib.getData();
int itemId = ib.getId();
String itemName = ib.getName();
String value = idb.getValue();
scoreItems.put(itemName, ib);
// for items which are not in any group, their ordinal is
// set as 1
TreeSet<Integer> ordinalset = new TreeSet<Integer>();
ordinalset.add(1);
itemOrdinals.put(itemId, ordinalset);
scoreItemdata.put(itemId + "_" + 1, value);
if (isChanged(idb, oldItemdata, dib, attachedFilePath)) {
changedItems.add(itemName);
changedItemsList.add(dib);
// changedItemsMap.put(dib.getItem().getName(), new
// DisplayItemGroupBean());
}
ArrayList children = dib.getChildren();
for (int j = 0; j < children.size(); j++) {
DisplayItemBean child = (DisplayItemBean) children.get(j);
ItemBean cib = child.getItem();
scoreItems.put(cib.getName(), cib);
TreeSet<Integer> cordinalset = new TreeSet<Integer>();
cordinalset.add(1);
itemOrdinals.put(itemId, cordinalset);
scoreItemdata.put(cib.getId() + "_" + 1, child.getData().getValue());
if (isChanged(child.getData(), oldItemdata, child, attachedFilePath)) {
changedItems.add(itemName);
changedItemsList.add(child);
// changedItemsMap.put(itemName, new
// DisplayItemGroupBean());
}
}
}
}
logMe("allItems 2 Loop end " + System.currentTimeMillis());
// do calculation for 'calculation' and 'group-calculation' type
// items
// and write the result in DisplayItemBean's ItemDateBean - data
ScoreItemValidator sv = new ScoreItemValidator(request, discNotes);
// *** doing calc here, load it where? ***
SessionManager sm = (SessionManager) request.getSession().getAttribute("sm");
ScoreCalculator sc = new ScoreCalculator(sm, ecb, ub);
logMe("allItems 3 Loop begin " + System.currentTimeMillis());
for (int i = 0; i < allItems.size(); i++) {
DisplayItemWithGroupBean diwb = allItems.get(i);
if (diwb.isInGroup()) {
List<DisplayItemGroupBean> dgbs = diwb.getItemGroups();
for (int j = 0; j < dgbs.size(); j++) {
DisplayItemGroupBean displayGroup = dgbs.get(j);
List<DisplayItemBean> items = displayGroup.getItems();
for (DisplayItemBean displayItem : items) {
ItemFormMetadataBean ifmb = displayItem.getMetadata();
int responseTypeId = ifmb.getResponseSet().getResponseTypeId();
if (responseTypeId == 8 || responseTypeId == 9) {
StringBuffer err = new StringBuffer();
ResponseOptionBean robBean = (ResponseOptionBean) ifmb.getResponseSet().getOptions().get(0);
String value = "";
String inputName = "";
// getFormInputOrdinal() here, tbh 06/2009
if (displayGroup.isAuto()) {
inputName = getGroupItemInputName(displayGroup, displayGroup.getFormInputOrdinal(), displayItem);
LOGGER.debug("returning input name: " + inputName);
} else {
inputName = getGroupItemManualInputName(displayGroup, displayGroup.getFormInputOrdinal(), displayItem);
LOGGER.debug("returning input name: " + inputName);
}
if (robBean.getValue().startsWith("func: getexternalvalue") || robBean.getValue().startsWith("func: getExternalValue")) {
value = fp.getString(inputName);
LOGGER.debug("*** just set " + fp.getString(inputName) + " for line 815 " + displayItem.getItem().getName() + " with input name " + inputName);
} else {
value = sc.doCalculation(displayItem, scoreItems, scoreItemdata, itemOrdinals, err, displayItem.getData().getOrdinal());
}
displayItem.loadFormValue(value);
if (isChanged(displayItem, oldItemdata, attachedFilePath)) {
changedItems.add(displayItem.getItem().getName());
changedItemsList.add(displayItem);
}
request.setAttribute(inputName, value);
if (validate) {
displayItem = validateCalcTypeDisplayItemBean(sv, displayItem, inputName, request);
if (err.length() > 0) {
Validation validation = new Validation(Validator.CALCULATION_FAILED);
validation.setErrorMessage(err.toString());
sv.addValidation(inputName, validation);
}
}
}
}
}
} else {
DisplayItemBean dib = diwb.getSingleItem();
ItemFormMetadataBean ifmb = dib.getMetadata();
int responseTypeId = ifmb.getResponseSet().getResponseTypeId();
if (responseTypeId == 8 || responseTypeId == 9) {
StringBuffer err = new StringBuffer();
ResponseOptionBean robBean = (ResponseOptionBean) ifmb.getResponseSet().getOptions().get(0);
String value = "";
if (robBean.getValue().startsWith("func: getexternalvalue") || robBean.getValue().startsWith("func: getExternalValue")) {
String itemName = getInputName(dib);
value = fp.getString(itemName);
LOGGER.debug("just set " + fp.getString(itemName) + " for " + dib.getItem().getName());
LOGGER.debug("found in fp: " + fp.getString(dib.getItem().getName()));
// logger.debug("scoreitemdata: " +
// scoreItemdata.toString());
} else {
value = sc.doCalculation(dib, scoreItems, scoreItemdata, itemOrdinals, err, 1);
}
dib.loadFormValue(value);
if (isChanged(dib.getData(), oldItemdata, dib, attachedFilePath)) {
changedItems.add(dib.getItem().getName());
changedItemsList.add(dib);
// changedItemsMap.put(dib.getItem().getName(), new
// DisplayItemGroupBean());
}
String inputName = getInputName(dib);
request.setAttribute(inputName, value);
if (validate) {
dib = validateCalcTypeDisplayItemBean(sv, dib, "", request);
if (err.length() > 0) {
Validation validation = new Validation(Validator.CALCULATION_FAILED);
validation.setErrorMessage(err.toString());
sv.addValidation(inputName, validation);
}
}
}
ArrayList children = dib.getChildren();
for (int j = 0; j < children.size(); j++) {
DisplayItemBean child = (DisplayItemBean) children.get(j);
ItemFormMetadataBean cifmb = child.getMetadata();
int resTypeId = cifmb.getResponseSet().getResponseTypeId();
if (resTypeId == 8 || resTypeId == 9) {
StringBuffer cerr = new StringBuffer();
child.getDbData().setValue(child.getData().getValue());
ResponseOptionBean crobBean = (ResponseOptionBean) cifmb.getResponseSet().getOptions().get(0);
String cvalue = "";
if (crobBean.getValue().startsWith("func: getexternalvalue") || crobBean.getValue().startsWith("func: getExternalValue")) {
String itemName = getInputName(child);
cvalue = fp.getString(itemName);
LOGGER.debug("just set " + fp.getString(itemName) + " for " + child.getItem().getName());
} else {
cvalue = sc.doCalculation(child, scoreItems, scoreItemdata, itemOrdinals, cerr, 1);
}
child.loadFormValue(cvalue);
if (isChanged(child.getData(), oldItemdata, child, attachedFilePath)) {
changedItems.add(child.getItem().getName());
changedItemsList.add(child);
// changedItemsMap.put(child.getItem().getName(),
// new DisplayItemGroupBean());
}
String cinputName = getInputName(child);
request.setAttribute(cinputName, cvalue);
if (validate) {
child = validateCalcTypeDisplayItemBean(sv, child, "", request);
if (cerr.length() > 0) {
Validation cvalidation = new Validation(Validator.CALCULATION_FAILED);
cvalidation.setErrorMessage(cerr.toString());
sv.addValidation(cinputName, cvalidation);
}
}
}
children.set(j, child);
}
}
}
logMe("allItems 3 Loop end " + System.currentTimeMillis());
// YW >>
// we have to do this since we loaded all the form values into the
// display
// item beans above
// section.setItems(items);
// setting this AFTER we populate notes - will that make a difference?
section.setDisplayItemGroups(allItems);
// logger.debug("+++ try to populate notes");
section = populateNotesWithDBNoteCounts(discNotes, section, request);
populateInstantOnChange(request.getSession(), ecb, section);
if (currentStudy.getStudyParameterConfig().getInterviewerNameRequired().equals("yes")) {
v.addValidation(INPUT_INTERVIEWER, Validator.NO_BLANKS);
}
if (currentStudy.getStudyParameterConfig().getInterviewDateRequired().equals("yes")) {
v.addValidation(INPUT_INTERVIEW_DATE, Validator.NO_BLANKS);
}
if (!StringUtil.isBlank(fp.getString(INPUT_INTERVIEW_DATE))) {
v.addValidation(INPUT_INTERVIEW_DATE, Validator.IS_A_DATE);
v.alwaysExecuteLastValidation(INPUT_INTERVIEW_DATE);
}
if (section.getSection().hasSCDItem()) {
section = SCDItemDisplayInfo.generateSCDDisplayInfo(section, this.getServletPage(request).equals(Page.INITIAL_DATA_ENTRY) || this.getServletPage(request).equals(Page.ADMIN_EDIT_SERVLET) && !this.isAdminForcedReasonForChange(request));
}
// logger.debug("about to validate: " + v.getKeySet());
errors = v.validate();
// tbh >>
if (this.isAdminForcedReasonForChange(request) && this.isAdministrativeEditing() && errors.isEmpty()) {
// "You have changed data after this CRF was marked complete. "
// +
// "You must provide a Reason For Change discrepancy note for this item before you can save this updated information."
String error = respage.getString("reason_for_change_error");
// "Please enter a reason for change discrepancy note before saving."
// ;
int nonforcedChanges = 0;
// items map
if (changedItemsList.size() > 0) {
LOGGER.debug("found admin force reason for change: changed items " + changedItems.toString() + " and changed items list: " + changedItemsList.toString() + " changed items map: " + changedItemsMap.toString());
logMe("DisplayItemBean Loop begin " + System.currentTimeMillis());
for (DisplayItemBean displayItem : changedItemsList) {
String formName = getInputName(displayItem);
ItemDataBean idb = displayItem.getData();
ItemBean item_bean = displayItem.getItem();
ItemFormMetadataBean ifmb = displayItem.getMetadata();
LOGGER.debug("-- found group label " + ifmb.getGroupLabel());
if (!ifmb.getGroupLabel().equalsIgnoreCase("Ungrouped") && !ifmb.getGroupLabel().equalsIgnoreCase("")) {
// << tbh 11/2009 sometimes the group label is blank instead of ungrouped???
Iterator iter = changedItemsMap.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry<String, DisplayItemGroupBean> pairs = (Map.Entry) iter.next();
String formName2 = pairs.getKey();
DisplayItemGroupBean dgb = pairs.getValue();
// logger.debug("found auto: " +
// dgb.isAuto());
String testFormName = "";
if (dgb.isAuto()) {
// testFormName = getGroupItemInputName(dgb, dgb.getFormInputOrdinal(), getManualRows(dgbs), displayItem);
testFormName = getGroupItemInputName(dgb, dgb.getFormInputOrdinal(), displayItem);
} else {
testFormName = getGroupItemManualInputName(dgb, dgb.getFormInputOrdinal(), displayItem);
}
LOGGER.debug("found test form name: " + testFormName);
// if our test is the same with both the display
// item and the display group ...
// logger.debug("comparing " +
// testFormName + " and " + formName2);
int existingNotes = dndao.findNumExistingNotesForItem(idb.getId());
if (testFormName.equals(formName2)) {
formName = formName2;
this.setReasonForChangeError(ecb, item_bean, idb, formName, error, request);
changedItemsMap.remove(formName2);
LOGGER.debug("form name changed: " + formName);
break;
// .., send it as the form name
}
// ... otherwise, don't touch it
// how to tell vs. manual and just plain input?
}
} else {
this.setReasonForChangeError(ecb, item_bean, idb, formName, error, request);
LOGGER.debug("form name added: " + formName);
}
}
logMe("DisplayItemBean Loop end " + System.currentTimeMillis());
}
if (nonforcedChanges > 0) {
// do smething here?
}
}
LOGGER.debug("errors here: " + errors.toString());
// <<
logMe("error check Loop begin " + System.currentTimeMillis());
if (errors.isEmpty() && shouldRunRules) {
LOGGER.debug("Errors was empty");
if (session.getAttribute("rulesErrors") != null) {
// rules have already generated errors, Let's compare old
// error list with new
// error list, if lists not same show errors.
HashMap h = ruleValidator.validate();
Set<String> a = (Set<String>) session.getAttribute("rulesErrors");
Set<String> ba = h.keySet();
Boolean showErrors = false;
for (Object key : ba) {
if (!a.contains(key)) {
showErrors = true;
}
}
if (showErrors) {
errors = h;
if (errors.size() > 0) {
session.setAttribute("shouldRunValidation", "1");
session.setAttribute("rulesErrors", errors.keySet());
} else {
session.setAttribute("shouldRunValidation", null);
session.setAttribute("rulesErrors", null);
}
} else {
session.setAttribute("shouldRunValidation", null);
session.setAttribute("rulesErrors", null);
}
} else if (session.getAttribute("shouldRunValidation") != null && session.getAttribute("shouldRunValidation").toString().equals("1")) {
session.setAttribute("shouldRunValidation", null);
session.setAttribute("rulesErrors", null);
} else {
errors = ruleValidator.validate();
if (errors.size() > 0) {
session.setAttribute("shouldRunValidation", "1");
session.setAttribute("rulesErrors", errors.keySet());
}
}
}
if (!errors.isEmpty()) {
LOGGER.debug("threw an error with data entry...");
// copying below three lines, tbh 03/2010
String[] textFields = { INPUT_INTERVIEWER, INPUT_INTERVIEW_DATE };
fp.setCurrentStringValuesAsPreset(textFields);
setPresetValues(fp.getPresetValues(), request);
// YW, 2-4-2008 <<
logMe("!errors if Loop begin " + System.currentTimeMillis());
HashMap<String, ArrayList<String>> siErrors = sv.validate();
if (siErrors != null && !siErrors.isEmpty()) {
Iterator iter = siErrors.keySet().iterator();
while (iter.hasNext()) {
String fieldName = iter.next().toString();
errors.put(fieldName, siErrors.get(fieldName));
}
}
// we should 'shift' the names here, tbh 02/2010
// need: total number of rows, manual rows, all row names
// plus: error names
Iterator iter2 = errors.keySet().iterator();
while (iter2.hasNext()) {
String fieldName = iter2.next().toString();
LOGGER.debug("found error " + fieldName);
}
// for (int i = 0; i < allItems.size(); i++) {
// DisplayItemWithGroupBean diwb = allItems.get(i);
//
// if (diwb.isInGroup()) {
// List<DisplayItemGroupBean> dgbs = diwb.getItemGroups();
// logger.debug("found manual rows " + getManualRows(dgbs) + " and total rows " + dgbs.size() + " from ordinal " + diwb.getOrdinal());
// }
// }
errors = reshuffleErrorGroupNamesKK(errors, allItems, request);
reshuffleReasonForChangeHashAndDiscrepancyNotes(allItems, request, ecb);
// reset manual rows, so that we can catch errors correctly
// but it needs to be set per block of repeating items? what if there are two or more?
/*
int manualRows = 0; // getManualRows(formGroups);
for (int i = 0; i < allItems.size(); i++) {
DisplayItemWithGroupBean diwb = allItems.get(i);
if (diwb.isInGroup()) {
List<DisplayItemGroupBean> dgbs = diwb.getItemGroups();
manualRows = getManualRows(dgbs);
}
}
*/
//request.setAttribute("manualRows", new Integer(manualRows));
Iterator iter3 = errors.keySet().iterator();
while (iter3.hasNext()) {
String fieldName = iter3.next().toString();
LOGGER.debug("found error after shuffle " + fieldName);
}
//Mantis Issue: 8116. Parsist the markComplete chebox on error
request.setAttribute("markComplete", fp.getString(INPUT_MARK_COMPLETE));
// << tbh, 02/2010
// YW >>
// copied
request.setAttribute(BEAN_DISPLAY, section);
request.setAttribute(BEAN_ANNOTATIONS, fp.getString(INPUT_ANNOTATIONS));
setInputMessages(errors, request);
addPageMessage(respage.getString("errors_in_submission_see_below"), request);
request.setAttribute("hasError", "true");
// addPageMessage("To override these errors and keep the data as
// you
// entered it, click one of the \"Confirm\" buttons. ");
// if (section.isCheckInputs()) {
// addPageMessage("Please notice that you must enter data for
// the
// <b>required</b> entries.");
// }
// we do not save any DNs if we get here, so we have to set it back into session...
session.setAttribute(AddNewSubjectServlet.FORM_DISCREPANCY_NOTES_NAME, discNotes);
// << tbh 01/2010
setUpPanel(section);
forwardPage(getJSPPage(), request, response);
} else {
//reshuffleReasonForChangeHashAndDiscrepancyNotes( allItems, request, ecb);
LOGGER.debug("Do we hit this in save ?????");
logMe("Do we hit this in save ???? " + System.currentTimeMillis());
boolean success = true;
boolean temp = true;
// save interviewer name and date into DB
ecb.setInterviewerName(fp.getString(INPUT_INTERVIEWER));
if (!StringUtil.isBlank(fp.getString(INPUT_INTERVIEW_DATE))) {
ecb.setDateInterviewed(fp.getDate(INPUT_INTERVIEW_DATE));
} else {
ecb.setDateInterviewed(null);
}
if (ecdao == null) {
ecdao = new EventCRFDAO(getDataSource());
}
// set validator id for DDE
DataEntryStage stage = ecb.getStage();
if (stage.equals(DataEntryStage.INITIAL_DATA_ENTRY_COMPLETE) || stage.equals(DataEntryStage.DOUBLE_DATA_ENTRY)) {
ecb.setValidatorId(ub.getId());
}
// for Administrative editing
if (studyEventBean.getSubjectEventStatus().equals(SubjectEventStatus.SIGNED) && changedItemsList.size() > 0) {
studyEventBean.setSubjectEventStatus(SubjectEventStatus.COMPLETED);
studyEventBean.setUpdater(ub);
studyEventBean.setUpdatedDate(new Date());
seDao.update(studyEventBean);
}
// If the Study Subject's Satus is signed and we save a section
// , change status to available
LOGGER.debug("Status of Study Subject {}", ssb.getStatus().getName());
if (ssb.getStatus() == Status.SIGNED && changedItemsList.size() > 0) {
LOGGER.debug("Status of Study Subject is Signed we are updating");
StudySubjectDAO studySubjectDao = new StudySubjectDAO(getDataSource());
ssb.setStatus(Status.AVAILABLE);
ssb.setUpdater(ub);
ssb.setUpdatedDate(new Date());
studySubjectDao.update(ssb);
}
if (ecb.isSdvStatus() && changedItemsList.size() > 0) {
LOGGER.debug("Status of Study Subject is SDV we are updating");
StudySubjectDAO studySubjectDao = new StudySubjectDAO(getDataSource());
ssb.setStatus(Status.AVAILABLE);
ssb.setUpdater(ub);
ssb.setUpdatedDate(new Date());
studySubjectDao.update(ssb);
ecb.setSdvStatus(false);
ecb.setSdvUpdateId(ub.getId());
}
ecb = (EventCRFBean) ecdao.update(ecb);
// save discrepancy notes into DB
FormDiscrepancyNotes fdn = (FormDiscrepancyNotes) session.getAttribute(AddNewSubjectServlet.FORM_DISCREPANCY_NOTES_NAME);
dndao = new DiscrepancyNoteDAO(getDataSource());
AddNewSubjectServlet.saveFieldNotes(INPUT_INTERVIEWER, fdn, dndao, ecb.getId(), "EventCRF", currentStudy);
AddNewSubjectServlet.saveFieldNotes(INPUT_INTERVIEW_DATE, fdn, dndao, ecb.getId(), "EventCRF", currentStudy);
// items = section.getItems();
allItems = section.getDisplayItemGroups();
int nextOrdinal = 0;
LOGGER.debug("all items before saving into DB" + allItems.size());
this.output(allItems);
//TODO:Seems longer here, check this
logMe("DisplayItemWithGroupBean allitems4 " + System.currentTimeMillis());
for (int i = 0; i < allItems.size(); i++) {
DisplayItemWithGroupBean diwb = allItems.get(i);
// from executing writeToDB.
if (diwb.isInGroup()) {
List<DisplayItemGroupBean> dgbs = diwb.getItemGroups();
// using the above gets us the correct number of manual groups, tbh 01/2010
List<DisplayItemGroupBean> dbGroups = diwb.getDbItemGroups();
LOGGER.debug("item group size: " + dgbs.size());
LOGGER.debug("item db-group size: " + dbGroups.size());
for (int j = 0; j < dgbs.size(); j++) {
DisplayItemGroupBean displayGroup = dgbs.get(j);
List<DisplayItemBean> items = displayGroup.getItems();
// this ordinal will only useful to create a new
// item data
// update an item data won't touch its ordinal
// int nextOrdinal = iddao.getMaxOrdinalForGroup(ecb, sb, displayGroup.getItemGroupBean()) + 1;
// Determine if any items in this group have data. If so we need to undelete and previously deleted items.
boolean undelete = false;
for (DisplayItemBean displayItem : items) {
String currItemVal = displayItem.getData().getValue();
if (currItemVal != null && !currItemVal.equals("")) {
undelete = true;
break;
}
}
for (DisplayItemBean displayItem : items) {
String fileName = this.addAttachedFilePath(displayItem, attachedFilePath);
boolean writeDN = true;
displayItem.setEditFlag(displayGroup.getEditFlag());
LOGGER.debug("group item value: " + displayItem.getData().getValue());
// if ("add".equalsIgnoreCase(displayItem.getEditFlag()) && fileName.length() > 0 && !newUploadedFiles.containsKey(fileName)) {
// displayItem.getData().setValue("");
// }
//15350, this particular logic, takes into consideration that a DN is created properly as long as the item data record exists and it fails to get created when it doesnt.
//so, we are expanding the logic from writeToDb method to avoid creating duplicate records.
writeDN = writeDN(displayItem);
//pulling from dataset instead of database and correcting the flawed logic of using the database ordinals as max ordinal...
nextOrdinal = displayItem.getData().getOrdinal();
temp = writeToDB(displayItem, iddao, nextOrdinal, request);
LOGGER.debug("just executed writeToDB - 1");
LOGGER.debug("next ordinal: " + nextOrdinal);
// Undelete item if any item in the repeating group has data.
if (undelete && displayItem.getDbData() != null && displayItem.getDbData().isDeleted()) {
iddao.undelete(displayItem.getDbData().getId(), ub.getId());
}
if (temp && newUploadedFiles.containsKey(fileName)) {
newUploadedFiles.remove(fileName);
}
// maybe put ordinal in the place of j? maybe subtract max rows from next ordinal if j is gt
// next ordinal?
String inputName = getGroupItemInputName(displayGroup, j, displayItem);
// String inputName2 = getGroupItemManualInputName(displayGroup, j, displayItem);
if (!displayGroup.isAuto()) {
LOGGER.trace("not auto");
inputName = this.getGroupItemManualInputName(displayGroup, j, displayItem);
}
//htaycher last DN is not stored for new rows
// if (j == dgbs.size() - 1) {
// // LAST ONE
// logger.trace("last one");
// int ordinal = j - this.getManualRows(dgbs);
// logger.debug("+++ found manual rows from line 1326: " + ordinal);
// inputName = getGroupItemInputName(displayGroup, ordinal, displayItem);
// }
// logger.trace("&&& we get previous looking at input name: " + inputName + " " + inputName2);
LOGGER.trace("&&& we get previous looking at input name: " + inputName);
// input name 2 removed from below
inputName = displayItem.getFieldName();
if (writeDN) {
AddNewSubjectServlet.saveFieldNotes(inputName, fdn, dndao, displayItem.getData().getId(), "itemData", currentStudy, ecb.getId());
}
success = success && temp;
}
}
for (int j = 0; j < dbGroups.size(); j++) {
DisplayItemGroupBean displayGroup = dbGroups.get(j);
//JN: Since remove button is gone, the following code can be commented out, however it needs to be tested? Can be tackled when handling discrepancy note w/repeating groups issues.
if ("remove".equalsIgnoreCase(displayGroup.getEditFlag())) {
List<DisplayItemBean> items = displayGroup.getItems();
for (DisplayItemBean displayItem : items) {
String fileName = this.addAttachedFilePath(displayItem, attachedFilePath);
displayItem.setEditFlag(displayGroup.getEditFlag());
LOGGER.debug("group item value: " + displayItem.getData().getValue());
// if ("add".equalsIgnoreCase(displayItem.getEditFlag()) && fileName.length() > 0 && !newUploadedFiles.containsKey(fileName)) {
// displayItem.getData().setValue("");
// }
temp = writeToDB(displayItem, iddao, 0, request);
LOGGER.debug("just executed writeToDB - 2");
if (temp && newUploadedFiles.containsKey(fileName)) {
newUploadedFiles.remove(fileName);
}
// just use 0 here since update doesn't
// touch ordinal
success = success && temp;
}
}
}
} else {
DisplayItemBean dib = diwb.getSingleItem();
// TODO work on this line
// this.addAttachedFilePath(dib, attachedFilePath);
String fileName = addAttachedFilePath(dib, attachedFilePath);
boolean writeDN = writeDN(dib);
temp = writeToDB(dib, iddao, 1, request);
LOGGER.debug("just executed writeToDB - 3");
if (temp && (newUploadedFiles.containsKey(dib.getItem().getId() + "") || newUploadedFiles.containsKey(fileName))) {
// so newUploadedFiles will contain only failed file
// items;
newUploadedFiles.remove(dib.getItem().getId() + "");
newUploadedFiles.remove(fileName);
}
String inputName = getInputName(dib);
LOGGER.trace("3 - found input name: " + inputName);
if (writeDN)
AddNewSubjectServlet.saveFieldNotes(inputName, fdn, dndao, dib.getData().getId(), "itemData", currentStudy, ecb.getId());
success = success && temp;
ArrayList childItems = dib.getChildren();
for (int j = 0; j < childItems.size(); j++) {
DisplayItemBean child = (DisplayItemBean) childItems.get(j);
this.addAttachedFilePath(child, attachedFilePath);
writeDN = writeDN(child);
temp = writeToDB(child, iddao, 1, request);
LOGGER.debug("just executed writeToDB - 4");
if (temp && newUploadedFiles.containsKey(child.getItem().getId() + "")) {
// so newUploadedFiles will contain only failed
// file items;
newUploadedFiles.remove(child.getItem().getId() + "");
}
inputName = getInputName(child);
if (writeDN)
AddNewSubjectServlet.saveFieldNotes(inputName, fdn, dndao, child.getData().getId(), "itemData", currentStudy, ecb.getId());
success = success && temp;
}
}
}
logMe("DisplayItemWithGroupBean allitems4 end " + System.currentTimeMillis());
LOGGER.debug("running rules: " + phase2.name());
List<Integer> prevShownDynItemDataIds = shouldRunRules ? this.getItemMetadataService().getDynamicsItemFormMetadataDao().findShowItemDataIdsInSection(section.getSection().getId(), ecb.getCRFVersionId(), ecb.getId()) : new ArrayList<Integer>();
logMe("DisplayItemWithGroupBean dryrun start" + System.currentTimeMillis());
HashMap<String, ArrayList<String>> rulesPostDryRun = runRules(allItems, ruleSets, false, shouldRunRules, MessageType.WARNING, phase2, ecb, request);
HashMap<String, ArrayList<String>> errorsPostDryRun = new HashMap<String, ArrayList<String>>();
// additional step needed, run rules and see if any items are 'shown' AFTER saving data
logMe("DisplayItemWithGroupBean dryrun end" + System.currentTimeMillis());
boolean inSameSection = false;
logMe("DisplayItemWithGroupBean allitems4 " + System.currentTimeMillis());
if (!rulesPostDryRun.isEmpty()) {
// in same section?
// iterate through the OIDs and see if any of them belong to this section
Iterator iter3 = rulesPostDryRun.keySet().iterator();
while (iter3.hasNext()) {
String fieldName = iter3.next().toString();
LOGGER.debug("found oid after post dry run " + fieldName);
// set up a listing of OIDs in the section
// BUT: Oids can have the group name in them.
int ordinal = -1;
String newFieldName = fieldName;
String[] fieldNames = fieldName.split("\\.");
if (fieldNames.length == 2) {
newFieldName = fieldNames[1];
// check items in item groups here?
if (fieldNames[0].contains("[")) {
int p1 = fieldNames[0].indexOf("[");
int p2 = fieldNames[0].indexOf("]");
try {
ordinal = Integer.valueOf(fieldNames[0].substring(p1 + 1, p2));
} catch (NumberFormatException e) {
ordinal = -1;
}
fieldNames[0] = fieldNames[0].substring(0, p1);
}
}
List<DisplayItemWithGroupBean> displayGroupsWithItems = section.getDisplayItemGroups();
//ArrayList<DisplayItemBean> displayItems = section.getItems();
for (int i = 0; i < displayGroupsWithItems.size(); i++) {
DisplayItemWithGroupBean itemWithGroup = displayGroupsWithItems.get(i);
if (itemWithGroup.isInGroup()) {
LOGGER.debug("found group: " + fieldNames[0]);
// do something there
List<DisplayItemGroupBean> digbs = itemWithGroup.getItemGroups();
LOGGER.debug("digbs size: " + digbs.size());
for (int j = 0; j < digbs.size(); j++) {
DisplayItemGroupBean displayGroup = digbs.get(j);
if (displayGroup.getItemGroupBean().getOid().equals(fieldNames[0]) && displayGroup.getOrdinal() == ordinal - 1) {
List<DisplayItemBean> items = displayGroup.getItems();
for (int k = 0; k < items.size(); k++) {
DisplayItemBean dib = items.get(k);
if (dib.getItem().getOid().equals(newFieldName)) {
//inSameSection = true;
if (!dib.getMetadata().isShowItem()) {
LOGGER.debug("found item in group " + this.getGroupItemInputName(displayGroup, j, dib) + " vs. " + fieldName + " and is show item: " + dib.getMetadata().isShowItem());
dib.getMetadata().setShowItem(true);
}
if (prevShownDynItemDataIds == null || !prevShownDynItemDataIds.contains(dib.getData().getId())) {
inSameSection = true;
errorsPostDryRun.put(this.getGroupItemInputName(displayGroup, j, dib), rulesPostDryRun.get(fieldName));
}
}
items.set(k, dib);
}
displayGroup.setItems(items);
digbs.set(j, displayGroup);
}
}
itemWithGroup.setItemGroups(digbs);
} else {
DisplayItemBean displayItemBean = itemWithGroup.getSingleItem();
ItemBean itemBean = displayItemBean.getItem();
if (newFieldName.equals(itemBean.getOid())) {
//System.out.println("check run dynamics item check " + runDynamicsItemCheck(displayItemBean).getMetadata().isShowItem());
if (!displayItemBean.getMetadata().isShowItem()) {
// double check there?
LOGGER.debug("found item " + this.getInputName(displayItemBean) + " vs. " + fieldName + " and is show item: " + displayItemBean.getMetadata().isShowItem());
// if is repeating, use the other input name? no
displayItemBean.getMetadata().setShowItem(true);
if (prevShownDynItemDataIds == null || !prevShownDynItemDataIds.contains(displayItemBean.getData().getId())) {
inSameSection = true;
errorsPostDryRun.put(this.getInputName(displayItemBean), rulesPostDryRun.get(fieldName));
}
}
}
itemWithGroup.setSingleItem(displayItemBean);
}
displayGroupsWithItems.set(i, itemWithGroup);
}
logMe("DisplayItemWithGroupBean allitems4 end,begin" + System.currentTimeMillis());
// check groups
//List<DisplayItemGroupBean> itemGroups = new ArrayList<DisplayItemGroupBean>();
//itemGroups = section.getDisplayFormGroups();
// But in jsp: section.displayItemGroups.itemGroup.groupMetaBean.showGroup
List<DisplayItemWithGroupBean> itemGroups = section.getDisplayItemGroups();
// List<DisplayItemGroupBean> newItemGroups = new ArrayList<DisplayItemGroupBean>();
for (DisplayItemWithGroupBean itemGroup : itemGroups) {
DisplayItemGroupBean displayGroup = itemGroup.getItemGroup();
if (newFieldName.equals(displayGroup.getItemGroupBean().getOid())) {
if (!displayGroup.getGroupMetaBean().isShowGroup()) {
inSameSection = true;
LOGGER.debug("found itemgroup " + displayGroup.getItemGroupBean().getOid() + " vs. " + fieldName + " and is show item: " + displayGroup.getGroupMetaBean().isShowGroup());
// hmmm how to set highlighting for a group?
errorsPostDryRun.put(displayGroup.getItemGroupBean().getOid(), rulesPostDryRun.get(fieldName));
displayGroup.getGroupMetaBean().setShowGroup(true);
// add necessary rows to the display group here????
// we have to set the items in the itemGroup for the displayGroup
loadItemsWithGroupRows(itemGroup, sb, edcb, ecb, request);
}
}
// newItemGroups.add(displayGroup);
}
logMe("DisplayItemWithGroupBean allitems4 end,end" + System.currentTimeMillis());
// trying to reset the display form groups here, tbh
// section.setItems(displayItems);
section.setDisplayItemGroups(displayGroupsWithItems);
populateInstantOnChange(request.getSession(), ecb, section);
// section.setDisplayFormGroups(newDisplayBean.getDisplayFormGroups());
}
//
this.getItemMetadataService().updateGroupDynamicsInSection(displayItemWithGroups, section.getSection().getId(), ecb);
toc = TableOfContentsServlet.getDisplayBeanWithShownSections(getDataSource(), (DisplayTableOfContentsBean) request.getAttribute(TOC_DISPLAY), (DynamicsMetadataService) SpringServletAccess.getApplicationContext(getServletContext()).getBean("dynamicsMetadataService"));
request.setAttribute(TOC_DISPLAY, toc);
sectionIdsInToc = TableOfContentsServlet.sectionIdsInToc(toc);
sIndex = TableOfContentsServlet.sectionIndexInToc(section.getSection(), toc, sectionIdsInToc);
previousSec = this.prevSection(section.getSection(), ecb, toc, sIndex);
nextSec = this.nextSection(section.getSection(), ecb, toc, sIndex);
section.setFirstSection(!previousSec.isActive());
section.setLastSection(!nextSec.isActive());
//
// we need the following for repeating groups, tbh
// >> tbh 06/2010
// List<DisplayItemWithGroupBean> displayItemWithGroups2 = createItemWithGroups(section, hasGroup, eventDefinitionCRFId);
// section.setDisplayItemGroups(displayItemWithGroups2);
// if so, stay at this section
LOGGER.debug(" in same section: " + inSameSection);
if (inSameSection) {
// copy of one line from early on around line 400, forcing a re-show of the items
// section = getDisplayBean(hasGroup, true);// include all items, tbh
// below a copy of three lines from the if errors = true line, tbh 03/2010
String[] textFields = { INPUT_INTERVIEWER, INPUT_INTERVIEW_DATE };
fp.setCurrentStringValuesAsPreset(textFields);
setPresetValues(fp.getPresetValues(), request);
// below essetially a copy except for rulesPostDryRun
request.setAttribute(BEAN_DISPLAY, section);
request.setAttribute(BEAN_ANNOTATIONS, fp.getString(INPUT_ANNOTATIONS));
setInputMessages(errorsPostDryRun, request);
addPageMessage(respage.getString("your_answers_activated_hidden_items"), request);
request.setAttribute("hasError", "true");
request.setAttribute("hasShown", "true");
session.setAttribute(AddNewSubjectServlet.FORM_DISCREPANCY_NOTES_NAME, discNotes);
setUpPanel(section);
forwardPage(getJSPPage(), request, response);
}
}
if (!inSameSection) {
// else if not in same section, progress as usual
/*
toc =
TableOfContentsServlet.getDisplayBeanWithShownSections(getDataSource(), (DisplayTableOfContentsBean) request.getAttribute(TOC_DISPLAY),
(DynamicsMetadataService) SpringServletAccess.getApplicationContext(getServletContext()).getBean("dynamicsMetadataService"));
request.setAttribute(TOC_DISPLAY, toc);
sectionIdsInToc = TableOfContentsServlet.sectionIdsInToc(toc);
sIndex = TableOfContentsServlet.sectionIndexInToc(section.getSection(), toc, sectionIdsInToc);
previousSec = this.prevSection(section.getSection(), ecb, toc, sIndex);
nextSec = this.nextSection(section.getSection(), ecb, toc, sIndex);
section.setFirstSection(!previousSec.isActive());
section.setLastSection(!nextSec.isActive());
*/
// can we just forward page or do we actually need an ELSE here?
// yes, we do. tbh 05/03/2010
ArrayList<String> updateFailedItems = sc.redoCalculations(scoreItems, scoreItemdata, changedItems, itemOrdinals, sb.getId());
success = updateFailedItems.size() > 0 ? false : true;
// now check if CRF is marked complete
boolean markComplete = fp.getString(INPUT_MARK_COMPLETE).equals(VALUE_YES);
// if the CRF was marked
boolean markSuccessfully = false;
// successfully
if (markComplete && section.isLastSection()) {
LOGGER.debug("need to mark CRF as complete");
markSuccessfully = markCRFComplete(request);
LOGGER.debug("...marked CRF as complete: " + markSuccessfully);
if (!markSuccessfully) {
request.setAttribute(BEAN_DISPLAY, section);
request.setAttribute(BEAN_ANNOTATIONS, fp.getString(INPUT_ANNOTATIONS));
setUpPanel(section);
forwardPage(getJSPPage(), request, response);
return;
}
}
// now write the event crf bean to the database
String annotations = fp.getString(INPUT_ANNOTATIONS);
setEventCRFAnnotations(annotations, request);
Date now = new Date();
ecb.setUpdatedDate(now);
ecb.setUpdater(ub);
ecb = (EventCRFBean) ecdao.update(ecb);
success = success && ecb.isActive();
StudyEventDAO sedao = new StudyEventDAO(getDataSource());
StudyEventBean seb = (StudyEventBean) sedao.findByPK(ecb.getStudyEventId());
seb.setUpdatedDate(now);
seb.setUpdater(ub);
seb = (StudyEventBean) sedao.update(seb);
success = success && seb.isActive();
request.setAttribute(INPUT_IGNORE_PARAMETERS, Boolean.TRUE);
if (newUploadedFiles.size() > 0) {
if (this.unloadFiles(newUploadedFiles)) {
} else {
String missed = "";
Iterator iter = newUploadedFiles.keySet().iterator();
while (iter.hasNext()) {
missed += " " + newUploadedFiles.get(iter.next());
}
addPageMessage(respage.getString("uploaded_files_not_deleted_or_not_exist") + ": " + missed, request);
}
}
if (!success) {
// YW, 3-6-2008 <<
if (updateFailedItems.size() > 0) {
String mess = "";
for (String ss : updateFailedItems) {
mess += ss + ", ";
}
mess = mess.substring(0, mess.length() - 2);
addPageMessage(resexception.getString("item_save_failed_because_database_error") + mess, request);
} else {
// YW>>
addPageMessage(resexception.getString("database_error"), request);
}
request.setAttribute(BEAN_DISPLAY, section);
session.removeAttribute(GROUP_HAS_DATA);
session.removeAttribute(HAS_DATA_FLAG);
session.removeAttribute(DDE_PROGESS);
session.removeAttribute(AddNewSubjectServlet.FORM_DISCREPANCY_NOTES_NAME);
LOGGER.debug("try to remove to_create_crf");
session.removeAttribute("to_create_crf");
session.removeAttribute(instantAtt);
// forwardPage(Page.SUBMIT_DATA_SERVLET);
forwardPage(Page.LIST_STUDY_SUBJECTS_SERVLET, request, response);
// >> changed tbh, 06/2009
} else {
boolean forwardingSucceeded = false;
if (!fp.getString(GO_PREVIOUS).equals("")) {
if (previousSec.isActive()) {
forwardingSucceeded = true;
request.setAttribute(INPUT_EVENT_CRF, ecb);
request.setAttribute(INPUT_SECTION, previousSec);
int tabNum = 0;
if (fp.getString("tab") == null) {
tabNum = 1;
} else {
tabNum = fp.getInt("tab");
}
request.setAttribute("tab", new Integer(tabNum - 1).toString());
// forwardPage(getServletPage(request), request, response);
getServletContext().getRequestDispatcher(getServletPage(request)).forward(request, response);
}
} else if (!fp.getString(GO_NEXT).equals("")) {
if (nextSec.isActive()) {
forwardingSucceeded = true;
request.setAttribute(INPUT_EVENT_CRF, ecb);
request.setAttribute(INPUT_SECTION, nextSec);
int tabNum = 0;
if (fp.getString("tab") == null) {
tabNum = 1;
} else {
tabNum = fp.getInt("tab");
}
request.setAttribute("tab", new Integer(tabNum + 1).toString());
getServletContext().getRequestDispatcher(getServletPage(request)).forward(request, response);
//forwardPage(getServletPage(request), request, response);
}
}
if (!forwardingSucceeded) {
// ecb);
if (markSuccessfully) {
addPageMessage(respage.getString("data_saved_CRF_marked_complete"), request);
session.removeAttribute(AddNewSubjectServlet.FORM_DISCREPANCY_NOTES_NAME);
session.removeAttribute(GROUP_HAS_DATA);
session.removeAttribute(HAS_DATA_FLAG);
session.removeAttribute(DDE_PROGESS);
session.removeAttribute("to_create_crf");
request.setAttribute("eventId", new Integer(ecb.getStudyEventId()).toString());
forwardPage(Page.ENTER_DATA_FOR_STUDY_EVENT_SERVLET, request, response);
} else {
// use clicked 'save'
addPageMessage(respage.getString("data_saved_continue_entering_edit_later"), request);
request.setAttribute(INPUT_EVENT_CRF, ecb);
request.setAttribute(INPUT_EVENT_CRF_ID, new Integer(ecb.getId()).toString());
// is not the last section
if (!section.isLastSection()) {
request.setAttribute(INPUT_SECTION, nextSec);
request.setAttribute(INPUT_SECTION_ID, new Integer(nextSec.getId()).toString());
session.removeAttribute("mayProcessUploading");
} else if (section.isLastSection()) {
//JN ADDED TO avoid return down
// already the last section, should go back to
// view event page
session.removeAttribute(GROUP_HAS_DATA);
session.removeAttribute(HAS_DATA_FLAG);
session.removeAttribute(DDE_PROGESS);
session.removeAttribute("to_create_crf");
session.removeAttribute("mayProcessUploading");
request.setAttribute("eventId", new Integer(ecb.getStudyEventId()).toString());
if (fromViewNotes != null && "1".equals(fromViewNotes)) {
String viewNotesPageFileName = (String) session.getAttribute("viewNotesPageFileName");
session.removeAttribute("viewNotesPageFileName");
session.removeAttribute("viewNotesURL");
if (viewNotesPageFileName != null && viewNotesPageFileName.length() > 0) {
// forwardPage(Page.setNewPage(viewNotesPageFileName, "View Notes"), request, response);
getServletContext().getRequestDispatcher(viewNotesPageFileName).forward(request, response);
}
}
session.removeAttribute(instantAtt);
forwardPage(Page.ENTER_DATA_FOR_STUDY_EVENT_SERVLET, request, response);
return;
}
int tabNum = 0;
if (fp.getString("tab") == null) {
tabNum = 1;
} else {
tabNum = fp.getInt("tab");
}
if (!section.isLastSection()) {
request.setAttribute("tab", new Integer(tabNum + 1).toString());
}
// forwardPage(getServletPage(request), request, response);
getServletContext().getRequestDispatcher(getServletPage(request)).forward(request, response);
}
// session.removeAttribute(AddNewSubjectServlet.
// FORM_DISCREPANCY_NOTES_NAME);
// forwardPage(Page.SUBMIT_DATA_SERVLET);
}
}
}
// end of if-block for dynamic rules not in same section, tbh 05/2010
}
// end of save
}
}
Aggregations