19
19
20
20
import java .util .Map ;
21
21
22
+ import com .google .common .base .Optional ;
22
23
import com .google .common .base .Preconditions ;
23
24
import com .google .common .base .Strings ;
24
25
import com .google .common .collect .Maps ;
29
30
* @author Kristian
30
31
*/
31
32
class CachedPackage {
32
- private final Map <String , Class <?>> cache ;
33
+ private final Map <String , Optional < Class <?> >> cache ;
33
34
private final String packageName ;
34
35
private final ClassSource source ;
35
36
@@ -50,7 +51,7 @@ public CachedPackage(String packageName, ClassSource source) {
50
51
* @param clazz - type of class.
51
52
*/
52
53
public void setPackageClass (String className , Class <?> clazz ) {
53
- cache .put (className , clazz );
54
+ cache .put (className , Optional .< Class <?>> fromNullable ( clazz ) );
54
55
}
55
56
56
57
/**
@@ -61,19 +62,24 @@ public void setPackageClass(String className, Class<?> clazz) {
61
62
*/
62
63
public Class <?> getPackageClass (String className ) {
63
64
try {
64
- Class <?> result = cache .get (Preconditions .checkNotNull (className , "className cannot be NULL" ));
65
+ Optional < Class <?> > result = cache .get (Preconditions .checkNotNull (className , "className cannot be NULL" ));
65
66
66
67
// Concurrency is not a problem - we don't care if we look up a class twice
67
68
if (result == null ) {
68
69
// Look up the class dynamically
69
- result = source .loadClass (combine (packageName , className ));
70
- if (result == null )
70
+ result = Optional .< Class <?>> fromNullable ( source .loadClass (combine (packageName , className ) ));
71
+ if (! result . isPresent () )
71
72
throw new IllegalArgumentException ("Source " + source + " returned NULL for " + className );
72
73
73
74
cache .put (className , result );
74
75
}
75
76
76
- return result ;
77
+ // Class has been looked for and hasn't been found in the past
78
+ if (!result .isPresent ()) {
79
+ throw new ClassNotFoundException ();
80
+ }
81
+
82
+ return result .get ();
77
83
} catch (ClassNotFoundException e ) {
78
84
setPackageClass (className , null );
79
85
throw new RuntimeException ("Cannot find class " + combine (packageName , className ), e );
0 commit comments