Merge branch 'documentation/JAL-3111_release_211' into bug/JAL-2830_editManglesDatase...
[jalview.git] / getdown / src / getdown / core / src / main / java / com / threerings / getdown / util / VersionUtil.java
diff --git a/getdown/src/getdown/core/src/main/java/com/threerings/getdown/util/VersionUtil.java b/getdown/src/getdown/core/src/main/java/com/threerings/getdown/util/VersionUtil.java
new file mode 100644 (file)
index 0000000..49e4e6e
--- /dev/null
@@ -0,0 +1,114 @@
+//
+// Getdown - application installer, patcher and launcher
+// Copyright (C) 2004-2018 Getdown authors
+// https://github.com/threerings/getdown/blob/master/LICENSE
+
+package com.threerings.getdown.util;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.PrintStream;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import com.threerings.getdown.data.SysProps;
+import static com.threerings.getdown.Log.log;
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+/**
+ * Version related utilities.
+ */
+public class VersionUtil
+{
+    /**
+     * Reads a version number from a file.
+     */
+    public static long readVersion (File vfile)
+    {
+        long fileVersion = -1;
+        try (BufferedReader bin =
+             new BufferedReader(new InputStreamReader(new FileInputStream(vfile), UTF_8))) {
+            String vstr = bin.readLine();
+            if (!StringUtil.isBlank(vstr)) {
+                fileVersion = Long.parseLong(vstr);
+            }
+        } catch (Exception e) {
+            log.info("Unable to read version file: " + e.getMessage());
+        }
+
+        return fileVersion;
+    }
+
+    /**
+     * Writes a version number to a file.
+     */
+    public static void writeVersion (File vfile, long version) throws IOException
+    {
+        try (PrintStream out = new PrintStream(new FileOutputStream(vfile))) {
+            out.println(version);
+        } catch (Exception e) {
+            log.warning("Unable to write version file: " + e.getMessage());
+        }
+    }
+
+    /**
+     * Parses {@code versStr} using {@code versRegex} into a (long) integer version number.
+     * @see SysProps#parseJavaVersion
+     */
+    public static long parseJavaVersion (String versRegex, String versStr)
+    {
+        Matcher m = Pattern.compile(versRegex).matcher(versStr);
+        if (!m.matches()) return 0L;
+
+        long vers = 0L;
+        for (int ii = 1; ii <= m.groupCount(); ii++) {
+            String valstr = m.group(ii);
+            int value = (valstr == null) ? 0 : parseInt(valstr);
+            vers *= 100;
+            vers += value;
+        }
+        return vers;
+    }
+
+    /**
+     * Reads and parses the version from the {@code release} file bundled with a JVM.
+     */
+    public static long readReleaseVersion (File relfile, String versRegex)
+    {
+        try (BufferedReader in =
+             new BufferedReader(new InputStreamReader(new FileInputStream(relfile), UTF_8))) {
+            String line = null, relvers = null;
+            while ((line = in.readLine()) != null) {
+                if (line.startsWith("JAVA_VERSION=")) {
+                    relvers = line.substring("JAVA_VERSION=".length()).replace('"', ' ').trim();
+                }
+            }
+
+            if (relvers == null) {
+                log.warning("No JAVA_VERSION line in 'release' file", "file", relfile);
+                return 0L;
+            }
+            return parseJavaVersion(versRegex, relvers);
+
+        } catch (Exception e) {
+            log.warning("Failed to read version from 'release' file", "file", relfile, e);
+            return 0L;
+        }
+    }
+
+    private static int parseInt (String str) {
+        int value = 0;
+        for (int ii = 0, ll = str.length(); ii < ll; ii++) {
+            char c = str.charAt(ii);
+            if (c >= '0' && c <= '9') {
+                value *= 10;
+                value += (c - '0');
+            }
+        }
+        return value;
+    }
+}