package com.neverwinterdp.scribengin.storage.kafka.source;
import java.util.ArrayList;
import java.util.List;
import kafka.javaapi.PartitionMetadata;
import com.neverwinterdp.kafka.consumer.KafkaPartitionReader;
import com.neverwinterdp.scribengin.Record;
import com.neverwinterdp.scribengin.storage.StreamDescriptor;
import com.neverwinterdp.scribengin.storage.source.CommitPoint;
import com.neverwinterdp.scribengin.storage.source.SourceStreamReader;
public class KafkaSourceStreamReader implements SourceStreamReader {
private StreamDescriptor descriptor;
private KafkaPartitionReader partitionReader ;
private CommitPoint lastCommitInfo ;
public KafkaSourceStreamReader(StreamDescriptor descriptor, PartitionMetadata partitionMetadata) {
this.descriptor = descriptor;
this.partitionReader =
new KafkaPartitionReader(descriptor.attribute("name"), descriptor.attribute("zk.connect"), descriptor.attribute("topic"), partitionMetadata);
}
@Override
public String getName() { return descriptor.attribute("name"); }
@Override
public Record next() throws Exception {
return partitionReader.nextAs(Record.class);
}
@Override
public Record[] next(int size) throws Exception {
List<Record> holder = new ArrayList<Record>();
Record[] array = new Record[holder.size()];
return holder.toArray(array);
}
@Override
public void rollback() throws Exception {
throw new Exception("To implement") ;
}
@Override
public void prepareCommit() throws Exception {
//TODO: implement 2 phases commit correctly
}
@Override
public void completeCommit() throws Exception {
//TODO: implement 2 phases commit correctly
partitionReader.commit();
}
@Override
public void commit() throws Exception {
try {
prepareCommit() ;
completeCommit() ;
} catch(Exception ex) {
rollback();
throw ex;
}
}
public CommitPoint getLastCommitInfo() { return this.lastCommitInfo ; }
@Override
public void close() throws Exception {
}
}