CodecConfigurer implementation refactoring

Backport of 9d65830133

See gh-24201
This commit is contained in:
Rossen Stoyanchev
2019-12-12 17:01:01 +00:00
parent 59e4755562
commit f5b43a264a
9 changed files with 228 additions and 121 deletions

View File

@@ -22,7 +22,6 @@ import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;
import org.junit.Test;
import reactor.core.publisher.Flux;
@@ -45,6 +44,7 @@ import org.springframework.http.codec.ClientCodecConfigurer;
import org.springframework.http.codec.DecoderHttpMessageReader;
import org.springframework.http.codec.EncoderHttpMessageWriter;
import org.springframework.http.codec.FormHttpMessageReader;
import org.springframework.http.codec.FormHttpMessageWriter;
import org.springframework.http.codec.HttpMessageReader;
import org.springframework.http.codec.HttpMessageWriter;
import org.springframework.http.codec.ResourceHttpMessageWriter;
@@ -119,12 +119,45 @@ public class ClientCodecConfigurerTests {
Jackson2JsonDecoder decoder = new Jackson2JsonDecoder();
this.configurer.defaultCodecs().jackson2JsonDecoder(decoder);
assertSame(decoder, this.configurer.getReaders().stream()
.filter(reader -> ServerSentEventHttpMessageReader.class.equals(reader.getClass()))
.map(reader -> (ServerSentEventHttpMessageReader) reader)
.findFirst()
.map(ServerSentEventHttpMessageReader::getDecoder)
.filter(e -> e == decoder).orElse(null));
List<HttpMessageReader<?>> readers = this.configurer.getReaders();
assertSame(decoder, findCodec(readers, ServerSentEventHttpMessageReader.class).getDecoder());
}
@Test
public void maxInMemorySize() {
int size = 99;
this.configurer.defaultCodecs().maxInMemorySize(size);
List<HttpMessageReader<?>> readers = this.configurer.getReaders();
assertEquals(12, readers.size());
assertEquals(size, ((ByteArrayDecoder) getNextDecoder(readers)).getMaxInMemorySize());
assertEquals(size, ((ByteBufferDecoder) getNextDecoder(readers)).getMaxInMemorySize());
assertEquals(size, ((DataBufferDecoder) getNextDecoder(readers)).getMaxInMemorySize());
assertEquals(size, ((ResourceDecoder) getNextDecoder(readers)).getMaxInMemorySize());
assertEquals(size, ((StringDecoder) getNextDecoder(readers)).getMaxInMemorySize());
assertEquals(size, ((ProtobufDecoder) getNextDecoder(readers)).getMaxMessageSize());
assertEquals(size, ((FormHttpMessageReader) nextReader(readers)).getMaxInMemorySize());
assertEquals(size, ((Jackson2JsonDecoder) getNextDecoder(readers)).getMaxInMemorySize());
assertEquals(size, ((Jackson2SmileDecoder) getNextDecoder(readers)).getMaxInMemorySize());
assertEquals(size, ((Jaxb2XmlDecoder) getNextDecoder(readers)).getMaxInMemorySize());
ServerSentEventHttpMessageReader reader = (ServerSentEventHttpMessageReader) nextReader(readers);
assertEquals(size, ((Jackson2JsonDecoder) reader.getDecoder()).getMaxInMemorySize());
assertEquals(size, ((StringDecoder) getNextDecoder(readers)).getMaxInMemorySize());
}
@Test
public void enableLoggingRequestDetails() {
this.configurer.defaultCodecs().enableLoggingRequestDetails(true);
List<HttpMessageWriter<?>> writers = this.configurer.getWriters();
MultipartHttpMessageWriter multipartWriter = findCodec(writers, MultipartHttpMessageWriter.class);
assertTrue(multipartWriter.isEnableLoggingRequestDetails());
FormHttpMessageWriter formWriter = (FormHttpMessageWriter) multipartWriter.getFormWriter();
assertNotNull(formWriter);
assertTrue(formWriter.isEnableLoggingRequestDetails());
}
@Test
@@ -138,35 +171,19 @@ public class ClientCodecConfigurerTests {
// Clone has the customizations
Decoder<?> sseDecoder = clone.getReaders().stream()
.filter(reader -> reader instanceof ServerSentEventHttpMessageReader)
.map(reader -> ((ServerSentEventHttpMessageReader) reader).getDecoder())
.findFirst()
.get();
List<HttpMessageWriter<?>> multipartWriters = clone.getWriters().stream()
.filter(writer -> writer instanceof MultipartHttpMessageWriter)
.flatMap(writer -> ((MultipartHttpMessageWriter) writer).getPartWriters().stream())
.collect(Collectors.toList());
Decoder<?> sseDecoder = findCodec(clone.getReaders(), ServerSentEventHttpMessageReader.class).getDecoder();
List<HttpMessageWriter<?>> writers = findCodec(clone.getWriters(), MultipartHttpMessageWriter.class).getPartWriters();
assertSame(jackson2Decoder, sseDecoder);
assertEquals(2, multipartWriters.size());
assertEquals(2, writers.size());
// Original does not have the customizations
sseDecoder = this.configurer.getReaders().stream()
.filter(reader -> reader instanceof ServerSentEventHttpMessageReader)
.map(reader -> ((ServerSentEventHttpMessageReader) reader).getDecoder())
.findFirst()
.get();
multipartWriters = this.configurer.getWriters().stream()
.filter(writer -> writer instanceof MultipartHttpMessageWriter)
.flatMap(writer -> ((MultipartHttpMessageWriter) writer).getPartWriters().stream())
.collect(Collectors.toList());
sseDecoder = findCodec(this.configurer.getReaders(), ServerSentEventHttpMessageReader.class).getDecoder();
writers = findCodec(this.configurer.getWriters(), MultipartHttpMessageWriter.class).getPartWriters();
assertNotSame(jackson2Decoder, sseDecoder);
assertEquals(10, multipartWriters.size());
assertEquals(10, writers.size());
}
private Decoder<?> getNextDecoder(List<HttpMessageReader<?>> readers) {
@@ -175,12 +192,21 @@ public class ClientCodecConfigurerTests {
return ((DecoderHttpMessageReader<?>) reader).getDecoder();
}
private HttpMessageReader<?> nextReader(List<HttpMessageReader<?>> readers) {
return readers.get(this.index.getAndIncrement());
}
private Encoder<?> getNextEncoder(List<HttpMessageWriter<?>> writers) {
HttpMessageWriter<?> writer = writers.get(this.index.getAndIncrement());
assertEquals(EncoderHttpMessageWriter.class, writer.getClass());
return ((EncoderHttpMessageWriter<?>) writer).getEncoder();
}
@SuppressWarnings("unchecked")
private <T> T findCodec(List<?> codecs, Class<T> type) {
return (T) codecs.stream().filter(type::isInstance).findFirst().get();
}
@SuppressWarnings("unchecked")
private void assertStringDecoder(Decoder<?> decoder, boolean textOnly) {
assertEquals(StringDecoder.class, decoder.getClass());

View File

@@ -153,6 +153,20 @@ public class ServerCodecConfigurerTests {
assertEquals(size, ((StringDecoder) getNextDecoder(readers)).getMaxInMemorySize());
}
@Test
public void enableRequestLoggingDetails() {
this.configurer.defaultCodecs().enableLoggingRequestDetails(true);
List<HttpMessageReader<?>> readers = this.configurer.getReaders();
assertTrue(findCodec(readers, FormHttpMessageReader.class).isEnableLoggingRequestDetails());
MultipartHttpMessageReader multipartReader = findCodec(readers, MultipartHttpMessageReader.class);
assertTrue(multipartReader.isEnableLoggingRequestDetails());
SynchronossPartHttpMessageReader reader = (SynchronossPartHttpMessageReader) multipartReader.getPartReader();
assertTrue(reader.isEnableLoggingRequestDetails());
}
@Test
public void cloneConfigurer() {
ServerCodecConfigurer clone = this.configurer.clone();
@@ -164,37 +178,22 @@ public class ServerCodecConfigurerTests {
// Clone has the customizations
HttpMessageReader<?> actualReader = clone.getReaders().stream()
.filter(r -> r instanceof MultipartHttpMessageReader)
.findFirst()
.get();
Encoder<?> actualEncoder = clone.getWriters().stream()
.filter(writer -> writer instanceof ServerSentEventHttpMessageWriter)
.map(writer -> ((ServerSentEventHttpMessageWriter) writer).getEncoder())
.findFirst()
.get();
HttpMessageReader<?> actualReader =
findCodec(clone.getReaders(), MultipartHttpMessageReader.class);
ServerSentEventHttpMessageWriter actualWriter =
findCodec(clone.getWriters(), ServerSentEventHttpMessageWriter.class);
assertSame(reader, actualReader);
assertSame(encoder, actualEncoder);
assertSame(encoder, actualWriter.getEncoder());
// Original does not have the customizations
actualReader = this.configurer.getReaders().stream()
.filter(r -> r instanceof MultipartHttpMessageReader)
.findFirst()
.get();
actualEncoder = this.configurer.getWriters().stream()
.filter(writer -> writer instanceof ServerSentEventHttpMessageWriter)
.map(writer -> ((ServerSentEventHttpMessageWriter) writer).getEncoder())
.findFirst()
.get();
actualReader = findCodec(this.configurer.getReaders(), MultipartHttpMessageReader.class);
actualWriter = findCodec(this.configurer.getWriters(), ServerSentEventHttpMessageWriter.class);
assertNotSame(reader, actualReader);
assertNotSame(encoder, actualEncoder);
assertNotSame(encoder, actualWriter.getEncoder());
}
private Decoder<?> getNextDecoder(List<HttpMessageReader<?>> readers) {
@@ -213,6 +212,11 @@ public class ServerCodecConfigurerTests {
return ((EncoderHttpMessageWriter<?>) writer).getEncoder();
}
@SuppressWarnings("unchecked")
private <T> T findCodec(List<?> codecs, Class<T> type) {
return (T) codecs.stream().filter(type::isInstance).findFirst().get();
}
@SuppressWarnings("unchecked")
private void assertStringDecoder(Decoder<?> decoder, boolean textOnly) {
assertEquals(StringDecoder.class, decoder.getClass());