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

org.graylog2.database.jackson.CustomJacksonCodec Maven / Gradle / Ivy

There is a newer version: 6.1.4
Show newest version
/*
 * Copyright (C) 2020 Graylog, Inc.
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the Server Side Public License, version 1,
 * as published by MongoDB, Inc.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * Server Side Public License for more details.
 *
 * You should have received a copy of the Server Side Public License
 * along with this program. If not, see
 * .
 */
package org.graylog2.database.jackson;

import com.fasterxml.jackson.databind.ObjectMapper;
import org.bson.BsonDocument;
import org.bson.BsonDocumentReader;
import org.bson.BsonDocumentWriter;
import org.bson.BsonObjectId;
import org.bson.UuidRepresentation;
import org.bson.codecs.Codec;
import org.bson.codecs.DecoderContext;
import org.bson.codecs.EncoderContext;
import org.mongojack.internal.stream.JacksonCodec;
import org.mongojack.internal.stream.JacksonDecoder;
import org.mongojack.internal.stream.JacksonEncoder;

/**
 * A custom implementation of Mongojack's {@link JacksonCodec} that doesn't attempt to modify potentially immutable
 * domain objects, because that sometimes just isn't possible, e.g. for {@link Record}s.
 */
public class CustomJacksonCodec extends JacksonCodec {
    private final JacksonEncoder encoder;
    private final JacksonDecoder decoder;
    private final ObjectMapper objectMapper;
    private final CustomJacksonCodecRegistry jacksonCodecRegistry;

    public CustomJacksonCodec(JacksonEncoder encoder, JacksonDecoder decoder, final ObjectMapper objectMapper,
                              CustomJacksonCodecRegistry jacksonCodecRegistry) {
        super(encoder, decoder, objectMapper, jacksonCodecRegistry);
        this.encoder = encoder;
        this.decoder = decoder;
        this.objectMapper = objectMapper;
        this.jacksonCodecRegistry = jacksonCodecRegistry;
    }

    @Override
    public T generateIdIfAbsentFromDocument(T t) {
        if (documentHasId(t)) {
            return t;
        }

        try (final var writer = new BsonDocumentWriter(new BsonDocument())) {
            encode(writer, t, EncoderContext.builder().build());
            final BsonDocument document = writer.getDocument();
            document.put("_id", new BsonObjectId());
            try (final var reader = new BsonDocumentReader(document)) {
                return decode(reader, DecoderContext.builder().build());
            }
        }
    }

    @Override
    public Codec withUuidRepresentation(final UuidRepresentation uuidRepresentation) {
        return new CustomJacksonCodec<>(
                encoder.withUuidRepresentation(uuidRepresentation),
                decoder.withUuidRepresentation(uuidRepresentation),
                objectMapper,
                jacksonCodecRegistry
        );
    }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy