package com.neverwinterdp.scribengin.storage.kafka.source; import java.util.HashMap; import java.util.List; import java.util.Map; import kafka.javaapi.PartitionMetadata; import kafka.javaapi.TopicMetadata; import com.neverwinterdp.kafka.tool.KafkaTool; import com.neverwinterdp.scribengin.storage.StorageDescriptor; import com.neverwinterdp.scribengin.storage.StreamDescriptor; import com.neverwinterdp.scribengin.storage.source.Source; import com.neverwinterdp.scribengin.storage.source.SourceStream; public class KafkaSource implements Source { private StorageDescriptor descriptor; private Map<Integer, KafkaSourceStream> sourceStreams = new HashMap<Integer, KafkaSourceStream>(); public KafkaSource(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); } public KafkaSource(StorageDescriptor descriptor) throws Exception { init(descriptor); } void init(StorageDescriptor descriptor) throws Exception { this.descriptor = descriptor; KafkaTool kafkaTool = new KafkaTool(descriptor.attribute("name"), descriptor.attribute("zk.connect")); kafkaTool.connect(); TopicMetadata topicMetdadata = kafkaTool.findTopicMetadata(descriptor.attribute("topic")); List<PartitionMetadata> partitionMetadatas = topicMetdadata.partitionsMetadata(); for(int i = 0; i < partitionMetadatas.size(); i++) { PartitionMetadata partitionMetadata = partitionMetadatas.get(i); KafkaSourceStream sourceStream = new KafkaSourceStream(descriptor, partitionMetadata); sourceStreams.put(sourceStream.getId(), sourceStream); } kafkaTool.close(); } @Override public StorageDescriptor getDescriptor() { return descriptor; } /** * The stream id is equivalent to the partition id of the kafka */ @Override public SourceStream getStream(int id) { return sourceStreams.get(id); } @Override public SourceStream getStream(StreamDescriptor descriptor) { return sourceStreams.get(descriptor.getId()); } @Override public SourceStream[] getStreams() { SourceStream[] array = new SourceStream[sourceStreams.size()]; return sourceStreams.values().toArray(array); } public void close() throws Exception { } }