From e37afe48f773ece5a7184fc2917439fde374879d Mon Sep 17 00:00:00 2001
From: Simon Barner <barner@fortiss.org>
Date: Wed, 25 Apr 2018 18:28:51 +0200
Subject: [PATCH] Implement cache for is*() predicates

- Methods can be used in UI to implement OS-specific workarounds
- Better avoid extensive querying of system properties and environment

Issue-Ref: 2443
Signed-off-by: Simon Barner <barner@fortiss.org>
---
 .../org/fortiss/tooling/base/utils/.ratings   |  2 +-
 .../tooling/base/utils/SystemUtils.java       | 48 ++++++++++++++++---
 2 files changed, 42 insertions(+), 8 deletions(-)

diff --git a/org.fortiss.tooling.base/src/org/fortiss/tooling/base/utils/.ratings b/org.fortiss.tooling.base/src/org/fortiss/tooling/base/utils/.ratings
index 1904c50db..386500d45 100644
--- a/org.fortiss.tooling.base/src/org/fortiss/tooling/base/utils/.ratings
+++ b/org.fortiss.tooling.base/src/org/fortiss/tooling/base/utils/.ratings
@@ -13,6 +13,6 @@ PointUtils.java b21c92cc8e80ece9d87ede8a750f4de314379743 GREEN
 PointsUtils.java bad69811c59004948929f6a57edd5a79c0bf8643 GREEN
 RectangleLayoutUtils.java cdd61d162761da7f3e1d3512264135b9b0d564ff GREEN
 SnapToGridUtils.java 413785d7a8655db31a129b6f821e1d5f859aa726 GREEN
-SystemUtils.java bd40519b5e286f274f47815ccc8d320fd65c2c0a YELLOW
+SystemUtils.java 622dd176fa0febc1e92845cb0f988e503cc30efb YELLOW
 VisualizationModelElementFactory.java 18e67450ee4cf4a03dc88a10becb0fb6ce4c1bad GREEN
 ZoomUtils.java a339613fde18281bed3b55b529a053d348545bc7 GREEN
diff --git a/org.fortiss.tooling.base/src/org/fortiss/tooling/base/utils/SystemUtils.java b/org.fortiss.tooling.base/src/org/fortiss/tooling/base/utils/SystemUtils.java
index bd40519b5..622dd176f 100644
--- a/org.fortiss.tooling.base/src/org/fortiss/tooling/base/utils/SystemUtils.java
+++ b/org.fortiss.tooling.base/src/org/fortiss/tooling/base/utils/SystemUtils.java
@@ -26,37 +26,71 @@ import static java.util.UUID.randomUUID;
  */
 public class SystemUtils {
 
+	/** Cache for {@link #isWindowsPlatform()}. */
+	private static Boolean isWindowsPlatform = null;
+
+	/** Cache for {@link #isLinuxPlatform()}. */
+	private static Boolean isLinuxPlatform = null;
+
+	/** Cache for {@link #isMacOSXPlatform()}. */
+	private static Boolean isMacOSXPlatform = null;
+
+	/** Cache for {@link #isVm64BitArch()}. */
+	private static Boolean isVm64BitArch;
+
+	/** Cache for {@link #isOs64BitArch()}. */
+	private static Boolean isOs64BitArch;
+
 	/** Predicate if the current platform is Windows. */
 	public static boolean isWindowsPlatform() {
+		if(isWindowsPlatform != null) {
+			return isWindowsPlatform;
+		}
 		String osName = System.getProperty("os.name");
-		return osName != null && osName.contains("Windows");
+		isWindowsPlatform = osName != null && osName.contains("Windows");
+
+		return isWindowsPlatform;
 	}
 
 	/** Predicate if the current platform is Linux. */
 	public static boolean isLinuxPlatform() {
+		if(isLinuxPlatform != null) {
+			return isLinuxPlatform;
+		}
 		String osName = System.getProperty("os.name");
-		return osName != null && osName.contains("Linux");
+		isLinuxPlatform = osName != null && osName.contains("Linux");
+		return isLinuxPlatform;
 	}
 
 	/** Predicate if the current platform is Mac OS X. */
 	public static boolean isMacOSXPlatform() {
+		if(isMacOSXPlatform != null) {
+			return isMacOSXPlatform;
+		}
 		String osName = System.getProperty("os.name");
-		return osName != null && osName.contains("Mac OS X.");
+		isMacOSXPlatform = osName != null && osName.contains("Mac OS X.");
+		return isMacOSXPlatform;
 	}
 
 	/** Predicate if the current <b>Java VM</b> architecture is 64 bit. */
 	public static boolean isVm64BitArch() {
+		if(isVm64BitArch != null) {
+			return isVm64BitArch;
+		}
 		String osArch = System.getProperty("os.arch");
-		return osArch != null && osArch.contains("64");
+		isVm64BitArch = osArch != null && osArch.contains("64");
+		return isVm64BitArch;
 	}
 
 	/** Predicate if the current <b>OS</b> architecture is 64 bit. */
 	public static boolean isOs64BitArch() {
-		if(isWindowsPlatform()) {
-			return System.getenv("ProgramFiles(x86)") != null;
+		if(isOs64BitArch != null) {
+			return isOs64BitArch;
 		}
 
-		return isVm64BitArch();
+		String progFilesX86 = System.getenv("ProgramFiles(x86)");
+		isOs64BitArch = isWindowsPlatform() ? progFilesX86 != null : isVm64BitArch();
+		return isOs64BitArch;
 	}
 
 	/**
-- 
GitLab