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