/*
* Copyright 2002-2018 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.http.codec.support;
import java.util.ArrayList;
import java.util.List;
import org.springframework.core.ResolvableType;
import org.springframework.core.codec.Decoder;
import org.springframework.core.codec.Encoder;
import org.springframework.http.codec.CodecConfigurer;
import org.springframework.http.codec.DecoderHttpMessageReader;
import org.springframework.http.codec.EncoderHttpMessageWriter;
import org.springframework.http.codec.HttpMessageReader;
import org.springframework.http.codec.HttpMessageWriter;
import org.springframework.util.Assert;
Default implementation of CodecConfigurer
that serves as a base for client and server specific variants. Author: Rossen Stoyanchev Since: 5.0
/**
* Default implementation of {@link CodecConfigurer} that serves as a base for
* client and server specific variants.
*
* @author Rossen Stoyanchev
* @since 5.0
*/
class BaseCodecConfigurer implements CodecConfigurer {
private final BaseDefaultCodecs defaultCodecs;
private final DefaultCustomCodecs customCodecs = new DefaultCustomCodecs();
Constructor with the base BaseDefaultCodecs
to use, which can be a client or server specific variant. /**
* Constructor with the base {@link BaseDefaultCodecs} to use, which can be
* a client or server specific variant.
*/
BaseCodecConfigurer(BaseDefaultCodecs defaultCodecs) {
Assert.notNull(defaultCodecs, "'defaultCodecs' is required");
this.defaultCodecs = defaultCodecs;
}
@Override
public DefaultCodecs defaultCodecs() {
return this.defaultCodecs;
}
@Override
public void registerDefaults(boolean shouldRegister) {
this.defaultCodecs.registerDefaults(shouldRegister);
}
@Override
public CustomCodecs customCodecs() {
return this.customCodecs;
}
@Override
public List<HttpMessageReader<?>> getReaders() {
List<HttpMessageReader<?>> result = new ArrayList<>();
result.addAll(this.defaultCodecs.getTypedReaders());
result.addAll(this.customCodecs.getTypedReaders());
result.addAll(this.defaultCodecs.getObjectReaders());
result.addAll(this.customCodecs.getObjectReaders());
result.addAll(this.defaultCodecs.getCatchAllReaders());
return result;
}
@Override
public List<HttpMessageWriter<?>> getWriters() {
return getWritersInternal(false);
}
Internal method that returns the configured writers.
Params: - forMultipart – whether to returns writers for general use ("false"),
or for multipart requests only ("true"). Generally the two sets are the
same except for the multipart writer itself.
/**
* Internal method that returns the configured writers.
* @param forMultipart whether to returns writers for general use ("false"),
* or for multipart requests only ("true"). Generally the two sets are the
* same except for the multipart writer itself.
*/
protected List<HttpMessageWriter<?>> getWritersInternal(boolean forMultipart) {
List<HttpMessageWriter<?>> result = new ArrayList<>();
result.addAll(this.defaultCodecs.getTypedWriters(forMultipart));
result.addAll(this.customCodecs.getTypedWriters());
result.addAll(this.defaultCodecs.getObjectWriters(forMultipart));
result.addAll(this.customCodecs.getObjectWriters());
result.addAll(this.defaultCodecs.getCatchAllWriters());
return result;
}
Default implementation of CustomCodecs
. /**
* Default implementation of {@code CustomCodecs}.
*/
private static final class DefaultCustomCodecs implements CustomCodecs {
private final List<HttpMessageReader<?>> typedReaders = new ArrayList<>();
private final List<HttpMessageWriter<?>> typedWriters = new ArrayList<>();
private final List<HttpMessageReader<?>> objectReaders = new ArrayList<>();
private final List<HttpMessageWriter<?>> objectWriters = new ArrayList<>();
@Override
public void decoder(Decoder<?> decoder) {
reader(new DecoderHttpMessageReader<>(decoder));
}
@Override
public void encoder(Encoder<?> encoder) {
writer(new EncoderHttpMessageWriter<>(encoder));
}
@Override
public void reader(HttpMessageReader<?> reader) {
boolean canReadToObject = reader.canRead(ResolvableType.forClass(Object.class), null);
(canReadToObject ? this.objectReaders : this.typedReaders).add(reader);
}
@Override
public void writer(HttpMessageWriter<?> writer) {
boolean canWriteObject = writer.canWrite(ResolvableType.forClass(Object.class), null);
(canWriteObject ? this.objectWriters : this.typedWriters).add(writer);
}
// Package private accessors...
List<HttpMessageReader<?>> getTypedReaders() {
return this.typedReaders;
}
List<HttpMessageWriter<?>> getTypedWriters() {
return this.typedWriters;
}
List<HttpMessageReader<?>> getObjectReaders() {
return this.objectReaders;
}
List<HttpMessageWriter<?>> getObjectWriters() {
return this.objectWriters;
}
}
}