Merge pull request #3275 from jGauravGupta/FISH-5807-2

Filter jvm-options based on VM name
diff --git a/enterprise/payara.tooling/src/org/netbeans/modules/payara/tooling/data/JDKVersion.java b/enterprise/payara.tooling/src/org/netbeans/modules/payara/tooling/data/JDKVersion.java
index 24c2c15..a6f96f8 100644
--- a/enterprise/payara.tooling/src/org/netbeans/modules/payara/tooling/data/JDKVersion.java
+++ b/enterprise/payara.tooling/src/org/netbeans/modules/payara/tooling/data/JDKVersion.java
@@ -47,6 +47,11 @@
      */
     private final Optional<String> vendor;
 
+    /**
+     * JDK vm
+     */
+    private final Optional<String> vm;
+
     private final static int MAJOR_INDEX = 0;
     private final static int MINOR_INDEX = 1;
     private final static int SUBMINOR_INDEX = 2;
@@ -58,21 +63,23 @@
 
     private static final Short DEFAULT_VALUE = 0;
 
-    private JDKVersion(String version, String vendor) {
+    private JDKVersion(String version, String vendor, String vm) {
         short[] versions = parseVersions(version);
         this.major = versions[MAJOR_INDEX];
         this.minor = Optional.ofNullable(versions[MINOR_INDEX]);
         this.subminor = Optional.ofNullable(versions[SUBMINOR_INDEX]);
         this.update = Optional.ofNullable(versions[UPDATE_INDEX]);
         this.vendor = Optional.ofNullable(vendor);
+        this.vm = Optional.ofNullable(vm);
     }
 
-    JDKVersion(Short major, Optional<Short> minor, Optional<Short> subminor, Optional<Short> update, Optional<String> vendor) {
+    JDKVersion(Short major, Optional<Short> minor, Optional<Short> subminor, Optional<Short> update, Optional<String> vendor, Optional<String> vm) {
         this.major = major;
         this.minor = minor;
         this.subminor = subminor;
         this.update = update;
         this.vendor = vendor;
+        this.vm = vm;
     }
 
     /**
@@ -112,7 +119,7 @@
     }
 
     /**
-     * Get JDK Vendor.
+     * Get JDK Vendor name.
      *
      * @return JDK vendor.
      */
@@ -120,6 +127,15 @@
         return vendor;
     }
 
+    /**
+     * Get JDK VM name.
+     *
+     * @return JDK vm.
+     */
+    public Optional<String> getVM() {
+        return vm;
+    }
+
     public boolean gt(JDKVersion version) {
         if (major > version.getMajor()) {
             return true;
@@ -241,7 +257,7 @@
 
     public static JDKVersion toValue(String version) {
         if (version != null && version.matches(VERSION_MATCHER)) {
-            return new JDKVersion(version, null);
+            return new JDKVersion(version, null, null);
         } else {
             return null;
         }
@@ -249,7 +265,15 @@
 
     public static JDKVersion toValue(String version, String vendor) {
         if (version != null && version.matches(VERSION_MATCHER)) {
-            return new JDKVersion(version, vendor);
+            return new JDKVersion(version, vendor, null);
+        } else {
+            return null;
+        }
+    }
+
+    public static JDKVersion toValue(String version, String vendor, String vm) {
+        if (version != null && version.matches(VERSION_MATCHER)) {
+            return new JDKVersion(version, vendor, vm);
         } else {
             return null;
         }
@@ -259,15 +283,12 @@
         return IDE_JDK_VERSION;
     }
 
-    public static boolean isCorrectJDK(JDKVersion jdkVersion, Optional<String> vendor, Optional<JDKVersion> minVersion, Optional<JDKVersion> maxVersion) {
+    public static boolean isCorrectJDK(JDKVersion jdkVersion, Optional<String> vendorOrVM, Optional<JDKVersion> minVersion, Optional<JDKVersion> maxVersion) {
         boolean correctJDK = true;
 
-        if (vendor.isPresent()) {
-            if (jdkVersion.getVendor().isPresent()) {
-                correctJDK = jdkVersion.getVendor().get().contains(vendor.get());
-            } else {
-                correctJDK = false;
-            }
+        if (vendorOrVM.isPresent()) {
+            correctJDK = jdkVersion.getVendor().map(vendor -> vendor.contains(vendorOrVM.get())).orElse(false)
+                    || jdkVersion.getVM().map(vm -> vm.contains(vendorOrVM.get())).orElse(false);
         }
         if (correctJDK && minVersion.isPresent()) {
             correctJDK = jdkVersion.ge(minVersion.get());
@@ -288,6 +309,7 @@
 
     private static void initialize() {
         String vendor = System.getProperty("java.vendor"); // NOI18N
+        String vm = System.getProperty("java.vm.name"); // NOI18N
         /*
             In JEP 223 java.specification.version will be a single number versioning , not a dotted versioning . 
             For JDK 8:
@@ -308,7 +330,8 @@
                 Optional.of(versions[MINOR_INDEX]),
                 Optional.of(versions[SUBMINOR_INDEX]),
                 Optional.of(versions[UPDATE_INDEX]),
-                Optional.of(vendor)
+                Optional.of(vendor),
+                Optional.of(vm)
         );
     }
 
diff --git a/enterprise/payara.tooling/src/org/netbeans/modules/payara/tooling/data/StartupArgsEntity.java b/enterprise/payara.tooling/src/org/netbeans/modules/payara/tooling/data/StartupArgsEntity.java
index 5c53d4f..f6ff41b 100644
--- a/enterprise/payara.tooling/src/org/netbeans/modules/payara/tooling/data/StartupArgsEntity.java
+++ b/enterprise/payara.tooling/src/org/netbeans/modules/payara/tooling/data/StartupArgsEntity.java
@@ -187,7 +187,8 @@
                     if (javaVersionLine != null) {
                         javaVersion = JDKVersion.toValue(
                                 javaVersionLine.substring(javaVersionLine.indexOf("\"") + 1, javaVersionLine.lastIndexOf("\"")), // NOI18N
-                                implementorLine != null ? implementorLine.substring(implementorLine.indexOf("\"") + 1, implementorLine.lastIndexOf("\"")) : null // NOI18N
+                                implementorLine != null ? implementorLine.substring(implementorLine.indexOf("\"") + 1, implementorLine.lastIndexOf("\"")) : null, // NOI18N
+                                null
                         );
                     }
                 } catch (IOException ex) {
diff --git a/enterprise/payara.tooling/src/org/netbeans/modules/payara/tooling/server/ServerTasks.java b/enterprise/payara.tooling/src/org/netbeans/modules/payara/tooling/server/ServerTasks.java
index 935c3a6..6ceaefe 100644
--- a/enterprise/payara.tooling/src/org/netbeans/modules/payara/tooling/server/ServerTasks.java
+++ b/enterprise/payara.tooling/src/org/netbeans/modules/payara/tooling/server/ServerTasks.java
@@ -167,7 +167,7 @@
         List<String> optList
                 = jvmConfigReader.getJvmOptions()
                         .stream()
-                        .filter(fullOption -> JDKVersion.isCorrectJDK(javaVersion, fullOption.vendor, fullOption.minVersion, fullOption.maxVersion))
+                        .filter(fullOption -> JDKVersion.isCorrectJDK(javaVersion, fullOption.vendorOrVM, fullOption.minVersion, fullOption.maxVersion))
                         .map(fullOption -> fullOption.option)
                         .collect(toList());
 
diff --git a/enterprise/payara.tooling/src/org/netbeans/modules/payara/tooling/server/parser/JvmConfigReader.java b/enterprise/payara.tooling/src/org/netbeans/modules/payara/tooling/server/parser/JvmConfigReader.java
index d466ae9..f85717d 100644
--- a/enterprise/payara.tooling/src/org/netbeans/modules/payara/tooling/server/parser/JvmConfigReader.java
+++ b/enterprise/payara.tooling/src/org/netbeans/modules/payara/tooling/server/parser/JvmConfigReader.java
@@ -201,7 +201,9 @@
     public static class JvmOption {
 
         public final String option;
+        @Deprecated
         public final Optional<String> vendor;
+        public final Optional<String> vendorOrVM;
         public final Optional<JDKVersion> minVersion;
         public final Optional<JDKVersion> maxVersion;
 
@@ -217,21 +219,22 @@
 
         public JvmOption(String option) {
             Matcher matcher = PATTERN.matcher(option);
+            this.vendor = Optional.empty();
             if (matcher.matches()) {
                 if (matcher.group(1).contains("-")  // NOI18N
                         && Character.isLetter(matcher.group(1).charAt(0))) {
                     String[] parts = matcher.group(1).split("-"); // NOI18N
-                    this.vendor = Optional.ofNullable(parts[0]);
+                    this.vendorOrVM = Optional.ofNullable(parts[0]);
                     this.minVersion = Optional.ofNullable(JDKVersion.toValue(parts[1]));
                 } else {
-                    this.vendor = Optional.empty();
+                    this.vendorOrVM = Optional.empty();
                     this.minVersion = Optional.ofNullable(JDKVersion.toValue(matcher.group(1)));
                 }
                 this.maxVersion = Optional.ofNullable(JDKVersion.toValue(matcher.group(2)));
                 this.option = matcher.group(3);
             } else {
                 this.option = option;
-                this.vendor = Optional.empty();
+                this.vendorOrVM = Optional.empty();
                 this.minVersion = Optional.empty();
                 this.maxVersion = Optional.empty();
             }
@@ -240,6 +243,7 @@
         public JvmOption(String option, String minVersion, String maxVersion) {
             this.option = option;
             this.vendor = Optional.empty();
+            this.vendorOrVM = Optional.empty();
             this.minVersion = Optional.ofNullable(JDKVersion.toValue(minVersion));
             this.maxVersion = Optional.ofNullable(JDKVersion.toValue(maxVersion));
         }
diff --git a/enterprise/payara.tooling/test/unit/src/org/netbeans/modules/payara/tooling/data/JDKVersionTest.java b/enterprise/payara.tooling/test/unit/src/org/netbeans/modules/payara/tooling/data/JDKVersionTest.java
index 8e3c1e2..8759aa5 100644
--- a/enterprise/payara.tooling/test/unit/src/org/netbeans/modules/payara/tooling/data/JDKVersionTest.java
+++ b/enterprise/payara.tooling/test/unit/src/org/netbeans/modules/payara/tooling/data/JDKVersionTest.java
@@ -40,23 +40,23 @@
     public void parseJDKVersion() {
         Map<String, JDKVersion> jdkVersions = new HashMap<>();
         jdkVersions.put("1.8",
-                new JDKVersion((short) 1, Optional.of((short) 8), Optional.of((short) 0), Optional.of((short) 0), Optional.empty()));
+                new JDKVersion((short) 1, Optional.of((short) 8), Optional.of((short) 0), Optional.of((short) 0), Optional.empty(), Optional.empty()));
         jdkVersions.put("1.8.0",
-                new JDKVersion((short) 1, Optional.of((short) 8), Optional.of((short) 0), Optional.of((short) 0), Optional.empty()));
+                new JDKVersion((short) 1, Optional.of((short) 8), Optional.of((short) 0), Optional.of((short) 0), Optional.empty(), Optional.empty()));
         jdkVersions.put("1.8.0u121",
-                new JDKVersion((short) 1, Optional.of((short) 8), Optional.of((short) 0), Optional.of((short) 121), Optional.empty()));
+                new JDKVersion((short) 1, Optional.of((short) 8), Optional.of((short) 0), Optional.of((short) 121), Optional.empty(), Optional.empty()));
         jdkVersions.put("1.8.0_191",
-                new JDKVersion((short) 1, Optional.of((short) 8), Optional.of((short) 0), Optional.of((short) 191), Optional.empty()));
+                new JDKVersion((short) 1, Optional.of((short) 8), Optional.of((short) 0), Optional.of((short) 191), Optional.empty(), Optional.empty()));
         jdkVersions.put("1.8.0_232-ea-8u232-b09-0ubuntu1-b09",
-                new JDKVersion((short) 1, Optional.of((short) 8), Optional.of((short) 0), Optional.of((short) 232), Optional.empty()));
+                new JDKVersion((short) 1, Optional.of((short) 8), Optional.of((short) 0), Optional.of((short) 232), Optional.empty(), Optional.empty()));
         jdkVersions.put("9",
-                new JDKVersion((short) 9, Optional.of((short) 0), Optional.of((short) 0), Optional.of((short) 0), Optional.empty()));
+                new JDKVersion((short) 9, Optional.of((short) 0), Optional.of((short) 0), Optional.of((short) 0), Optional.empty(), Optional.empty()));
         jdkVersions.put("11.0.6",
-                new JDKVersion((short) 11, Optional.of((short) 0), Optional.of((short) 6), Optional.of((short) 0), Optional.empty()));
+                new JDKVersion((short) 11, Optional.of((short) 0), Optional.of((short) 6), Optional.of((short) 0), Optional.empty(), Optional.empty()));
         jdkVersions.put("11.0.6_234",
-                new JDKVersion((short) 11, Optional.of((short) 0), Optional.of((short) 6), Optional.of((short) 234), Optional.empty()));
+                new JDKVersion((short) 11, Optional.of((short) 0), Optional.of((short) 6), Optional.of((short) 234), Optional.empty(), Optional.empty()));
         jdkVersions.put("11.0.6u234",
-                new JDKVersion((short) 11, Optional.of((short) 0), Optional.of((short) 6), Optional.of((short) 234), Optional.empty()));
+                new JDKVersion((short) 11, Optional.of((short) 0), Optional.of((short) 6), Optional.of((short) 234), Optional.empty(), Optional.empty()));
 
         for (Entry<String, JDKVersion> version : jdkVersions.entrySet()) {
             assertTrue(JDKVersion.toValue(version.getKey()).equals(version.getValue()), version.getKey());