package org.akaza.openclinica.service; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; import java.util.List; import java.util.Locale; import java.util.TimeZone; import java.util.concurrent.TimeUnit; import javax.sql.DataSource; 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.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.ItemGroupBean; import org.akaza.openclinica.bean.submit.ItemGroupMetadataBean; import org.akaza.openclinica.dao.admin.CRFDAO; import org.akaza.openclinica.dao.core.CoreResources; import org.akaza.openclinica.dao.hibernate.RuleSetAuditDao; import org.akaza.openclinica.dao.hibernate.RuleSetDao; import org.akaza.openclinica.dao.login.UserAccountDAO; 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.rule.RuleSetDAO; 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.ItemDataDAO; import org.akaza.openclinica.dao.submit.ItemGroupDAO; import org.akaza.openclinica.dao.submit.ItemGroupMetadataDAO; import org.akaza.openclinica.domain.Status; import org.akaza.openclinica.domain.datamap.VersioningMap; import org.akaza.openclinica.domain.rule.RuleBean; import org.akaza.openclinica.domain.rule.RuleSetBean; import org.akaza.openclinica.domain.rule.RuleSetRuleBean; import org.akaza.openclinica.domain.rule.action.EventActionBean; import org.akaza.openclinica.domain.rule.action.NotificationActionBean; import org.akaza.openclinica.domain.rule.action.NotificationActionProcessor; import org.akaza.openclinica.domain.rule.action.RuleActionBean; import org.akaza.openclinica.domain.rule.expression.ExpressionBean; import org.akaza.openclinica.domain.rule.expression.ExpressionBeanObjectWrapper; import org.akaza.openclinica.domain.rule.expression.ExpressionObjectWrapper; import org.akaza.openclinica.exception.OpenClinicaSystemException; import org.akaza.openclinica.i18n.util.ResourceBundleProvider; import org.akaza.openclinica.logic.expressionTree.OpenClinicaExpressionParser; import org.akaza.openclinica.patterns.ocobserver.StudyEventChangeDetails; import org.akaza.openclinica.service.rule.RuleSetService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.mail.javamail.JavaMailSenderImpl; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; @Component public class JobTriggerService { RuleSetDao ruleSetDao; DataSource ds; UserAccountDAO userAccountDao; StudyDAO studyDao; StudySubjectDAO ssdao; StudyEventDAO sedao; StudyEventDefinitionDAO seddao; ItemDAO idao; ItemGroupMetadataDAO igmdao; ItemGroupDAO igdao; CRFDAO cdao; CRFVersionDAO cvdao; EventCRFDAO edao; NotificationActionProcessor notificationActionProcessor; RuleSetService ruleSetService; ItemDataDAO iddao; ItemBean iBean; protected final Logger logger = LoggerFactory.getLogger(getClass().getName()); private static final SimpleDateFormat currentDateFormat = new SimpleDateFormat("HH:mm:ss"); public JobTriggerService(DataSource ds, RuleSetDao ruleSetDao, RuleSetService ruleSetService) { this.ds = ds; this.ruleSetDao = ruleSetDao; this.ruleSetService = ruleSetService; } // @Scheduled(cron = "0 0/2 * * * ?") // trigger every 2 minutes // @Scheduled(cron = "0 0/1 * * * ?") // trigger every minute @Scheduled(cron = "0 0 0/1 * * ?") // trigger every hour public void hourlyJobTrigger() throws NumberFormatException, ParseException { logger.debug("The time is : " + new Date()); triggerJob(); } public void triggerJob(){ ResourceBundleProvider.updateLocale(new Locale("en_US")); ArrayList<RuleSetBean> ruleSets = ruleSetDao.findAllRunOnSchedules(true); for (RuleSetBean ruleSet : ruleSets) { if (ruleSet.getStatus().AVAILABLE != null && ruleSet.isRunSchedule()) { if(ruleSet.getItemId()!=null){ // item Specific Rule System.out.println("*** Item Specific Rule ***"); ArrayList<RuleSetBean> ruleSetBeans = new ArrayList<>(); StudyBean currentStudy = (StudyBean) getStudyDao().findByPK(ruleSet.getStudyId()); ResourceBundleProvider.updateLocale(Locale.getDefault()); UserAccountBean ub = (UserAccountBean) getUserAccountDao().findByPK(1); ruleSetBeans.add(ruleSet); ruleSetService.runRulesInBulk(ruleSetBeans, false, currentStudy, ub, true); }else{ // Event Specific Rule System.out.println("*** Event Specific Rule ***"); StudyEventChangeDetails studyEventChangeDetails = new StudyEventChangeDetails(true, true); ArrayList<RuleSetBean> ruleSetBeans = new ArrayList<>(); ExpressionBean eBean = new ExpressionBean(); eBean.setValue(ruleSet.getTarget().getValue()+".A.B"); ruleSet.setTarget(eBean); ruleSetBeans.add(ruleSet); ruleSetService.runRulesInBeanProperty(ruleSetBeans ,1, studyEventChangeDetails); } } } } public StudySubjectDAO getStudySubjecdao() { return new StudySubjectDAO(ds); } public UserAccountDAO getUserAccountDao() { return new UserAccountDAO(ds); } public StudyDAO getStudyDao() { return new StudyDAO(ds); } }