package com.bikeemotion.quartz;
import com.bikeemotion.quartz.jobstore.hazelcast.HazelcastJobStore;
import com.hazelcast.config.Config;
import com.hazelcast.core.Hazelcast;
import com.hazelcast.core.HazelcastInstance;
import java.util.Date;
import org.joda.time.DateTime;
import org.quartz.Job;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.JobKey;
import org.quartz.JobPersistenceException;
import org.quartz.ObjectAlreadyExistsException;
import static org.quartz.Scheduler.DEFAULT_GROUP;
import org.quartz.ScheduleBuilder;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.TriggerBuilder;
import org.quartz.TriggerKey;
import org.quartz.impl.calendar.BaseCalendar;
import org.quartz.spi.OperableTrigger;
public abstract class AbstractTest {
protected HazelcastInstance hazelcastInstance;
protected HazelcastJobStore jobStore;
protected int buildTriggerIndex = 0;
protected int buildJobIndex = 0;
protected HazelcastInstance createHazelcastInstance(String clusterName) {
Config config = new Config();
config.getGroupConfig().setName(clusterName);
config.getGroupConfig().setPassword("some-password");
config.setProperty("hazelcast.logging.type", "slf4j");
return Hazelcast.newHazelcastInstance(config);
}
protected HazelcastJobStore createJobStore(String name) {
HazelcastJobStore hzJobStore = new HazelcastJobStore();
hzJobStore.setInstanceName(name);
return hzJobStore;
}
protected JobDetail buildJob() {
return buildJob("jobName" + buildJobIndex++, DEFAULT_GROUP);
}
protected JobDetail buildJob(String jobName) {
return buildJob(jobName, DEFAULT_GROUP);
}
protected JobDetail buildJob(String jobName, String grouName) {
return buildJob(jobName, grouName, Job.class);
}
protected JobDetail buildJob(String jobName, String grouName, Class<? extends Job> jobClass) {
JobDetail job = JobBuilder.newJob(jobClass).withIdentity(jobName, grouName).build();
return job;
}
protected JobDetail storeJob(String jobName)
throws ObjectAlreadyExistsException, JobPersistenceException {
return storeJob(buildJob(jobName));
}
protected JobDetail storeJob(JobDetail jobDetail)
throws ObjectAlreadyExistsException, JobPersistenceException {
this.jobStore.storeJob(jobDetail, false);
return (JobDetail) jobDetail;
}
protected JobDetail buildAndStoreJob()
throws ObjectAlreadyExistsException,
JobPersistenceException {
JobDetail buildJob = buildJob();
this.jobStore.storeJob(buildJob, false);
return (JobDetail) buildJob;
}
protected JobDetail buildAndStoreJobWithTrigger()
throws ObjectAlreadyExistsException, JobPersistenceException {
JobDetail buildJob = buildJob();
this.jobStore.storeJob(buildJob, false);
OperableTrigger trigger = buildTrigger(buildJob);
jobStore.storeTrigger((OperableTrigger) trigger, false);
return buildJob;
}
protected JobDetail retrieveJob(String jobName)
throws JobPersistenceException {
return this.jobStore.retrieveJob(new JobKey(jobName, DEFAULT_GROUP));
}
protected OperableTrigger buildTrigger(String triggerName,
String triggerGroup,
JobDetail job,
Long startAt,
Long endAt) {
return buildTrigger(triggerName, triggerGroup, job, startAt, endAt, null);
}
protected OperableTrigger buildTrigger(String triggerName,
String triggerGroup,
JobDetail job,
Long startAt,
Long endAt,
ScheduleBuilder scheduleBuilder) {
ScheduleBuilder schedule = scheduleBuilder!=null?scheduleBuilder : SimpleScheduleBuilder.simpleSchedule();
return (OperableTrigger) TriggerBuilder
.newTrigger()
.withIdentity(triggerName, triggerGroup)
.forJob(job)
.startAt(startAt != null ? new Date(startAt) : null)
.endAt(endAt != null ? new Date(endAt) : null)
.withSchedule(schedule)
.build();
}
protected OperableTrigger buildTrigger(String triggerName, String triggerGroup, JobDetail job, Long startAt) {
return buildTrigger(triggerName, triggerGroup, job, startAt, null, null);
}
protected OperableTrigger buildTrigger()
throws ObjectAlreadyExistsException,
JobPersistenceException {
return buildTrigger("triggerName" + buildTriggerIndex++, DEFAULT_GROUP, buildAndStoreJob());
}
protected OperableTrigger buildTrigger(String triggerName, String groupName)
throws JobPersistenceException {
return buildTrigger(triggerName, groupName, buildAndStoreJob());
}
protected OperableTrigger buildTrigger(JobDetail jobDetail) {
return buildTrigger("triggerName" + buildTriggerIndex++, DEFAULT_GROUP, jobDetail);
}
protected OperableTrigger buildTrigger(String triggerName, String groupName, JobDetail jobDetail) {
return buildTrigger(triggerName, groupName, jobDetail, DateTime.now().getMillis());
}
protected OperableTrigger buildAndComputeTrigger(String triggerName, String triggerGroup, JobDetail job, Long startAt) {
return buildAndComputeTrigger(triggerName, triggerGroup, job, startAt, null);
}
protected OperableTrigger buildAndComputeTrigger(String triggerName,
String triggerGroup,
JobDetail job,
Long startAt,
Long endAt,
ScheduleBuilder scheduleBuilder) {
OperableTrigger trigger = buildTrigger(triggerName, triggerGroup, job, startAt, endAt, scheduleBuilder);
trigger.computeFirstFireTime(null);
return trigger;
}
protected OperableTrigger buildAndComputeTrigger(String triggerName,
String triggerGroup,
JobDetail job,
Long startAt,
Long endAt) {
OperableTrigger trigger = buildTrigger(triggerName, triggerGroup, job, startAt, endAt,null);
trigger.computeFirstFireTime(null);
return trigger;
}
protected OperableTrigger buildAndStoreTrigger()
throws ObjectAlreadyExistsException,
JobPersistenceException {
OperableTrigger trigger = buildTrigger();
jobStore.storeTrigger(trigger, false);
return trigger;
}
protected OperableTrigger retrieveTrigger(TriggerKey triggerKey)
throws JobPersistenceException {
return jobStore.retrieveTrigger(triggerKey);
}
protected void storeCalendar(String calName)
throws ObjectAlreadyExistsException, JobPersistenceException {
jobStore.storeCalendar(calName, new BaseCalendar(), false, false);
}
}