package nl.ipo.cds.executor.config; import nl.idgis.commons.jobexecutor.*; import nl.idgis.commons.jobexecutor.Process; import nl.ipo.cds.dao.ManagerDao; import nl.ipo.cds.dao.impl.JobDaoImpl; import nl.ipo.cds.etl.EtlJobMail; import nl.ipo.cds.etl.util.BlockingExecutor; import nl.ipo.cds.executor.CdsJobExecuter; import nl.ipo.cds.executor.JobCollectorImpl; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import javax.inject.Inject; import javax.sql.DataSource; import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.Set; import java.util.concurrent.Executor; @Configuration public class JobExecuterConfig { public class ProcessHolder { private final Map<Class<? extends Job>, Process<Job>> processes; public ProcessHolder (final Map<Class<? extends Job>, Process<Job>> processes) { this.processes = new HashMap<Class<? extends Job>, Process<Job>> (processes); } public Map<Class<? extends Job>, Process<Job>> getProcessJobTypes () { return Collections.unmodifiableMap (processes); } } @Bean @Inject public ProcessHolder processJobTypesHolder (final Set<Process<Job>> processes) { final Map<Class<? extends Job>, Process<Job>> processMap = new HashMap<Class<? extends Job>, Process<Job>> (); for (final Process<Job> process: processes) { final Class<? extends Job> key = process.getJobType (); if (processMap.containsKey (key)) { throw new IllegalStateException (String.format ("Duplicate process type: %s", key)); } processMap.put (key, process); } return new ProcessHolder (processMap); } @Bean @Inject public JobProcessor jobProcessor ( final ProcessHolder processes, final JobDao jobDao, final JobMail jobMail, final JobLogger jobLogger) { return new JobProcessor ( Collections.<Class<?>, Process<?>>unmodifiableMap (processes.getProcessJobTypes ()), jobDao, jobMail, jobLogger ); } @Bean @Inject public JobCollector JobCollectorImpl (final ManagerDao managerDao) { return new JobCollectorImpl(managerDao); } @Bean @Inject public JobCreator jobDaoImpl(final ManagerDao managerDao) { return new JobDaoImpl(managerDao); } @Bean @Inject public JobExecutor jobExecutor (final JobCollector jobCollector, final JobProcessor jobProcessor) { JobExecutor jobExecutor = new JobExecutor (jobProcessor); jobExecutor.setJobCollector(jobCollector); jobExecutor.setWaitTime(5000); return jobExecutor; } @Bean @Inject public CdsJobExecuter jobExecuter (final DataSource dataSource, final JobExecutor jobExecutor) { final CdsJobExecuter jobExecuter = new CdsJobExecuter (dataSource, jobExecutor); return jobExecuter; } @Bean public Executor executer (final @Value("${numberOfThreads}") int numberOfThreads) { return new BlockingExecutor (numberOfThreads); } @Configuration public static class EmailConfiguration { private @Value("${mail.smtpHost}") String mailSmtpHost; private @Value("${mail.smtpPort}") String mailSmtpPort; private @Value("${mail.from}") String mailFrom; private @Value("${mail.host}") String mailHost; private @Value("${mail.hostProto:http}") String mailHostProto; private String mailSubject = "Melding Centrale Data- en Services omgeving"; @Bean @Inject public JobMail jobMail (final ManagerDao managerDao) { final EtlJobMail jobMail = new EtlJobMail (); jobMail.setFrom (mailFrom); jobMail.setHost(mailHost); jobMail.setHostProto(mailHostProto); jobMail.setManagerDao (managerDao); jobMail.setSmtpHost (mailSmtpHost); jobMail.setSmtpPort (Integer.parseInt (mailSmtpPort)); jobMail.setSubject (mailSubject); return jobMail; } } }