package com.sap.pto.startup; import static org.quartz.CronScheduleBuilder.cronSchedule; import static org.quartz.JobBuilder.newJob; import static org.quartz.TriggerBuilder.newTrigger; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import org.joda.time.DateTimeZone; import org.quartz.CronTrigger; import org.quartz.JobDetail; import org.quartz.JobKey; import org.quartz.Scheduler; import org.quartz.SchedulerException; import org.quartz.SchedulerFactory; import org.quartz.impl.StdSchedulerFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.sap.pto.dao.UserDAO; import com.sap.pto.dao.entities.User; import com.sap.pto.jobs.ImporterJob; import com.sap.pto.jobs.PaulPredictionJob; import com.sap.pto.util.Consts; import com.sap.pto.util.SecurityUtil; import com.sap.pto.util.configuration.ConfigDBAdapter; import com.sap.pto.util.configuration.ConfigUtil; public class AppInitializer implements ServletContextListener { private static Logger logger = LoggerFactory.getLogger(AppInitializer.class); private static Scheduler scheduler; public AppInitializer() { } @Override public void contextInitialized(ServletContextEvent context) { logger.info("Initializing Application"); DateTimeZone.setDefault(DateTimeZone.UTC); initScheduler(); initDefaultUsers(); // trigger data importing and predicting triggerJob("Importer"); triggerJob("PaulPrediction"); logger.info("Initialization Done"); } @Override public void contextDestroyed(ServletContextEvent context) { if (scheduler != null) { try { scheduler.shutdown(); } catch (SchedulerException e) { logger.error("Job scheduler could not be shut down.", e); } } } public static Scheduler getScheduler() { return scheduler; } public static void initConfiguration() { ConfigUtil.setDBAdapter(new ConfigDBAdapter()); } /** * Schedules all background jobs * * Important: Group names must be equal to the job name currently for * manually triggering jobs via REST API */ private void initScheduler() { try { SchedulerFactory sf = new StdSchedulerFactory(); scheduler = sf.getScheduler(); scheduler.start(); JobDetail job = newJob(ImporterJob.class).withIdentity("Importer", "Importer").build(); CronTrigger trigger = newTrigger().withIdentity("cronTrigger", "Importer").withSchedule(cronSchedule("0 0 * * * ?")).build(); scheduler.scheduleJob(job, trigger); job = newJob(PaulPredictionJob.class).withIdentity("PaulPrediction", "PaulPrediction").build(); trigger = newTrigger().withIdentity("cronTrigger", "PaulPrediction").withSchedule(cronSchedule("0 */15 * * * ?")).build(); scheduler.scheduleJob(job, trigger); } catch (SchedulerException e) { logger.error("Job scheduler could not be started.", e); } } private static void triggerJob(String name) { try { scheduler.triggerJob(new JobKey(name, name)); logger.info("Job '" + name + "' has been triggered."); } catch (SchedulerException e) { logger.error("Could not trigger job '" + name + "'.", e); } } public static void initDefaultUsers() { if (new UserDAO().getCount() == 0) { logger.info("Creating default users: admin, user, paul, hana"); UserDAO.save(new User("admin", "admin@test.com", SecurityUtil.getPasswordHash("admin", "admin"), "user,admin")); UserDAO.save(new User("user", "user@test.com", SecurityUtil.getPasswordHash("user", "user"), "user")); UserDAO.save(new User(Consts.PAUL, "paul@test.com", SecurityUtil.getPasswordHash(Consts.PAUL, "paul"), "user")); UserDAO.save(new User(Consts.HANA, "hana@test.com", SecurityUtil.getPasswordHash(Consts.HANA, "hana"), "user")); } } }