package org.akaza.openclinica.domain.rule.action;
import org.akaza.openclinica.bean.core.Status;
import org.akaza.openclinica.bean.login.UserAccountBean;
import org.akaza.openclinica.bean.managestudy.StudyBean;
import org.akaza.openclinica.bean.service.StudyParameterValueBean;
import org.akaza.openclinica.bean.submit.ItemDataBean;
import org.akaza.openclinica.dao.hibernate.RuleActionRunLogDao;
import org.akaza.openclinica.dao.managestudy.StudyDAO;
import org.akaza.openclinica.dao.service.StudyParameterValueDAO;
import org.akaza.openclinica.domain.rule.RuleSetBean;
import org.akaza.openclinica.domain.rule.RuleSetRuleBean;
import org.akaza.openclinica.logic.rulerunner.ExecutionMode;
import org.akaza.openclinica.logic.rulerunner.RuleRunner.RuleRunnerMode;
import org.akaza.openclinica.service.crfdata.DynamicsMetadataService;
import org.akaza.openclinica.service.pmanage.ParticipantPortalRegistrar;
import org.akaza.openclinica.service.pmanage.RandomizationRegistrar;
import org.akaza.openclinica.service.pmanage.SeRandomizationDTO;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.sql.DataSource;
public class RandomizeActionProcessor implements ActionProcessor {
DataSource ds;
DynamicsMetadataService itemMetadataService;
RuleActionRunLogDao ruleActionRunLogDao;
RuleSetBean ruleSet;
RuleSetRuleBean ruleSetRule;
StudyDAO sdao=null;
RandomizationRegistrar randomizationRegistrar=null ;
protected final Logger logger = LoggerFactory.getLogger(getClass().getName());
public RandomizeActionProcessor(DataSource ds, DynamicsMetadataService itemMetadataService, RuleActionRunLogDao ruleActionRunLogDao, RuleSetBean ruleSet,
RuleSetRuleBean ruleSetRule) {
this.itemMetadataService = itemMetadataService;
this.ruleSet = ruleSet;
this.ruleSetRule = ruleSetRule;
this.ruleActionRunLogDao = ruleActionRunLogDao;
this.ds = ds;
}
public RuleActionBean execute(RuleRunnerMode ruleRunnerMode, ExecutionMode executionMode, RuleActionBean ruleAction, ItemDataBean itemDataBean,
String itemData, StudyBean currentStudy, UserAccountBean ub, Object... arguments) {
switch (executionMode) {
case DRY_RUN: {
if (ruleRunnerMode == RuleRunnerMode.DATA_ENTRY) {
return null;
} else {
return ruleAction;
}
}
case SAVE: {
if (ruleRunnerMode == RuleRunnerMode.IMPORT_DATA) {
return saveWithStatusUpdated(ruleAction, itemDataBean, itemData, currentStudy, ub);
} else {
return save(ruleAction, itemDataBean, itemData, currentStudy, ub);
}
}
default:
return ruleAction;
}
}
private RuleActionBean saveWithStatusUpdated(RuleActionBean ruleAction, ItemDataBean itemDataBean, String itemData, StudyBean currentStudy, UserAccountBean ub) {
itemDataBean.setStatus(Status.UNAVAILABLE);
try {
if (mayProceed(currentStudy.getOid())){
getItemMetadataService().insert(itemDataBean, ((RandomizeActionBean) ruleAction).getProperties(), ub, ruleSet,((RandomizeActionBean) ruleAction).getStratificationFactors());
// ruleActionRunLogSaveOrUpdate(ruleAction, itemDataBean, itemData, currentStudy, ub);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return ruleAction;
}
private RuleActionBean save(RuleActionBean ruleAction, ItemDataBean itemDataBean, String itemData, StudyBean currentStudy, UserAccountBean ub) {
try {
if (mayProceed(currentStudy.getOid())){
getItemMetadataService().insert(itemDataBean.getId(), ((RandomizeActionBean) ruleAction).getProperties(), ub, ruleSet ,((RandomizeActionBean) ruleAction).getStratificationFactors());
// ruleActionRunLogSaveOrUpdate(ruleAction, itemDataBean, itemData, currentStudy, ub);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return ruleAction;
}
private void ruleActionRunLogSaveOrUpdate(RuleActionBean ruleAction, ItemDataBean itemDataBean, String itemData, StudyBean currentStudy, UserAccountBean ub) {
RuleActionRunLogBean ruleActionRunLog =
new RuleActionRunLogBean(ruleAction.getActionType(), itemDataBean, itemDataBean.getValue(), ruleSetRule.getRuleBean().getOid());
if (ruleActionRunLogDao.findCountByRuleActionRunLogBean(ruleActionRunLog) > 0) {
} else {
ruleActionRunLogDao.saveOrUpdate(ruleActionRunLog);
}
}
private RuleActionBean saveAndReturnMessage(RuleActionBean ruleAction, ItemDataBean itemDataBean, String itemData, StudyBean currentStudy,
UserAccountBean ub) {
//
return ruleAction;
}
private DynamicsMetadataService getItemMetadataService() {
return itemMetadataService;
}
private boolean mayProceed(String studyOid) throws Exception {
boolean accessPermission = false;
StudyBean siteStudy = getStudy(studyOid);
StudyBean study = getParentStudy(studyOid);
StudyParameterValueDAO spvdao = new StudyParameterValueDAO(ds);
StudyParameterValueBean pStatus = spvdao.findByHandleAndStudy(study.getId(), "randomization");
randomizationRegistrar = new RandomizationRegistrar();
SeRandomizationDTO seRandomizationDTO =randomizationRegistrar.getCachedRandomizationDTOObject(study.getOid().toString(),false);
String randomizationStatusFromOCUI =seRandomizationDTO.getStatus();
String randomizationStatusFromOC = pStatus.getValue().toString(); // enabled , disabled
String studyStatus = study.getStatus().getName().toString(); // available , pending , frozen , locked
String siteStatus = siteStudy.getStatus().getName().toString(); // available , pending , frozen , locked
System.out.println("randomizationStatusFromOCUI: " + randomizationStatusFromOCUI + " randomizationStatusFromOC: " + randomizationStatusFromOC + " studyStatus: " + studyStatus + " siteStatus: " + siteStatus);
logger.info("randomizationStatusFromOCUI: " + randomizationStatusFromOCUI + " randomizationStatusFromOC: " + randomizationStatusFromOC + " studyStatus: " + studyStatus + " siteStatus: " + siteStatus);
if (randomizationStatusFromOC.equalsIgnoreCase("enabled") && studyStatus.equalsIgnoreCase("available") && siteStatus.equalsIgnoreCase("available") && randomizationStatusFromOCUI.equalsIgnoreCase("ACTIVE")) {
accessPermission = true;
}
return accessPermission;
}
private StudyBean getStudy(String oid) {
sdao = new StudyDAO(ds);
StudyBean studyBean = (StudyBean) sdao.findByOid(oid);
return studyBean;
}
private StudyBean getParentStudy(String studyOid) {
StudyBean study = getStudy(studyOid);
if (study.getParentStudyId() == 0) {
return study;
} else {
StudyBean parentStudy = (StudyBean) sdao.findByPK(study.getParentStudyId());
return parentStudy;
}
}
}