1   /*
2    * Logback: the reliable, generic, fast and flexible logging framework.
3    * Copyright (C) 1999-2026, QOS.ch. All rights reserved.
4    *
5    * This program and the accompanying materials are dual-licensed under
6    * either the terms of the Eclipse Public License v2.0 as published by
7    * the Eclipse Foundation
8    *
9    *   or (per the licensee's choosing)
10   *
11   * under the terms of the GNU Lesser General Public License version 2.1
12   * as published by the Free Software Foundation.
13   */
14  package ch.qos.logback.core.util;
15  
16  import ch.qos.logback.core.CoreConstants;
17  
18  import java.lang.module.ModuleDescriptor;
19  import java.util.Optional;
20  
21  /**
22   * @author Ceki Gülcü
23   */
24  public class EnvUtil {
25  
26      private EnvUtil() {
27      }
28  
29  
30      /**
31       * <p>Returns the current version of logback-core, or null if data is not
32       * available.
33       * </p>
34       *
35       * @since 1.3.0
36       * @return current version or null if missing version data
37       * @deprecated See {@link VersionUtil#getVersionOfArtifact(Class)}
38       */
39      static public String logbackVersion() {
40          return VersionUtil.getVersionOfArtifact(CoreConstants.class);
41      }
42  
43      static public int getJDKVersion(String javaVersionStr) {
44          int version = 0;
45  
46          for (char ch : javaVersionStr.toCharArray()) {
47              if (Character.isDigit(ch)) {
48                  version = (version * 10) + (ch - 48);
49              } else if (version == 1) {
50                  version = 0;
51              } else {
52                  break;
53              }
54          }
55          return version;
56      }
57  
58      static private boolean isJDK_N_OrHigher(int n) {
59          String javaVersionStr = System.getProperty("java.version", "");
60          if (javaVersionStr.isEmpty())
61              return false;
62  
63          int version = getJDKVersion(javaVersionStr);
64          return version > 0 && n <= version;
65      }
66  
67      static public boolean isJDK5() {
68          return isJDK_N_OrHigher(5);
69      }
70  
71      static public boolean isJDK6OrHigher() {
72          return isJDK_N_OrHigher(6);
73      }
74  
75      static public boolean isJDK7OrHigher() {
76          return isJDK_N_OrHigher(7);
77      }
78  
79      static public boolean isJDK16OrHigher() {
80          return isJDK_N_OrHigher(16);
81      }
82  
83      static public boolean isJDK18OrHigher() {
84          return isJDK_N_OrHigher(18);
85      }
86  
87      /**
88       * @since logback 1.3.12/1.4.12
89       * @return true if runtime JDK is version 21 or higher
90       */
91      static public boolean isJDK21OrHigher() {
92          return isJDK_N_OrHigher(21);
93      }
94  
95      static public boolean isJaninoAvailable() {
96          ClassLoader classLoader = EnvUtil.class.getClassLoader();
97          try {
98              Class<?> bindingClass = classLoader.loadClass("org.codehaus.janino.ScriptEvaluator");
99              return (bindingClass != null);
100         } catch (ClassNotFoundException e) {
101             return false;
102         }
103     }
104 
105     public static boolean isMacOs() {
106         String os = System.getProperty("os.name");
107         // expected value is "Mac OS X"
108         return os.toLowerCase().contains("mac");
109     }
110 
111     public static boolean isWindows() {
112         String os = System.getProperty("os.name");
113         return os.startsWith("Windows");
114     }
115 
116     static public boolean isClassAvailable(Class callerClass, String className) {
117         ClassLoader classLoader = Loader.getClassLoaderOfClass(callerClass);
118         try {
119             Class<?> bindingClass = classLoader.loadClass(className);
120             return (bindingClass != null);
121         } catch (ClassNotFoundException e) {
122             return false;
123         }
124     }
125 
126 }