JAL-3111 report build type and commit in stdout from command line and in About/Splash...
[jalview.git] / src / jalview / bin / Cache.java
index 48c1ee9..f4b4aac 100755 (executable)
@@ -22,13 +22,12 @@ package jalview.bin;
 
 import jalview.datamodel.PDBEntry;
 import jalview.gui.UserDefinedColours;
+import jalview.schemes.ColourSchemeLoader;
 import jalview.schemes.ColourSchemes;
 import jalview.schemes.UserColourScheme;
 import jalview.structure.StructureImportSettings;
 import jalview.urls.IdOrgSettings;
 import jalview.util.ColorUtils;
-import jalview.ws.dbsources.das.api.DasSourceRegistryI;
-import jalview.ws.dbsources.das.datamodel.DasSourceRegistry;
 import jalview.ws.sifts.SiftsSettings;
 
 import java.awt.Color;
@@ -76,7 +75,8 @@ import org.apache.log4j.SimpleLayout;
  * <li>SHOW_FULLSCREEN boolean</li>
  * <li>FONT_NAME java font name for alignment text display</li>
  * <li>FONT_SIZE size of displayed alignment text</li>
- * <li>FONT_STYLE style of font displayed (sequence labels are always italic)</li>
+ * <li>FONT_STYLE style of font displayed (sequence labels are always
+ * italic)</li>
  * <li>GAP_SYMBOL character to treat as gap symbol (usually -,.,' ')</li>
  * <li>LAST_DIRECTORY last directory for browsing alignment</li>
  * <li>USER_DEFINED_COLOURS list of user defined colour scheme files</li>
@@ -114,7 +114,6 @@ import org.apache.log4j.SimpleLayout;
  * service</li>
  * <li>USAGESTATS (false - user prompted) Enable google analytics tracker for
  * collecting usage statistics</li>
- * <li>DAS_LOCAL_SOURCE list of local das sources</li>
  * <li>SHOW_OVERVIEW boolean for overview window display</li>
  * <li>ANTI_ALIAS boolean for smooth fonts</li>
  * <li>RIGHT_ALIGN_IDS boolean</li>
@@ -134,9 +133,7 @@ import org.apache.log4j.SimpleLayout;
  * sequence id (must be in SEQUENCE_LINKS or STORED_LINKS)
  * <li>GROUP_LINKS list of name|URL[|&lt;separator&gt;] tuples - see
  * jalview.utils.GroupURLLink for more info</li>
- * <li>DAS_REGISTRY_URL the registry to query</li>
  * <li>DEFAULT_BROWSER for unix</li>
- * <li>DAS_ACTIVE_SOURCE list of active sources</li>
  * <li>SHOW_MEMUSAGE boolean show memory usage and warning indicator on desktop
  * (false)</li>
  * <li>VERSION_CHECK (true) check for the latest release version from
@@ -226,18 +223,11 @@ public class Cache
    */
   public static final String JALVIEWLOGLEVEL = "logs.Jalview.level";
 
-  public static final String DAS_LOCAL_SOURCE = "DAS_LOCAL_SOURCE";
-
-  public static final String DAS_REGISTRY_URL = "DAS_REGISTRY_URL";
-
-  public static final String DAS_ACTIVE_SOURCE = "DAS_ACTIVE_SOURCE";
-
   /**
    * Sifts settings
    */
   public static final String DEFAULT_SIFTS_DOWNLOAD_DIR = System
-          .getProperty("user.home")
-          + File.separatorChar
+          .getProperty("user.home") + File.separatorChar
           + ".sifts_downloads" + File.separatorChar;
 
   private final static String DEFAULT_CACHE_THRESHOLD_IN_DAYS = "2";
@@ -280,7 +270,7 @@ public class Cache
     @Override
     public synchronized Enumeration<Object> keys()
     {
-      return Collections.enumeration(new TreeSet<Object>(super.keySet()));
+      return Collections.enumeration(new TreeSet<>(super.keySet()));
     }
   };
 
@@ -309,8 +299,8 @@ public class Cache
       Logger lcastor = Logger.getLogger("org.exolab.castor");
       jalview.bin.Cache.log = Logger.getLogger("jalview.bin.Jalview");
 
-      laxis.setLevel(Level.toLevel(Cache.getDefault("logs.Axis.Level",
-              Level.INFO.toString())));
+      laxis.setLevel(Level.toLevel(
+              Cache.getDefault("logs.Axis.Level", Level.INFO.toString())));
       lcastor.setLevel(Level.toLevel(Cache.getDefault("logs.Castor.Level",
               Level.INFO.toString())));
       lcastor = Logger.getLogger("org.exolab.castor.xml");
@@ -319,8 +309,8 @@ 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(
-              "logs.Jalview.level", Level.INFO.toString())));
+      jalview.bin.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);
@@ -333,7 +323,10 @@ public class Cache
     }
   }
 
-  /** Called when Jalview is started */
+  /**
+   * Loads properties from the given properties file. Any existing properties
+   * are first cleared.
+   */
   public static void loadProperties(String propsFile)
   {
     propertiesFile = propsFile;
@@ -354,10 +347,10 @@ public class Cache
       try
       {
         fis = new java.net.URL(propertiesFile).openStream();
-        System.out.println("Loading jalview properties from : "
-                + propertiesFile);
-        System.out
-                .println("Disabling Jalview writing to user's local properties file.");
+        System.out.println(
+                "Loading jalview properties from : " + propertiesFile);
+        System.out.println(
+                "Disabling Jalview writing to user's local properties file.");
         propsAreReadOnly = true;
 
       } catch (Exception ex)
@@ -368,6 +361,7 @@ public class Cache
       {
         fis = new FileInputStream(propertiesFile);
       }
+      applicationProperties.clear();
       applicationProperties.load(fis);
 
       // remove any old build properties
@@ -381,8 +375,8 @@ public class Cache
 
     if (getDefault("USE_PROXY", false))
     {
-      String proxyServer = getDefault("PROXY_SERVER", ""), proxyPort = getDefault(
-              "PROXY_PORT", "8080");
+      String proxyServer = getDefault("PROXY_SERVER", ""),
+              proxyPort = getDefault("PROXY_PORT", "8080");
 
       System.out.println("Using proxyServer: " + proxyServer
               + " proxyPort: " + proxyPort);
@@ -394,9 +388,9 @@ public class Cache
     // LOAD THE AUTHORS FROM THE authors.props file
     try
     {
-      String authorDetails = "jar:".concat(Cache.class
-              .getProtectionDomain().getCodeSource().getLocation()
-              .toString().concat("!/authors.props"));
+      String authorDetails = "jar:"
+              .concat(Cache.class.getProtectionDomain().getCodeSource()
+                      .getLocation().toString().concat("!/authors.props"));
 
       java.net.URL localJarFileURL = new java.net.URL(authorDetails);
 
@@ -411,63 +405,26 @@ public class Cache
       applicationProperties.remove("YEAR");
     }
 
-    // FIND THE VERSION NUMBER AND BUILD DATE FROM jalview.jar
-    // MUST FOLLOW READING OF LOCAL PROPERTIES FILE AS THE
-    // VERSION MAY HAVE CHANGED SINCE LAST USING JALVIEW
-    try
-    {
-      String buildDetails = "jar:".concat(Cache.class.getProtectionDomain()
-              .getCodeSource().getLocation().toString()
-              .concat("!/.build_properties"));
-
-      java.net.URL localJarFileURL = new java.net.URL(buildDetails);
-
-      InputStream in = localJarFileURL.openStream();
-      applicationProperties.load(in);
-      in.close();
-    } catch (Exception ex)
-    {
-      System.out.println("Error reading build details: " + ex);
-      applicationProperties.remove("VERSION");
-    }
-
-    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 + ")";
-    }
-    new BuildDetails(codeVersion, null, codeInstallation);
+    loadBuildProperties(false);
 
     SiftsSettings
             .setMapWithSifts(Cache.getDefault("MAP_WITH_SIFTS", false));
 
-    SiftsSettings.setSiftDownloadDirectory(jalview.bin.Cache.getDefault(
-            "sifts_download_dir", DEFAULT_SIFTS_DOWNLOAD_DIR));
+    SiftsSettings.setSiftDownloadDirectory(jalview.bin.Cache
+            .getDefault("sifts_download_dir", DEFAULT_SIFTS_DOWNLOAD_DIR));
 
-    SiftsSettings.setFailSafePIDThreshold(jalview.bin.Cache.getDefault(
-            "sifts_fail_safe_pid_threshold",
-            DEFAULT_FAIL_SAFE_PID_THRESHOLD));
+    SiftsSettings.setFailSafePIDThreshold(
+            jalview.bin.Cache.getDefault("sifts_fail_safe_pid_threshold",
+                    DEFAULT_FAIL_SAFE_PID_THRESHOLD));
 
-    SiftsSettings.setCacheThresholdInDays(jalview.bin.Cache.getDefault(
-            "sifts_cache_threshold_in_days",
-            DEFAULT_CACHE_THRESHOLD_IN_DAYS));
+    SiftsSettings.setCacheThresholdInDays(
+            jalview.bin.Cache.getDefault("sifts_cache_threshold_in_days",
+                    DEFAULT_CACHE_THRESHOLD_IN_DAYS));
 
     IdOrgSettings.setUrl(getDefault("ID_ORG_HOSTURL",
             "http://www.jalview.org/services/identifiers"));
     IdOrgSettings.setDownloadLocation(ID_ORG_FILE);
 
-    System.out
-            .println("Jalview Version: " + codeVersion + codeInstallation);
-
     StructureImportSettings.setDefaultStructureFileFormat(jalview.bin.Cache
             .getDefault("PDB_DOWNLOAD_FORMAT", PDB_DOWNLOAD_FORMAT));
     StructureImportSettings
@@ -475,10 +432,14 @@ public class Cache
     // StructureImportSettings
     // .setDefaultPDBFileParser(jalview.bin.Cache.getDefault(
     // "DEFAULT_PDB_FILE_PARSER", DEFAULT_PDB_FILE_PARSER));
-    // jnlpVersion will be null if we're using InstallAnywhere
+
+    String jnlpVersion = System.getProperty("jalview.version");
+
+    // jnlpVersion will be null if a latest version check for the channel needs to
+    // be done
     // Dont do this check if running in headless mode
-    if (jnlpVersion == null
-            && getDefault("VERSION_CHECK", true)
+
+    if (jnlpVersion == null && getDefault("VERSION_CHECK", true)
             && (System.getProperty("java.awt.headless") == null || System
                     .getProperty("java.awt.headless").equals("false")))
     {
@@ -501,11 +462,11 @@ public class Cache
           {
             System.setProperty("sun.net.client.defaultConnectTimeout",
                     "5000");
-            java.net.URL url = new java.net.URL(Cache.getDefault(
-                    "www.jalview.org", "http://www.jalview.org")
+            java.net.URL url = new java.net.URL(Cache
+                    .getDefault("www.jalview.org", "http://www.jalview.org")
                     + "/webstart/jalview.jnlp");
-            BufferedReader in = new BufferedReader(new InputStreamReader(
-                    url.openStream()));
+            BufferedReader in = new BufferedReader(
+                    new InputStreamReader(url.openStream()));
             String line = null;
             while ((line = in.readLine()) != null)
             {
@@ -521,8 +482,8 @@ public class Cache
             }
           } catch (Exception ex)
           {
-            System.out
-                    .println("Non-fatal exception when checking version at www.jalview.org :");
+            System.out.println(
+                    "Non-fatal exception when checking version at www.jalview.org :");
             System.out.println(ex);
             remoteVersion = getProperty("VERSION");
           }
@@ -548,8 +509,6 @@ public class Cache
       }
     }
 
-    setProperty("VERSION", codeVersion);
-
     // LOAD USERDEFINED COLOURS
     jalview.bin.Cache
             .initUserColourSchemes(getProperty("USER_DEFINED_COLOURS"));
@@ -557,6 +516,50 @@ public class Cache
             false);
   }
 
+  public static void loadBuildProperties(boolean reportVersion)
+  {
+    String codeInstallation = getProperty("INSTALLATION");
+    boolean printV = codeInstallation == null;
+
+    // FIND THE VERSION NUMBER AND BUILD DATE FROM jalview.jar
+    try
+    {
+      String buildDetails = "jar:".concat(Cache.class.getProtectionDomain()
+              .getCodeSource().getLocation().toString()
+              .concat("!/.build_properties"));
+
+      java.net.URL localJarFileURL = new java.net.URL(buildDetails);
+
+      InputStream in = localJarFileURL.openStream();
+      applicationProperties.load(in);
+      in.close();
+    } catch (Exception ex)
+    {
+      System.out.println("Error reading build details: " + ex);
+      applicationProperties.remove("VERSION");
+    }
+    String codeVersion = getProperty("VERSION");
+    codeInstallation = getProperty("INSTALLATION");
+
+    if (codeVersion == null)
+    {
+      // THIS SHOULD ONLY BE THE CASE WHEN TESTING!!
+      codeVersion = "Test";
+      codeInstallation = "";
+    }
+    else
+    {
+      codeInstallation = " (" + codeInstallation + ")";
+    }
+    setProperty("VERSION", codeVersion);
+    new BuildDetails(codeVersion, null, codeInstallation);
+    if (printV && reportVersion)
+    {
+      System.out
+            .println("Jalview Version: " + codeVersion + codeInstallation);
+    }
+  }
+
   private static void deleteBuildProperties()
   {
     applicationProperties.remove("LATEST_VERSION");
@@ -598,6 +601,24 @@ public class Cache
     return def;
   }
 
+  public static int getDefault(String property, int def)
+  {
+    String string = getProperty(property);
+    if (string != null)
+    {
+      try
+      {
+        def = Integer.parseInt(string);
+      } catch (NumberFormatException e)
+      {
+        System.out.println("Error parsing int property '" + property
+                + "' with value '" + string + "'");
+      }
+    }
+
+    return def;
+  }
+
   /**
    * These methods are used when checking if the saved preference is different
    * to the default setting
@@ -621,15 +642,15 @@ public class Cache
    * @param obj
    *          String value of property
    * 
-   * @return String value of property
+   * @return previous value of property (or null)
    */
-  public static String setProperty(String key, String obj)
+  public static Object setProperty(String key, String obj)
   {
-
+    Object oldValue = null;
     try
     {
-      applicationProperties.setProperty(key, obj);
-      if (!propsAreReadOnly)
+      oldValue = applicationProperties.setProperty(key, obj);
+      if (propertiesFile != null && !propsAreReadOnly)
       {
         FileOutputStream out = new FileOutputStream(propertiesFile);
         applicationProperties.store(out, "---JalviewX Properties File---");
@@ -637,10 +658,10 @@ public class Cache
       }
     } catch (Exception ex)
     {
-      System.out.println("Error setting property: " + key + " " + obj
-              + "\n" + ex);
+      System.out.println(
+              "Error setting property: " + key + " " + obj + "\n" + ex);
     }
-    return obj;
+    return oldValue;
   }
 
   /**
@@ -689,15 +710,15 @@ public class Cache
     {
       try
       {
-        if (jalview.jbgui.GDesktop.class.getClassLoader().loadClass(
-                "uk.ac.vamsas.client.VorbaId") != null)
+        if (jalview.jbgui.GDesktop.class.getClassLoader()
+                .loadClass("uk.ac.vamsas.client.VorbaId") != null)
         {
-          jalview.bin.Cache.log
-                  .debug("Found Vamsas Classes (uk.ac..vamsas.client.VorbaId can be loaded)");
+          jalview.bin.Cache.log.debug(
+                  "Found Vamsas Classes (uk.ac..vamsas.client.VorbaId can be loaded)");
           vamsasJarsArePresent = 1;
           Logger lvclient = Logger.getLogger("uk.ac.vamsas");
-          lvclient.setLevel(Level.toLevel(Cache.getDefault(
-                  "logs.Vamsas.Level", Level.INFO.toString())));
+          lvclient.setLevel(Level.toLevel(Cache
+                  .getDefault("logs.Vamsas.Level", Level.INFO.toString())));
 
           lvclient.addAppender(log.getAppender("JalviewLogger"));
           // Tell the user that debug is enabled
@@ -728,15 +749,15 @@ public class Cache
     {
       try
       {
-        if (Cache.class.getClassLoader().loadClass(
-                "groovy.lang.GroovyObject") != null)
+        if (Cache.class.getClassLoader()
+                .loadClass("groovy.lang.GroovyObject") != null)
         {
-          jalview.bin.Cache.log
-                  .debug("Found Groovy (groovy.lang.GroovyObject can be loaded)");
+          jalview.bin.Cache.log.debug(
+                  "Found Groovy (groovy.lang.GroovyObject can be loaded)");
           groovyJarsArePresent = 1;
           Logger lgclient = Logger.getLogger("groovy");
-          lgclient.setLevel(Level.toLevel(Cache.getDefault(
-                  "logs.Groovy.Level", Level.INFO.toString())));
+          lgclient.setLevel(Level.toLevel(Cache
+                  .getDefault("logs.Groovy.Level", Level.INFO.toString())));
 
           lgclient.addAppender(log.getAppender("JalviewLogger"));
           // Tell the user that debug is enabled
@@ -777,15 +798,14 @@ public class Cache
         // try to get the tracker class
         try
         {
-          jgoogleanalyticstracker = Cache.class
-                  .getClassLoader()
-                  .loadClass(
-                          "com.boxysystems.jgoogleanalytics.JGoogleAnalyticsTracker");
-          trackerfocus = Cache.class.getClassLoader().loadClass(
-                  "com.boxysystems.jgoogleanalytics.FocusPoint");
+          jgoogleanalyticstracker = Cache.class.getClassLoader().loadClass(
+                  "com.boxysystems.jgoogleanalytics.JGoogleAnalyticsTracker");
+          trackerfocus = Cache.class.getClassLoader()
+                  .loadClass("com.boxysystems.jgoogleanalytics.FocusPoint");
         } catch (Exception e)
         {
-          log.debug("com.boxysystems.jgoogleanalytics package is not present - tracking not enabled.");
+          log.debug(
+                  "com.boxysystems.jgoogleanalytics package is not present - tracking not enabled.");
           tracker = null;
           jgoogleanalyticstracker = null;
           trackerfocus = null;
@@ -799,22 +819,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" });
-        jgoogleanalyticstracker.getMethod("trackAsynchronously",
-                new Class[] { trackerfocus }).invoke(
-                tracker,
-                new Object[] { trackerfocus.getConstructor(
-                        new Class[] { String.class }).newInstance(
-                        new Object[] { "Application Started." }) });
+        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." }) });
       } catch (RuntimeException e)
       {
         re = e;
@@ -831,42 +851,45 @@ public class Cache
         {
           if (re != null)
           {
-            log.debug("Caught runtime exception in googletracker init:", re);
+            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);
+                            + vrs,
+                    ex);
           }
           if (err != null)
           {
             log.error(
                     "Whilst initing GoogleTracker for Jalview Desktop version "
-                            + vrs, err);
+                            + vrs,
+                    err);
           }
         }
         else
         {
           if (re != null)
           {
-            System.err
-                    .println("Debug: Caught runtime exception in googletracker init:"
+            System.err.println(
+                    "Debug: Caught runtime exception in googletracker init:"
                             + vrs);
             re.printStackTrace();
           }
           if (ex != null)
           {
-            System.err
-                    .println("Warning:  Failed to initialise GoogleTracker for Jalview Desktop with version "
+            System.err.println(
+                    "Warning:  Failed to initialise GoogleTracker for Jalview Desktop with version "
                             + vrs);
             ex.printStackTrace();
           }
 
           if (err != null)
           {
-            System.err
-                    .println("ERROR: Whilst initing GoogleTracker for Jalview Desktop version "
+            System.err.println(
+                    "ERROR: Whilst initing GoogleTracker for Jalview Desktop version "
                             + vrs);
             err.printStackTrace();
           }
@@ -976,22 +999,6 @@ public class Cache
     return null;
   }
 
-  private static DasSourceRegistryI sourceRegistry = null;
-
-  /**
-   * initialise and ..
-   * 
-   * @return instance of the das source registry
-   */
-  public static DasSourceRegistryI getDasSourceRegistry()
-  {
-    if (sourceRegistry == null)
-    {
-      sourceRegistry = new DasSourceRegistry();
-    }
-    return sourceRegistry;
-  }
-
   /**
    * Set the specified value, or remove it if null or empty. Does not save the
    * properties file.
@@ -1027,7 +1034,7 @@ public class Cache
     {
       return;
     }
-  
+
     // In case colours can't be loaded, we'll remove them
     // from the default list here.
     StringBuffer coloursFound = new StringBuffer();
@@ -1037,7 +1044,7 @@ public class Cache
       String file = st.nextToken();
       try
       {
-        UserColourScheme ucs = ColourSchemes.loadColourScheme(file);
+        UserColourScheme ucs = ColourSchemeLoader.loadColourScheme(file);
         if (ucs != null)
         {
           if (coloursFound.length() > 0)
@@ -1056,12 +1063,53 @@ public class Cache
     {
       if (coloursFound.toString().length() > 1)
       {
-        setProperty(UserDefinedColours.USER_DEFINED_COLOURS, coloursFound.toString());
+        setProperty(UserDefinedColours.USER_DEFINED_COLOURS,
+                coloursFound.toString());
       }
       else
       {
-        applicationProperties.remove(UserDefinedColours.USER_DEFINED_COLOURS);
+        applicationProperties
+                .remove(UserDefinedColours.USER_DEFINED_COLOURS);
       }
     }
   }
+
+  /**
+   * 
+   * @return Jalview version, build details and JVM platform version for console
+   */
+  public static String getVersionDetailsForConsole()
+  {
+    return "Jalview Version: "
+            + jalview.bin.Cache.getDefault("VERSION", "TEST")
+            + "\n" + "Jalview Installation: "
+            + jalview.bin.Cache.getDefault("INSTALLATION",
+                    "unknown")
+            + "\n" + "Build Date: "
+            + jalview.bin.Cache.getDefault("BUILD_DATE", "unknown")
+            + "\n" + "Java version: "
+            + System.getProperty("java.version") + "\n"
+            + System.getProperty("os.arch") + " "
+            + System.getProperty("os.name") + " "
+            + System.getProperty("os.version")
+            + (jalview.bin.Cache.getDefault("VERSION", "TEST")
+                    .equals("DEVELOPMENT")
+                            ? "\nJava path:"
+                                    + System.getProperty(
+                                            "java.home")
+                                    + File.separator + "bin"
+                                    + File.separator + "java"
+                            : "");
+  }
+
+  /**
+   * 
+   * @return build details as reported in splashscreen
+   */
+  public static String getBuildDetailsForSplash()
+  {
+    // consider returning more human friendly info
+    // eg 'built from Source' or update channel
+    return jalview.bin.Cache.getDefault("INSTALLATION", "unknown");
+  }
 }