package com.cloudera.sa.node360.flume;
import com.cloudera.sa.node360.model.EventPojo;
import com.cloudera.sa.node360.model.NetFlowPojo;
import org.apache.flume.Context;
import org.apache.flume.Event;
import org.apache.flume.sink.hdfs.SequenceFileSerializer;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.log4j.Logger;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* Created by ted.malaska on 6/12/15.
*/
public class NetFlowEventSerializer implements SequenceFileSerializer {
Logger logger = Logger.getLogger(NetFlowEventSerializer.class.getName());
Text text = new Text();
@Override
public Class<NullWritable> getKeyClass() {
return NullWritable.class;
}
@Override
public Class<Text> getValueClass() {
return Text.class;
}
@Override
public Iterable<Record> serialize(Event event) {
//logger.error("event.getBody():" + event.getBody().length);
//logger.error("eventHeader:");
//for (Map.Entry<String, String> stringStringEntry : event.getHeaders().entrySet()) {
// logger.error(" - " + stringStringEntry.getKey() + "-" + stringStringEntry.getValue());
//}
ByteArrayInputStream bos = new ByteArrayInputStream(event.getBody());
ObjectInput input = null;
try {
input = new ObjectInputStream(bos);
Object o = input.readObject();
//logger.error("o type:" + o.toString());
if (o instanceof EventPojo) {
EventPojo eventPojo = (EventPojo)o;
//logger.error("in :" + o.toString());
final List<NetFlowPojo> netFlowPojoList = eventPojo.getNetFlowPojoList();
//logger.error("eventPojo.getType :" + eventPojo.getType());
//logger.error("eventPojo.getNode :" + eventPojo.getNode());
//logger.error("netFlowPojoList :" + netFlowPojoList);
List<Record> list = new ArrayList<Record>();
if (netFlowPojoList != null) {
//logger.error("netFlowPojoList.size :" + netFlowPojoList.size());
for (NetFlowPojo netFlow: netFlowPojoList) {
text.set(eventPojo.getTimestamp() + "," + netFlow.getSourceAddress() + "," + netFlow.getSourcePort() + "," +
netFlow.getProtocal() + "," + netFlow.getNumberOfBytes() + "," +
netFlow.getDestinationAddress() + "," + netFlow.getDestinationPort());
list.add(new Record(NullWritable.get(), text));
}
//logger.error("list :" + list.size());
}
return list;
} else {
throw new RuntimeException("Record is not of type " + EventPojo.class + " but instead a class of " + o.getClass());
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public static class Builder implements SequenceFileSerializer.Builder {
@Override
public SequenceFileSerializer build(Context context) {
return new NetFlowEventSerializer();
}
}
}