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; } }