package org.akaza.openclinica.controller;
import org.akaza.openclinica.bean.managestudy.EventDefinitionCRFBean;
import org.akaza.openclinica.bean.managestudy.StudyBean;
import org.akaza.openclinica.bean.managestudy.StudyEventBean;
import org.akaza.openclinica.bean.managestudy.StudyEventDefinitionBean;
import org.akaza.openclinica.bean.managestudy.StudySubjectBean;
import org.akaza.openclinica.bean.submit.CRFVersionBean;
import org.akaza.openclinica.bean.submit.EventCRFBean;
import org.akaza.openclinica.bean.submit.ItemBean;
import org.akaza.openclinica.bean.submit.ItemDataBean;
import org.akaza.openclinica.bean.submit.ItemGroupMetadataBean;
import org.akaza.openclinica.dao.admin.AuditDAO;
import org.akaza.openclinica.dao.admin.CRFDAO;
import org.akaza.openclinica.dao.core.CoreResources;
import org.akaza.openclinica.dao.login.UserAccountDAO;
import org.akaza.openclinica.dao.managestudy.EventDefinitionCRFDAO;
import org.akaza.openclinica.dao.managestudy.StudyDAO;
import org.akaza.openclinica.dao.managestudy.StudyEventDAO;
import org.akaza.openclinica.dao.managestudy.StudyEventDefinitionDAO;
import org.akaza.openclinica.dao.managestudy.StudySubjectDAO;
import org.akaza.openclinica.dao.submit.CRFVersionDAO;
import org.akaza.openclinica.dao.submit.EventCRFDAO;
import org.akaza.openclinica.dao.submit.ItemDAO;
import org.akaza.openclinica.dao.submit.ItemGroupMetadataDAO;
import org.akaza.openclinica.domain.rule.action.NotificationActionProcessor;
import org.akaza.openclinica.i18n.util.ResourceBundleProvider;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.HttpSessionRequiredException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.akaza.openclinica.view.StudyInfoPanel;
import java.sql.Connection;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.ResourceBundle;
import java.util.Set;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;
import org.akaza.openclinica.bean.admin.CRFBean;
import org.akaza.openclinica.bean.core.Role;
import org.akaza.openclinica.bean.core.Status;
import org.akaza.openclinica.bean.core.SubjectEventStatus;
import org.akaza.openclinica.bean.login.StudyUserRoleBean;
import org.akaza.openclinica.bean.login.UserAccountBean;
import org.cdisc.ns.odm.v130_api.ODM;
/**
* Implement the functionality for displaying a table of Event CRFs for Source Data
* Verification. This is an autowired, multiaction Controller.
*/
@Controller
@RequestMapping(value = "auth/api/v1/batchmigration")
@ResponseStatus(value = org.springframework.http.HttpStatus.INTERNAL_SERVER_ERROR)
public class CRFVersionMigrationBatchController {
@Autowired
private DataSource dataSource;
@Autowired
CoreResources coreResources;
protected final Logger logger = LoggerFactory.getLogger(getClass().getName());
ResourceBundle resword, resformat, respage;
HashMap<String, Object> hashMap = null;
HttpServletRequest request;
public CRFVersionMigrationBatchController() {
super();
}
public CRFVersionMigrationBatchController(HashMap<String, Object> hashMap, HttpServletRequest request) {
super();
this.hashMap = hashMap;
this.request = request;
}
@RequestMapping(value = "/", method = RequestMethod.POST)
public ResponseEntity<ArrayList<EventCRFBean>> runBatchCrfVersionMigration(@RequestBody HashMap<String, Object> hashMap, HttpServletRequest request)
throws Exception {
CRFVersionMigrationBatchController cmbController = new CRFVersionMigrationBatchController(hashMap, request);
ResourceBundleProvider.updateLocale(new Locale("en_US"));
System.out.println("I'm in run Batch CrfVersion Migration");
int eventCrfCount = 0;
boolean dryrun = Boolean.valueOf((String) hashMap.get("dryrun"));
String studyOid = (String) hashMap.get("studyOid");
String sourceCrfVersion = (String) hashMap.get("sourceCrfVersion");
String targetCrfVersion = (String) hashMap.get("targetCrfVersion");
ArrayList<String> studyEventDefnlist = (ArrayList<String>) hashMap.get("studyEventDefnlist");
ArrayList<String> sitelist = (ArrayList<String>) hashMap.get("sitelist");
ArrayList<EventCRFBean> migratableEventCrfs = new ArrayList<EventCRFBean>();
ArrayList<EventCRFBean> nonMigratableEventCrfs = new ArrayList<EventCRFBean>();
// May Proceed
EventCRFDAO<String, ArrayList> ecdao = new EventCRFDAO<String, ArrayList>(dataSource);
CRFVersionDAO<String, ArrayList> cvdao = new CRFVersionDAO<String, ArrayList>(dataSource);
StudyEventDAO sedao = new StudyEventDAO(dataSource);
StudyEventDefinitionDAO<String, ArrayList> seddao = new StudyEventDefinitionDAO<String, ArrayList>(dataSource);
StudySubjectDAO<String, ArrayList> ssdao = new StudySubjectDAO<String, ArrayList>(dataSource);
StudyDAO<String, ArrayList> sdao = new StudyDAO<String, ArrayList>(dataSource);
EventDefinitionCRFDAO edcdao = new EventDefinitionCRFDAO(dataSource);
UserAccountDAO uadao = new UserAccountDAO(dataSource);
CRFVersionBean sourceCrfVersionBean = cvdao.findByOid(sourceCrfVersion);
CRFVersionBean targetCrfVersionBean = cvdao.findByOid(targetCrfVersion);
StudyBean stBean = sdao.findByOid(studyOid);
if (stBean == null)
return new ResponseEntity<ArrayList<EventCRFBean>>(migratableEventCrfs, org.springframework.http.HttpStatus.NOT_ACCEPTABLE);
StudyUserRoleBean suRole = uadao.findRoleByUserNameAndStudyId(getCurrentUser(request).getName(), stBean.getId());
Role r = suRole.getRole();
if (suRole == null || !(r.equals(Role.STUDYDIRECTOR) || r.equals(Role.COORDINATOR)))
return new ResponseEntity<ArrayList<EventCRFBean>>(migratableEventCrfs, org.springframework.http.HttpStatus.NOT_ACCEPTABLE);
if (sourceCrfVersionBean == null || targetCrfVersionBean == null || sourceCrfVersionBean.getCrfId() != targetCrfVersionBean.getCrfId()
|| sourceCrfVersionBean.getId() == targetCrfVersionBean.getId() || sourceCrfVersionBean.getStatus().isUnavailable()
|| targetCrfVersionBean.getStatus().isUnavailable())
return new ResponseEntity<ArrayList<EventCRFBean>>(migratableEventCrfs, org.springframework.http.HttpStatus.NOT_ACCEPTABLE);
for (String site : sitelist) {
StudyBean siteBean = (StudyBean) sdao.findByOid(site);
if (siteBean == null || siteBean.getStatus().isUnavailable())
return new ResponseEntity<ArrayList<EventCRFBean>>(migratableEventCrfs, org.springframework.http.HttpStatus.NOT_ACCEPTABLE);
}
for (String studyEventDefn : studyEventDefnlist) {
StudyEventDefinitionBean sedefnBean = (StudyEventDefinitionBean) seddao.findByOid(studyEventDefn);
if (sedefnBean == null || sedefnBean.getStatus().isUnavailable())
return new ResponseEntity<ArrayList<EventCRFBean>>(migratableEventCrfs, org.springframework.http.HttpStatus.NOT_ACCEPTABLE);
}
ArrayList<EventCRFBean> eventCRFBeans = ecdao.findByCrfVersion(sourceCrfVersionBean);
for (EventCRFBean eventCRFBean : eventCRFBeans) {
StudySubjectBean ssBean = (StudySubjectBean) ssdao.findByPK(eventCRFBean.getStudySubjectId());
StudyBean sBean = (StudyBean) sdao.findByPK(ssBean.getStudyId());
StudyEventBean seBean = (StudyEventBean) sedao.findByPK(eventCRFBean.getStudyEventId());
StudyEventDefinitionBean sedBean = (StudyEventDefinitionBean) seddao.findByPK(seBean.getStudyEventDefinitionId());
EventDefinitionCRFBean edcBean = edcdao.findByStudyEventDefinitionIdAndCRFIdAndStudyId(sedBean.getId(), sourceCrfVersionBean.getCrfId(),
sBean.getId());
boolean sourceVersionPass = true;
boolean targetVersionPass = true;
if (edcBean != null) {
if (!edcBean.getSelectedVersionIds().equals("")) {
List<String> selectedVersions = new ArrayList<String>(Arrays.asList(edcBean.getSelectedVersionIds().split(",")));
sourceVersionPass = false;
targetVersionPass = false;
for (String selectedVersion : selectedVersions) {
if (selectedVersion.equals(String.valueOf(sourceCrfVersionBean.getId()))) {
sourceVersionPass = true;
}
if (selectedVersion.equals(String.valueOf(targetCrfVersionBean.getId()))) {
targetVersionPass = true;
}
}
if (!sourceVersionPass) {
System.out.println(sedBean.getOid() + " in " + sBean.getOid() + " source crf version not available for study_subject "
+ ssBean.getOid());
}
if (!targetVersionPass) {
System.out.println(sedBean.getOid() + " in " + sBean.getOid() + " target crf version not available for study_subject "
+ ssBean.getOid());
}
}
}
if (sourceVersionPass && targetVersionPass) {
if ((studyEventDefnlist.contains(sedBean.getOid()) || studyEventDefnlist.size() == 0)
&& (sitelist.contains(sBean.getOid()) || sitelist.size() == 0)) {
System.out.println("In List: " + ssBean.getOid() + " - " + sedBean.getOid() + " - " + sBean.getOid() + " - " + eventCRFBean.getId());
eventCrfCount++;
migratableEventCrfs.add(eventCRFBean);
} else {
System.out.println("Not In List: " + ssBean.getOid() + " - " + sedBean.getOid() + " - " + sBean.getOid() + " - " + eventCRFBean.getId());
nonMigratableEventCrfs.add(eventCRFBean);
}
}
}
if (!dryrun) {
for (EventCRFBean migratableEventCrf : migratableEventCrfs) {
executeMigrationAction(migratableEventCrf, targetCrfVersionBean, request);
}
}
return new ResponseEntity<ArrayList<EventCRFBean>>(migratableEventCrfs, org.springframework.http.HttpStatus.OK);
}
public void executeMigrationAction(EventCRFBean eventCRFBEan, CRFVersionBean targetCrfVersionBean, HttpServletRequest request) {
try {
EventCRFDAO event_crf_dao = new EventCRFDAO(dataSource);
StudyEventDAO sedao = new StudyEventDAO(dataSource);
EventCRFBean ev_bean = (EventCRFBean) event_crf_dao.findByPK(eventCRFBEan.getId());
StudyEventBean st_event_bean = (StudyEventBean) sedao.findByPK(ev_bean.getStudyEventId());
Connection con = dataSource.getConnection();
con.setAutoCommit(false);
event_crf_dao.updateCRFVersionID(eventCRFBEan.getId(), targetCrfVersionBean.getId(), getCurrentUser(request).getId(), null);
String status_before_update = null;
SubjectEventStatus eventStatus = null;
Status subjectStatus = null;
AuditDAO auditDao = new AuditDAO(dataSource);
// event signed, check if subject is signed as well
StudySubjectDAO studySubDao = new StudySubjectDAO(dataSource);
StudySubjectBean studySubBean = (StudySubjectBean) studySubDao.findByPK(st_event_bean.getStudySubjectId());
if (studySubBean.getStatus().isSigned()) {
status_before_update = auditDao.findLastStatus("study_subject", studySubBean.getId(), "8");
if (status_before_update != null && status_before_update.length() == 1) {
int subject_status = Integer.parseInt(status_before_update);
subjectStatus = Status.get(subject_status);
studySubBean.setStatus(subjectStatus);
}
studySubBean.setUpdater(getCurrentUser(request));
studySubDao.update(studySubBean, null);
}
st_event_bean.setUpdater(getCurrentUser(request));
st_event_bean.setUpdatedDate(new Date());
status_before_update = auditDao.findLastStatus("study_event", st_event_bean.getId(), "8");
if (status_before_update != null && status_before_update.length() == 1) {
int status = Integer.parseInt(status_before_update);
eventStatus = SubjectEventStatus.get(status);
st_event_bean.setSubjectEventStatus(eventStatus);
}
sedao.update(st_event_bean, null);
con.commit();
con.setAutoCommit(true);
con.close();
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
private UserAccountBean getCurrentUser(HttpServletRequest request) {
UserAccountBean ub = (UserAccountBean) request.getSession().getAttribute("userBean");
return ub;
}
}