in progress...
[jalview.git] / forester / java / src / org / forester / surfacing / BasicBinaryDomainCombination.java
index 6516903..b5844a1 100644 (file)
 // 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.surfacing;
 
+import java.util.HashMap;
+import java.util.Map;
+
+import org.forester.protein.BasicDomain;
 import org.forester.protein.BinaryDomainCombination;
-import org.forester.protein.DomainId;
 import org.forester.util.ForesterUtil;
 
 public class BasicBinaryDomainCombination implements BinaryDomainCombination {
 
-    String _id_0;
-    String _id_1;
+    final static boolean                                            VERBOSE = false;
+    final private static Map<Integer, BasicBinaryDomainCombination> DC_POOL = new HashMap<Integer, BasicBinaryDomainCombination>();
+    final private static Map<Integer, String>                       S_POOL  = new HashMap<Integer, String>();
+    short                                                           _id0;
+    short                                                           _id1;
 
-    //DomainId _id_0;
-    //DomainId _id_1;
     BasicBinaryDomainCombination() {
-        _id_0 = null;
-        _id_1 = null;
+        _id0 = -1;
+        _id1 = -1;
     }
 
-    public BasicBinaryDomainCombination( final String id_0, final String id_1 ) {
-        if ( ( id_0 == null ) || ( id_1 == null ) ) {
+    private BasicBinaryDomainCombination( final String id0, final String id1 ) {
+        if ( ( id0 == null ) || ( id1 == null ) ) {
             throw new IllegalArgumentException( "attempt to create binary domain combination using null" );
         }
-        final String my_id_0 = id_0.trim();
-        final String my_id_1 = id_1.trim();
-        if ( my_id_0.toLowerCase().compareTo( my_id_1.toLowerCase() ) < 0 ) {
-            _id_0 = my_id_0;
-            _id_1 = my_id_1;
+        if ( ( id0.indexOf( SEPARATOR ) != -1 ) || ( id1.indexOf( SEPARATOR ) != -1 ) ) {
+            throw new IllegalArgumentException( "ill formatted domain id: " + id0 + ", " + id1 );
+        }
+        if ( id0.toLowerCase().compareTo( id1.toLowerCase() ) < 0 ) {
+            _id0 = BasicDomain.obtainIdAsShort( id0 );
+            _id1 = BasicDomain.obtainIdAsShort( id1 );
         }
         else {
-            _id_0 = my_id_1;
-            _id_1 = my_id_0;
+            _id0 = BasicDomain.obtainIdAsShort( id1 );
+            _id1 = BasicDomain.obtainIdAsShort( id0 );
         }
     }
 
-    public BasicBinaryDomainCombination( final DomainId id_0, final DomainId id_1 ) {
-        this( id_0.getId(), id_1.getId() );
-    }
-
     @Override
-    public int compareTo( final BinaryDomainCombination binary_domain_combination ) {
+    final public int compareTo( final BinaryDomainCombination binary_domain_combination ) {
         if ( binary_domain_combination.getClass() != this.getClass() ) {
             throw new IllegalArgumentException( "attempt to compare [" + binary_domain_combination.getClass() + "] to "
                     + "[" + this.getClass() + "]" );
@@ -81,7 +82,7 @@ public class BasicBinaryDomainCombination implements BinaryDomainCombination {
     }
 
     @Override
-    public boolean equals( final Object o ) {
+    final public boolean equals( final Object o ) {
         if ( this == o ) {
             return true;
         }
@@ -93,31 +94,40 @@ public class BasicBinaryDomainCombination implements BinaryDomainCombination {
                     + o.getClass() + "]" );
         }
         else {
-            return ( getId0().equals( ( ( BinaryDomainCombination ) o ).getId0() ) )
-                    && ( getId1().equals( ( ( BinaryDomainCombination ) o ).getId1() ) );
+            return ( getId0Code() == ( ( BinaryDomainCombination ) o ).getId0Code() )
+                    && ( getId1Code() == ( ( BinaryDomainCombination ) o ).getId1Code() );
         }
     }
 
     @Override
-    public DomainId getId0() {
-        return new DomainId( _id_0 );
+    final public String getId0() {
+        return BasicDomain.obtainIdFromShort( _id0 );
+    }
+
+    @Override
+    final public short getId0Code() {
+        return _id0;
+    }
+
+    @Override
+    final public String getId1() {
+        return BasicDomain.obtainIdFromShort( _id1 );
     }
 
     @Override
-    public DomainId getId1() {
-        return new DomainId( _id_1 );
+    final public short getId1Code() {
+        return _id1;
     }
 
     @Override
-    public int hashCode() {
-        // return getId0().hashCode() + ( 19 * getId1().hashCode() );
-        return ( _id_0 + _id_1 ).hashCode();
+    final public int hashCode() {
+        return calcCode( _id0, _id1 );
     }
 
     @Override
-    public StringBuffer toGraphDescribingLanguage( final OutputFormat format,
-                                                   final String node_attribute,
-                                                   final String edge_attribute ) {
+    final public StringBuffer toGraphDescribingLanguage( final OutputFormat format,
+                                                         final String node_attribute,
+                                                         final String edge_attribute ) {
         final StringBuffer sb = new StringBuffer();
         switch ( format ) {
             case DOT:
@@ -159,15 +169,19 @@ public class BasicBinaryDomainCombination implements BinaryDomainCombination {
     }
 
     @Override
-    public String toString() {
-        final StringBuffer sb = new StringBuffer();
-        sb.append( _id_0 );
-        sb.append( BinaryDomainCombination.SEPARATOR );
-        sb.append( _id_1 );
-        return sb.toString();
+    final public String toString() {
+        final int code = calcCode( _id0, _id1 );
+        if ( S_POOL.containsKey( code ) ) {
+            return S_POOL.get( code );
+        }
+        else {
+            final String s = getId0() + SEPARATOR + getId1();
+            S_POOL.put( code, s );
+            return s;
+        }
     }
 
-    public static BinaryDomainCombination createInstance( final String ids ) {
+    public static BinaryDomainCombination obtainInstance( final String ids ) {
         if ( ids.indexOf( BinaryDomainCombination.SEPARATOR ) < 1 ) {
             throw new IllegalArgumentException( "Unexpected format for binary domain combination [" + ids + "]" );
         }
@@ -175,6 +189,31 @@ public class BasicBinaryDomainCombination implements BinaryDomainCombination {
         if ( ids_ary.length != 2 ) {
             throw new IllegalArgumentException( "Unexpected format for binary domain combination [" + ids + "]" );
         }
-        return new BasicBinaryDomainCombination( ids_ary[ 0 ], ids_ary[ 1 ] );
+        return BasicBinaryDomainCombination.obtainInstance( ids_ary[ 0 ], ids_ary[ 1 ] );
+    }
+
+    public static BasicBinaryDomainCombination obtainInstance( final String id0, final String id1 ) {
+        int code;
+        if ( id0.toLowerCase().compareTo( id1.toLowerCase() ) < 0 ) {
+            code = calcCode( BasicDomain.obtainIdAsShort( id0 ), BasicDomain.obtainIdAsShort( id1 ) );
+        }
+        else {
+            code = calcCode( BasicDomain.obtainIdAsShort( id1 ), BasicDomain.obtainIdAsShort( id0 ) );
+        }
+        if ( DC_POOL.containsKey( code ) ) {
+            return DC_POOL.get( code );
+        }
+        else {
+            final BasicBinaryDomainCombination dc = new BasicBinaryDomainCombination( id0, id1 );
+            DC_POOL.put( code, dc );
+            if ( VERBOSE && ( ( DC_POOL.size() % 100 ) == 0 ) ) {
+                System.out.println( " dc pool size: " + DC_POOL.size() );
+            }
+            return dc;
+        }
+    }
+
+    final static int calcCode( final int id0, final int id1 ) {
+        return ( id0 * ( Short.MAX_VALUE + 1 ) ) + id1;
     }
 }