Uploaded image for project: 'Groovy'
  1. Groovy
  2. GROOVY-8800

Wrong detection of Java 10 version in groovy-json

    Details

    • Type: Bug
    • Status: Closed
    • Priority: Major
    • Resolution: Fixed
    • Affects Version/s: 3.x, 2.5.2
    • Fix Version/s: 3.0.0-alpha-4, 2.5.3
    • Component/s: JSON
    • Labels:
      None
    • Environment:
      Oracle Java SE 10, Linux

      Description

      I cloned another issue (GROOVY-8824) to cater for refactoring/testing. The pattern change has been merged under this issue.

      ORIGINAL BELOW:

      The following code from groovy.json.internal.Sys incorrectly parses java.version property on newer Java-s:

          static {
              BigDecimal v = new BigDecimal("-1");
              String sversion = System.getProperty("java.version");
              if (sversion.indexOf("_") != -1) {
                  final String[] split = sversion.split("_");
                  try {
                      String ver = split[0];
      
                      if (ver.startsWith("1.7")) {
                          v = new BigDecimal("1.7");
                      }
      
                      if (ver.startsWith("1.8")) {
                          v = new BigDecimal("1.8");
                      }
      
                      if (ver.startsWith("1.9")) {
                          v = new BigDecimal("1.9");
                      }
                  } catch (Exception ex) {
                      ex.printStackTrace();
                      System.err.println("Unable to determine build number or version");
                  }
              } else if ("1.8.0".equals(sversion)) {
                  v = new BigDecimal("1.8");
              } else {
                  Pattern p = Pattern.compile("^([1-9]\\.[0-9]+)");
                  Matcher matcher = p.matcher(sversion);
                  if (matcher.find()) {
                      v = new BigDecimal(matcher.group(0));
                  }
              }
      
              is1_8OrLater = v.compareTo(new BigDecimal("1.8")) >= 0;
              is1_7 = v.compareTo(new BigDecimal("1.7")) == 0;
              is1_8 = v.compareTo(new BigDecimal("1.8")) == 0;
          }
      

      Under Java 10+ (java.version=10.0.2) all is* fields are set to false.

      The outcome of it is e.g. LazyMap to use j.u.TreeMap instead of j.u.LinkedHashMap that would give insertion order for maps returned from JsonSlurper.

      Just extending the pattern to

      "^([1-9]+\\.[0-9]+)"
      

      seems to do the job.

        Attachments

          Issue Links

            Activity

              People

              • Assignee:
                paulk Paul King
                Reporter:
                pwesolek Przemek Wesolek
              • Votes:
                0 Vote for this issue
                Watchers:
                2 Start watching this issue

                Dates

                • Created:
                  Updated:
                  Resolved: