package org.atomnuke.container.packaging.bindings.lang.java.scanner; import org.atomnuke.container.packaging.archive.ResourceType; import org.atomnuke.container.packaging.resource.Resource; import org.atomnuke.container.packaging.resource.ResourceManager; import org.atomnuke.container.packaging.resource.ResourceUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * * @author zinic */ public class ClassLoaderScanner { private static final Logger LOG = LoggerFactory.getLogger(ClassLoaderScanner.class); private final ResourceManager resourceManager; private final ClassLoader classLoader; public ClassLoaderScanner(ResourceManager resourceManager, ClassLoader classLoader) { this.resourceManager = resourceManager; this.classLoader = classLoader; } private void logLoadFailure(String classPath, Throwable cause) { LOG.debug("Linkage error detected with class: " + classPath + ". Unable to resolve dependency: " + cause.getMessage()); } public void scan(ClassVisitor... classVisitors) { for (Resource resource : resourceManager.resources()) { if (resource.type() == ResourceType.CLASS) { final String classPath = ResourceUtil.instance().relativePathToClassPath(resource.relativePath()); try { final Class loadedClass = classLoader.loadClass(classPath); for (ClassVisitor classVisitor : classVisitors) { classVisitor.visit(loadedClass); } } catch (NoClassDefFoundError noClassDefFoundError) { logLoadFailure(classPath, noClassDefFoundError); } catch (ClassNotFoundException classNotFoundException) { logLoadFailure(classPath, classNotFoundException); } } } } }