This is an automated email from the ASF dual-hosted git repository.

jgauravgupta pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/netbeans.git


The following commit(s) were added to refs/heads/master by this push:
     new 1a143c8  NETBEANS-3573 Unable to start the Payara server due to JDK 
version NumberFormatException
     new 8863b18  Merge pull request #1770 from jGauravGupta/NETBEANS-3573
1a143c8 is described below

commit 1a143c81228c901f21b9934f97696b3b29d50aef
Author: Gaurav Gupta <[email protected]>
AuthorDate: Wed Dec 11 10:52:14 2019 +0530

    NETBEANS-3573 Unable to start the Payara server due to JDK version 
NumberFormatException
    
    Signed-off-by: Gaurav Gupta <[email protected]>
---
 .../org-netbeans-modules-payara-tooling.sig        |   3 +-
 .../modules/payara/tooling/data/JDKVersion.java    | 166 ++++++++++-----------
 .../payara/tooling/data/StartupArgsEntity.java     |  31 ++--
 .../modules/payara/tooling/server/ServerTasks.java |   3 +-
 .../tooling/server/parser/JvmConfigReader.java     |  10 +-
 .../payara/tooling/data/JDKVersionTest.java        |  66 ++++++++
 6 files changed, 174 insertions(+), 105 deletions(-)

diff --git 
a/enterprise/payara.tooling/nbproject/org-netbeans-modules-payara-tooling.sig 
b/enterprise/payara.tooling/nbproject/org-netbeans-modules-payara-tooling.sig
index 99fca79..fce0555 100644
--- 
a/enterprise/payara.tooling/nbproject/org-netbeans-modules-payara-tooling.sig
+++ 
b/enterprise/payara.tooling/nbproject/org-netbeans-modules-payara-tooling.sig
@@ -1227,7 +1227,6 @@ cons public init()
 supr java.lang.Object
 
 CLSS public final org.netbeans.modules.payara.tooling.data.JDKVersion
-fld public static org.netbeans.modules.payara.tooling.data.JDKVersion 
IDE_JDK_VERSION
 meth public boolean equals(java.lang.Object)
 meth public boolean ge(org.netbeans.modules.payara.tooling.data.JDKVersion)
 meth public boolean gt(org.netbeans.modules.payara.tooling.data.JDKVersion)
@@ -1240,7 +1239,7 @@ meth public java.util.Optional<java.lang.Short> 
getSubMinor()
 meth public java.util.Optional<java.lang.Short> getUpdate()
 meth public short getMajor()
 meth public static boolean 
isCorrectJDK(java.util.Optional<org.netbeans.modules.payara.tooling.data.JDKVersion>,java.util.Optional<org.netbeans.modules.payara.tooling.data.JDKVersion>)
-meth public static boolean 
isCorrectJDK(org.netbeans.modules.payara.tooling.data.JDKVersion,java.util.Optional<org.netbeans.modules.payara.tooling.data.JDKVersion>,java.util.Optional<org.netbeans.modules.payara.tooling.data.JDKVersion>)
+meth public static boolean 
isCorrectJDK(org.netbeans.modules.payara.tooling.data.JDKVersion,java.util.Optional<java.lang.String>,java.util.Optional<org.netbeans.modules.payara.tooling.data.JDKVersion>,java.util.Optional<org.netbeans.modules.payara.tooling.data.JDKVersion>)
 meth public static org.netbeans.modules.payara.tooling.data.JDKVersion 
getDefaultPlatformVersion()
 meth public static org.netbeans.modules.payara.tooling.data.JDKVersion 
toValue(java.lang.String)
 supr java.lang.Object
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 873cbcd..24c2c15 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
@@ -41,45 +41,38 @@ public final class JDKVersion {
      * Update version number.
      */
     private final Optional<Short> update;
-    
+
     /**
      * JDK vendor
      */
     private final Optional<String> vendor;
 
-    public static JDKVersion IDE_JDK_VERSION;
+    private final static int MAJOR_INDEX = 0;
+    private final static int MINOR_INDEX = 1;
+    private final static int SUBMINOR_INDEX = 2;
+    private final static int UPDATE_INDEX = 3;
 
-    private static final String VERSION_MATCHER = "([0-9]+[\\._u\\-]+)*[0-9]+";
+    private static JDKVersion IDE_JDK_VERSION;
 
-    // split java version into it's constituent parts, i.e.
-    // 1.2.3.4 -> [ 1, 2, 3, 4]
-    // 1.2.3u4 -> [ 1, 2, 3, 4]
-    // 1.2.3_4 -> [ 1, 2, 3, 4]
-    private static final String VERSION_SPLITTER = "[\\._u\\-]+";
+    private static final String VERSION_MATCHER = 
"(\\d+(\\.\\d+)*)([_u\\-]+[\\S]+)*";
 
     private static final Short DEFAULT_VALUE = 0;
 
-    private JDKVersion(String version) {
-        if (version.contains("-")) { // NOI18N
-            String[] versionSplit = version.split("-"); // NOI18N
-            vendor = versionSplit.length > 0 ? Optional.of(versionSplit[0]) : 
Optional.empty();
-            version = versionSplit.length > 1 ? versionSplit[1] : ""; // NOI18N
-        } else {
-            vendor = Optional.empty();
-        }
-        String[] split = version.split(VERSION_SPLITTER);
-        major = split.length > 0 ? Short.parseShort(split[0]) : 0;
-        minor = split.length > 1 ? Optional.of(Short.parseShort(split[1])) : 
Optional.empty();
-        subminor = split.length > 2 ? Optional.of(Short.parseShort(split[2])) 
: Optional.empty();
-        update = split.length > 3 ? Optional.of(Short.parseShort(split[3])) : 
Optional.empty();
+    private JDKVersion(String version, String vendor) {
+        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);
     }
 
-    private JDKVersion(Short major, Short minor, Short subminor, Short update, 
String vendor) {
+    JDKVersion(Short major, Optional<Short> minor, Optional<Short> subminor, 
Optional<Short> update, Optional<String> vendor) {
         this.major = major;
-        this.minor = Optional.of(minor);
-        this.subminor = Optional.of(subminor);
-        this.update = Optional.of(update);
-        this.vendor = Optional.of(vendor);
+        this.minor = minor;
+        this.subminor = subminor;
+        this.update = update;
+        this.vendor = vendor;
     }
 
     /**
@@ -117,8 +110,8 @@ public final class JDKVersion {
     public Optional<Short> getUpdate() {
         return update;
     }
-    
-     /**
+
+    /**
      * Get JDK Vendor.
      *
      * @return JDK vendor.
@@ -232,7 +225,8 @@ public final class JDKVersion {
 
     @Override
     public String toString() {
-        StringBuilder value = new StringBuilder(major);
+        StringBuilder value = new StringBuilder();
+        value.append(major);
         if (minor.isPresent()) {
             value.append('.').append(minor.get());
         }
@@ -247,7 +241,15 @@ public final class JDKVersion {
 
     public static JDKVersion toValue(String version) {
         if (version != null && version.matches(VERSION_MATCHER)) {
-            return new JDKVersion(version);
+            return new JDKVersion(version, null);
+        } else {
+            return null;
+        }
+    }
+
+    public static JDKVersion toValue(String version, String vendor) {
+        if (version != null && version.matches(VERSION_MATCHER)) {
+            return new JDKVersion(version, vendor);
         } else {
             return null;
         }
@@ -259,13 +261,17 @@ public final class JDKVersion {
 
     public static boolean isCorrectJDK(JDKVersion jdkVersion, Optional<String> 
vendor, Optional<JDKVersion> minVersion, Optional<JDKVersion> maxVersion) {
         boolean correctJDK = true;
-        
-        if (vendor.isPresent()) {             
-            correctJDK = jdkVersion.vendor.get().contains(vendor.get());
+
+        if (vendor.isPresent()) {
+            if (jdkVersion.getVendor().isPresent()) {
+                correctJDK = 
jdkVersion.getVendor().get().contains(vendor.get());
+            } else {
+                correctJDK = false;
+            }
         }
         if (correctJDK && minVersion.isPresent()) {
             correctJDK = jdkVersion.ge(minVersion.get());
-        }       
+        }
         if (correctJDK && maxVersion.isPresent()) {
             correctJDK = jdkVersion.le(maxVersion.get());
         }
@@ -281,13 +287,8 @@ public final class JDKVersion {
     }
 
     private static void initialize() {
-        short major = 1;
-        short minor = 0;
-        short subminor = 0;
-        short update = 0;
         String vendor = System.getProperty("java.vendor"); // NOI18N
-        try {
-            /*
+        /*
             In JEP 223 java.specification.version will be a single number 
versioning , not a dotted versioning . 
             For JDK 8:
                 java.specification.version  1.8
@@ -298,58 +299,51 @@ public final class JDKVersion {
             For JDK 11:
                 java.specification.version  11
                 java.version                11.0.3
-             */
-            String javaSpecVersion = 
System.getProperty("java.specification.version"); // NOI18N
-            String javaVersion = System.getProperty("java.version"); // NOI18N
-            String[] javaSpecVersionSplit = javaSpecVersion.split("\\."); // 
NOI18N
-            if (javaSpecVersionSplit.length == 1) {
-                // Handle Early Access build. e.g: 13-ea
-                String[] javaVersionSplit = javaVersion.split("-"); // NOI18N
-                String javaVersionCategory = javaVersionSplit[0];
-                String[] split = javaVersionCategory.split("[\\.]+"); // NOI18N
-
-                if (split.length > 0) {
-                    if (split.length > 0) {
-                        major = Short.parseShort(split[0]);
-                    }
-                    if (split.length > 1) {
-                        minor = Short.parseShort(split[1]);
-                    }
-                    if (split.length > 2) {
-                        subminor = Short.parseShort(split[2]);
-                    }
-                    if (split.length > 3) {
-                        update = Short.parseShort(split[3]);
-                    }
-                }
-            } else {
-                if (javaVersion == null || javaVersion.length() <= 0) {
-                    return;
-                }
-
-                String[] javaVersionSplit = javaVersion.split("\\.");
-                if (javaVersionSplit.length < 3 || 
!javaVersionSplit[0].equals("1")) {
-                    return;
-                }
+         */
+        String javaVersion = System.getProperty("java.version"); // NOI18N
+        short[] versions = parseVersions(javaVersion);
+
+        IDE_JDK_VERSION = new JDKVersion(
+                versions[MAJOR_INDEX],
+                Optional.of(versions[MINOR_INDEX]),
+                Optional.of(versions[SUBMINOR_INDEX]),
+                Optional.of(versions[UPDATE_INDEX]),
+                Optional.of(vendor)
+        );
+    }
 
-                major = Short.parseShort(javaVersionSplit[0]);
-                minor = Short.parseShort(javaVersionSplit[1]);
-                javaVersionSplit = javaVersionSplit[2].split("_");
+    /**
+     * Parses the java version text
+     *
+     * @param javaVersion the Java Version e.g 1.8.0u222,
+     * 1.8.0_232-ea-8u232-b09-0ubuntu1-b09, 11.0.5
+     * @return
+     */
+    static short[] parseVersions(String javaVersion) {
 
-                if (javaVersionSplit.length < 1) {
-                    return;
-                }
+        short[] versions = {1, 0, 0, 0};
+        if (javaVersion == null || javaVersion.length() <= 0) {
+            return versions; // not likely!!
+        }
 
-                subminor = Short.parseShort(javaVersionSplit[0]);
+        String[] javaVersionSplit = javaVersion.split("-"); // NOI18N
+        String[] split = javaVersionSplit[0].split("\\."); // NOI18N
 
-                if (javaVersionSplit.length > 1) {
-                    update = Short.parseShort(javaVersionSplit[1]);
+        if (split.length > 0) {
+            if (split.length > 0) {
+                versions[MAJOR_INDEX] = Short.parseShort(split[0]);
+            }
+            if (split.length > 1) {
+                versions[MINOR_INDEX] = Short.parseShort(split[1]);
+            }
+            if (split.length > 2) {
+                split = split[2].split("[_u]"); // NOI18N
+                versions[SUBMINOR_INDEX] = Short.parseShort(split[0]);
+                if (split.length > 1) {
+                    versions[UPDATE_INDEX] = Short.parseShort(split[1]);
                 }
             }
-        } catch (Exception e) {
-            // ignore
         }
-
-        IDE_JDK_VERSION = new JDKVersion(major, minor, subminor, update, 
vendor);
+        return versions;
     }
 }
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 45b9b30..65f7e22 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
@@ -170,17 +170,30 @@ public class StartupArgsEntity implements StartupArgs {
     @Override
     public JDKVersion getJavaVersion() {
         if(javaVersion == null && javaHome != null) {
-            try (BufferedReader bufferedReader
-                    = new BufferedReader(new FileReader(new File(javaHome, 
"release")));) {
-                String line;
-                while ((line = bufferedReader.readLine()) != null) {
-                    if (line.startsWith("JAVA_VERSION")) {
-                        javaVersion = 
JDKVersion.toValue(line.substring(line.indexOf("\"") + 1, 
line.lastIndexOf("\"")));
-                        break;
+            if(javaHome.equals(System.getProperty("jdk.home"))){
+                javaVersion = JDKVersion.getDefaultPlatformVersion();
+            } else {
+                try (BufferedReader bufferedReader
+                        = new BufferedReader(new FileReader(new File(javaHome, 
"release")));) { // NOI18N
+                    String implementorLine = null;
+                    String javaVersionLine = null;
+                    String line;
+                    while ((line = bufferedReader.readLine()) != null) {
+                        if (line.startsWith("JAVA_VERSION=")) { // NOI18N
+                            javaVersionLine = line;
+                        } else if (line.startsWith("IMPLEMENTOR=")) { // NOI18N
+                            implementorLine = line;
+                        }
                     }
+                    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
+                        );
+                    }
+                } catch (IOException ex) {
+                    Exceptions.printStackTrace(ex);
                 }
-            } catch (IOException ex) {
-                Exceptions.printStackTrace(ex);
             }
         }
         return javaVersion;
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 c8130e5..ad9761b 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
@@ -38,7 +38,6 @@ import org.netbeans.modules.payara.tooling.utils.OsUtils;
 import org.netbeans.modules.payara.tooling.utils.ServerUtils;
 import org.netbeans.modules.payara.tooling.utils.Utils;
 import org.netbeans.modules.payara.tooling.data.PayaraServer;
-import static 
org.netbeans.modules.payara.tooling.data.JDKVersion.IDE_JDK_VERSION;
 import org.netbeans.modules.payara.tooling.data.JDKVersion;
 import 
org.netbeans.modules.payara.tooling.server.parser.JvmConfigReader.JvmOption;
 
@@ -164,7 +163,7 @@ public class ServerTasks {
             }
         }
 
-        JDKVersion javaVersion = IDE_JDK_VERSION != null ? IDE_JDK_VERSION : 
args.getJavaVersion() ;
+        JDKVersion javaVersion = args.getJavaVersion() == null ? 
JDKVersion.getDefaultPlatformVersion() : args.getJavaVersion() ;
         List<String> optList
                 = jvmConfigReader.getJvmOptions()
                         .stream()
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 c994b4b..d466ae9 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
@@ -213,12 +213,13 @@ public class JvmConfigReader extends NodeListener 
implements XMLReader {
         // Ex: [|1.8]-XX:MyJvmOption (only max version present)
         // Ex: [1.7|]-XX:MyJvmOption (only min version present)
         // Gr1 or Gr2 can be null (optional)
-        private static final Pattern PATTERN = 
Pattern.compile("^\\[(.*)\\|(.*)\\](.*)");
+        private static final Pattern PATTERN = 
Pattern.compile("^\\[(.*)\\|(.*)\\](.*)");  // NOI18N
 
         public JvmOption(String option) {
             Matcher matcher = PATTERN.matcher(option);
             if (matcher.matches()) {
-                if (matcher.group(1).contains("-")) { // NOI18N
+                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.minVersion = 
Optional.ofNullable(JDKVersion.toValue(parts[1]));
@@ -266,10 +267,7 @@ public class JvmConfigReader extends NodeListener 
implements XMLReader {
                 return false;
             }
             final JvmOption other = (JvmOption) obj;
-            if (!Objects.equals(this.option, other.option)) {
-                return false;
-            }
-            return true;
+            return Objects.equals(this.option, other.option);
         }
 
         @Override
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
new file mode 100644
index 0000000..8e3c1e2
--- /dev/null
+++ 
b/enterprise/payara.tooling/test/unit/src/org/netbeans/modules/payara/tooling/data/JDKVersionTest.java
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.netbeans.modules.payara.tooling.data;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Optional;
+import static org.testng.Assert.assertTrue;
+import org.testng.annotations.Test;
+
+/**
+ * Common JDK version functional test.
+ * <p>
+ * @author Gaurav Gupta
+ */
+@Test(groups = {"unit-tests"})
+public class JDKVersionTest {
+
+    /**
+     * Test to parse the JDKVersion.
+     */
+    @Test
+    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()));
+        jdkVersions.put("1.8.0",
+                new JDKVersion((short) 1, Optional.of((short) 8), 
Optional.of((short) 0), Optional.of((short) 0), 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()));
+        jdkVersions.put("1.8.0_191",
+                new JDKVersion((short) 1, Optional.of((short) 8), 
Optional.of((short) 0), Optional.of((short) 191), 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()));
+        jdkVersions.put("9",
+                new JDKVersion((short) 9, Optional.of((short) 0), 
Optional.of((short) 0), Optional.of((short) 0), 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()));
+        jdkVersions.put("11.0.6_234",
+                new JDKVersion((short) 11, Optional.of((short) 0), 
Optional.of((short) 6), Optional.of((short) 234), 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()));
+
+        for (Entry<String, JDKVersion> version : jdkVersions.entrySet()) {
+            
assertTrue(JDKVersion.toValue(version.getKey()).equals(version.getValue()), 
version.getKey());
+        }
+    }
+    
+}


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists

Reply via email to