• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2017 The Gson authors
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.google.gson.internal;
18 
19 /**
20  * Utility to check the major Java version of the current JVM.
21  */
22 public final class JavaVersion {
23   // Oracle defines naming conventions at http://www.oracle.com/technetwork/java/javase/versioning-naming-139433.html
24   // However, many alternate implementations differ. For example, Debian used 9-debian as the version string
25 
26   private static final int majorJavaVersion = determineMajorJavaVersion();
27 
determineMajorJavaVersion()28   private static int determineMajorJavaVersion() {
29     String javaVersion = System.getProperty("java.version");
30     return getMajorJavaVersion(javaVersion);
31   }
32 
33   // Visible for testing only
getMajorJavaVersion(String javaVersion)34   static int getMajorJavaVersion(String javaVersion) {
35     int version = parseDotted(javaVersion);
36     if (version == -1) {
37       version = extractBeginningInt(javaVersion);
38     }
39     if (version == -1) {
40       return 6;  // Choose minimum supported JDK version as default
41     }
42     return version;
43   }
44 
45   // Parses both legacy 1.8 style and newer 9.0.4 style
parseDotted(String javaVersion)46   private static int parseDotted(String javaVersion) {
47     try {
48       String[] parts = javaVersion.split("[._]");
49       int firstVer = Integer.parseInt(parts[0]);
50       if (firstVer == 1 && parts.length > 1) {
51         return Integer.parseInt(parts[1]);
52       } else {
53         return firstVer;
54       }
55     } catch (NumberFormatException e) {
56       return -1;
57     }
58   }
59 
extractBeginningInt(String javaVersion)60   private static int extractBeginningInt(String javaVersion) {
61     try {
62       StringBuilder num = new StringBuilder();
63       for (int i = 0; i < javaVersion.length(); ++i) {
64         char c = javaVersion.charAt(i);
65         if (Character.isDigit(c)) {
66           num.append(c);
67         } else {
68           break;
69         }
70       }
71       return Integer.parseInt(num.toString());
72     } catch (NumberFormatException e) {
73       return -1;
74     }
75   }
76 
77   /**
78    * @return the major Java version, i.e. '8' for Java 1.8, '9' for Java 9 etc.
79    */
getMajorJavaVersion()80   public static int getMajorJavaVersion() {
81     return majorJavaVersion;
82   }
83 
84   /**
85    * @return {@code true} if the application is running on Java 9 or later; and {@code false} otherwise.
86    */
isJava9OrLater()87   public static boolean isJava9OrLater() {
88     return majorJavaVersion >= 9;
89   }
90 
JavaVersion()91   private JavaVersion() { }
92 }
93