inprogress
[jalview.git] / forester / java / src / org / forester / phylogeny / data / Sequence.java
index 25f7e70..525bc1b 100644 (file)
@@ -39,36 +39,27 @@ import org.forester.io.parsers.phyloxml.PhyloXmlUtil;
 import org.forester.io.writers.PhylogenyWriter;
 import org.forester.util.ForesterUtil;
 
-public class Sequence implements PhylogenyData, MultipleUris {
+public class Sequence implements PhylogenyData, MultipleUris, Comparable<Sequence> {
 
+    private Accession              _accession;
+    private SortedSet<Annotation>  _annotations;
+    private DomainArchitecture     _da;
+    private String                 _gene_name;
+    private String                 _location;
     private String                 _mol_sequence;
     private boolean                _mol_sequence_is_aligned;
     private String                 _name;
-    private String                 _gene_name;
+    private List<SequenceRelation> _seq_relations;
     private String                 _source_id;
-    private Accession              _accession;
     private String                 _symbol;
-    private String                 _location;
     private String                 _type;
-    private SortedSet<Annotation>  _annotations;
-    private DomainArchitecture     _da;
     private List<Uri>              _uris;
-    private List<SequenceRelation> _seq_relations;
     private SortedSet<Accession>   _xrefs;
 
     public Sequence() {
         init();
     }
 
-    public boolean isEmpty() {
-        return ( getAccession() == null ) && ForesterUtil.isEmpty( getName() ) && ForesterUtil.isEmpty( getSymbol() )
-                && ForesterUtil.isEmpty( getType() ) && ForesterUtil.isEmpty( getLocation() )
-                && ForesterUtil.isEmpty( getSourceId() ) && ForesterUtil.isEmpty( getMolecularSequence() )
-                && ( getDomainArchitecture() == null ) && ForesterUtil.isEmpty( _annotations )
-                && ForesterUtil.isEmpty( _uris ) && ForesterUtil.isEmpty( _seq_relations )
-                && ( ( getCrossReferences() == null ) || getCrossReferences().isEmpty() );
-    }
-
     public void addAnnotation( final Annotation annotation ) {
         getAnnotations().add( annotation );
     }
@@ -80,12 +71,8 @@ public class Sequence implements PhylogenyData, MultipleUris {
         getCrossReferences().add( cross_reference );
     }
 
-    public SortedSet<Accession> getCrossReferences() {
-        return _xrefs;
-    }
-
-    private void setCrossReferences( final TreeSet<Accession> cross_references ) {
-        _xrefs = cross_references;
+    public void addSequenceRelation( final SequenceRelation sr ) {
+        getSequenceRelations().add( sr );
     }
 
     @Override
@@ -96,10 +83,6 @@ public class Sequence implements PhylogenyData, MultipleUris {
         getUris().add( uri );
     }
 
-    public void addSequenceRelation( final SequenceRelation sr ) {
-        _seq_relations.add( sr );
-    }
-
     @Override
     public StringBuffer asSimpleText() {
         final StringBuffer sb = new StringBuffer();
@@ -123,6 +106,29 @@ public class Sequence implements PhylogenyData, MultipleUris {
         return asSimpleText();
     }
 
+    @Override
+    public int compareTo( final Sequence o ) {
+        if ( ( !ForesterUtil.isEmpty( getName() ) ) && ( !ForesterUtil.isEmpty( o.getName() ) ) ) {
+            return getName().compareTo( o.getName() );
+        }
+        if ( ( !ForesterUtil.isEmpty( getSymbol() ) ) && ( !ForesterUtil.isEmpty( o.getSymbol() ) ) ) {
+            return getSymbol().compareTo( o.getSymbol() );
+        }
+        if ( ( !ForesterUtil.isEmpty( getGeneName() ) ) && ( !ForesterUtil.isEmpty( o.getGeneName() ) ) ) {
+            return getGeneName().compareTo( o.getGeneName() );
+        }
+        if ( ( getAccession() != null ) && ( o.getAccession() != null )
+                && !ForesterUtil.isEmpty( getAccession().getValue() )
+                && !ForesterUtil.isEmpty( o.getAccession().getValue() ) ) {
+            return getAccession().getValue().compareTo( o.getAccession().getValue() );
+        }
+        if ( ( !ForesterUtil.isEmpty( getMolecularSequence() ) )
+                && ( !ForesterUtil.isEmpty( o.getMolecularSequence() ) ) ) {
+            return getMolecularSequence().compareTo( o.getMolecularSequence() );
+        }
+        return 0;
+    }
+
     /**
      * Not a deep copy.
      * 
@@ -211,10 +217,18 @@ public class Sequence implements PhylogenyData, MultipleUris {
         return _annotations;
     }
 
+    public SortedSet<Accession> getCrossReferences() {
+        return _xrefs;
+    }
+
     public DomainArchitecture getDomainArchitecture() {
         return _da;
     }
 
+    public String getGeneName() {
+        return _gene_name;
+    }
+
     public String getLocation() {
         return _location;
     }
@@ -223,18 +237,10 @@ public class Sequence implements PhylogenyData, MultipleUris {
         return _mol_sequence;
     }
 
-    public boolean isMolecularSequenceAligned() {
-        return _mol_sequence_is_aligned;
-    }
-
     public String getName() {
         return _name;
     }
 
-    public String getGeneName() {
-        return _gene_name;
-    }
-
     public List<SequenceRelation> getSequenceRelations() {
         if ( _seq_relations == null ) {
             _seq_relations = new ArrayList<SequenceRelation>();
@@ -242,10 +248,6 @@ public class Sequence implements PhylogenyData, MultipleUris {
         return _seq_relations;
     }
 
-    private void setSequenceRelations( final List<SequenceRelation> seq_relations ) {
-        _seq_relations = seq_relations;
-    }
-
     public String getSourceId() {
         return _source_id;
     }
@@ -259,13 +261,13 @@ public class Sequence implements PhylogenyData, MultipleUris {
     }
 
     @Override
-    public List<Uri> getUris() {
-        return _uris;
+    public Uri getUri( final int index ) {
+        return getUris().get( index );
     }
 
     @Override
-    public Uri getUri( final int index ) {
-        return getUris().get( index );
+    public List<Uri> getUris() {
+        return _uris;
     }
 
     @Override
@@ -273,10 +275,13 @@ public class Sequence implements PhylogenyData, MultipleUris {
         if ( getAccession() != null ) {
             return getAccession().hashCode();
         }
-        int result = getSymbol().hashCode();
-        if ( getName().length() > 0 ) {
+        int result = getName().hashCode();
+        if ( getSymbol().length() > 0 ) {
             result ^= getName().hashCode();
         }
+        if ( getGeneName().length() > 0 ) {
+            result ^= getGeneName().hashCode();
+        }
         if ( getMolecularSequence().length() > 0 ) {
             result ^= getMolecularSequence().hashCode();
         }
@@ -314,6 +319,16 @@ public class Sequence implements PhylogenyData, MultipleUris {
         setAnnotations( null );
     }
 
+    public boolean isEmpty() {
+        return ( getAccession() == null ) && ForesterUtil.isEmpty( getName() ) && ForesterUtil.isEmpty( getSymbol() )
+                && ForesterUtil.isEmpty( getGeneName() ) && ForesterUtil.isEmpty( getType() )
+                && ForesterUtil.isEmpty( getLocation() ) && ForesterUtil.isEmpty( getSourceId() )
+                && ForesterUtil.isEmpty( getMolecularSequence() ) && ( getDomainArchitecture() == null )
+                && ForesterUtil.isEmpty( _annotations ) && ForesterUtil.isEmpty( _uris )
+                && ForesterUtil.isEmpty( _seq_relations )
+                && ( ( getCrossReferences() == null ) || getCrossReferences().isEmpty() );
+    }
+
     @Override
     public boolean isEqual( final PhylogenyData data ) {
         if ( this == data ) {
@@ -327,18 +342,22 @@ public class Sequence implements PhylogenyData, MultipleUris {
                 && s.getSymbol().equals( getSymbol() ) && s.getGeneName().equals( getGeneName() );
     }
 
-    public void setAccession( final Accession accession ) {
-        _accession = accession;
+    public boolean isMolecularSequenceAligned() {
+        return _mol_sequence_is_aligned;
     }
 
-    private void setAnnotations( final SortedSet<Annotation> annotations ) {
-        _annotations = annotations;
+    public void setAccession( final Accession accession ) {
+        _accession = accession;
     }
 
     public void setDomainArchitecture( final DomainArchitecture ds ) {
         _da = ds;
     }
 
+    public void setGeneName( final String gene_name ) {
+        _gene_name = gene_name;
+    }
+
     public void setLocation( final String description ) {
         _location = description;
     }
@@ -355,10 +374,6 @@ public class Sequence implements PhylogenyData, MultipleUris {
         _name = name;
     }
 
-    public void setGeneName( final String gene_name ) {
-        _gene_name = gene_name;
-    }
-
     public void setSourceId( final String source_id ) {
         _source_id = source_id;
     }
@@ -440,9 +455,6 @@ public class Sequence implements PhylogenyData, MultipleUris {
                 annotation.toPhyloXML( writer, level, my_ind );
             }
         }
-        if ( getDomainArchitecture() != null ) {
-            getDomainArchitecture().toPhyloXML( writer, level, my_ind );
-        }
         if ( ( getCrossReferences() != null ) && !getCrossReferences().isEmpty() ) {
             writer.write( ForesterUtil.LINE_SEPARATOR );
             writer.write( my_ind );
@@ -454,6 +466,9 @@ public class Sequence implements PhylogenyData, MultipleUris {
             writer.write( my_ind );
             PhylogenyDataUtil.appendClose( writer, PhyloXmlMapping.SEQUENCE_X_REFS );
         }
+        if ( getDomainArchitecture() != null ) {
+            getDomainArchitecture().toPhyloXML( writer, level, my_ind );
+        }
         writer.write( ForesterUtil.LINE_SEPARATOR );
         writer.write( indentation );
         PhylogenyDataUtil.appendClose( writer, PhyloXmlMapping.SEQUENCE );
@@ -463,4 +478,16 @@ public class Sequence implements PhylogenyData, MultipleUris {
     public String toString() {
         return asText().toString();
     }
+
+    private void setAnnotations( final SortedSet<Annotation> annotations ) {
+        _annotations = annotations;
+    }
+
+    private void setCrossReferences( final TreeSet<Accession> cross_references ) {
+        _xrefs = cross_references;
+    }
+
+    private void setSequenceRelations( final List<SequenceRelation> seq_relations ) {
+        _seq_relations = seq_relations;
+    }
 }