package org.bson.internal;
import org.bson.BsonReader;
import org.bson.BsonWriter;
import org.bson.codecs.Codec;
import org.bson.codecs.DecoderContext;
import org.bson.codecs.EncoderContext;
import org.bson.codecs.configuration.CodecRegistry;
class LazyCodec<T> implements Codec<T> {
private final CodecRegistry registry;
private final Class<T> clazz;
private volatile Codec<T> wrapped;
LazyCodec(final CodecRegistry registry, final Class<T> clazz) {
this.registry = registry;
this.clazz = clazz;
}
@Override
public void encode(final BsonWriter writer, final T value, final EncoderContext encoderContext) {
getWrapped().encode(writer, value, encoderContext);
}
@Override
public Class<T> getEncoderClass() {
return clazz;
}
@Override
public T decode(final BsonReader reader, final DecoderContext decoderContext) {
return getWrapped().decode(reader, decoderContext);
}
private Codec<T> getWrapped() {
if (wrapped == null) {
wrapped = registry.get(clazz);
}
return wrapped;
}
}