diff --git a/MODULE.bazel b/MODULE.bazel index ae3a97b1d1b9f..30a276b87f857 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -199,7 +199,6 @@ maven.install( "io.opentelemetry:opentelemetry-sdk-testing:1.43.0", "io.opentelemetry:opentelemetry-sdk-trace:1.43.0", "io.opentelemetry.semconv:opentelemetry-semconv:1.25.0-alpha", - "io.ous:jtoml:2.0.0", "it.ozimov:embedded-redis:0.7.3", "net.bytebuddy:byte-buddy:1.15.10", "org.htmlunit:htmlunit-core-js:4.5.0", @@ -221,6 +220,7 @@ maven.install( "org.redisson:redisson:3.37.0", "org.slf4j:slf4j-api:2.0.16", "org.slf4j:slf4j-jdk14:2.0.16", + "org.tomlj:tomlj:1.1.1", "org.zeromq:jeromq:0.6.0", ], excluded_artifacts = [ diff --git a/java/maven_install.json b/java/maven_install.json index a10735a9e0165..ec5875743dc1a 100644 --- a/java/maven_install.json +++ b/java/maven_install.json @@ -1,7 +1,7 @@ { "__AUTOGENERATED_FILE_DO_NOT_MODIFY_THIS_FILE_MANUALLY": "THERE_IS_NO_DATA_ONLY_ZUUL", - "__INPUT_ARTIFACTS_HASH": 707988571, - "__RESOLVED_ARTIFACTS_HASH": -1165730169, + "__INPUT_ARTIFACTS_HASH": -1685742929, + "__RESOLVED_ARTIFACTS_HASH": -1218025727, "conflict_resolution": { "com.google.code.gson:gson:2.8.9": "com.google.code.gson:gson:2.11.0", "com.google.errorprone:error_prone_annotations:2.3.2": "com.google.errorprone:error_prone_annotations:2.28.0", @@ -444,13 +444,6 @@ }, "version": "1.43.0" }, - "io.ous:jtoml": { - "shasums": { - "jar": "3cabdae2244c999addebb8c31ae452fbdc874b4f26a163539954b8eeb5d6acc6", - "sources": "f479f2acdf7a362dc86a5c9310ddaec7b34a87f0a8a6f46dde41c1069b2a2138" - }, - "version": "2.0.0" - }, "io.projectreactor:reactor-core": { "shasums": { "jar": "44f055fbd033b6c976c53fb2e04b59027e79fb2312c37d2eaa54c77ea1ea80fe", @@ -514,6 +507,13 @@ }, "version": "12.4" }, + "org.antlr:antlr4-runtime": { + "shasums": { + "jar": "e06c6553c1ccc14d36052ec4b0fc6f13b808cf957b5b1dc3f61bf401996ada59", + "sources": "6fa0efb711a152842ecda1d41ceab94fb2049f833e00e360e161ac0e7a3819fe" + }, + "version": "4.11.1" + }, "org.apache.bcel:bcel": { "shasums": { "jar": "a119a4420350dea669acfd84120ecc7e5742dcabcc82b0b9f9755dc692335aa2", @@ -801,6 +801,13 @@ }, "version": "1.7.21" }, + "org.tomlj:tomlj": { + "shasums": { + "jar": "383b7c66966c42ee4913ec977a7b6573631866bddc5318ec4a6215b688dd0d6c", + "sources": "533276104d58ebc92ce049c59a129717ce7daf0e9340969256fdb61f4f06f717" + }, + "version": "1.1.1" + }, "org.xmlresolver:xmlresolver": { "shasums": { "data": "173904bdbd783ba0fac92c5bcc05da5d09f0ce7eed24346666ea0a239461f9b4", @@ -1159,6 +1166,10 @@ "org.slf4j:slf4j-simple": [ "org.slf4j:slf4j-api" ], + "org.tomlj:tomlj": [ + "org.antlr:antlr4-runtime", + "org.checkerframework:checker-qual" + ], "org.xmlresolver:xmlresolver": [ "org.apache.httpcomponents.client5:httpclient5", "org.apache.httpcomponents.core5:httpcore5" @@ -1786,10 +1797,6 @@ "io.opentelemetry.sdk.trace.internal.data", "io.opentelemetry.sdk.trace.samplers" ], - "io.ous:jtoml": [ - "io.ous.jtoml", - "io.ous.jtoml.impl" - ], "io.projectreactor:reactor-core": [ "reactor.adapter", "reactor.core", @@ -2014,6 +2021,15 @@ "net.sf.saxon.xpath", "net.sf.saxon.z" ], + "org.antlr:antlr4-runtime": [ + "org.antlr.v4.runtime", + "org.antlr.v4.runtime.atn", + "org.antlr.v4.runtime.dfa", + "org.antlr.v4.runtime.misc", + "org.antlr.v4.runtime.tree", + "org.antlr.v4.runtime.tree.pattern", + "org.antlr.v4.runtime.tree.xpath" + ], "org.apache.bcel:bcel": [ "org.apache.bcel", "org.apache.bcel.classfile", @@ -2898,6 +2914,10 @@ "org.slf4j:slf4j-simple": [ "org.slf4j.impl" ], + "org.tomlj:tomlj": [ + "org.tomlj", + "org.tomlj.internal" + ], "org.xmlresolver:xmlresolver": [ "org.xmlresolver", "org.xmlresolver.cache", @@ -3095,8 +3115,6 @@ "io.opentelemetry:opentelemetry-sdk-trace", "io.opentelemetry:opentelemetry-sdk-trace:jar:sources", "io.opentelemetry:opentelemetry-sdk:jar:sources", - "io.ous:jtoml", - "io.ous:jtoml:jar:sources", "io.projectreactor:reactor-core", "io.projectreactor:reactor-core:jar:sources", "io.reactivex.rxjava3:rxjava", @@ -3115,6 +3133,8 @@ "net.bytebuddy:byte-buddy:jar:sources", "net.sf.saxon:Saxon-HE", "net.sf.saxon:Saxon-HE:jar:sources", + "org.antlr:antlr4-runtime", + "org.antlr:antlr4-runtime:jar:sources", "org.apache.bcel:bcel", "org.apache.bcel:bcel:jar:sources", "org.apache.commons:commons-exec", @@ -3197,6 +3217,8 @@ "org.slf4j:slf4j-jdk14:jar:sources", "org.slf4j:slf4j-simple", "org.slf4j:slf4j-simple:jar:sources", + "org.tomlj:tomlj", + "org.tomlj:tomlj:jar:sources", "org.xmlresolver:xmlresolver", "org.xmlresolver:xmlresolver:jar:data", "org.xmlresolver:xmlresolver:jar:sources", diff --git a/java/src/org/openqa/selenium/grid/config/BUILD.bazel b/java/src/org/openqa/selenium/grid/config/BUILD.bazel index 65662cda6c5dd..e2be2a4b14de7 100644 --- a/java/src/org/openqa/selenium/grid/config/BUILD.bazel +++ b/java/src/org/openqa/selenium/grid/config/BUILD.bazel @@ -21,6 +21,6 @@ java_library( "//java/src/org/openqa/selenium/json", artifact("com.beust:jcommander"), artifact("com.google.guava:guava"), - artifact("io.ous:jtoml"), + artifact("org.tomlj:tomlj"), ], ) diff --git a/java/src/org/openqa/selenium/grid/config/TomlConfig.java b/java/src/org/openqa/selenium/grid/config/TomlConfig.java index 51912d626daec..991c6a9f42fa2 100644 --- a/java/src/org/openqa/selenium/grid/config/TomlConfig.java +++ b/java/src/org/openqa/selenium/grid/config/TomlConfig.java @@ -19,10 +19,6 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSortedSet; -import io.ous.jtoml.JToml; -import io.ous.jtoml.ParseException; -import io.ous.jtoml.Toml; -import io.ous.jtoml.TomlTable; import java.io.IOException; import java.io.Reader; import java.nio.file.Files; @@ -31,18 +27,31 @@ import java.util.List; import java.util.Optional; import java.util.Set; +import java.util.stream.Collectors; import org.openqa.selenium.internal.Require; +import org.tomlj.Toml; +import org.tomlj.TomlArray; +import org.tomlj.TomlParseError; +import org.tomlj.TomlParseResult; +import org.tomlj.TomlTable; public class TomlConfig implements Config { - private final Toml toml; + private final TomlParseResult toml; public TomlConfig(Reader reader) { try { - toml = JToml.parse(reader); + toml = Toml.parse(reader); + + if (toml.hasErrors()) { + String error = + toml.errors().stream().map(TomlParseError::toString).collect(Collectors.joining("\n")); + + throw new ConfigException(error); + } } catch (IOException e) { throw new ConfigException("Unable to read TOML.", e); - } catch (ParseException e) { + } catch (TomlParseError e) { throw new ConfigException( e.getCause() + "\n Validate the config using https://www.toml-lint.com/. " @@ -65,7 +74,7 @@ public Optional> getAll(String section, String option) { Require.nonNull("Section to read", section); Require.nonNull("Option to read", option); - if (!toml.containsKey(section)) { + if (!toml.contains(section)) { return Optional.empty(); } @@ -74,21 +83,28 @@ public Optional> getAll(String section, String option) { throw new ConfigException(String.format("Section %s is not a section! %s", section, raw)); } - TomlTable table = toml.getTomlTable(section); + TomlTable table = toml.getTable(section); + Object value = null; + if (table != null) { + value = table.get(option); + } - Object value = table.getOrDefault(option, null); if (value == null) { return Optional.empty(); } + if (value instanceof TomlArray) { + value = ((TomlArray) value).toList(); + } + if (value instanceof Collection) { Collection collection = (Collection) value; // Case when an array of tables is used as config // https://toml.io/en/v1.0.0-rc.3#array-of-tables - if (collection.stream().anyMatch(item -> item instanceof TomlTable)) { + if (collection.stream().anyMatch(TomlTable.class::isInstance)) { return Optional.of( collection.stream() - .map(item -> (TomlTable) item) + .map(TomlTable.class::cast) .map(TomlTable::toMap) .map(this::toEntryList) .flatMap(Collection::stream) @@ -106,7 +122,7 @@ public Optional> getAll(String section, String option) { return Optional.of(toEntryList(((TomlTable) value).toMap())); } - return Optional.of(ImmutableList.of(String.valueOf(value))); + return Optional.of(List.of(String.valueOf(value))); } @Override diff --git a/java/test/org/openqa/selenium/grid/config/BUILD.bazel b/java/test/org/openqa/selenium/grid/config/BUILD.bazel index fb4e41dcd7875..9575e42d240fb 100644 --- a/java/test/org/openqa/selenium/grid/config/BUILD.bazel +++ b/java/test/org/openqa/selenium/grid/config/BUILD.bazel @@ -11,7 +11,6 @@ java_test_suite( "//java/src/org/openqa/selenium/json", artifact("com.beust:jcommander"), artifact("com.google.guava:guava"), - artifact("io.ous:jtoml"), artifact("org.junit.jupiter:junit-jupiter-api"), artifact("org.assertj:assertj-core"), ] + JUNIT5_DEPS, diff --git a/java/test/org/openqa/selenium/grid/config/TomlConfigTest.java b/java/test/org/openqa/selenium/grid/config/TomlConfigTest.java index 2de672f07d78e..9eaedae3c258b 100644 --- a/java/test/org/openqa/selenium/grid/config/TomlConfigTest.java +++ b/java/test/org/openqa/selenium/grid/config/TomlConfigTest.java @@ -18,6 +18,7 @@ package org.openqa.selenium.grid.config; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; import java.io.StringReader; import java.util.Arrays; @@ -30,18 +31,24 @@ class TomlConfigTest { @Test void shouldUseATableAsASection() { - String raw = "[cheeses]\nselected=brie"; + String raw = "[cheeses]\nselected=\"brie\""; Config config = new TomlConfig(new StringReader(raw)); - assertThat(config.get("cheeses", "selected")).isEqualTo(Optional.of("brie")); } + @Test + void shouldCheckForErrorsAndThrow() { + String raw = "[cheeses]\nselected=brie"; + assertThatThrownBy(() -> new TomlConfig(new StringReader(raw))) + .isInstanceOf(ConfigException.class); + } + @Test void shouldContainConfigFromArrayOfTables() { String[] rawConfig = new String[] { "[cheeses]", - "default = manchego", + "default = \"manchego\"", "[[cheeses.type]]", "name = \"soft cheese\"", "default = \"brie\"", @@ -104,7 +111,7 @@ void ensureCanReadListOfLists() { String[] rawConfig = new String[] { "[cheeses]", - "default = manchego", + "default = \"manchego\"", "[[cheeses.type]]", "name = \"soft cheese\"", "default = \"brie\"", diff --git a/java/test/org/openqa/selenium/grid/router/DistributedCdpTest.java b/java/test/org/openqa/selenium/grid/router/DistributedCdpTest.java index 40d0bf46ad8a8..ceb1cf37a1eb7 100644 --- a/java/test/org/openqa/selenium/grid/router/DistributedCdpTest.java +++ b/java/test/org/openqa/selenium/grid/router/DistributedCdpTest.java @@ -68,7 +68,7 @@ void ensureBasicFunctionality() { "[node]\n" + "selenium-manager = false\n" + "driver-implementation = " - + browser.displayName()))); + + String.format("\"%s\"", browser.displayName())))); Server server = new NettyServer( diff --git a/java/test/org/openqa/selenium/grid/router/RemoteWebDriverBiDiTest.java b/java/test/org/openqa/selenium/grid/router/RemoteWebDriverBiDiTest.java index 8269f5028cfc9..5538b346022ed 100644 --- a/java/test/org/openqa/selenium/grid/router/RemoteWebDriverBiDiTest.java +++ b/java/test/org/openqa/selenium/grid/router/RemoteWebDriverBiDiTest.java @@ -77,7 +77,7 @@ void setup() { "[node]\n" + "selenium-manager = false\n" + "driver-implementation = " - + browser.displayName()))); + + String.format("\"%s\"", browser.displayName())))); driver = new RemoteWebDriver(deployment.getServer().getUrl(), browser.getCapabilities()); driver = new Augmenter().augment(driver); diff --git a/java/test/org/openqa/selenium/grid/router/RemoteWebDriverDownloadTest.java b/java/test/org/openqa/selenium/grid/router/RemoteWebDriverDownloadTest.java index 6ebc1752b6e12..c8cea51cbaecb 100644 --- a/java/test/org/openqa/selenium/grid/router/RemoteWebDriverDownloadTest.java +++ b/java/test/org/openqa/selenium/grid/router/RemoteWebDriverDownloadTest.java @@ -84,7 +84,7 @@ public void setupServers() { + "selenium-manager = true\n" + "enable-managed-downloads = true\n" + "driver-implementation = " - + browser.displayName()))); + + String.format("\"%s\"", browser.displayName())))); tearDowns.add(deployment); server = deployment.getServer(); diff --git a/java/test/org/openqa/selenium/grid/router/StressTest.java b/java/test/org/openqa/selenium/grid/router/StressTest.java index d64244b19c606..bfc892ada697e 100644 --- a/java/test/org/openqa/selenium/grid/router/StressTest.java +++ b/java/test/org/openqa/selenium/grid/router/StressTest.java @@ -73,7 +73,7 @@ public void setupServers() { new StringReader( "[node]\n" + "driver-implementation = " - + browser.displayName() + + String.format("\"%s\"", browser.displayName()) + "\n" + "session-timeout = 11" + "\n"