diff --git a/uk/ac/sanger/artemis/io/ChadoCanonicalGene.java b/uk/ac/sanger/artemis/io/ChadoCanonicalGene.java
index 49a629842d25fda1813bf730b908688d59817410..aaeed5af6f3df3cdbcf774700ec320f31e008107 100644
--- a/uk/ac/sanger/artemis/io/ChadoCanonicalGene.java
+++ b/uk/ac/sanger/artemis/io/ChadoCanonicalGene.java
@@ -20,25 +20,28 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  *
- * $Header: //tmp/pathsoft/artemis/uk/ac/sanger/artemis/io/ChadoCanonicalGene.java,v 1.2 2006-05-31 15:41:17 tjc Exp $
+ * $Header: //tmp/pathsoft/artemis/uk/ac/sanger/artemis/io/ChadoCanonicalGene.java,v 1.3 2006-07-04 11:06:33 tjc Exp $
  */
 
 package uk.ac.sanger.artemis.io;
 
+import uk.ac.sanger.artemis.chado.ChadoFeature;
 import uk.ac.sanger.artemis.util.StringVector;
 import java.util.Vector;
 import java.util.Hashtable;
 import java.util.Enumeration;
+import java.util.List;
 
 /**
  *  Used by GFFStreamFaeture to represent the chado canonical gene.
  **/
 public class ChadoCanonicalGene  
 {
-  private Feature gene;
+  private Object gene;
+  private String gene_id;
   
   // part_of gene
-  private Vector transcripts = new Vector();
+  private List transcripts = new Vector();
   
   // part_of transcrips
   private Hashtable exons = new Hashtable();
@@ -46,35 +49,44 @@ public class ChadoCanonicalGene
   // derives_from transript
   private Hashtable proteins = new Hashtable();
 
-  public Feature getGene()
+  // srcfeature length
+  private int seqlen;
+  
+  public void addObject(Object obj, String parent_id, String type)
+               throws InvalidRelationException
+  {
+    if(type.equalsIgnoreCase("polypeptide"))
+      addProtein(parent_id, obj);
+    else if(type.equalsIgnoreCase("exon"))
+      addExon(parent_id, obj);
+  }
+  
+  public Object getGene()
   {
     return gene;
   }
 
-  public void setGene(Feature gene)
+  public void setGene(Object gene)
   {
     this.gene = gene;
   }
   
-  public void addTranscript(Feature transcript)
+  public void addTranscript(Object transcript)
   {
     transcripts.add(transcript);
   }
   
-  public void addExon(Feature transcript, Feature exon, boolean reset) 
+  public void addExon(String transcript_id, Object exon, boolean reset) 
          throws InvalidRelationException
   {
     exons = new Hashtable();
-    addExon(transcript, exon);
+    addExon(transcript_id, exon);
   }
   
-  public void addExon(Feature transcript, Feature exon) 
+  public void addExon(String transcript_id, Object exon) 
          throws InvalidRelationException
-  {
-    final String transcript_id = 
-         (String)transcript.getQualifierByName("ID").getValues().get(0);
-    
-    final Vector v_exons;
+  {   
+    final List v_exons;
     if(exons.containsKey(transcript_id))
       v_exons = (Vector)exons.get(transcript_id);
     else
@@ -84,16 +96,13 @@ public class ChadoCanonicalGene
     exons.put(transcript_id, v_exons);
   }
   
-  public void addProtein(Feature transcript, Feature protein) 
+  public void addProtein(String transcript_id, Object protein) 
          throws InvalidRelationException
-  {
-    final String transcript_id = 
-      (String)transcript.getQualifierByName("ID").getValues().get(0);
-    
+  {   
     proteins.put(transcript_id, protein);
   }
   
-  public Feature containsTranscript(final StringVector ids)
+  public Object containsTranscript(final StringVector ids)
   {
     for(int i=0; i<transcripts.size(); i++)
     {
@@ -112,18 +121,18 @@ public class ChadoCanonicalGene
     return null;
   }
 
-  public Vector getExonsOfTranscript(final String transcript_id)
+  public List getExonsOfTranscript(final String transcript_id)
   {
     if(exons.containsKey(transcript_id))
-      return (Vector)exons.get(transcript_id);;
+      return (List)exons.get(transcript_id);;
  
     return null;
   }
   
-  public Feature getProteinOfTranscript(final String transcript_id)
+  public Object getProteinOfTranscript(final String transcript_id)
   {
     if(proteins.containsKey(transcript_id))
-      return (Feature)proteins.get(transcript_id);;
+      return proteins.get(transcript_id);;
  
     return null;
   }
@@ -133,19 +142,19 @@ public class ChadoCanonicalGene
     return exons;
   }
 
-  public Vector getTranscripts()
+  public List getTranscripts()
   {
     return transcripts;
   }
   
-  public Feature getFeatureFromId(final String id)
+  public Object getFeatureFromId(final String id)
   {
-    Feature feature = null;
+    Object feature = null;
     
     // check gene
     try
     {
-      if(((String)(gene.getQualifierByName("ID").getValues().get(0))).equals(id))
+      if(((String)(((Feature)gene).getQualifierByName("ID").getValues().get(0))).equals(id))
         return gene;
     }
     catch(InvalidRelationException e)
@@ -171,7 +180,7 @@ public class ChadoCanonicalGene
     return getProtein(id);
   }
   
-  private Feature getExon(final String id)
+  private Object getExon(final String id)
   {
     Enumeration enum_exons = exons.elements();
     try
@@ -182,9 +191,15 @@ public class ChadoCanonicalGene
         
         for(int i=0; i<exons.size(); i++)
         {
-          Feature exon = (Feature)exons.get(i);
-          if(((String)(exon.getQualifierByName("ID").getValues().get(0))).equals(id))
-            return exon;
+          String uniquename;
+          
+          if(exons.get(i) instanceof ChadoFeature)
+            uniquename = ((ChadoFeature)exons.get(i)).getUniquename();
+          else
+            uniquename = (String)((Feature)exons.get(i)).getQualifierByName("ID").getValues().get(0);
+          
+          if(uniquename.equals(id))
+            return exons.get(i);
         }
       }
     }
@@ -214,4 +229,14 @@ public class ChadoCanonicalGene
     return null;
     
   }
+
+  public int getSeqlen()
+  {
+    return seqlen;
+  }
+
+  public void setSeqlen(int seqlen)
+  {
+    this.seqlen = seqlen;
+  }
 }
\ No newline at end of file