diff --git a/uk/ac/sanger/artemis/components/genebuilder/GeneUtils.java b/uk/ac/sanger/artemis/components/genebuilder/GeneUtils.java index 4f57be461d5bb8ec27902ddb82d72f10eb45bc8c..703f4feeb88d0cbea81d28b49e5d445ecb61ca9c 100644 --- a/uk/ac/sanger/artemis/components/genebuilder/GeneUtils.java +++ b/uk/ac/sanger/artemis/components/genebuilder/GeneUtils.java @@ -23,6 +23,7 @@ package uk.ac.sanger.artemis.components.genebuilder; import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.util.Collection; import java.util.Enumeration; import java.util.Hashtable; import java.util.Iterator; @@ -40,6 +41,11 @@ import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; +import org.gmod.schema.sequence.FeatureCvTerm; +import org.gmod.schema.sequence.FeatureDbXRef; +import org.gmod.schema.sequence.FeaturePub; +import org.gmod.schema.sequence.FeatureSynonym; + import uk.ac.sanger.artemis.components.EditMenu; import uk.ac.sanger.artemis.components.MessageDialog; import uk.ac.sanger.artemis.components.SelectionMenu; @@ -57,6 +63,7 @@ import uk.ac.sanger.artemis.io.QualifierVector; import uk.ac.sanger.artemis.io.Range; import uk.ac.sanger.artemis.io.RangeVector; import uk.ac.sanger.artemis.sequence.MarkerRange; +import uk.ac.sanger.artemis.util.ByteBuffer; import uk.ac.sanger.artemis.util.DatabaseDocument; import uk.ac.sanger.artemis.util.OutOfRangeException; import uk.ac.sanger.artemis.util.ReadOnlyException; @@ -82,6 +89,109 @@ public class GeneUtils hideFeatures.add("pseudogenic_transcript"); } + /** + * Used when a whole sequence is loaded in and the features are loaded + * lazily + * @param feature + */ + public static void addLazyQualifiers(final GFFStreamFeature feature) + { + if(feature.isLazyLoaded() || feature.getChadoLazyFeature() == null) + return; + + // synonyms + final Collection featureSynonyms = feature.getChadoLazyFeature().getFeatureSynonyms(); + + final Iterator it = featureSynonyms.iterator(); + while(it.hasNext()) + { + final FeatureSynonym featureSynonym = (FeatureSynonym) it.next(); + final String name = featureSynonym.getSynonym().getCvTerm().getName(); + String value = featureSynonym.getSynonym().getName(); + + if(!featureSynonym.isCurrent()) + value.concat(GFFStreamFeature.encode(";current=false")); + + Qualifier qualifier = feature.getQualifiers().getQualifierByName(name); + if(qualifier == null) + qualifier = new Qualifier(name, value); + else + qualifier.addValue(value); + + feature.getQualifiers().setQualifier(qualifier); + } + + // dbxrefs + final Collection featureDbXRefs = feature.getChadoLazyFeature().getFeatureDbXRefs(); + final Iterator it2 = featureDbXRefs.iterator(); + while(it2.hasNext()) + { + final FeatureDbXRef featureDbXRef = (FeatureDbXRef) it2.next(); + String value = featureDbXRef.getDbXRef().getDb().getName() + ":" + + featureDbXRef.getDbXRef().getAccession(); + + Qualifier qualifier = feature.getQualifiers().getQualifierByName("Dbxref"); + if(qualifier == null) + qualifier = new Qualifier("Dbxref", value); + else + qualifier.addValue(value); + feature.getQualifiers().setQualifier(qualifier); + } + + + // feature cvterms (GO, product....) + final Collection featureCvTerms = feature.getChadoLazyFeature().getFeatureCvTerms(); + final Iterator it3 = featureCvTerms.iterator(); + + while(it3.hasNext()) + { + FeatureCvTerm featureCvTerm = (FeatureCvTerm)it3.next(); + List featureCvTermDbXRefList = null; + + if(featureCvTerm.getFeatureCvTermDbXRefs() != null) + featureCvTermDbXRefList = new Vector(featureCvTerm.getFeatureCvTermDbXRefs()); + + List featureCvTermPubList = null; + + if(featureCvTerm.getFeatureCvTermPubs() != null) + featureCvTermPubList = new Vector(featureCvTerm.getFeatureCvTermPubs()); + + ByteBuffer this_buff = new ByteBuffer(); + DatabaseDocument.appendControlledVocabulary(this_buff, null, featureCvTerm, + featureCvTermDbXRefList,featureCvTermPubList, null, false); + + final String qualifierString = new String(this_buff.getBytes()); + int ind = qualifierString.indexOf('='); + final String name = qualifierString.substring(0, ind); + final String value = GFFStreamFeature.decode( + qualifierString.substring(ind+1, qualifierString.length()-1)); + + Qualifier qualifier = feature.getQualifiers().getQualifierByName(name); + if(qualifier == null) + qualifier = new Qualifier(name, value); + else + qualifier.addValue(value); + feature.getQualifiers().setQualifier(qualifier); + } + + // feature pubs - literature + final Collection featurePubs = feature.getChadoLazyFeature().getFeaturePubs(); + final Iterator it4 = featurePubs.iterator(); + while(it4.hasNext()) + { + FeaturePub featurePub = (FeaturePub)it4.next(); + + Qualifier qualifier = feature.getQualifiers().getQualifierByName("literature"); + if(qualifier == null) + qualifier = new Qualifier("literature", featurePub.getPub().getUniqueName()); + else + qualifier.addValue(featurePub.getPub().getUniqueName()); + feature.getQualifiers().setQualifier(qualifier); + } + + feature.setLazyLoaded(true); + } + /** * Used to reverse complement all the gene model features * @param chadoGene