1 package net.sf.clirr.core.internal.bcel; 2 3 import java.io.File ; 4 import java.io.IOException ; 5 import java.io.InputStream ; 6 import java.net.MalformedURLException ; 7 import java.net.URL ; 8 import java.net.URLClassLoader ; 9 import java.util.ArrayList ; 10 import java.util.Enumeration ; 11 import java.util.List ; 12 import java.util.zip.ZipEntry ; 13 import java.util.zip.ZipFile ; 14 15 import net.sf.clirr.core.CheckerException; 16 import net.sf.clirr.core.ClassFilter; 17 import net.sf.clirr.core.ClassSelector; 18 import net.sf.clirr.core.internal.ExceptionUtil; 19 import net.sf.clirr.core.spi.JavaType; 20 21 import org.apache.bcel.classfile.ClassParser; 22 import org.apache.bcel.classfile.JavaClass; 23 import org.apache.bcel.util.ClassLoaderRepository; 24 import org.apache.bcel.util.Repository; 25 26 public final class BcelTypeArrayBuilder 27 { 28 31 private BcelTypeArrayBuilder() 32 { 33 } 34 35 47 public static JavaType[] createClassSet( 48 File [] jarFiles, ClassLoader thirdPartyClasses, ClassFilter classSelector) 49 throws CheckerException 50 { 51 if (classSelector == null) 52 { 53 classSelector = new ClassSelector(ClassSelector.MODE_UNLESS); 55 } 56 57 ClassLoader classLoader = createClassLoader(jarFiles, thirdPartyClasses); 58 59 Repository repository = new ClassLoaderRepository(classLoader); 60 61 List selected = new ArrayList (); 62 63 for (int i = 0; i < jarFiles.length; i++) 64 { 65 File jarFile = jarFiles[i]; 66 ZipFile zip = null; 67 try 68 { 69 zip = new ZipFile (jarFile, ZipFile.OPEN_READ); 70 } 71 catch (IOException ex) 72 { 73 throw new CheckerException( 74 "Cannot open " + jarFile + " for reading", ex); 75 } 76 Enumeration enumEntries = zip.entries(); 77 while (enumEntries.hasMoreElements()) 78 { 79 ZipEntry zipEntry = (ZipEntry ) enumEntries.nextElement(); 80 if (!zipEntry.isDirectory() && zipEntry.getName().endsWith(".class")) 81 { 82 JavaClass clazz = extractClass(zipEntry, zip, repository); 83 if (classSelector.isSelected(clazz)) 84 { 85 selected.add(new BcelJavaType(clazz)); 86 repository.storeClass(clazz); 87 } 88 } 89 } 90 } 91 92 JavaType[] ret = new JavaType[selected.size()]; 93 selected.toArray(ret); 94 return ret; 95 } 96 97 private static ClassLoader createClassLoader( 98 File [] jarFiles, ClassLoader thirdPartyClasses) 99 { 100 final URL [] jarUrls = new URL [jarFiles.length]; 101 for (int i = 0; i < jarFiles.length; i++) 102 { 103 File jarFile = jarFiles[i]; 104 try 105 { 106 URL url = jarFile.toURL(); 107 jarUrls[i] = url; 108 } 109 catch (MalformedURLException ex) 110 { 111 final IllegalArgumentException illegalArgumentException = 113 new IllegalArgumentException ( 114 "Cannot create classloader with jar file " + jarFile); 115 ExceptionUtil.initCause(illegalArgumentException, ex); 116 throw illegalArgumentException; 117 } 118 } 119 final URLClassLoader jarsLoader = new URLClassLoader (jarUrls, thirdPartyClasses); 120 121 return jarsLoader; 122 } 123 124 private static JavaClass extractClass( 125 ZipEntry zipEntry, ZipFile zip, Repository repository) 126 throws CheckerException 127 { 128 String name = zipEntry.getName(); 129 InputStream is = null; 130 try 131 { 132 is = zip.getInputStream(zipEntry); 133 134 ClassParser parser = new ClassParser(is, name); 135 JavaClass clazz = parser.parse(); 136 clazz.setRepository(repository); 137 return clazz; 138 } 139 catch (IOException ex) 140 { 141 throw new CheckerException( 142 "Cannot read " + zipEntry.getName() + " from " + zip.getName(), 143 ex); 144 } 145 finally 146 { 147 if (is != null) 148 { 149 try 150 { 151 is.close(); 152 } 153 catch (IOException ex) 154 { 155 throw new CheckerException("Cannot close " + zip.getName(), ex); 156 } 157 } 158 } 159 } 160 161 } 162 | Popular Tags |