in progress
[jalview.git] / forester / java / src / org / forester / phylogeny / data / Sequence.java
index 27b3b0c..ac4be9e 100644 (file)
@@ -5,7 +5,7 @@
 // Copyright (C) 2008-2009 Christian M. Zmasek
 // Copyright (C) 2008-2009 Burnham Institute for Medical Research
 // All rights reserved
-// 
+//
 // This library is free software; you can redistribute it and/or
 // modify it under the terms of the GNU Lesser General Public
 // License as published by the Free Software Foundation; either
 // but WITHOUT ANY WARRANTY; without even the implied warranty of
 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 // Lesser General Public License for more details.
-// 
+//
 // You should have received a copy of the GNU Lesser General Public
 // License along with this library; if not, write to the Free Software
 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
 //
 // Contact: phylosoft @ gmail . com
-// WWW: www.phylosoft.org/forester
+// WWW: https://sites.google.com/site/cmzmasek/home/software/forester
 
 package org.forester.phylogeny.data;
 
@@ -53,6 +53,7 @@ public class Sequence implements PhylogenyData, MultipleUris {
     private DomainArchitecture     _da;
     private List<Uri>              _uris;
     private List<SequenceRelation> _seq_relations;
+    private SortedSet<Accession>   _xrefs;
 
     public Sequence() {
         init();
@@ -63,13 +64,30 @@ public class Sequence implements PhylogenyData, MultipleUris {
                 && ForesterUtil.isEmpty( getType() ) && ForesterUtil.isEmpty( getLocation() )
                 && ForesterUtil.isEmpty( getSourceId() ) && ForesterUtil.isEmpty( getMolecularSequence() )
                 && ( getDomainArchitecture() == null ) && ForesterUtil.isEmpty( _annotations )
-                && ForesterUtil.isEmpty( _uris ) && ForesterUtil.isEmpty( _seq_relations );
+                && ForesterUtil.isEmpty( _uris ) && ForesterUtil.isEmpty( _seq_relations )
+                && ( getCrossReferences() == null || getCrossReferences().isEmpty() );
     }
 
     public void addAnnotation( final Annotation annotation ) {
         getAnnotations().add( annotation );
     }
+    
+    public void addCrossReference( Accession cross_reference ) {
+        if ( getCrossReferences() == null ) {
+            setCrossReferences( new TreeSet<Accession>() );
+        }
+        getCrossReferences().add( cross_reference  );
+    }
+    
+    public SortedSet<Accession> getCrossReferences() {
+        return _xrefs;
+    }
+    
+    private void setCrossReferences( TreeSet<Accession> cross_references ) {
+        _xrefs = cross_references;
+    }
 
+    @Override
     public void addUri( final Uri uri ) {
         if ( getUris() == null ) {
             setUris( new ArrayList<Uri>() );
@@ -81,6 +99,7 @@ public class Sequence implements PhylogenyData, MultipleUris {
         _seq_relations.add( sr );
     }
 
+    @Override
     public StringBuffer asSimpleText() {
         final StringBuffer sb = new StringBuffer();
         if ( getAccession() != null ) {
@@ -98,6 +117,7 @@ public class Sequence implements PhylogenyData, MultipleUris {
         return sb;
     }
 
+    @Override
     public StringBuffer asText() {
         return asSimpleText();
     }
@@ -106,11 +126,17 @@ public class Sequence implements PhylogenyData, MultipleUris {
      * Not a deep copy.
      * 
      */
+    @Override
     public PhylogenyData copy() {
         final Sequence seq = new Sequence();
         seq.setAnnotations( getAnnotations() );
         seq.setName( getName() );
-        seq.setSymbol( getSymbol() );
+        try {
+            seq.setSymbol( getSymbol() );
+        }
+        catch ( final PhyloXmlDataFormatException e ) {
+            e.printStackTrace();
+        }
         seq.setMolecularSequence( getMolecularSequence() );
         seq.setMolecularSequenceAligned( isMolecularSequenceAligned() );
         seq.setLocation( getLocation() );
@@ -120,7 +146,12 @@ public class Sequence implements PhylogenyData, MultipleUris {
         else {
             seq.setAccession( null );
         }
-        seq.setType( getType() );
+        try {
+            seq.setType( getType() );
+        }
+        catch ( final PhyloXmlDataFormatException e ) {
+            e.printStackTrace();
+        }
         if ( getUris() != null ) {
             seq.setUris( new ArrayList<Uri>() );
             for( final Uri uri : getUris() ) {
@@ -135,6 +166,14 @@ public class Sequence implements PhylogenyData, MultipleUris {
         else {
             seq.setDomainArchitecture( null );
         }
+        if ( getCrossReferences() != null ) {
+            seq.setCrossReferences( new TreeSet<Accession>() );
+            for( final Accession x : getCrossReferences() ) {
+                if ( x != null ) {
+                    seq.getCrossReferences().add( x);
+                }
+            }
+        }
         return seq;
     }
 
@@ -213,10 +252,12 @@ public class Sequence implements PhylogenyData, MultipleUris {
         return _type;
     }
 
+    @Override
     public List<Uri> getUris() {
         return _uris;
     }
 
+    @Override
     public Uri getUri( final int index ) {
         return getUris().get( index );
     }
@@ -247,14 +288,26 @@ public class Sequence implements PhylogenyData, MultipleUris {
         setMolecularSequenceAligned( false );
         setLocation( "" );
         setAccession( null );
-        setSymbol( "" );
-        setType( "" );
+        try {
+            setSymbol( "" );
+        }
+        catch ( final PhyloXmlDataFormatException e ) {
+            e.printStackTrace();
+        }
+        try {
+            setType( "" );
+        }
+        catch ( final PhyloXmlDataFormatException e ) {
+            e.printStackTrace();
+        }
         setDomainArchitecture( null );
         setUris( null );
         setSequenceRelations( null );
         setSourceId( null );
+        setCrossReferences(null);
     }
 
+    @Override
     public boolean isEqual( final PhylogenyData data ) {
         if ( this == data ) {
             return true;
@@ -299,24 +352,26 @@ public class Sequence implements PhylogenyData, MultipleUris {
         _source_id = source_id;
     }
 
-    public void setSymbol( final String symbol ) {
+    public void setSymbol( final String symbol ) throws PhyloXmlDataFormatException {
         if ( !ForesterUtil.isEmpty( symbol ) && !PhyloXmlUtil.SEQUENCE_SYMBOL_PATTERN.matcher( symbol ).matches() ) {
             throw new PhyloXmlDataFormatException( "illegal sequence symbol: [" + symbol + "]" );
         }
         _symbol = symbol;
     }
 
-    public void setType( final String type ) {
+    public void setType( final String type ) throws PhyloXmlDataFormatException {
         if ( !ForesterUtil.isEmpty( type ) && !PhyloXmlUtil.SEQUENCE_TYPES.contains( type ) ) {
             throw new PhyloXmlDataFormatException( "illegal sequence type: [" + type + "]" );
         }
         _type = type;
     }
 
+    @Override
     public void setUris( final List<Uri> uris ) {
         _uris = uris;
     }
 
+    @Override
     public StringBuffer toNHX() {
         final StringBuffer sb = new StringBuffer();
         if ( getName().length() > 0 ) {
@@ -333,6 +388,7 @@ public class Sequence implements PhylogenyData, MultipleUris {
         return sb;
     }
 
+    @Override
     public void toPhyloXML( final Writer writer, final int level, final String indentation ) throws IOException {
         if ( isEmpty() ) {
             return;
@@ -361,14 +417,14 @@ public class Sequence implements PhylogenyData, MultipleUris {
                                              String.valueOf( isMolecularSequenceAligned() ),
                                              indentation );
         }
-        if ( getUris() != null ) {
+        if ( getUris() != null && !getUris().isEmpty() ) {
             for( final Uri uri : getUris() ) {
                 if ( uri != null ) {
                     uri.toPhyloXML( writer, level, indentation );
                 }
             }
         }
-        if ( _annotations != null ) {
+        if ( getAnnotations() != null && !getAnnotations().isEmpty() ) {
             for( final PhylogenyData annotation : getAnnotations() ) {
                 annotation.toPhyloXML( writer, level, my_ind );
             }
@@ -376,6 +432,17 @@ public class Sequence implements PhylogenyData, MultipleUris {
         if ( getDomainArchitecture() != null ) {
             getDomainArchitecture().toPhyloXML( writer, level, my_ind );
         }
+        if ( getCrossReferences() != null && !getCrossReferences().isEmpty() ) {
+            writer.write( ForesterUtil.LINE_SEPARATOR );
+            writer.write( my_ind );
+            PhylogenyDataUtil.appendOpen( writer, PhyloXmlMapping.SEQUENCE_X_REFS );
+            for( final PhylogenyData x : getCrossReferences() ) {
+                x.toPhyloXML( writer, level, my_ind );
+            }
+            writer.write( ForesterUtil.LINE_SEPARATOR );
+            writer.write( my_ind );
+            PhylogenyDataUtil.appendClose( writer, PhyloXmlMapping.SEQUENCE_X_REFS );
+        } 
         writer.write( ForesterUtil.LINE_SEPARATOR );
         writer.write( indentation );
         PhylogenyDataUtil.appendClose( writer, PhyloXmlMapping.SEQUENCE );