17
17
package org .springframework .http .codec .support ;
18
18
19
19
import java .util .ArrayList ;
20
+ import java .util .LinkedHashMap ;
20
21
import java .util .List ;
22
+ import java .util .Map ;
21
23
import java .util .function .Consumer ;
22
24
23
25
import org .springframework .core .ResolvableType ;
40
42
*/
41
43
abstract class BaseCodecConfigurer implements CodecConfigurer {
42
44
43
- protected boolean customCodecsInitialized ;
44
-
45
45
protected final BaseDefaultCodecs defaultCodecs ;
46
46
47
47
protected final DefaultCustomCodecs customCodecs ;
@@ -91,21 +91,20 @@ public CustomCodecs customCodecs() {
91
91
92
92
@ Override
93
93
public List <HttpMessageReader <?>> getReaders () {
94
- initializeCustomCodecs ();
95
- List <HttpMessageReader <?>> result = new ArrayList <>();
94
+ this .defaultCodecs .applyDefaultConfig (this .customCodecs );
96
95
96
+ List <HttpMessageReader <?>> result = new ArrayList <>();
97
97
result .addAll (this .defaultCodecs .getTypedReaders ());
98
- result .addAll (this .customCodecs .getTypedReaders ());
99
-
98
+ result .addAll (this .customCodecs .getTypedReaders ().keySet ());
100
99
result .addAll (this .defaultCodecs .getObjectReaders ());
101
- result .addAll (this .customCodecs .getObjectReaders ());
102
-
100
+ result .addAll (this .customCodecs .getObjectReaders ().keySet ());
103
101
result .addAll (this .defaultCodecs .getCatchAllReaders ());
104
102
return result ;
105
103
}
106
104
107
105
@ Override
108
106
public List <HttpMessageWriter <?>> getWriters () {
107
+ this .defaultCodecs .applyDefaultConfig (this .customCodecs );
109
108
return getWritersInternal (false );
110
109
}
111
110
@@ -117,14 +116,13 @@ public List<HttpMessageWriter<?>> getWriters() {
117
116
* same except for the multipart writer itself.
118
117
*/
119
118
protected List <HttpMessageWriter <?>> getWritersInternal (boolean forMultipart ) {
120
- initializeCustomCodecs ();
121
119
List <HttpMessageWriter <?>> result = new ArrayList <>();
122
120
123
121
result .addAll (this .defaultCodecs .getTypedWriters (forMultipart ));
124
- result .addAll (this .customCodecs .getTypedWriters ());
122
+ result .addAll (this .customCodecs .getTypedWriters (). keySet () );
125
123
126
124
result .addAll (this .defaultCodecs .getObjectWriters (forMultipart ));
127
- result .addAll (this .customCodecs .getObjectWriters ());
125
+ result .addAll (this .customCodecs .getObjectWriters (). keySet () );
128
126
129
127
result .addAll (this .defaultCodecs .getCatchAllWriters ());
130
128
return result ;
@@ -133,28 +131,21 @@ protected List<HttpMessageWriter<?>> getWritersInternal(boolean forMultipart) {
133
131
@ Override
134
132
public abstract CodecConfigurer clone ();
135
133
136
- private void initializeCustomCodecs () {
137
- if (!this .customCodecsInitialized ) {
138
- this .customCodecs .configConsumers .forEach (consumer -> consumer .accept (this .defaultCodecs ));
139
- this .customCodecsInitialized = true ;
140
- }
141
- }
142
-
143
134
144
135
/**
145
136
* Default implementation of {@code CustomCodecs}.
146
137
*/
147
138
protected static final class DefaultCustomCodecs implements CustomCodecs {
148
139
149
- private final List <HttpMessageReader <?>> typedReaders = new ArrayList <>();
140
+ private final Map <HttpMessageReader <?>, Boolean > typedReaders = new LinkedHashMap <>(4 );
150
141
151
- private final List <HttpMessageWriter <?>> typedWriters = new ArrayList <>();
142
+ private final Map <HttpMessageWriter <?>, Boolean > typedWriters = new LinkedHashMap <>(4 );
152
143
153
- private final List <HttpMessageReader <?>> objectReaders = new ArrayList <>();
144
+ private final Map <HttpMessageReader <?>, Boolean > objectReaders = new LinkedHashMap <>(4 );
154
145
155
- private final List <HttpMessageWriter <?>> objectWriters = new ArrayList <>();
146
+ private final Map <HttpMessageWriter <?>, Boolean > objectWriters = new LinkedHashMap <>(4 );
156
147
157
- private final List <Consumer <DefaultCodecConfig >> configConsumers = new ArrayList <>();
148
+ private final List <Consumer <DefaultCodecConfig >> defaultConfigConsumers = new ArrayList <>(4 );
158
149
159
150
DefaultCustomCodecs () {
160
151
}
@@ -164,56 +155,103 @@ protected static final class DefaultCustomCodecs implements CustomCodecs {
164
155
* @since 5.1.12
165
156
*/
166
157
DefaultCustomCodecs (DefaultCustomCodecs other ) {
167
- other .typedReaders .addAll (this .typedReaders );
168
- other .typedWriters .addAll (this .typedWriters );
169
- other .objectReaders .addAll (this .objectReaders );
170
- other .objectWriters .addAll (this .objectWriters );
158
+ other .typedReaders .putAll (this .typedReaders );
159
+ other .typedWriters .putAll (this .typedWriters );
160
+ other .objectReaders .putAll (this .objectReaders );
161
+ other .objectWriters .putAll (this .objectWriters );
162
+ }
163
+
164
+ @ Override
165
+ public void register (Object codec ) {
166
+ addCodec (codec , false );
171
167
}
172
168
169
+ @ Override
170
+ public void registerWithDefaultConfig (Object codec ) {
171
+ addCodec (codec , true );
172
+ }
173
+
174
+ @ Override
175
+ public void registerWithDefaultConfig (Object codec , Consumer <DefaultCodecConfig > configConsumer ) {
176
+ addCodec (codec , false );
177
+ this .defaultConfigConsumers .add (configConsumer );
178
+ }
179
+
180
+ @ SuppressWarnings ("deprecation" )
173
181
@ Override
174
182
public void decoder (Decoder <?> decoder ) {
175
- reader ( new DecoderHttpMessageReader <>( decoder ) );
183
+ addCodec ( decoder , false );
176
184
}
177
185
186
+ @ SuppressWarnings ("deprecation" )
178
187
@ Override
179
188
public void encoder (Encoder <?> encoder ) {
180
- writer ( new EncoderHttpMessageWriter <>( encoder ) );
189
+ addCodec ( encoder , false );
181
190
}
182
191
192
+ @ SuppressWarnings ("deprecation" )
183
193
@ Override
184
194
public void reader (HttpMessageReader <?> reader ) {
185
- boolean canReadToObject = reader .canRead (ResolvableType .forClass (Object .class ), null );
186
- (canReadToObject ? this .objectReaders : this .typedReaders ).add (reader );
195
+ addCodec (reader , false );
187
196
}
188
197
198
+ @ SuppressWarnings ("deprecation" )
189
199
@ Override
190
200
public void writer (HttpMessageWriter <?> writer ) {
191
- boolean canWriteObject = writer .canWrite (ResolvableType .forClass (Object .class ), null );
192
- (canWriteObject ? this .objectWriters : this .typedWriters ).add (writer );
201
+ addCodec (writer , false );
193
202
}
194
203
204
+ @ SuppressWarnings ("deprecation" )
195
205
@ Override
196
206
public void withDefaultCodecConfig (Consumer <DefaultCodecConfig > codecsConfigConsumer ) {
197
- this .configConsumers .add (codecsConfigConsumer );
207
+ this .defaultConfigConsumers .add (codecsConfigConsumer );
208
+ }
209
+
210
+ private void addCodec (Object codec , boolean applyDefaultConfig ) {
211
+
212
+ if (codec instanceof Decoder ) {
213
+ codec = new DecoderHttpMessageReader <>((Decoder <?>) codec );
214
+ }
215
+ else if (codec instanceof Encoder ) {
216
+ codec = new EncoderHttpMessageWriter <>((Encoder <?>) codec );
217
+ }
218
+
219
+ if (codec instanceof HttpMessageReader ) {
220
+ HttpMessageReader <?> reader = (HttpMessageReader <?>) codec ;
221
+ boolean canReadToObject = reader .canRead (ResolvableType .forClass (Object .class ), null );
222
+ (canReadToObject ? this .objectReaders : this .typedReaders ).put (reader , applyDefaultConfig );
223
+ }
224
+ else if (codec instanceof HttpMessageWriter ) {
225
+ HttpMessageWriter <?> writer = (HttpMessageWriter <?>) codec ;
226
+ boolean canWriteObject = writer .canWrite (ResolvableType .forClass (Object .class ), null );
227
+ (canWriteObject ? this .objectWriters : this .typedWriters ).put (writer , applyDefaultConfig );
228
+ }
229
+ else {
230
+ throw new IllegalArgumentException ("Unexpected codec type: " + codec .getClass ().getName ());
231
+ }
198
232
}
199
233
200
234
// Package private accessors...
201
235
202
- List <HttpMessageReader <?>> getTypedReaders () {
236
+ Map <HttpMessageReader <?>, Boolean > getTypedReaders () {
203
237
return this .typedReaders ;
204
238
}
205
239
206
- List <HttpMessageWriter <?>> getTypedWriters () {
240
+ Map <HttpMessageWriter <?>, Boolean > getTypedWriters () {
207
241
return this .typedWriters ;
208
242
}
209
243
210
- List <HttpMessageReader <?>> getObjectReaders () {
244
+ Map <HttpMessageReader <?>, Boolean > getObjectReaders () {
211
245
return this .objectReaders ;
212
246
}
213
247
214
- List <HttpMessageWriter <?>> getObjectWriters () {
248
+ Map <HttpMessageWriter <?>, Boolean > getObjectWriters () {
215
249
return this .objectWriters ;
216
250
}
251
+
252
+ List <Consumer <DefaultCodecConfig >> getDefaultConfigConsumers () {
253
+ return this .defaultConfigConsumers ;
254
+ }
217
255
}
218
256
219
257
}
0 commit comments