Merge branch 'j2s/develop-toc' into j2s/develop
[jalview.git] / src / jalview / bin / Cache.java
index a395093..4ed6e1a 100755 (executable)
@@ -1,33 +1,53 @@
 /*
- * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.1)
- * Copyright (C) 2014 The Jalview Authors
+ * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
+ * Copyright (C) $$Year-Rel$$ The Jalview Authors
  * 
  * This file is part of Jalview.
  * 
  * Jalview is free software: you can redistribute it and/or
  * modify it under the terms of the GNU General Public License 
- * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
+ * as published by the Free Software Foundation, either version 3
+ * of the License, or (at your option) any later version.
  *  
  * Jalview is distributed in the hope that it will be useful, but 
  * WITHOUT ANY WARRANTY; without even the implied warranty 
  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
  * PURPOSE.  See the GNU General Public License for more details.
  * 
- * You should have received a copy of the GNU General Public License along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
+ * You should have received a copy of the GNU General Public License
+ * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
  * The Jalview Authors are detailed in the 'AUTHORS' file.
  */
 package jalview.bin;
 
+import jalview.gui.UserDefinedColours;
+import jalview.io.PIRFile;
+import jalview.jbgui.GDesktop;
+import jalview.schemes.ColourSchemeProperty;
+import jalview.schemes.UserColourScheme;
+import jalview.util.Format;
 import jalview.ws.dbsources.das.api.DasSourceRegistryI;
 import jalview.ws.dbsources.das.datamodel.DasSourceRegistry;
 
 import java.awt.Color;
-import java.io.*;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.InputStream;
+import java.io.InputStreamReader;
 import java.text.DateFormat;
 import java.text.SimpleDateFormat;
-import java.util.*;
+import java.util.Collections;
+import java.util.Date;
+import java.util.Enumeration;
+import java.util.Properties;
+import java.util.TreeSet;
 
-import org.apache.log4j.*;
+import org.apache.log4j.ConsoleAppender;
+import org.apache.log4j.Level;
+import org.apache.log4j.Logger;
+import org.apache.log4j.SimpleLayout;
 
 /**
  * Stores and retrieves Jalview Application Properties Lists and fields within
@@ -61,6 +81,10 @@ import org.apache.log4j.*;
  * <li>SHOW_QUALITY show alignment quality annotation</li>
  * <li>SHOW_ANNOTATIONS show alignment annotation rows</li>
  * <li>SHOW_CONSERVATION show alignment conservation annotation</li>
+ * <li>SORT_ANNOTATIONS currently either SEQUENCE_AND_LABEL or
+ * LABEL_AND_SEQUENCE</li>
+ * <li>SHOW_AUTOCALC_ABOVE true to show autocalculated annotations above
+ * sequence annotations</li>
  * <li>CENTRE_COLUMN_LABELS centre the labels at each column in a displayed
  * annotation row</li>
  * <li>DEFAULT_COLOUR default colour scheme to apply for a new alignment</li>
@@ -132,6 +156,7 @@ import org.apache.log4j.*;
  * <li>FOLLOW_SELECTIONS (true) Controls whether a new alignment view should
  * respond to selections made in other alignments containing the same sequences.
  * </li>
+ * <li>JWS2HOSTURLS comma-separated list of URLs to try for JABAWS services</li>
  * <li>SHOW_WSDISCOVERY_ERRORS (true) Controls if the web service URL discovery
  * warning dialog box is displayed.</li>
  * <li>ANNOTATIONCOLOUR_MIN (orange) Shade used for minimum value of annotation
@@ -140,14 +165,22 @@ import org.apache.log4j.*;
  * when shading by annotation</li>
  * <li>www.jalview.org (http://www.jalview.org) a property enabling all HTTP
  * requests to be redirected to a mirror of http://www.jalview.org</li>
- * 
  * <li>FIGURE_AUTOIDWIDTH (false) Expand the left hand column of an exported
  * alignment figure to accommodate even the longest sequence ID or annotation
  * label.</li>
  * <li>FIGURE_FIXEDIDWIDTH Specifies the width to use for the left-hand column
  * when exporting an alignment as a figure (setting FIGURE_AUTOIDWIDTH to true
  * will override this).</li>
- * <li></li>
+ * <li>STRUCT_FROM_PDB (false) derive secondary structure annotation from PDB
+ * record</li>
+ * <li>USE_RNAVIEW (false) use RNAViewer to derive secondary structure</li>
+ * <li>ADD_SS_ANN (false) add secondary structure annotation to alignment
+ * display</li>
+ * <li>ADD_TEMPFACT_ANN (false) add Temperature Factor annotation to alignment
+ * display</li>
+ * <li>STRUCTURE_DISPLAY choose from JMOL (default) or CHIMERA for 3D structure
+ * display</li>
+ * <li>CHIMERA_PATH specify full path to Chimera program (if non-standard)</li>
  * 
  * </ul>
  * Deprecated settings:
@@ -195,7 +228,13 @@ public class Cache
   public static Logger log;
 
   /** Jalview Properties */
-  public static Properties applicationProperties = new Properties();
+  public static Properties applicationProperties = new Properties() {
+    // override results in properties output in alphabetical order
+    @Override
+    public synchronized Enumeration<Object> keys() {
+        return Collections.enumeration(new TreeSet<Object>(super.keySet()));
+    }
+  };
 
   /** Default file is ~/.jalview_properties */
   static String propertiesFile;
@@ -220,7 +259,7 @@ public class Cache
       // log output
       Logger laxis = Logger.getLogger("org.apache.axis");
       Logger lcastor = Logger.getLogger("org.exolab.castor");
-      jalview.bin.Cache.log = Logger.getLogger("jalview.bin.Jalview");
+      Cache.log = Logger.getLogger("jalview.bin.Jalview");
 
       laxis.setLevel(Level.toLevel(Cache.getDefault("logs.Axis.Level",
               Level.INFO.toString())));
@@ -232,13 +271,13 @@ public class Cache
       // lcastor = Logger.getLogger("org.exolab.castor.xml.Marshaller");
       // lcastor.setLevel(Level.toLevel(Cache.getDefault("logs.Castor.Level",
       // Level.INFO.toString())));
-      jalview.bin.Cache.log.setLevel(Level.toLevel(Cache.getDefault(
+      Cache.log.setLevel(Level.toLevel(Cache.getDefault(
               "logs.Jalview.level", Level.INFO.toString())));
       // laxis.addAppender(ap);
       // lcastor.addAppender(ap);
-      // jalview.bin.Cache.log.addAppender(ap);
+      // Cache.log.addAppender(ap);
       // Tell the user that debug is enabled
-      jalview.bin.Cache.log.debug("Jalview Debugging Output Follows.");
+      Cache.log.debug("Jalview Debugging Output Follows.");
     } catch (Exception ex)
     {
       System.err.println("Problems initializing the log4j system\n");
@@ -282,8 +321,10 @@ public class Cache
         fis = new FileInputStream(propertiesFile);
       }
       applicationProperties.load(fis);
-      applicationProperties.remove("LATEST_VERSION");
-      applicationProperties.remove("VERSION");
+      
+      // remove any old build properties
+      
+      deleteBuildProperties();
       fis.close();
     } catch (Exception ex)
     {
@@ -344,15 +385,21 @@ public class Cache
 
     String jnlpVersion = System.getProperty("jalview.version");
     String codeVersion = getProperty("VERSION");
-
+    String codeInstallation = getProperty("INSTALLATION");
     if (codeVersion == null)
     {
       // THIS SHOULD ONLY BE THE CASE WHEN TESTING!!
       codeVersion = "Test";
       jnlpVersion = "Test";
+      codeInstallation = "";
+    }
+    else
+    {
+      codeInstallation = " (" + codeInstallation + ")";
     }
 
-    System.out.println("Jalview Version: " + codeVersion);
+    System.out
+            .println("Jalview Version: " + codeVersion + codeInstallation);
 
     // jnlpVersion will be null if we're using InstallAnywhere
     // Dont do this check if running in headless mode
@@ -429,12 +476,23 @@ public class Cache
     setProperty("VERSION", codeVersion);
 
     // LOAD USERDEFINED COLOURS
-    jalview.gui.UserDefinedColours
+    UserDefinedColours
             .initUserColourSchemes(getProperty("USER_DEFINED_COLOURS"));
-    jalview.io.PIRFile.useModellerOutput = Cache.getDefault("PIR_MODELLER",
+    PIRFile.useModellerOutput = Cache.getDefault("PIR_MODELLER",
             false);
   }
 
+  private static void deleteBuildProperties()
+  {
+    applicationProperties.remove("LATEST_VERSION");
+    applicationProperties.remove("VERSION");
+    applicationProperties.remove("AUTHORS");
+    applicationProperties.remove("AUTHORFNAMES");
+    applicationProperties.remove("YEAR");
+    applicationProperties.remove("BUILD_DATE");
+    applicationProperties.remove("INSTALLATION");
+  }
+
   /**
    * Gets Jalview application property of given key. Returns null if key not
    * found
@@ -556,10 +614,10 @@ public class Cache
     {
       try
       {
-        if (jalview.jbgui.GDesktop.class.getClassLoader().loadClass(
+        if (GDesktop.class.getClassLoader().loadClass(
                 "uk.ac.vamsas.client.VorbaId") != null)
         {
-          jalview.bin.Cache.log
+          Cache.log
                   .debug("Found Vamsas Classes (uk.ac..vamsas.client.VorbaId can be loaded)");
           vamsasJarsArePresent = 1;
           Logger lvclient = Logger.getLogger("uk.ac.vamsas");
@@ -573,7 +631,7 @@ public class Cache
       } catch (Exception e)
       {
         vamsasJarsArePresent = 0;
-        jalview.bin.Cache.log.debug("Vamsas Classes are not present");
+        Cache.log.debug("Vamsas Classes are not present");
       }
     }
     return (vamsasJarsArePresent > 0);
@@ -598,7 +656,7 @@ public class Cache
         if (Cache.class.getClassLoader().loadClass(
                 "groovy.lang.GroovyObject") != null)
         {
-          jalview.bin.Cache.log
+          Cache.log
                   .debug("Found Groovy (groovy.lang.GroovyObject can be loaded)");
           groovyJarsArePresent = 1;
           Logger lgclient = Logger.getLogger("groovy");
@@ -612,11 +670,11 @@ public class Cache
       } catch (Error e)
       {
         groovyJarsArePresent = 0;
-        jalview.bin.Cache.log.debug("Groovy Classes are not present", e);
+        Cache.log.debug("Groovy Classes are not present", e);
       } catch (Exception e)
       {
         groovyJarsArePresent = 0;
-        jalview.bin.Cache.log.debug("Groovy Classes are not present");
+        Cache.log.debug("Groovy Classes are not present");
       }
     }
     return (groovyJarsArePresent > 0);
@@ -671,9 +729,9 @@ public class Cache
                 new Object[]
                 {
                     "Jalview Desktop",
-                    (vrs = jalview.bin.Cache.getProperty("VERSION")
+                    (vrs = Cache.getProperty("VERSION")
                             + "_"
-                            + jalview.bin.Cache.getDefault("BUILD_DATE",
+                            + Cache.getDefault("BUILD_DATE",
                                     "unknown")), "UA-9060947-1" });
         jgoogleanalyticstracker.getMethod("trackAsynchronously",
                 new Class[]
@@ -696,15 +754,21 @@ public class Cache
         if (log != null)
         {
           if (re != null)
+          {
             log.debug("Caught runtime exception in googletracker init:", re);
+          }
           if (ex != null)
+          {
             log.warn(
                     "Failed to initialise GoogleTracker for Jalview Desktop with version "
                             + vrs, ex);
+          }
           if (err != null)
+          {
             log.error(
                     "Whilst initing GoogleTracker for Jalview Desktop version "
                             + vrs, err);
+          }
         }
         else
         {
@@ -753,13 +817,12 @@ public class Cache
     {
       return defcolour;
     }
-    Color col = jalview.schemes.ColourSchemeProperty
-            .getAWTColorFromName(colprop);
+    Color col = ColourSchemeProperty.getAWTColorFromName(colprop);
     if (col == null)
     {
       try
       {
-        col = new jalview.schemes.UserColourScheme(colprop).findColour('A');
+        col = new UserColourScheme(colprop).findColour('A');
       } catch (Exception ex)
       {
         log.warn("Couldn't parse '" + colprop + "' as a colour for "
@@ -778,7 +841,7 @@ public class Cache
    */
   public static void setColourProperty(String property, Color colour)
   {
-    setProperty(property, jalview.util.Format.getHexString(colour));
+    setProperty(property, Format.getHexString(colour));
   }
 
   public static final DateFormat date_format = SimpleDateFormat
@@ -858,4 +921,27 @@ public class Cache
     }
     return sourceRegistry;
   }
+
+  /**
+   * Set the specified value, or remove it if null or empty. Does not save the
+   * properties file.
+   * 
+   * @param propName
+   * @param value
+   */
+  public static void setOrRemove(String propName, String value)
+  {
+    if (propName == null)
+    {
+      return;
+    }
+    if (value == null || value.trim().length() < 1)
+    {
+      Cache.applicationProperties.remove(propName);
+    }
+    else
+    {
+      Cache.applicationProperties.setProperty(propName, value);
+    }
+  }
 }