/*
* OpenClinica is distributed under the
* GNU Lesser General Public License (GNU LGPL).
* For details see: http://www.openclinica.org/license
* copyright 2003-2005 Akaza Research
*/
package org.akaza.openclinica.control.submit;
import org.akaza.openclinica.bean.core.Status;
import org.akaza.openclinica.bean.managestudy.EventDefinitionCRFBean;
import org.akaza.openclinica.bean.submit.DisplayItemBean;
import org.akaza.openclinica.bean.submit.DisplayItemGroupBean;
import org.akaza.openclinica.bean.submit.EventCRFBean;
import org.akaza.openclinica.bean.submit.ItemBean;
import org.akaza.openclinica.control.form.DiscrepancyValidator;
import org.akaza.openclinica.control.form.FormProcessor;
import org.akaza.openclinica.control.form.RuleValidator;
import org.akaza.openclinica.core.form.StringUtil;
import org.akaza.openclinica.i18n.core.LocaleResolver;
import org.akaza.openclinica.view.Page;
import org.akaza.openclinica.web.InsufficientPermissionException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
* @author ssachs
*/
@Controller
@RequestMapping(value="/InitialDataEntry")
public class InitialDataEntryServlet extends DataEntryServlet {
protected final Logger logger = LoggerFactory.getLogger(getClass().getName());
Locale locale;
// < ResourceBundleresexception,respage;
/*
* (non-Javadoc)
*
* @see org.akaza.openclinica.control.core.SecureController#mayProceed()
*/
@Override
protected void mayProceed(HttpServletRequest request, HttpServletResponse response) throws InsufficientPermissionException {
mayAccess(request);
checkStudyLocked(Page.LIST_STUDY_SUBJECTS, respage.getString("current_study_locked"), request, response);
checkStudyFrozen(Page.LIST_STUDY_SUBJECTS, respage.getString("current_study_frozen"), request, response);
HttpSession session = request.getSession();
locale = LocaleResolver.getLocale(request);
session.setAttribute("mayProcessUploading", "true");
// <
// resexception=ResourceBundle.getBundle(
// "org.akaza.openclinica.i18n.exceptions",locale);
// < respage =
// ResourceBundle.getBundle("org.akaza.openclinica.i18n.page_messages",
// locale);
getInputBeans(request);
// Role r = currentRole.getRole();
//
// if (stage.equals(DataEntryStage.UNCOMPLETED)) {
// if (!SubmitDataServlet.maySubmitData(ub, currentRole)) {
// this.session.setAttribute("mayProcessUploading", "false");
// String exceptionName = resexception.getString("no_permission_to_perform_data_entry");
// String noAccessMessage =
// respage.getString("you_may_not_perform_data_entry_on_a_CRF") + respage.getString("change_study_contact_study_coordinator");
//
// addPageMessage(noAccessMessage);
// throw new InsufficientPermissionException(Page.MENU, exceptionName, "1");
// }
// } else if (stage.equals(DataEntryStage.INITIAL_DATA_ENTRY)) {
// if (ub.getId() != ecb.getOwnerId() && !r.equals(Role.STUDYDIRECTOR) && !r.equals(Role.COORDINATOR)) {
// UserAccountDAO udao = new UserAccountDAO(sm.getDataSource());
// String ownerName = ((UserAccountBean) udao.findByPK(ecb.getOwnerId())).getName();
// this.session.setAttribute("mayProcessUploading", "false");
// MessageFormat mf = new MessageFormat("");
// mf.applyPattern(respage.getString("you_may_not_perform_data_entry_on_event_CRF_because_not_owner"));
// Object[] arguments = { ownerName };
// addPageMessage(mf.format(arguments));
//
// throw new InsufficientPermissionException(Page.LIST_STUDY_SUBJECTS_SERVLET, resexception.getString("non_owner_attempting_DE_on_event"), "1");
// }
// } else {
// this.session.setAttribute("mayProcessUploading", "false");
// addPageMessage(respage.getString("you_not_enter_data_initial_DE_completed"));
// throw new InsufficientPermissionException(Page.LIST_STUDY_SUBJECTS_SERVLET, resexception.getString("using_IDE_event_CRF_completed"), "1");
// }
return;
}
/*
* (non-Javadoc)
*
* @seeorg.akaza.openclinica.control.submit.DataEntryServlet#
* validateInputOnFirstRound()
*/
@Override
protected boolean validateInputOnFirstRound() {
return true;
}
@Override
protected DisplayItemBean validateDisplayItemBean(DiscrepancyValidator v, DisplayItemBean dib, String inputName, RuleValidator rv,
HashMap<String, ArrayList<String>> groupOrdinalPLusItemOid, Boolean fireRuleValidation, ArrayList<String> messages, HttpServletRequest request) {
ItemBean ib = dib.getItem();
org.akaza.openclinica.bean.core.ResponseType rt = dib.getMetadata().getResponseSet().getResponseType();
// note that this step sets us up both for
// displaying the data on the form again, in the event of an error
// and sending the data to the database, in the event of no error
if (StringUtil.isBlank(inputName)) {// not an item from group, doesn't
// need to get data from form again
dib = loadFormValue(dib, request);
}
// types TEL and ED are not supported yet
if (rt.equals(org.akaza.openclinica.bean.core.ResponseType.TEXT) || rt.equals(org.akaza.openclinica.bean.core.ResponseType.TEXTAREA)) {
// dib = validateDisplayItemBeanText(v, dib, inputName);
} else if (rt.equals(org.akaza.openclinica.bean.core.ResponseType.RADIO) || rt.equals(org.akaza.openclinica.bean.core.ResponseType.SELECT)) {
// dib = validateDisplayItemBeanSingleCV(v, dib, inputName);
}
if (groupOrdinalPLusItemOid.containsKey(dib.getItem().getOid()) || fireRuleValidation) {
messages = messages == null ? groupOrdinalPLusItemOid.get(dib.getItem().getOid()) : messages;
dib = validateDisplayItemBeanSingleCV(rv, dib, inputName, messages);
}
// I_AGEN_DOSEDATE64
return dib;
}
@Override
protected List<DisplayItemGroupBean> validateDisplayItemGroupBean(DiscrepancyValidator v, DisplayItemGroupBean digb, List<DisplayItemGroupBean> digbs,
List<DisplayItemGroupBean> formGroups, RuleValidator rv, HashMap<String, ArrayList<String>> groupOrdinalPLusItemOid, HttpServletRequest request, HttpServletResponse response) {
EventDefinitionCRFBean edcb = (EventDefinitionCRFBean)request.getAttribute(EVENT_DEF_CRF_BEAN);
formGroups = loadFormValueForItemGroup(digb, digbs, formGroups, edcb.getId(), request);
String inputName = "";
for (int i = 0; i < formGroups.size(); i++) {
DisplayItemGroupBean displayGroup = formGroups.get(i);
List<DisplayItemBean> items = displayGroup.getItems();
int order = displayGroup.getOrdinal();
if (displayGroup.isAuto() && displayGroup.getFormInputOrdinal() > 0) {
order = displayGroup.getFormInputOrdinal();
}
for (DisplayItemBean displayItem : items) {
// int manualcount = 0;
// tbh trying to set this correctly 01/2010
if (displayGroup.isAuto()) {
inputName = getGroupItemInputName(displayGroup, order, displayItem);
} else {
inputName = getGroupItemManualInputName(displayGroup, order, displayItem);
// manualcount++;
}
logger.debug("THe oid is " + displayItem.getItem().getOid() + " order : " + order + " inputName : " + inputName);
if (groupOrdinalPLusItemOid.containsKey(displayItem.getItem().getOid())
|| groupOrdinalPLusItemOid.containsKey(String.valueOf(displayGroup.getIndex() + 1) + displayItem.getItem().getOid())) {
logger.debug("IN : " + String.valueOf(displayGroup.getIndex() + 1) + displayItem.getItem().getOid());
validateDisplayItemBean(v, displayItem, inputName, rv, groupOrdinalPLusItemOid, true, groupOrdinalPLusItemOid.get(String
.valueOf(displayGroup.getIndex() + 1)
+ displayItem.getItem().getOid()), request);
} else {
validateDisplayItemBean(v, displayItem, inputName, rv, groupOrdinalPLusItemOid, false, null, request);
}
}
}
return formGroups;
}
/*
* (non-Javadoc)
*
* @see
* org.akaza.openclinica.control.submit.DataEntryServlet#validateDisplayItemBean
* (org.akaza.openclinica.core.form.Validator,
* org.akaza.openclinica.bean.submit.DisplayItemBean)
*/
@Override
protected DisplayItemBean validateDisplayItemBean(DiscrepancyValidator v, DisplayItemBean dib, String inputName, HttpServletRequest request) {
ItemBean ib = dib.getItem();
org.akaza.openclinica.bean.core.ResponseType rt = dib.getMetadata().getResponseSet().getResponseType();
// note that this step sets us up both for
// displaying the data on the form again, in the event of an error
// and sending the data to the database, in the event of no error
if (StringUtil.isBlank(inputName)) {// not an item from group, doesn't
// need to get data from form again
dib = loadFormValue(dib, request);
}
// types TEL and ED are not supported yet
if (rt.equals(org.akaza.openclinica.bean.core.ResponseType.TEXT) || rt.equals(org.akaza.openclinica.bean.core.ResponseType.TEXTAREA) ||
rt.equals(org.akaza.openclinica.bean.core.ResponseType.FILE)) {
dib = validateDisplayItemBeanText(v, dib, inputName, request);
} else if (rt.equals(org.akaza.openclinica.bean.core.ResponseType.RADIO) || rt.equals(org.akaza.openclinica.bean.core.ResponseType.SELECT)) {
dib = validateDisplayItemBeanSingleCV(v, dib, inputName);
} else if (rt.equals(org.akaza.openclinica.bean.core.ResponseType.CHECKBOX) || rt.equals(org.akaza.openclinica.bean.core.ResponseType.SELECTMULTI)) {
dib = validateDisplayItemBeanMultipleCV(v, dib, inputName);
}
logger.debug("just ran validate display item bean on " + inputName);
return dib;
}
@Override
protected List<DisplayItemGroupBean> validateDisplayItemGroupBean(DiscrepancyValidator v, DisplayItemGroupBean digb, List<DisplayItemGroupBean> digbs,
List<DisplayItemGroupBean> formGroups, HttpServletRequest request, HttpServletResponse response) {
EventDefinitionCRFBean edcb = (EventDefinitionCRFBean)request.getAttribute(EVENT_DEF_CRF_BEAN);
formGroups = loadFormValueForItemGroup(digb, digbs, formGroups, edcb.getId(), request);
String inputName = "";
for (int i = 0; i < formGroups.size(); i++) {
DisplayItemGroupBean displayGroup = formGroups.get(i);
List<DisplayItemBean> items = displayGroup.getItems();
int order = displayGroup.getOrdinal();
if (displayGroup.isAuto() && displayGroup.getFormInputOrdinal() > 0) {
order = displayGroup.getFormInputOrdinal();
}
for (DisplayItemBean displayItem : items) {
if (displayGroup.isAuto()) {
inputName = getGroupItemInputName(displayGroup, order, displayItem);
} else {
inputName = getGroupItemManualInputName(displayGroup, order, displayItem);
}
validateDisplayItemBean(v, displayItem, inputName, request);
}
}
return formGroups;
}
/*
* (non-Javadoc)
*
* @see
* org.akaza.openclinica.control.submit.DataEntryServlet#getBlankItemStatus
* ()
*/
@Override
protected Status getBlankItemStatus() {
return Status.AVAILABLE;
}
/*
* (non-Javadoc)
*
* @see
* org.akaza.openclinica.control.submit.DataEntryServlet#getNonBlankItemStatus
* ()
*/
@Override
protected Status getNonBlankItemStatus(HttpServletRequest request) {
EventDefinitionCRFBean edcb = (EventDefinitionCRFBean)request.getAttribute(EVENT_DEF_CRF_BEAN);
return edcb.isDoubleEntry() ? Status.PENDING : Status.UNAVAILABLE;
}
/*
* (non-Javadoc)
*
* @see
* org.akaza.openclinica.control.submit.DataEntryServlet#getEventCRFAnnotations
* ()
*/
@Override
protected String getEventCRFAnnotations(HttpServletRequest request) {
EventCRFBean ecb = (EventCRFBean)request.getAttribute(INPUT_EVENT_CRF);
return ecb.getAnnotations();
}
/*
* (non-Javadoc)
*
* @see
* org.akaza.openclinica.control.submit.DataEntryServlet#setEventCRFAnnotations
* (java.lang.String)
*/
@Override
protected void setEventCRFAnnotations(String annotations, HttpServletRequest request) {
EventCRFBean ecb = (EventCRFBean)request.getAttribute(INPUT_EVENT_CRF);
ecb.setAnnotations(annotations);
}
/*
* (non-Javadoc)
*
* @see org.akaza.openclinica.control.submit.DataEntryServlet#getJSPPage()
*/
@Override
protected Page getJSPPage() {
// request.setAttribute("newtable","y");
return Page.INITIAL_DATA_ENTRY_NW;
}
/*
* (non-Javadoc)
*
* @see
* org.akaza.openclinica.control.submit.DataEntryServlet#getServletPage()
*/
@Override
protected String getServletPage(HttpServletRequest request) {
FormProcessor fp = new FormProcessor(request);
String tabId = fp.getString("tab", true);
String sectionId = fp.getString(DataEntryServlet.INPUT_SECTION_ID, true);
String eventCRFId = fp.getString(INPUT_EVENT_CRF_ID, true);
if (StringUtil.isBlank(sectionId) || StringUtil.isBlank(tabId)) {
return Page.INITIAL_DATA_ENTRY_SERVLET.getFileName();
} else {
Page target = Page.INITIAL_DATA_ENTRY_SERVLET;
return target.getFileName() + "?eventCRFId=" + eventCRFId + "§ionId=" + sectionId + "&tab=" + tabId;
//return target.getFileName()+;
}
}
/*
* (non-Javadoc)
*
* @see org.akaza.openclinica.control.submit.DataEntryServlet#loadDBValues()
*/
@Override
protected boolean shouldLoadDBValues(DisplayItemBean dib) {
return true;
}
@Override
protected boolean shouldRunRules() {
return true;
}
@Override
protected boolean isAdministrativeEditing() {
return false;
}
@Override
protected boolean isAdminForcedReasonForChange(HttpServletRequest request) {
return false;
}
}