/*
* Lokomo OneCMDB - An Open Source Software for Configuration
* Management of Datacenter Resources
*
* Copyright (C) 2006 Lokomo Systems AB
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301 USA.
*
* Lokomo Systems AB can be contacted via e-mail: info@lokomo.com or via
* paper mail: Lokomo Systems AB, Sv�rdv�gen 27, SE-182 33
* Danderyd, Sweden.
*
*/
package org.onecmdb.core.internal.job;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.onecmdb.core.ICi;
import org.onecmdb.core.ISession;
import org.onecmdb.core.internal.job.workflow.CronTrigger;
import org.onecmdb.core.internal.job.workflow.DirectoryChangeTrigger;
import org.onecmdb.core.internal.job.workflow.IntervallTrigger;
import org.onecmdb.core.internal.job.workflow.ManualTrigger;
import org.onecmdb.core.internal.job.workflow.Trigger;
import org.onecmdb.core.utils.ClassInjector;
import org.quartz.JobDataMap;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleTrigger;
public class JobSchedulare {
Log log = LogFactory.getLog(this.getClass());
private Scheduler sched;
private HashMap<String, Thread> eventThreads = new HashMap<String, Thread>();
public JobSchedulare() {
SchedulerFactory schedFact = new org.quartz.impl.StdSchedulerFactory();
try {
sched = schedFact.getScheduler();
sched.start();
log.info("Quartz Scheduler Started");
} catch (SchedulerException e) {
log.fatal("Can't start Quartz Schedulare - " + e.toString(), e);
}
}
public void cancel(ICi trigger) {
// Interuppt job.
log.info("Interuppt job " + trigger.getAlias());
Thread t = eventThreads.get(trigger.getAlias());
if (t != null) {
t.interrupt();
eventThreads.remove(trigger.getAlias());
} else {
try {
sched.interrupt(trigger.getAlias(), null);
log.info("Delete job " + trigger.getAlias());
sched.deleteJob(trigger.getAlias(), null);
} catch (SchedulerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public void scheduale(ISession session, ICi trigger, ICi process) {
if (session == null) {
log.error("Can't scheduale trigger, need to specify session");
return;
}
if (trigger == null) {
log.error("Can't scheduale trigger, need to specify trigger");
return;
}
Object triggerInstance = getTrigger(trigger);
if (triggerInstance == null) {
log.error("Can't scheduale, trigger not found");
return;
}
// ??? the name of this jobDetail!
JobDetail jobDetail = new JobDetail(trigger.getAlias(),
null,
JobRunner.class);
JobDataMap map = new JobDataMap();
List<ICi> processes = null;
if (process != null) {
processes = new ArrayList<ICi>();
processes.add(process);
}
map.put("session", session);
map.put("processes", processes);
map.put("trigger", trigger);
jobDetail.setJobDataMap(map);
log.info("Schedule trigger " + trigger.getAlias());
if (triggerInstance instanceof IEventTrigger) {
final IEventTrigger eTrigger = (IEventTrigger)triggerInstance;
eTrigger.setJobDetail(jobDetail);
Thread t = new Thread(eTrigger) {
@Override
public void interrupt() {
eTrigger.interrupt();
super.interrupt();
}
};
eventThreads.put(trigger.getAlias(), t);
t.start();
return;
}
if (triggerInstance instanceof org.quartz.Trigger) {
org.quartz.Trigger qTrigger = (org.quartz.Trigger)triggerInstance;
// Check what this trigger is about.
try {
sched.scheduleJob(jobDetail, qTrigger);
} catch (SchedulerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public void shutdown() {
if (this.sched != null) {
log.info("Shutdown Quartz Schedulare");
try {
this.sched.shutdown();
log.info("Shutdown Quartz Schedulare Completed");
} catch (SchedulerException e) {
log.error("Error Shutdown Quartz Schedulare : " + e.toString(), e);
}
}
}
private Object getTrigger(ICi ci) {
// Convert ci to object.
ClassInjector converter = new ClassInjector();
//CiToJavaObject converter = new CiToJavaObject();
converter.addAliasToClass("JobManualTrigger", ManualTrigger.class.getName());
converter.addAliasToClass("JobIntervallTrigger", IntervallTrigger.class.getName());
converter.addAliasToClass("JobCronTrigger", CronTrigger.class.getName());
final Trigger t = (Trigger) converter.toBeanObject(ci);
if (t instanceof CronTrigger) {
String expression = ((CronTrigger)t).getCronExpression();
org.quartz.CronTrigger cron = new org.quartz.CronTrigger();
try {
cron.setCronExpression(expression);
} catch (ParseException e) {
log.error("Cron trigger '" + ci.getAlias() +"'s expression '" + expression + "' not correct: " + t.toString(), e);
return(null);
}
cron.setName(ci.getAlias());
return(cron);
}
if (t instanceof IntervallTrigger) {
IntervallTrigger intervallT = (IntervallTrigger)t;
SimpleTrigger simple = new SimpleTrigger();
simple.setRepeatInterval(intervallT.getRepeateIntervall());
simple.setRepeatCount((int) intervallT.getRepeateCount());
simple.setStartTime(new Date(System.currentTimeMillis() + intervallT.getStartDelay()));
simple.setName(ci.getAlias());
return(simple);
}
if (t instanceof ManualTrigger) {
SimpleTrigger simple = new SimpleTrigger();
simple.setRepeatCount(0);
simple.setRepeatInterval(0L);
simple.setStartTime(new Date());
simple.setName(ci.getAlias());
return(simple);
}
if (t instanceof DirectoryChangeTrigger) {
return(t);
}
return(null);
}
}