package org.quartz.impl;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.quartz.SchedulerException;
/**
* This utility calls methods reflectively on the given objects even though the
* methods are likely on a proper interface (ThreadPool, JobStore, etc). The
* motivation is to be tolerant of older implementations that have not been
* updated for the changes in the interfaces (eg. LocalTaskExecutorThreadPool in
* spring quartz helpers)
*
* @author teck
*/
class SchedulerDetailsSetter {
private static final Logger LOGGER = LoggerFactory.getLogger(SchedulerDetailsSetter.class);
private SchedulerDetailsSetter() {
//
}
static void setDetails(Object target, String schedulerName,
String schedulerId) throws SchedulerException {
set(target, "setInstanceName", schedulerName);
set(target, "setInstanceId", schedulerId);
}
private static void set(Object target, String method, String value)
throws SchedulerException {
final Method setter;
try {
setter = target.getClass().getMethod(method, String.class);
} catch (SecurityException e) {
LOGGER.error("A SecurityException occured: " + e.getMessage(), e);
return;
} catch (NoSuchMethodException e) {
// This probably won't happen since the interface has the method
LOGGER.warn(target.getClass().getName()
+ " does not contain public method " + method + "(String)");
return;
}
if (Modifier.isAbstract(setter.getModifiers())) {
// expected if method not implemented (but is present on
// interface)
LOGGER.warn(target.getClass().getName()
+ " does not implement " + method
+ "(String)");
return;
}
try {
setter.invoke(target, value);
} catch (InvocationTargetException ite) {
throw new SchedulerException(ite.getTargetException());
} catch (Exception e) {
throw new SchedulerException(e);
}
}
}