Clover icon

jalviewX

  1. Project Clover database Wed Oct 31 2018 15:13:58 GMT
  2. Package jalview.bin

File Cache.java

 

Coverage histogram

../../img/srcFileCovDistChart4.png
45% of files have more coverage

Code metrics

82
249
21
2
1,055
630
88
0.35
11.86
10.5
4.19

Classes

Class Line # Actions
Cache 212 227 83 185
0.4272445742.7%
Cache.VersionChecker 491 22 5 29
0.00%
 

Contributing tests

This file is covered by 234 tests. .

Source view

1    /*
2    * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3    * Copyright (C) $$Year-Rel$$ The Jalview Authors
4    *
5    * This file is part of Jalview.
6    *
7    * Jalview is free software: you can redistribute it and/or
8    * modify it under the terms of the GNU General Public License
9    * as published by the Free Software Foundation, either version 3
10    * of the License, or (at your option) any later version.
11    *
12    * Jalview is distributed in the hope that it will be useful, but
13    * WITHOUT ANY WARRANTY; without even the implied warranty
14    * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15    * PURPOSE. See the GNU General Public License for more details.
16    *
17    * You should have received a copy of the GNU General Public License
18    * along with Jalview. If not, see <http://www.gnu.org/licenses/>.
19    * The Jalview Authors are detailed in the 'AUTHORS' file.
20    */
21    package jalview.bin;
22   
23    import jalview.datamodel.PDBEntry;
24    import jalview.gui.UserDefinedColours;
25    import jalview.schemes.ColourSchemeLoader;
26    import jalview.schemes.ColourSchemes;
27    import jalview.schemes.UserColourScheme;
28    import jalview.structure.StructureImportSettings;
29    import jalview.urls.IdOrgSettings;
30    import jalview.util.ColorUtils;
31    import jalview.ws.sifts.SiftsSettings;
32   
33    import java.awt.Color;
34    import java.io.BufferedReader;
35    import java.io.File;
36    import java.io.FileInputStream;
37    import java.io.FileOutputStream;
38    import java.io.InputStream;
39    import java.io.InputStreamReader;
40    import java.text.DateFormat;
41    import java.text.SimpleDateFormat;
42    import java.util.Collections;
43    import java.util.Date;
44    import java.util.Enumeration;
45    import java.util.Locale;
46    import java.util.Properties;
47    import java.util.StringTokenizer;
48    import java.util.TreeSet;
49   
50    import org.apache.log4j.ConsoleAppender;
51    import org.apache.log4j.Level;
52    import org.apache.log4j.Logger;
53    import org.apache.log4j.SimpleLayout;
54   
55    /**
56    * Stores and retrieves Jalview Application Properties Lists and fields within
57    * list entries are separated by '|' symbols unless otherwise stated (|) clauses
58    * are alternative values for a tag. <br>
59    * <br>
60    * Current properties include:
61    * <ul>
62    * <br>
63    * logs.Axis.Level - one of the stringified Levels for log4j controlling the
64    * logging level for axis (used for web services) <br>
65    * </li>
66    * <li>logs.Castor.Level - one of the stringified Levels for log4j controlling
67    * the logging level for castor (used for serialization) <br>
68    * </li>
69    * <li>logs.Jalview.Level - Cache.log stringified level. <br>
70    * </li>
71    * <li>SCREEN_WIDTH</li>
72    * <li>SCREEN_HEIGHT</li>
73    * <li>SCREEN_Y=285</li>
74    * <li>SCREEN_X=371</li>
75    * <li>SHOW_FULLSCREEN boolean</li>
76    * <li>FONT_NAME java font name for alignment text display</li>
77    * <li>FONT_SIZE size of displayed alignment text</li>
78    * <li>FONT_STYLE style of font displayed (sequence labels are always
79    * italic)</li>
80    * <li>GAP_SYMBOL character to treat as gap symbol (usually -,.,' ')</li>
81    * <li>LAST_DIRECTORY last directory for browsing alignment</li>
82    * <li>USER_DEFINED_COLOURS list of user defined colour scheme files</li>
83    * <li>SHOW_FULL_ID show id with '/start-end' numbers appended</li>
84    * <li>SHOW_IDENTITY show percentage identity annotation</li>
85    * <li>SHOW_QUALITY show alignment quality annotation</li>
86    * <li>SHOW_ANNOTATIONS show alignment annotation rows</li>
87    * <li>SHOW_CONSERVATION show alignment conservation annotation</li>
88    * <li>SORT_ANNOTATIONS currently either SEQUENCE_AND_LABEL or
89    * LABEL_AND_SEQUENCE</li>
90    * <li>SHOW_AUTOCALC_ABOVE true to show autocalculated annotations above
91    * sequence annotations</li>
92    * <li>CENTRE_COLUMN_LABELS centre the labels at each column in a displayed
93    * annotation row</li>
94    * <li>DEFAULT_COLOUR default colour scheme to apply for a new alignment</li>
95    * <li>DEFAULT_FILE_FORMAT file format used to save</li>
96    * <li>STARTUP_FILE file loaded on startup (may be a fully qualified url)</li>
97    * <li>SHOW_STARTUP_FILE flag to control loading of startup file</li>
98    * <li>VERSION the version of the jalview build</li>
99    * <li>BUILD_DATE date of this build</li>
100    * <li>LATEST_VERSION the latest jalview version advertised on the
101    * www.jalview.org</li>
102    * <li>PIR_MODELLER boolean indicating if PIR files are written with MODELLER
103    * descriptions</li>
104    * <li>(FASTA,MSF,PILEUP,CLUSTAL,BLC,PIR,PFAM)_JVSUFFIX boolean for adding jv
105    * suffix to file</li>
106    * <li>RECENT_URL list of recently retrieved URLs</li>
107    * <li>RECENT_FILE list of recently opened files</li>
108    * <li>USE_PROXY flag for whether a http proxy is to be used</li>
109    * <li>PROXY_SERVER the proxy</li>
110    * <li>PROXY_PORT</li>
111    * <li>NOQUESTIONNAIRES true to prevent jalview from checking the questionnaire
112    * service</li>
113    * <li>QUESTIONNAIRE last questionnaire:responder id string from questionnaire
114    * service</li>
115    * <li>USAGESTATS (false - user prompted) Enable google analytics tracker for
116    * collecting usage statistics</li>
117    * <li>DAS_LOCAL_SOURCE list of local das sources</li>
118    * <li>SHOW_OVERVIEW boolean for overview window display</li>
119    * <li>ANTI_ALIAS boolean for smooth fonts</li>
120    * <li>RIGHT_ALIGN_IDS boolean</li>
121    * <li>AUTO_CALC_CONSENSUS boolean for automatic recalculation of consensus</li>
122    * <li>PAD_GAPS boolean</li>
123    * <li>ID_ITALICS boolean</li>
124    * <li>SHOW_JV_SUFFIX</li>
125    * <li>WRAP_ALIGNMENT</li>
126    * <li>EPS_RENDERING (Prompt each time|Lineart|Text) default for EPS rendering
127    * style check</li>
128    * <li>SORT_ALIGNMENT (No sort|Id|Pairwise Identity)</li>
129    * <li>SEQUENCE_LINKS list of name|URL pairs for opening a url with
130    * $SEQUENCE_ID$</li>
131    * <li>STORED_LINKS list of name|url pairs which user has entered but are not
132    * currently used
133    * <li>DEFAULT_LINK name of single url to be used when user double clicks a
134    * sequence id (must be in SEQUENCE_LINKS or STORED_LINKS)
135    * <li>GROUP_LINKS list of name|URL[|&lt;separator&gt;] tuples - see
136    * jalview.utils.GroupURLLink for more info</li>
137    * <li>DAS_REGISTRY_URL the registry to query</li>
138    * <li>DEFAULT_BROWSER for unix</li>
139    * <li>DAS_ACTIVE_SOURCE list of active sources</li>
140    * <li>SHOW_MEMUSAGE boolean show memory usage and warning indicator on desktop
141    * (false)</li>
142    * <li>VERSION_CHECK (true) check for the latest release version from
143    * www.jalview.org (or the alias given by the www.jalview.org property)</li>
144    * <li>SHOW_NPFEATS_TOOLTIP (true) show non-positional features in the Sequence
145    * ID tooltip</li>
146    * <li>SHOW_DBREFS_TOOLTIP (true) show Database Cross References in the Sequence
147    * ID tooltip</li>
148    * <li>SHOW_UNCONSERVED (false) only render unconserved residues - conserved
149    * displayed as '.'</li>
150    * <li>SORT_BY_TREE (false) sort the current alignment view according to the
151    * order of a newly displayed tree</li>
152    * <li>DBFETCH_USEPICR (false) use PICR to recover valid DB references from
153    * sequence ID strings before attempting retrieval from any datasource</li>
154    * <li>SHOW_GROUP_CONSENSUS (false) Show consensus annotation for groups in the
155    * alignment.</li>
156    * <li>SHOW_GROUP_CONSERVATION (false) Show conservation annotation for groups
157    * in the alignment.</li>
158    * <li>SHOW_CONSENSUS_HISTOGRAM (false) Show consensus annotation row's
159    * histogram.</li>
160    * <li>SHOW_CONSENSUS_LOGO (false) Show consensus annotation row's sequence
161    * logo.</li>
162    * <li>NORMALISE_CONSENSUS_LOGO (false) Show consensus annotation row's sequence
163    * logo normalised to row height rather than histogram height.</li>
164    * <li>FOLLOW_SELECTIONS (true) Controls whether a new alignment view should
165    * respond to selections made in other alignments containing the same sequences.
166    * </li>
167    * <li>JWS2HOSTURLS comma-separated list of URLs to try for JABAWS services</li>
168    * <li>SHOW_WSDISCOVERY_ERRORS (true) Controls if the web service URL discovery
169    * warning dialog box is displayed.</li>
170    * <li>ANNOTATIONCOLOUR_MIN (orange) Shade used for minimum value of annotation
171    * when shading by annotation</li>
172    * <li>ANNOTATIONCOLOUR_MAX (red) Shade used for maximum value of annotation
173    * when shading by annotation</li>
174    * <li>www.jalview.org (http://www.jalview.org) a property enabling all HTTP
175    * requests to be redirected to a mirror of http://www.jalview.org</li>
176    * <li>FIGURE_AUTOIDWIDTH (false) Expand the left hand column of an exported
177    * alignment figure to accommodate even the longest sequence ID or annotation
178    * label.</li>
179    * <li>FIGURE_FIXEDIDWIDTH Specifies the width to use for the left-hand column
180    * when exporting an alignment as a figure (setting FIGURE_AUTOIDWIDTH to true
181    * will override this).</li>
182    * <li>STRUCT_FROM_PDB (false) derive secondary structure annotation from PDB
183    * record</li>
184    * <li>USE_RNAVIEW (false) use RNAViewer to derive secondary structure</li>
185    * <li>ADD_SS_ANN (false) add secondary structure annotation to alignment
186    * display</li>
187    * <li>ADD_TEMPFACT_ANN (false) add Temperature Factor annotation to alignment
188    * display</li>
189    * <li>STRUCTURE_DISPLAY choose from JMOL (default) or CHIMERA for 3D structure
190    * display</li>
191    * <li>CHIMERA_PATH specify full path to Chimera program (if non-standard)</li>
192    * <li>ID_ORG_HOSTURL location of jalview service providing identifiers.org urls
193    * </li>
194    *
195    * </ul>
196    * Deprecated settings:
197    * <ul>
198    * *
199    * <li>DISCOVERY_START - Boolean - controls if discovery services are queried on
200    * startup (JWS1 services only)</li>
201    * <li>DISCOVERY_URLS - comma separated list of Discovery Service endpoints.
202    * (JWS1 services only)</li>
203    * <li>SHOW_JWS1_SERVICES (true) enable or disable the original Jalview 2
204    * services in the desktop GUI</li>
205    * <li>ENABLE_RSBS_EDITOR (false for 2.7 release) enable or disable RSBS editing
206    * panel in web service preferences</li>
207    * </ul>
208    *
209    * @author $author$
210    * @version $Revision$
211    */
 
212    public class Cache
213    {
214    /**
215    * property giving log4j level for CASTOR loggers
216    */
217    public static final String CASTORLOGLEVEL = "logs.Castor.level";
218   
219    /**
220    * property giving log4j level for AXIS loggers
221    */
222    public static final String AXISLOGLEVEL = "logs.Axis.level";
223   
224    /**
225    * property giving log4j level for Jalview Log
226    */
227    public static final String JALVIEWLOGLEVEL = "logs.Jalview.level";
228   
229    public static final String DAS_LOCAL_SOURCE = "DAS_LOCAL_SOURCE";
230   
231    public static final String DAS_REGISTRY_URL = "DAS_REGISTRY_URL";
232   
233    public static final String DAS_ACTIVE_SOURCE = "DAS_ACTIVE_SOURCE";
234   
235    /**
236    * Sifts settings
237    */
238    public static final String DEFAULT_SIFTS_DOWNLOAD_DIR = System
239    .getProperty("user.home") + File.separatorChar
240    + ".sifts_downloads" + File.separatorChar;
241   
242    private final static String DEFAULT_CACHE_THRESHOLD_IN_DAYS = "2";
243   
244    private final static String DEFAULT_FAIL_SAFE_PID_THRESHOLD = "30";
245   
246    /**
247    * Identifiers.org download settings
248    */
249    private static final String ID_ORG_FILE = System.getProperty("user.home")
250    + File.separatorChar + ".identifiers.org.ids.json";
251   
252    /**
253    * Allowed values are PDB or mmCIF
254    */
255    private final static String PDB_DOWNLOAD_FORMAT = PDBEntry.Type.MMCIF
256    .toString();
257   
258    private final static String DEFAULT_PDB_FILE_PARSER = StructureImportSettings.StructureParser.JMOL_PARSER
259    .toString();
260   
261    /*
262    * a date formatter using a fixed (rather than the user's) locale;
263    * this ensures that date properties can be written and re-read successfully
264    * even if the user changes their locale setting
265    */
266    private static final DateFormat date_format = SimpleDateFormat
267    .getDateTimeInstance(SimpleDateFormat.MEDIUM,
268    SimpleDateFormat.MEDIUM, Locale.UK);
269   
270    /**
271    * Initialises the Jalview Application Log
272    */
273    public static Logger log;
274   
275    /** Jalview Properties */
276    public static Properties applicationProperties = new Properties()
277    {
278    // override results in properties output in alphabetical order
 
279  0 toggle @Override
280    public synchronized Enumeration<Object> keys()
281    {
282  0 return Collections.enumeration(new TreeSet<>(super.keySet()));
283    }
284    };
285   
286    /** Default file is ~/.jalview_properties */
287    static String propertiesFile;
288   
289    private static boolean propsAreReadOnly = /** @j2sNative true || */
290    false;
291   
 
292  13 toggle public static void initLogger()
293    {
294  13 if (log != null)
295    {
296  12 return;
297    }
298  1 try
299    {
300    // TODO: redirect stdout and stderr here in order to grab the output of
301    // the log
302   
303  1 ConsoleAppender ap = new ConsoleAppender(new SimpleLayout(),
304    "System.err");
305  1 ap.setName("JalviewLogger");
306  1 org.apache.log4j.Logger.getRootLogger().addAppender(ap); // catch all for
307    // log output
308  1 Logger laxis = Logger.getLogger("org.apache.axis");
309  1 Logger lcastor = Logger.getLogger("org.exolab.castor");
310  1 jalview.bin.Cache.log = Logger.getLogger("jalview.bin.Jalview");
311   
312  1 laxis.setLevel(Level.toLevel(
313    Cache.getDefault("logs.Axis.Level", Level.INFO.toString())));
314  1 lcastor.setLevel(Level.toLevel(Cache.getDefault("logs.Castor.Level",
315    Level.INFO.toString())));
316  1 lcastor = Logger.getLogger("org.exolab.castor.xml");
317  1 lcastor.setLevel(Level.toLevel(Cache.getDefault("logs.Castor.Level",
318    Level.INFO.toString())));
319    // lcastor = Logger.getLogger("org.exolab.castor.xml.Marshaller");
320    // lcastor.setLevel(Level.toLevel(Cache.getDefault("logs.Castor.Level",
321    // Level.INFO.toString())));
322  1 jalview.bin.Cache.log.setLevel(Level.toLevel(Cache
323    .getDefault("logs.Jalview.level", Level.INFO.toString())));
324    // laxis.addAppender(ap);
325    // lcastor.addAppender(ap);
326    // jalview.bin.Cache.log.addAppender(ap);
327    // Tell the user that debug is enabled
328  1 jalview.bin.Cache.log.debug("Jalview Debugging Output Follows.");
329    } catch (Exception ex)
330    {
331  0 System.err.println("Problems initializing the log4j system\n");
332  0 ex.printStackTrace(System.err);
333    }
334    }
335   
336    /**
337    * Loads properties from the given properties file. Any existing properties
338    * are first cleared.
339    */
 
340  69 toggle public static void loadProperties(String propsFile)
341    {
342  69 propertiesFile = propsFile;
343  69 if (propsFile == null)
344    {
345  4 propertiesFile = System.getProperty("user.home") + File.separatorChar
346    + ".jalview_properties";
347    }
348    else
349    {
350    // don't corrupt the file we've been given.
351  65 propsAreReadOnly = true;
352    }
353   
354  69 try
355    {
356  69 InputStream fis;
357  69 try
358    {
359  69 fis = new java.net.URL(propertiesFile).openStream();
360  0 System.out.println(
361    "Loading jalview properties from : " + propertiesFile);
362  0 System.out.println(
363    "Disabling Jalview writing to user's local properties file.");
364  0 propsAreReadOnly = true;
365   
366    } catch (Exception ex)
367    {
368  69 fis = null;
369    }
370  69 if (fis == null)
371    {
372  69 fis = new FileInputStream(propertiesFile);
373    }
374  69 applicationProperties.clear();
375  69 applicationProperties.load(fis);
376   
377    // remove any old build properties
378   
379  69 deleteBuildProperties();
380  69 fis.close();
381    } catch (Exception ex)
382    {
383  0 System.out.println("Error reading properties file: " + ex);
384    }
385   
386  69 if (getDefault("USE_PROXY", false))
387    {
388  0 String proxyServer = getDefault("PROXY_SERVER", ""),
389    proxyPort = getDefault("PROXY_PORT", "8080");
390   
391  0 System.out.println("Using proxyServer: " + proxyServer
392    + " proxyPort: " + proxyPort);
393   
394  0 System.setProperty("http.proxyHost", proxyServer);
395  0 System.setProperty("http.proxyPort", proxyPort);
396    }
397   
398    // LOAD THE AUTHORS FROM THE authors.props file
399  69 try
400    {
401  69 String authorDetails = /** @j2sNative "xxx" || */
402    "jar:"
403    .concat(Cache.class.getProtectionDomain().getCodeSource()
404    .getLocation().toString().concat("!/authors.props"));
405   
406  69 java.net.URL localJarFileURL = new java.net.URL(authorDetails);
407   
408  69 InputStream in = localJarFileURL.openStream();
409  0 applicationProperties.load(in);
410  0 in.close();
411    } catch (Exception ex)
412    {
413  69 System.out.println("Error reading author details: " + ex);
414  69 applicationProperties.remove("AUTHORS");
415  69 applicationProperties.remove("AUTHORFNAMES");
416  69 applicationProperties.remove("YEAR");
417    }
418   
419    // FIND THE VERSION NUMBER AND BUILD DATE FROM jalview.jar
420    // MUST FOLLOW READING OF LOCAL PROPERTIES FILE AS THE
421    // VERSION MAY HAVE CHANGED SINCE LAST USING JALVIEW
422  69 try
423    {
424  69 String buildDetails = /** @j2sNative "xxx" || */
425    "jar:".concat(Cache.class.getProtectionDomain()
426    .getCodeSource().getLocation().toString()
427    .concat("!/.build_properties"));
428   
429  69 java.net.URL localJarFileURL = new java.net.URL(buildDetails);
430   
431  69 InputStream in = localJarFileURL.openStream();
432  0 applicationProperties.load(in);
433  0 in.close();
434    } catch (Exception ex)
435    {
436  69 System.out.println("Error reading build details: " + ex);
437  69 applicationProperties.remove("VERSION");
438    }
439   
440  69 String jnlpVersion = System.getProperty("jalview.version");
441  69 String codeVersion = getProperty("VERSION");
442  69 String codeInstallation = getProperty("INSTALLATION");
443  69 if (codeVersion == null)
444    {
445    // THIS SHOULD ONLY BE THE CASE WHEN TESTING!!
446  69 codeVersion = "Test";
447  69 jnlpVersion = "Test";
448  69 codeInstallation = "";
449    }
450    else
451    {
452  0 codeInstallation = " (" + codeInstallation + ")";
453    }
454  69 new BuildDetails(codeVersion, null, codeInstallation);
455   
456  69 SiftsSettings
457    .setMapWithSifts(Cache.getDefault("MAP_WITH_SIFTS", false));
458   
459  69 SiftsSettings.setSiftDownloadDirectory(jalview.bin.Cache
460    .getDefault("sifts_download_dir", DEFAULT_SIFTS_DOWNLOAD_DIR));
461   
462  69 SiftsSettings.setFailSafePIDThreshold(
463    jalview.bin.Cache.getDefault("sifts_fail_safe_pid_threshold",
464    DEFAULT_FAIL_SAFE_PID_THRESHOLD));
465   
466  69 SiftsSettings.setCacheThresholdInDays(
467    jalview.bin.Cache.getDefault("sifts_cache_threshold_in_days",
468    DEFAULT_CACHE_THRESHOLD_IN_DAYS));
469   
470  69 IdOrgSettings.setUrl(getDefault("ID_ORG_HOSTURL",
471    "http://www.jalview.org/services/identifiers"));
472  69 IdOrgSettings.setDownloadLocation(ID_ORG_FILE);
473   
474  69 System.out
475    .println("Jalview Version: " + codeVersion + codeInstallation);
476   
477  69 StructureImportSettings.setDefaultStructureFileFormat(jalview.bin.Cache
478    .getDefault("PDB_DOWNLOAD_FORMAT", PDB_DOWNLOAD_FORMAT));
479  69 StructureImportSettings
480    .setDefaultPDBFileParser(DEFAULT_PDB_FILE_PARSER);
481    // StructureImportSettings
482    // .setDefaultPDBFileParser(jalview.bin.Cache.getDefault(
483    // "DEFAULT_PDB_FILE_PARSER", DEFAULT_PDB_FILE_PARSER));
484    // jnlpVersion will be null if we're using InstallAnywhere
485    // Dont do this check if running in headless mode
486  69 if (jnlpVersion == null && getDefault("VERSION_CHECK", true)
487    && (System.getProperty("java.awt.headless") == null || System
488    .getProperty("java.awt.headless").equals("false")))
489    {
490   
 
491    class VersionChecker extends Thread
492    {
 
493  0 toggle @Override
494    public void run()
495    {
496  0 String orgtimeout = System
497    .getProperty("sun.net.client.defaultConnectTimeout");
498  0 if (orgtimeout == null)
499    {
500  0 orgtimeout = "30";
501  0 System.out.println("# INFO: Setting default net timeout to "
502    + orgtimeout + " seconds.");
503    }
504  0 String remoteVersion = null;
505  0 try
506    {
507  0 System.setProperty("sun.net.client.defaultConnectTimeout",
508    "5000");
509  0 java.net.URL url = new java.net.URL(Cache
510    .getDefault("www.jalview.org", "http://www.jalview.org")
511    + "/webstart/jalview.jnlp");
512  0 BufferedReader in = new BufferedReader(
513    new InputStreamReader(url.openStream()));
514  0 String line = null;
515  0 while ((line = in.readLine()) != null)
516    {
517  0 if (line.indexOf("jalview.version") == -1)
518    {
519  0 continue;
520    }
521   
522  0 line = line.substring(line.indexOf("value=") + 7);
523  0 line = line.substring(0, line.lastIndexOf("\""));
524  0 remoteVersion = line;
525  0 break;
526    }
527    } catch (Exception ex)
528    {
529  0 System.out.println(
530    "Non-fatal exception when checking version at www.jalview.org :");
531  0 System.out.println(ex);
532  0 remoteVersion = getProperty("VERSION");
533    }
534  0 System.setProperty("sun.net.client.defaultConnectTimeout",
535    orgtimeout);
536   
537  0 setProperty("LATEST_VERSION", remoteVersion);
538    }
539    }
540   
541  0 VersionChecker vc = new VersionChecker();
542  0 vc.start();
543    }
544    else
545    {
546  69 if (jnlpVersion != null)
547    {
548  69 setProperty("LATEST_VERSION", jnlpVersion);
549    }
550    else
551    {
552  0 applicationProperties.remove("LATEST_VERSION");
553    }
554    }
555   
556  69 setProperty("VERSION", codeVersion);
557   
558    // LOAD USERDEFINED COLOURS
559  69 jalview.bin.Cache
560    .initUserColourSchemes(getProperty("USER_DEFINED_COLOURS"));
561  69 jalview.io.PIRFile.useModellerOutput = Cache.getDefault("PIR_MODELLER",
562    false);
563    }
564   
 
565  69 toggle private static void deleteBuildProperties()
566    {
567  69 applicationProperties.remove("LATEST_VERSION");
568  69 applicationProperties.remove("VERSION");
569  69 applicationProperties.remove("AUTHORS");
570  69 applicationProperties.remove("AUTHORFNAMES");
571  69 applicationProperties.remove("YEAR");
572  69 applicationProperties.remove("BUILD_DATE");
573  69 applicationProperties.remove("INSTALLATION");
574    }
575   
576    /**
577    * Gets Jalview application property of given key. Returns null if key not
578    * found
579    *
580    * @param key
581    * Name of property
582    *
583    * @return Property value
584    */
 
585  16103 toggle public static String getProperty(String key)
586    {
587  16103 return applicationProperties.getProperty(key);
588    }
589   
590    /**
591    * These methods are used when checking if the saved preference is different
592    * to the default setting
593    */
594   
 
595  11754 toggle public static boolean getDefault(String property, boolean def)
596    {
597  11754 String string = getProperty(property);
598  11753 if (string != null)
599    {
600  4486 def = Boolean.valueOf(string).booleanValue();
601    }
602   
603  11754 return def;
604    }
605   
606    /**
607    * Answers the value of the given property, or the supplied default value if
608    * the property is not set
609    */
 
610  3272 toggle public static String getDefault(String property, String def)
611    {
612  3273 String value = getProperty(property);
613  3275 return value == null ? def : value;
614    }
615   
616    /**
617    * Stores property in the file "HOME_DIR/.jalview_properties"
618    *
619    * @param key
620    * Name of object
621    * @param obj
622    * String value of property
623    *
624    * @return previous value of property (or null)
625    */
 
626  267 toggle public static Object setProperty(String key, String obj)
627    {
628  267 Object oldValue = null;
629  267 try
630    {
631  267 oldValue = applicationProperties.setProperty(key, obj);
632  267 if (!propsAreReadOnly)
633    {
634  0 FileOutputStream out = new FileOutputStream(propertiesFile);
635  0 applicationProperties.store(out, "---JalviewX Properties File---");
636  0 out.close();
637    }
638    } catch (Exception ex)
639    {
640  0 System.out.println(
641    "Error setting property: " + key + " " + obj + "\n" + ex);
642    }
643  267 return oldValue;
644    }
645   
646    /**
647    * remove the specified property from the jalview properties file
648    *
649    * @param string
650    */
 
651  0 toggle public static void removeProperty(String string)
652    {
653  0 applicationProperties.remove(string);
654  0 saveProperties();
655    }
656   
657    /**
658    * save the properties to the jalview properties path
659    */
 
660  0 toggle public static void saveProperties()
661    {
662  0 if (!propsAreReadOnly)
663    {
664  0 try
665    {
666  0 FileOutputStream out = new FileOutputStream(propertiesFile);
667  0 applicationProperties.store(out, "---JalviewX Properties File---");
668  0 out.close();
669    } catch (Exception ex)
670    {
671  0 System.out.println("Error saving properties: " + ex);
672    }
673    }
674    }
675   
676    /**
677    * internal vamsas class discovery state
678    */
679    private static int vamsasJarsArePresent = -1;
680   
681    /**
682    * Searches for vamsas client classes on class path.
683    *
684    * @return true if vamsas client is present on classpath
685    */
 
686  11 toggle public static boolean vamsasJarsPresent()
687    {
688  11 if (vamsasJarsArePresent == -1)
689    {
690  1 try
691    {
692  1 if (jalview.jbgui.GDesktop.class.getClassLoader()
693    .loadClass("uk.ac.vamsas.client.VorbaId") != null)
694    {
695  1 jalview.bin.Cache.log.debug(
696    "Found Vamsas Classes (uk.ac..vamsas.client.VorbaId can be loaded)");
697  1 vamsasJarsArePresent = 1;
698  1 Logger lvclient = Logger.getLogger("uk.ac.vamsas");
699  1 lvclient.setLevel(Level.toLevel(Cache
700    .getDefault("logs.Vamsas.Level", Level.INFO.toString())));
701   
702  1 lvclient.addAppender(log.getAppender("JalviewLogger"));
703    // Tell the user that debug is enabled
704  1 lvclient.debug("Jalview Vamsas Client Debugging Output Follows.");
705    }
706    } catch (Exception e)
707    {
708  0 vamsasJarsArePresent = 0;
709  0 jalview.bin.Cache.log.debug("Vamsas Classes are not present");
710    }
711    }
712  11 return (vamsasJarsArePresent > 0);
713    }
714   
715    /**
716    * internal vamsas class discovery state
717    */
718    private static int groovyJarsArePresent = -1;
719   
720    /**
721    * Searches for vamsas client classes on class path.
722    *
723    * @return true if vamsas client is present on classpath
724    */
 
725  0 toggle public static boolean groovyJarsPresent()
726    {
727  0 if (groovyJarsArePresent == -1)
728    {
729  0 try
730    {
731  0 if (Cache.class.getClassLoader()
732    .loadClass("groovy.lang.GroovyObject") != null)
733    {
734  0 jalview.bin.Cache.log.debug(
735    "Found Groovy (groovy.lang.GroovyObject can be loaded)");
736  0 groovyJarsArePresent = 1;
737  0 Logger lgclient = Logger.getLogger("groovy");
738  0 lgclient.setLevel(Level.toLevel(Cache
739    .getDefault("logs.Groovy.Level", Level.INFO.toString())));
740   
741  0 lgclient.addAppender(log.getAppender("JalviewLogger"));
742    // Tell the user that debug is enabled
743  0 lgclient.debug("Jalview Groovy Client Debugging Output Follows.");
744    }
745    } catch (Error e)
746    {
747  0 groovyJarsArePresent = 0;
748  0 jalview.bin.Cache.log.debug("Groovy Classes are not present", e);
749    } catch (Exception e)
750    {
751  0 groovyJarsArePresent = 0;
752  0 jalview.bin.Cache.log.debug("Groovy Classes are not present");
753    }
754    }
755  0 return (groovyJarsArePresent > 0);
756    }
757   
758    /**
759    * GA tracker object - actually JGoogleAnalyticsTracker null if tracking not
760    * enabled.
761    */
762    protected static Object tracker = null;
763   
764    protected static Class trackerfocus = null;
765   
766    protected static Class jgoogleanalyticstracker = null;
767   
768    /**
769    * Initialise the google tracker if it is not done already.
770    */
 
771  0 toggle public static void initGoogleTracker()
772    {
773  0 if (tracker == null)
774    {
775  0 if (jgoogleanalyticstracker == null)
776    {
777    // try to get the tracker class
778  0 try
779    {
780  0 jgoogleanalyticstracker = Cache.class.getClassLoader().loadClass(
781    "com.boxysystems.jgoogleanalytics.JGoogleAnalyticsTracker");
782  0 trackerfocus = Cache.class.getClassLoader()
783    .loadClass("com.boxysystems.jgoogleanalytics.FocusPoint");
784    } catch (Exception e)
785    {
786  0 log.debug(
787    "com.boxysystems.jgoogleanalytics package is not present - tracking not enabled.");
788  0 tracker = null;
789  0 jgoogleanalyticstracker = null;
790  0 trackerfocus = null;
791  0 return;
792    }
793    }
794    // now initialise tracker
795  0 Exception re = null, ex = null;
796  0 Error err = null;
797  0 String vrs = "No Version Accessible";
798  0 try
799    {
800    // Google analytics tracking code for Library Finder
801  0 tracker = jgoogleanalyticstracker
802    .getConstructor(new Class[]
803    { String.class, String.class, String.class })
804    .newInstance(new Object[]
805    { "Jalview Desktop",
806    (vrs = jalview.bin.Cache.getProperty("VERSION") + "_"
807    + jalview.bin.Cache.getDefault("BUILD_DATE",
808    "unknown")),
809    "UA-9060947-1" });
810  0 jgoogleanalyticstracker
811    .getMethod("trackAsynchronously", new Class[]
812    { trackerfocus })
813    .invoke(tracker, new Object[]
814    { trackerfocus.getConstructor(new Class[] { String.class })
815    .newInstance(new Object[]
816    { "Application Started." }) });
817    } catch (RuntimeException e)
818    {
819  0 re = e;
820    } catch (Exception e)
821    {
822  0 ex = e;
823    } catch (Error e)
824    {
825  0 err = e;
826    }
827  0 if (re != null || ex != null || err != null)
828    {
829  0 if (log != null)
830    {
831  0 if (re != null)
832    {
833  0 log.debug("Caught runtime exception in googletracker init:",
834    re);
835    }
836  0 if (ex != null)
837    {
838  0 log.warn(
839    "Failed to initialise GoogleTracker for Jalview Desktop with version "
840    + vrs,
841    ex);
842    }
843  0 if (err != null)
844    {
845  0 log.error(
846    "Whilst initing GoogleTracker for Jalview Desktop version "
847    + vrs,
848    err);
849    }
850    }
851    else
852    {
853  0 if (re != null)
854    {
855  0 System.err.println(
856    "Debug: Caught runtime exception in googletracker init:"
857    + vrs);
858  0 re.printStackTrace();
859    }
860  0 if (ex != null)
861    {
862  0 System.err.println(
863    "Warning: Failed to initialise GoogleTracker for Jalview Desktop with version "
864    + vrs);
865  0 ex.printStackTrace();
866    }
867   
868  0 if (err != null)
869    {
870  0 System.err.println(
871    "ERROR: Whilst initing GoogleTracker for Jalview Desktop version "
872    + vrs);
873  0 err.printStackTrace();
874    }
875    }
876    }
877    else
878    {
879  0 log.debug("Successfully initialised tracker.");
880    }
881    }
882    }
883   
884    /**
885    * get the user's default colour if available
886    *
887    * @param property
888    * @param defcolour
889    * @return
890    */
 
891  0 toggle public static Color getDefaultColour(String property, Color defcolour)
892    {
893  0 String colprop = getProperty(property);
894  0 if (colprop == null)
895    {
896  0 return defcolour;
897    }
898  0 Color col = ColorUtils.parseColourString(colprop);
899  0 if (col == null)
900    {
901  0 log.warn("Couldn't parse '" + colprop + "' as a colour for "
902    + property);
903    }
904  0 return (col == null) ? defcolour : col;
905    }
906   
907    /**
908    * store a colour as a Jalview user default property
909    *
910    * @param property
911    * @param colour
912    */
 
913  0 toggle public static void setColourProperty(String property, Color colour)
914    {
915  0 setProperty(property, jalview.util.Format.getHexString(colour));
916    }
917   
918    /**
919    * Stores a formatted date in a jalview property, using a fixed locale.
920    *
921    * @param propertyName
922    * @param date
923    * @return the formatted date string
924    */
 
925  10 toggle public static String setDateProperty(String propertyName, Date date)
926    {
927  10 String formatted = date_format.format(date);
928  10 setProperty(propertyName, formatted);
929  10 return formatted;
930    }
931   
932    /**
933    * Reads a date stored in a Jalview property, parses it (using a fixed locale
934    * format) and returns as a Date, or null if parsing fails
935    *
936    * @param propertyName
937    * @return
938    *
939    */
 
940  3 toggle public static Date getDateProperty(String propertyName)
941    {
942  3 String val = getProperty(propertyName);
943  3 if (val != null)
944    {
945  3 try
946    {
947  3 return date_format.parse(val);
948    } catch (Exception ex)
949    {
950  1 System.err.println("Invalid or corrupt date in property '"
951    + propertyName + "' : value was '" + val + "'");
952    }
953    }
954  1 return null;
955    }
956   
957    /**
958    * get and parse a property as an integer. send any parsing problems to
959    * System.err
960    *
961    * @param property
962    * @return null or Integer
963    */
 
964  0 toggle public static Integer getIntegerProperty(String property)
965    {
966  0 String val = getProperty(property);
967  0 if (val != null && (val = val.trim()).length() > 0)
968    {
969  0 try
970    {
971  0 return Integer.valueOf(val);
972    } catch (NumberFormatException x)
973    {
974  0 System.err.println("Invalid integer in property '" + property
975    + "' (value was '" + val + "')");
976    }
977    }
978  0 return null;
979    }
980   
981    /**
982    * Set the specified value, or remove it if null or empty. Does not save the
983    * properties file.
984    *
985    * @param propName
986    * @param value
987    */
 
988  0 toggle public static void setOrRemove(String propName, String value)
989    {
990  0 if (propName == null)
991    {
992  0 return;
993    }
994  0 if (value == null || value.trim().length() < 1)
995    {
996  0 Cache.applicationProperties.remove(propName);
997    }
998    else
999    {
1000  0 Cache.applicationProperties.setProperty(propName, value);
1001    }
1002    }
1003   
1004    /**
1005    * Loads in user colour schemes from files.
1006    *
1007    * @param files
1008    * a '|'-delimited list of file paths
1009    */
 
1010  69 toggle public static void initUserColourSchemes(String files)
1011    {
1012  69 if (files == null || files.length() == 0)
1013    {
1014  69 return;
1015    }
1016   
1017    // In case colours can't be loaded, we'll remove them
1018    // from the default list here.
1019  0 StringBuffer coloursFound = new StringBuffer();
1020  0 StringTokenizer st = new StringTokenizer(files, "|");
1021  0 while (st.hasMoreElements())
1022    {
1023  0 String file = st.nextToken();
1024  0 try
1025    {
1026  0 UserColourScheme ucs = ColourSchemeLoader.loadColourScheme(file);
1027  0 if (ucs != null)
1028    {
1029  0 if (coloursFound.length() > 0)
1030    {
1031  0 coloursFound.append("|");
1032    }
1033  0 coloursFound.append(file);
1034  0 ColourSchemes.getInstance().registerColourScheme(ucs);
1035    }
1036    } catch (Exception ex)
1037    {
1038  0 System.out.println("Error loading User ColourFile\n" + ex);
1039    }
1040    }
1041  0 if (!files.equals(coloursFound.toString()))
1042    {
1043  0 if (coloursFound.toString().length() > 1)
1044    {
1045  0 setProperty(UserDefinedColours.USER_DEFINED_COLOURS,
1046    coloursFound.toString());
1047    }
1048    else
1049    {
1050  0 applicationProperties
1051    .remove(UserDefinedColours.USER_DEFINED_COLOURS);
1052    }
1053    }
1054    }
1055    }