package com.thingtrack.konekti.schedule;
import java.util.List;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;
import org.osgi.framework.ServiceRegistration;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobListener;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.impl.StdSchedulerFactory;
import com.thingtrack.konekti.domain.Job;
import com.thingtrack.konekti.schedule.internal.JobManagerServiceImpl;
import com.thingtrack.konekti.service.api.JobService;
public class ScheduleActivator implements BundleActivator {
private BundleContext bundleContext;
private ServiceRegistration schedulerServiceRegistration;
private ServiceRegistration jobManagerServiceRegistration;
private JobServiceTracker jobServiceTracker;
private static JobService jobService;
private static Scheduler scheduler;
private static JobManagerService jobManagerService;
private static final String JOB_LISTENER_NAME = "thingtrack_listener";
public static final String JOB_SEPARATOR = "@";
private static final boolean OK = false;
private static final boolean ERROR = true;
public void start(BundleContext context) throws Exception {
this.bundleContext = context;
// get job service
jobService = getJobService();
// create Factory Scheduler
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
try {
// create scheduler from factory
scheduler = schedulerFactory.getScheduler();
// implements scheduler listener
scheduler.getListenerManager().addJobListener(new JobListener() {
@Override
public void jobWasExecuted(JobExecutionContext context, JobExecutionException jobException) {
String jobAreaName = context.getJobDetail().getKey().getName();
String jobAreaGroup = context.getJobDetail().getKey().getGroup();
Integer areaId = Integer.parseInt(jobAreaName.split(JOB_SEPARATOR)[0]);
String jobName = jobAreaName.split(JOB_SEPARATOR)[1].toString();
String jobGroup = jobAreaGroup.split(JOB_SEPARATOR)[1].toString();
// get job executed from scheduler
Job job = null;
try {
job = getJob(areaId, jobGroup, jobName);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
return;
}
// set last execution and control if exist any error
try {
if (jobException == null)
jobService.setLastExecution(job, OK);
else
jobService.setLastExecution(job, ERROR);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void jobToBeExecuted(JobExecutionContext context) {
// TODO Auto-generated method stub
JobExecutionContext value = context;
}
@Override
public void jobExecutionVetoed(JobExecutionContext context) {
// TODO Auto-generated method stub
JobExecutionContext value = context;
}
@Override
public String getName() {
return JOB_LISTENER_NAME;
}
});
scheduler.start();
} catch (SchedulerException e) {
e.printStackTrace();
}
// create Job manager service and register
jobManagerService = new JobManagerServiceImpl(context);
context.registerService("com.thingtrack.konekti.schedule.JobManagerService", jobManagerService, null);
// create Job Service Tracker and register
jobServiceTracker = new JobServiceTracker(context, jobManagerService);
jobServiceTracker.open();
schedulerServiceRegistration = context.registerService("org.quartz.Scheduler", scheduler, null);
}
public void stop(BundleContext context) throws Exception {
if (jobManagerServiceRegistration != null)
jobManagerServiceRegistration.unregister();
if (schedulerServiceRegistration != null)
schedulerServiceRegistration.unregister();
if (scheduler != null)
scheduler.shutdown();
if (jobServiceTracker != null)
jobServiceTracker.close();
jobManagerServiceRegistration = null;
schedulerServiceRegistration = null;
scheduler = null;
jobServiceTracker = null;
}
public static Scheduler getScheduler() {
return scheduler;
}
public static List<Job> getJobs(String group, String name) throws Exception {
return jobService.getByGroupName(group, name);
}
public static Job getJob(Integer areaId, String group, String name) throws Exception {
return jobService.getByGroupNameAndArea(areaId, group, name);
}
private JobService getJobService() {
ServiceReference jobServiceReference = bundleContext.getServiceReference(JobService.class.getName());
JobService jobService = (JobService)bundleContext.getService(jobServiceReference);
return jobService;
}
}