package net.csdn.modules.scan; import javassist.ClassPool; import net.csdn.ServiceFramwork; import net.csdn.modules.scan.component.ClasspathUrlFinder; import net.csdn.modules.scan.component.Filter; import net.csdn.modules.scan.component.IteratorFactory; import net.csdn.modules.scan.component.StreamIterator; import java.io.*; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import java.util.List; /** * BlogInfo: WilliamZhu * Date: 12-6-4 * Time: 下午2:04 */ public class DefaultScanService implements ScanService { @Override public URL packagePath(String packageName) { URL class_file_base_url = ClasspathUrlFinder.findClassBase(DefaultScanService.class); try { return new URL("file:" + class_file_base_url.getPath() + packageName.replaceAll("\\.", "/") + "/"); } catch (MalformedURLException e) { e.printStackTrace(); } return null; } @Override public List<String> classNames(String packageName) { URL class_file_base_url = ClasspathUrlFinder.findClassBase(DefaultScanService.class); File packageDir = new File(class_file_base_url.getPath() + packageName.replaceAll("\\.", "/")); List<String> classes = new ArrayList<String>(); List<File> files = new ArrayList<File>(); iterateDir(packageDir, files); for (File f : files) { String path = f.getPath(); classes.add(path.substring(class_file_base_url.getPath().length(), path.length() - 6).replaceAll(File.separator, ".")); } String obj = ""; return classes; } @Override public List<String> classNames(String packageName, Class baseClass) { URL class_file_base_url = ClasspathUrlFinder.findClassBase(baseClass); File packageDir = new File(class_file_base_url.getPath() + packageName.replaceAll("\\.", "/")); List<String> classes = new ArrayList<String>(); List<File> files = new ArrayList<File>(); iterateDir(packageDir, files); for (File f : files) { String path = f.getPath(); classes.add(path.substring(class_file_base_url.getPath().length(), path.length() - 6).replaceAll(File.separator, ".")); } String obj = ""; return classes; } private void iterateDir(File file, List<File> files) { if (file.isDirectory()) { for (File f : file.listFiles()) { iterateDir(f, files); } } else { files.add(file); } } @Override public List<InputStream> scanArchives(String packageName) throws IOException { return scanArchives(packagePath(packageName)); } @Override public List<Class> scanArchives(String packageName, LoadClassEnhanceCallBack loadClassEnhanceCallBack) throws IOException { return scanClass(scanArchives(packagePath(packageName)), loadClassEnhanceCallBack); } @Override public List<InputStream> scanArchives(URL... urls) throws IOException { List<InputStream> streamList = new ArrayList<InputStream>(); for (URL url : urls) { Filter filter = new Filter() { public boolean accepts(String filename) { if (filename.endsWith(".class")) { return true; } return false; } }; try { StreamIterator it = IteratorFactory.create(url, filter); InputStream stream; while ((stream = it.next()) != null) streamList.add(stream); } catch (IOException e) { throw e; } } return streamList; } @Override public Class scanClass(InputStream bits, LoadClassEnhanceCallBack loadClassEnhanceCallBack) throws IOException { DataInputStream dstream = new DataInputStream(new BufferedInputStream(bits)); ClassPool cp = ServiceFramwork.classPool; try { try { return loadClassEnhanceCallBack.loaded(cp, dstream); } catch (Exception e) { e.printStackTrace(); } return null; } finally { dstream.close(); bits.close(); } } @Override public List<Class> scanClass(List<InputStream> inputStreams, LoadClassEnhanceCallBack loadClassEnhanceCallBack) throws IOException { List<Class> classList = new ArrayList<Class>(); for (InputStream inputStream : inputStreams) { classList.add(scanClass(inputStream, loadClassEnhanceCallBack)); } return classList; } }