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

lumbermill.api.Codecs Maven / Gradle / Ivy

The newest version!
/*
 * Copyright 2016 Sony Mobile Communications, Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License").
 * You may not use this file except in compliance with the License.
 * A copy of the License is located at
 *
 *  http://aws.amazon.com/apache2.0
 *
 * or in the "license" file accompanying this file. This file is distributed
 * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
 * express or implied. See the License for the specific language governing
 * permissions and limitations under the License.
 */
package lumbermill.api;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import lumbermill.api.BytesEvent;
import lumbermill.api.Codec;

import lumbermill.api.Event;
import lumbermill.api.AnyJsonEvent;
import lumbermill.api.JsonEvent;
import lumbermill.internal.JsonParseException;
import okio.ByteString;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;
import java.time.format.DateTimeFormatter;

import static java.time.ZonedDateTime.now;

/**
 * Core codecs
 */
public class Codecs {

    private static final Logger LOGGER = LoggerFactory.getLogger(Codecs.class);

    public  static ObjectMapper objectMapper = new ObjectMapper();

    /**
     * Reads any text into json field 'message' and also adds '@timestamp' to now().
     * This is similar to logstash 'raw' codec.
     */
    public static Codec    TEXT_TO_JSON = textToJson();

    /**
     * Reads json and can handle both array and object type.
     */
    public static Codec JSON_ANY     = json();

    /**
     * Reads json and this MUST be a json object and not an array.
     */
    public static Codec    JSON_OBJECT  = jsonObject();

    /**
     * Reads anything
     */
    public static Codec   BYTES        = bytes();


    private static Codec json() {
       return new AbstractCodec() {
           @Override
           public AnyJsonEvent from(ByteString b) {
               return jsonArray(b);
           }

           @Override
           public AnyJsonEvent from(Event event) {
               return from(event.raw())
                       .withMetaData(event);
           }

           @Override
           public String toString() {
               return "AnyJsonCodec";
           }
       };
    }

    private static Codec jsonObject() {
        return new AbstractCodec() {
            @Override
            public JsonEvent from(ByteString b) {
                return json(b);
            }

            @Override
            public JsonEvent from(Event event) {
                return from(event.raw()).withMetaData(event);
            }

            @Override
            public String toString() {
                return "JsonObjectCodec";
            }
        };
    }

    private static Codec textToJson() {
        return new AbstractCodec() {
            @Override
            public JsonEvent from(ByteString b) {
                return raw(b);
            }

            @Override
            public JsonEvent from(Event event) {
                return from(event.raw()).withMetaData(event);
            }

            @Override
            public String toString() {
                return "TextToJsonCodec";
            }
        };
    }

    private static Codec bytes() {
        return new AbstractCodec() {
            @Override
            public BytesEvent from(ByteString b) {
                return new BytesEvent(b);
            }

            @Override
            public BytesEvent from(Event event) {
                return from(event.raw()).withMetaData(event);
            }

            @Override
            public String toString() {
                return "BytesCodec";
            }
        };
    }



    private static AnyJsonEvent jsonArray(ByteString json) {
        try {

            JsonNode node = objectMapper.readTree(json.utf8());
            return new AnyJsonEvent(node);
        } catch (IOException e) {
            LOGGER.warn("Failed to parse json array from: " + json.utf8());
            throw new RuntimeException(e);
        }
    }


    private static JsonEvent raw(ByteString raw) {
        ObjectNode objectNode = objectMapper.createObjectNode()
                .put("message", raw.utf8())
                .put("@timestamp", now().format(DateTimeFormatter.ISO_OFFSET_DATE_TIME));
        return new JsonEvent(objectNode);
    }


    private static JsonEvent json(ByteString json) {
        try {
            return new JsonEvent((ObjectNode)objectMapper.readTree(json.utf8()));
        } catch (Exception e) {
            LOGGER.warn("Failed to parse json from: " + json.utf8());
            throw new JsonParseException(e);
        }
    }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy