package org.phenoscape.io;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.apache.commons.csv.CSVParser;
import org.apache.commons.lang.StringUtils;
import org.obo.datamodel.IdentifiedObject;
import org.obo.datamodel.OBOClass;
import org.obo.datamodel.OBOSession;
import org.phenoscape.model.Character;
import org.phenoscape.model.DataSet;
import org.phenoscape.model.PhenotypeProposal;
import org.phenoscape.model.State;
/**
* Loads comma-separated file generated by CharaParser,
* creates PhenotypeProposal objects, and adds them to states.
* @author Jim Balhoff
*/
public class PhenotypeProposalsLoader {
private final DataSet dataset;
private final OBOSession session;
private List<String> header;
public PhenotypeProposalsLoader(DataSet dataset, OBOSession session) {
this.dataset = dataset;
this.session = session;
}
public void loadProposals(File file) throws IOException {
final CSVParser parser = new CSVParser(new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF-8")));
final String[][] csv = parser.getAllValues();
boolean first = true;
for (String[] line : csv) {
if (first) {
this.header = Arrays.asList(line);
first = false;
} else {
if (!StringUtils.isBlank(get("stateid", line))) {
this.addProposalToDataSet(this.createProposal(line));
}
}
}
}
private PhenotypeProposal createProposal(String[] line) {
final PhenotypeProposal proposal = new PhenotypeProposal(get("characterid", line), get("stateid", line));
proposal.setEntityText(StringUtils.trimToNull(get("entity", line)));
proposal.setQualityText(StringUtils.trimToNull(get("quality", line)));
if (proposal.getQualityText() == null) {
proposal.setQualityText(StringUtils.trimToNull(get("qualitynegated", line)));
}
proposal.setQualityModifierText(StringUtils.trimToNull(get("qualitymodifier", line)));
proposal.setEntityLocatorText(StringUtils.trimToNull(get("entitylocator", line)));
proposal.getEntities().addAll(this.getTerms(StringUtils.trimToEmpty(get("entityid", line))));
proposal.getQualities().addAll(this.getTerms(StringUtils.trimToEmpty(get("qualityid", line))));
proposal.getEntityLocators().addAll(this.getTerms(StringUtils.trimToEmpty(get("entitylocatorid", line))));
proposal.getQualityModifiers().addAll(this.getTerms(StringUtils.trimToEmpty(get("qualitymodifierid", line))));
proposal.setQualityIsNegated(!StringUtils.isBlank(get("qualitynegated", line)));
final List<OBOClass> negatedQualityParent = this.getTerms(StringUtils.trimToEmpty(get("qnparentid", line)));
if (!negatedQualityParent.isEmpty()) {
proposal.setNegatedQualityParent(negatedQualityParent.get(0));
}
return proposal;
}
private void addProposalToDataSet(PhenotypeProposal proposal) {
final State state = this.findState(proposal.getCharacterID(), proposal.getStateID());
if (state != null) {
state.setProposal(proposal);
}
}
private List<OBOClass> getTerms(String ids) {
final String[] items = ids.split(",");
final List<OBOClass> terms = new ArrayList<OBOClass>();
for (String item : items) {
final IdentifiedObject term = this.session.getObject(item);
if (term instanceof OBOClass) {
terms.add((OBOClass)term);
}
}
return terms;
}
private State findState(String characterID, String stateID) {
for (Character character : this.dataset.getCharacters()) {
if (characterID.equals(character.getStatesNexmlID())) {
for (State state : character.getStates()) {
if (stateID.equals(state.getNexmlID())) {
return state;
}
}
}
}
return null;
}
private String get(String column, String[] line) {
return line[this.header.indexOf(column)];
}
}