Skip to content

Commit 8c30aaf

Browse files
authored
Add serializeIterable API to SerializerAdapter (Azure#19459)
* Add serializeIterable API to SerializerAdapter * Fix checkstyle
1 parent 282deaf commit 8c30aaf

File tree

3 files changed

+54
-12
lines changed

3 files changed

+54
-12
lines changed

sdk/core/azure-core/src/main/java/com/azure/core/util/serializer/JacksonAdapter.java

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -188,15 +188,7 @@ public String serializeRaw(Object object) {
188188

189189
@Override
190190
public String serializeList(List<?> list, CollectionFormat format) {
191-
if (list == null) {
192-
return null;
193-
}
194-
List<String> serialized = new ArrayList<>();
195-
for (Object element : list) {
196-
String raw = serializeRaw(element);
197-
serialized.add(raw != null ? raw : "");
198-
}
199-
return String.join(format.getDelimiter(), serialized);
191+
return serializeIterable(list, format);
200192
}
201193

202194
@Override

sdk/core/azure-core/src/main/java/com/azure/core/util/serializer/SerializerAdapter.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
import java.lang.reflect.Type;
1313
import java.nio.charset.StandardCharsets;
1414
import java.util.List;
15+
import java.util.stream.Collectors;
16+
import java.util.stream.StreamSupport;
1517

1618
/**
1719
* An interface defining the behaviors of a serializer.
@@ -63,6 +65,24 @@ default void serialize(final Object object, final SerializerEncoding encoding, O
6365
*/
6466
String serializeList(List<?> list, CollectionFormat format);
6567

68+
/**
69+
* Serializes an iterable into a string with the delimiter specified with the Swagger collection format joining each
70+
* individual serialized items in the list.
71+
*
72+
* @param iterable the iterable to serialize
73+
* @param format the Swagger collection format
74+
* @return the serialized string
75+
*/
76+
default String serializeIterable(Iterable<?> iterable, CollectionFormat format) {
77+
if (iterable == null) {
78+
return null;
79+
}
80+
return StreamSupport.stream(iterable.spliterator(), false)
81+
.map(this::serializeRaw)
82+
.map(serializedString -> serializedString == null ? "" : serializedString)
83+
.collect(Collectors.joining(format.getDelimiter()));
84+
}
85+
6686
/**
6787
* Deserializes a string into a {@code T} object.
6888
*

sdk/core/azure-core/src/test/java/com/azure/core/util/serializer/JacksonAdapterTests.java

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@
1414
import java.io.IOException;
1515
import java.time.OffsetDateTime;
1616
import java.time.ZoneOffset;
17+
import java.util.Arrays;
1718
import java.util.HashMap;
19+
import java.util.List;
1820
import java.util.Map;
1921
import java.util.stream.Stream;
2022

@@ -64,26 +66,42 @@ public void mapWithEmptyKeyAndNonEmptyValue() throws IOException {
6466
}
6567

6668
private static class MapHolder {
69+
6770
@JsonInclude(content = JsonInclude.Include.ALWAYS)
6871
private Map<String, String> map = new HashMap<>();
69-
7072
public Map<String, String> map() {
7173
return map;
7274
}
7375

7476
public void map(Map<String, String> map) {
7577
this.map = map;
7678
}
77-
}
7879

80+
}
7981
@JacksonXmlRootElement(localName = "XmlString")
8082
private static class XmlString {
83+
8184
@JsonProperty("Value")
8285
private String value;
83-
8486
public String getValue() {
8587
return value;
8688
}
89+
90+
}
91+
@ParameterizedTest
92+
@MethodSource("serializeCollectionSupplier")
93+
public void testSerializeList(List<?> values, CollectionFormat format, String expectedSerializedString) {
94+
String actualSerializedString = JacksonAdapter.createDefaultSerializerAdapter()
95+
.serializeList(values, format);
96+
assertEquals(expectedSerializedString, actualSerializedString);
97+
}
98+
99+
@ParameterizedTest
100+
@MethodSource("serializeCollectionSupplier")
101+
public void testSerializeIterable(Iterable<?> values, CollectionFormat format, String expectedSerializedString) {
102+
String actualSerializedString = JacksonAdapter.createDefaultSerializerAdapter()
103+
.serializeIterable(values, format);
104+
assertEquals(expectedSerializedString, actualSerializedString);
87105
}
88106

89107
@ParameterizedTest
@@ -95,6 +113,18 @@ public void deserializeJson(String json, OffsetDateTime expected) throws IOExcep
95113
assertEquals(expected, wrapper.getOffsetDateTime());
96114
}
97115

116+
private static Stream<Arguments> serializeCollectionSupplier() {
117+
return Stream.of(
118+
Arguments.of(Arrays.asList("foo", "bar", "baz"), CollectionFormat.CSV, "foo,bar,baz"),
119+
Arguments.of(Arrays.asList("foo", null, "baz"), CollectionFormat.CSV, "foo,,baz"),
120+
Arguments.of(Arrays.asList(null, "bar", null, null), CollectionFormat.CSV, ",bar,,"),
121+
Arguments.of(Arrays.asList(1, 2, 3), CollectionFormat.CSV, "1,2,3"),
122+
Arguments.of(Arrays.asList(1, 2, 3), CollectionFormat.PIPES, "1|2|3"),
123+
Arguments.of(Arrays.asList(1, 2, 3), CollectionFormat.SSV, "1 2 3"),
124+
Arguments.of(Arrays.asList("foo", "bar", "baz"), CollectionFormat.MULTI, "foo&bar&baz")
125+
);
126+
}
127+
98128
private static Stream<Arguments> deserializeJsonSupplier() {
99129
final String jsonFormat = "{\"OffsetDateTime\":\"%s\"}";
100130
OffsetDateTime minValue = OffsetDateTime.of(1, 1, 1, 0, 0, 0, 0, ZoneOffset.UTC);

0 commit comments

Comments
 (0)