From: <rv...@us...> - 2011-10-27 16:58:23
|
Revision: 974 http://treebase.svn.sourceforge.net/treebase/?rev=974&view=rev Author: rvos Date: 2011-10-27 16:58:16 +0000 (Thu, 27 Oct 2011) Log Message: ----------- So far, the NeXML converters were working on the assumption that a single study/nexusdataset would be converted to NeXML. It turns out there are use cases where a search result set needs to be converted. This means that we also want to be able to generate NeXML documents that don't have all the annotations that go with serializing a single study (e.g. its ID, authors, title, etc.), but rather a place holder document into which search results (e.g. entire studies, sets of taxa, matrices, trees) can be added and jointly serialized. This commit includes some refactorings in the Nexml*Writer classes and a JUnit test class that demonstrates this new behavior. Modified Paths: -------------- trunk/treebase-core/src/main/java/org/cipres/treebase/domain/nexus/nexml/NexmlDocumentWriter.java trunk/treebase-core/src/main/java/org/cipres/treebase/domain/nexus/nexml/NexmlMatrixWriter.java trunk/treebase-core/src/main/java/org/cipres/treebase/domain/nexus/nexml/NexmlOTUWriter.java trunk/treebase-core/src/main/java/org/cipres/treebase/domain/nexus/nexml/NexmlObjectConverter.java trunk/treebase-core/src/main/java/org/cipres/treebase/domain/nexus/nexml/NexmlTreeBlockWriter.java Added Paths: ----------- trunk/treebase-core/src/test/java/org/cipres/treebase/domain/nexus/NexmlSearchResultConverterTest.java Modified: trunk/treebase-core/src/main/java/org/cipres/treebase/domain/nexus/nexml/NexmlDocumentWriter.java =================================================================== --- trunk/treebase-core/src/main/java/org/cipres/treebase/domain/nexus/nexml/NexmlDocumentWriter.java 2011-10-13 18:50:53 UTC (rev 973) +++ trunk/treebase-core/src/main/java/org/cipres/treebase/domain/nexus/nexml/NexmlDocumentWriter.java 2011-10-27 16:58:16 UTC (rev 974) @@ -1,12 +1,28 @@ package org.cipres.treebase.domain.nexus.nexml; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + import org.cipres.treebase.Constants; import org.cipres.treebase.domain.matrix.CharacterMatrix; +import org.cipres.treebase.domain.matrix.Matrix; import org.cipres.treebase.domain.nexus.NexusDataSet; +import org.cipres.treebase.domain.search.MatrixSearchResults; +import org.cipres.treebase.domain.search.SearchResults; +import org.cipres.treebase.domain.search.SearchResultsType; +import org.cipres.treebase.domain.search.StudySearchResults; +import org.cipres.treebase.domain.search.TaxonSearchResults; +import org.cipres.treebase.domain.search.TreeSearchResults; import org.cipres.treebase.domain.study.Study; +import org.cipres.treebase.domain.taxon.Taxon; +import org.cipres.treebase.domain.taxon.TaxonLabel; import org.cipres.treebase.domain.taxon.TaxonLabelHome; import org.cipres.treebase.domain.taxon.TaxonLabelSet; +import org.cipres.treebase.domain.tree.PhyloTree; import org.nexml.model.Document; +import org.nexml.model.OTUs; +import org.nexml.model.TreeBlock; public class NexmlDocumentWriter extends NexmlObjectConverter { @@ -41,7 +57,7 @@ NexmlMatrixWriter nmc = new NexmlMatrixWriter(getStudy(),getTaxonLabelHome(),getDocument()); for (org.cipres.treebase.domain.matrix.Matrix matrix : pNexusDataSet.getMatrices() ) { if ( matrix instanceof CharacterMatrix ) { - nmc.fromTreeBaseToXml((CharacterMatrix)matrix); + nmc.fromTreeBaseToXml((CharacterMatrix)matrix,null); } } @@ -71,7 +87,7 @@ NexmlMatrixWriter nmc = new NexmlMatrixWriter(getStudy(),getTaxonLabelHome(),getDocument()); for (org.cipres.treebase.domain.matrix.Matrix matrix : pStudy.getMatrices() ) { if ( matrix instanceof CharacterMatrix ) { - nmc.fromTreeBaseToXml((CharacterMatrix)matrix); + nmc.fromTreeBaseToXml((CharacterMatrix)matrix,null); } } @@ -82,5 +98,91 @@ return getDocument(); } + + public Document fromTreeBaseToXml(SearchResults<?> searchResults) { + getDocument().addAnnotationValue("skos:historyNote", Constants.SKOSURI, "Mapped from TreeBASE schema using "+this.toString()+" $Rev$"); + SearchResultsType srt = searchResults.resultType(); + switch(srt) { + case STUDY : return fromTreeBaseToXml((StudySearchResults) searchResults); + case MATRIX : return fromTreeBaseToXml((MatrixSearchResults) searchResults); + case TREE : return fromTreeBaseToXml((TreeSearchResults) searchResults); + case TAXON : return fromTreeBaseToXml((TaxonSearchResults) searchResults); + case NONE : ; break; + } + return null; + } + + public Document fromTreeBaseToXml(StudySearchResults searchResults) { + NexmlOTUWriter noc = new NexmlOTUWriter(null,getTaxonLabelHome(),getDocument()); + NexmlMatrixWriter nmc = new NexmlMatrixWriter(null,getTaxonLabelHome(),getDocument()); + NexmlTreeBlockWriter ntc = new NexmlTreeBlockWriter(null,getTaxonLabelHome(),getDocument()); + for ( Study pStudy : searchResults.getResults() ) { + for ( TaxonLabelSet taxonLabelSet : pStudy.getTaxonLabelSets() ) { + noc.fromTreeBaseToXml(taxonLabelSet); + } + for (org.cipres.treebase.domain.matrix.Matrix matrix : pStudy.getMatrices() ) { + if ( matrix instanceof CharacterMatrix ) { + nmc.fromTreeBaseToXml((CharacterMatrix)matrix,null); + } + } + for ( org.cipres.treebase.domain.tree.TreeBlock treeBlock : pStudy.getTreeBlocks() ) { + ntc.fromTreeBaseToXML(treeBlock); + } + } + return getDocument(); + } + + public Document fromTreeBaseToXml(MatrixSearchResults searchResults) { + + // create a merged set of all taxon labels in all matrices + Set<TaxonLabel> mergedLabels = new HashSet<TaxonLabel>(); + for (Matrix m : searchResults.getResults()) { + List<TaxonLabel> labelsInTree = m.getAllTaxonLabels(); + mergedLabels.addAll(labelsInTree); + } + + // convert merged set of taxon labels to XML OTUs + NexmlOTUWriter noc = new NexmlOTUWriter(null,getTaxonLabelHome(),getDocument()); + OTUs xmlOTUs = noc.fromTreeBaseToXml(mergedLabels); + + // convert matrices to XML trees + NexmlMatrixWriter nmc = new NexmlMatrixWriter(null,getTaxonLabelHome(),getDocument()); + for (Matrix m : searchResults.getResults()) { + nmc.fromTreeBaseToXml((CharacterMatrix)m,xmlOTUs); + } + + return getDocument(); + } + public Document fromTreeBaseToXml(TreeSearchResults searchResults) { + + // create a merged set of all taxon labels in all trees + Set<TaxonLabel> mergedLabels = new HashSet<TaxonLabel>(); + for (PhyloTree t : searchResults.getResults()) { + Set<TaxonLabel> labelsInTree = t.getAllTaxonLabels(); + mergedLabels.addAll(labelsInTree); + } + + // convert merged set of taxon labels to XML OTUs + NexmlOTUWriter noc = new NexmlOTUWriter(null,getTaxonLabelHome(),getDocument()); + OTUs xmlOTUs = noc.fromTreeBaseToXml(mergedLabels); + + // convert phylotrees to XML trees + NexmlTreeBlockWriter ntc = new NexmlTreeBlockWriter(null,getTaxonLabelHome(),getDocument()); + TreeBlock xmlTreeBlock = getDocument().createTreeBlock(xmlOTUs); + for (PhyloTree t : searchResults.getResults()) { + ntc.fromTreeBaseToXml(t, xmlTreeBlock); + } + return getDocument(); + } + + public Document fromTreeBaseToXml(TaxonSearchResults searchResults) { + NexmlOTUWriter noc = new NexmlOTUWriter(null,getTaxonLabelHome(),getDocument()); + OTUs xmlOTUs = getDocument().createOTUs(); + for (Taxon t : searchResults.getResults()) { + noc.fromTreeBaseToXml(t, xmlOTUs); + } + return getDocument(); + } + } Modified: trunk/treebase-core/src/main/java/org/cipres/treebase/domain/nexus/nexml/NexmlMatrixWriter.java =================================================================== --- trunk/treebase-core/src/main/java/org/cipres/treebase/domain/nexus/nexml/NexmlMatrixWriter.java 2011-10-13 18:50:53 UTC (rev 973) +++ trunk/treebase-core/src/main/java/org/cipres/treebase/domain/nexus/nexml/NexmlMatrixWriter.java 2011-10-27 16:58:16 UTC (rev 974) @@ -57,8 +57,10 @@ * @param tbMatrix * @return an xml matrix with empty rows */ - private CategoricalMatrix fromTreeBaseToXml(StandardMatrix tbMatrix) { - OTUs xmlOTUs = getOTUsById(tbMatrix.getTaxa().getId()); + private CategoricalMatrix fromTreeBaseToXml(StandardMatrix tbMatrix,OTUs xmlOTUs) { + if ( null == xmlOTUs ) { + xmlOTUs = getOTUsById(tbMatrix.getTaxa().getId()); + } CategoricalMatrix xmlMatrix = getDocument().createCategoricalMatrix(xmlOTUs); setMatrixAttributes(xmlMatrix,tbMatrix); @@ -108,8 +110,10 @@ * @param tbMatrix * @return an xml matrix with empty rows */ - private MolecularMatrix fromTreeBaseToXml(DiscreteMatrix tbMatrix) { - OTUs xmlOTUs = getOTUsById(tbMatrix.getTaxa().getId()); + private MolecularMatrix fromTreeBaseToXml(DiscreteMatrix tbMatrix,OTUs xmlOTUs) { + if ( null == xmlOTUs ) { + xmlOTUs = getOTUsById(tbMatrix.getTaxa().getId()); + } String tbDataType = tbMatrix.getDataType().getDescription(); MolecularMatrix xmlMatrix = null; CharacterStateSet xmlStateSet = null; @@ -156,8 +160,10 @@ * @param tbMatrix * @return an xml matrix with empty rows */ - private org.nexml.model.ContinuousMatrix fromTreeBaseToXml(ContinuousMatrix tbMatrix) { - OTUs xmlOTUs = getOTUsById(tbMatrix.getTaxa().getId()); + private org.nexml.model.ContinuousMatrix fromTreeBaseToXml(ContinuousMatrix tbMatrix,OTUs xmlOTUs) { + if ( null == xmlOTUs ) { + xmlOTUs = getOTUsById(tbMatrix.getTaxa().getId()); + } org.nexml.model.ContinuousMatrix xmlMatrix = getDocument().createContinuousMatrix(xmlOTUs); setMatrixAttributes(xmlMatrix,tbMatrix); @@ -204,19 +210,19 @@ // public static final String MATRIX_DATATYPE_DISTANCE = "Distance"; // public static final String MATRIX_DATATYPE_MIXED = "Mixed"; @SuppressWarnings("unchecked") - public org.nexml.model.Matrix<?> fromTreeBaseToXml(CharacterMatrix tbMatrix) { + public org.nexml.model.Matrix<?> fromTreeBaseToXml(CharacterMatrix tbMatrix,OTUs xmlOTUs) { org.nexml.model.Matrix<?> xmlMatrix = null; if ( tbMatrix instanceof DiscreteMatrix ) { if ( tbMatrix.getDataType().getDescription().equals(MatrixDataType.MATRIX_DATATYPE_STANDARD) ) { - xmlMatrix = fromTreeBaseToXml((StandardMatrix) tbMatrix); + xmlMatrix = fromTreeBaseToXml((StandardMatrix) tbMatrix,xmlOTUs); } else { - xmlMatrix = fromTreeBaseToXml((DiscreteMatrix) tbMatrix); + xmlMatrix = fromTreeBaseToXml((DiscreteMatrix) tbMatrix,xmlOTUs); } populateXmlMatrix((org.nexml.model.Matrix<CharacterState>)xmlMatrix,(DiscreteMatrix)tbMatrix); } else if ( tbMatrix instanceof ContinuousMatrix ) { - xmlMatrix = fromTreeBaseToXml((ContinuousMatrix) tbMatrix); + xmlMatrix = fromTreeBaseToXml((ContinuousMatrix) tbMatrix,xmlOTUs); populateXmlMatrix((org.nexml.model.ContinuousMatrix)xmlMatrix,(ContinuousMatrix)tbMatrix); } Modified: trunk/treebase-core/src/main/java/org/cipres/treebase/domain/nexus/nexml/NexmlOTUWriter.java =================================================================== --- trunk/treebase-core/src/main/java/org/cipres/treebase/domain/nexus/nexml/NexmlOTUWriter.java 2011-10-13 18:50:53 UTC (rev 973) +++ trunk/treebase-core/src/main/java/org/cipres/treebase/domain/nexus/nexml/NexmlOTUWriter.java 2011-10-27 16:58:16 UTC (rev 974) @@ -1,7 +1,10 @@ package org.cipres.treebase.domain.nexus.nexml; +import java.util.Set; + import org.cipres.treebase.Constants; import org.cipres.treebase.domain.study.Study; +import org.cipres.treebase.domain.taxon.Taxon; import org.cipres.treebase.domain.taxon.TaxonLabel; import org.cipres.treebase.domain.taxon.TaxonLabelHome; import org.cipres.treebase.domain.taxon.TaxonLabelSet; @@ -42,11 +45,30 @@ /** * + * @param taxonLabelSet + * @return + */ + protected OTUs fromTreeBaseToXml(Set<TaxonLabel> taxonLabelSet) { + OTUs xmlOTUs = getDocument().createOTUs(); + + // attach base uri and skos:historyNote + xmlOTUs.setBaseURI(mTaxonBaseURI); + xmlOTUs.addAnnotationValue("skos:historyNote", Constants.SKOSURI, "Mapped from TreeBASE schema using "+this.toString()+" $Rev$"); + + for ( TaxonLabel taxonLabel : taxonLabelSet ) { + fromTreeBaseToXml(taxonLabel,xmlOTUs); + } + return xmlOTUs; + + } + + /** + * * @param taxonLabel * @param xmlOTUs * @return */ - private OTU fromTreeBaseToXml(TaxonLabel taxonLabel,OTUs xmlOTUs) { + protected OTU fromTreeBaseToXml(TaxonLabel taxonLabel,OTUs xmlOTUs) { OTU xmlOTU = xmlOTUs.createOTU(); if ( null != taxonLabel.getTaxonLabel() ) { xmlOTU.setLabel(taxonLabel.getTaxonLabel()); @@ -54,5 +76,20 @@ attachTreeBaseID(xmlOTU,taxonLabel,TaxonLabel.class); return xmlOTU; } + + /** + * + * @param taxon + * @param xmlOTUs + * @return + */ + protected OTU fromTreeBaseToXml(Taxon taxon,OTUs xmlOTUs) { + OTU xmlOTU = xmlOTUs.createOTU(); + if ( null != taxon.getLabel() ) { + xmlOTU.setLabel(taxon.getLabel()); + } + attachTreeBaseID(xmlOTU,taxon,Taxon.class); + return xmlOTU; + } } Modified: trunk/treebase-core/src/main/java/org/cipres/treebase/domain/nexus/nexml/NexmlObjectConverter.java =================================================================== --- trunk/treebase-core/src/main/java/org/cipres/treebase/domain/nexus/nexml/NexmlObjectConverter.java 2011-10-13 18:50:53 UTC (rev 973) +++ trunk/treebase-core/src/main/java/org/cipres/treebase/domain/nexus/nexml/NexmlObjectConverter.java 2011-10-27 16:58:16 UTC (rev 974) @@ -36,7 +36,9 @@ if ( null != baseURI ) { document.setBaseURI(URI.create(baseURI)); } - document.setId(study.getTreebaseIDString().toString()); + if ( null != study ) { + document.setId(study.getTreebaseIDString().toString()); + } setTaxonLabelHome(taxonLabelHome); setStudy(study); setDocument(document); Modified: trunk/treebase-core/src/main/java/org/cipres/treebase/domain/nexus/nexml/NexmlTreeBlockWriter.java =================================================================== --- trunk/treebase-core/src/main/java/org/cipres/treebase/domain/nexus/nexml/NexmlTreeBlockWriter.java 2011-10-13 18:50:53 UTC (rev 973) +++ trunk/treebase-core/src/main/java/org/cipres/treebase/domain/nexus/nexml/NexmlTreeBlockWriter.java 2011-10-27 16:58:16 UTC (rev 974) @@ -33,7 +33,7 @@ * @param phyloTree * @return */ - private Tree<?> fromTreeBaseToXml(PhyloTree phyloTree,org.nexml.model.TreeBlock xmlTreeBlock) { + protected Tree<?> fromTreeBaseToXml(PhyloTree phyloTree,org.nexml.model.TreeBlock xmlTreeBlock) { Tree<FloatEdge> xmlTree = xmlTreeBlock.createFloatTree(); if ( null != phyloTree.getLabel() ) { xmlTree.setLabel(phyloTree.getLabel()); Added: trunk/treebase-core/src/test/java/org/cipres/treebase/domain/nexus/NexmlSearchResultConverterTest.java =================================================================== --- trunk/treebase-core/src/test/java/org/cipres/treebase/domain/nexus/NexmlSearchResultConverterTest.java (rev 0) +++ trunk/treebase-core/src/test/java/org/cipres/treebase/domain/nexus/NexmlSearchResultConverterTest.java 2011-10-27 16:58:16 UTC (rev 974) @@ -0,0 +1,133 @@ +package org.cipres.treebase.domain.nexus; + +import java.util.Collection; +import java.util.HashSet; + +import org.cipres.treebase.dao.AbstractDAOTest; +import org.cipres.treebase.domain.matrix.Matrix; +import org.cipres.treebase.domain.search.MatrixSearchResults; +import org.cipres.treebase.domain.search.StudySearchResults; +import org.cipres.treebase.domain.search.TaxonSearchResults; +import org.cipres.treebase.domain.search.TreeSearchResults; +import org.cipres.treebase.domain.study.Study; +import org.cipres.treebase.domain.study.StudyHome; +import org.cipres.treebase.domain.taxon.TaxonLabel; +import org.cipres.treebase.domain.taxon.TaxonLabelHome; +import org.cipres.treebase.domain.tree.PhyloTree; +import org.cipres.treebase.domain.nexus.nexml.NexmlDocumentWriter; +import org.nexml.model.Document; +import org.nexml.model.DocumentFactory; + +public class NexmlSearchResultConverterTest extends AbstractDAOTest { + + private TaxonLabelHome mTaxonLabelHome; + private StudyHome mStudyHome; + + private StudySearchResults ssr = null; + + private Collection<Study> studies = null; + private Collection<Matrix> matrices = null; + private Collection<PhyloTree> trees = null; + private Collection<TaxonLabel> taxa = null; + + @Override + protected void onSetUp() throws Exception { + super.onSetUp(); + + studies = getTestData(); + ssr = new StudySearchResults(studies); + + // populate set of matrices from test data + matrices = new HashSet<Matrix> (); + for (Study s : studies) { + matrices.addAll(s.getMatrices()); + } + + // populate set of trees from test data + trees = new HashSet<PhyloTree> (); + for (Study s : studies) { + trees.addAll(s.getTrees()); + } + + // populate set of taxa from test data + taxa = new HashSet<TaxonLabel>(); + for ( Study s : studies) { + taxa.addAll(s.getTaxonLabels()); + } + } + + public NexmlSearchResultConverterTest() { + super(); + } + + public void testTrivial() { + assertNotNull(getTaxonLabelHome()); + assertNotNull(getStudyHome()); + } + + public void testQuickCheck() { + assertFalse(studies.size() == 0); + assertFalse(matrices.size() == 0); + assertFalse(trees.size() == 0); + assertFalse(taxa.size() == 0); + } + + private Collection<Study> getTestData(String accessionNumber) { + Collection<Study> studies = new HashSet<Study>(); + studies.add(getStudyHome().findByAccessionNumber(accessionNumber)); + assertFalse(studies.size() == 0); + return studies; + } + + private Collection<Study> getTestData() { + return getTestData("S1787"); + } + + public void testStudySearchSerialization() { + Document doc = DocumentFactory.safeCreateDocument(); + NexmlDocumentWriter ndw = new NexmlDocumentWriter(null, mTaxonLabelHome, doc); + ndw.fromTreeBaseToXml(ssr); + assertNotNull(doc.getXmlString()); + } + + public void testTaxonSearchSerialization() { + Document doc = DocumentFactory.safeCreateDocument(); + NexmlDocumentWriter ndw = new NexmlDocumentWriter(null, mTaxonLabelHome, doc); + TaxonSearchResults tasr = ssr.convertToTaxa(); + ndw.fromTreeBaseToXml(tasr); + assertNotNull(doc.getXmlString()); + } + + public void testMatrixSearchSerialization() { + Document doc = DocumentFactory.safeCreateDocument(); + NexmlDocumentWriter ndw = new NexmlDocumentWriter(null, mTaxonLabelHome, doc); + MatrixSearchResults msr = ssr.convertToMatrices(); + ndw.fromTreeBaseToXml(msr); + assertNotNull(doc.getXmlString()); + } + + public void testTreeSearchSerialization() { + Document doc = DocumentFactory.safeCreateDocument(); + NexmlDocumentWriter ndw = new NexmlDocumentWriter(null, mTaxonLabelHome, doc); + TreeSearchResults tsr = ssr.convertToTrees(); + ndw.fromTreeBaseToXml(tsr); + assertNotNull(doc.getXmlString()); + } + + public TaxonLabelHome getTaxonLabelHome() { + return mTaxonLabelHome; + } + + public void setTaxonLabelHome(TaxonLabelHome pNewTaxonLabelHome) { + mTaxonLabelHome = pNewTaxonLabelHome; + } + + public StudyHome getStudyHome() { + return mStudyHome; + } + + public void setStudyHome(StudyHome studyHome) { + mStudyHome = studyHome; + } + +} \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |