|
1 | 1 | package com.jsoniter; |
2 | 2 |
|
3 | | -import com.jsoniter.spi.Binding; |
4 | | -import com.jsoniter.spi.ClassDescriptor; |
5 | | -import com.jsoniter.spi.Decoder; |
6 | | -import com.jsoniter.spi.Extension; |
| 3 | +import com.jsoniter.spi.*; |
7 | 4 | import javassist.ClassPool; |
8 | 5 | import javassist.CtClass; |
9 | 6 | import javassist.CtMethod; |
|
14 | 11 |
|
15 | 12 | class Codegen { |
16 | 13 | static boolean strictMode = false; |
17 | | - static volatile Map<String, Decoder> cache = new HashMap<String, Decoder>(); |
18 | 14 | static ClassPool pool = ClassPool.getDefault(); |
19 | 15 |
|
20 | 16 | public static void enableStrictMode() { |
21 | 17 | strictMode = true; |
22 | 18 | } |
23 | 19 |
|
24 | 20 | static Decoder getDecoder(String cacheKey, Type type) { |
25 | | - Decoder decoder = cache.get(cacheKey); |
| 21 | + Decoder decoder = ExtensionManager.getDecoder(cacheKey); |
26 | 22 | if (decoder != null) { |
27 | 23 | return decoder; |
28 | 24 | } |
29 | 25 | return gen(cacheKey, type); |
30 | 26 | } |
31 | 27 |
|
32 | 28 | private synchronized static Decoder gen(String cacheKey, Type type) { |
33 | | - Decoder decoder = cache.get(cacheKey); |
| 29 | + Decoder decoder = ExtensionManager.getDecoder(cacheKey); |
34 | 30 | if (decoder != null) { |
35 | 31 | return decoder; |
36 | 32 | } |
37 | | - for (Extension extension : ExtensionManager.extensions) { |
| 33 | + for (Extension extension : ExtensionManager.getExtensions()) { |
38 | 34 | decoder = extension.createDecoder(cacheKey, type); |
39 | 35 | if (decoder != null) { |
40 | | - addNewDecoder(cacheKey, decoder); |
| 36 | + ExtensionManager.addNewDecoder(cacheKey, decoder); |
41 | 37 | return decoder; |
42 | 38 | } |
43 | 39 | } |
@@ -66,7 +62,7 @@ private synchronized static Decoder gen(String cacheKey, Type type) { |
66 | 62 | "}", ctClass); |
67 | 63 | ctClass.addMethod(interfaceMethod); |
68 | 64 | decoder = (Decoder) ctClass.toClass().newInstance(); |
69 | | - addNewDecoder(cacheKey, decoder); |
| 65 | + ExtensionManager.addNewDecoder(cacheKey, decoder); |
70 | 66 | return decoder; |
71 | 67 | } catch (Exception e) { |
72 | 68 | System.err.println("failed to generate decoder for: " + type + " with " + Arrays.toString(typeArgs)); |
@@ -108,10 +104,4 @@ private static String genSource(String cacheKey, Class clazz, Type[] typeArgs) { |
108 | 104 | } |
109 | 105 | return CodegenImplObject.genObjectUsingHash(clazz, cacheKey, desc); |
110 | 106 | } |
111 | | - |
112 | | - public static void addNewDecoder(String cacheKey, Decoder decoder) { |
113 | | - HashMap<String, Decoder> newCache = new HashMap<String, Decoder>(cache); |
114 | | - newCache.put(cacheKey, decoder); |
115 | | - cache = newCache; |
116 | | - } |
117 | 107 | } |
0 commit comments