package fr.ens.biologie.genomique.eoulsan.bio.io.hadoop; import static fr.ens.biologie.genomique.eoulsan.bio.io.hadoop.Counters.ENTRIES_WRITTEN; import java.io.IOException; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.InputSplit; import org.apache.hadoop.mapreduce.RecordReader; import org.apache.hadoop.mapreduce.TaskAttemptContext; import org.apache.hadoop.mapreduce.lib.input.LineRecordReader; /** * This class define a RecordReader for SAM files for the Hadoop MapReduce * framework. * @author Laurent Jourdren * @since 2.0 */ public class SAMRecordReader extends RecordReader<Text, Text> { private static final String COUNTERS_GROUP = "SAM Input Format Counters"; private final TaskAttemptContext context; private final LineRecordReader lrr = new LineRecordReader(); private Text key = new Text(); private Text value = new Text(); @Override public synchronized void close() throws IOException { this.lrr.close(); } @Override public Text getCurrentKey() throws IOException, InterruptedException { return this.key; } @Override public Text getCurrentValue() throws IOException, InterruptedException { return this.value; } @Override public float getProgress() throws IOException, InterruptedException { return this.lrr.getProgress(); } @Override public void initialize(final InputSplit inputSplit, final TaskAttemptContext taskAttemptContext) throws IOException, InterruptedException { this.lrr.initialize(inputSplit, taskAttemptContext); } @Override public synchronized boolean nextKeyValue() throws IOException, InterruptedException { if (!this.lrr.nextKeyValue()) { return false; } final Text value = this.lrr.getCurrentValue(); if (value != null) { final String s = value.toString(); if (s.length() == 0) { this.key.set(""); this.value.set(""); } else { if (s.charAt(0) == '@') { this.key.set(""); } else { final int posFirstTab = s.indexOf('\t'); if (posFirstTab == -1) { this.key.set(""); } else { this.key.set(s.substring(0, posFirstTab)); } } this.value.set(s); } } this.context.getCounter(COUNTERS_GROUP, ENTRIES_WRITTEN).increment(1); return true; } // // Constructor // /** * Public constructor. * @param context the context */ public SAMRecordReader(final TaskAttemptContext context) { this.context = context; } }