package com.neverwinterdp.scribengin.storage.kafka.sink; import java.util.LinkedHashMap; import com.neverwinterdp.kafka.tool.KafkaTool; import com.neverwinterdp.scribengin.storage.StorageDescriptor; import com.neverwinterdp.scribengin.storage.StreamDescriptor; import com.neverwinterdp.scribengin.storage.sink.Sink; import com.neverwinterdp.scribengin.storage.sink.SinkStream; public class KafkaSink implements Sink { private StorageDescriptor descriptor; private int idTracker = 0; private LinkedHashMap<Integer, KafkaSinkStream> streams = new LinkedHashMap<Integer, KafkaSinkStream>() ; public KafkaSink(StorageDescriptor descriptor) throws Exception { init(descriptor) ; } public KafkaSink(String name, String zkConnect, String topic) throws Exception { StorageDescriptor descriptor = new StorageDescriptor("kafka"); descriptor.attribute("name", name); descriptor.attribute("topic", topic); descriptor.attribute("zk.connect", zkConnect); init(descriptor); } private void init(StorageDescriptor descriptor) throws Exception { KafkaTool kafkaTool = new KafkaTool(descriptor.attribute("name"), descriptor.attribute("zk.connect")) ; kafkaTool.connect(); descriptor.attribute("broker.list", kafkaTool.getKafkaBrokerList()); this.descriptor = descriptor ; kafkaTool.close(); } @Override public StorageDescriptor getDescriptor() { return descriptor; } @Override public SinkStream getStream(StreamDescriptor descriptor) throws Exception { SinkStream stream = streams.get(descriptor.getId()); if(stream != null) return stream ; KafkaSinkStream newStream= new KafkaSinkStream(descriptor) ; streams.put(descriptor.getId(), newStream) ; return newStream; } @Override public SinkStream[] getStreams() { SinkStream[] array = new SinkStream[streams.size()]; return streams.values().toArray(array); } @Override public void delete(SinkStream stream) throws Exception { SinkStream found = streams.get(stream.getDescriptor().getId()); if(found != null) { found.delete(); streams.remove(stream.getDescriptor().getId()); } else { throw new Exception("Cannot find the stream " + stream.getDescriptor().getId()); } } @Override public SinkStream newStream() throws Exception { StreamDescriptor streamDescriptor = new StreamDescriptor(this.descriptor); streamDescriptor.setId(idTracker++); return new KafkaSinkStream(streamDescriptor); } @Override public void close() throws Exception { for(KafkaSinkStream sel : streams.values()) { } } }