1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.bcel.util;
20
21 import java.io.IOException;
22 import java.io.InputStream;
23
24 import org.apache.bcel.classfile.ClassParser;
25 import org.apache.bcel.classfile.JavaClass;
26 import org.apache.bcel.classfile.Utility;
27
28
29
30
31
32
33
34
35
36
37
38 abstract class AbstractClassPathRepository implements Repository {
39
40 private final ClassPath classPath;
41
42 AbstractClassPathRepository(final ClassPath classPath) {
43 this.classPath = classPath;
44 }
45
46 @Override
47 public abstract void clear();
48
49 @Override
50 public abstract JavaClass findClass(String className);
51
52 @Override
53 public ClassPath getClassPath() {
54 return classPath;
55 }
56
57
58
59
60
61
62
63
64
65
66
67 @Override
68 public JavaClass loadClass(final Class<?> clazz) throws ClassNotFoundException {
69 final String className = clazz.getName();
70 final JavaClass repositoryClass = findClass(className);
71 if (repositoryClass != null) {
72 return repositoryClass;
73 }
74 String name = className;
75 final int i = name.lastIndexOf('.');
76 if (i > 0) {
77 name = name.substring(i + 1);
78 }
79
80 try (InputStream clsStream = clazz.getResourceAsStream(name + JavaClass.EXTENSION)) {
81 return loadClass(clsStream, className);
82 } catch (final IOException e) {
83 return null;
84 }
85 }
86
87 private JavaClass loadClass(final InputStream inputStream, final String className) throws ClassNotFoundException {
88 try {
89 if (inputStream != null) {
90 final ClassParser parser = new ClassParser(inputStream, className);
91 final JavaClass clazz = parser.parse();
92 storeClass(clazz);
93 return clazz;
94 }
95 } catch (final IOException e) {
96 throw new ClassNotFoundException("Exception while looking for class " + className + ": " + e, e);
97 }
98 throw new ClassNotFoundException("ClassRepository could not load " + className);
99 }
100
101
102
103
104
105
106
107
108
109 @Override
110 public JavaClass loadClass(String className) throws ClassNotFoundException {
111 if (className == null || className.isEmpty()) {
112 throw new IllegalArgumentException("Invalid class name " + className);
113 }
114 className = Utility.pathToPackage(className);
115 final JavaClass clazz = findClass(className);
116 if (clazz != null) {
117 return clazz;
118 }
119 try (InputStream inputStream = classPath.getInputStream(className)) {
120 return loadClass(inputStream, className);
121 } catch (final IOException e) {
122 throw new ClassNotFoundException("Exception while looking for class " + className + ": " + e, e);
123 }
124 }
125
126 @Override
127 public abstract void removeClass(JavaClass javaClass);
128
129 @Override
130 public abstract void storeClass(JavaClass javaClass);
131 }