package com.sequenceiq.lastfm.etl; import java.io.IOException; import java.io.OutputStream; import java.nio.charset.Charset; import org.apache.flume.Context; import org.apache.flume.Event; import org.apache.flume.serialization.EventSerializer; import org.apache.flume.serialization.HeaderAndBodyTextEventSerializer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class CustomLastfmHeaderAndBodyTextEventSerializer implements EventSerializer { private static final Logger LOGGER = LoggerFactory.getLogger(HeaderAndBodyTextEventSerializer.class); // for legacy reasons, by default, append a newline to each event written out private static final String APPEND_NEWLINE = "appendNewline"; private static final boolean APPEND_NEWLINE_DFLT = true; private final OutputStream out; private final boolean appendNewline; private CustomLastfmHeaderAndBodyTextEventSerializer(OutputStream out, Context ctx) { this.appendNewline = ctx.getBoolean(APPEND_NEWLINE, APPEND_NEWLINE_DFLT); this.out = out; } public static Builder builder() { return new Builder(); } @Override public boolean supportsReopen() { return true; } @Override public void afterCreate() { // noop } @Override public void afterReopen() { // noop } @Override public void beforeClose() { // noop } @Override public void write(Event e) throws IOException { try { String message = e.getHeaders().get("message"); out.write(message.getBytes(Charset.forName("UTF-8"))); if (appendNewline) { out.write('\n'); } } catch (Exception ex) { LOGGER.info("There was no message in the header..."); } } @Override public void flush() throws IOException { // noop } public static class Builder implements EventSerializer.Builder { @Override public EventSerializer build(Context context, OutputStream out) { return new CustomLastfmHeaderAndBodyTextEventSerializer(out, context); } } }