From 34f658e5f2fc26b159266546a9efd04170447cdc Mon Sep 17 00:00:00 2001 From: Aria Moradi Date: Mon, 24 Apr 2023 18:55:18 +0330 Subject: [PATCH] remove DriverJar --- .../tachidesk/server/util/DriverJar.java | 212 ------------------ 1 file changed, 212 deletions(-) delete mode 100644 server/src/main/java/suwayomi/tachidesk/server/util/DriverJar.java diff --git a/server/src/main/java/suwayomi/tachidesk/server/util/DriverJar.java b/server/src/main/java/suwayomi/tachidesk/server/util/DriverJar.java deleted file mode 100644 index ea4a88fa9..000000000 --- a/server/src/main/java/suwayomi/tachidesk/server/util/DriverJar.java +++ /dev/null @@ -1,212 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * - * Licensed 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 suwayomi.tachidesk.server.util; - -import com.microsoft.playwright.impl.driver.Driver; - -import java.io.IOException; -import java.net.URI; -import java.net.URISyntaxException; -import java.nio.file.*; -import java.util.Collections; -import java.util.Map; -import java.util.concurrent.TimeUnit; - -/** - * Copy of DriverJar - * with support for pre-installing chromium and only supports chromium playwright - */ -public class DriverJar extends Driver { - private static final String PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD = "PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD"; - private static final String SELENIUM_REMOTE_URL = "SELENIUM_REMOTE_URL"; - static final String PLAYWRIGHT_NODEJS_PATH = "PLAYWRIGHT_NODEJS_PATH"; - private final Path driverTempDir; - private Path preinstalledNodePath; - - public DriverJar() throws IOException { - // Allow specifying custom path for the driver installation - // See https://github.com/microsoft/playwright-java/issues/728 - String alternativeTmpdir = System.getProperty("playwright.driver.tmpdir"); - String prefix = "playwright-java-"; - driverTempDir = alternativeTmpdir == null - ? Files.createTempDirectory(prefix) - : Files.createTempDirectory(Paths.get(alternativeTmpdir), prefix); - driverTempDir.toFile().deleteOnExit(); - String nodePath = System.getProperty("playwright.nodejs.path"); - if (nodePath != null) { - preinstalledNodePath = Paths.get(nodePath); - if (!Files.exists(preinstalledNodePath)) { - throw new RuntimeException("Invalid Node.js path specified: " + nodePath); - } - } - logMessage("created DriverJar: " + driverTempDir); - } - - @Override - protected void initialize(Boolean installBrowsers) throws Exception { - if (preinstalledNodePath == null && env.containsKey(PLAYWRIGHT_NODEJS_PATH)) { - preinstalledNodePath = Paths.get(env.get(PLAYWRIGHT_NODEJS_PATH)); - if (!Files.exists(preinstalledNodePath)) { - throw new RuntimeException("Invalid Node.js path specified: " + preinstalledNodePath); - } - } else if (preinstalledNodePath != null) { - // Pass the env variable to the driver process. - env.put(PLAYWRIGHT_NODEJS_PATH, preinstalledNodePath.toString()); - } - extractDriverToTempDir(); - logMessage("extracted driver from jar to " + driverPath()); - if (installBrowsers) - installBrowsers(env); - } - - private void installBrowsers(Map env) throws IOException, InterruptedException { - String skip = env.get(PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD); - if (skip == null) { - skip = System.getenv(PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD); - } - if (skip != null && !"0".equals(skip) && !"false".equals(skip)) { - System.out.println("Skipping browsers download because `PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD` env variable is set"); - return; - } - if (env.get(SELENIUM_REMOTE_URL) != null || System.getenv(SELENIUM_REMOTE_URL) != null) { - logMessage("Skipping browsers download because `SELENIUM_REMOTE_URL` env variable is set"); - return; - } - Chromium.preinstall(platformDir()); - Path driver = driverPath(); - if (!Files.exists(driver)) { - throw new RuntimeException("Failed to find driver: " + driver); - } - ProcessBuilder pb = createProcessBuilder(); - pb.command().add("install"); - pb.command().add("chromium"); - pb.redirectError(ProcessBuilder.Redirect.INHERIT); - pb.redirectOutput(ProcessBuilder.Redirect.INHERIT); - Process p = pb.start(); - boolean result = p.waitFor(10, TimeUnit.MINUTES); - if (!result) { - p.destroy(); - throw new RuntimeException("Timed out waiting for browsers to install"); - } - if (p.exitValue() != 0) { - throw new RuntimeException("Failed to install browsers, exit code: " + p.exitValue()); - } - } - - private static boolean isExecutable(Path filePath) { - String name = filePath.getFileName().toString(); - return name.endsWith(".sh") || name.endsWith(".exe") || !name.contains("."); - } - - private FileSystem initFileSystem(URI uri) throws IOException { - try { - return FileSystems.newFileSystem(uri, Collections.emptyMap()); - } catch (FileSystemAlreadyExistsException e) { - return null; - } - } - - public static URI getDriverResourceURI() throws URISyntaxException { - ClassLoader classloader = Thread.currentThread().getContextClassLoader(); - return classloader.getResource("driver/" + platformDir()).toURI(); - } - - void extractDriverToTempDir() throws URISyntaxException, IOException { - URI originalUri = getDriverResourceURI(); - URI uri = maybeExtractNestedJar(originalUri); - - // Create zip filesystem if loading from jar. - try (FileSystem fileSystem = "jar".equals(uri.getScheme()) ? initFileSystem(uri) : null) { - Path srcRoot = Paths.get(uri); - // jar file system's .relativize gives wrong results when used with - // spring-boot-maven-plugin, convert to the default filesystem to - // have predictable results. - // See https://github.com/microsoft/playwright-java/issues/306 - Path srcRootDefaultFs = Paths.get(srcRoot.toString()); - Files.walk(srcRoot).forEach(fromPath -> { - if (preinstalledNodePath != null) { - String fileName = fromPath.getFileName().toString(); - if ("node.exe".equals(fileName) || "node".equals(fileName)) { - return; - } - } - Path relative = srcRootDefaultFs.relativize(Paths.get(fromPath.toString())); - Path toPath = driverTempDir.resolve(relative.toString()); - try { - if (Files.isDirectory(fromPath)) { - Files.createDirectories(toPath); - } else { - Files.copy(fromPath, toPath); - if (isExecutable(toPath)) { - toPath.toFile().setExecutable(true, true); - } - } - toPath.toFile().deleteOnExit(); - } catch (IOException e) { - throw new RuntimeException("Failed to extract driver from " + uri + ", full uri: " + originalUri, e); - } - }); - } - } - - private URI maybeExtractNestedJar(final URI uri) throws URISyntaxException { - if (!"jar".equals(uri.getScheme())) { - return uri; - } - final String JAR_URL_SEPARATOR = "!/"; - String[] parts = uri.toString().split("!/"); - if (parts.length != 3) { - return uri; - } - String innerJar = String.join(JAR_URL_SEPARATOR, parts[0], parts[1]); - URI jarUri = new URI(innerJar); - try (FileSystem fs = FileSystems.newFileSystem(jarUri, Collections.emptyMap())) { - Path fromPath = Paths.get(jarUri); - Path toPath = driverTempDir.resolve(fromPath.getFileName().toString()); - Files.copy(fromPath, toPath); - toPath.toFile().deleteOnExit(); - return new URI("jar:" + toPath.toUri() + JAR_URL_SEPARATOR + parts[2]); - } catch (IOException e) { - throw new RuntimeException("Failed to extract driver's nested .jar from " + jarUri + "; full uri: " + uri, e); - } - } - - private static String platformDir() { - String name = System.getProperty("os.name").toLowerCase(); - String arch = System.getProperty("os.arch").toLowerCase(); - - if (name.contains("windows")) { - return "win32_x64"; - } - if (name.contains("linux")) { - if (arch.equals("aarch64")) { - return "linux-arm64"; - } else { - return "linux"; - } - } - if (name.contains("mac os x")) { - return "mac"; - } - throw new RuntimeException("Unexpected os.name value: " + name); - } - - @Override - protected Path driverDir() { - return driverTempDir; - } -}