JAL-1645 Version-Rel Version 2.9 Year-Rel 2015 Licensing glob
[jalview.git] / src / jalview / bin / Cache.java
index b07593d..21d5205 100755 (executable)
@@ -1,19 +1,21 @@
 /*
- * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.0b1)
- * Copyright (C) 2014 The Jalview Authors
+ * Jalview - A Sequence Alignment Editor and Viewer (Version 2.9)
+ * Copyright (C) 2015 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;
@@ -22,12 +24,24 @@ 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 +75,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 +150,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 +159,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 +222,15 @@ 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;
@@ -282,8 +317,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 +381,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 = "";
     }
-
-    System.out.println("Jalview Version: " + codeVersion);
+    else
+    {
+      codeInstallation = " (" + codeInstallation + ")";
+    }
+    new BuildDetails(codeVersion, null, codeInstallation);
+    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
@@ -435,6 +478,17 @@ public class Cache
             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
@@ -666,21 +720,22 @@ public class Cache
       try
       {
         // Google analytics tracking code for Library Finder
-        tracker = jgoogleanalyticstracker.getConstructor(new Class[]
-        { String.class, String.class, String.class }).newInstance(
-                new Object[]
-                {
-                    "Jalview Desktop",
-                    (vrs = jalview.bin.Cache.getProperty("VERSION")
-                            + "_"
-                            + jalview.bin.Cache.getDefault("BUILD_DATE",
-                                    "unknown")), "UA-9060947-1" });
+        tracker = jgoogleanalyticstracker.getConstructor(
+                new Class[] { String.class, String.class, String.class })
+                .newInstance(
+                        new Object[] {
+                            "Jalview Desktop",
+                            (vrs = jalview.bin.Cache.getProperty("VERSION")
+                                    + "_"
+                                    + jalview.bin.Cache.getDefault(
+                                            "BUILD_DATE", "unknown")),
+                            "UA-9060947-1" });
         jgoogleanalyticstracker.getMethod("trackAsynchronously",
-                new Class[]
-                { trackerfocus }).invoke(tracker, new Object[]
-        { trackerfocus.getConstructor(new Class[]
-        { String.class }).newInstance(new Object[]
-        { "Application Started." }) });
+                new Class[] { trackerfocus }).invoke(
+                tracker,
+                new Object[] { trackerfocus.getConstructor(
+                        new Class[] { String.class }).newInstance(
+                        new Object[] { "Application Started." }) });
       } catch (RuntimeException e)
       {
         re = e;
@@ -696,15 +751,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
         {
@@ -858,4 +919,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);
+    }
+  }
 }