Merge branch 'develop' into improvement/JAL-4206_improve_JalviewFileChooser_for_flatlaf
[jalview.git] / src / jalview / bin / Cache.java
index 5aab0ec..fc9ddda 100755 (executable)
@@ -52,6 +52,7 @@ import java.util.TreeSet;
 import javax.swing.LookAndFeel;
 import javax.swing.UIManager;
 
+import jalview.analytics.GoogleAnalytics4;
 import jalview.datamodel.PDBEntry;
 import jalview.gui.Preferences;
 import jalview.gui.UserDefinedColours;
@@ -962,93 +963,138 @@ public class Cache
 
   protected static Class jgoogleanalyticstracker = null;
 
+  private static boolean useGA4 = true;
+
   /**
    * Initialise the google tracker if it is not done already.
    */
   public static void initGoogleTracker()
   {
-    if (tracker == null)
+    if (useGA4)
     {
-      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)
-        {
-          Console.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";
+      GoogleAnalytics4.setEnabled(true);
+
+      String appName = ChannelProperties.getProperty("app_name")
+              + " Desktop";
+      String version = Cache.getProperty("VERSION") + "_"
+              + Cache.getDefault("BUILD_DATE", "unknown");
+      String path;
+      /* we don't want to encode ':' as "%3A" for backward compatibility with the UA setup
       try
       {
-        // Google analytics tracking code for Library Finder
-        tracker = jgoogleanalyticstracker
-                .getConstructor(new Class[]
-                { String.class, String.class, String.class })
-                .newInstance(new Object[]
-                { ChannelProperties.getProperty("app_name") + " Desktop",
-                    (vrs = Cache.getProperty("VERSION") + "_"
-                            + 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)
+        path = "/" + String.join("/", URLEncoder.encode(appName, "UTF-8"),
+                URLEncoder.encode(version, "UTF-8"),
+                URLEncoder.encode(APPLICATION_STARTED, "UTF-8"));
+      } catch (UnsupportedEncodingException e)
       {
-        re = e;
-      } catch (Exception e)
-      {
-        ex = e;
-      } catch (Error e)
-      {
-        err = e;
+      */
+      path = ("/" + String.join("/", appName, version, APPLICATION_STARTED))
+              .replace(' ', '+');
+      /*
       }
-      if (re != null || ex != null || err != null)
+      */
+      GoogleAnalytics4 ga4 = GoogleAnalytics4.getInstance();
+
+      // This will add a page_view similar to the old UA analytics.
+      // We probably want to get rid of this once the application_launch event
+      // is being processed properly.
+      ga4.sendAnalytics("page_view", "page_location", path, "page_title",
+              APPLICATION_STARTED);
+
+      // This will send a new "application_launch" event with parameters
+      // including the old-style "path", the channel name and version
+      ga4.sendAnalytics("application_launch", true, "page_location", path);
+    }
+    else
+    {
+      if (tracker == null)
       {
-        if (re != null)
+        if (jgoogleanalyticstracker == null)
         {
-          Console.debug("Caught runtime exception in googletracker init:",
-                  re);
+          // 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)
+          {
+            Console.debug(
+                    "com.boxysystems.jgoogleanalytics package is not present - tracking not enabled.");
+            tracker = null;
+            jgoogleanalyticstracker = null;
+            trackerfocus = null;
+            return;
+          }
         }
-        if (ex != null)
+        // 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[]
+                  { ChannelProperties.getProperty("app_name") + " Desktop",
+                      (vrs = Cache.getProperty("VERSION") + "_"
+                              + 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)
         {
-          Console.warn(
-                  "Failed to initialise GoogleTracker for Jalview Desktop with version "
-                          + vrs,
-                  ex);
+          ex = e;
+        } catch (Error e)
+        {
+          err = e;
+        }
+        if (re != null || ex != null || err != null)
+        {
+          if (re != null)
+          {
+            Console.debug("Caught runtime exception in googletracker init:",
+                    re);
+          }
+          if (ex != null)
+          {
+            Console.warn(
+                    "Failed to initialise GoogleTracker for Jalview Desktop with version "
+                            + vrs,
+                    ex);
+          }
+          if (err != null)
+          {
+            Console.error(
+                    "Whilst initing GoogleTracker for Jalview Desktop version "
+                            + vrs,
+                    err);
+          }
         }
-        if (err != null)
+        else
         {
-          Console.error(
-                  "Whilst initing GoogleTracker for Jalview Desktop version "
-                          + vrs,
-                  err);
+          Console.debug("Successfully initialised tracker.");
         }
       }
-      else
-      {
-        Console.debug("Successfully initialised tracker.");
-      }
     }
   }
 
+  private static final String APPLICATION_STARTED = "Application Started.";
+
   /**
    * get the user's default colour if available
    * 
@@ -1478,10 +1524,11 @@ public class Cache
                 if (customProxySet &&
                 // we have a username but no password for the scheme being
                 // requested
-                (protocol.equalsIgnoreCase("http")
-                        && (httpUser != null && httpUser.length() > 0
-                                && (httpPassword == null
-                                        || httpPassword.length == 0)))
+                        (protocol.equalsIgnoreCase("http")
+                                && (httpUser != null
+                                        && httpUser.length() > 0
+                                        && (httpPassword == null
+                                                || httpPassword.length == 0)))
                         || (protocol.equalsIgnoreCase("https")
                                 && (httpsUser != null
                                         && httpsUser.length() > 0