From 47218e272a88aaffd9804b7d283472097aaa4167 Mon Sep 17 00:00:00 2001
From: tjc <tjc@ee4ac58c-ac51-4696-9907-e4b3aa274f04>
Date: Tue, 4 Jul 2006 11:03:06 +0000
Subject: [PATCH] tidy and split out chadoToGFF

git-svn-id: svn+ssh://svn.internal.sanger.ac.uk/repos/svn/pathsoft/artemis/trunk@4496 ee4ac58c-ac51-4696-9907-e4b3aa274f04
---
 .../sanger/artemis/util/DatabaseDocument.java | 325 ++++++++++--------
 1 file changed, 173 insertions(+), 152 deletions(-)

diff --git a/uk/ac/sanger/artemis/util/DatabaseDocument.java b/uk/ac/sanger/artemis/util/DatabaseDocument.java
index ac25cd751..82cefdfd3 100644
--- a/uk/ac/sanger/artemis/util/DatabaseDocument.java
+++ b/uk/ac/sanger/artemis/util/DatabaseDocument.java
@@ -24,7 +24,6 @@
 
 package uk.ac.sanger.artemis.util;
 
-import com.ibatis.sqlmap.client.SqlMapClient;
 import uk.ac.sanger.artemis.io.GFFStreamFeature;
 import uk.ac.sanger.artemis.chado.*;
 import uk.ac.sanger.artemis.components.DatabaseEntrySource;
@@ -361,7 +360,7 @@ public class DatabaseDocument extends Document
     for(int i = 0; i < buffers.length; i++)
       buffers[i] = new ByteBuffer();
 
-    String parentFeature = dao.getFeatureName(srcfeature_id, schema);
+    final String parentFeature = dao.getFeatureName(srcfeature_id, schema);
     ByteBuffer this_buff;
 
     int feature_size = featList.size();
@@ -376,47 +375,18 @@ public class DatabaseDocument extends Document
 
       id_store.put(feature_id, name);
     }
-
-    String gff_source;
     
-    // get all dbrefs
+    // get all dbrefs & synonyms
     Hashtable dbxrefs = dao.getDbxref(schema, null);
-    
-    // get all synonyms
     Hashtable synonym = dao.getAlias(schema, null);
 
+    // create gff byte stream
     for(int i = 0; i < feature_size; i++)
     { 
-      gff_source = null;
-      
+      // select buffer based on feature type
       ChadoFeature feat = (ChadoFeature)featList.get(i);
-      int fmin          = feat.getFeatureloc().getFmin() + 1;
-      int fmax          = feat.getFeatureloc().getFmax();
       long type_id      = feat.getCvterm().getCvtermId();
-      int strand        = feat.getFeatureloc().getStrand();
-      int phase         = feat.getFeatureloc().getPhase();
-      String name       = feat.getUniquename();
-      String typeName   = getCvtermName(type_id);
-
-      String timelastmodified = Long.toString(feat.getTimelastmodified().getTime());
-      String feature_id       = Integer.toString(feat.getId());
-
-      String parent_id = null;
-      String parent_relationship = null;
-      if(feat.getFeature_relationship() != null)
-      {
-        ChadoFeatureRelationship feat_relationship = feat.getFeature_relationship();
-        parent_id = Integer.toString(feat_relationship.getObject_id());
-        long parent_type_id = feat_relationship.getCvterm().getCvtermId();
-        parent_relationship = getCvtermName(parent_type_id);
-      }
-            
-      if(parent_id != null && id_store.containsKey(parent_id))
-        parent_id = (String)id_store.get(parent_id);
-      
-      // make gff format
-
-      // select buffer
+      String typeName   = getCvtermName(type_id, dao);
       this_buff = buffers[types.length];
       for(int j = 0; j < types.length; j++)
       {
@@ -424,119 +394,189 @@ public class DatabaseDocument extends Document
           this_buff = buffers[j];
       }
       
-      Vector dbxref = null;
-      // append dbxrefs
-      if(dbxrefs != null &&
-         dbxrefs.containsKey(new Integer(feature_id)))
+      chadoToGFF(feat, parentFeature,
+                 dbxrefs, synonym,
+                 id_store, dao, this_buff);
+
+      progress_listener.progressMade("Read from database: " + 
+                                     feat.getUniquename());
+    }
+
+    return buffers;
+  }
+
+  /**
+   * Convert the chado feature into a GFF line
+   * @param feat           Chado feature
+   * @param parentFeature  parent of this feature
+   * @param dbxrefs        hashtable containing dbxrefs
+   * @param synonym        hashtable containing synonynms
+   * @param id_store       id store for looking up parent names
+   * @param dao            chado data access
+   * @param this_buff      byte buffer of GFF line 
+   */
+  public static void chadoToGFF(final ChadoFeature feat,
+                                final String parentFeature,
+                                final Hashtable dbxrefs,
+                                final Hashtable synonym,
+                                final Hashtable id_store,
+                                final ChadoDAO dao,
+                                final ByteBuffer this_buff)
+  {
+    String gff_source = null;
+    
+    int fmin          = feat.getFeatureloc().getFmin() + 1;
+    int fmax          = feat.getFeatureloc().getFmax();
+    long type_id      = feat.getCvterm().getCvtermId();
+    int strand        = feat.getFeatureloc().getStrand();
+    int phase         = feat.getFeatureloc().getPhase();
+    String name       = feat.getUniquename();
+    String typeName   = getCvtermName(type_id, dao);
+
+    String timelastmodified = Long.toString(feat.getTimelastmodified().getTime());
+    String feature_id       = Integer.toString(feat.getId());
+
+    String parent_id = null;
+    String parent_relationship = null;
+    if(feat.getFeature_relationship() != null)
+    {
+      ChadoFeatureRelationship feat_relationship = feat.getFeature_relationship();
+      parent_id = Integer.toString(feat_relationship.getObject_id());
+      long parent_type_id = feat_relationship.getCvterm().getCvtermId();
+      
+      parent_relationship = feat_relationship.getCvterm().getName();
+      
+      if(parent_relationship == null)
+        parent_relationship = getCvtermName(parent_type_id, dao);
+    }
+    else if(feat.getFeatureRelationshipsForSubjectId() != null)
+    {
+      List relations = feat.getFeatureRelationshipsForSubjectId();
+      for(int i=0; i<relations.size(); i++)
+      {
+        ChadoFeatureRelationship feat_relationship = 
+                            (ChadoFeatureRelationship)relations.get(i);
+        parent_id = Integer.toString(feat_relationship.getObject_id());
+        System.out.println("HERE   "+i+" "+feat_relationship.getCvterm().getName()+ " "+
+            feat_relationship.getObject_id()+" "+feat_relationship.getSubject_id()+ " parent_id="+ parent_id);
+        parent_relationship = feat_relationship.getCvterm().getName();
+      }
+    }
+          
+    if(parent_id != null && id_store != null &&  id_store.containsKey(parent_id))
+      parent_id = (String)id_store.get(parent_id);
+ 
+    // make gff format
+    
+    Vector dbxref = null;
+    // append dbxrefs
+    if(dbxrefs != null &&
+       dbxrefs.containsKey(new Integer(feature_id)))
+    {
+      dbxref = (Vector)dbxrefs.get(new Integer(feature_id));
+      for(int j=0; j<dbxref.size(); j++)
       {
-        dbxref = (Vector)dbxrefs.get(new Integer(feature_id));
-        for(int j=0; j<dbxref.size(); j++)
+        if(((String)dbxref.get(j)).startsWith("GFF_source:"))
         {
-          if(((String)dbxref.get(j)).startsWith("GFF_source:"))
-          {
-            gff_source = ((String)dbxref.get(j)).substring(11);
-            dbxref.removeElementAt(j);
-          }
+          gff_source = ((String)dbxref.get(j)).substring(11);
+          dbxref.removeElementAt(j);
         }
       }
+    }
 
-      this_buff.append(parentFeature + "\t"); // seqid
-      
-      if(gff_source != null)
-        this_buff.append(gff_source+"\t");    // source
-      else
-        this_buff.append("chado\t");            
-      this_buff.append(typeName + "\t");      // type
-      this_buff.append(fmin + "\t");          // start
-      this_buff.append(fmax + "\t");          // end
-      this_buff.append(".\t");                // score
-      if(strand == -1)                        // strand
-        this_buff.append("-\t");
-      else if(strand == 1)
-        this_buff.append("+\t");
-      else
-        this_buff.append(".\t");
+    this_buff.append(parentFeature + "\t"); // seqid
+    
+    if(gff_source != null)
+      this_buff.append(gff_source+"\t");    // source
+    else
+      this_buff.append("chado\t");            
+    this_buff.append(typeName + "\t");      // type
+    this_buff.append(fmin + "\t");          // start
+    this_buff.append(fmax + "\t");          // end
+    this_buff.append(".\t");                // score
+    if(strand == -1)                        // strand
+      this_buff.append("-\t");
+    else if(strand == 1)
+      this_buff.append("+\t");
+    else
+      this_buff.append(".\t");
 
-      if(phase > 3)
-        this_buff.append(".\t");               // phase
-      else
-        this_buff.append(phase+"\t"); 
+    if(phase > 3)
+      this_buff.append(".\t");               // phase
+    else
+      this_buff.append(phase+"\t"); 
 
-      this_buff.append("ID=" + name + ";");
+    this_buff.append("ID=" + name + ";");
 
-     
-      if(parent_id != null && !parent_id.equals("0"))
-      {
-        if(parent_relationship.equals("derives_from"))
-          this_buff.append("Derives_from=" + parent_id + ";");
-        else
-          this_buff.append("Parent=" + parent_id + ";");
-      }
+   
+    if(parent_id != null && !parent_id.equals("0"))
+    {
+      if(parent_relationship.equals("derives_from"))
+        this_buff.append("Derives_from=" + parent_id + ";");
+      else
+        this_buff.append("Parent=" + parent_id + ";");
+    }
 
-      this_buff.append("timelastmodified=" + timelastmodified + ";");
+    this_buff.append("timelastmodified=" + timelastmodified + ";");
 
 
-      // attributes
-      Hashtable qualifiers = feat.getQualifiers();
-      if(qualifiers != null && qualifiers.size() > 0)
+    // attributes
+    Hashtable qualifiers = feat.getQualifiers();
+    
+    if(qualifiers != null && qualifiers.size() > 0)
+    {
+      Enumeration e_qualifiers = qualifiers.keys();
+      while(e_qualifiers.hasMoreElements())
       {
-        Enumeration e_qualifiers = qualifiers.keys();
-        while(e_qualifiers.hasMoreElements())
-        {
-          Long qualifier_type_id = (Long)e_qualifiers.nextElement();
-          String qualifier_name = getCvtermName(qualifier_type_id.longValue());
-          if(qualifier_name == null)
-            continue;
-          
-          Vector qualifier_value = (Vector)qualifiers.get(qualifier_type_id);
+        Long qualifier_type_id = (Long)e_qualifiers.nextElement();
+        String qualifier_name = getCvtermName(qualifier_type_id.longValue(), dao);
+        if(qualifier_name == null)
+          continue;
         
-          for(int j=0; j<qualifier_value.size(); j++)
-          {
-            ChadoFeatureProp featprop = (ChadoFeatureProp)qualifier_value.get(j);
-            this_buff.append(qualifier_name+ "=" +
-                             GFFStreamFeature.encode(featprop.getValue())+";");
-          }
+        Vector qualifier_value = (Vector)qualifiers.get(qualifier_type_id);
+        for(int j=0; j<qualifier_value.size(); j++)
+        {
+          ChadoFeatureProp featprop = (ChadoFeatureProp)qualifier_value.get(j);
+          this_buff.append(qualifier_name+ "=" +
+                           GFFStreamFeature.encode(featprop.getValue())+";");
         }
-      } 
+      }
+    } 
 
-      // append dbxrefs
-      if(dbxref != null && dbxref.size() > 0)
+    // append dbxrefs
+    if(dbxref != null && dbxref.size() > 0)
+    {
+      this_buff.append("Dbxref=");
+      for(int j=0; j<dbxref.size(); j++)
       {
-        this_buff.append("Dbxref=");
-        for(int j=0; j<dbxref.size(); j++)
-        {
-          this_buff.append((String)dbxref.get(j));
-          if(j<dbxref.size()-1)
-            this_buff.append(",");
-        }
-        this_buff.append(";");
+        this_buff.append((String)dbxref.get(j));
+        if(j<dbxref.size()-1)
+          this_buff.append(",");
       }
-      
-      // append synonyms
-      if(synonym != null &&
-         synonym.containsKey(new Integer(feature_id)))
-      {   
-        ChadoFeatureSynonym alias;
-        Vector v_synonyms = (Vector)synonym.get(new Integer(feature_id));
-        for(int j=0; j<v_synonyms.size(); j++)
-        {
-          alias = (ChadoFeatureSynonym)v_synonyms.get(j);
-          this_buff.append(alias.getSynonym().getCvterm().getName()+"=");
-          this_buff.append(alias.getSynonym().getName());
-          
-          if(j<v_synonyms.size()-1)
-            this_buff.append(";");
-        }
+      this_buff.append(";");
+    }
+    
+    // append synonyms
+    if(synonym != null &&
+       synonym.containsKey(new Integer(feature_id)))
+    {   
+      ChadoFeatureSynonym alias;
+      Vector v_synonyms = (Vector)synonym.get(new Integer(feature_id));
+      for(int j=0; j<v_synonyms.size(); j++)
+      {
+        alias = (ChadoFeatureSynonym)v_synonyms.get(j);
+        this_buff.append(alias.getSynonym().getCvterm().getName()+"=");
+        this_buff.append(alias.getSynonym().getName());
+        
+        if(j<v_synonyms.size()-1)
+          this_buff.append(";");
       }
-      
-      this_buff.append("\n");
-
-      progress_listener.progressMade("Read from database: " + name);
     }
-
-    return buffers;
+    
+    this_buff.append("\n");
   }
-
+  
+  
   /**
    * Look up the cvterm_id for a controlled vocabulary name.
    * @param name  
@@ -559,29 +599,10 @@ public class DatabaseDocument extends Document
    * @param id  a cvterm_id  
    * @return    the cvterm name
    */
-  private String getCvtermName(long id)
+  private static String getCvtermName(long id, ChadoDAO dao)
   {
     if(cvterm == null)
-    {
-      try
-      {
-        getCvterm(getDAO());
-      }
-      catch(ConnectException ce)
-      {
-        ce.printStackTrace();
-      }
-      catch(SQLException sqle)
-      {
-        JOptionPane.showMessageDialog(null,
-            "Problems Looking Up cvterm Name (cvterm_id="+
-            Long.toString(id)+") ...\n" +
-            sqle.getMessage(),
-            "Cvterm Name Look Up",
-            JOptionPane.ERROR_MESSAGE);
-        sqle.printStackTrace();
-      }
-    }
+      getCvterm(dao);
 
     return (String)cvterm.get(new Long(id));
   }
@@ -591,7 +612,7 @@ public class DatabaseDocument extends Document
    * @param dao the data access object
    * @return    the cvterm <code>Hashtable</code>
    */
-  private Hashtable getCvterm(ChadoDAO dao)
+  private static Hashtable getCvterm(ChadoDAO dao)
   {
     cvterm = new Hashtable();
 
@@ -608,7 +629,7 @@ public class DatabaseDocument extends Document
     }
     catch(SQLException sqle)
     {
-      System.err.println(this.getClass() + ": SQLException retrieving CvTerms");
+      System.err.println("SQLException retrieving CvTerms");
       System.err.println(sqle);
     }
 
@@ -699,7 +720,7 @@ public class DatabaseDocument extends Document
         while(it_residue_features.hasNext())
         {
           ChadoFeature feature = (ChadoFeature)it_residue_features.next();
-          String typeName = getCvtermName(feature.getCvterm().getCvtermId()); 
+          String typeName = getCvtermName(feature.getCvterm().getCvtermId(), getDAO()); 
           
           db.put(schema + " - " + typeName + " - " + feature.getUniquename(),
                  Integer.toString(feature.getId()));
-- 
GitLab