X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fbin%2FCache.java;h=3208a3627a07b79acc6f0f154f8edcbcfc7c437d;hb=841485c28403b4a8e00c9bddae9caa9411667b8a;hp=9e28f5d17ca82cf667d671e710d2bd68cd8e4ddc;hpb=17e4ea278bc9a5fb280db1252ce78b7a295215f5;p=jalview.git diff --git a/src/jalview/bin/Cache.java b/src/jalview/bin/Cache.java index 9e28f5d..3208a36 100755 --- a/src/jalview/bin/Cache.java +++ b/src/jalview/bin/Cache.java @@ -20,24 +20,13 @@ */ 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.util.Platform; -import jalview.ws.sifts.SiftsSettings; - import java.awt.Color; 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.net.URL; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Collections; @@ -53,6 +42,18 @@ import org.apache.log4j.Level; import org.apache.log4j.Logger; import org.apache.log4j.SimpleLayout; +import jalview.bin.ApplicationSingletonProvider.ApplicationSingletonI; +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.util.Platform; +import jalview.ws.sifts.SiftsSettings; + /** * Stores and retrieves Jalview Application Properties Lists and fields within * list entries are separated by '|' symbols unless otherwise stated (|) clauses @@ -207,8 +208,26 @@ import org.apache.log4j.SimpleLayout; * @author $author$ * @version $Revision$ */ -public class Cache +public class Cache implements ApplicationSingletonI { + + private Cache() + { + // private singleton + } + + /** + * In Java, this will be a static field instance, which will be + * application-specific; in JavaScript it will be an applet-specific instance + * tied to the applet's ThreadGroup. + * + * @return + */ + public static Cache getInstance() + { + return (Cache) ApplicationSingletonProvider.getInstance(Cache.class); + } + /** * property giving log4j level for CASTOR loggers */ @@ -227,10 +246,8 @@ public class Cache /** * Sifts settings */ - public static final String DEFAULT_SIFTS_DOWNLOAD_DIR = System - .getProperty("user.home") + File.separatorChar - + ".sifts_downloads" + File.separatorChar; - + public static final String DEFAULT_SIFTS_DOWNLOAD_DIR = Platform.getUserPath(".sifts_downloads/"); + private final static String DEFAULT_CACHE_THRESHOLD_IN_DAYS = "2"; private final static String DEFAULT_FAIL_SAFE_PID_THRESHOLD = "30"; @@ -238,8 +255,7 @@ public class Cache /** * Identifiers.org download settings */ - private static final String ID_ORG_FILE = System.getProperty("user.home") - + File.separatorChar + ".identifiers.org.ids.json"; + private static final String ID_ORG_FILE = Platform.getUserPath(".identifiers.org.ids.json"); /** * Allowed values are PDB or mmCIF @@ -265,7 +281,7 @@ public class Cache public static Logger log; /** Jalview Properties */ - public static Properties applicationProperties = new Properties() + private Properties applicationProperties = new Properties() { // override results in properties output in alphabetical order @Override @@ -312,6 +328,9 @@ public class Cache // lcastor = Logger.getLogger("org.exolab.castor.xml.Marshaller"); // lcastor.setLevel(Level.toLevel(Cache.getDefault("logs.Castor.Level", // Level.INFO.toString()))); + // we shouldn't need to do this + org.apache.log4j.Logger.getRootLogger().setLevel(org.apache.log4j.Level.INFO); + jalview.bin.Cache.log.setLevel(Level.toLevel(Cache .getDefault("logs.Jalview.level", Level.INFO.toString()))); // laxis.addAppender(ap); @@ -332,11 +351,18 @@ public class Cache */ public static void loadProperties(String propsFile) { + + getInstance().loadPropertiesImpl(propsFile); + + } + + private void loadPropertiesImpl(String propsFile) + { + propertiesFile = propsFile; if (propsFile == null && !propsAreReadOnly) { - propertiesFile = System.getProperty("user.home") + File.separatorChar - + ".jalview_properties"; + propertiesFile = Platform.getUserPath(".jalview_properties"); } else { @@ -396,13 +422,13 @@ public class Cache } // LOAD THE AUTHORS FROM THE authors.props file - String authorDetails = resolveResourceURLFor("authors.props"); + String authorDetails = resolveResourceURLFor("/authors.props"); try { if (authorDetails != null) { - java.net.URL localJarFileURL = new java.net.URL(authorDetails); + URL localJarFileURL = new URL(authorDetails); InputStream in = localJarFileURL.openStream(); applicationProperties.load(in); in.close(); @@ -414,9 +440,9 @@ public class Cache } if (authorDetails == null) { - applicationProperties.remove("AUTHORS"); - applicationProperties.remove("AUTHORFNAMES"); - applicationProperties.remove("YEAR"); + applicationProperties.remove("AUTHORS"); + applicationProperties.remove("AUTHORFNAMES"); + applicationProperties.remove("YEAR"); } loadBuildProperties(false); @@ -449,7 +475,8 @@ public class Cache String jnlpVersion = System.getProperty("jalview.version"); - // jnlpVersion will be null if a latest version check for the channel needs to + // 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 @@ -542,7 +569,8 @@ public class Cache url = Cache.class.getResource(resourcePath).toString(); } catch (Exception ex) { - + System.err.println("Failed to resolve resource " + resourcePath + + ": " + ex.getMessage()); } } else @@ -553,20 +581,19 @@ public class Cache return url; } - public static void loadBuildProperties(boolean reportVersion) + public void loadBuildProperties(boolean reportVersion) { String codeInstallation = getProperty("INSTALLATION"); - boolean printV = codeInstallation == null; + boolean printVersion = codeInstallation == null; - // FIND THE VERSION NUMBER AND BUILD DATE FROM jalview.jar + /* + * read build properties - from the Jalview jar for a Java distribution, + * or from codebase file in test or JalviewJS context + */ try { - String buildDetails = "jar:".concat(Cache.class.getProtectionDomain() - .getCodeSource().getLocation().toString() - .concat("!/.build_properties")); - - java.net.URL localJarFileURL = new java.net.URL(buildDetails); - + String buildDetails = resolveResourceURLFor("/.build_properties"); + URL localJarFileURL = new URL(buildDetails); InputStream in = localJarFileURL.openStream(); applicationProperties.load(in); in.close(); @@ -590,14 +617,14 @@ public class Cache } setProperty("VERSION", codeVersion); new BuildDetails(codeVersion, null, codeInstallation); - if (printV && reportVersion) + if (printVersion && reportVersion) { - System.out - .println("Jalview Version: " + codeVersion + codeInstallation); + System.out.println( + "Jalview Version: " + codeVersion + codeInstallation); } } - private static void deleteBuildProperties() + private void deleteBuildProperties() { applicationProperties.remove("LATEST_VERSION"); applicationProperties.remove("VERSION"); @@ -619,12 +646,12 @@ public class Cache */ public static String getProperty(String key) { - String prop = applicationProperties.getProperty(key); - if (prop == null && Platform.isJS()) - { - prop = applicationProperties.getProperty(Platform.getUniqueAppletID() - + "_" + JS_PROPERTY_PREFIX + key); - } + String prop = getInstance().applicationProperties.getProperty(key); + // if (prop == null && Platform.isJS()) + // { + // prop = applicationProperties.getProperty(Platform.getUniqueAppletID() + // + "_" + JS_PROPERTY_PREFIX + key); + // } return prop; } @@ -684,33 +711,48 @@ public class Cache */ public static Object setProperty(String key, String obj) { - Object oldValue = null; - try - { - oldValue = applicationProperties.setProperty(key, obj); - if (propertiesFile != null && !propsAreReadOnly) - { - FileOutputStream out = new FileOutputStream(propertiesFile); - applicationProperties.store(out, "---JalviewX Properties File---"); - out.close(); - } - } catch (Exception ex) - { - System.out.println( - "Error setting property: " + key + " " + obj + "\n" + ex); - } - return oldValue; + return getInstance().setPropertyImpl(key, obj, true); } /** - * remove the specified property from the jalview properties file + * Removes the specified property from the jalview properties file * - * @param string + * @param key */ - public static void removeProperty(String string) + public static void removeProperty(String key) { - applicationProperties.remove(string); - saveProperties(); + getInstance().removePropertyImpl(key, true); + } + + /** + * Removes the named property for the running application, without saving the + * properties file + * + * BH noting that ColourMenuHelper calls this. If the intent is to save, then + * simply chanet that call to removeProperty(key). + * + * @param key + */ + public static void removePropertyNoSave(String key) + { + + getInstance(). + + removePropertyImpl(key, false); + } + + /** + * Removes the named property, and optionally saves the current properties to + * file + * + * @param key + * @param andSave + */ + private void removePropertyImpl(String key, boolean andSave) + { + applicationProperties.remove(key); + if (andSave) + saveProperties(); } /** @@ -718,6 +760,15 @@ public class Cache */ public static void saveProperties() { + getInstance().savePropertiesImpl(); + } + + /** + * save the properties to the jalview properties path + */ + private void savePropertiesImpl() + + { if (!propsAreReadOnly) { try @@ -969,9 +1020,9 @@ public class Cache * @param property * @param colour */ - public static void setColourProperty(String property, Color colour) + public static void setColourPropertyNoSave(String property, Color colour) { - setProperty(property, jalview.util.Format.getHexString(colour)); + setPropertyNoSave(property, jalview.util.Format.getHexString(colour)); } /** @@ -999,11 +1050,16 @@ public class Cache public static Date getDateProperty(String propertyName) { String val = getProperty(propertyName); + if (val != null) { try { - return date_format.parse(val); + if ((val = val.trim()).indexOf(",") < 0 && val.indexOf("-") >= 0 && val.indexOf(" ") == val.lastIndexOf(" ")) { + val = val.replace(" ",", ").replace('-',' '); + } + Date date = date_format.parse(val); + return date; } catch (Exception ex) { System.err.println("Invalid or corrupt date in property '" @@ -1052,11 +1108,11 @@ public class Cache } if (value == null || value.trim().length() < 1) { - Cache.applicationProperties.remove(propName); + getInstance().applicationProperties.remove(propName); } else { - Cache.applicationProperties.setProperty(propName, value); + getInstance().applicationProperties.setProperty(propName, value); } } @@ -1106,38 +1162,67 @@ public class Cache } else { - applicationProperties + getInstance().applicationProperties .remove(UserDefinedColours.USER_DEFINED_COLOURS); } } } /** + * Initial logging information helper for various versions output + * + * @param prefix + * @param value + * @param defaultValue + */ + private static void appendIfNotNull(StringBuilder sb, String prefix, + String value, String suffix, String defaultValue) + { + if (value == null && defaultValue == null) + { + return; + } + String line = prefix + (value != null ? value : defaultValue) + suffix; + sb.append(line); + } + + /** * * @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") + " " + StringBuilder sb = new StringBuilder(); + sb.append("Jalview Version: " + + jalview.bin.Cache.getDefault("VERSION", "TEST")); + sb.append("\n"); + sb.append("Jalview Installation: " + + jalview.bin.Cache.getDefault("INSTALLATION", "unknown")); + sb.append("\n"); + sb.append("Build Date: " + + jalview.bin.Cache.getDefault("BUILD_DATE", "unknown")); + sb.append("\n"); + sb.append("Java version: " + System.getProperty("java.version")); + sb.append("\n"); + sb.append(System.getProperty("os.arch") + " " + System.getProperty("os.name") + " " - + System.getProperty("os.version") - + (jalview.bin.Cache.getDefault("VERSION", "TEST") - .equals("DEVELOPMENT") - ? "\nGetdown appdir: " + System.getProperty("getdownappdir") + "\nJava path: " - + System.getProperty( - "java.home") - + File.separator + "bin" - + File.separator + "java" - : ""); + + System.getProperty("os.version")); + sb.append("\n"); + appendIfNotNull(sb, "Install4j version: ", + System.getProperty("sys.install4jVersion"), "\n", null); + appendIfNotNull(sb, "Install4j template version: ", + System.getProperty("installer_template_version"), "\n", null); + appendIfNotNull(sb, "Launcher version: ", + System.getProperty("launcher_version"), "\n", null); + if (jalview.bin.Cache.getDefault("VERSION", "TEST") + .equals("DEVELOPMENT")) + { + appendIfNotNull(sb, "Getdown appdir: ", + System.getProperty("getdownappdir"), "\n", null); + appendIfNotNull(sb, "Java home: ", System.getProperty("java.home"), + "\n", "unknown"); + } + return sb.toString(); } /** @@ -1150,4 +1235,51 @@ public class Cache // eg 'built from Source' or update channel return jalview.bin.Cache.getDefault("INSTALLATION", "unknown"); } + + /** + * + * For AppletParams and Preferences ok_actionPerformed and + * startupFileTextfield_mouseClicked + * + * Sets a property value for the running application, without saving it to the + * properties file + * + * @param key + * @param obj + */ + public static void setPropertyNoSave(String key, String obj) + { + getInstance().setPropertyImpl(key, obj, false); + } + + /** + * Sets a property value, and optionally also saves the current properties to + * file + * + * @param key + * @param obj + * @param andSave + * @return + */ + private Object setPropertyImpl( + String key, String obj, boolean andSave) + { + Object oldValue = null; + try + { + oldValue = applicationProperties.setProperty(key, obj); + if (andSave && !propsAreReadOnly && propertiesFile != null) + { + FileOutputStream out = new FileOutputStream(propertiesFile); + applicationProperties.store(out, "---JalviewX Properties File---"); + out.close(); + } + } catch (Exception ex) + { + System.out.println( + "Error setting property: " + key + " " + obj + "\n" + ex); + } + return oldValue; + } + }