package org.sakaiproject.util;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
class TerracottaClassLoader extends URLClassLoader {
/** Our logger */
private static Log log = LogFactory.getLog(ComponentsLoader.class);
private String classLoaderName;
public TerracottaClassLoader(URL[] urls, ClassLoader parent, String classLoaderName) {
super(urls, parent);
this.classLoaderName = classLoaderName;
boolean registeredWithTerracotta = false;
try {
if (parent == null) {
log.error("Parent classloader is set to null.");
} else {
Class<?> namedClassLoader = parent.loadClass("com.tc.object.loaders.NamedClassLoader");
if (namedClassLoader == null) {
log.error("Could not load Terracotta NamedClassLoader");
} else {
Class<?> helper = parent.loadClass("com.tc.object.bytecode.hook.impl.ClassProcessorHelper");
if (helper == null) {
log.error("Could not load Terracotta ClassProcessorHelper");
} else {
Method m = helper.getMethod("registerGlobalLoader", new Class<?>[] { namedClassLoader });
if (m == null) {
log.error("Could not find Terracotta Method - \"registerGlobalLoader\"");
} else {
m.invoke(null, new Object[] { this });
registeredWithTerracotta = true;
if (log.isInfoEnabled()) {
log.info("Registered the [" + classLoaderName +
"] class loader with Terracotta.");
}
}
}
}
}
} catch (Exception e) {
// It is important that normal startup not suffer if Terracotta is not running
// so catch any error that occurs in this block of code dealing with Terracotta
// class loader registering
log.error("Unexpected error occurred trying to register class loader [" +
classLoaderName + "] with Terracotta: "+e, e);
}
if (!registeredWithTerracotta) {
log.warn("The [" + classLoaderName +
"] class loader is not registered with Terracotta. Objects from this " +
"class loader will not be shared.");
}
}
// needed for Terracotta Clustering to work. Harmless for non-Terracotta environments
public String __tc_getClassLoaderName() {
return classLoaderName;
}
}