Package com.netflix.suro.input.remotefile

Source Code of com.netflix.suro.input.remotefile.JsonLine

package com.netflix.suro.input.remotefile;

import com.fasterxml.jackson.annotation.JacksonInject;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.base.Strings;
import com.google.common.collect.ImmutableList;
import com.netflix.suro.input.RecordParser;
import com.netflix.suro.message.DefaultMessageContainer;
import com.netflix.suro.message.Message;
import com.netflix.suro.message.MessageContainer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

public class JsonLine implements RecordParser {
    private static Logger log = LoggerFactory.getLogger(JsonLine.class);

    public static final String TYPE = "jsonline";

    private final String routingKeyField;
    private final String routingKey;
    private final ObjectMapper jsonMapper;

    @JsonCreator
    public JsonLine(
            @JsonProperty("routingKey") String routingKey,
            @JsonProperty("routingKeyField") String routingKeyField,
            @JacksonInject ObjectMapper jsonMapper
    ) {
        this.routingKey = routingKey;
        this.routingKeyField = routingKeyField;
        this.jsonMapper = jsonMapper;
    }

    @Override
    public List<MessageContainer> parse(String data) {
        if (routingKey != null) {
            return new ImmutableList.Builder<MessageContainer>()
                    .add(new DefaultMessageContainer(
                            new Message(routingKey, data.getBytes()),
                            jsonMapper))
                    .build();
        } else {
            try {
                Map<String, Object> record = jsonMapper.readValue(data, S3Consumer.typeReference);
                String routingKeyOnRecord = record.get(routingKeyField).toString();
                if (Strings.isNullOrEmpty(routingKeyOnRecord)) {
                    routingKeyOnRecord = routingKey;
                }
                if (!Strings.isNullOrEmpty(routingKeyOnRecord)) {
                    return new ImmutableList.Builder<MessageContainer>()
                            .add(new DefaultMessageContainer(
                                    new Message(routingKeyOnRecord, data.getBytes()),
                                    jsonMapper))
                            .build();
                } else {
                    return new ArrayList<MessageContainer>();
                }
            } catch (IOException e) {
                log.error("Exception on parsing: " + e.getMessage(), e);
                return new ArrayList<MessageContainer>();
            }
        }
    }
}
TOP

Related Classes of com.netflix.suro.input.remotefile.JsonLine

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.