package org.cavaness.quartzbook.chapter8;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.quartz.Scheduler;
import org.quartz.SchedulerConfigException;
import org.quartz.SchedulerException;
import org.quartz.spi.SchedulerPlugin;
public class ParentPlugin implements SchedulerPlugin {
private static Log logger = LogFactory.getLog(ParentPlugin.class);
// A list of child plug-ins
private List childPlugins = new ArrayList();
private String childPluginNames;
private String pluginName;
private Scheduler scheduler;
/**
* Default no-arg Constructor
*
*/
public ParentPlugin() {
}
/**
* Pass the initialize call on to the child plug-ins.
*
* @throws SchedulerConfigException
* if there is an error initializing.
*/
public void initialize(String name, final Scheduler scheduler)
throws SchedulerException {
this.pluginName = name;
this.scheduler = scheduler;
logger.info("Searching for child plugins to load");
// The child plug-ins are comma-separated
StringTokenizer tokenizer =
new StringTokenizer(childPluginNames, ",");
while (tokenizer.hasMoreElements()) {
String pluginClassname = tokenizer.nextToken();
try {
Class pluginClass =
Class.forName(pluginClassname);
Object obj = pluginClass.newInstance();
// Make sure the specified class is a plug-in
if (obj instanceof SchedulerPlugin) {
// Initialize the Plugin
SchedulerPlugin childPlugin =
(SchedulerPlugin) obj;
logger.info("Init child Plugin " +
pluginClassname);
childPlugin.initialize(pluginClassname,
scheduler);
// Store the child plug-in in the list
childPlugins.add(childPlugin);
} else {
// Skip loading class
logger.error("Class is not a plugin " +
pluginClass);
}
} catch (Exception ex) {
// On error, log and go to next child plug-in
logger.error("Error loading plugin " +
pluginClassname, ex);
}
}
}
public void start() {
// Start each child plug-in
int size = childPlugins.size();
for (int i = 0; i < size; i++) {
SchedulerPlugin childPlugin =
((SchedulerPlugin) childPlugins.get(i));
logger.info("Starting Child Plugin " + childPlugin);
childPlugin.start();
}
}
public void shutdown() {
// Stop each child plug-in
int size = childPlugins.size();
for (int i = 0; i < size; i++) {
SchedulerPlugin childPlugin =
((SchedulerPlugin) childPlugins.get(i));
logger.info("Stopping Plugin " + childPlugin);
childPlugin.shutdown();
}
}
public String getPluginName() {
return pluginName;
}
public void setPluginName(String pluginName) {
this.pluginName = pluginName;
}
public String getChildPluginNames() {
return childPluginNames;
}
public void setChildPluginNames(String childPluginNames) {
this.childPluginNames = childPluginNames;
}
}