package org.jai.flume.sinks.elasticsearch.serializer; import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.util.Map; import org.apache.flume.Context; import org.apache.flume.Event; import org.apache.flume.conf.ComponentConfiguration; import org.apache.flume.sink.elasticsearch.ContentBuilderUtil; import org.apache.flume.sink.elasticsearch.ElasticSearchEventSerializer; import org.elasticsearch.common.io.BytesStream; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentType; import org.elasticsearch.common.xcontent.json.JsonXContent; public class ElasticSearchJsonBodyEventSerializer implements ElasticSearchEventSerializer { @Override public void configure(final Context arg0) { // NO-OP... } @Override public void configure(final ComponentConfiguration arg0) { // NO-OP... } @Override public BytesStream getContentBuilder(final Event event) throws IOException { final XContentBuilder builder = jsonBuilder().startObject(); appendBody(builder, event); appendHeaders(builder, event); return builder; } private void appendBody(final XContentBuilder builder, final Event event) throws IOException, UnsupportedEncodingException { addComplexField(builder, "body", XContentType.JSON, event.getBody()); } private void appendHeaders(final XContentBuilder builder, final Event event) throws IOException { final Map<String, String> headers = event.getHeaders(); for (final String key : headers.keySet()) { ContentBuilderUtil.appendField(builder, key, headers.get(key) .getBytes(charset)); } } public void addComplexField(final XContentBuilder builder, final String fieldName, final XContentType contentType, final byte[] data) throws IOException { builder.field(fieldName, JsonXContent.jsonXContent.createParser(data) .mapAndClose()); } }