Skip to content

Commit b1ee4d1

Browse files
authored
support sequenced collections (#4090)
1 parent d7e77c3 commit b1ee4d1

File tree

3 files changed

+111
-0
lines changed

3 files changed

+111
-0
lines changed

pom.xml

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -394,6 +394,59 @@
394394
</plugins>
395395
</build>
396396
</profile>
397+
<profile>
398+
<!-- And different set up for JDK 21 -->
399+
<id>java21</id>
400+
<activation>
401+
<jdk>21</jdk>
402+
</activation>
403+
<build>
404+
<plugins>
405+
<plugin>
406+
<groupId>org.codehaus.mojo</groupId>
407+
<artifactId>build-helper-maven-plugin</artifactId>
408+
<executions>
409+
<execution>
410+
<id>add-test-source</id>
411+
<phase>generate-test-sources</phase>
412+
<goals>
413+
<goal>add-test-source</goal>
414+
</goals>
415+
<configuration>
416+
<sources>
417+
<source>src/test-jdk14/java</source>
418+
<source>src/test-jdk17/java</source>
419+
<source>src/test-jdk21/java</source>
420+
</sources>
421+
</configuration>
422+
</execution>
423+
</executions>
424+
</plugin>
425+
<plugin>
426+
<groupId>org.apache.maven.plugins</groupId>
427+
<artifactId>maven-compiler-plugin</artifactId>
428+
<inherited>true</inherited>
429+
<configuration>
430+
<!-- Enable Java 21 for all sources so that Intellij picks the right language level -->
431+
<source>21</source>
432+
<release>21</release>
433+
<compilerArgs>
434+
<arg>-parameters</arg>
435+
<arg>--add-opens=java.base/java.lang=ALL-UNNAMED</arg>
436+
<arg>--add-opens=java.base/java.util=ALL-UNNAMED</arg>
437+
</compilerArgs>
438+
</configuration>
439+
</plugin>
440+
<plugin>
441+
<groupId>org.apache.maven.plugins</groupId>
442+
<artifactId>maven-surefire-plugin</artifactId>
443+
<configuration>
444+
<argLine>--add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED</argLine>
445+
</configuration>
446+
</plugin>
447+
</plugins>
448+
</build>
449+
</profile>
397450
<profile>
398451
<id>errorprone</id>
399452
<build>

src/main/java/com/fasterxml/jackson/databind/deser/BasicDeserializerFactory.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2562,6 +2562,10 @@ protected static class ContainerDefaultMappings {
25622562
fallbacks.put(Deque.class.getName(), LinkedList.class);
25632563
fallbacks.put(NavigableSet.class.getName(), TreeSet.class);
25642564

2565+
// Sequenced types added in JDK21
2566+
fallbacks.put("java.util.SequencedCollection", DEFAULT_LIST);
2567+
fallbacks.put("java.util.SequencedSet", LinkedHashSet.class);
2568+
25652569
_collectionFallbacks = fallbacks;
25662570
}
25672571

@@ -2582,6 +2586,9 @@ protected static class ContainerDefaultMappings {
25822586
fallbacks.put(java.util.concurrent.ConcurrentNavigableMap.class.getName(),
25832587
java.util.concurrent.ConcurrentSkipListMap.class);
25842588

2589+
// Sequenced types added in JDK21
2590+
fallbacks.put("java.util.SequencedMap", LinkedHashMap.class);
2591+
25852592
_mapFallbacks = fallbacks;
25862593
}
25872594

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package com.fasterxml.jackson.databind.jdk21;
2+
3+
import java.util.*;
4+
5+
import com.fasterxml.jackson.databind.BaseMapTest;
6+
import com.fasterxml.jackson.databind.ObjectMapper;
7+
import com.fasterxml.jackson.databind.json.JsonMapper;
8+
9+
public class Java21CollectionsTest extends BaseMapTest
10+
{
11+
// [databind#4089]
12+
record SequencedCollections(
13+
SequencedCollection<String> sequencedCollection,
14+
SequencedSet<String> sequencedSet,
15+
SequencedMap<String, Integer> sequencedMap) {
16+
}
17+
18+
public void testSequencedCollectionTypesDeserialize() throws Exception {
19+
String json = """
20+
{
21+
"sequencedCollection": ["A", "B"],
22+
"sequencedSet": ["C", "D"],
23+
"sequencedMap": {"A": 1, "B": 2}
24+
}
25+
""";
26+
27+
ObjectMapper objectMapper = JsonMapper.builder().build();
28+
SequencedCollections value = objectMapper.readValue(json, SequencedCollections.class);
29+
assertEquals(ArrayList.class, value.sequencedCollection.getClass());
30+
assertEquals(LinkedHashSet.class, value.sequencedSet.getClass());
31+
assertEquals(LinkedHashMap.class, value.sequencedMap.getClass());
32+
}
33+
34+
public void testSequencedCollectionTypesRoundTrip() throws Exception {
35+
ArrayList<String> arrayList = new ArrayList<>();
36+
arrayList.add("A");
37+
arrayList.add("B");
38+
LinkedHashSet<String> linkedHashSet = new LinkedHashSet<>();
39+
linkedHashSet.add("C");
40+
linkedHashSet.add("D");
41+
LinkedHashMap<String, Integer> linkedHashMap = new LinkedHashMap<>();
42+
linkedHashMap.put("A", 1);
43+
linkedHashMap.put("B", 2);
44+
SequencedCollections input = new SequencedCollections(arrayList, linkedHashSet, linkedHashMap);
45+
46+
ObjectMapper objectMapper = JsonMapper.builder().build();
47+
String json = objectMapper.writeValueAsString(input);
48+
SequencedCollections value = objectMapper.readValue(json, SequencedCollections.class);
49+
assertEquals(input, value);
50+
}
51+
}

0 commit comments

Comments
 (0)