Skip to content

Commit 14858c8

Browse files
committed
move ExtensionManager and TypeLiteral into spi
1 parent de0f1db commit 14858c8

27 files changed

Lines changed: 115 additions & 75 deletions

src/main/java/com/jsoniter/Codegen.java

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
11
package com.jsoniter;
22

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.*;
74
import javassist.ClassPool;
85
import javassist.CtClass;
96
import javassist.CtMethod;
@@ -14,30 +11,29 @@
1411

1512
class Codegen {
1613
static boolean strictMode = false;
17-
static volatile Map<String, Decoder> cache = new HashMap<String, Decoder>();
1814
static ClassPool pool = ClassPool.getDefault();
1915

2016
public static void enableStrictMode() {
2117
strictMode = true;
2218
}
2319

2420
static Decoder getDecoder(String cacheKey, Type type) {
25-
Decoder decoder = cache.get(cacheKey);
21+
Decoder decoder = ExtensionManager.getDecoder(cacheKey);
2622
if (decoder != null) {
2723
return decoder;
2824
}
2925
return gen(cacheKey, type);
3026
}
3127

3228
private synchronized static Decoder gen(String cacheKey, Type type) {
33-
Decoder decoder = cache.get(cacheKey);
29+
Decoder decoder = ExtensionManager.getDecoder(cacheKey);
3430
if (decoder != null) {
3531
return decoder;
3632
}
37-
for (Extension extension : ExtensionManager.extensions) {
33+
for (Extension extension : ExtensionManager.getExtensions()) {
3834
decoder = extension.createDecoder(cacheKey, type);
3935
if (decoder != null) {
40-
addNewDecoder(cacheKey, decoder);
36+
ExtensionManager.addNewDecoder(cacheKey, decoder);
4137
return decoder;
4238
}
4339
}
@@ -66,7 +62,7 @@ private synchronized static Decoder gen(String cacheKey, Type type) {
6662
"}", ctClass);
6763
ctClass.addMethod(interfaceMethod);
6864
decoder = (Decoder) ctClass.toClass().newInstance();
69-
addNewDecoder(cacheKey, decoder);
65+
ExtensionManager.addNewDecoder(cacheKey, decoder);
7066
return decoder;
7167
} catch (Exception e) {
7268
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) {
108104
}
109105
return CodegenImplObject.genObjectUsingHash(clazz, cacheKey, desc);
110106
}
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-
}
117107
}

src/main/java/com/jsoniter/CodegenAccess.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.jsoniter;
22

33
import com.jsoniter.spi.Decoder;
4+
import com.jsoniter.spi.ExtensionManager;
45

56
import java.io.IOException;
67
import java.util.Collection;
@@ -32,27 +33,27 @@ public static byte nextToken(JsonIterator iter) throws IOException {
3233
}
3334

3435
public static final boolean readBoolean(String cacheKey, JsonIterator iter) throws IOException {
35-
return ((Decoder.BooleanDecoder) Codegen.cache.get(cacheKey)).decodeBoolean(iter);
36+
return ((Decoder.BooleanDecoder) ExtensionManager.getDecoder(cacheKey)).decodeBoolean(iter);
3637
}
3738

3839
public static final short readShort(String cacheKey, JsonIterator iter) throws IOException {
39-
return ((Decoder.ShortDecoder) Codegen.cache.get(cacheKey)).decodeShort(iter);
40+
return ((Decoder.ShortDecoder) ExtensionManager.getDecoder(cacheKey)).decodeShort(iter);
4041
}
4142

4243
public static final int readInt(String cacheKey, JsonIterator iter) throws IOException {
43-
return ((Decoder.IntDecoder) Codegen.cache.get(cacheKey)).decodeInt(iter);
44+
return ((Decoder.IntDecoder) ExtensionManager.getDecoder(cacheKey)).decodeInt(iter);
4445
}
4546

4647
public static final long readLong(String cacheKey, JsonIterator iter) throws IOException {
47-
return ((Decoder.LongDecoder) Codegen.cache.get(cacheKey)).decodeLong(iter);
48+
return ((Decoder.LongDecoder) ExtensionManager.getDecoder(cacheKey)).decodeLong(iter);
4849
}
4950

5051
public static final float readFloat(String cacheKey, JsonIterator iter) throws IOException {
51-
return ((Decoder.FloatDecoder) Codegen.cache.get(cacheKey)).decodeFloat(iter);
52+
return ((Decoder.FloatDecoder) ExtensionManager.getDecoder(cacheKey)).decodeFloat(iter);
5253
}
5354

5455
public static final double readDouble(String cacheKey, JsonIterator iter) throws IOException {
55-
return ((Decoder.DoubleDecoder) Codegen.cache.get(cacheKey)).decodeDouble(iter);
56+
return ((Decoder.DoubleDecoder) ExtensionManager.getDecoder(cacheKey)).decodeDouble(iter);
5657
}
5758

5859
public static final <T> T read(String cacheKey, JsonIterator iter) throws IOException {

src/main/java/com/jsoniter/CodegenImplNative.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
import com.jsoniter.spi.Binding;
44
import com.jsoniter.spi.Decoder;
5+
import com.jsoniter.spi.ExtensionManager;
6+
import com.jsoniter.spi.TypeLiteral;
57

68
import java.lang.reflect.ParameterizedType;
79
import java.lang.reflect.Type;
@@ -85,10 +87,10 @@ public static String genReadOp(Type type) {
8587
public static String genField(Binding field, String cacheKey) {
8688
String fieldCacheKey = field.name + "@" + cacheKey;
8789
if (field.decoder != null) {
88-
Codegen.cache.put(fieldCacheKey, field.decoder);
90+
ExtensionManager.addNewDecoder(fieldCacheKey, field.decoder);
8991
}
9092
// the field decoder might be registered directly
91-
Decoder decoder = Codegen.cache.get(fieldCacheKey);
93+
Decoder decoder = ExtensionManager.getDecoder(fieldCacheKey);
9294
Type fieldType = field.valueType;
9395
if (decoder == null) {
9496
return String.format("(%s)%s", getTypeName(fieldType), CodegenImplNative.genReadOp(fieldType));

src/main/java/com/jsoniter/JsonIterator.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package com.jsoniter;
22

3+
import com.jsoniter.spi.TypeLiteral;
4+
35
import java.io.Closeable;
46
import java.io.IOException;
57
import java.io.InputStream;
@@ -323,15 +325,15 @@ public final <T> T read(T existingObject) throws IOException {
323325

324326
public final <T> T read(TypeLiteral<T> typeLiteral, T existingObject) throws IOException {
325327
this.existingObject = existingObject;
326-
return (T) Codegen.getDecoder(typeLiteral.cacheKey, typeLiteral.getType()).decode(this);
328+
return (T) Codegen.getDecoder(typeLiteral.getCacheKey(), typeLiteral.getType()).decode(this);
327329
}
328330

329331
public final <T> T read(Class<T> clazz) throws IOException {
330332
return (T) Codegen.getDecoder(TypeLiteral.generateDecoderCacheKey(clazz), clazz).decode(this);
331333
}
332334

333335
public final <T> T read(TypeLiteral<T> typeLiteral) throws IOException {
334-
return (T) Codegen.getDecoder(typeLiteral.cacheKey, typeLiteral.getType()).decode(this);
336+
return (T) Codegen.getDecoder(typeLiteral.getCacheKey(), typeLiteral.getType()).decode(this);
335337
}
336338

337339
public ValueType whatIsNext() throws IOException {

src/main/java/com/jsoniter/ReflectionDecoder.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
11
package com.jsoniter;
22

3-
import com.jsoniter.spi.Binding;
4-
import com.jsoniter.spi.ClassDescriptor;
5-
import com.jsoniter.spi.Decoder;
6-
import com.jsoniter.spi.SetterDescriptor;
3+
import com.jsoniter.spi.*;
74

85
import java.io.IOException;
96
import java.lang.reflect.Constructor;

src/main/java/com/jsoniter/annotation/JsoniterAnnotationSupport.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
package com.jsoniter.annotation;
22

33
import com.jsoniter.*;
4-
import com.jsoniter.spi.Binding;
5-
import com.jsoniter.spi.ClassDescriptor;
6-
import com.jsoniter.spi.EmptyExtension;
7-
import com.jsoniter.spi.SetterDescriptor;
4+
import com.jsoniter.spi.*;
85

96
import java.lang.annotation.Annotation;
107
import java.lang.reflect.Constructor;

src/main/java/com/jsoniter/output/Codegen.java

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.jsoniter.output;
22

3+
import com.jsoniter.spi.ExtensionManager;
34
import com.jsoniter.JsonException;
45
import com.jsoniter.spi.Encoder;
56
import javassist.ClassPool;
@@ -11,30 +12,28 @@
1112
import java.lang.reflect.Type;
1213
import java.util.Arrays;
1314
import java.util.Collection;
14-
import java.util.HashMap;
1515
import java.util.Map;
1616

1717
class Codegen {
1818

19-
static volatile Map<String, Encoder> cache = new HashMap<String, Encoder>();
2019
static ClassPool pool = ClassPool.getDefault();
2120

2221
public static Encoder getEncoder(String cacheKey, Type type) {
23-
Encoder encoder = cache.get(cacheKey);
22+
Encoder encoder = ExtensionManager.getEncoder(cacheKey);
2423
if (encoder != null) {
2524
return encoder;
2625
}
2726
return gen(cacheKey, type);
2827
}
2928

3029
private static synchronized Encoder gen(String cacheKey, Type type) {
31-
Encoder encoder = cache.get(cacheKey);
30+
Encoder encoder = ExtensionManager.getEncoder(cacheKey);
3231
if (encoder != null) {
3332
return encoder;
3433
}
3534
encoder = CodegenImplNative.NATIVE_ENCODERS.get(type);
3635
if (encoder != null) {
37-
addNewEncoder(cacheKey, encoder);
36+
ExtensionManager.addNewEncoder(cacheKey, encoder);
3837
return encoder;
3938
}
4039
Type[] typeArgs = new Type[0];
@@ -62,7 +61,7 @@ private static synchronized Encoder gen(String cacheKey, Type type) {
6261
"}", ctClass);
6362
ctClass.addMethod(interfaceMethod);
6463
encoder = (Encoder) ctClass.toClass().newInstance();
65-
addNewEncoder(cacheKey, encoder);
64+
ExtensionManager.addNewEncoder(cacheKey, encoder);
6665
return encoder;
6766
} catch (Exception e) {
6867
System.err.println("failed to generate encoder for: " + type + " with " + Arrays.toString(typeArgs));
@@ -71,11 +70,6 @@ private static synchronized Encoder gen(String cacheKey, Type type) {
7170
}
7271
}
7372

74-
public static void addNewEncoder(String cacheKey, Encoder encoder) {
75-
HashMap<String, Encoder> newCache = new HashMap<String, Encoder>(cache);
76-
newCache.put(cacheKey, encoder);
77-
cache = newCache;
78-
}
7973

8074
private static String genSource(String cacheKey, Class clazz, Type[] typeArgs) {
8175
if (clazz.isArray()) {

src/main/java/com/jsoniter/output/CodegenImplNative.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.jsoniter.output;
22

33
import com.jsoniter.JsonException;
4-
import com.jsoniter.TypeLiteral;
4+
import com.jsoniter.spi.TypeLiteral;
55
import com.jsoniter.spi.Encoder;
66

77
import java.io.IOException;
@@ -18,6 +18,12 @@ public void encode(Object obj, JsonStream stream) throws IOException {
1818
stream.writeVal((String) obj);
1919
}
2020
});
21+
put(Object.class, new Encoder() {
22+
@Override
23+
public void encode(Object obj, JsonStream stream) throws IOException {
24+
stream.writeVal(obj);
25+
}
26+
});
2127
}};
2228

2329
public static String genWriteOp(String code, Type valueType) {

src/main/java/com/jsoniter/output/CodegenImplObject.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import com.jsoniter.spi.Binding;
44
import com.jsoniter.spi.ClassDescriptor;
5-
import com.jsoniter.ExtensionManager;
5+
import com.jsoniter.spi.ExtensionManager;
66

77
class CodegenImplObject {
88
public static String genObject(Class clazz) {

src/main/java/com/jsoniter/output/JsonStream.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
11
package com.jsoniter.output;
22

3-
import com.jsoniter.TypeLiteral;
3+
import com.jsoniter.spi.TypeLiteral;
44

55
import java.io.IOException;
66
import java.io.OutputStream;
77
import java.nio.charset.Charset;
8-
import java.util.ArrayList;
9-
import java.util.List;
108

119
public class JsonStream extends OutputStream {
1210

0 commit comments

Comments
 (0)