Skip to content

Commit 3dae43c

Browse files
committed
fix tests
1 parent 303fcf8 commit 3dae43c

11 files changed

Lines changed: 63 additions & 32 deletions

File tree

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ private static String genSource(String cacheKey, Class clazz, Type[] typeArgs) {
9292
return CodegenImplObject.genObjectUsingSlice(clazz, cacheKey, desc);
9393
}
9494
}
95-
if (desc.forbidUnknownFields) {
95+
if (desc.failOnUnknownFields) {
9696
// only slice support unknown field tracking
9797
return CodegenImplObject.genObjectUsingSlice(clazz, cacheKey, desc);
9898
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ private static void appendMissingMandatoryFields(StringBuilder lines) {
124124
}
125125

126126
private static void appendOnUnknownField(StringBuilder lines, ClassDescriptor desc) {
127-
if (desc.forbidUnknownFields) {
127+
if (desc.failOnUnknownFields) {
128128
append(lines, "throw new com.jsoniter.JsonException('unknown field: ' + field.toString());".replace('\'', '"'));
129129
} else {
130130
append(lines, "iter.skip();");

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -325,15 +325,15 @@ public final <T> T read(T existingObject) throws IOException {
325325

326326
public final <T> T read(TypeLiteral<T> typeLiteral, T existingObject) throws IOException {
327327
this.existingObject = existingObject;
328-
return (T) Codegen.getDecoder(typeLiteral.getCacheKey(), typeLiteral.getType()).decode(this);
328+
return (T) Codegen.getDecoder(typeLiteral.getDecoderCacheKey(), typeLiteral.getType()).decode(this);
329329
}
330330

331331
public final <T> T read(Class<T> clazz) throws IOException {
332332
return (T) Codegen.getDecoder(TypeLiteral.generateDecoderCacheKey(clazz), clazz).decode(this);
333333
}
334334

335335
public final <T> T read(TypeLiteral<T> typeLiteral) throws IOException {
336-
return (T) Codegen.getDecoder(typeLiteral.getCacheKey(), typeLiteral.getType()).decode(this);
336+
return (T) Codegen.getDecoder(typeLiteral.getDecoderCacheKey(), typeLiteral.getType()).decode(this);
337337
}
338338

339339
public ValueType whatIsNext() throws IOException {

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ public void updateClassDescriptor(ClassDescriptor desc) {
3636
}
3737
desc.ctor.staticMethodName = null;
3838
desc.ctor.ctor = ctor;
39+
desc.ctor.staticFactory = null;
3940
Annotation[][] annotations = ctor.getParameterAnnotations();
4041
for (int i = 0; i < annotations.length; i++) {
4142
Annotation[] paramAnnotations = annotations[i];
@@ -60,6 +61,7 @@ public void updateClassDescriptor(ClassDescriptor desc) {
6061
}
6162
desc.ctor.staticMethodName = method.getName();
6263
desc.ctor.staticFactory = method;
64+
desc.ctor.ctor = null;
6365
Annotation[][] annotations = method.getParameterAnnotations();
6466
for (int i = 0; i < annotations.length; i++) {
6567
Annotation[] paramAnnotations = annotations[i];

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

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

3+
import com.jsoniter.spi.Extension;
34
import com.jsoniter.spi.ExtensionManager;
45
import com.jsoniter.JsonException;
56
import com.jsoniter.spi.Encoder;
@@ -66,6 +67,7 @@ private static synchronized Encoder gen(String cacheKey, Type type) {
6667
} catch (Exception e) {
6768
System.err.println("failed to generate encoder for: " + type + " with " + Arrays.toString(typeArgs));
6869
System.err.println(source);
70+
ExtensionManager.dump();
6971
throw new JsonException(e);
7072
}
7173
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,6 @@ public final void writeVal(Object obj) throws IOException {
209209
}
210210

211211
public final <T> void writeVal(TypeLiteral<T> typeLiteral, T obj) throws IOException {
212-
Codegen.getEncoder(typeLiteral.getCacheKey(), typeLiteral.getType()).encode(obj, this);
212+
Codegen.getEncoder(typeLiteral.getEncoderCacheKey(), typeLiteral.getType()).encode(obj, this);
213213
}
214214
}

src/main/java/com/jsoniter/spi/ClassDescriptor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ public class ClassDescriptor {
99
public List<Binding> fields;
1010
public List<SetterDescriptor> setters;
1111
public List<Binding> getters;
12-
public boolean forbidUnknownFields;
12+
public boolean failOnUnknownFields;
1313

1414
public List<Binding> allDecoderBindings() {
1515
ArrayList<Binding> bindings = new ArrayList<Binding>(8);

src/main/java/com/jsoniter/spi/ExtensionManager.java

Lines changed: 31 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -25,31 +25,31 @@ public static void registerTypeDecoder(Class clazz, Decoder decoder) {
2525
}
2626

2727
public static void registerTypeDecoder(TypeLiteral typeLiteral, Decoder decoder) {
28-
addNewDecoder(typeLiteral.getCacheKey(), decoder);
28+
addNewDecoder(typeLiteral.getDecoderCacheKey(), decoder);
2929
}
3030

3131
public static void registerFieldDecoder(Class clazz, String field, Decoder decoder) {
3232
addNewDecoder(field + "@" + TypeLiteral.generateDecoderCacheKey(clazz), decoder);
3333
}
3434

3535
public static void registerFieldDecoder(TypeLiteral typeLiteral, String field, Decoder decoder) {
36-
addNewDecoder(field + "@" + typeLiteral.getCacheKey(), decoder);
36+
addNewDecoder(field + "@" + typeLiteral.getDecoderCacheKey(), decoder);
3737
}
3838

3939
public static void registerTypeEncoder(Class clazz, Encoder encoder) {
4040
addNewEncoder(TypeLiteral.generateEncoderCacheKey(clazz), encoder);
4141
}
4242

4343
public static void registerTypeEncoder(TypeLiteral typeLiteral, Encoder encoder) {
44-
addNewEncoder(typeLiteral.getCacheKey(), encoder);
44+
addNewEncoder(typeLiteral.getDecoderCacheKey(), encoder);
4545
}
4646

4747
public static void registerFieldEncoder(Class clazz, String field, Encoder encoder) {
4848
addNewEncoder(field + "@" + TypeLiteral.generateEncoderCacheKey(clazz), encoder);
4949
}
5050

5151
public static void registerFieldEncoder(TypeLiteral typeLiteral, String field, Encoder encoder) {
52-
addNewEncoder(field + "@" + typeLiteral.getCacheKey(), encoder);
52+
addNewEncoder(field + "@" + typeLiteral.getDecoderCacheKey(), encoder);
5353
}
5454

5555
public static Decoder getDecoder(String cacheKey) {
@@ -63,6 +63,9 @@ public synchronized static void addNewDecoder(String cacheKey, Decoder decoder)
6363
}
6464

6565
public static Encoder getEncoder(String cacheKey) {
66+
if (cacheKey.startsWith("decoder")) {
67+
throw new RuntimeException();
68+
}
6669
return encoders.get(cacheKey);
6770
}
6871

@@ -97,14 +100,21 @@ public static ClassDescriptor getClassDescriptor(Class clazz, boolean includingP
97100
if (binding.fromNames == null) {
98101
binding.fromNames = new String[]{binding.name};
99102
}
103+
if (binding.field != null && includingPrivate) {
104+
binding.field.setAccessible(true);
105+
}
106+
binding.clazz = clazz;
107+
binding.valueTypeLiteral = TypeLiteral.create(binding.valueType);
108+
}
109+
for (Binding binding : desc.allEncoderBindings()) {
100110
if (binding.toNames == null) {
101111
binding.toNames = new String[]{binding.name};
102112
}
103113
if (binding.field != null && includingPrivate) {
104114
binding.field.setAccessible(true);
105115
}
106116
binding.clazz = clazz;
107-
binding.valueTypeLiteral = createTypeLiteral(binding.valueType);
117+
binding.valueTypeLiteral = TypeLiteral.create(binding.valueType);
108118
}
109119
return desc;
110120
}
@@ -143,7 +153,7 @@ private static Binding createBindingFromField(Class clazz, Field field) {
143153
binding.fromNames = new String[]{field.getName()};
144154
binding.name = field.getName();
145155
binding.valueType = field.getType();
146-
binding.valueTypeLiteral = createTypeLiteral(binding.valueType);
156+
binding.valueTypeLiteral = TypeLiteral.create(binding.valueType);
147157
binding.clazz = clazz;
148158
binding.annotations = field.getAnnotations();
149159
binding.field = field;
@@ -163,10 +173,6 @@ private static List<Field> getAllFields(Class clazz, boolean includingPrivate) {
163173
return allFields;
164174
}
165175

166-
private static TypeLiteral createTypeLiteral(Type valueType) {
167-
return new TypeLiteral(valueType, TypeLiteral.generateDecoderCacheKey(valueType));
168-
}
169-
170176
private static List<SetterDescriptor> getSetters(Class clazz, boolean includingPrivate) {
171177
ArrayList<SetterDescriptor> setters = new ArrayList<SetterDescriptor>();
172178
List<Method> allMethods = Arrays.asList(clazz.getMethods());
@@ -207,7 +213,7 @@ private static List<SetterDescriptor> getSetters(Class clazz, boolean includingP
207213
param.fromNames = new String[]{fromName};
208214
param.name = fromName;
209215
param.valueType = paramTypes[0];
210-
param.valueTypeLiteral = createTypeLiteral(param.valueType);
216+
param.valueTypeLiteral = TypeLiteral.create(param.valueType);
211217
param.clazz = clazz;
212218
setter.parameters.add(param);
213219
setters.add(setter);
@@ -234,17 +240,26 @@ private static List<Binding> getGetters(Class clazz, boolean includingPrivate) {
234240
if (method.getGenericParameterTypes().length != 0) {
235241
continue;
236242
}
237-
String fromName = methodName.substring("get".length());
238-
char[] fromNameChars = fromName.toCharArray();
243+
String toName = methodName.substring("get".length());
244+
char[] fromNameChars = toName.toCharArray();
239245
fromNameChars[0] = Character.toLowerCase(fromNameChars[0]);
240-
fromName = new String(fromNameChars);
246+
toName = new String(fromNameChars);
241247
Binding getter = new Binding();
242-
getter.fromNames = new String[]{methodName + "()"};
243-
getter.name = fromName;
248+
getter.toNames = new String[]{toName};
249+
getter.name = methodName + "()";
244250
getter.valueType = method.getGenericReturnType();
245251
getter.clazz = clazz;
246252
getters.add(getter);
247253
}
248254
return getters;
249255
}
256+
257+
public static void dump() {
258+
for (String cacheKey : decoders.keySet()) {
259+
System.err.println(cacheKey);
260+
}
261+
for (String cacheKey : encoders.keySet()) {
262+
System.err.println(cacheKey);
263+
}
264+
}
250265
}

src/main/java/com/jsoniter/spi/TypeLiteral.java

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@
88
public class TypeLiteral<T> {
99

1010
final Type type;
11-
final String cacheKey;
11+
final String decoderCacheKey;
12+
final String encoderCacheKey;
1213

1314
/**
1415
* Constructs a new type literal. Derives represented class from type parameter.
@@ -18,13 +19,14 @@ public class TypeLiteral<T> {
1819
@SuppressWarnings("unchecked")
1920
protected TypeLiteral() {
2021
this.type = getSuperclassTypeParameter(getClass());
21-
cacheKey = generateDecoderCacheKey(type);
22-
22+
decoderCacheKey = generateDecoderCacheKey(type);
23+
encoderCacheKey = generateEncoderCacheKey(type);
2324
}
2425

25-
public TypeLiteral(Type type, String cacheKey) {
26+
public TypeLiteral(Type type, String decoderCacheKey, String encoderCacheKey) {
2627
this.type = type;
27-
this.cacheKey = cacheKey;
28+
this.decoderCacheKey = decoderCacheKey;
29+
this.encoderCacheKey = encoderCacheKey;
2830
}
2931

3032
public static String generateDecoderCacheKey(Type type) {
@@ -84,19 +86,28 @@ static Type getSuperclassTypeParameter(Class<?> subclass) {
8486
return parameterized.getActualTypeArguments()[0];
8587
}
8688

89+
public static TypeLiteral create(Type valueType) {
90+
return new TypeLiteral(valueType, generateDecoderCacheKey(valueType), generateEncoderCacheKey(valueType));
91+
}
92+
8793
public Type getType() {
8894
return type;
8995
}
9096

91-
public String getCacheKey() {
92-
return cacheKey;
97+
public String getDecoderCacheKey() {
98+
return decoderCacheKey;
99+
}
100+
101+
public String getEncoderCacheKey() {
102+
return encoderCacheKey;
93103
}
94104

95105
@Override
96106
public String toString() {
97107
return "TypeLiteral{" +
98108
"type=" + type +
99-
", cacheKey='" + cacheKey + '\'' +
109+
", decoderCacheKey='" + decoderCacheKey + '\'' +
110+
", encoderCacheKey='" + encoderCacheKey + '\'' +
100111
'}';
101112
}
102113
}

src/test/java/com/jsoniter/TestCustomizeField.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ public void test_throw_exception_on_unknown_field() throws IOException {
153153
@Override
154154
public void updateClassDescriptor(ClassDescriptor desc) {
155155
if (desc.clazz == TestObject8.class) {
156-
desc.forbidUnknownFields = true;
156+
desc.failOnUnknownFields = true;
157157
}
158158
}
159159
});

0 commit comments

Comments
 (0)