package org.switchyard.as7.extension.camel; import java.io.IOException; import java.net.URISyntaxException; import java.net.URL; import java.util.Enumeration; import java.util.Set; import org.apache.camel.impl.DefaultPackageScanClassResolver; import org.apache.camel.spi.PackageScanFilter; import org.jboss.logging.Logger; import org.jboss.vfs.VFS; import org.jboss.vfs.VirtualFile; import org.switchyard.as7.extension.ExtensionLogger; /** * VFS-compatible version of DefaultPackageScanClassResolver. */ public class JBoss7PackageScanClassResolver extends DefaultPackageScanClassResolver { private static final Logger LOG = Logger.getLogger(JBoss7PackageScanClassResolver.class); protected void find(PackageScanFilter test, String packageName, ClassLoader loader, Set<Class<?>> classes) { if (LOG.isTraceEnabled()) { LOG.tracef("Searching for: %s in package: %s using classloader: %s", new Object[]{test, packageName, loader.getClass().getName()}); } Enumeration<URL> urls; try { urls = getResources(loader, packageName); if (!urls.hasMoreElements()) { LOG.trace("No URLs returned by classloader"); } } catch (IOException ioe) { ExtensionLogger.ROOT_LOGGER.cannotReadPackage(packageName, ioe); return; } while (urls.hasMoreElements()) { URL url = urls.nextElement(); LOG.tracef("URL from classloader: %s", url); if (url.toString().startsWith("vfs:")) { try { VirtualFile vfsDir = VFS.getChild(url); handleDirectory(vfsDir, null, classes, test); } catch (URISyntaxException uriEx) { ExtensionLogger.ROOT_LOGGER.failedToParseURL(url.toString(), uriEx); } } } } private void handleDirectory(VirtualFile file, String path, Set<Class<?>> classes, PackageScanFilter test) { for (VirtualFile child : file.getChildren()) { String newPath = (path == null) ? child.getName() : (path + '/' + child.getName()); if (child.isDirectory()) { handleDirectory(child, newPath, classes, test); } else { handleFile(child, classes, test); } } } private void handleFile(VirtualFile file, Set<Class<?>> classes, PackageScanFilter test) { if (file.getName().endsWith(".class")) { String fqn = file.getPathName(); String qn; if (fqn.indexOf("jar/") != -1) { qn = fqn.substring(fqn.indexOf("jar/") + 4); } else { qn = fqn.substring(fqn.indexOf("/") + 1); } addIfMatching(test, qn, classes); } } }