package io.robe.admin.quartz; import io.robe.admin.hibernate.dao.JobDao; import io.robe.admin.hibernate.dao.TriggerDao; import io.robe.admin.hibernate.entity.HTriggerInfo; import io.robe.admin.hibernate.entity.HJobInfo; import io.robe.guice.GuiceBundle; import io.robe.quartz.info.JobInfo; import io.robe.quartz.info.TriggerInfo; import org.hibernate.SessionFactory; import org.hibernate.context.internal.ManagedSessionContext; import java.util.concurrent.ConcurrentHashMap; /** * Persists all discovered Job's info to the DB. * Helps to manage and view them. */ public class JobPersister { public JobPersister(ConcurrentHashMap<String, JobInfo> jobs) { SessionFactory sessionFactory = GuiceBundle.getInjector().getInstance(SessionFactory.class); ManagedSessionContext.bind(sessionFactory.openSession()); JobDao jobDao = new JobDao(sessionFactory); TriggerDao triggerDao = new TriggerDao(sessionFactory); for (JobInfo info : jobs.values()) { insertOrUpdate(jobDao, info, triggerDao); } sessionFactory.getCurrentSession().flush(); sessionFactory.getCurrentSession().close(); ManagedSessionContext.unbind(sessionFactory); } private void insertOrUpdate(JobDao jobDao, JobInfo info, TriggerDao triggerDao) { HJobInfo record = jobDao.findByJobClass(info.getJobClass()); if (record == null) { record = new HJobInfo(); record.setJobClass(info.getJobClass()); record.setProvider(info.getProvider()); } record.setName(info.getName()); record.setDescription(info.getDescription()); record.setGroup(info.getGroup()); jobDao.create(record); if (!info.getProvider().equals(HibernateJobInfoProvider.class)) { for (TriggerInfo triggerInfo : info.getTriggers()) { insertOrUpdate(record.getOid(), triggerDao, triggerInfo); } } } private void insertOrUpdate(String jobOid, TriggerDao dao, TriggerInfo info) { HTriggerInfo record = dao.findByJobOidAndName(jobOid, info.getName()); if (record == null) { record = new HTriggerInfo(); record.setActive(true); record.setJobOid(jobOid); } record.setStartTime(info.getStartTime()); record.setEndTime(info.getEndTime()); record.setName(info.getName()); record.setCron(info.getCron()); record.setRepeatCount(info.getRepeatCount()); record.setRepeatInterval(info.getRepeatInterval()); record.setGroup(info.getGroup()); record.setType(info.getType()); dao.create(record); } }