author | jjg |
Tue, 15 Dec 2009 13:26:06 -0800 | |
changeset 4550 | af96bc3bdfb9 |
parent 4549 | 5288a060c75e |
child 5520 | 86e4b9a9da40 |
permissions | -rw-r--r-- |
4549
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
1 |
/* |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
2 |
* Copyright 2009 Sun Microsystems, Inc. All Rights Reserved. |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
3 |
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
4 |
* |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
5 |
* This code is free software; you can redistribute it and/or modify it |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
6 |
* under the terms of the GNU General Public License version 2 only, as |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
7 |
* published by the Free Software Foundation. Sun designates this |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
8 |
* particular file as subject to the "Classpath" exception as provided |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
9 |
* by Sun in the LICENSE file that accompanied this code. |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
10 |
* |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
11 |
* This code is distributed in the hope that it will be useful, but WITHOUT |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
12 |
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
13 |
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
14 |
* version 2 for more details (a copy is included in the LICENSE file that |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
15 |
* accompanied this code). |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
16 |
* |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
17 |
* You should have received a copy of the GNU General Public License version |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
18 |
* 2 along with this work; if not, write to the Free Software Foundation, |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
19 |
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
20 |
* |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
21 |
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
22 |
* CA 95054 USA or visit www.sun.com if you need additional information or |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
23 |
* have any questions. |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
24 |
*/ |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
25 |
|
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
26 |
import java.io.*; |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
27 |
import java.util.*; |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
28 |
import java.util.regex.Pattern; |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
29 |
import javax.tools.*; |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
30 |
|
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
31 |
import com.sun.tools.classfile.*; |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
32 |
import com.sun.tools.classfile.Dependencies.*; |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
33 |
import com.sun.tools.classfile.Dependency.Location; |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
34 |
import com.sun.tools.javac.file.JavacFileManager; |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
35 |
import com.sun.tools.javac.util.Context; |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
36 |
|
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
37 |
/** |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
38 |
* Demo utility for using the classfile dependency analysis API framework. |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
39 |
* |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
40 |
* Usage: |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
41 |
* getdeps [options] classes |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
42 |
* where options include: |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
43 |
* -classpath path where to find classes to analyze |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
44 |
* -p package-name restrict analysis to classes in this package |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
45 |
* (may be given multiple times) |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
46 |
* -r regex restrict analysis to packages matching pattern |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
47 |
* (-p and -r are exclusive) |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
48 |
* -rev invert the dependencies in the output |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
49 |
* -t transitive closure of dependencies |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
50 |
*/ |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
51 |
public class GetDeps { |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
52 |
public static void main(String... args) throws Exception { |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
53 |
new GetDeps().run(args); |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
54 |
} |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
55 |
|
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
56 |
void run(String... args) throws IOException, ClassFileNotFoundException { |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
57 |
PrintWriter pw = new PrintWriter(System.out); |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
58 |
try { |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
59 |
run(pw, args); |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
60 |
} finally { |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
61 |
pw.flush(); |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
62 |
} |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
63 |
} |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
64 |
|
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
65 |
void run(PrintWriter out, String... args) throws IOException, ClassFileNotFoundException { |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
66 |
decodeArgs(args); |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
67 |
|
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
68 |
final StandardJavaFileManager fm = new JavacFileManager(new Context(), false, null); |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
69 |
if (classpath != null) |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
70 |
fm.setLocation(StandardLocation.CLASS_PATH, classpath); |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
71 |
|
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
72 |
ClassFileReader reader = new ClassFileReader(fm); |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
73 |
|
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
74 |
Dependencies d = new Dependencies(); |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
75 |
|
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
76 |
if (regex != null) |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
77 |
d.setFilter(Dependencies.getRegexFilter(Pattern.compile(regex))); |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
78 |
|
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
79 |
if (packageNames.size() > 0) |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
80 |
d.setFilter(Dependencies.getPackageFilter(packageNames, false)); |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
81 |
|
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
82 |
SortedRecorder r = new SortedRecorder(reverse); |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
83 |
|
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
84 |
d.findAllDependencies(reader, rootClassNames, transitiveClosure, r); |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
85 |
|
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
86 |
SortedMap<Location,SortedSet<Dependency>> deps = r.getMap(); |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
87 |
for (Map.Entry<Location, SortedSet<Dependency>> e: deps.entrySet()) { |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
88 |
out.println(e.getKey()); |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
89 |
for (Dependency dep: e.getValue()) { |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
90 |
out.println(" " + dep.getTarget()); |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
91 |
} |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
92 |
} |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
93 |
} |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
94 |
|
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
95 |
void decodeArgs(String... args) { |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
96 |
rootClassNames = new TreeSet<String>(); |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
97 |
packageNames = new TreeSet<String>(); |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
98 |
|
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
99 |
for (int i = 0; i < args.length; i++) { |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
100 |
String arg = args[i]; |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
101 |
if (arg.equals("-classpath") && (i + 1 < args.length)) |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
102 |
classpath = getPathFiles(args[++i]); |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
103 |
else if (arg.equals("-p") && (i + 1 < args.length)) |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
104 |
packageNames.add(args[++i]); |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
105 |
else if (arg.equals("-r") && (i + 1 < args.length)) |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
106 |
regex = args[++i]; |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
107 |
else if (arg.equals("-rev")) |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
108 |
reverse = true; |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
109 |
else if (arg.equals("-t")) |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
110 |
transitiveClosure = true; |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
111 |
else if (arg.startsWith("-")) |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
112 |
throw new Error(arg); |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
113 |
else { |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
114 |
for ( ; i < args.length; i++) |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
115 |
rootClassNames.add(args[i]); |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
116 |
} |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
117 |
} |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
118 |
} |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
119 |
|
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
120 |
List<File> getPathFiles(String path) { |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
121 |
List<File> files = new ArrayList<File>(); |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
122 |
for (String p: path.split(File.pathSeparator)) { |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
123 |
if (p.length() > 0) |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
124 |
files.add(new File(p)); |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
125 |
} |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
126 |
return files; |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
127 |
} |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
128 |
|
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
129 |
boolean transitiveClosure; |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
130 |
List<File> classpath; |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
131 |
Set<String> rootClassNames; |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
132 |
Set<String> packageNames; |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
133 |
String regex; |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
134 |
boolean reverse; |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
135 |
|
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
136 |
|
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
137 |
static class ClassFileReader implements Dependencies.ClassFileReader { |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
138 |
private JavaFileManager fm; |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
139 |
|
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
140 |
ClassFileReader(JavaFileManager fm) { |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
141 |
this.fm = fm; |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
142 |
} |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
143 |
|
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
144 |
@Override |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
145 |
public ClassFile getClassFile(String className) throws ClassFileNotFoundException { |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
146 |
try { |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
147 |
JavaFileObject fo = fm.getJavaFileForInput( |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
148 |
StandardLocation.CLASS_PATH, className, JavaFileObject.Kind.CLASS); |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
149 |
if (fo == null) |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
150 |
fo = fm.getJavaFileForInput( |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
151 |
StandardLocation.PLATFORM_CLASS_PATH, className, JavaFileObject.Kind.CLASS); |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
152 |
if (fo == null) |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
153 |
throw new ClassFileNotFoundException(className); |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
154 |
InputStream in = fo.openInputStream(); |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
155 |
try { |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
156 |
return ClassFile.read(in); |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
157 |
} finally { |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
158 |
in.close(); |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
159 |
} |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
160 |
} catch (ConstantPoolException e) { |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
161 |
throw new ClassFileNotFoundException(className, e); |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
162 |
} catch (IOException e) { |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
163 |
throw new ClassFileNotFoundException(className, e); |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
164 |
} |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
165 |
} |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
166 |
}; |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
167 |
|
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
168 |
static class SortedRecorder implements Recorder { |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
169 |
public SortedRecorder(boolean reverse) { |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
170 |
this.reverse = reverse; |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
171 |
} |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
172 |
|
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
173 |
public void addDependency(Dependency d) { |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
174 |
Location o = (reverse ? d.getTarget() : d.getOrigin()); |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
175 |
SortedSet<Dependency> odeps = map.get(o); |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
176 |
if (odeps == null) { |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
177 |
Comparator<Dependency> c = (reverse ? originComparator : targetComparator); |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
178 |
map.put(o, odeps = new TreeSet<Dependency>(c)); |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
179 |
} |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
180 |
odeps.add(d); |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
181 |
} |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
182 |
|
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
183 |
public SortedMap<Location, SortedSet<Dependency>> getMap() { |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
184 |
return map; |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
185 |
} |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
186 |
|
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
187 |
private Comparator<Dependency> originComparator = new Comparator<Dependency>() { |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
188 |
public int compare(Dependency o1, Dependency o2) { |
4550
af96bc3bdfb9
6910317: [classfile] typo and other issues in Dependency classes
jjg
parents:
4549
diff
changeset
|
189 |
return o1.getOrigin().toString().compareTo(o2.getOrigin().toString()); |
4549
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
190 |
} |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
191 |
}; |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
192 |
|
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
193 |
private Comparator<Dependency> targetComparator = new Comparator<Dependency>() { |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
194 |
public int compare(Dependency o1, Dependency o2) { |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
195 |
return o1.getTarget().toString().compareTo(o2.getTarget().toString()); |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
196 |
} |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
197 |
}; |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
198 |
|
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
199 |
private Comparator<Location> locationComparator = new Comparator<Location>() { |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
200 |
public int compare(Location o1, Location o2) { |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
201 |
return o1.toString().compareTo(o2.toString()); |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
202 |
} |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
203 |
}; |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
204 |
|
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
205 |
private final SortedMap<Location, SortedSet<Dependency>> map = |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
206 |
new TreeMap<Location, SortedSet<Dependency>>(locationComparator); |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
207 |
|
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
208 |
boolean reverse; |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
209 |
} |
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
210 |
|
5288a060c75e
6907575: [classfile] add support for classfile dependency analysis
jjg
parents:
diff
changeset
|
211 |
} |