package de.anycook.db.drafts.mongo.codecs; import de.anycook.drafts.IngredientDraft; import de.anycook.drafts.StepDraft; import org.bson.BsonReader; import org.bson.BsonType; 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; import java.util.ArrayList; import java.util.List; public class StepDraftCodec implements Codec<StepDraft> { private final Codec<IngredientDraft> ingredientDraftCodec; public StepDraftCodec(final CodecRegistry codecRegistry) { this.ingredientDraftCodec = codecRegistry.get(IngredientDraft.class); } @Override public StepDraft decode(final BsonReader reader, final DecoderContext decoderContext) { final StepDraft stepDraft = new StepDraft(); reader.readStartDocument(); stepDraft.setId(reader.readInt32("id")); stepDraft.setText(reader.readString("text")); reader.readStartArray(); final List<IngredientDraft> stepIngredients = new ArrayList<>(); while (reader.readBsonType() != BsonType.END_OF_DOCUMENT) { stepIngredients.add(ingredientDraftCodec.decode(reader, decoderContext)); } stepDraft.setIngredients(stepIngredients); reader.readEndArray(); reader.readEndDocument(); return stepDraft; } @Override public void encode(final BsonWriter writer, final StepDraft value, final EncoderContext encoderContext) { writer.writeStartDocument(); writer.writeInt32("id", value.getId()); writer.writeString("text", value.getText()); writer.writeStartArray("ingredients"); value.getIngredients().forEach(x -> encoderContext.encodeWithChildContext( ingredientDraftCodec, writer, x)); writer.writeEndArray(); writer.writeEndDocument(); } @Override public Class<StepDraft> getEncoderClass() { return StepDraft.class; } }