package org.genedb.db.loading;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.Reader;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* Represents a FASTA file, and allows the records in the file to
* be iterated over in order.
*
* @author rh11
*
*/
public class FastaFile implements Iterable<FastaRecord> {
private List<FastaRecord> records = new ArrayList<FastaRecord>();
/**
* Create a new FastaFile from the specified reader.
* @param reader the reader to read from
* @throws IOException
*/
public FastaFile(Reader reader) throws IOException {
int lineNumber = 1;
int lineNumberOfHeader = 0;
String id = null;
String line;
BufferedReader br = new BufferedReader(reader);
StringBuilder sequence = new StringBuilder();
while (null != (line = br.readLine())) {
if (line.startsWith(">")) {
if (id != null) {
records.add(new FastaRecord(id, sequence.toString(), lineNumberOfHeader));
}
lineNumberOfHeader = lineNumber;
id = line.substring(1);
int pipeIndex = line.indexOf("|");
if (pipeIndex > -1) {
id = line.substring(1, pipeIndex);
}
sequence = new StringBuilder();
} else {
sequence.append(line.toLowerCase());
}
lineNumber++;
}
if (id != null) {
records.add(new FastaRecord(id, sequence.toString(), lineNumberOfHeader));
}
br.close();
}
public Iterator<FastaRecord> iterator() {
return records.iterator();
}
}
class FastaRecord {
private String id;
private String sequence;
private int lineNumber;
FastaRecord(String id, String sequence, int lineNumber) {
this.id = id;
this.sequence = sequence;
this.lineNumber = lineNumber;
}
public String getId() {
return this.id;
}
public String getSequence() {
return this.sequence;
}
public int getLineNumber() {
return this.lineNumber;
}
// hashCode and equals methods generated by Eclipse.
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((id == null) ? 0 : id.hashCode());
result = prime * result + ((sequence == null) ? 0 : sequence.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
final FastaRecord other = (FastaRecord) obj;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
if (sequence == null) {
if (other.sequence != null)
return false;
} else if (!sequence.equals(other.sequence))
return false;
return true;
}
}