package com.github.ltsopensource.spring.quartz;
import com.github.ltsopensource.core.logger.Logger;
import com.github.ltsopensource.core.logger.LoggerFactory;
import com.github.ltsopensource.spring.quartz.invoke.JobDetailJobExecution;
import com.github.ltsopensource.spring.quartz.invoke.MethodInvokeJobExecution;
import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobDetail;
import org.quartz.Trigger;
import org.quartz.impl.triggers.CronTriggerImpl;
import org.quartz.impl.triggers.SimpleTriggerImpl;
import org.springframework.util.MethodInvoker;
import java.beans.PropertyEditorSupport;
import java.util.*;
/**
* @author Robert HG (254963746@qq.com) on 3/16/16.
*/
class QuartzSchedulerBeanTargetEditor extends PropertyEditorSupport {
private static final Logger LOGGER = LoggerFactory.getLogger(QuartzSchedulerBeanTargetEditor.class);
private QuartzProxyContext context;
public QuartzSchedulerBeanTargetEditor(QuartzProxyContext context) {
this.context = context;
}
@Override
@SuppressWarnings({"unchecked"})
public void setValue(Object value) {
List<Object> nativeQuartzTriggers = new ArrayList<Object>();
if (value != null && value instanceof Collection) {
Collection<Trigger> triggers = (Collection<Trigger>) value;
List<QuartzJobContext> quartzJobContexts = new ArrayList<QuartzJobContext>(triggers.size());
for (Trigger trigger : triggers) {
if (trigger instanceof CronTriggerImpl) {
quartzJobContexts.add(buildQuartzCronJob((CronTriggerImpl) trigger));
} else if (trigger instanceof SimpleTriggerImpl) {
quartzJobContexts.add(buildQuartzSimpleJob((SimpleTriggerImpl) trigger));
} else {
LOGGER.warn("Can't Proxy " + trigger.getClass().getName() + " Then Use Quartz Scheduler");
nativeQuartzTriggers.add(trigger);
}
}
context.getAgent().startProxy(quartzJobContexts);
}
super.setValue(nativeQuartzTriggers);
}
private QuartzJobContext buildQuartzCronJob(CronTriggerImpl cronTrigger) {
QuartzJobContext quartzJobContext = new QuartzJobContext();
quartzJobContext.setTrigger(cronTrigger);
quartzJobContext.setType(QuartzJobType.CRON);
quartzJobContext.setName(cronTrigger.getName());
buildQuartzJobContext(quartzJobContext, cronTrigger);
return quartzJobContext;
}
private QuartzJobContext buildQuartzSimpleJob(SimpleTriggerImpl simpleTrigger) {
QuartzJobContext quartzJobContext = new QuartzJobContext();
quartzJobContext.setTrigger(simpleTrigger);
quartzJobContext.setName(simpleTrigger.getName());
quartzJobContext.setType(QuartzJobType.SIMPLE_REPEAT);
buildQuartzJobContext(quartzJobContext, simpleTrigger);
return quartzJobContext;
}
private QuartzJobContext buildQuartzJobContext(QuartzJobContext quartzJobContext, Trigger trigger) {
JobDataMap triggerJobDataMap = trigger.getJobDataMap();
JobDetail jobDetail = (JobDetail) triggerJobDataMap.get("jobDetail");
// 要执行的类
MethodInvoker methodInvoker = (MethodInvoker) jobDetail.getJobDataMap().get("methodInvoker");
Map<String, Object> jobDataMap = new HashMap<String, Object>();
jobDataMap.putAll(triggerJobDataMap);
jobDataMap.putAll(jobDetail.getJobDataMap());
jobDataMap.remove("jobDetail");
jobDataMap.remove("methodInvoker");
quartzJobContext.setJobDataMap(jobDataMap);
if (methodInvoker != null) {
quartzJobContext.setJobExecution(new MethodInvokeJobExecution(methodInvoker));
} else {
Class<? extends Job> jobClass = jobDetail.getJobClass();
try {
Job job = jobClass.newInstance();
quartzJobContext.setJobExecution(new JobDetailJobExecution(job));
} catch (Exception e) {
throw new QuartzProxyException("Instance JobClass[" + (jobClass == null ? null : jobClass.getName()) + "] error", e);
}
}
return quartzJobContext;
}
}