Skip to content

Commit be20e0a

Browse files
committed
step 2
1 parent 2978f77 commit be20e0a

File tree

7 files changed

+143
-169
lines changed

7 files changed

+143
-169
lines changed

gson/src/main/java/com/google/gson/Gson.java

Lines changed: 22 additions & 159 deletions
Original file line numberDiff line numberDiff line change
@@ -16,33 +16,18 @@
1616

1717
package com.google.gson;
1818

19-
import static com.google.gson.BuilderHelper.atomicLongAdapter;
20-
import static com.google.gson.BuilderHelper.atomicLongArrayAdapter;
21-
import static com.google.gson.BuilderHelper.doubleAdapter;
22-
import static com.google.gson.BuilderHelper.floatAdapter;
23-
import static com.google.gson.BuilderHelper.longAdapter;
2419
import static com.google.gson.BuilderHelper.unmodifiableList;
2520

2621
import com.google.gson.annotations.JsonAdapter;
2722
import com.google.gson.internal.ConstructorConstructor;
2823
import com.google.gson.internal.Excluder;
2924
import com.google.gson.internal.GsonBuildConfig;
30-
import com.google.gson.internal.LazilyParsedNumber;
3125
import com.google.gson.internal.Primitives;
3226
import com.google.gson.internal.Streams;
33-
import com.google.gson.internal.bind.ArrayTypeAdapter;
34-
import com.google.gson.internal.bind.CollectionTypeAdapterFactory;
35-
import com.google.gson.internal.bind.DefaultDateTypeAdapter;
3627
import com.google.gson.internal.bind.JsonAdapterAnnotationTypeAdapterFactory;
3728
import com.google.gson.internal.bind.JsonTreeReader;
3829
import com.google.gson.internal.bind.JsonTreeWriter;
39-
import com.google.gson.internal.bind.MapTypeAdapterFactory;
40-
import com.google.gson.internal.bind.NumberTypeAdapter;
41-
import com.google.gson.internal.bind.ObjectTypeAdapter;
42-
import com.google.gson.internal.bind.ReflectiveTypeAdapterFactory;
4330
import com.google.gson.internal.bind.SerializationDelegatingTypeAdapter;
44-
import com.google.gson.internal.bind.TypeAdapters;
45-
import com.google.gson.internal.sql.SqlTypesSupport;
4631
import com.google.gson.reflect.TypeToken;
4732
import com.google.gson.stream.JsonReader;
4833
import com.google.gson.stream.JsonToken;
@@ -54,17 +39,12 @@
5439
import java.io.StringReader;
5540
import java.io.Writer;
5641
import java.lang.reflect.Type;
57-
import java.math.BigDecimal;
58-
import java.math.BigInteger;
59-
import java.util.ArrayList;
6042
import java.util.HashMap;
6143
import java.util.List;
6244
import java.util.Map;
6345
import java.util.Objects;
6446
import java.util.concurrent.ConcurrentHashMap;
6547
import java.util.concurrent.ConcurrentMap;
66-
import java.util.concurrent.atomic.AtomicLong;
67-
import java.util.concurrent.atomic.AtomicLongArray;
6848

6949
/**
7050
* This is the main class for using Gson. Gson is typically used by first constructing a Gson
@@ -160,11 +140,8 @@ public final class Gson {
160140
static final FormattingStyle DEFAULT_FORMATTING_STYLE = FormattingStyle.COMPACT;
161141
static final boolean DEFAULT_ESCAPE_HTML = true;
162142
static final boolean DEFAULT_SERIALIZE_NULLS = false;
163-
static final boolean DEFAULT_COMPLEX_MAP_KEYS = false;
164143
static final boolean DEFAULT_SPECIALIZE_FLOAT_VALUES = false;
165-
static final boolean DEFAULT_USE_JDK_UNSAFE = true;
166144
static final String DEFAULT_DATE_PATTERN = null;
167-
static final FieldNamingStrategy DEFAULT_FIELD_NAMING_STRATEGY = FieldNamingPolicy.IDENTITY;
168145
static final ToNumberStrategy DEFAULT_OBJECT_TO_NUMBER_STRATEGY = ToNumberPolicy.DOUBLE;
169146
static final ToNumberStrategy DEFAULT_NUMBER_TO_NUMBER_STRATEGY =
170147
ToNumberPolicy.LAZILY_PARSED_NUMBER;
@@ -259,145 +236,31 @@ public Gson() {
259236
}
260237

261238
Gson(GsonBuilder builder) {
262-
this(
263-
builder.excluder,
264-
builder.fieldNamingPolicy,
265-
new HashMap<>(builder.instanceCreators),
266-
builder.serializeNulls,
267-
builder.complexMapKeySerialization,
268-
builder.generateNonExecutableJson,
269-
builder.escapeHtmlChars,
270-
builder.formattingStyle,
271-
builder.strictness,
272-
builder.serializeSpecialFloatingPointValues,
273-
builder.useJdkUnsafe,
274-
builder.longSerializationPolicy,
275-
builder.datePattern,
276-
builder.dateStyle,
277-
builder.timeStyle,
278-
unmodifiableList(builder.factories),
279-
unmodifiableList(builder.hierarchyFactories),
280-
builder.getAllFactoriesToBeAdded(),
281-
builder.objectToNumberStrategy,
282-
builder.numberToNumberStrategy,
283-
unmodifiableList(builder.reflectionFilters));
284-
}
285-
286-
private Gson(
287-
Excluder excluder,
288-
FieldNamingStrategy fieldNamingStrategy,
289-
Map<Type, InstanceCreator<?>> instanceCreators,
290-
boolean serializeNulls,
291-
boolean complexMapKeySerialization,
292-
boolean generateNonExecutableGson,
293-
boolean htmlSafe,
294-
FormattingStyle formattingStyle,
295-
Strictness strictness,
296-
boolean serializeSpecialFloatingPointValues,
297-
boolean useJdkUnsafe,
298-
LongSerializationPolicy longSerializationPolicy,
299-
String datePattern,
300-
int dateStyle,
301-
int timeStyle,
302-
List<TypeAdapterFactory> builderFactories,
303-
List<TypeAdapterFactory> builderHierarchyFactories,
304-
List<TypeAdapterFactory> factoriesToBeAdded,
305-
ToNumberStrategy objectToNumberStrategy,
306-
ToNumberStrategy numberToNumberStrategy,
307-
List<ReflectionAccessFilter> reflectionFilters) {
308-
this.excluder = excluder;
309-
this.fieldNamingStrategy = fieldNamingStrategy;
310-
this.instanceCreators = instanceCreators;
311-
this.serializeNulls = serializeNulls;
312-
this.complexMapKeySerialization = complexMapKeySerialization;
313-
this.generateNonExecutableJson = generateNonExecutableGson;
314-
this.htmlSafe = htmlSafe;
315-
this.formattingStyle = formattingStyle;
316-
this.strictness = strictness;
317-
this.serializeSpecialFloatingPointValues = serializeSpecialFloatingPointValues;
318-
this.useJdkUnsafe = useJdkUnsafe;
319-
this.longSerializationPolicy = longSerializationPolicy;
320-
this.datePattern = datePattern;
321-
this.dateStyle = dateStyle;
322-
this.timeStyle = timeStyle;
323-
this.builderFactories = builderFactories;
324-
this.builderHierarchyFactories = builderHierarchyFactories;
325-
this.objectToNumberStrategy = objectToNumberStrategy;
326-
this.numberToNumberStrategy = numberToNumberStrategy;
327-
this.reflectionFilters = reflectionFilters;
328-
329-
List<TypeAdapterFactory> factories = new ArrayList<>();
330-
331-
// built-in type adapters that cannot be overridden
332-
factories.add(TypeAdapters.JSON_ELEMENT_FACTORY);
333-
factories.add(ObjectTypeAdapter.getFactory(objectToNumberStrategy));
334-
335-
// the excluder must precede all adapters that handle user-defined types
336-
factories.add(excluder);
337-
338-
// users' type adapters
339-
factories.addAll(factoriesToBeAdded);
340-
341-
// type adapters for basic platform types
342-
factories.add(TypeAdapters.STRING_FACTORY);
343-
factories.add(TypeAdapters.INTEGER_FACTORY);
344-
factories.add(TypeAdapters.BOOLEAN_FACTORY);
345-
factories.add(TypeAdapters.BYTE_FACTORY);
346-
factories.add(TypeAdapters.SHORT_FACTORY);
347-
TypeAdapter<Number> longAdapter = longAdapter(longSerializationPolicy);
348-
factories.add(TypeAdapters.newFactory(long.class, Long.class, longAdapter));
349-
factories.add(
350-
TypeAdapters.newFactory(
351-
double.class, Double.class, doubleAdapter(serializeSpecialFloatingPointValues)));
352-
factories.add(
353-
TypeAdapters.newFactory(
354-
float.class, Float.class, floatAdapter(serializeSpecialFloatingPointValues)));
355-
factories.add(NumberTypeAdapter.getFactory(numberToNumberStrategy));
356-
factories.add(TypeAdapters.ATOMIC_INTEGER_FACTORY);
357-
factories.add(TypeAdapters.ATOMIC_BOOLEAN_FACTORY);
358-
factories.add(TypeAdapters.newFactory(AtomicLong.class, atomicLongAdapter(longAdapter)));
359-
factories.add(
360-
TypeAdapters.newFactory(AtomicLongArray.class, atomicLongArrayAdapter(longAdapter)));
361-
factories.add(TypeAdapters.ATOMIC_INTEGER_ARRAY_FACTORY);
362-
factories.add(TypeAdapters.CHARACTER_FACTORY);
363-
factories.add(TypeAdapters.STRING_BUILDER_FACTORY);
364-
factories.add(TypeAdapters.STRING_BUFFER_FACTORY);
365-
factories.add(TypeAdapters.newFactory(BigDecimal.class, TypeAdapters.BIG_DECIMAL));
366-
factories.add(TypeAdapters.newFactory(BigInteger.class, TypeAdapters.BIG_INTEGER));
367-
// Add adapter for LazilyParsedNumber because user can obtain it from Gson and then try to
368-
// serialize it again
369-
factories.add(
370-
TypeAdapters.newFactory(LazilyParsedNumber.class, TypeAdapters.LAZILY_PARSED_NUMBER));
371-
factories.add(TypeAdapters.URL_FACTORY);
372-
factories.add(TypeAdapters.URI_FACTORY);
373-
factories.add(TypeAdapters.UUID_FACTORY);
374-
factories.add(TypeAdapters.CURRENCY_FACTORY);
375-
factories.add(TypeAdapters.LOCALE_FACTORY);
376-
factories.add(TypeAdapters.INET_ADDRESS_FACTORY);
377-
factories.add(TypeAdapters.BIT_SET_FACTORY);
378-
factories.add(DefaultDateTypeAdapter.DEFAULT_STYLE_FACTORY);
379-
factories.add(TypeAdapters.CALENDAR_FACTORY);
380-
factories.addAll(SqlTypesSupport.SQL_TYPE_FACTORIES);
381-
factories.add(ArrayTypeAdapter.FACTORY);
382-
factories.add(TypeAdapters.CLASS_FACTORY);
383-
239+
this.excluder = builder.excluder;
240+
this.fieldNamingStrategy = builder.fieldNamingPolicy;
241+
this.instanceCreators = new HashMap<>(builder.instanceCreators);
242+
this.serializeNulls = builder.serializeNulls;
243+
this.complexMapKeySerialization = builder.complexMapKeySerialization;
244+
this.generateNonExecutableJson = builder.generateNonExecutableJson;
245+
this.htmlSafe = builder.escapeHtmlChars;
246+
this.formattingStyle = builder.formattingStyle;
247+
this.strictness = builder.strictness;
248+
this.serializeSpecialFloatingPointValues = builder.serializeSpecialFloatingPointValues;
249+
this.useJdkUnsafe = builder.useJdkUnsafe;
250+
this.longSerializationPolicy = builder.longSerializationPolicy;
251+
this.datePattern = builder.datePattern;
252+
this.dateStyle = builder.dateStyle;
253+
this.timeStyle = builder.timeStyle;
254+
this.builderFactories = unmodifiableList(builder.factories);
255+
this.builderHierarchyFactories = unmodifiableList(builder.hierarchyFactories);
256+
this.objectToNumberStrategy = builder.objectToNumberStrategy;
257+
this.numberToNumberStrategy = builder.numberToNumberStrategy;
258+
this.reflectionFilters = unmodifiableList(builder.reflectionFilters);
384259
this.constructorConstructor =
385260
new ConstructorConstructor(instanceCreators, useJdkUnsafe, reflectionFilters);
386-
// type adapters for composite and user-defined types
387-
factories.add(new CollectionTypeAdapterFactory(constructorConstructor));
388-
factories.add(new MapTypeAdapterFactory(constructorConstructor, complexMapKeySerialization));
389261
this.jsonAdapterFactory = new JsonAdapterAnnotationTypeAdapterFactory(constructorConstructor);
390-
factories.add(jsonAdapterFactory);
391-
factories.add(TypeAdapters.ENUM_FACTORY);
392-
factories.add(
393-
new ReflectiveTypeAdapterFactory(
394-
constructorConstructor,
395-
fieldNamingStrategy,
396-
excluder,
397-
jsonAdapterFactory,
398-
reflectionFilters));
399-
400-
this.factories = unmodifiableList(factories);
262+
this.factories =
263+
unmodifiableList(builder.createFactories(constructorConstructor, jsonAdapterFactory));
401264
}
402265

403266
/**

gson/src/main/java/com/google/gson/GsonBuilder.java

Lines changed: 96 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,11 @@
1616

1717
package com.google.gson;
1818

19-
import static com.google.gson.Gson.DEFAULT_COMPLEX_MAP_KEYS;
19+
import static com.google.gson.BuilderHelper.atomicLongAdapter;
20+
import static com.google.gson.BuilderHelper.atomicLongArrayAdapter;
21+
import static com.google.gson.BuilderHelper.doubleAdapter;
22+
import static com.google.gson.BuilderHelper.floatAdapter;
23+
import static com.google.gson.BuilderHelper.unmodifiableList;
2024
import static com.google.gson.Gson.DEFAULT_DATE_PATTERN;
2125
import static com.google.gson.Gson.DEFAULT_ESCAPE_HTML;
2226
import static com.google.gson.Gson.DEFAULT_FORMATTING_STYLE;
@@ -26,14 +30,23 @@
2630
import static com.google.gson.Gson.DEFAULT_SERIALIZE_NULLS;
2731
import static com.google.gson.Gson.DEFAULT_SPECIALIZE_FLOAT_VALUES;
2832
import static com.google.gson.Gson.DEFAULT_STRICTNESS;
29-
import static com.google.gson.Gson.DEFAULT_USE_JDK_UNSAFE;
33+
import static com.google.gson.internal.ConstructorConstructor.DEFAULT_USE_JDK_UNSAFE;
34+
import static com.google.gson.internal.bind.MapTypeAdapterFactory.DEFAULT_COMPLEX_MAP_KEYS;
3035

3136
import com.google.errorprone.annotations.CanIgnoreReturnValue;
3237
import com.google.errorprone.annotations.InlineMe;
3338
import com.google.gson.annotations.Since;
3439
import com.google.gson.annotations.Until;
40+
import com.google.gson.internal.ConstructorConstructor;
3541
import com.google.gson.internal.Excluder;
42+
import com.google.gson.internal.bind.ArrayTypeAdapter;
43+
import com.google.gson.internal.bind.CollectionTypeAdapterFactory;
3644
import com.google.gson.internal.bind.DefaultDateTypeAdapter;
45+
import com.google.gson.internal.bind.JsonAdapterAnnotationTypeAdapterFactory;
46+
import com.google.gson.internal.bind.MapTypeAdapterFactory;
47+
import com.google.gson.internal.bind.NumberTypeAdapter;
48+
import com.google.gson.internal.bind.ObjectTypeAdapter;
49+
import com.google.gson.internal.bind.ReflectiveTypeAdapterFactory;
3750
import com.google.gson.internal.bind.TreeTypeAdapter;
3851
import com.google.gson.internal.bind.TypeAdapters;
3952
import com.google.gson.internal.sql.SqlTypesSupport;
@@ -51,6 +64,8 @@
5164
import java.util.List;
5265
import java.util.Map;
5366
import java.util.Objects;
67+
import java.util.concurrent.atomic.AtomicLong;
68+
import java.util.concurrent.atomic.AtomicLongArray;
5469

5570
/**
5671
* Use this builder to construct a {@link Gson} instance when you need to set configuration options
@@ -92,7 +107,7 @@
92107
public final class GsonBuilder {
93108
Excluder excluder = Excluder.DEFAULT;
94109
LongSerializationPolicy longSerializationPolicy = LongSerializationPolicy.DEFAULT;
95-
FieldNamingStrategy fieldNamingPolicy = Gson.DEFAULT_FIELD_NAMING_STRATEGY;
110+
FieldNamingStrategy fieldNamingPolicy = FieldNamingPolicy.IDENTITY;
96111
final Map<Type, InstanceCreator<?>> instanceCreators = new HashMap<>();
97112
final List<TypeAdapterFactory> factories = new ArrayList<>();
98113

@@ -889,18 +904,89 @@ public Gson create() {
889904
return new Gson(this);
890905
}
891906

892-
List<TypeAdapterFactory> getAllFactoriesToBeAdded() {
893-
List<TypeAdapterFactory> factories =
894-
new ArrayList<>(this.factories.size() + this.hierarchyFactories.size() + 3);
895-
factories.addAll(this.factories);
907+
List<TypeAdapterFactory> createFactories(
908+
ConstructorConstructor constructorConstructor,
909+
JsonAdapterAnnotationTypeAdapterFactory jsonAdapterFactory) {
910+
List<TypeAdapterFactory> factories = new ArrayList<>();
911+
912+
// built-in type adapters that cannot be overridden
913+
factories.add(TypeAdapters.JSON_ELEMENT_FACTORY);
914+
factories.add(ObjectTypeAdapter.getFactory(objectToNumberStrategy));
915+
916+
// the excluder must precede all adapters that handle user-defined types
917+
factories.add(excluder);
918+
919+
// users' type adapters
920+
addUserDefinedAdapters(factories);
921+
922+
// type adapters for basic platform types
923+
factories.add(TypeAdapters.STRING_FACTORY);
924+
factories.add(TypeAdapters.INTEGER_FACTORY);
925+
factories.add(TypeAdapters.BOOLEAN_FACTORY);
926+
factories.add(TypeAdapters.BYTE_FACTORY);
927+
factories.add(TypeAdapters.SHORT_FACTORY);
928+
TypeAdapter<Number> longAdapter = longSerializationPolicy.typeAdapter();
929+
factories.add(TypeAdapters.newFactory(long.class, Long.class, longAdapter));
930+
factories.add(
931+
TypeAdapters.newFactory(
932+
double.class, Double.class, doubleAdapter(serializeSpecialFloatingPointValues)));
933+
factories.add(
934+
TypeAdapters.newFactory(
935+
float.class, Float.class, floatAdapter(serializeSpecialFloatingPointValues)));
936+
factories.add(NumberTypeAdapter.getFactory(numberToNumberStrategy));
937+
factories.add(TypeAdapters.ATOMIC_INTEGER_FACTORY);
938+
factories.add(TypeAdapters.ATOMIC_BOOLEAN_FACTORY);
939+
factories.add(TypeAdapters.newFactory(AtomicLong.class, atomicLongAdapter(longAdapter)));
940+
factories.add(
941+
TypeAdapters.newFactory(AtomicLongArray.class, atomicLongArrayAdapter(longAdapter)));
942+
factories.add(TypeAdapters.ATOMIC_INTEGER_ARRAY_FACTORY);
943+
factories.add(TypeAdapters.CHARACTER_FACTORY);
944+
factories.add(TypeAdapters.STRING_BUILDER_FACTORY);
945+
factories.add(TypeAdapters.STRING_BUFFER_FACTORY);
946+
factories.add(TypeAdapters.BIG_DECIMAL_FACTORY);
947+
factories.add(TypeAdapters.BIG_INTEGER_FACTORY);
948+
// Add adapter for LazilyParsedNumber because user can obtain it from Gson and then try to
949+
// serialize it again
950+
factories.add(TypeAdapters.LAZILY_PARSED_NUMBER_FACTORY);
951+
factories.add(TypeAdapters.URL_FACTORY);
952+
factories.add(TypeAdapters.URI_FACTORY);
953+
factories.add(TypeAdapters.UUID_FACTORY);
954+
factories.add(TypeAdapters.CURRENCY_FACTORY);
955+
factories.add(TypeAdapters.LOCALE_FACTORY);
956+
factories.add(TypeAdapters.INET_ADDRESS_FACTORY);
957+
factories.add(TypeAdapters.BIT_SET_FACTORY);
958+
factories.add(DefaultDateTypeAdapter.DEFAULT_STYLE_FACTORY);
959+
factories.add(TypeAdapters.CALENDAR_FACTORY);
960+
factories.addAll(SqlTypesSupport.SQL_TYPE_FACTORIES);
961+
factories.add(ArrayTypeAdapter.FACTORY);
962+
factories.add(TypeAdapters.CLASS_FACTORY);
963+
964+
// type adapters for composite and user-defined types
965+
factories.add(new CollectionTypeAdapterFactory(constructorConstructor));
966+
factories.add(new MapTypeAdapterFactory(constructorConstructor, complexMapKeySerialization));
967+
factories.add(jsonAdapterFactory);
968+
factories.add(TypeAdapters.ENUM_FACTORY);
969+
factories.add(
970+
new ReflectiveTypeAdapterFactory(
971+
constructorConstructor,
972+
fieldNamingPolicy,
973+
excluder,
974+
jsonAdapterFactory,
975+
unmodifiableList(reflectionFilters)));
976+
977+
return factories;
978+
}
979+
980+
private void addUserDefinedAdapters(List<TypeAdapterFactory> all) {
981+
List<TypeAdapterFactory> factories = new ArrayList<>(this.factories);
896982
Collections.reverse(factories);
983+
all.addAll(factories);
897984

898985
List<TypeAdapterFactory> hierarchyFactories = new ArrayList<>(this.hierarchyFactories);
899986
Collections.reverse(hierarchyFactories);
900-
factories.addAll(hierarchyFactories);
987+
all.addAll(hierarchyFactories);
901988

902-
addTypeAdaptersForDate(datePattern, dateStyle, timeStyle, factories);
903-
return Collections.unmodifiableList(factories);
989+
addTypeAdaptersForDate(datePattern, dateStyle, timeStyle, all);
904990
}
905991

906992
void addTypeAdaptersForDate(

0 commit comments

Comments
 (0)