package org.akaza.openclinica.bean.rule;
import java.util.ArrayList;
import java.util.Date;
import org.akaza.openclinica.bean.login.UserAccountBean;
import org.akaza.openclinica.bean.managestudy.DiscrepancyNoteBean;
import org.akaza.openclinica.bean.managestudy.StudyBean;
import org.akaza.openclinica.bean.submit.EventCRFBean;
import org.akaza.openclinica.bean.submit.ItemDataBean;
import org.akaza.openclinica.core.SessionManager;
import org.akaza.openclinica.dao.managestudy.DiscrepancyNoteDAO;
import org.akaza.openclinica.dao.rule.RuleDAO;
import org.akaza.openclinica.dao.submit.EventCRFDAO;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/*
* @author Krikor Krumlian
*/
public class RuleExecutionBusinessObject {
private final SessionManager sm;
protected final Logger logger = LoggerFactory.getLogger(getClass().getName());
protected StudyBean currentStudy;
protected UserAccountBean ub;
public RuleExecutionBusinessObject(SessionManager sm, StudyBean currentStudy, UserAccountBean ub) {
this.sm = sm;
this.currentStudy = currentStudy;
this.ub = ub;
}
public void runRule(int eventCrfId) {
// int eventCrfId = 11;
EventCRFBean eventCrfBean = getEventCRFBean(eventCrfId);
RuleSetBean ruleSetBean = getRuleSetBean(eventCrfBean);
ArrayList<RuleBean> rules = getRuleBeans(ruleSetBean);
for (RuleBean rule : rules) {
initializeRule(rule);
}
}
public void initializeRule(RuleBean rule) {
// source data
// ItemDataBean sourceItemDataBean = rule.getSourceItemDataBean();
ItemDataBean sourceItemDataBean = null;
// target data
// ItemDataBean targetItemDataBean = rule.getTargetItemDataBean();
ItemDataBean targetItemDataBean = null;
// fireRules on source & target
// TODO KK FIX HERE
boolean sourceResult = true;// fireRule(sourceItemDataBean,rule.getSourceItemValue(),sourceItemFormMetadataBean,rule.getSourceOperator());
boolean targetResult = true;// fireRule(targetItemDataBean,rule.getTargetItemValue(),targetItemFormMetadataBean,rule.getTargetOperator());
if (sourceResult && targetResult) {
// We are good
}
if (sourceResult == true && targetResult == false) {
// file a descrepancy Note
createDiscrepancyNote(rule.toString(), targetItemDataBean, sourceItemDataBean);
}
}
private void createDiscrepancyNote(String description, ItemDataBean targetItemDataBean, ItemDataBean sourceItemDataBean) {
DiscrepancyNoteBean note = new DiscrepancyNoteBean();
note.setDescription(description);
note.setDetailedNotes("");
note.setOwner(ub);
note.setCreatedDate(new Date());
note.setResolutionStatusId(1);
note.setDiscrepancyNoteTypeId(1);
// note.setParentDnId(parentId);
// note.setField(field);
note.setEntityId(targetItemDataBean.getId());
note.setEntityType(DiscrepancyNoteBean.ITEM_DATA);
note.setColumn("value");
note.setStudyId(currentStudy.getId());
DiscrepancyNoteDAO discrepancyNoteDao = new DiscrepancyNoteDAO(sm.getDataSource());
note = (DiscrepancyNoteBean) discrepancyNoteDao.create(note);
discrepancyNoteDao.createMapping(note);
}
// These are dao mostly calls see how to reduce redundancy
private EventCRFBean getEventCRFBean(int eventCrfBeanId) {
EventCRFDAO eventCrfDao = new EventCRFDAO(sm.getDataSource());
return eventCrfBeanId > 0 ? (EventCRFBean) eventCrfDao.findByPK(eventCrfBeanId) : null;
}
private RuleSetBean getRuleSetBean(EventCRFBean eventCrfBean) {
// RuleSetDAO ruleSetDao = new RuleSetDAO(sm.getDataSource());
return null;
}
private ArrayList<RuleBean> getRuleBeans(RuleSetBean ruleSet) {
RuleDAO ruleDao = new RuleDAO(sm.getDataSource());
return ruleSet != null ? ruleDao.findByRuleSet(ruleSet) : new ArrayList<RuleBean>();
}
}