KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > net > sf > clirr > core > internal > bcel > BcelTypeArrayBuilder


1 package net.sf.clirr.core.internal.bcel;
2
3 import java.io.File JavaDoc;
4 import java.io.IOException JavaDoc;
5 import java.io.InputStream JavaDoc;
6 import java.net.MalformedURLException JavaDoc;
7 import java.net.URL JavaDoc;
8 import java.net.URLClassLoader JavaDoc;
9 import java.util.ArrayList JavaDoc;
10 import java.util.Enumeration JavaDoc;
11 import java.util.List JavaDoc;
12 import java.util.zip.ZipEntry JavaDoc;
13 import java.util.zip.ZipFile JavaDoc;
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     /**
29      * Disallow instantiation.
30      */

31     private BcelTypeArrayBuilder()
32     {
33     }
34     
35     /**
36      * Creates a set of classes to check.
37      *
38      * @param jarFiles a set of jar filed to scan for class files.
39      *
40      * @param thirdPartyClasses loads classes that are referenced
41      * by the classes in the jarFiles
42      *
43      * @param classSelector is an object which determines which classes from the
44      * old and new jars are to be compared. This parameter may be null, in
45      * which case all classes in the old and new jars are compared.
46      */

47     public static JavaType[] createClassSet(
48         File JavaDoc[] jarFiles, ClassLoader JavaDoc thirdPartyClasses, ClassFilter classSelector)
49         throws CheckerException
50     {
51         if (classSelector == null)
52         {
53             // create a class selector that selects all classes
54
classSelector = new ClassSelector(ClassSelector.MODE_UNLESS);
55         }
56
57         ClassLoader JavaDoc classLoader = createClassLoader(jarFiles, thirdPartyClasses);
58
59         Repository repository = new ClassLoaderRepository(classLoader);
60
61         List JavaDoc selected = new ArrayList JavaDoc();
62
63         for (int i = 0; i < jarFiles.length; i++)
64         {
65             File JavaDoc jarFile = jarFiles[i];
66             ZipFile JavaDoc zip = null;
67             try
68             {
69                 zip = new ZipFile JavaDoc(jarFile, ZipFile.OPEN_READ);
70             }
71             catch (IOException JavaDoc ex)
72             {
73                 throw new CheckerException(
74                     "Cannot open " + jarFile + " for reading", ex);
75             }
76             Enumeration JavaDoc enumEntries = zip.entries();
77             while (enumEntries.hasMoreElements())
78             {
79                 ZipEntry JavaDoc zipEntry = (ZipEntry JavaDoc) 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 JavaDoc createClassLoader(
98             File JavaDoc[] jarFiles, ClassLoader JavaDoc thirdPartyClasses)
99         {
100             final URL JavaDoc[] jarUrls = new URL JavaDoc[jarFiles.length];
101             for (int i = 0; i < jarFiles.length; i++)
102             {
103                 File JavaDoc jarFile = jarFiles[i];
104                 try
105                 {
106                     URL JavaDoc url = jarFile.toURL();
107                     jarUrls[i] = url;
108                 }
109                 catch (MalformedURLException JavaDoc ex)
110                 {
111                     // this should never happen
112
final IllegalArgumentException JavaDoc illegalArgumentException =
113                         new IllegalArgumentException JavaDoc(
114                             "Cannot create classloader with jar file " + jarFile);
115                     ExceptionUtil.initCause(illegalArgumentException, ex);
116                     throw illegalArgumentException;
117                 }
118             }
119             final URLClassLoader JavaDoc jarsLoader = new URLClassLoader JavaDoc(jarUrls, thirdPartyClasses);
120
121             return jarsLoader;
122         }
123
124     private static JavaClass extractClass(
125             ZipEntry JavaDoc zipEntry, ZipFile JavaDoc zip, Repository repository)
126             throws CheckerException
127         {
128             String JavaDoc name = zipEntry.getName();
129             InputStream JavaDoc 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 JavaDoc 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 JavaDoc ex)
154                     {
155                         throw new CheckerException("Cannot close " + zip.getName(), ex);
156                     }
157                 }
158             }
159         }
160
161 }
162
Popular Tags