Skip to content

Commit faf68c5

Browse files
committed
more refactoring, test adds
1 parent d849d3b commit faf68c5

22 files changed

+198
-110
lines changed

src/main/java/com/fasterxml/jackson/databind/ser/BasicSerializerFactory.java

+5-4
Original file line numberDiff line numberDiff line change
@@ -94,12 +94,10 @@ public abstract class BasicSerializerFactory
9494
Object value = en.getValue();
9595
if (value instanceof JsonSerializer<?>) {
9696
concrete.put(en.getKey().getName(), (JsonSerializer<?>) value);
97-
} else if (value instanceof Class<?>) {
97+
} else {
9898
@SuppressWarnings("unchecked")
9999
Class<? extends JsonSerializer<?>> cls = (Class<? extends JsonSerializer<?>>) value;
100100
concLazy.put(en.getKey().getName(), cls);
101-
} else { // should never happen, but:
102-
throw new IllegalStateException("Internal error: unrecognized value of type "+en.getClass().getName());
103101
}
104102
}
105103

@@ -544,7 +542,7 @@ protected JsonSerializer<?> buildContainerSerializer(SerializerProvider prov,
544542
* leave it as is; no clean way to make it work.
545543
*/
546544
if (!staticTyping && type.useStaticType()) {
547-
if (!type.isContainerType() || type.getContentType().getRawClass() != Object.class) {
545+
if (!type.isContainerType() || !type.getContentType().isJavaLangObject()) {
548546
staticTyping = true;
549547
}
550548
}
@@ -1140,6 +1138,8 @@ protected boolean usesStaticTyping(SerializationConfig config,
11401138
return config.isEnabled(MapperFeature.USE_STATIC_TYPING);
11411139
}
11421140

1141+
// Commecnted out in 2.9
1142+
/*
11431143
protected Class<?> _verifyAsClass(Object src, String methodName, Class<?> noneClass)
11441144
{
11451145
if (src == null) {
@@ -1154,4 +1154,5 @@ protected Class<?> _verifyAsClass(Object src, String methodName, Class<?> noneCl
11541154
}
11551155
return cls;
11561156
}
1157+
*/
11571158
}

src/main/java/com/fasterxml/jackson/databind/ser/BeanSerializerFactory.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ public SerializerFactory withConfig(SerializerFactoryConfig config)
113113
protected Iterable<Serializers> customSerializers() {
114114
return _factoryConfig.serializers();
115115
}
116-
116+
117117
/*
118118
/**********************************************************
119119
/* SerializerFactory impl

src/main/java/com/fasterxml/jackson/databind/ser/impl/IndexedListSerializer.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ public IndexedListSerializer withResolved(BeanProperty property,
4848

4949
@Override
5050
public boolean isEmpty(SerializerProvider prov, List<?> value) {
51-
return (value == null) || value.isEmpty();
51+
return value.isEmpty();
5252
}
5353

5454
@Override

src/main/java/com/fasterxml/jackson/databind/ser/impl/IteratorSerializer.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ public IteratorSerializer(IteratorSerializer src,
2727

2828
@Override
2929
public boolean isEmpty(SerializerProvider prov, Iterator<?> value) {
30-
return (value == null) || !value.hasNext();
30+
return !value.hasNext();
3131
}
3232

3333
@Override

src/main/java/com/fasterxml/jackson/databind/ser/impl/MapEntrySerializer.java

-3
Original file line numberDiff line numberDiff line change
@@ -300,9 +300,6 @@ public boolean hasSingleElement(Map.Entry<?,?> value) {
300300
@Override
301301
public boolean isEmpty(SerializerProvider prov, Entry<?, ?> entry)
302302
{
303-
if (entry == null) {
304-
return true;
305-
}
306303
Object value = entry.getValue();
307304
if (value == null) {
308305
return _suppressNulls;

src/main/java/com/fasterxml/jackson/databind/ser/impl/StringArraySerializer.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ public JsonSerializer<?> getContentSerializer() {
142142

143143
@Override
144144
public boolean isEmpty(SerializerProvider prov, String[] value) {
145-
return (value == null) || (value.length == 0);
145+
return (value.length == 0);
146146
}
147147

148148
@Override

src/main/java/com/fasterxml/jackson/databind/ser/std/ByteArraySerializer.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ public ByteArraySerializer() {
3636

3737
@Override
3838
public boolean isEmpty(SerializerProvider prov, byte[] value) {
39-
return (value == null) || (value.length == 0);
39+
return value.length == 0;
4040
}
4141

4242
@Override

src/main/java/com/fasterxml/jackson/databind/ser/std/CollectionSerializer.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ public CollectionSerializer withResolved(BeanProperty property,
7777

7878
@Override
7979
public boolean isEmpty(SerializerProvider prov, Collection<?> value) {
80-
return (value == null) || value.isEmpty();
80+
return value.isEmpty();
8181
}
8282

8383
@Override

src/main/java/com/fasterxml/jackson/databind/ser/std/DateTimeSerializerBase.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -87,11 +87,11 @@ public JsonSerializer<?> createContextual(SerializerProvider serializers,
8787
@Override
8888
public boolean isEmpty(SerializerProvider serializers, T value) {
8989
// let's assume "null date" (timestamp 0) qualifies for empty
90-
return (value == null) || (_timestamp(value) == 0L);
90+
return _timestamp(value) == 0L;
9191
}
92-
92+
9393
protected abstract long _timestamp(T value);
94-
94+
9595
@Override
9696
public JsonNode getSchema(SerializerProvider serializers, Type typeHint) {
9797
//todo: (ryan) add a format for the date in the schema?

src/main/java/com/fasterxml/jackson/databind/ser/std/EnumSetSerializer.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ public EnumSetSerializer withResolved(BeanProperty property,
3939

4040
@Override
4141
public boolean isEmpty(SerializerProvider prov, EnumSet<? extends Enum<?>> value) {
42-
return (value == null) || value.isEmpty();
42+
return value.isEmpty();
4343
}
4444

4545
@Override

src/main/java/com/fasterxml/jackson/databind/ser/std/IterableSerializer.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ public IterableSerializer withResolved(BeanProperty property,
4040
@Override
4141
public boolean isEmpty(SerializerProvider prov, Iterable<?> value) {
4242
// Not really good way to implement this, but has to do for now:
43-
return (value == null) || !value.iterator().hasNext();
43+
return !value.iterator().hasNext();
4444
}
4545

4646
@Override

src/main/java/com/fasterxml/jackson/databind/ser/std/MapSerializer.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -532,7 +532,7 @@ public JsonSerializer<?> getContentSerializer() {
532532
@Override
533533
public boolean isEmpty(SerializerProvider prov, Map<?,?> value)
534534
{
535-
if (value == null || value.isEmpty()) {
535+
if (value.isEmpty()) {
536536
return true;
537537
}
538538

src/main/java/com/fasterxml/jackson/databind/ser/std/ObjectArraySerializer.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ public JsonSerializer<?> getContentSerializer() {
183183

184184
@Override
185185
public boolean isEmpty(SerializerProvider prov, Object[] value) {
186-
return (value == null) || (value.length == 0);
186+
return value.length == 0;
187187
}
188188

189189
@Override

src/main/java/com/fasterxml/jackson/databind/ser/std/ReferenceTypeSerializer.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -317,7 +317,7 @@ protected boolean _useStatic(SerializerProvider provider, BeanProperty property,
317317
public boolean isEmpty(SerializerProvider provider, T value)
318318
{
319319
// First, absent value (note: null check is just sanity check here)
320-
if ((value == null) || !_isValuePresent(value)) {
320+
if (!_isValuePresent(value)) {
321321
return true;
322322
}
323323
Object contents = _getReferenced(value);

src/main/java/com/fasterxml/jackson/databind/ser/std/StdArraySerializers.java

+7-7
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ public JsonSerializer<?> getContentSerializer() {
123123

124124
@Override
125125
public boolean isEmpty(SerializerProvider prov, boolean[] value) {
126-
return (value == null) || (value.length == 0);
126+
return value.length == 0;
127127
}
128128

129129
@Override
@@ -206,7 +206,7 @@ public JsonSerializer<?> getContentSerializer() {
206206

207207
@Override
208208
public boolean isEmpty(SerializerProvider prov, short[] value) {
209-
return (value == null) || (value.length == 0);
209+
return value.length == 0;
210210
}
211211

212212
@Override
@@ -276,7 +276,7 @@ public static class CharArraySerializer extends StdSerializer<char[]>
276276

277277
@Override
278278
public boolean isEmpty(SerializerProvider prov, char[] value) {
279-
return (value == null) || (value.length == 0);
279+
return value.length == 0;
280280
}
281281

282282
@Override
@@ -380,7 +380,7 @@ public JsonSerializer<?> getContentSerializer() {
380380

381381
@Override
382382
public boolean isEmpty(SerializerProvider prov, int[] value) {
383-
return (value == null) || (value.length == 0);
383+
return value.length == 0;
384384
}
385385

386386
@Override
@@ -458,7 +458,7 @@ public JsonSerializer<?> getContentSerializer() {
458458

459459
@Override
460460
public boolean isEmpty(SerializerProvider prov, long[] value) {
461-
return (value == null) || (value.length == 0);
461+
return value.length == 0;
462462
}
463463

464464
@Override
@@ -550,7 +550,7 @@ public JsonSerializer<?> getContentSerializer() {
550550

551551
@Override
552552
public boolean isEmpty(SerializerProvider prov, float[] value) {
553-
return (value == null) || (value.length == 0);
553+
return value.length == 0;
554554
}
555555

556556
@Override
@@ -645,7 +645,7 @@ public JsonSerializer<?> getContentSerializer() {
645645

646646
@Override
647647
public boolean isEmpty(SerializerProvider prov, double[] value) {
648-
return (value == null) || (value.length == 0);
648+
return value.length == 0;
649649
}
650650

651651
@Override

src/main/java/com/fasterxml/jackson/databind/ser/std/StdDelegatingSerializer.java

+3
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,9 @@ public void serializeWithType(Object value, JsonGenerator gen, SerializerProvide
189189
public boolean isEmpty(SerializerProvider prov, Object value)
190190
{
191191
Object delegateValue = convertValue(value);
192+
if (delegateValue == null) {
193+
return true;
194+
}
192195
if (_delegateSerializer == null) { // best we can do for now, too costly to look up
193196
return (value == null);
194197
}

src/main/java/com/fasterxml/jackson/databind/ser/std/StringSerializer.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ public final class StringSerializer
3333
@Override
3434
public boolean isEmpty(SerializerProvider prov, Object value) {
3535
String str = (String) value;
36-
return (str == null) || (str.length() == 0);
36+
return str.length() == 0;
3737
}
3838

3939
@Override

src/main/java/com/fasterxml/jackson/databind/ser/std/ToStringSerializer.java

+2-6
Original file line numberDiff line numberDiff line change
@@ -48,13 +48,9 @@ public ToStringSerializer(Class<?> handledType) {
4848

4949
@Override
5050
public boolean isEmpty(SerializerProvider prov, Object value) {
51-
if (value == null) {
52-
return true;
53-
}
54-
String str = value.toString();
55-
return str.isEmpty();
51+
return value.toString().isEmpty();
5652
}
57-
53+
5854
@Override
5955
public void serialize(Object value, JsonGenerator gen, SerializerProvider provider)
6056
throws IOException

src/main/java/com/fasterxml/jackson/databind/ser/std/UUIDSerializer.java

-3
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,6 @@ public class UUIDSerializer
2525
@Override
2626
public boolean isEmpty(SerializerProvider prov, UUID value)
2727
{
28-
if (value == null) {
29-
return true;
30-
}
3128
// Null UUID is empty, so...
3229
if (value.getLeastSignificantBits() == 0L
3330
&& value.getMostSignificantBits() == 0L) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
package com.fasterxml.jackson.databind.deser.merge;
2+
3+
import java.util.ArrayList;
4+
import java.util.Collection;
5+
import java.util.EnumSet;
6+
import java.util.Iterator;
7+
import java.util.List;
8+
import java.util.TreeSet;
9+
10+
import com.fasterxml.jackson.annotation.JsonSetter;
11+
import com.fasterxml.jackson.annotation.OptBoolean;
12+
13+
import com.fasterxml.jackson.core.type.TypeReference;
14+
15+
import com.fasterxml.jackson.databind.BaseMapTest;
16+
import com.fasterxml.jackson.databind.MapperFeature;
17+
import com.fasterxml.jackson.databind.ObjectMapper;
18+
19+
public class CollectionMergeTest extends BaseMapTest
20+
{
21+
static class CollectionWrapper {
22+
@JsonSetter(merge=OptBoolean.TRUE)
23+
public Collection<String> bag = new TreeSet<String>();
24+
{
25+
bag.add("a");
26+
}
27+
}
28+
29+
static class MergedList
30+
{
31+
@JsonSetter(merge=OptBoolean.TRUE)
32+
public List<String> values = new ArrayList<>();
33+
{
34+
values.add("a");
35+
}
36+
}
37+
38+
static class MergedEnumSet
39+
{
40+
@JsonSetter(merge=OptBoolean.TRUE)
41+
public EnumSet<ABC> abc = EnumSet.of(ABC.B);
42+
}
43+
44+
static class MergedX<T>
45+
{
46+
@JsonSetter(merge=OptBoolean.TRUE)
47+
public T value;
48+
49+
public MergedX(T v) { value = v; }
50+
protected MergedX() { }
51+
}
52+
53+
/*
54+
/********************************************************
55+
/* Test methods
56+
/********************************************************
57+
*/
58+
59+
private final ObjectMapper MAPPER = new ObjectMapper()
60+
// 26-Oct-2016, tatu: Make sure we'll report merge problems by default
61+
.disable(MapperFeature.IGNORE_MERGE_FOR_UNMERGEABLE)
62+
;
63+
64+
public void testCollectionMerging() throws Exception
65+
{
66+
CollectionWrapper w = MAPPER.readValue(aposToQuotes("{'bag':['b']}"), CollectionWrapper.class);
67+
assertEquals(2, w.bag.size());
68+
assertTrue(w.bag.contains("a"));
69+
assertTrue(w.bag.contains("b"));
70+
}
71+
72+
public void testListMerging() throws Exception
73+
{
74+
MergedList w = MAPPER.readValue(aposToQuotes("{'values':['x']}"), MergedList.class);
75+
assertEquals(2, w.values.size());
76+
assertTrue(w.values.contains("a"));
77+
assertTrue(w.values.contains("x"));
78+
}
79+
80+
// Test that uses generic type
81+
public void testGenericListMerging() throws Exception
82+
{
83+
Collection<String> l = new ArrayList<>();
84+
l.add("foo");
85+
MergedX<Collection<String>> input = new MergedX<Collection<String>>(l);
86+
87+
MergedX<Collection<String>> result = MAPPER
88+
.readerFor(new TypeReference<MergedX<Collection<String>>>() {})
89+
.withValueToUpdate(input)
90+
.readValue(aposToQuotes("{'value':['bar']}"));
91+
assertSame(input, result);
92+
assertEquals(2, result.value.size());
93+
Iterator<String> it = result.value.iterator();
94+
assertEquals("foo", it.next());
95+
assertEquals("bar", it.next());
96+
}
97+
98+
public void testEnumSetMerging() throws Exception
99+
{
100+
MergedEnumSet result = MAPPER.readValue(aposToQuotes("{'abc':['A']}"), MergedEnumSet.class);
101+
assertEquals(2, result.abc.size());
102+
assertTrue(result.abc.contains(ABC.B)); // original
103+
assertTrue(result.abc.contains(ABC.A)); // added
104+
}
105+
106+
}

0 commit comments

Comments
 (0)