*/
package jalview.bin;
+import jalview.bin.ApplicationSingletonProvider.ApplicationSingletonI;
import jalview.datamodel.PDBEntry;
-import jalview.gui.UserDefinedColours;
+import jalview.gui.Preferences;
import jalview.schemes.ColourSchemeLoader;
import jalview.schemes.ColourSchemes;
import jalview.schemes.UserColourScheme;
import jalview.ws.sifts.SiftsSettings;
import java.awt.Color;
+import java.awt.Dimension;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
* @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
+ */
+ private static Cache getInstance()
+ {
+ return (Cache) ApplicationSingletonProvider.getInstance(Cache.class);
+ }
+
/**
* property giving log4j level for CASTOR loggers
*/
public static Logger log;
/** Jalview Properties */
- public static Properties applicationProperties = new Properties()
+ // BH 2019.05.08 was static
+ @SuppressWarnings("serial")
+ private Properties applicationProperties = new Properties()
{
// override results in properties output in alphabetical order
@Override
};
/** Default file is ~/.jalview_properties */
- static String propertiesFile;
+ private String propertiesFile;
- private static boolean propsAreReadOnly = Platform.isJS();
+ /**
+ * flag to possibly allow properties to be written to a property file
+ */
+ private boolean propsAreReadOnly = Platform.isJS();
private final static String JS_PROPERTY_PREFIX = "jalview_";
jalview.bin.Cache.log = Logger.getLogger("jalview.bin.Jalview");
laxis.setLevel(Level.toLevel(
- Cache.getDefault("logs.Axis.Level", Level.INFO.toString())));
- lcastor.setLevel(Level.toLevel(Cache.getDefault("logs.Castor.Level",
- Level.INFO.toString())));
+ getDefault("logs.Axis.Level", Level.INFO.toString())));
+ lcastor.setLevel(Level.toLevel(
+ getDefault("logs.Castor.Level", Level.INFO.toString())));
lcastor = Logger.getLogger("org.exolab.castor.xml");
- lcastor.setLevel(Level.toLevel(Cache.getDefault("logs.Castor.Level",
- Level.INFO.toString())));
+ lcastor.setLevel(Level.toLevel(
+ getDefault("logs.Castor.Level", Level.INFO.toString())));
// lcastor = Logger.getLogger("org.exolab.castor.xml.Marshaller");
- // lcastor.setLevel(Level.toLevel(Cache.getDefault("logs.Castor.Level",
+ // lcastor.setLevel(Level.toLevel(getDefault("logs.Castor.Level",
// Level.INFO.toString())));
jalview.bin.Cache.log.setLevel(Level.toLevel(Cache
.getDefault("logs.Jalview.level", Level.INFO.toString())));
*/
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";
- }
- else
+ if (!propsAreReadOnly)
{
- // don't corrupt the file we've been given.
- propsAreReadOnly = true;
+ // Java only
+ if (propsFile == null)
+ {
+ propertiesFile = System.getProperty("user.home")
+ + File.separatorChar + ".jalview_properties";
+ }
+ else
+ {
+ // don't corrupt the file we've been given.
+ propsAreReadOnly = true;
+ }
}
if (propertiesFile == null)
- { // BH 2019
+ { // BH 2019 read properties from the Info object associated with this
+ // applet
Platform.readInfoProperties(JS_PROPERTY_PREFIX,
applicationProperties);
}
}
new BuildDetails(codeVersion, null, codeInstallation);
- SiftsSettings
- .setMapWithSifts(Cache.getDefault("MAP_WITH_SIFTS", false));
+ SiftsSettings.setMapWithSifts(getDefault("MAP_WITH_SIFTS", false));
SiftsSettings.setSiftDownloadDirectory(jalview.bin.Cache
.getDefault("sifts_download_dir", DEFAULT_SIFTS_DOWNLOAD_DIR));
SiftsSettings.setFailSafePIDThreshold(
- jalview.bin.Cache.getDefault("sifts_fail_safe_pid_threshold",
+ getDefault("sifts_fail_safe_pid_threshold",
DEFAULT_FAIL_SAFE_PID_THRESHOLD));
SiftsSettings.setCacheThresholdInDays(
- jalview.bin.Cache.getDefault("sifts_cache_threshold_in_days",
+ getDefault("sifts_cache_threshold_in_days",
DEFAULT_CACHE_THRESHOLD_IN_DAYS));
- IdOrgSettings.setUrl(getDefault("ID_ORG_HOSTURL",
+ IdOrgSettings.setUrl(getDefault(Preferences.ID_ORG_HOSTURL,
"http://www.jalview.org/services/identifiers"));
IdOrgSettings.setDownloadLocation(ID_ORG_FILE);
.println("Jalview Version: " + codeVersion + codeInstallation);
StructureImportSettings.setDefaultStructureFileFormat(jalview.bin.Cache
- .getDefault("PDB_DOWNLOAD_FORMAT", PDB_DOWNLOAD_FORMAT));
+ .getDefault(Preferences.PDB_DOWNLOAD_FORMAT, PDB_DOWNLOAD_FORMAT));
StructureImportSettings
.setDefaultPDBFileParser(DEFAULT_PDB_FILE_PARSER);
// StructureImportSettings
- // .setDefaultPDBFileParser(jalview.bin.Cache.getDefault(
+ // .setDefaultPDBFileParser(jalview.bin.getDefault(
// "DEFAULT_PDB_FILE_PARSER", DEFAULT_PDB_FILE_PARSER));
// jnlpVersion will be null if we're using InstallAnywhere
// Dont do this check if running in headless mode
setProperty("VERSION", codeVersion);
// LOAD USERDEFINED COLOURS
- jalview.bin.Cache
- .initUserColourSchemes(getProperty("USER_DEFINED_COLOURS"));
- jalview.io.PIRFile.useModellerOutput = Cache.getDefault("PIR_MODELLER",
- false);
+ initUserColourSchemes(getProperty(Preferences.USER_DEFINED_COLOURS));
}
-
- private static void deleteBuildProperties()
+ private void deleteBuildProperties()
{
applicationProperties.remove("LATEST_VERSION");
applicationProperties.remove("VERSION");
*/
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);
- }
- return prop;
+ return getInstance().applicationProperties.getProperty(key);
}
/**
}
/**
+ * retrieve a dimension, such as for Jmol
+ *
+ * @param property
+ * @param def
+ * @return
+ */
+ public static Dimension getDefaultDim(String property, Dimension def)
+ {
+ String s = getProperty(property);
+ if (s != null)
+ {
+ if (s.indexOf(',') < 0)
+ {
+ s = s.trim().replace(' ', ',');
+ if (s.indexOf(',') < 0)
+ {
+ s += "," + s;
+ }
+ }
+ try
+ {
+ int pt = s.indexOf(",");
+ return new Dimension(Integer.parseInt(s.substring(0, pt)),
+ Integer.parseInt(s.substring(pt + 1)));
+ } catch (NumberFormatException e)
+ {
+ System.out.println("Error parsing Dimension property '" + property
+ + "' with value '" + s + "'");
+ }
+ }
+ return def;
+ }
+
+ /**
* Answers the value of the given property, or the supplied default value if
* the property is not set
*/
*/
public static Object setProperty(String key, String obj)
{
+ return getInstance().setPropertyImpl(key, obj, true);
+ }
+
+ public static void setPropertyNoSave(String key, String obj)
+ {
+ getInstance().setPropertyImpl(key, obj, false);
+ }
+
+ private Object setPropertyImpl(String key, String obj, boolean andSave)
+ {
Object oldValue = null;
try
{
oldValue = applicationProperties.setProperty(key, obj);
- if (!propsAreReadOnly)
+ if (andSave && !propsAreReadOnly && propertiesFile != null)
{
FileOutputStream out = new FileOutputStream(propertiesFile);
applicationProperties.store(out, "---JalviewX Properties File---");
/**
* remove 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);
+ }
+
+ public static void removePropertyNoSave(String key)
+ {
+ getInstance().removePropertyImpl(key, false);
+ }
+
+ private void removePropertyImpl(String key, boolean andSave)
+ {
+ applicationProperties.remove(key);
+ if (andSave)
+ {
+ savePropertiesImpl();
+ }
+ }
+
+ public static void saveProperties()
+ {
+ getInstance().savePropertiesImpl();
}
/**
* save the properties to the jalview properties path
*/
- public static void saveProperties()
+ private void savePropertiesImpl()
{
if (!propsAreReadOnly)
{
}
}
+ private final static int UNTESTED = -1;
+
+ private final static int TRUE = 1;
+
+ private final static int FALSE = 0;
+
/**
* internal vamsas class discovery state
*/
- private static int vamsasJarsArePresent = -1;
+ private static int vamsasJarsArePresent = (Platform.isJS() ? FALSE
+ : UNTESTED);
/**
* Searches for vamsas client classes on class path.
*/
public static boolean vamsasJarsPresent()
{
- if (vamsasJarsArePresent == -1)
+ if (vamsasJarsArePresent == UNTESTED)
{
try
{
{
jalview.bin.Cache.log.debug(
"Found Vamsas Classes (uk.ac..vamsas.client.VorbaId can be loaded)");
- vamsasJarsArePresent = 1;
+ vamsasJarsArePresent = TRUE;
Logger lvclient = Logger.getLogger("uk.ac.vamsas");
lvclient.setLevel(Level.toLevel(Cache
.getDefault("logs.Vamsas.Level", Level.INFO.toString())));
}
} catch (Exception e)
{
- vamsasJarsArePresent = 0;
+ vamsasJarsArePresent = FALSE;
jalview.bin.Cache.log.debug("Vamsas Classes are not present");
}
}
- return (vamsasJarsArePresent > 0);
+ return (vamsasJarsArePresent == TRUE);
}
/**
* internal vamsas class discovery state
*/
- private static int groovyJarsArePresent = -1;
+ private static int groovyJarsArePresent = (Platform.isJS() ? FALSE
+ : UNTESTED);
/**
* Searches for vamsas client classes on class path.
*/
public static boolean groovyJarsPresent()
{
- if (groovyJarsArePresent == -1)
+ if (groovyJarsArePresent == UNTESTED)
{
try
{
{
jalview.bin.Cache.log.debug(
"Found Groovy (groovy.lang.GroovyObject can be loaded)");
- groovyJarsArePresent = 1;
+ groovyJarsArePresent = TRUE;
Logger lgclient = Logger.getLogger("groovy");
lgclient.setLevel(Level.toLevel(Cache
.getDefault("logs.Groovy.Level", Level.INFO.toString())));
}
} catch (Error e)
{
- groovyJarsArePresent = 0;
+ groovyJarsArePresent = FALSE;
jalview.bin.Cache.log.debug("Groovy Classes are not present", e);
} catch (Exception e)
{
- groovyJarsArePresent = 0;
+ groovyJarsArePresent = FALSE;
jalview.bin.Cache.log.debug("Groovy Classes are not present");
}
}
- return (groovyJarsArePresent > 0);
+ return (groovyJarsArePresent == TRUE);
}
/**
*/
protected static Object tracker = null;
- protected static Class trackerfocus = null;
+ protected static Class<?> trackerfocus = null;
- protected static Class jgoogleanalyticstracker = null;
+ protected static Class<?> jgoogleanalyticstracker = null;
/**
* Initialise the google tracker if it is not done already.
*/
public static void initGoogleTracker()
{
+
+ // TODO: SwingJS JavaScript tracker?
+
if (tracker == null)
{
if (jgoogleanalyticstracker == null)
.newInstance(new Object[]
{ "Jalview Desktop",
(vrs = jalview.bin.Cache.getProperty("VERSION") + "_"
- + jalview.bin.Cache.getDefault("BUILD_DATE",
- "unknown")),
+ + getDefault("BUILD_DATE", "unknown")),
"UA-9060947-1" });
jgoogleanalyticstracker
.getMethod("trackAsynchronously", new Class[]
}
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);
}
}
{
if (coloursFound.toString().length() > 1)
{
- setProperty(UserDefinedColours.USER_DEFINED_COLOURS,
+ setProperty(Preferences.USER_DEFINED_COLOURS,
coloursFound.toString());
}
else
{
- applicationProperties
- .remove(UserDefinedColours.USER_DEFINED_COLOURS);
+ getInstance().applicationProperties
+ .remove(Preferences.USER_DEFINED_COLOURS);
}
}
}