package org.fastcatsearch.util; import java.io.File; import java.io.IOException; import java.net.URL; import java.util.ArrayList; import java.util.Enumeration; import java.util.List; import java.util.jar.JarEntry; import java.util.jar.JarFile; public abstract class ClassDetector<E> { public List<E> detectClass(String pkg) { List<E> classes = new ArrayList<E>(); ClassLoader clsldr = getClass().getClassLoader(); String path = pkg.replace(".", "/"); try { Enumeration<URL> em = clsldr.getResources(path); while(em.hasMoreElements()) { String urlstr = em.nextElement().toString(); if(urlstr.startsWith("jar:file:")) { String jpath = urlstr.substring(9); int st = jpath.indexOf("!/"); jpath = jpath.substring(0,st); JarFile jf = new JarFile(jpath); Enumeration<JarEntry>jee = jf.entries(); while(jee.hasMoreElements()) { JarEntry je = jee.nextElement(); String ename = je.getName(); E ar = classify(ename,pkg); if(ar!=null) { classes.add(ar); } } } else if(urlstr.startsWith("file:")) { File file = new File(urlstr.substring(5)); File[] dir = file.listFiles(); for(int i=0;i<dir.length;i++) { E ar = classify(pkg+dir[i].getName(),pkg); if(ar!=null) { classes.add(ar); } } } } return classes; } catch (IOException e) { } return null; } public abstract E classify(String ename, String pkg); }