+ /**
+ * internal vamsas class discovery state
+ */
+ private static int groovyJarsArePresent = -1;
+
+ /**
+ * Searches for vamsas client classes on class path.
+ *
+ * @return true if vamsas client is present on classpath
+ */
+ public static boolean groovyJarsPresent()
+ {
+ if (groovyJarsArePresent == -1)
+ {
+ try
+ {
+ if (Cache.class.getClassLoader().loadClass(
+ "groovy.lang.GroovyObject") != null)
+ {
+ jalview.bin.Cache.log
+ .debug("Found Groovy (groovy.lang.GroovyObject can be loaded)");
+ groovyJarsArePresent = 1;
+ Logger lgclient = Logger.getLogger("groovy");
+ lgclient.setLevel(Level.toLevel(Cache.getDefault(
+ "logs.Groovy.Level", Level.INFO.toString())));
+
+ lgclient.addAppender(log.getAppender("JalviewLogger"));
+ // Tell the user that debug is enabled
+ lgclient.debug("Jalview Groovy Client Debugging Output Follows.");
+ }
+ } catch (Error e)
+ {
+ groovyJarsArePresent = 0;
+ jalview.bin.Cache.log.debug("Groovy Classes are not present", e);
+ } catch (Exception e)
+ {
+ groovyJarsArePresent = 0;
+ jalview.bin.Cache.log.debug("Groovy Classes are not present");
+ }
+ }
+ return (groovyJarsArePresent > 0);
+ }
+
+ /**
+ * generate Das1Sources from the local das source list
+ *
+ * @return Vector of Das1Sources
+ */
+ public static Vector getLocalDasSources()
+ {
+ Vector localSources = new Vector();
+ String local = jalview.bin.Cache.getProperty("DAS_LOCAL_SOURCE");
+ if (local != null)
+ {
+ StringTokenizer st = new StringTokenizer(local, "\t");
+ while (st.hasMoreTokens())
+ {
+ String token = st.nextToken();
+ int bar = token.indexOf("|");
+ Das1Source source = new Das1Source();
+ source.setUrl(token.substring(bar + 1));
+ if (source.getUrl().startsWith("sequence:"))
+ {
+ source.setUrl(source.getUrl().substring(9));
+ // this source also serves sequences as well as features
+ source.setCapabilities(new String[]
+ { "sequence", "features" });
+ }
+ else
+ {
+ // default is that all user added sources serve features
+ source.setCapabilities(new String[]
+ { "features" });
+ }
+
+ source.setNickname(token.substring(0, bar));
+
+ localSources.addElement(source);
+ }
+ }
+ return localSources;
+ }
+
+ /**
+ * GA tracker object - actually JGoogleAnalyticsTracker null if tracking not
+ * enabled.
+ */
+ protected static Object tracker = null;
+
+ protected static Class trackerfocus = null;
+
+ protected static Class jgoogleanalyticstracker = null;
+
+ /**
+ * Initialise the google tracker if it is not done already.
+ */
+ public static void initGoogleTracker()
+ {
+ if (tracker == null)
+ {
+ if (jgoogleanalyticstracker == null)
+ {
+ // try to get the tracker class
+ try
+ {
+ jgoogleanalyticstracker = Cache.class
+ .getClassLoader()
+ .loadClass(
+ "com.boxysystems.jgoogleanalytics.JGoogleAnalyticsTracker");
+ trackerfocus = Cache.class.getClassLoader().loadClass(
+ "com.boxysystems.jgoogleanalytics.FocusPoint");
+ } catch (Exception e)
+ {
+ log.debug("com.boxysystems.jgoogleanalytics package is not present - tracking not enabled.");
+ tracker = null;
+ jgoogleanalyticstracker = null;
+ trackerfocus = null;
+ return;
+ }
+ }
+ // now initialise tracker
+ Exception re = null, ex = null;
+ Error err = null;
+ String vrs = "No Version Accessible";
+ try
+ {
+ // Google analytics tracking code for Library Finder
+ tracker = jgoogleanalyticstracker.getConstructor(new Class[]
+ { String.class, String.class, String.class }).newInstance(
+ new Object[]
+ {
+ "Jalview Desktop",
+ (vrs = jalview.bin.Cache.getProperty("VERSION")
+ + "_"
+ + jalview.bin.Cache.getDefault("BUILD_DATE",
+ "unknown")), "UA-9060947-1" });
+ jgoogleanalyticstracker.getMethod("trackAsynchronously",
+ new Class[]
+ { trackerfocus }).invoke(tracker, new Object[]
+ { trackerfocus.getConstructor(new Class[]
+ { String.class }).newInstance(new Object[]
+ { "Application Started." }) });
+ } catch (RuntimeException e)
+ {
+ re = e;
+ } catch (Exception e)
+ {
+ ex = e;
+ } catch (Error e)
+ {
+ err = e;
+ }
+ if (re != null || ex != null || err != null)
+ {
+ if (log != null)
+ {
+ if (re != null)
+ log.debug("Caught runtime exception in googletracker init:", re);
+ if (ex != null)
+ log.warn(
+ "Failed to initialise GoogleTracker for Jalview Desktop with version "
+ + vrs, ex);
+ if (err != null)
+ log.error(
+ "Whilst initing GoogleTracker for Jalview Desktop version "
+ + vrs, err);
+ }
+ else
+ {
+ if (re != null)
+ {
+ System.err
+ .println("Debug: Caught runtime exception in googletracker init:"
+ + vrs);
+ re.printStackTrace();
+ }
+ if (ex != null)
+ {
+ System.err
+ .println("Warning: Failed to initialise GoogleTracker for Jalview Desktop with version "
+ + vrs);
+ ex.printStackTrace();
+ }
+
+ if (err != null)
+ {
+ System.err
+ .println("ERROR: Whilst initing GoogleTracker for Jalview Desktop version "
+ + vrs);
+ err.printStackTrace();
+ }
+ }
+ }
+ else
+ {
+ log.debug("Successfully initialised tracker.");
+ }
+ }
+ }
+
+ /**
+ * get the user's default colour if available
+ * @param property
+ * @param defcolour
+ * @return
+ */
+ public static Color getDefaultColour(String property, Color defcolour)
+ {
+ String colprop = getProperty(property);
+ if (colprop==null) {
+ return defcolour;
+ }
+ Color col = jalview.schemes.ColourSchemeProperty.getAWTColorFromName(colprop);
+ if (col==null)
+ {
+ try {
+ col = new jalview.schemes.UserColourScheme(colprop).findColour('A');
+ } catch (Exception ex)
+ {
+ log.warn("Couldn't parse '"+colprop+"' as a colour for "+property);
+ col=null;
+ }
+ }
+ return (col==null) ? defcolour: col;
+ }
+
+ /**
+ * store a colour as a Jalview user default property
+ * @param property
+ * @param colour
+ */
+ public static void setColourProperty(String property, Color colour)
+ {
+ setProperty(property, jalview.util.Format
+ .getHexString(colour));
+ }
+
+ public static final DateFormat date_format = SimpleDateFormat.getDateTimeInstance();
+
+ /**
+ * store a date in a jalview property
+ * @param string
+ * @param time
+ */
+ public static void setDateProperty(String property, Date time)
+ {
+ setProperty(property, date_format.format(time));
+ }
+ /**
+ * read a date stored in a jalview property
+ * @param property
+ * @return valid date as stored by setDateProperty, or null
+ *
+ */
+ public static Date getDateProperty(String property)
+ {
+ String val = getProperty(property);
+ if (val!=null)
+ {
+ try {
+ return date_format.parse(val);
+ } catch (Exception ex)
+ {
+ System.err.println("Invalid or corrupt date in property '"+property+"' : value was '"+val+"'");
+ }
+ }
+ return null;
+ }