package org.akaza.openclinica.service.rule; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Set; import javax.servlet.http.HttpServletRequest; import org.akaza.openclinica.bean.admin.CRFBean; import org.akaza.openclinica.bean.login.UserAccountBean; 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.submit.CRFVersionBean; import org.akaza.openclinica.bean.submit.EventCRFBean; import org.akaza.openclinica.bean.submit.ItemBean; import org.akaza.openclinica.dao.hibernate.RuleDao; import org.akaza.openclinica.dao.hibernate.RuleSetAuditDao; import org.akaza.openclinica.dao.hibernate.RuleSetDao; import org.akaza.openclinica.dao.hibernate.RuleSetRuleDao; import org.akaza.openclinica.dao.hibernate.ViewRuleAssignmentFilter; import org.akaza.openclinica.dao.hibernate.ViewRuleAssignmentSort; import org.akaza.openclinica.domain.Status; import org.akaza.openclinica.domain.rule.RuleBean; import org.akaza.openclinica.domain.rule.RuleBulkExecuteContainer; import org.akaza.openclinica.domain.rule.RuleBulkExecuteContainerTwo; import org.akaza.openclinica.domain.rule.RuleSetBasedViewContainer; import org.akaza.openclinica.domain.rule.RuleSetBean; import org.akaza.openclinica.domain.rule.RuleSetRuleBean; import org.akaza.openclinica.domain.rule.RulesPostImportContainer; import org.akaza.openclinica.domain.rule.action.RuleActionRunBean.Phase; import org.akaza.openclinica.logic.rulerunner.ExecutionMode; import org.akaza.openclinica.logic.rulerunner.ImportDataRuleRunnerContainer; import org.akaza.openclinica.logic.rulerunner.MessageContainer; import org.springframework.mail.javamail.JavaMailSenderImpl; public interface RuleSetServiceInterface { /** * Now I know why ORM are pretty cool. Takes care of saving the whole object graph. * * @param ruleSetBean * @return * * public RuleSetBean saveRuleSet(RuleSetBean ruleSetBean) { RuleSetBean persistentRuleSetBean = (RuleSetBean) * getRuleSetDao().saveOrUpdate(ruleSetBean); // Save RuleSetRules for (RuleSetRuleBean ruleSetRule : persistentRuleSetBean.getRuleSetRules()) { * ruleSetRule.setRuleSetBean(persistentRuleSetBean); getRuleSetRuleDao().saveOrUpdate(ruleSetRule); // Save Actions for (RuleActionBean action : * ruleSetRule.getActions()) { action.setRuleSetRule(ruleSetRule); getRuleActionDao().saveOrUpdate(action); } } return persistentRuleSetBean; } */ public abstract RuleSetBean saveRuleSet(RuleSetBean ruleSetBean); public abstract void saveImportFromDesigner(RulesPostImportContainer rulesContainer); public abstract void saveImport(RulesPostImportContainer rulesContainer); public void saveImport(RuleSetRuleBean ruleSetRule); public abstract RuleSetBean updateRuleSet(RuleSetBean ruleSetBean, UserAccountBean user, Status status); public abstract void loadRuleSetRuleWithPersistentRules(RuleSetBean ruleSetBean); public abstract RuleSetBean replaceRuleSet(RuleSetBean ruleSetBean); public abstract HashMap<RuleBulkExecuteContainer, HashMap<RuleBulkExecuteContainerTwo, Set<String>>> runRulesInBulk(String crfId, ExecutionMode executionMode, StudyBean currentStudy, UserAccountBean ub); public abstract HashMap<RuleBulkExecuteContainer, HashMap<RuleBulkExecuteContainerTwo, Set<String>>> runRulesInBulk(String ruleSetRuleId, String crfVersionId, ExecutionMode executionMode, StudyBean currentStudy, UserAccountBean ub); public abstract List<RuleSetBasedViewContainer> runRulesInBulk(List<RuleSetBean> ruleSets, Boolean dryRun, StudyBean currentStudy, UserAccountBean ub, boolean jobTrigger); public abstract MessageContainer runRulesInDataEntry(List<RuleSetBean> ruleSets, Boolean dryRun, StudyBean currentStudy, UserAccountBean ub, HashMap<String, String> variableAndValue, Phase phase,EventCRFBean ecb, HttpServletRequest request); /** * @param containers * @param study * @param ub * @param executionMode * @return RuleActionBean summary with key as groupOrdinalPLusItemOid. */ public abstract HashMap<String, ArrayList<String>> runRulesInImportData(List<ImportDataRuleRunnerContainer> containers, StudyBean study, UserAccountBean ub, ExecutionMode executionMode); public abstract List<RuleSetBean> getRuleSetsByCrfStudyAndStudyEventDefinition(StudyBean study, StudyEventDefinitionBean sed, CRFVersionBean crfVersion); /* * Used to Manage RuleSets ,Hence will return all RuleSets whether removed or not */ public abstract List<RuleSetBean> getRuleSetsByStudy(StudyBean study); public int getCountWithFilter(ViewRuleAssignmentFilter viewRuleAssignmentFilter); public int getCountByStudy(StudyBean study); public List<RuleSetRuleBean> getWithFilterAndSort(ViewRuleAssignmentFilter viewRuleAssignmentFilter, ViewRuleAssignmentSort viewRuleAssignmentSort, int rowStart, int rowEnd); // . TODO: why are we including study but not using it in query public abstract RuleSetBean getRuleSetById(StudyBean study, String id); public abstract List<RuleSetRuleBean> getRuleSetById(StudyBean study, String id, RuleBean ruleBean); public abstract List<RuleSetBean> getRuleSetsByCrfAndStudy(CRFBean crfBean, StudyBean study); public abstract List<RuleSetBean> filterByStatusEqualsAvailableOnlyRuleSetRules(List<RuleSetBean> ruleSets); public abstract List<RuleSetBean> filterByStatusEqualsAvailable(List<RuleSetBean> ruleSets); public abstract RuleSetBean filterByRules(RuleSetBean ruleSet, Integer ruleBeanId); public RuleSetBean getObjects(RuleSetBean ruleSetBean); /** * Use in DataEntry Rule Execution Scenarios * * A RuleSet has a Target with Value which is provided by rule Creator. value might be : * SE_TESTINGF[ALL].F_AGEN_8_V204.IG_AGEN_DOSETABLE6[ALL].I_AGEN_DOSEDATE64 OR SE_TESTINGF[1].F_AGEN_8_V204.IG_AGEN_DOSETABLE6[ALL].I_AGEN_DOSEDATE64 OR * SE_TESTINGF.F_AGEN_8_V204.IG_AGEN_DOSETABLE6[ALL].I_AGEN_DOSEDATE64 in which case it would need to be transformed to * SE_TESTINGF[x].F_AGEN_8_V204.IG_AGEN_DOSETABLE6[ALL].I_AGEN_DOSEDATE64 where x is the studyEventId. * * @param ruleSets * @param studyEvent * @param crfVersion * TODO * @param studyEventDefinition * TODO * @return */ public abstract List<RuleSetBean> filterRuleSetsByStudyEventOrdinal(List<RuleSetBean> ruleSets, StudyEventBean studyEvent, CRFVersionBean crfVersion, StudyEventDefinitionBean studyEventDefinition); @SuppressWarnings("unchecked") public abstract List<RuleSetBean> filterRuleSetsByStudyEventOrdinal(List<RuleSetBean> ruleSets, String crfVersionId); /** * Iterate over ruleSet.getExpressions(). Given the following expression SE_TESTINGF[studyEventId].F_AGEN_8_V204.IG_AGEN_DOSETABLE6[X].I_AGEN_DOSEDATE64 X * could be : ALL , "" , Number if ALL or "" then iterate over all group ordinals if they exist and add. if Number just add the number * * @param ruleSets * @param grouped * @return */ public abstract List<RuleSetBean> solidifyGroupOrdinalsUsingFormProperties(List<RuleSetBean> ruleSets, HashMap<String, Integer> grouped); public abstract List<RuleSetBean> filterRuleSetsBySectionAndGroupOrdinal(List<RuleSetBean> ruleSets, HashMap<String, Integer> grouped); /** * Iterate over rulesets and remove those which are currently hidden. * @param allItems */ public abstract List<RuleSetBean> filterRuleSetsByHiddenItems(List<RuleSetBean> ruleSets, EventCRFBean eventCrf, CRFVersionBean crfVersion, List<ItemBean> itemBeansWithSCDShown); /** * Iterate over ruleSet.getExpressions(). Given the following expression SE_TESTINGF[studyEventId].F_AGEN_8_V204.IG_AGEN_DOSETABLE6[X].I_AGEN_DOSEDATE64 X * could be : ALL , "" , Number case 1 : if "" then iterate over itemDatas if they exist add. case 2 : if Number just add the number * * @param ruleSets * @param grouped * @return */ public abstract List<RuleSetBean> filterRuleSetsByGroupOrdinal(List<RuleSetBean> ruleSets); public abstract List<String> getGroupOrdinalPlusItemOids(List<RuleSetBean> ruleSets); public abstract RuleSetBean replaceCrfOidInTargetExpression(RuleSetBean ruleSetBean, String replacementCrfOid); public String getContextPath(); public void setContextPath(String contextPath); public void setRequestURLMinusServletPath(String requestURLMinusServletPath); public abstract String getRequestURLMinusServletPath(); /** * @return the ruleSetDao */ public abstract RuleSetDao getRuleSetDao(); /** * @param ruleSetDao * the ruleSetDao to set */ public abstract void setRuleSetDao(RuleSetDao ruleSetDao); /** * @param ruleSetRuleDao * the ruleSetRuleDao to set */ public abstract void setRuleSetRuleDao(RuleSetRuleDao ruleSetRuleDao); /** * @return the ruleSetRuleDao */ public abstract RuleSetRuleDao getRuleSetRuleDao(); /** * @return the ruleDao */ public abstract RuleDao getRuleDao(); /** * @param ruleDao * the ruleDao to set */ public abstract void setRuleDao(RuleDao ruleDao); public RuleSetAuditDao getRuleSetAuditDao(); public void setRuleSetAuditDao(RuleSetAuditDao ruleSetAuditDao); public JavaMailSenderImpl getMailSender(); public void setMailSender(JavaMailSenderImpl mailSender); /** * Return true if there is at least one rule should be run for a phase. * * @param ruleSets * @param phase * @return */ public boolean shouldRunRulesForRuleSets(List<RuleSetBean> ruleSets, Phase phase); }