package org.akaza.openclinica.logic.rulerunner;
import org.akaza.openclinica.bean.admin.CRFBean;
import org.akaza.openclinica.bean.managestudy.StudyBean;
import org.akaza.openclinica.bean.managestudy.StudyEventBean;
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.ItemGroupBean;
import org.akaza.openclinica.bean.submit.SectionBean;
import org.akaza.openclinica.dao.admin.CRFDAO;
import org.akaza.openclinica.dao.hibernate.RuleActionRunLogDao;
import org.akaza.openclinica.dao.managestudy.StudyDAO;
import org.akaza.openclinica.dao.managestudy.StudyEventDAO;
import org.akaza.openclinica.dao.managestudy.StudySubjectDAO;
import org.akaza.openclinica.dao.rule.RuleSetDAO;
import org.akaza.openclinica.dao.rule.RuleSetRuleDAO;
import org.akaza.openclinica.dao.rule.action.RuleActionDAO;
import org.akaza.openclinica.dao.submit.CRFVersionDAO;
import org.akaza.openclinica.dao.submit.EventCRFDAO;
import org.akaza.openclinica.dao.submit.ItemDataDAO;
import org.akaza.openclinica.dao.submit.ItemFormMetadataDAO;
import org.akaza.openclinica.dao.submit.SectionDAO;
import org.akaza.openclinica.domain.rule.RuleBulkExecuteContainer;
import org.akaza.openclinica.domain.rule.RuleBulkExecuteContainerTwo;
import org.akaza.openclinica.domain.rule.RuleSetBean;
import org.akaza.openclinica.domain.rule.RuleSetRuleBean;
import org.akaza.openclinica.domain.rule.action.RuleActionBean;
import org.akaza.openclinica.i18n.util.ResourceBundleProvider;
import org.akaza.openclinica.service.crfdata.DynamicsMetadataService;
import org.akaza.openclinica.service.rule.expression.ExpressionService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import java.util.HashMap;
import java.util.Locale;
import java.util.ResourceBundle;
import java.util.Set;
import javax.sql.DataSource;
public class RuleRunner {
protected final Logger logger = LoggerFactory.getLogger(getClass().getName());
private RuleSetDAO ruleSetDao;
private RuleSetRuleDAO ruleSetRuleDao;
private RuleActionDAO ruleActionDao;
private CRFDAO crfDao;
private CRFVersionDAO crfVersionDao;
private StudyEventDAO studyEventDao;
private ItemDataDAO itemDataDao;
private ExpressionService expressionService;
private EventCRFDAO eventCrfDao;
private StudySubjectDAO studySubjectDao;
private StudyDAO studyDao;
private ItemFormMetadataDAO itemFormMetadataDao;
private SectionDAO sectionDao;
private JavaMailSenderImpl mailSender;
protected RuleRunnerMode ruleRunnerMode;
protected DynamicsMetadataService dynamicsMetadataService;
protected RuleActionRunLogDao ruleActionRunLogDao;
DataSource ds;
String requestURLMinusServletPath;
String contextPath;
public enum RuleRunnerMode {
DATA_ENTRY, CRF_BULK, RULSET_BULK, IMPORT_DATA ,RUN_ON_SCHEDULE
};
public RuleRunner(DataSource ds, String requestURLMinusServletPath, String contextPath, JavaMailSenderImpl mailSender) {
this.ds = ds;
this.requestURLMinusServletPath = requestURLMinusServletPath;
this.contextPath = contextPath;
this.mailSender = mailSender;
}
String curateMessage(RuleActionBean ruleAction, RuleSetRuleBean ruleSetRule) {
String message = ruleAction.getSummary();
String ruleOid = ruleSetRule.getRuleBean().getOid();
return ruleOid + " " + message;
}
HashMap<String, String> prepareEmailContents(RuleSetBean ruleSet, RuleSetRuleBean ruleSetRule, StudyBean currentStudy, RuleActionBean ruleAction) {
// get the Study Event
StudyEventBean studyEvent =
(StudyEventBean) getStudyEventDao().findByPK(
Integer.valueOf(getExpressionService().getStudyEventDefenitionOrdninalCurated(ruleSet.getTarget().getValue())));
// get the Study Subject
StudySubjectBean studySubject = (StudySubjectBean) getStudySubjectDao().findByPK(studyEvent.getStudySubjectId());
// get Study/Site Associated with Subject
StudyBean theStudy = (StudyBean) getStudyDao().findByPK(studySubject.getStudyId());
String theStudyName, theSiteName = "";
if (theStudy.getParentStudyId() > 0) {
StudyBean theParentStudy = (StudyBean) getStudyDao().findByPK(theStudy.getParentStudyId());
theStudyName = theParentStudy.getName() + " / " + theParentStudy.getIdentifier();
theSiteName = theStudy.getName() + " / " + theStudy.getIdentifier();
} else {
theStudyName = theStudy.getName() + " / " + theStudy.getIdentifier();
}
// get the eventCrf & subsequently the CRF Version
//EventCRFBean eventCrf = (EventCRFBean) getEventCrfDao().findAllByStudyEvent(studyEvent).get(0);
EventCRFBean eventCrf =
(EventCRFBean) getEventCrfDao().findAllByStudyEventAndCrfOrCrfVersionOid(studyEvent,
getExpressionService().getCrfOid(ruleSet.getTarget().getValue())).get(0);
CRFVersionBean crfVersion = (CRFVersionBean) getCrfVersionDao().findByPK(eventCrf.getCRFVersionId());
CRFBean crf = (CRFBean) getCrfDao().findByPK(crfVersion.getCrfId());
String studyEventDefinitionName = getExpressionService().getStudyEventDefinitionFromExpression(ruleSet.getTarget().getValue(), currentStudy).getName();
studyEventDefinitionName += " [" + studyEvent.getSampleOrdinal() + "]";
String itemGroupName = getExpressionService().getItemGroupNameAndOrdinal(ruleSet.getTarget().getValue());
ItemGroupBean itemGroupBean = getExpressionService().getItemGroupExpression(ruleSet.getTarget().getValue());
ItemBean itemBean = getExpressionService().getItemExpression(ruleSet.getTarget().getValue(), itemGroupBean);
String itemName = itemBean.getName();
SectionBean section =
(SectionBean) getSectionDAO().findByPK(getItemFormMetadataDAO().findByItemIdAndCRFVersionId(itemBean.getId(), crfVersion.getId()).getSectionId());
StringBuffer sb = new StringBuffer();
ResourceBundle respage = ResourceBundleProvider.getPageMessagesBundle();
sb.append(respage.getString("email_header_1"));
sb.append(" " + contextPath + " ");
sb.append(respage.getString("email_header_2"));
sb.append(" '" + currentStudy.getName() + "' ");
sb.append(respage.getString("email_header_3"));
sb.append(" \n\n ");
sb.append(respage.getString("email_body_1") + " " + theStudyName + " \n ");
sb.append(respage.getString("email_body_1_a") + " " + theSiteName + " \n ");
sb.append(respage.getString("email_body_2") + " " + studySubject.getName() + " \n ");
sb.append(respage.getString("email_body_3") + " " + studyEventDefinitionName + " \n ");
sb.append(respage.getString("email_body_4") + " " + crf.getName() + " " + crfVersion.getName() + " \n ");
sb.append(respage.getString("email_body_5") + " " + section.getTitle() + " \n ");
sb.append(respage.getString("email_body_6") + " " + itemGroupName + " \n ");
sb.append(respage.getString("email_body_7") + " " + itemName + " \n ");
sb.append(respage.getString("email_body_8") + " " + ruleAction.getCuratedMessage() + " \n ");
sb.append(" \n\n ");
sb.append(respage.getString("email_body_9"));
sb.append(" " + contextPath + " ");
sb.append(respage.getString("email_body_10"));
sb.append(" \n");
requestURLMinusServletPath = requestURLMinusServletPath == null ? "" : requestURLMinusServletPath;
sb.append(requestURLMinusServletPath + "/ViewSectionDataEntry?ecId=" + eventCrf.getId() + "§ionId=" + section.getId() + "&tabId="
+ section.getOrdinal());
// &eventId="+ studyEvent.getId());
sb.append("\n\n");
sb.append(respage.getString("email_footer"));
String subject = contextPath + " - [" + currentStudy.getName() + "] ";
String ruleSummary = ruleAction.getSummary() != null ? ruleAction.getSummary() : "";
String message = ruleSummary.length() < 20 ? ruleSummary : ruleSummary.substring(0, 20) + " ... ";
subject += message;
HashMap<String, String> emailContents = new HashMap<String, String>();
emailContents.put("body", sb.toString());
emailContents.put("subject", subject);
return emailContents;
}
void logCrfViewSpecificOrderedObjects(HashMap<RuleBulkExecuteContainer, HashMap<RuleBulkExecuteContainerTwo, Set<String>>> crfViewSpecificOrderedObjects) {
for (RuleBulkExecuteContainer key1 : crfViewSpecificOrderedObjects.keySet()) {
for (RuleBulkExecuteContainerTwo key2 : crfViewSpecificOrderedObjects.get(key1).keySet()) {
String studySubjects = "";
for (String studySubjectIds : crfViewSpecificOrderedObjects.get(key1).get(key2)) {
studySubjects += studySubjectIds + " : ";
}
logger.debug("key1 {} , key2 {} , studySubjectId {}", new Object[] { key1.toString(), key2.toString(), studySubjects });
}
}
}
ExpressionService getExpressionService() {
expressionService = this.expressionService != null ? expressionService : new ExpressionService(ds);
return expressionService;
}
RuleSetDAO getRuleSetDao() {
ruleSetDao = this.ruleSetDao != null ? ruleSetDao : new RuleSetDAO(ds);
return ruleSetDao;
}
CRFDAO getCrfDao() {
crfDao = this.crfDao != null ? crfDao : new CRFDAO(ds);
return crfDao;
}
RuleSetRuleDAO getRuleSetRuleDao() {
ruleSetRuleDao = this.ruleSetRuleDao != null ? ruleSetRuleDao : new RuleSetRuleDAO(ds);
return ruleSetRuleDao;
}
RuleActionDAO getRuleActionDao() {
ruleActionDao = this.ruleActionDao != null ? ruleActionDao : new RuleActionDAO(ds);
return ruleActionDao;
}
StudyEventDAO getStudyEventDao() {
studyEventDao = this.studyEventDao != null ? studyEventDao : new StudyEventDAO(ds);
return studyEventDao;
}
ItemDataDAO getItemDataDao() {
itemDataDao = this.itemDataDao != null ? itemDataDao : new ItemDataDAO(ds);
return itemDataDao;
}
EventCRFDAO getEventCrfDao() {
eventCrfDao = this.eventCrfDao != null ? eventCrfDao : new EventCRFDAO(ds);
return eventCrfDao;
}
CRFVersionDAO getCrfVersionDao() {
crfVersionDao = this.crfVersionDao != null ? crfVersionDao : new CRFVersionDAO(ds);
return crfVersionDao;
}
StudySubjectDAO getStudySubjectDao() {
studySubjectDao = this.studySubjectDao != null ? studySubjectDao : new StudySubjectDAO(ds);
return studySubjectDao;
}
ItemFormMetadataDAO getItemFormMetadataDAO() {
itemFormMetadataDao = this.itemFormMetadataDao != null ? itemFormMetadataDao : new ItemFormMetadataDAO(ds);
return itemFormMetadataDao;
}
SectionDAO getSectionDAO() {
sectionDao = this.sectionDao != null ? sectionDao : new SectionDAO(ds);
return sectionDao;
}
StudyDAO getStudyDao() {
studyDao = this.studyDao != null ? studyDao : new StudyDAO(ds);
return studyDao;
}
public JavaMailSenderImpl getMailSender() {
return mailSender;
}
public DynamicsMetadataService getDynamicsMetadataService() {
return dynamicsMetadataService;
}
public void setDynamicsMetadataService(DynamicsMetadataService dynamicsMetadataService) {
this.dynamicsMetadataService = dynamicsMetadataService;
}
public RuleActionRunLogDao getRuleActionRunLogDao() {
return ruleActionRunLogDao;
}
public void setRuleActionRunLogDao(RuleActionRunLogDao ruleActionRunLogDao) {
this.ruleActionRunLogDao = ruleActionRunLogDao;
}
}