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

com.github.nagyesta.lowkeyvault.model.json.util.AbstractBase64ZipSerializer Maven / Gradle / Ivy

package com.github.nagyesta.lowkeyvault.model.json.util;

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializerProvider;
import lombok.extern.slf4j.Slf4j;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.Optional;
import java.util.zip.GZIPOutputStream;

/**
 * Serializer zipping json snippets and encoding with base64.
 *
 * @param  The type of the entity.
 */
@Slf4j
public abstract class AbstractBase64ZipSerializer extends JsonSerializer {

    private final Base64Serializer base64Serializer;
    private final ObjectMapper objectMapper;

    protected AbstractBase64ZipSerializer(final Base64Serializer base64Serializer, final ObjectMapper objectMapper) {
        this.base64Serializer = base64Serializer;
        this.objectMapper = objectMapper;
    }

    @Override
    public void serialize(final E value, final JsonGenerator gen,
                          final SerializerProvider serializers) throws IOException {
        final String base64 = Optional.ofNullable(value)
                .map(this::compressObject)
                .orElse(null);
        if (base64 != null) {
            gen.writeString(base64);
        } else {
            gen.writeNull();
        }
    }

    private String compressObject(final E value) {
        //noinspection LocalCanBeFinal
        try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
             GZIPOutputStream gzipOutputStream = new GZIPOutputStream(byteArrayOutputStream)) {
            final String json = objectMapper.writer().writeValueAsString(value);
            gzipOutputStream.write(json.getBytes(StandardCharsets.UTF_8));
            gzipOutputStream.flush();
            gzipOutputStream.finish();
            final byte[] byteArray = byteArrayOutputStream.toByteArray();
            return base64Serializer.base64Encode(byteArray);
        } catch (Exception e) {
            log.error(e.getMessage(), e);
            throw new IllegalArgumentException("Unable to compress input.");
        }
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy