/**
* The contents of this file are subject to the OpenMRS Public License
* Version 1.0 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://license.openmrs.org
*
* Software distributed under the License is distributed on an "AS IS"
* basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
* License for the specific language governing rights and limitations
* under the License.
*
* Copyright (C) OpenMRS, LLC. All Rights Reserved.
*/
package org.openmrs.scheduler;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.openmrs.scheduler.tasks.TaskThreadedInitializationWrapper;
import org.openmrs.util.OpenmrsClassLoader;
/**
*/
public class TaskFactory {
/** Singleton instance of the schedulable factory */
private final static TaskFactory factory = new TaskFactory();
/** Logger */
private static Log log = LogFactory.getLog(TaskFactory.class);
/** Private constructor */
private TaskFactory() {
}
/**
* Gets an instance of the schedulable factory
*/
public static TaskFactory getInstance() {
return factory;
}
/**
* Creates a new instance of Schedulable used to run tasks. By default the returned task will be
* the given task wrapped with the {@link TaskThreadedInitializationWrapper} class so that the
* {@link Task#initialize(TaskDefinition)} method runs in a new thread.
*
* @param taskDefinition
* @return the created Task
* @throws SchedulerException
*/
public Task createInstance(TaskDefinition taskDefinition) throws SchedulerException {
try {
// Retrieve the appropriate class
Class<?> taskClass = OpenmrsClassLoader.getInstance().loadClass(taskDefinition.getTaskClass());
// Create a new instance of the schedulable class
Task task = new TaskThreadedInitializationWrapper((Task) taskClass.newInstance());
if (log.isDebugEnabled()) {
log.debug("initializing " + taskClass.getName());
}
// Initialize the schedulable object
task.initialize(taskDefinition);
return task;
}
catch (ClassNotFoundException cnfe) {
log.error("OpenmrsClassLoader could not load class: " + taskDefinition.getTaskClass()
+ ". Probably due to a module not being loaded");
if (log.isDebugEnabled())
log.debug("Full error trace of ClassNotFoundException", cnfe);
throw new SchedulerException("could not load class", cnfe);
}
catch (Exception e) {
if (log.isDebugEnabled()) {
// don't need to log errors here necessarily. If its needed, the calling method can log it.
log.debug("Error creating new task for class " + taskDefinition.getTaskClass(), e);
}
throw new SchedulerException("error creating new task for class " + taskDefinition.getTaskClass(), e);
}
}
}