package org.genedb.web.mvc.controller.download;
import java.io.IOException;
import java.util.List;
import org.apache.log4j.Logger;
import org.genedb.querying.tmpquery.GeneDetail;
import org.genedb.web.utils.DownloadUtils;
import org.gmod.schema.feature.AbstractGene;
import org.gmod.schema.feature.Polypeptide;
import org.gmod.schema.feature.Transcript;
import org.gmod.schema.mapped.Feature;
public class FormatFASTA extends FormatBase {
private static Logger logger = Logger.getLogger(FormatFASTA.class);
protected SequenceType sequenceType;
protected int prime3;
protected int prime5;
public FormatFASTA() {
super();
this.postRecordSeparator = "\n";
}
public void setSequenceType (SequenceType sequenceType) {
this.sequenceType = sequenceType;
}
public void setPrime3(int prime3) {
this.prime3 = prime3;
}
public void setPrime5(int prime5) {
this.prime5 = prime5;
}
/**
* FASTA formatting can't rely on lucenes, so this is always false
* @see org.genedb.web.mvc.controller.download.FormatBase#onlyNeedLuceneLookups()
*/
@Override
protected boolean onlyNeedLuceneLookups() {
return false;
}
/**
* FASTA formatting will always require feature objects
* @see org.genedb.web.mvc.controller.download.FormatBase#requireFeatures(java.util.List)
*/
@Override
protected boolean requireFeatures(List<GeneDetail> entries) {
return true;
}
@Override
public void formatBody(List<GeneDetail> entries) throws IOException {
if (entries.size() > 0) {
logger.info("fasta export " + entries.get(0).getDisplayId() + " ...");
}
for (GeneDetail entry : entries) {
StringBuffer header = new StringBuffer();
GeneDetailFieldValueExctractor facade = getExtractor(entry);
boolean first = true;
for (String fieldValue : getFieldValues(facade, outputOptions)) {
if (! first) {
header.append(fieldSeparator);
} else {
first = false;
}
header.append(fieldValue);
}
String headerString = header.toString();
String sequence = null;
Feature feature = facade.getFeature();
if (feature != null) {
if (feature instanceof Transcript) {
sequence = DownloadUtils.getSequence( (Transcript) feature, sequenceType, prime3, prime5);
} else if (feature instanceof AbstractGene ) {
sequence = DownloadUtils.getSequence( (AbstractGene) feature, sequenceType, prime3, prime5);
} else if (feature instanceof Polypeptide ) {
sequence = DownloadUtils.getSequence( (Polypeptide) feature, sequenceType, prime3, prime5);
} else {
logger.error("unexpected class: " + feature.getClass());
}
}
String fasta;
if (sequence != null) {
fasta = DownloadUtils.writeFasta(headerString, sequence);
} else {
fasta = String.format(">%s\nAlternately spliced or sequence not attached", headerString);
}
writer.append(fasta.trim() + postRecordSeparator);
}
}
@Override
public void formatFooter() throws IOException {
// blank
}
@Override
public void formatHeader() throws IOException {
// blank
}
}