/*
* 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 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;
import org.akaza.openclinica.bean.core.DataEntryStage;
import org.akaza.openclinica.bean.core.Role;
import org.akaza.openclinica.bean.core.Status;
import org.akaza.openclinica.bean.login.StudyUserRoleBean;
import org.akaza.openclinica.bean.login.UserAccountBean;
import org.akaza.openclinica.bean.managestudy.EventDefinitionCRFBean;
import org.akaza.openclinica.bean.managestudy.StudyBean;
import org.akaza.openclinica.bean.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.control.managestudy.ViewNotesServlet;
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;
/**
* @author jxu
*
* Performs 'administrative editing' action for study director/study
* coordinator
*/
public class AdministrativeEditingServlet extends DataEntryServlet {
private static final Logger LOGGER = LoggerFactory.getLogger(AdministrativeEditingServlet.class);
Locale locale;
// < ResourceBundleresexception,respage;
/*
* (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.ADMIN_EDIT_SERVLET.getFileName();
} else {
Page target = Page.ADMIN_EDIT_SERVLET;
String s = target.getFileName().trim();
String url=null ;
if(s.contains("?")) {
String[] t = s.split("\\?");
String x = "";
String y = t[0] + "?";
if(t.length>1) {
if(t[1].contains("&")) {
String[] ts = t[1].split("&");
for(int i=0; i<ts.length; ++i) {
if(ts[i].contains("eventCRFId=")) {
ts[i] = "eventCRFId=" + eventCRFId;
x += "e";
} else if(ts[i].contains("sectionId=")) {
ts[i] = "sectionId=" + sectionId;
x += "s";
} else if(ts[i].contains("tab=")) {
ts[i] = "tab=" + tabId;
x += "t";
}
y += ts[i] + "&";
}
} else {
if(t[1].contains("eventCRFId=")) {
t[1] = "eventCRFId=" + eventCRFId;
x += "e";
} else if(t[1].contains("sectionId=")) {
t[1] = "sectionId=" + sectionId;
x += "s";
} else if(t[1].contains("tab=")) {
t[1] = "tab=" + tabId;
x += "t";
}
y += t[1]+"&";
}
if(x.length()<3) {
if(!x.contains("e")) {
y += "eventCRFId=" + eventCRFId + "&";
}
if(!x.contains("s")) {
y += "sectionId=" + sectionId + "&";
}
if(!x.contains("t")) {
y += "tab=" + tabId + "&";
}
}
y = y.substring(0,y.length()-1);
//target.setFileName(y);
url = y;
} else {
LOGGER.info("It's a wrong servlet page:" + s);
}
}else {
//target.setFileName(target.getFileName() + "?eventCRFId=" + eventCRFId + "§ionId=" + sectionId + "&tab=" + tabId);
url = target.getFileName() + "?eventCRFId=" + eventCRFId + "§ionId=" + sectionId + "&tab=" + tabId;
}
//target.setFileName(target.getFileName() + "?eventCRFId=" + eventCRFId + "§ionId=" + sectionId + "&tab=" + tabId);
return url;
}
}
/*
* (non-Javadoc)
*
* @see org.akaza.openclinica.control.submit.DataEntryServlet#getJSPPage()
*/
@Override
protected Page getJSPPage() {
return Page.ADMIN_EDIT;
}
/*
* (non-Javadoc)
*
* @seeorg.akaza.openclinica.control.submit.DataEntryServlet#
* validateInputOnFirstRound()
*/
@Override
protected boolean validateInputOnFirstRound() {
return true;
}
/*
* (non-Javadoc)
*
* @see org.akaza.openclinica.control.core.SecureController#mayProceed()
*/
@Override
protected void mayProceed(HttpServletRequest request, HttpServletResponse response) throws InsufficientPermissionException {
mayAccess(request);
locale = LocaleResolver.getLocale(request);
HttpSession session = request.getSession();
FormProcessor fp = new FormProcessor(request);
UserAccountBean ub =(UserAccountBean) request.getSession().getAttribute(USER_BEAN_NAME);
StudyUserRoleBean currentRole = (StudyUserRoleBean) request.getSession().getAttribute("userRole");
// <
// resexception=ResourceBundle.getBundle(
// "org.akaza.openclinica.i18n.exceptions",locale);
// < respage =
// ResourceBundle.getBundle("org.akaza.openclinica.i18n.page_messages",
// locale);
getInputBeans(request);
EventCRFBean ecb = (EventCRFBean)request.getAttribute(INPUT_EVENT_CRF);
String fromResolvingNotes = fp.getString("fromResolvingNotes", true);
if (StringUtil.isBlank(fromResolvingNotes)) {
session.removeAttribute(ViewNotesServlet.WIN_LOCATION);
session.removeAttribute(ViewNotesServlet.NOTES_TABLE);
checkStudyLocked(Page.LIST_STUDY_SUBJECTS, respage.getString("current_study_locked"), request, response);
checkStudyFrozen(Page.LIST_STUDY_SUBJECTS, respage.getString("current_study_frozen"), request, response);
}
request.setAttribute("fromResolvingNotes", fromResolvingNotes);
LOGGER.debug(" +++++++++++++++++++ " + ecb.getStudyEventId());
// StudyEventDAO sedao = new StudyEventDAO(sm.getDataSource());
// StudyEventBean sEvent = (StudyEventBean)
// sedao.findByPK(ecb.getStudyEventId());
// if (sEvent.getSubjectEventStatus().equals(SubjectEventStatus.SIGNED))
// {
// sEvent.setSubjectEventStatus(SubjectEventStatus.COMPLETED);
// sEvent.setUpdater(ub);
// sEvent.setUpdatedDate(new Date());
// sedao.update(sEvent);
// }
DataEntryStage stage = ecb.getStage();
Role r = currentRole.getRole();
session.setAttribute("mayProcessUploading", "true");
if (!SubmitDataServlet.maySubmitData(ub, currentRole)) {
session.setAttribute("mayProcessUploading", "false");
String exceptionName = resexception.getString("no_permission_validation");
String noAccessMessage = respage.getString("not_perform_administrative_editing_CRF");
addPageMessage(noAccessMessage, request);
throw new InsufficientPermissionException(Page.MENU, exceptionName, "1");
}
LOGGER.info("stage name:" + stage.getName());
if (stage.equals(DataEntryStage.DOUBLE_DATA_ENTRY_COMPLETE)) {
// if (!r.equals(Role.STUDYDIRECTOR) && !r.equals(Role.COORDINATOR))
// {
if (r.equals(Role.MONITOR)) {
session.setAttribute("mayProcessUploading", "false");
addPageMessage(respage.getString("no_have_correct_privilege_current_study") + respage.getString("change_study_contact_sysadmin"), request);
throw new InsufficientPermissionException(Page.LIST_STUDY_SUBJECTS_SERVLET, resexception.getString("no_permission_administrative_editing"), "1");
}
}
else {
session.setAttribute("mayProcessUploading", "false");
addPageMessage(respage.getString("not_perform_administrative_editing_because"), request);
throw new InsufficientPermissionException(Page.LIST_STUDY_SUBJECTS_SERVLET, resexception.getString("not_correct_stage"), "1");
}
return;
}
/*
* (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#loadDBValues()
*/
@Override
protected boolean shouldLoadDBValues(DisplayItemBean dib) {
// logger.info("dib" + dib.getData().getValue());
if (dib.getData().getStatus() == null) {
return true;
}
if (!Status.UNAVAILABLE.equals(dib.getData().getStatus())) {
return false;
}
return true;
}
/*
* (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);
}
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;
}
@Override
protected DisplayItemBean validateDisplayItemBean(DiscrepancyValidator v, DisplayItemBean dib, String inputName, RuleValidator rv,
HashMap<String, ArrayList<String>> groupOrdinalPLusItemOid, Boolean fireRuleValidation, ArrayList<String> messages, HttpServletRequest request) {
if (StringUtil.isBlank(inputName)) {// we pass a blank inputName,which
// means if not an item from group,
// doesn't
// need to get data from form again
dib = loadFormValue(dib, request);
}
if (groupOrdinalPLusItemOid.containsKey(dib.getItem().getOid()) || fireRuleValidation) {
messages = messages == null ? groupOrdinalPLusItemOid.get(dib.getItem().getOid()) : messages;
dib = validateDisplayItemBeanSingleCV(rv, dib, inputName, messages);
}
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#getBlankItemStatus
* ()
*/
@Override
protected Status getBlankItemStatus() {
return Status.UNAVAILABLE;
}
/*
* (non-Javadoc)
*
* @see
* org.akaza.openclinica.control.submit.DataEntryServlet#getNonBlankItemStatus
* ()
*/
@Override
protected Status getNonBlankItemStatus(HttpServletRequest request) {
return 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();
}
@Override
protected boolean shouldRunRules() {
return false;
}
@Override
protected boolean isAdministrativeEditing() {
return true;
}
@Override
protected boolean isAdminForcedReasonForChange(HttpServletRequest request) {
// StudyParameterValueDAO spvdao = new
// StudyParameterValueDAO(sm.getDataSource());
// ArrayList studyParameters =
// spvdao.findParamConfigByStudy(currentStudy);
// currentStudy.setStudyParameters(studyParameters);
// refresh study params here, tbh 06/2009
StudyBean currentStudy = (StudyBean) request.getSession().getAttribute("study");
if (currentStudy.getStudyParameterConfig().getAdminForcedReasonForChange().equals("true")) {
LOGGER.debug("returning true for forced reason for change");
return true;
} else {
return false;
}
}
}