|
10 | 10 | import java.nio.file.Path;
|
11 | 11 | import java.nio.file.Paths;
|
12 | 12 | import java.util.Arrays;
|
| 13 | +import java.util.Objects; |
| 14 | +import java.util.function.Predicate; |
| 15 | +import java.util.stream.Stream; |
13 | 16 |
|
14 | 17 | /** Detects operating systems and libc library. */
|
15 | 18 | public final class OperatingSystem {
|
16 | 19 | private static final String OS_NAME_PROPERTY = "os.name";
|
17 | 20 | private static final String OS_ARCH_PROPERTY = "os.arch";
|
| 21 | + private static final Path TEMP_DIR = Paths.get(computeTempPath()); |
18 | 22 |
|
19 | 23 | private OperatingSystem() {}
|
20 | 24 |
|
@@ -146,4 +150,57 @@ private static boolean containsArray(byte[] container, int offset, byte[] contai
|
146 | 150 | }
|
147 | 151 | return true;
|
148 | 152 | }
|
| 153 | + |
| 154 | + public static Path getTempDir() { |
| 155 | + return TEMP_DIR; |
| 156 | + } |
| 157 | + |
| 158 | + private static String computeTempPath() { |
| 159 | + if (JavaVirtualMachine.isJ9()) { |
| 160 | + return computeJ9TempDir(); |
| 161 | + } |
| 162 | + // See |
| 163 | + // https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-gettemppatha#remarks |
| 164 | + // and |
| 165 | + // the JDK OS-specific implementations of os::get_temp_directory(), i.e. |
| 166 | + // https://github.com/openjdk/jdk/blob/f50bd0d9ec65a6b9596805d0131aaefc1bb913f3/src/hotspot/os/bsd/os_bsd.cpp#L886-L904 |
| 167 | + if (OperatingSystem.isLinux()) { |
| 168 | + return "/tmp"; |
| 169 | + } else if (OperatingSystem.isWindows()) { |
| 170 | + return computeWindowsTempDir(); |
| 171 | + } else if (OperatingSystem.isMacOs()) { |
| 172 | + return EnvironmentVariables.getOrDefault("TMPDIR", "."); |
| 173 | + } else { |
| 174 | + return SystemProperties.getOrDefault("java.io.tmpdir", "."); |
| 175 | + } |
| 176 | + } |
| 177 | + |
| 178 | + private static String computeWindowsTempDir() { |
| 179 | + return Stream.of("TMP", "TEMP", "USERPROFILE") |
| 180 | + .map(EnvironmentVariables::get) |
| 181 | + .filter(Objects::nonNull) |
| 182 | + .filter(((Predicate<String>) String::isEmpty).negate()) |
| 183 | + .findFirst() |
| 184 | + .orElse("C:\\Windows"); |
| 185 | + } |
| 186 | + |
| 187 | + private static String computeJ9TempDir() { |
| 188 | + try { |
| 189 | + https: // github.com/eclipse-openj9/openj9/blob/196082df056a990756a5571bfac29585fbbfbb42/jcl/src/java.base/share/classes/openj9/internal/tools/attach/target/IPC.java#L351 |
| 190 | + return (String) |
| 191 | + Class.forName("openj9.internal.tools.attach.target.IPC") |
| 192 | + .getDeclaredMethod("getTmpDir") |
| 193 | + .invoke(null); |
| 194 | + } catch (Throwable t) { |
| 195 | + // Fall back to constants based on J9 source code, may not have perfect coverage |
| 196 | + String tmpDir = SystemProperties.get("java.io.tmpdir"); |
| 197 | + if (tmpDir != null && !tmpDir.isEmpty()) { |
| 198 | + return tmpDir; |
| 199 | + } else if (OperatingSystem.isWindows()) { |
| 200 | + return "C:\\Documents"; |
| 201 | + } else { |
| 202 | + return "/tmp"; |
| 203 | + } |
| 204 | + } |
| 205 | + } |
149 | 206 | }
|
0 commit comments