All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.github.aidensuen.mongo.bson.codecs.DocumentListCodec Maven / Gradle / Ivy

There is a newer version: 1.1.2
Show newest version
package com.github.aidensuen.mongo.bson.codecs;

import com.github.aidensuen.mongo.bson.DocumentList;
import org.bson.BsonReader;
import org.bson.BsonType;
import org.bson.BsonWriter;
import org.bson.Document;
import org.bson.codecs.*;
import org.bson.codecs.configuration.CodecRegistry;

import java.util.ArrayList;
import java.util.List;

import static org.bson.assertions.Assertions.notNull;
import static org.bson.codecs.configuration.CodecRegistries.fromProviders;

public class DocumentListCodec implements Codec {

    private static final CodecRegistry DEFAULT_REGISTRY = fromProviders(new DocumentCodecProvider(), new ValueCodecProvider(), new BsonValueCodecProvider());

    private final CodecRegistry codecRegistry;

    /**
     * Creates a new instance with a default codec registry that uses the {@link DocumentCodecProvider}.
     *
     * @since 3.4
     */
    public DocumentListCodec() {
        this(DEFAULT_REGISTRY);
    }

    /**
     * Construct an instance with the given registry
     *
     * @param codecRegistry the codec registry
     */
    public DocumentListCodec(final CodecRegistry codecRegistry) {
        this.codecRegistry = notNull("codecRegistry", codecRegistry);
    }

    @Override
    public DocumentList decode(final BsonReader reader, final DecoderContext decoderContext) {
        reader.readStartArray();

        List list = new ArrayList();
        while (reader.readBsonType() != BsonType.END_OF_DOCUMENT) {
            list.add(readValue(reader, decoderContext));
        }

        reader.readEndArray();

        return new DocumentList(list);
    }

    @Override
    @SuppressWarnings({"unchecked", "rawtypes"})
    public void encode(final BsonWriter writer, final DocumentList array, final EncoderContext encoderContext) {
        writer.writeStartArray();
        for (Document value : array) {
            Codec codec = codecRegistry.get(value.getClass());
            encoderContext.encodeWithChildContext(codec, writer, value);
        }
        writer.writeEndArray();
    }

    @Override
    public Class getEncoderClass() {
        return DocumentList.class;
    }

    /**
     * This method may be overridden to change the behavior of reading the current value from the given {@code BsonReader}.  It is required
     * that the value be fully consumed before returning.
     *
     * @param reader         the read to read the value from
     * @param decoderContext the decoder context
     * @return the non-null value read from the reader
     */
    protected Document readValue(final BsonReader reader, final DecoderContext decoderContext) {
        return codecRegistry.get(Document.class).decode(reader, decoderContext);
    }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy