JAL-1551 spotlessApply
[jalview.git] / src / jalview / bin / Cache.java
index 8eef930..6b33fea 100755 (executable)
@@ -24,7 +24,9 @@ import java.awt.Color;
 import java.io.BufferedReader;
 import java.io.File;
 import java.io.FileInputStream;
+import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
+import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.io.PrintWriter;
@@ -34,7 +36,9 @@ import java.net.PasswordAuthentication;
 import java.net.URL;
 import java.text.DateFormat;
 import java.text.SimpleDateFormat;
+import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.Date;
 import java.util.Enumeration;
@@ -42,7 +46,6 @@ import java.util.Locale;
 import java.util.Properties;
 import java.util.StringTokenizer;
 import java.util.TreeSet;
-import java.util.regex.Pattern;
 
 import javax.swing.LookAndFeel;
 import javax.swing.UIManager;
@@ -171,6 +174,8 @@ import jalview.ws.sifts.SiftsSettings;
  * <li>FOLLOW_SELECTIONS (true) Controls whether a new alignment view should
  * respond to selections made in other alignments containing the same sequences.
  * </li>
+ * <li>SHOW_JWS2_SERVICES (true) when set to false, jalview will not
+ * auto-discover JABAWS services</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>
@@ -239,6 +244,9 @@ public class Cache
    */
   public static final String JALVIEWLOGLEVEL = "logs.Jalview.level";
 
+  // for tests
+  public static final String BOOTSTRAP_TEST = "BOOTSTRAP_TEST";
+
   /**
    * Sifts settings
    */
@@ -319,8 +327,20 @@ public class Cache
   /** Default file is ~/.jalview_properties */
   static String propertiesFile;
 
+  private static final String fallbackPropertiesFile = ".jalview_properties";
+
   private static boolean propsAreReadOnly = Platform.isJS();
 
+  public static boolean isPropsAreReadOnly()
+  {
+    return propsAreReadOnly;
+  }
+
+  public static void setPropsAreReadOnly(boolean propsAreReadOnly)
+  {
+    Cache.propsAreReadOnly = propsAreReadOnly;
+  }
+
   private final static String JS_PROPERTY_PREFIX = "jalview_";
 
   /**
@@ -336,7 +356,7 @@ public class Cache
     {
       String channelPrefsFilename = ChannelProperties
               .getProperty("preferences.filename");
-      String releasePrefsFilename = ".jalview_properties";
+      String releasePrefsFilename = fallbackPropertiesFile;
       propertiesFile = System.getProperty("user.home") + File.separatorChar
               + channelPrefsFilename;
       releasePropertiesFile = System.getProperty("user.home")
@@ -363,10 +383,13 @@ public class Cache
         {
           // props file provided as URL
           fis = new URL(propertiesFile).openStream();
-          System.out.println(
-                  "Loading jalview properties from : " + propertiesFile);
-          System.out.println(
-                  "Disabling Jalview writing to user's local properties file.");
+          if (!Jalview.quiet())
+          {
+            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)
         {
@@ -394,7 +417,8 @@ public class Cache
         fis.close();
       } catch (Exception ex)
       {
-        System.out.println("Error reading properties file: " + ex);
+        if (!Jalview.quiet())
+          System.out.println("Error reading properties file: " + ex);
       }
     }
 
@@ -450,7 +474,8 @@ public class Cache
       }
     } catch (Exception ex)
     {
-      System.out.println("Error reading author details: " + ex);
+      if (!Jalview.quiet())
+        System.out.println("Error reading author details: " + ex);
       authorDetails = null;
     }
     if (authorDetails == null)
@@ -513,29 +538,36 @@ public class Cache
           if (orgtimeout == null)
           {
             orgtimeout = "30";
-            System.out.println("# INFO: Setting default net timeout to "
-                    + orgtimeout + " seconds.");
+            Console.debug("Setting default net timeout to " + orgtimeout
+                    + " seconds.");
           }
           String remoteVersion = null;
-          try
+          if (remoteBuildPropertiesUrl.startsWith("http"))
           {
-            System.setProperty("sun.net.client.defaultConnectTimeout",
-                    "5000");
-            java.net.URL url = new java.net.URL(remoteBuildPropertiesUrl);
+            try
+            {
+              System.setProperty("sun.net.client.defaultConnectTimeout",
+                      "5000");
 
-            BufferedReader in = new BufferedReader(
-                    new InputStreamReader(url.openStream()));
+              URL url = new URL(remoteBuildPropertiesUrl);
 
-            Properties remoteBuildProperties = new Properties();
-            remoteBuildProperties.load(in);
-            remoteVersion = remoteBuildProperties.getProperty("VERSION");
-          } catch (Exception ex)
-          {
-            System.out
-                    .println("Non-fatal exception when checking version at "
-                            + remoteBuildPropertiesUrl + ":");
-            System.out.println(ex);
-            remoteVersion = getProperty("VERSION");
+              BufferedReader in = new BufferedReader(
+                      new InputStreamReader(url.openStream()));
+
+              Properties remoteBuildProperties = new Properties();
+              remoteBuildProperties.load(in);
+              remoteVersion = remoteBuildProperties.getProperty("VERSION");
+            } catch (Exception ex)
+            {
+              if (!Jalview.quiet())
+              {
+                System.out.println(
+                        "Non-fatal exception when checking version at "
+                                + remoteBuildPropertiesUrl + ":");
+                System.out.println(ex);
+              }
+              remoteVersion = getProperty("VERSION");
+            }
           }
           System.setProperty("sun.net.client.defaultConnectTimeout",
                   orgtimeout);
@@ -625,9 +657,15 @@ public class Cache
         applicationProperties.put("VERSION",
                 buildProperties.getProperty("VERSION"));
       }
+      if (buildProperties.getProperty("JAVA_COMPILE_VERSION", null) != null)
+      {
+        applicationProperties.put("JAVA_COMPILE_VERSION",
+                buildProperties.getProperty("JAVA_COMPILE_VERSION"));
+      }
     } catch (Exception ex)
     {
-      System.out.println("Error reading build details: " + ex);
+      if (!Jalview.quiet())
+        System.out.println("Error reading build details: " + ex);
       applicationProperties.remove("VERSION");
     }
     String codeVersion = getProperty("VERSION");
@@ -648,7 +686,7 @@ public class Cache
     if (printVersion && reportVersion)
     {
       System.out.println(ChannelProperties.getProperty("app_name")
-              + " Version: " + codeVersion + codeInstallation);
+              + " version: " + codeVersion + codeInstallation);
     }
   }
 
@@ -709,8 +747,9 @@ public class Cache
         def = Integer.parseInt(string);
       } catch (NumberFormatException e)
       {
-        System.out.println("Error parsing int property '" + property
-                + "' with value '" + string + "'");
+        if (!Jalview.quiet())
+          System.out.println("Error parsing int property '" + property
+                  + "' with value '" + string + "'");
       }
     }
 
@@ -751,8 +790,9 @@ public class Cache
       }
     } catch (Exception ex)
     {
-      System.out.println(
-              "Error setting property: " + key + " " + obj + "\n" + ex);
+      if (!Jalview.quiet())
+        System.out.println(
+                "Error setting property: " + key + " " + obj + "\n" + ex);
     }
     return oldValue;
   }
@@ -782,7 +822,8 @@ public class Cache
         out.close();
       } catch (Exception ex)
       {
-        System.out.println("Error saving properties: " + ex);
+        if (!Jalview.quiet())
+          System.out.println("Error saving properties: " + ex);
       }
     }
   }
@@ -806,11 +847,13 @@ public class Cache
         if (jalview.jbgui.GDesktop.class.getClassLoader()
                 .loadClass("uk.ac.vamsas.client.VorbaId") != null)
         {
-          Console.debug("Found Vamsas Classes (uk.ac..vamsas.client.VorbaId can be loaded)");
+          Console.debug(
+                  "Found Vamsas Classes (uk.ac..vamsas.client.VorbaId can be loaded)");
           vamsasJarsArePresent = 1;
           JLoggerLog4j lvclient = JLoggerLog4j.getLogger("uk.ac.vamsas",
                   Console.getCachedLogLevel("logs.Vamsas.Level"));
-          JLoggerLog4j.addAppender(lvclient, Console.log, JALVIEW_LOGGER_NAME);
+          JLoggerLog4j.addAppender(lvclient, Console.log,
+                  JALVIEW_LOGGER_NAME);
           // Tell the user that debug is enabled
           lvclient.debug(ChannelProperties.getProperty("app_name")
                   + " Vamsas Client Debugging Output Follows.");
@@ -843,11 +886,13 @@ public class Cache
         if (Cache.class.getClassLoader()
                 .loadClass("groovy.lang.GroovyObject") != null)
         {
-          Console.debug("Found Groovy (groovy.lang.GroovyObject can be loaded)");
+          Console.debug(
+                  "Found Groovy (groovy.lang.GroovyObject can be loaded)");
           groovyJarsArePresent = 1;
           JLoggerLog4j lgclient = JLoggerLog4j.getLogger("groovy",
                   Console.getCachedLogLevel("logs.Groovy.Level"));
-          JLoggerLog4j.addAppender(lgclient, Console.log, JALVIEW_LOGGER_NAME);
+          JLoggerLog4j.addAppender(lgclient, Console.log,
+                  JALVIEW_LOGGER_NAME);
           // Tell the user that debug is enabled
           lgclient.debug(ChannelProperties.getProperty("app_name")
                   + " Groovy Client Debugging Output Follows.");
@@ -893,7 +938,8 @@ public class Cache
                   .loadClass("com.boxysystems.jgoogleanalytics.FocusPoint");
         } catch (Exception e)
         {
-          Console.debug("com.boxysystems.jgoogleanalytics package is not present - tracking not enabled.");
+          Console.debug(
+                  "com.boxysystems.jgoogleanalytics package is not present - tracking not enabled.");
           tracker = null;
           jgoogleanalyticstracker = null;
           trackerfocus = null;
@@ -936,17 +982,22 @@ public class Cache
       {
         if (re != null)
         {
-          Console.debug("Caught runtime exception in googletracker init:", re);
+          Console.debug("Caught runtime exception in googletracker init:",
+                  re);
         }
         if (ex != null)
         {
-          Console.warn("Failed to initialise GoogleTracker for Jalview Desktop with version "
-                  + vrs, ex);
+          Console.warn(
+                  "Failed to initialise GoogleTracker for Jalview Desktop with version "
+                          + vrs,
+                  ex);
         }
         if (err != null)
         {
-          Console.error("Whilst initing GoogleTracker for Jalview Desktop version "
-                  + vrs, err);
+          Console.error(
+                  "Whilst initing GoogleTracker for Jalview Desktop version "
+                          + vrs,
+                  err);
         }
       }
       else
@@ -973,7 +1024,8 @@ public class Cache
     Color col = ColorUtils.parseColourString(colprop);
     if (col == null)
     {
-      Console.warn("Couldn't parse '" + colprop + "' as a colour for " + property);
+      Console.warn("Couldn't parse '" + colprop + "' as a colour for "
+              + property);
     }
     return (col == null) ? defcolour : col;
   }
@@ -1109,7 +1161,8 @@ public class Cache
         }
       } catch (Exception ex)
       {
-        System.out.println("Error loading User ColourFile\n" + ex);
+        if (!Jalview.quiet())
+          System.out.println("Error loading User ColourFile\n" + ex);
       }
     }
     if (!files.equals(coloursFound.toString()))
@@ -1141,8 +1194,11 @@ public class Cache
     {
       return;
     }
-    String line = prefix + (value != null ? value : defaultValue) + suffix;
-    sb.append(line);
+    if (prefix != null)
+      sb.append(prefix);
+    sb.append(value == null ? defaultValue : value);
+    if (suffix != null)
+      sb.append(suffix);
   }
 
   /**
@@ -1166,6 +1222,7 @@ public class Cache
     sb.append("Java version: ");
     sb.append(System.getProperty("java.version"));
     sb.append("\n");
+    sb.append("Java platform: ");
     sb.append(System.getProperty("os.arch"));
     sb.append(" ");
     sb.append(System.getProperty("os.name"));
@@ -1186,17 +1243,19 @@ public class Cache
     sb.append(" (");
     sb.append(lafClass);
     sb.append(")\n");
-    // Not displayed in release version ( determined by possible version number
-    // regex 9[9.]*9[.-_a9]* )
-    if (Pattern.matches("^\\d[\\d\\.]*\\d[\\.\\-\\w]*$",
-            Cache.getDefault("VERSION", "TEST")))
+    appendIfNotNull(sb, "Channel: ",
+            ChannelProperties.getProperty("channel"), "\n", null);
+    if (Console.isDebugEnabled()
+            || !"release".equals(ChannelProperties.getProperty("channel")))
     {
       appendIfNotNull(sb, "Getdown appdir: ",
-              System.getProperty("getdownappdir"), "\n", null);
+              System.getProperty("getdowninstanceappdir"), "\n", null);
       appendIfNotNull(sb, "Getdown appbase: ",
-              System.getProperty("getdownappbase"), "\n", null);
+              System.getProperty("getdowninstanceappbase"), "\n", null);
       appendIfNotNull(sb, "Java home: ", System.getProperty("java.home"),
               "\n", "unknown");
+      appendIfNotNull(sb, "Preferences file: ", propertiesFile, "\n",
+              "unknown");
     }
     return sb.toString();
   }
@@ -1353,8 +1412,10 @@ public class Cache
         char[] displayHttpPw = new char[httpPassword == null ? 0
                 : httpPassword.length];
         Arrays.fill(displayHttpPw, '*');
-        Console.debug("CACHE Proxy: setting new Authenticator with httpUser='"
-                + httpUser + "' httpPassword='" + displayHttpPw + "'");
+        Console.debug(
+                "CACHE Proxy: setting new Authenticator with httpUser='"
+                        + httpUser + "' httpPassword='" + displayHttpPw
+                        + "'");
         if (!Platform.isJS())
         /* *
          * java.net.Authenticator not implemented in SwingJS yet
@@ -1467,14 +1528,16 @@ public class Cache
        * 
        */
       {
-        Console.debug("AUTHENTICATOR setting default Authenticator to null");
+        Console.debug(
+                "AUTHENTICATOR setting default Authenticator to null");
         Authenticator.setDefault(null);
       }
     }
 
     // nonProxyHosts not currently configurable in Preferences
-    Console.debug("AUTHENTICATOR setting property 'http.nonProxyHosts' to \""
-            + nonProxyHosts + "\"");
+    Console.debug(
+            "AUTHENTICATOR setting property 'http.nonProxyHosts' to \""
+                    + nonProxyHosts + "\"");
     setOrClearSystemProperty("http.nonProxyHosts", nonProxyHosts);
   }
 
@@ -1572,4 +1635,63 @@ public class Cache
     String appbase = getGetdownAppbase();
     return appbase + "/" + getdownDistDir + "/build_properties";
   }
+
+  private static final Collection<String> bootstrapProperties = new ArrayList<>(
+          Arrays.asList(JALVIEWLOGLEVEL, BOOTSTRAP_TEST));
+
+  public static Properties bootstrapProperties(String filename)
+  {
+    Properties bootstrapProps = new Properties();
+    File file = null;
+    if (filename != null)
+    {
+      file = new File(filename);
+    }
+    if (file == null || !file.exists())
+    {
+      String channelPrefsFilename = ChannelProperties
+              .getProperty("preferences.filename");
+      String propertiesFilename = System.getProperty("user.home")
+              + File.separatorChar + channelPrefsFilename;
+      file = new File(propertiesFilename);
+    }
+    if (file == null || !file.exists())
+    {
+      String releasePrefsFilename = fallbackPropertiesFile;
+      String releasePropertiesFilename = System.getProperty("user.home")
+              + File.separatorChar + releasePrefsFilename;
+      file = new File(releasePropertiesFilename);
+    }
+
+    if (filename == null)
+      return null;
+    if (!file.exists())
+    {
+      System.err.println("Could not load bootstrap preferences file '"
+              + filename + "'");
+      return null;
+    }
+
+    try
+    {
+      FileInputStream in = new FileInputStream(file.getAbsoluteFile());
+      Properties props = new Properties();
+      props.load(in);
+      for (String prop : bootstrapProperties)
+      {
+        if (props.containsKey(prop))
+          bootstrapProps.put(prop, props.getProperty(prop));
+      }
+    } catch (FileNotFoundException e)
+    {
+      System.err.println("Could not find bootstrap preferences file '"
+              + file.getAbsolutePath() + "'");
+    } catch (IOException e)
+    {
+      System.err.println(
+              "IOException when loading bootstrap preferences file '"
+                      + file.getAbsolutePath() + "'");
+    }
+    return bootstrapProps;
+  }
 }