package org.jboss.seam.deployment; import java.net.URL; import javax.servlet.ServletContext; import org.jboss.seam.log.LogProvider; import org.jboss.seam.log.Logging; public class ClassDescriptor extends FileDescriptor { private static LogProvider log = Logging.getLogProvider(ClassDescriptor.class); private Class<?> clazz; public ClassDescriptor(String name, URL url, Class<?> clazz) { super(name, url); this.clazz = clazz; } public ClassDescriptor(String name, ClassLoader classLoader,ServletContext servletContext) { super(name, classLoader,servletContext); String classname = filenameToClassname(name); log.trace("Trying to load class " + classname); try { clazz = classLoader.loadClass(classname); // IBM JVM will throw a TypeNotPresentException if any annotation on the class is not on // the classpath, rendering the class virtually unusable (given Seam's heavy use of annotations) clazz.getAnnotations(); } catch (ClassNotFoundException cnfe) { log.debug("could not load class: " + classname, cnfe); } catch (NoClassDefFoundError ncdfe) { log.debug("could not load class (missing dependency): " + classname, ncdfe); } catch (TypeNotPresentException tnpe) { clazz = null; log.debug("could not load class (annotation missing dependency): " + classname, tnpe); } } public Class<?> getClazz() { return clazz; } @Override public String toString() { return clazz.getName(); } /** * Convert a path to a class file to a class name */ public static String filenameToClassname(String filename) { return filename.substring( 0, filename.lastIndexOf(".class") ) .replace('/', '.').replace('\\', '.'); } @Override public boolean equals(Object other) { if (other instanceof ClassDescriptor) { ClassDescriptor that = (ClassDescriptor) other; return this.getClazz().equals(that.getClazz()); } else { return false; } } @Override public int hashCode() { return getClazz().hashCode(); } }