Skip to content

Commit a43653d

Browse files
authored
Add writeTo(JsonWriter) to BinaryData (#42107)
Add writeTo(JsonWriter) to BinaryData
1 parent b98a458 commit a43653d

File tree

14 files changed

+190
-48
lines changed

14 files changed

+190
-48
lines changed

sdk/core/azure-core-serializer-json-jackson/src/main/java/com/azure/core/serializer/json/jackson/implementation/BinaryDataSerializer.java

+1-25
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,7 @@
33

44
package com.azure.core.serializer.json.jackson.implementation;
55

6-
import com.azure.core.implementation.util.BinaryDataContent;
7-
import com.azure.core.implementation.util.BinaryDataHelper;
8-
import com.azure.core.implementation.util.ByteArrayContent;
9-
import com.azure.core.implementation.util.FileContent;
10-
import com.azure.core.implementation.util.FluxByteBufferContent;
11-
import com.azure.core.implementation.util.InputStreamContent;
12-
import com.azure.core.implementation.util.SerializableContent;
13-
import com.azure.core.implementation.util.StringContent;
146
import com.azure.core.util.BinaryData;
15-
import com.azure.core.util.logging.ClientLogger;
167
import com.fasterxml.jackson.core.JsonGenerator;
178
import com.fasterxml.jackson.databind.JsonSerializer;
189
import com.fasterxml.jackson.databind.SerializerProvider;
@@ -24,8 +15,6 @@
2415
* Custom serializer for serializing {@link BinaryData}.
2516
*/
2617
final class BinaryDataSerializer extends JsonSerializer<BinaryData> {
27-
private static final ClientLogger LOGGER = new ClientLogger(BinaryDataSerializer.class);
28-
2918
/**
3019
* Gets a module wrapping this serializer as an adapter for the Jackson ObjectMapper.
3120
*
@@ -43,19 +32,6 @@ public void serialize(BinaryData value, JsonGenerator gen, SerializerProvider se
4332
return;
4433
}
4534

46-
BinaryDataContent content = BinaryDataHelper.getContent(value);
47-
if (content instanceof ByteArrayContent
48-
|| content instanceof FileContent
49-
|| content instanceof FluxByteBufferContent
50-
|| content instanceof InputStreamContent) {
51-
gen.writeBinary(content.toBytes());
52-
} else if (content instanceof SerializableContent) {
53-
gen.writeRawValue(content.toString());
54-
} else if (content instanceof StringContent) {
55-
gen.writeString(content.toString());
56-
} else {
57-
throw LOGGER.logExceptionAsError(
58-
new IllegalStateException("Unsupported BinaryData content type: " + content.getClass().getName()));
59-
}
35+
value.writeTo(new JacksonJsonWriter(gen));
6036
}
6137
}

sdk/core/azure-core/src/main/java/com/azure/core/implementation/jackson/BinaryDataSerializer.java

+1-23
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,7 @@
33

44
package com.azure.core.implementation.jackson;
55

6-
import com.azure.core.implementation.util.BinaryDataContent;
7-
import com.azure.core.implementation.util.BinaryDataHelper;
86
import com.azure.core.util.BinaryData;
9-
import com.azure.core.util.logging.ClientLogger;
107
import com.fasterxml.jackson.core.JsonGenerator;
118
import com.fasterxml.jackson.databind.JsonSerializer;
129
import com.fasterxml.jackson.databind.SerializerProvider;
@@ -18,8 +15,6 @@
1815
* Custom serializer for serializing {@link BinaryData}.
1916
*/
2017
final class BinaryDataSerializer extends JsonSerializer<BinaryData> {
21-
private static final ClientLogger LOGGER = new ClientLogger(BinaryDataSerializer.class);
22-
2318
/**
2419
* Gets a module wrapping this serializer as an adapter for the Jackson ObjectMapper.
2520
*
@@ -37,23 +32,6 @@ public void serialize(BinaryData value, JsonGenerator gen, SerializerProvider se
3732
return;
3833
}
3934

40-
BinaryDataContent content = BinaryDataHelper.getContent(value);
41-
switch (content.getContentType()) {
42-
case BINARY:
43-
gen.writeBinary(content.toBytes());
44-
break;
45-
46-
case OBJECT:
47-
gen.writeRawValue(content.toString());
48-
break;
49-
50-
case TEXT:
51-
gen.writeString(content.toString());
52-
break;
53-
54-
default:
55-
throw LOGGER.logExceptionAsError(
56-
new IllegalStateException("Unsupported BinaryData content type: " + content.getClass().getName()));
57-
}
35+
value.writeTo(new JacksonJsonWriter(gen));
5836
}
5937
}

sdk/core/azure-core/src/main/java/com/azure/core/implementation/util/BinaryDataContent.java

+17
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import com.azure.core.util.serializer.JsonSerializer;
88
import com.azure.core.util.serializer.ObjectSerializer;
99
import com.azure.core.util.serializer.TypeReference;
10+
import com.azure.json.JsonWriter;
1011
import reactor.core.publisher.Flux;
1112
import reactor.core.publisher.Mono;
1213

@@ -138,6 +139,22 @@ public abstract class BinaryDataContent {
138139
*/
139140
public abstract Mono<Void> writeTo(AsynchronousByteChannel channel);
140141

142+
/**
143+
* Writes the contents of this {@link BinaryDataContent} to the given {@link JsonWriter}.
144+
* <p>
145+
* This method does not close or flush the {@link JsonWriter}.
146+
* <p>
147+
* The contents of this {@link BinaryDataContent} will be written without buffering. If the underlying data source
148+
* isn't {@link #isReplayable()}, after this method is called the {@link BinaryDataContent} will be consumed and
149+
* can't be read again. If it needs to be read again, use {@link #toReplayableContent()} to create a replayable
150+
* copy.
151+
*
152+
* @param jsonWriter The {@link JsonWriter} to write the contents of this {@link BinaryDataContent} to.
153+
* @throws NullPointerException If {@code jsonWriter} is null.
154+
* @throws IOException If an I/O error occurs during writing.
155+
*/
156+
public abstract void writeTo(JsonWriter jsonWriter) throws IOException;
157+
141158
/**
142159
* Returns a flag indicating whether the content can be repeatedly consumed using all accessors including
143160
* {@link #toStream()} and {@link #toFluxByteBuffer()}

sdk/core/azure-core/src/main/java/com/azure/core/implementation/util/ByteArrayContent.java

+8
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import com.azure.core.util.FluxUtil;
88
import com.azure.core.util.serializer.ObjectSerializer;
99
import com.azure.core.util.serializer.TypeReference;
10+
import com.azure.json.JsonWriter;
1011
import reactor.core.publisher.Flux;
1112
import reactor.core.publisher.Mono;
1213

@@ -94,6 +95,13 @@ public Mono<Void> writeTo(AsynchronousByteChannel channel) {
9495
return FluxUtil.writeToAsynchronousByteChannel(toFluxByteBuffer(), channel);
9596
}
9697

98+
@Override
99+
public void writeTo(JsonWriter jsonWriter) throws IOException {
100+
Objects.requireNonNull(jsonWriter, "'jsonWriter' cannot be null");
101+
102+
jsonWriter.writeBinary(toBytes());
103+
}
104+
97105
@Override
98106
public boolean isReplayable() {
99107
return true;

sdk/core/azure-core/src/main/java/com/azure/core/implementation/util/ByteBufferContent.java

+8
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import com.azure.core.util.FluxUtil;
88
import com.azure.core.util.serializer.ObjectSerializer;
99
import com.azure.core.util.serializer.TypeReference;
10+
import com.azure.json.JsonWriter;
1011
import reactor.core.publisher.Flux;
1112
import reactor.core.publisher.Mono;
1213

@@ -99,6 +100,13 @@ public Mono<Void> writeTo(AsynchronousByteChannel channel) {
99100
return FluxUtil.writeToAsynchronousByteChannel(toFluxByteBuffer(), channel);
100101
}
101102

103+
@Override
104+
public void writeTo(JsonWriter jsonWriter) throws IOException {
105+
Objects.requireNonNull(jsonWriter, "'jsonWriter' cannot be null");
106+
107+
jsonWriter.writeBinary(toBytes());
108+
}
109+
102110
@Override
103111
public boolean isReplayable() {
104112
return true;

sdk/core/azure-core/src/main/java/com/azure/core/implementation/util/FileContent.java

+8
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import com.azure.core.util.logging.ClientLogger;
88
import com.azure.core.util.serializer.ObjectSerializer;
99
import com.azure.core.util.serializer.TypeReference;
10+
import com.azure.json.JsonWriter;
1011
import reactor.core.Exceptions;
1112
import reactor.core.publisher.Flux;
1213
import reactor.core.publisher.Mono;
@@ -226,6 +227,13 @@ public Mono<Void> writeTo(AsynchronousByteChannel channel) {
226227
return FluxUtil.writeToAsynchronousByteChannel(toFluxByteBuffer(), channel);
227228
}
228229

230+
@Override
231+
public void writeTo(JsonWriter jsonWriter) throws IOException {
232+
Objects.requireNonNull(jsonWriter, "'jsonWriter' cannot be null");
233+
234+
jsonWriter.writeBinary(toBytes());
235+
}
236+
229237
/**
230238
* Opens an {@link AsynchronousFileChannel} for the file.
231239
*

sdk/core/azure-core/src/main/java/com/azure/core/implementation/util/FluxByteBufferContent.java

+8
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import com.azure.core.util.logging.ClientLogger;
88
import com.azure.core.util.serializer.ObjectSerializer;
99
import com.azure.core.util.serializer.TypeReference;
10+
import com.azure.json.JsonWriter;
1011
import reactor.core.publisher.Flux;
1112
import reactor.core.publisher.Mono;
1213

@@ -133,6 +134,13 @@ public Mono<Void> writeTo(AsynchronousByteChannel channel) {
133134
return FluxUtil.writeToAsynchronousByteChannel(content, channel);
134135
}
135136

137+
@Override
138+
public void writeTo(JsonWriter jsonWriter) throws IOException {
139+
Objects.requireNonNull(jsonWriter, "'jsonWriter' cannot be null");
140+
141+
jsonWriter.writeBinary(toBytes());
142+
}
143+
136144
@Override
137145
public boolean isReplayable() {
138146
return isReplayable;

sdk/core/azure-core/src/main/java/com/azure/core/implementation/util/InputStreamContent.java

+8
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import com.azure.core.util.logging.ClientLogger;
1111
import com.azure.core.util.serializer.ObjectSerializer;
1212
import com.azure.core.util.serializer.TypeReference;
13+
import com.azure.json.JsonWriter;
1314
import reactor.core.publisher.Flux;
1415
import reactor.core.publisher.Mono;
1516
import reactor.core.scheduler.Schedulers;
@@ -147,6 +148,13 @@ public Mono<Void> writeTo(AsynchronousByteChannel channel) {
147148
return FluxUtil.writeToAsynchronousByteChannel(toFluxByteBuffer(), channel);
148149
}
149150

151+
@Override
152+
public void writeTo(JsonWriter jsonWriter) throws IOException {
153+
Objects.requireNonNull(jsonWriter, "'jsonWriter' cannot be null");
154+
155+
jsonWriter.writeBinary(toBytes());
156+
}
157+
150158
@Override
151159
public boolean isReplayable() {
152160
return isReplayable;

sdk/core/azure-core/src/main/java/com/azure/core/implementation/util/ListByteBufferContent.java

+8
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import com.azure.core.util.logging.ClientLogger;
99
import com.azure.core.util.serializer.ObjectSerializer;
1010
import com.azure.core.util.serializer.TypeReference;
11+
import com.azure.json.JsonWriter;
1112
import reactor.core.publisher.Flux;
1213
import reactor.core.publisher.Mono;
1314

@@ -110,6 +111,13 @@ public Mono<Void> writeTo(AsynchronousByteChannel channel) {
110111
return FluxUtil.writeToAsynchronousByteChannel(toFluxByteBuffer(), channel);
111112
}
112113

114+
@Override
115+
public void writeTo(JsonWriter jsonWriter) throws IOException {
116+
Objects.requireNonNull(jsonWriter, "'jsonWriter' cannot be null");
117+
118+
jsonWriter.writeBinary(toBytes());
119+
}
120+
113121
@Override
114122
public boolean isReplayable() {
115123
return true;

sdk/core/azure-core/src/main/java/com/azure/core/implementation/util/SerializableContent.java

+12
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import com.azure.core.util.logging.ClientLogger;
99
import com.azure.core.util.serializer.ObjectSerializer;
1010
import com.azure.core.util.serializer.TypeReference;
11+
import com.azure.json.JsonWriter;
1112
import reactor.core.publisher.Flux;
1213
import reactor.core.publisher.Mono;
1314

@@ -106,6 +107,17 @@ public Mono<Void> writeTo(AsynchronousByteChannel channel) {
106107
return FluxUtil.writeToAsynchronousByteChannel(toFluxByteBuffer(), channel);
107108
}
108109

110+
@Override
111+
public void writeTo(JsonWriter jsonWriter) throws IOException {
112+
Objects.requireNonNull(jsonWriter, "'jsonWriter' cannot be null");
113+
114+
if (content == null) {
115+
jsonWriter.writeNull();
116+
} else {
117+
jsonWriter.writeRawValue(toString());
118+
}
119+
}
120+
109121
@Override
110122
public boolean isReplayable() {
111123
return true;

sdk/core/azure-core/src/main/java/com/azure/core/implementation/util/StringContent.java

+8
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import com.azure.core.util.logging.ClientLogger;
99
import com.azure.core.util.serializer.ObjectSerializer;
1010
import com.azure.core.util.serializer.TypeReference;
11+
import com.azure.json.JsonWriter;
1112
import reactor.core.publisher.Flux;
1213
import reactor.core.publisher.Mono;
1314

@@ -103,6 +104,13 @@ public Mono<Void> writeTo(AsynchronousByteChannel channel) {
103104
return FluxUtil.writeToAsynchronousByteChannel(toFluxByteBuffer(), channel);
104105
}
105106

107+
@Override
108+
public void writeTo(JsonWriter jsonWriter) throws IOException {
109+
Objects.requireNonNull(jsonWriter, "'jsonWriter' cannot be null");
110+
111+
jsonWriter.writeString(toString());
112+
}
113+
106114
@Override
107115
public boolean isReplayable() {
108116
return true;

sdk/core/azure-core/src/main/java/com/azure/core/util/BinaryData.java

+18
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import com.azure.core.util.serializer.JsonSerializerProviders;
2020
import com.azure.core.util.serializer.ObjectSerializer;
2121
import com.azure.core.util.serializer.TypeReference;
22+
import com.azure.json.JsonWriter;
2223
import reactor.core.publisher.Flux;
2324
import reactor.core.publisher.Mono;
2425

@@ -1476,6 +1477,23 @@ public Mono<Void> writeTo(AsynchronousByteChannel channel) {
14761477
return content.writeTo(channel);
14771478
}
14781479

1480+
/**
1481+
* Writes the contents of this {@link BinaryData} to the given {@link JsonWriter}.
1482+
* <p>
1483+
* This method does not close or flush the {@link JsonWriter}.
1484+
* <p>
1485+
* The contents of this {@link BinaryData} will be written without buffering. If the underlying data source isn't
1486+
* {@link #isReplayable()}, after this method is called the {@link BinaryData} will be consumed and can't be read
1487+
* again. If it needs to be read again, use {@link #toReplayableBinaryData()} to create a replayable copy.
1488+
*
1489+
* @param jsonWriter The {@link JsonWriter} to write the contents of this {@link BinaryData} to.
1490+
* @throws NullPointerException If {@code jsonWriter} is null.
1491+
* @throws IOException If an I/O error occurs during writing.
1492+
*/
1493+
public void writeTo(JsonWriter jsonWriter) throws IOException {
1494+
content.writeTo(jsonWriter);
1495+
}
1496+
14791497
/**
14801498
* Returns the length of the content, if it is known. The length can be {@code null} if the source did not specify
14811499
* the length or the length cannot be determined without reading the whole content.

0 commit comments

Comments
 (0)