21
21
import java .net .URL ;
22
22
import java .nio .charset .StandardCharsets ;
23
23
import java .util .ArrayList ;
24
+ import java .util .Arrays ;
24
25
import java .util .Collection ;
25
26
import java .util .Collections ;
26
27
import java .util .List ;
28
+ import java .util .Map ;
27
29
import java .util .Objects ;
28
30
import java .util .WeakHashMap ;
29
31
@@ -48,7 +50,8 @@ public class SerialClassContext {
48
50
*/
49
51
public static final String DEFAULT_BLACK_LIST_NAME = "/META-INF/SerialClassBlacklist.txt" ;
50
52
51
- private static final WeakHashMap <ClassLoader , SerialClassContext > defaultSerialContextMap = new WeakHashMap <>();
53
+ private static final Map <ClassLoader , SerialClassContext > defaultSerialContextMap =
54
+ Collections .synchronizedMap (new WeakHashMap <>());
52
55
53
56
private static final String ARRAY_PREFIX = "[" ;
54
57
@@ -79,45 +82,38 @@ public static SerialClassContext createSerialClassContext(ClassLoader loader, Co
79
82
* @return serial class context.
80
83
*/
81
84
public static SerialClassContext getDefaultSerialContext (ClassLoader loader ) {
82
- if (loader == null )
83
- loader = ClassUtil .resolveContextClassLoader (null );
84
- SerialClassContext defaultContext = defaultSerialContextMap .get (loader );
85
- if (defaultContext == null ) {
86
- StringPrefixSet whitelist = readPrefixSet (loader , DEFAULT_WHITE_LIST_NAME , StringPrefixSet .ANYTHING_SET );
87
- StringPrefixSet blacklist = readPrefixSet (loader , DEFAULT_BLACK_LIST_NAME , StringPrefixSet .NOTHING_SET );
88
- defaultContext = new SerialClassContext (loader , whitelist , blacklist );
89
- defaultSerialContextMap .put (loader , defaultContext );
90
- }
91
- return defaultContext ;
85
+ return defaultSerialContextMap .computeIfAbsent (
86
+ ClassUtil .resolveContextClassLoader (loader ),
87
+ SerialClassContext ::readSerialClassContext );
88
+ }
89
+
90
+ private static SerialClassContext readSerialClassContext (ClassLoader cl ) {
91
+ StringPrefixSet whitelist = readPrefixSet (cl , DEFAULT_WHITE_LIST_NAME , StringPrefixSet .ANYTHING_SET );
92
+ StringPrefixSet blacklist = readPrefixSet (cl , DEFAULT_BLACK_LIST_NAME , StringPrefixSet .NOTHING_SET );
93
+ return new SerialClassContext (cl , whitelist , blacklist );
92
94
}
93
95
94
96
private static StringPrefixSet readPrefixSet (ClassLoader cl , String prefixSetName , StringPrefixSet def ) {
95
- if (prefixSetName == null )
96
- return def ;
97
- List <URL > urls = new ArrayList <>();
98
- if (cl == null )
99
- cl = Thread .currentThread ().getContextClassLoader ();
97
+ List <URL > urls ;
100
98
try {
101
- urls . addAll ( Collections .list (cl .getResources (prefixSetName ) ));
99
+ urls = Collections .list (cl .getResources (prefixSetName ));
102
100
} catch (IOException e ) {
103
101
return def ;
104
102
}
105
103
if (urls .isEmpty ())
106
104
return def ;
107
- StringPrefixSet set = null ;
105
+ List < String > names = new ArrayList <>() ;
108
106
for (URL url : urls ) {
109
107
try (BufferedReader r = new BufferedReader (new InputStreamReader (url .openStream (), StandardCharsets .UTF_8 ))) {
110
- for (String name ; (name = r .readLine ()) != null ;) {
111
- if (set == null )
112
- set = StringPrefixSet .valueOf (name );
113
- else
114
- set = set .add (StringPrefixSet .valueOf (name ));
108
+ for (String line ; (line = r .readLine ()) != null ;) {
109
+ // support multiple names on a single line for compatibility
110
+ names .addAll (Arrays .asList (line .split (StringPrefixSet .DEFAULT_NAMES_SEPARATOR )));
115
111
}
116
112
} catch (IOException e ) {
117
113
log .error ("Cannot read " + LogUtil .hideCredentials (url ), e );
118
114
}
119
115
}
120
- return set == null ? def : set ;
116
+ return names . isEmpty () ? def : StringPrefixSet . valueOf ( names ) ;
121
117
}
122
118
123
119
private final StringPrefixSet whitelist ;
@@ -157,7 +153,7 @@ public ClassLoader getClassLoader() {
157
153
* @return {@code true}, if class name contained in whitelist and not contained in blacklist.
158
154
* @throws NullPointerException if className is null.
159
155
*/
160
- public synchronized boolean accept (String className ) {
156
+ public boolean accept (String className ) {
161
157
Objects .requireNonNull (className , "className" );
162
158
if (className .startsWith (ARRAY_PREFIX ))
163
159
return true ;
@@ -176,7 +172,7 @@ public synchronized boolean accept(String className) {
176
172
* @throws ClassNotFoundException if the class not contained in whitelist or contained in blacklist.
177
173
* @throws NullPointerException if className is null.
178
174
*/
179
- public synchronized void check (String className ) throws ClassNotFoundException {
175
+ public void check (String className ) throws ClassNotFoundException {
180
176
Objects .requireNonNull (className , "className" );
181
177
if (className .startsWith (ARRAY_PREFIX ))
182
178
return ;
0 commit comments