Remove redundancy in Eclipse
[jalview.git] / src / jalview / bin / Cache.java
index 226a925..c88c92a 100755 (executable)
-/********************\r
- * 2004 Jalview Reengineered\r
- * Barton Group\r
- * Dundee University\r
+/*\r
+ * Jalview - A Sequence Alignment Editor and Viewer\r
+ * Copyright (C) 2005 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle\r
  *\r
- * AM Waterhouse\r
- *******************/\r
+ * This program is free software; you can redistribute it and/or\r
+ * modify it under the terms of the GNU General Public License\r
+ * as published by the Free Software Foundation; either version 2\r
+ * of the License, or (at your option) any later version.\r
+ *\r
+ * This program is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+ * GNU General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License\r
+ * along with this program; if not, write to the Free Software\r
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA\r
+ */\r
+package jalview.bin;\r
 \r
+import java.io.*;\r
 \r
-package jalview.bin;\r
 import java.util.*;\r
-import java.io.*;\r
 \r
-import java.util.jar.*;\r
+import org.apache.log4j.Logger;\r
+import org.apache.log4j.SimpleLayout;\r
+import org.apache.log4j.Level;\r
+import org.apache.log4j.ConsoleAppender;\r
+\r
+\r
+/**\r
+ * Stores and retrieves Jalview Application Properties\r
+ * <br><br>Current properties include:\r
+ * <br>logs.Axis.Level - one of the stringified Levels for log4j controlling the logging level for axis (used for web services)\r
+ * <br>logs.Castor.Level - one of the stringified Levels for log4j controlling the logging level for castor (used for serialization)\r
+ * <br>logs.Jalview.Level - Cache.log stringified level.\r
+ * <br>DISCOVERY_START - Boolean - controls if discovery services are queried on startup\r
+ * <br>DISCOVERY_URLS - comma separated list of Discovery Service endpoints.\r
+ * <br>SCREEN_WIDTH,SCREEN_HEIGHT,SCREEN_Y=285,SCREEN_X=371,SHOW_FULLSCREEN\r
+ * FONT_NAME,FONT_SIZE,FONT_STYLE,GAP_SYMBOL,LAST_DIRECTORY,USER_DEFINED_COLOUR\r
+ * SHOW_FULL_ID,SHOW_IDENTITY,SHOW_QUALITY,SHOW_ANNOTATIONS,SHOW_CONSERVATION,\r
+ * DEFAULT_COLOUR,DEFAULT_FILE_FORMAT,STARTUP_FILE,SHOW_STARTUP_FILE\r
+\r
+ * @author $author$\r
+ * @version $Revision$\r
+ */\r
 public class Cache\r
 {\r
-  public static String  VERSION = "Release 2.0";\r
-  public static String  BUILD_DATE = "";\r
-\r
-  public static Properties applicationProperties;\r
-  // Current properties include:\r
-  //\r
-  // LAST_DIRECTORY   , use this to cache record of where the user looked to find a file\r
-  // UNIPROT_CACHE\r
-  // USER_DEFINED_COLOUR - file describing last user set colours\r
-  // FONT_NAME\r
-  // FONT_STYLE\r
-  // FONT_SIZE\r
-  // logs.Axis.Level - one of the stringified Levels for log4j controlling the logging level for axis (used for web services)\r
-  // jalview.browser - used in the jalview.utils.browserLauncher class if it doesn't know what else to do.\r
-  public static void loadProperties()\r
-  {\r
-    // get last build time.\r
-    long date = 0;\r
-    try{\r
-          String localFile = Cache.class.getProtectionDomain().getCodeSource().getLocation().toString();\r
-          localFile = localFile.concat("!/");\r
-          String tmpString = "jar:";\r
-          String localJarFileString = tmpString.concat(localFile);\r
-          java.net.URL localJarFileURL = new java.net.URL(localJarFileString);\r
-          java.net.JarURLConnection localJarFile = (java.net.JarURLConnection)localJarFileURL.openConnection();\r
-          date = localJarFile.getLastModified();\r
-    }catch(Exception ex){ex.printStackTrace();}\r
-    if(date==0)\r
+  /**\r
+   * Initialises the Apache Axis logger\r
+   */\r
+  public static Logger log;\r
+\r
+    /** Jalview Properties */\r
+    public static Properties applicationProperties = new Properties();\r
+\r
+    /** Default file is  ~/.jalview_properties */\r
+    static String propertiesFile;\r
+\r
+    public static void initLogger()\r
     {\r
-      // this is called for unpackaged class files, ie not in a Jar file\r
-      // InstallAnywhere version will find build date this way\r
-      // not entirely accurate as it only tells you when Cache.class was last compiled\r
+      try\r
+      {\r
+        Logger laxis = Logger.getLogger("org.apache.axis");\r
+        Logger lcastor = Logger.getLogger("org.exolab.castor");\r
+        jalview.bin.Cache.log = Logger.getLogger("jalview.bin.Jalview");\r
 \r
+        laxis.setLevel(Level.toLevel(Cache.getDefault("logs.Axis.Level",\r
+            Level.INFO.toString())));\r
+        lcastor.setLevel(Level.toLevel(Cache.getDefault("logs.Castor.Level",\r
+            Level.INFO.toString())));\r
+        jalview.bin.Cache.log.setLevel(Level.toLevel(Cache.getDefault(\r
+            "logs.Jalview.level",\r
+            Level.INFO.toString())));\r
 \r
-     java.io.File f = new java.io.File(System.getProperty("user.dir") + "/jalview/bin/Cache.class" );\r
-     date = f.lastModified();\r
-    }\r
+        ConsoleAppender ap = new ConsoleAppender(new SimpleLayout(),\r
+                                                 "System.err");\r
+        ap.setName("JalviewLogger");\r
 \r
-    if(date!=0)\r
-      BUILD_DATE = new Date( date ).toString();\r
+        laxis.addAppender(ap);\r
+        lcastor.addAppender(ap);\r
+        jalview.bin.Cache.log.addAppender(ap);\r
+      }\r
+      catch (Exception ex)\r
+      {\r
+      System.err.println("Problems initializing the log4j system\n");\r
+      }\r
+    }\r
 \r
-    applicationProperties = new Properties();\r
 \r
-    try\r
+    /** Called when Jalview is started */\r
+    public static void loadProperties(String propsFile)\r
     {\r
-      FileInputStream in = new FileInputStream(System.getProperty("user.home") +\r
-                                               "/.jalview_properties");\r
-      applicationProperties = new Properties();\r
-      applicationProperties.load(in);\r
-      in.close();\r
+        propertiesFile = propsFile;\r
+        if (propsFile == null)\r
+        {\r
+          propertiesFile = System.getProperty("user.home") + "/.jalview_properties";\r
+        }\r
+\r
+        try\r
+        {\r
+            FileInputStream fis = new FileInputStream(propertiesFile);\r
+            applicationProperties.load(fis);\r
+            applicationProperties.remove("LATEST_VERSION");\r
+            applicationProperties.remove("VERSION");\r
+            fis.close();\r
+        }\r
+        catch (Exception ex)\r
+        {\r
+          System.out.println("Error reading properties file: "+ex);\r
+        }\r
+\r
+      if(getDefault("USE_PROXY", false))\r
+      {\r
+          System.out.println("Using proxyServer: "+getDefault("PROXY_SERVER", null)+\r
+                           " proxyPort: "+getDefault("PROXY_PORT", null));\r
+          System.setProperty("http.proxyHost", getDefault("PROXY_SERVER", null));\r
+          System.setProperty("http.proxyPort", getDefault("PROXY_PORT", null));\r
+      }\r
+\r
+        // FIND THE VERSION NUMBER AND BUILD DATE FROM jalview.jar\r
+        // MUST FOLLOW READING OF LOCAL PROPERTIES FILE AS THE\r
+        // VERSION MAY HAVE CHANGED SINCE LAST USING JALVIEW\r
+         try\r
+         {\r
+             String buildDetails = "jar:"\r
+                 .concat(\r
+                 Cache.class.getProtectionDomain().getCodeSource().getLocation().toString()\r
+                 .concat("!/.build_properties")\r
+                 );\r
+\r
+             java.net.URL localJarFileURL = new java.net.URL(buildDetails);\r
+\r
+            InputStream in = localJarFileURL.openStream();\r
+            applicationProperties.load(in);\r
+            in.close();\r
+         }\r
+         catch (Exception ex)\r
+         {\r
+           System.out.println("Error reading build details: "+ex);\r
+           applicationProperties.remove("VERSION");\r
+        }\r
+\r
+        String jnlpVersion = System.getProperty("jalview.version");\r
+        String codeVersion = getProperty("VERSION");\r
+\r
+\r
+        if(codeVersion==null)\r
+        {\r
+          // THIS SHOULD ONLY BE THE CASE WHEN TESTING!!\r
+          codeVersion = "Test";\r
+          jnlpVersion = "Test";\r
+        }\r
+\r
+\r
+        System.out.println("Jalview Version: "+codeVersion);\r
+\r
+\r
+        // jnlpVersion will be null if we're using InstallAnywhere\r
+        // Dont do this check if running in headless mode\r
+        if(jnlpVersion==null && (\r
+                System.getProperty("java.awt.headless")==null\r
+             || System.getProperty("java.awt.headless").equals("false")))\r
+        {\r
+\r
+          class VersionChecker\r
+              extends Thread\r
+          {\r
+            public void run()\r
+            {\r
+              String jnlpVersion = null;\r
+              try\r
+              {\r
+                java.net.URL url = new java.net.URL(\r
+                    "http://www.jalview.org/webstart/jalview.jnlp");\r
+                BufferedReader in = new BufferedReader(new InputStreamReader(url.\r
+                    openStream()));\r
+                String line = null;\r
+                while ( (line = in.readLine()) != null)\r
+                {\r
+                  if (line.indexOf("jalview.version") == -1)\r
+                    continue;\r
+\r
+                  line = line.substring(line.indexOf("value=") + 7);\r
+                  line = line.substring(0, line.lastIndexOf("\""));\r
+                  jnlpVersion = line;\r
+                  break;\r
+                }\r
+              }\r
+              catch (Exception ex)\r
+              {\r
+                System.out.println(ex);\r
+                jnlpVersion = getProperty("VERSION");\r
+              }\r
+\r
+              setProperty("LATEST_VERSION", jnlpVersion);\r
+            }\r
+          }\r
+\r
+          VersionChecker vc = new VersionChecker();\r
+          vc.start();\r
+        }\r
+        else\r
+        {\r
+          if(jnlpVersion!=null)\r
+            setProperty("LATEST_VERSION", jnlpVersion);\r
+          else\r
+          applicationProperties.remove("LATEST_VERSION");\r
+        }\r
+\r
+        setProperty("VERSION", codeVersion);\r
+\r
+        //LOAD USERDEFINED COLOURS\r
+        jalview.gui.UserDefinedColours.initUserColourSchemes( getProperty("USER_DEFINED_COLOURS"));\r
     }\r
-    catch (Exception ex)\r
-    { }\r
-  }\r
-\r
-  public static String getProperty(String key)\r
-  {\r
-    return  applicationProperties.getProperty(key);\r
-  }\r
-\r
-  public static String setProperty(String key, String obj)\r
-  {\r
-    try\r
-    {\r
-      FileOutputStream out = new FileOutputStream(System.getProperty(\r
-          "user.home") + "/.jalview_properties");\r
 \r
-      applicationProperties.setProperty(key, obj);\r
 \r
-      applicationProperties.store(out, "---JalviewX Properties File---");\r
-      out.close();\r
+\r
+    /**\r
+     * Gets Jalview application property of given key. Returns null\r
+     * if key not found\r
+     *\r
+     * @param key Name of property\r
+     *\r
+     * @return Property value\r
+     */\r
+    public static String getProperty(String key)\r
+    {\r
+        return applicationProperties.getProperty(key);\r
     }\r
-    catch (Exception ex)\r
-    {}\r
 \r
-    return obj;\r
 \r
-  }\r
+    /** These methods are used when checking if the saved preference\r
+     * is different to the default setting\r
+     */\r
+\r
+    public static boolean getDefault(String property, boolean def)\r
+    {\r
+      String string = getProperty(property);\r
+      if (string != null)\r
+      {\r
+        def = Boolean.valueOf(string).booleanValue();\r
+      }\r
 \r
+      return def;\r
+    }\r
 \r
+    /** These methods are used when checking if the saved preference\r
+    * is different to the default setting\r
+    */\r
+    public static String getDefault(String property, String def)\r
+    {\r
+      String string = getProperty(property);\r
+      if (string != null)\r
+      {\r
+        return string;\r
+      }\r
 \r
+      return def;\r
+    }\r
 \r
 \r
+    /**\r
+     * Stores property in the file "HOME_DIR/.jalview_properties"\r
+     *\r
+     * @param key Name of object\r
+     * @param obj String value of property\r
+     *\r
+     * @return String value of property\r
+     */\r
+    public static String setProperty(String key, String obj)\r
+    {\r
+        try\r
+        {\r
+            FileOutputStream out = new FileOutputStream(propertiesFile);\r
+            applicationProperties.setProperty(key, obj);\r
+            applicationProperties.store(out, "---JalviewX Properties File---");\r
+            out.close();\r
+        }\r
+        catch (Exception ex)\r
+        {   System.out.println("Error setting property: "+key+" "+obj+"\n"+ex);   }\r
+        return obj;\r
+    }\r
+\r
+    public static void saveProperties()\r
+    {\r
+        try\r
+        {\r
+            FileOutputStream out = new FileOutputStream(propertiesFile);\r
+            applicationProperties.store(out, "---JalviewX Properties File---");\r
+            out.close();\r
+        }\r
+        catch (Exception ex)\r
+        {  System.out.println("Error saving properties: "+ex);  }\r
+    }\r
 }\r