From 8c0bffd940cd00763a3d80d737907bb4643a772f Mon Sep 17 00:00:00 2001 From: Maciej Kucharczyk Date: Mon, 19 Aug 2024 20:36:11 +0200 Subject: [PATCH 1/7] [java] NullAway added --- MODULE.bazel | 1 + java/BUILD.bazel | 10 ++ java/maven_install.json | 118 +++++++++++++++++- java/src/org/openqa/selenium/BUILD.bazel | 8 ++ .../org/openqa/selenium/support/BUILD.bazel | 16 +++ 5 files changed, 151 insertions(+), 2 deletions(-) diff --git a/MODULE.bazel b/MODULE.bazel index 7ee21c50a99db..48d95b49fd083 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -180,6 +180,7 @@ maven.install( "com.google.googlejavaformat:google-java-format:jar:1.23.0", "com.graphql-java:graphql-java:20.2", "com.graphql-java:java-dataloader:3.2.0", + "com.uber.nullaway:nullaway:0.11.2", "dev.failsafe:failsafe:3.3.2", "io.grpc:grpc-context:1.66.0", "io.lettuce:lettuce-core:6.4.0.RELEASE", diff --git a/java/BUILD.bazel b/java/BUILD.bazel index 8634b26a80295..342d23637be7c 100644 --- a/java/BUILD.bazel +++ b/java/BUILD.bazel @@ -21,6 +21,16 @@ java_plugin( ], ) +java_plugin( + name = "nullaway", + visibility = [ + "//java:__subpackages__", + ], + deps = [ + artifact("com.uber.nullaway:nullaway"), + ] +) + java_library( name = "auto-service", exported_plugins = [ diff --git a/java/maven_install.json b/java/maven_install.json index 1e708a8f7ab8a..37cd3f8e50f69 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": 1231734442, - "__RESOLVED_ARTIFACTS_HASH": 1820339376, + "__INPUT_ARTIFACTS_HASH": 62551709, + "__RESOLVED_ARTIFACTS_HASH": -653304908, "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", @@ -206,6 +206,13 @@ }, "version": "3.2.0" }, + "com.uber.nullaway:nullaway": { + "shasums": { + "jar": "7a1e6747500c90b005ae57670af6e3e9213f141e3321bae3fec82ca60e04b49a", + "sources": "b3ecb5ad95fa9f18df754e8d6c09edf743de0a01773b103b56ee5f8cc3bcebf6" + }, + "version": "0.11.2" + }, "commons-codec:commons-codec": { "shasums": { "jar": "b3e9f6d63a790109bf0d056611fbed1cf69055826defeb9894a71369d246ed63", @@ -619,6 +626,13 @@ }, "version": "3.43.0" }, + "org.checkerframework:dataflow-nullaway": { + "shasums": { + "jar": "5575726419747f9681cdefae507013dbdfefbd0a28dff553be46cdd814756e49", + "sources": "49e6aed68eb1b29d850ea5e7221fed0eda56eb363935bdeee5c7b8488f35375a" + }, + "version": "3.43.0" + }, "org.dom4j:dom4j": { "shasums": { "jar": "235a9167a8a199be04b5326d92927ca0adeb90d11f69fe2e821b34ce8433b591", @@ -906,6 +920,11 @@ "com.graphql-java:java-dataloader": [ "org.slf4j:slf4j-api" ], + "com.uber.nullaway:nullaway": [ + "com.google.guava:guava", + "org.checkerframework:dataflow-nullaway", + "org.jspecify:jspecify" + ], "io.grpc:grpc-context": [ "io.grpc:grpc-api" ], @@ -1486,6 +1505,23 @@ "org.dataloader.stats", "org.dataloader.stats.context" ], + "com.uber.nullaway:nullaway": [ + "com.uber.nullaway", + "com.uber.nullaway.annotations", + "com.uber.nullaway.dataflow", + "com.uber.nullaway.dataflow.cfg", + "com.uber.nullaway.fixserialization", + "com.uber.nullaway.fixserialization.adapters", + "com.uber.nullaway.fixserialization.location", + "com.uber.nullaway.fixserialization.out", + "com.uber.nullaway.generics", + "com.uber.nullaway.handlers", + "com.uber.nullaway.handlers.contract", + "com.uber.nullaway.handlers.contract.fieldcontract", + "com.uber.nullaway.handlers.stream", + "com.uber.nullaway.handlers.temporary", + "com.uber.nullaway.jarinfer" + ], "commons-codec:commons-codec": [ "org.apache.commons.codec", "org.apache.commons.codec.binary", @@ -2546,6 +2582,80 @@ "org.checkerframework.dataflow.qual", "org.checkerframework.framework.qual" ], + "org.checkerframework:dataflow-nullaway": [ + "javax.annotation", + "javax.annotation.concurrent", + "javax.annotation.meta", + "org.checkerframework.dataflow.qual", + "org.checkerframework.nullaway.checker.builder.qual", + "org.checkerframework.nullaway.checker.calledmethods.qual", + "org.checkerframework.nullaway.checker.compilermsgs.qual", + "org.checkerframework.nullaway.checker.fenum.qual", + "org.checkerframework.nullaway.checker.formatter.qual", + "org.checkerframework.nullaway.checker.guieffect.qual", + "org.checkerframework.nullaway.checker.i18n.qual", + "org.checkerframework.nullaway.checker.i18nformatter.qual", + "org.checkerframework.nullaway.checker.index.qual", + "org.checkerframework.nullaway.checker.initialization.qual", + "org.checkerframework.nullaway.checker.interning.qual", + "org.checkerframework.nullaway.checker.lock.qual", + "org.checkerframework.nullaway.checker.mustcall.qual", + "org.checkerframework.nullaway.checker.nullness.qual", + "org.checkerframework.nullaway.checker.optional.qual", + "org.checkerframework.nullaway.checker.propkey.qual", + "org.checkerframework.nullaway.checker.regex.qual", + "org.checkerframework.nullaway.checker.signature.qual", + "org.checkerframework.nullaway.checker.signedness.qual", + "org.checkerframework.nullaway.checker.tainting.qual", + "org.checkerframework.nullaway.checker.units.qual", + "org.checkerframework.nullaway.com.google.common.annotations", + "org.checkerframework.nullaway.com.google.common.base", + "org.checkerframework.nullaway.com.google.common.base.internal", + "org.checkerframework.nullaway.com.google.common.cache", + "org.checkerframework.nullaway.com.google.common.collect", + "org.checkerframework.nullaway.com.google.common.escape", + "org.checkerframework.nullaway.com.google.common.eventbus", + "org.checkerframework.nullaway.com.google.common.graph", + "org.checkerframework.nullaway.com.google.common.hash", + "org.checkerframework.nullaway.com.google.common.html", + "org.checkerframework.nullaway.com.google.common.io", + "org.checkerframework.nullaway.com.google.common.math", + "org.checkerframework.nullaway.com.google.common.net", + "org.checkerframework.nullaway.com.google.common.primitives", + "org.checkerframework.nullaway.com.google.common.reflect", + "org.checkerframework.nullaway.com.google.common.util.concurrent", + "org.checkerframework.nullaway.com.google.common.util.concurrent.internal", + "org.checkerframework.nullaway.com.google.common.xml", + "org.checkerframework.nullaway.com.google.errorprone.annotations", + "org.checkerframework.nullaway.com.google.errorprone.annotations.concurrent", + "org.checkerframework.nullaway.com.google.j2objc.annotations", + "org.checkerframework.nullaway.com.google.thirdparty.publicsuffix", + "org.checkerframework.nullaway.common.aliasing.qual", + "org.checkerframework.nullaway.common.initializedfields.qual", + "org.checkerframework.nullaway.common.reflection.qual", + "org.checkerframework.nullaway.common.returnsreceiver.qual", + "org.checkerframework.nullaway.common.subtyping.qual", + "org.checkerframework.nullaway.common.util.count.report.qual", + "org.checkerframework.nullaway.common.value.qual", + "org.checkerframework.nullaway.dataflow.analysis", + "org.checkerframework.nullaway.dataflow.busyexpr", + "org.checkerframework.nullaway.dataflow.cfg", + "org.checkerframework.nullaway.dataflow.cfg.block", + "org.checkerframework.nullaway.dataflow.cfg.builder", + "org.checkerframework.nullaway.dataflow.cfg.node", + "org.checkerframework.nullaway.dataflow.cfg.playground", + "org.checkerframework.nullaway.dataflow.cfg.visualize", + "org.checkerframework.nullaway.dataflow.constantpropagation", + "org.checkerframework.nullaway.dataflow.expression", + "org.checkerframework.nullaway.dataflow.livevariable", + "org.checkerframework.nullaway.dataflow.reachingdef", + "org.checkerframework.nullaway.dataflow.util", + "org.checkerframework.nullaway.framework.qual", + "org.checkerframework.nullaway.javacutil", + "org.checkerframework.nullaway.javacutil.trees", + "org.checkerframework.nullaway.org.plumelib.reflection", + "org.checkerframework.nullaway.org.plumelib.util" + ], "org.dom4j:dom4j": [ "org.dom4j", "org.dom4j.bean", @@ -3017,6 +3127,8 @@ "com.graphql-java:graphql-java:jar:sources", "com.graphql-java:java-dataloader", "com.graphql-java:java-dataloader:jar:sources", + "com.uber.nullaway:nullaway", + "com.uber.nullaway:nullaway:jar:sources", "commons-codec:commons-codec", "commons-codec:commons-codec:jar:sources", "commons-io:commons-io", @@ -3135,6 +3247,8 @@ "org.bouncycastle:bcutil-jdk18on:jar:sources", "org.checkerframework:checker-qual", "org.checkerframework:checker-qual:jar:sources", + "org.checkerframework:dataflow-nullaway", + "org.checkerframework:dataflow-nullaway:jar:sources", "org.dom4j:dom4j", "org.dom4j:dom4j:jar:sources", "org.eclipse.mylyn.github:org.eclipse.egit.github.core", diff --git a/java/src/org/openqa/selenium/BUILD.bazel b/java/src/org/openqa/selenium/BUILD.bazel index a10ac67d52a0f..a6262047d012f 100644 --- a/java/src/org/openqa/selenium/BUILD.bazel +++ b/java/src/org/openqa/selenium/BUILD.bazel @@ -38,6 +38,14 @@ java_export( ":manifest", artifact("org.jspecify:jspecify"), ], + plugins = [ + "//java:nullaway" + ], + javacopts = [ + '-Xep:NullAway:WARN', + '-XepOpt:NullAway:AnnotatedPackages=org.openqa.selenium', + '-XepOpt:NullAway:JSpecifyMode=true' + ], ) java_export( diff --git a/java/src/org/openqa/selenium/support/BUILD.bazel b/java/src/org/openqa/selenium/support/BUILD.bazel index f7fecdc481463..e768935159903 100644 --- a/java/src/org/openqa/selenium/support/BUILD.bazel +++ b/java/src/org/openqa/selenium/support/BUILD.bazel @@ -36,6 +36,14 @@ java_export( "//java/src/org/openqa/selenium/support/ui:elements", "//java/src/org/openqa/selenium/support/ui:wait", ], + plugins = [ + "//java:nullaway" + ], + javacopts = [ + '-Xep:NullAway:WARN', + '-XepOpt:NullAway:AnnotatedPackages=org.openqa.selenium', + '-XepOpt:NullAway:JSpecifyMode=true' + ], ) java_library( @@ -58,4 +66,12 @@ java_library( "//java/src/org/openqa/selenium:core", "//java/src/org/openqa/selenium/support/ui:components", ], + plugins = [ + "//java:nullaway" + ], + javacopts = [ + '-Xep:NullAway:WARN', + '-XepOpt:NullAway:AnnotatedPackages=org.openqa.selenium', + '-XepOpt:NullAway:JSpecifyMode=true' + ], ) From 6f1d082c4d9880713a9e8eb7dabf0e73c3c0663d Mon Sep 17 00:00:00 2001 From: Maciej Kucharczyk Date: Tue, 27 Aug 2024 17:35:18 +0200 Subject: [PATCH 2/7] [java] NullAway added for the entire project --- .github/workflows/ci-java.yml | 8 +++ java/BUILD.bazel | 21 ++++++++ java/private/export.bzl | 3 +- java/private/java_library.bzl | 52 +++++++++++++++++++ java/private/library.bzl | 2 +- java/src/org/openqa/selenium/BUILD.bazel | 8 --- .../org/openqa/selenium/support/BUILD.bazel | 16 ------ 7 files changed, 84 insertions(+), 26 deletions(-) create mode 100644 java/private/java_library.bzl diff --git a/.github/workflows/ci-java.yml b/.github/workflows/ci-java.yml index 569d68d562440..cb266150916c0 100644 --- a/.github/workflows/ci-java.yml +++ b/.github/workflows/ci-java.yml @@ -71,3 +71,11 @@ jobs: java-version: 17 run: | bazel test --flaky_test_attempts 3 //java/test/org/openqa/selenium/chrome:ChromeDriverFunctionalTest-remote + + nullaway-checks: + name: NullAway Checks + uses: ./.github/workflows/bazel.yml + with: + name: NullAway Checks + java-version: 17 + run: bazel build //java/... --//java:nullaway_level=ERROR diff --git a/java/BUILD.bazel b/java/BUILD.bazel index 342d23637be7c..169736d5c545a 100644 --- a/java/BUILD.bazel +++ b/java/BUILD.bazel @@ -1,5 +1,6 @@ load("@contrib_rules_jvm//java:defs.bzl", "spotbugs_config") load(":defs.bzl", "artifact") +load("@bazel_skylib//rules:common_settings.bzl", "string_flag") exports_files( srcs = [ @@ -53,3 +54,23 @@ spotbugs_config( "//visibility:public", ], ) + +string_flag( + name = "nullaway_level", + values = ["NONE", "WARN", "ERROR"], + build_setting_default = "NONE", +) + +config_setting( + name = "use_nullaway_level_warn", + flag_values = { + ":nullaway_level": "WARN", + }, +) + +config_setting( + name = "use_nullaway_level_error", + flag_values = { + ":nullaway_level": "ERROR", + }, +) diff --git a/java/private/export.bzl b/java/private/export.bzl index 1d3e9b0498b46..33e7b640b4969 100644 --- a/java/private/export.bzl +++ b/java/private/export.bzl @@ -7,6 +7,7 @@ load("@rules_jvm_external//private/rules:maven_bom_fragment.bzl", "maven_bom_fra load("@rules_jvm_external//private/rules:maven_project_jar.bzl", "maven_project_jar") load("@rules_jvm_external//private/rules:maven_publish.bzl", "maven_publish") load("//java/private:module.bzl", "java_module") +load(":java_library.bzl", "java_library") def java_export( name, @@ -24,7 +25,7 @@ def java_export( lib_name = "%s-lib" % name # Construct the java_library we'll export from here. - native.java_library( + java_library( name = lib_name, tags = tags, exports = exports, diff --git a/java/private/java_library.bzl b/java/private/java_library.bzl new file mode 100644 index 0000000000000..b1dcc2f01597f --- /dev/null +++ b/java/private/java_library.bzl @@ -0,0 +1,52 @@ +load( + "@contrib_rules_jvm//java:defs.bzl", + _java_library = "java_library" +) + +def java_library( + name, + deps = [], + srcs = [], + exports = [], + tags = [], + visibility = None, + javacopts = [], + plugins = [], + **kwargs): + + # NullAway configuration + nullaway_plugins = select({ + "//java:use_nullaway_level_warn": [ + "//java:nullaway" + ], + "//java:use_nullaway_level_error": [ + "//java:nullaway" + ], + "//conditions:default": [], + }) + nullaway_javacopts = select({ + "//java:use_nullaway_level_warn": [ + '-Xep:NullAway:WARN', + '-XepOpt:NullAway:AnnotatedPackages=org.openqa.selenium', + '-XepOpt:NullAway:JSpecifyMode=true' + ], + "//java:use_nullaway_level_error": [ + '-Xep:NullAway:ERROR', + '-XepOpt:NullAway:AnnotatedPackages=org.openqa.selenium', + '-XepOpt:NullAway:JSpecifyMode=true' + ], + "//conditions:default": [], + }) + + # global place for NullAway plugin use + _java_library( + name = name, + deps = deps, + srcs = srcs, + exports = exports, + tags = tags, + visibility = visibility, + plugins = plugins + nullaway_plugins, + javacopts = javacopts + nullaway_javacopts, + **kwargs + ) diff --git a/java/private/library.bzl b/java/private/library.bzl index f2f7d7f69a2d8..a83b738e152b1 100644 --- a/java/private/library.bzl +++ b/java/private/library.bzl @@ -1,9 +1,9 @@ load( "@contrib_rules_jvm//java:defs.bzl", - _java_library = "java_library", _java_test = "java_test", ) load(":export.bzl", _java_export = "java_export") +load(":java_library.bzl", _java_library = "java_library") java_export = _java_export java_library = _java_library diff --git a/java/src/org/openqa/selenium/BUILD.bazel b/java/src/org/openqa/selenium/BUILD.bazel index a6262047d012f..a10ac67d52a0f 100644 --- a/java/src/org/openqa/selenium/BUILD.bazel +++ b/java/src/org/openqa/selenium/BUILD.bazel @@ -38,14 +38,6 @@ java_export( ":manifest", artifact("org.jspecify:jspecify"), ], - plugins = [ - "//java:nullaway" - ], - javacopts = [ - '-Xep:NullAway:WARN', - '-XepOpt:NullAway:AnnotatedPackages=org.openqa.selenium', - '-XepOpt:NullAway:JSpecifyMode=true' - ], ) java_export( diff --git a/java/src/org/openqa/selenium/support/BUILD.bazel b/java/src/org/openqa/selenium/support/BUILD.bazel index e768935159903..f7fecdc481463 100644 --- a/java/src/org/openqa/selenium/support/BUILD.bazel +++ b/java/src/org/openqa/selenium/support/BUILD.bazel @@ -36,14 +36,6 @@ java_export( "//java/src/org/openqa/selenium/support/ui:elements", "//java/src/org/openqa/selenium/support/ui:wait", ], - plugins = [ - "//java:nullaway" - ], - javacopts = [ - '-Xep:NullAway:WARN', - '-XepOpt:NullAway:AnnotatedPackages=org.openqa.selenium', - '-XepOpt:NullAway:JSpecifyMode=true' - ], ) java_library( @@ -66,12 +58,4 @@ java_library( "//java/src/org/openqa/selenium:core", "//java/src/org/openqa/selenium/support/ui:components", ], - plugins = [ - "//java:nullaway" - ], - javacopts = [ - '-Xep:NullAway:WARN', - '-XepOpt:NullAway:AnnotatedPackages=org.openqa.selenium', - '-XepOpt:NullAway:JSpecifyMode=true' - ], ) From 4eb71bdcab66cf7b1b59b5d9b1fceb033f18c261 Mon Sep 17 00:00:00 2001 From: Maciej Kucharczyk Date: Thu, 19 Sep 2024 18:10:42 +0200 Subject: [PATCH 3/7] Update nullaway --- MODULE.bazel | 2 +- java/BUILD.bazel | 10 +++++++--- java/maven_install.json | 10 +++++----- java/private/java_library.bzl | 19 +++++++++---------- 4 files changed, 22 insertions(+), 19 deletions(-) diff --git a/MODULE.bazel b/MODULE.bazel index c87de8ef671df..cfabc67ac604d 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -180,7 +180,7 @@ maven.install( "com.google.googlejavaformat:google-java-format:jar:1.23.0", "com.graphql-java:graphql-java:20.2", "com.graphql-java:java-dataloader:3.2.0", - "com.uber.nullaway:nullaway:0.11.2", + "com.uber.nullaway:nullaway:0.11.3", "dev.failsafe:failsafe:3.3.2", "io.grpc:grpc-context:1.66.0", "io.lettuce:lettuce-core:6.4.0.RELEASE", diff --git a/java/BUILD.bazel b/java/BUILD.bazel index 169736d5c545a..994f938776efe 100644 --- a/java/BUILD.bazel +++ b/java/BUILD.bazel @@ -1,6 +1,6 @@ +load("@bazel_skylib//rules:common_settings.bzl", "string_flag") load("@contrib_rules_jvm//java:defs.bzl", "spotbugs_config") load(":defs.bzl", "artifact") -load("@bazel_skylib//rules:common_settings.bzl", "string_flag") exports_files( srcs = [ @@ -29,7 +29,7 @@ java_plugin( ], deps = [ artifact("com.uber.nullaway:nullaway"), - ] + ], ) java_library( @@ -57,8 +57,12 @@ spotbugs_config( string_flag( name = "nullaway_level", - values = ["NONE", "WARN", "ERROR"], build_setting_default = "NONE", + values = [ + "NONE", + "WARN", + "ERROR", + ], ) config_setting( diff --git a/java/maven_install.json b/java/maven_install.json index c0fa57e7b7aa7..98393e9832ce3 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": 811715158, - "__RESOLVED_ARTIFACTS_HASH": -1728330386, + "__INPUT_ARTIFACTS_HASH": 1792396849, + "__RESOLVED_ARTIFACTS_HASH": 1206533551, "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", @@ -208,10 +208,10 @@ }, "com.uber.nullaway:nullaway": { "shasums": { - "jar": "7a1e6747500c90b005ae57670af6e3e9213f141e3321bae3fec82ca60e04b49a", - "sources": "b3ecb5ad95fa9f18df754e8d6c09edf743de0a01773b103b56ee5f8cc3bcebf6" + "jar": "daac4247daf18024c236a4f9bae99a145bca044037ca8d805e00dc1b76270b31", + "sources": "e76ad83c1796291c5c2c9cb6c35bd06eebe51735319f06b27992cea5edd50999" }, - "version": "0.11.2" + "version": "0.11.3" }, "commons-codec:commons-codec": { "shasums": { diff --git a/java/private/java_library.bzl b/java/private/java_library.bzl index b1dcc2f01597f..0273b48f0d185 100644 --- a/java/private/java_library.bzl +++ b/java/private/java_library.bzl @@ -1,6 +1,6 @@ load( "@contrib_rules_jvm//java:defs.bzl", - _java_library = "java_library" + _java_library = "java_library", ) def java_library( @@ -13,27 +13,26 @@ def java_library( javacopts = [], plugins = [], **kwargs): - # NullAway configuration nullaway_plugins = select({ "//java:use_nullaway_level_warn": [ - "//java:nullaway" + "//java:nullaway", ], "//java:use_nullaway_level_error": [ - "//java:nullaway" + "//java:nullaway", ], "//conditions:default": [], }) nullaway_javacopts = select({ "//java:use_nullaway_level_warn": [ - '-Xep:NullAway:WARN', - '-XepOpt:NullAway:AnnotatedPackages=org.openqa.selenium', - '-XepOpt:NullAway:JSpecifyMode=true' + "-Xep:NullAway:WARN", + "-XepOpt:NullAway:AnnotatedPackages=org.openqa.selenium", + "-XepOpt:NullAway:JSpecifyMode=true", ], "//java:use_nullaway_level_error": [ - '-Xep:NullAway:ERROR', - '-XepOpt:NullAway:AnnotatedPackages=org.openqa.selenium', - '-XepOpt:NullAway:JSpecifyMode=true' + "-Xep:NullAway:ERROR", + "-XepOpt:NullAway:AnnotatedPackages=org.openqa.selenium", + "-XepOpt:NullAway:JSpecifyMode=true", ], "//conditions:default": [], }) From 6131bda14283ec2a65333cc2c4cec905c1f9bed3 Mon Sep 17 00:00:00 2001 From: Diego Molina Date: Sat, 28 Dec 2024 11:06:01 +0000 Subject: [PATCH 4/7] Pinning deps --- java/maven_install.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/java/maven_install.json b/java/maven_install.json index 42ca9ecd9bb0a..43ea5a7007e90 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": 818842380, - "__RESOLVED_ARTIFACTS_HASH": 1188602649, + "__INPUT_ARTIFACTS_HASH": 186015662, + "__RESOLVED_ARTIFACTS_HASH": 1365610560, "artifacts": { "com.beust:jcommander": { "shasums": { From 4558a2454e37437a17bbe45637b7726ddfc4375a Mon Sep 17 00:00:00 2001 From: Diego Molina Date: Sat, 28 Dec 2024 11:47:41 +0000 Subject: [PATCH 5/7] Adding annotations to validate the check --- java/src/org/openqa/selenium/grid/jmx/JMXHelper.java | 2 ++ java/src/org/openqa/selenium/grid/jmx/MBean.java | 2 ++ 2 files changed, 4 insertions(+) diff --git a/java/src/org/openqa/selenium/grid/jmx/JMXHelper.java b/java/src/org/openqa/selenium/grid/jmx/JMXHelper.java index ea527ed6c5254..ecc674d488666 100644 --- a/java/src/org/openqa/selenium/grid/jmx/JMXHelper.java +++ b/java/src/org/openqa/selenium/grid/jmx/JMXHelper.java @@ -22,11 +22,13 @@ import javax.management.InstanceAlreadyExistsException; import javax.management.MBeanServer; import javax.management.ObjectName; +import org.jspecify.annotations.Nullable; public class JMXHelper { private static final Logger LOG = Logger.getLogger(JMXHelper.class.getName()); + @Nullable public MBean register(Object bean) { MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); MBean mBean = new MBean(bean); diff --git a/java/src/org/openqa/selenium/grid/jmx/MBean.java b/java/src/org/openqa/selenium/grid/jmx/MBean.java index 501cd254d27d5..ee2bc63e71eb9 100644 --- a/java/src/org/openqa/selenium/grid/jmx/MBean.java +++ b/java/src/org/openqa/selenium/grid/jmx/MBean.java @@ -34,6 +34,7 @@ import javax.management.MBeanOperationInfo; import javax.management.MalformedObjectNameException; import javax.management.ObjectName; +import org.jspecify.annotations.Nullable; public class MBean implements DynamicMBean { @@ -57,6 +58,7 @@ private static class AttributeInfo { this.setter = setter; } + @Nullable MBeanAttributeInfo getMBeanAttributeInfo() { try { return new MBeanAttributeInfo(name, description, getter, setter); From d941c18bbaca9ef4e12002c03005ffe1879dc628 Mon Sep 17 00:00:00 2001 From: Diego Molina Date: Sat, 28 Dec 2024 18:29:13 +0100 Subject: [PATCH 6/7] [java] Fixing nullable issues --- .../org/openqa/selenium/grid/jmx/BUILD.bazel | 5 ++- .../org/openqa/selenium/grid/jmx/MBean.java | 33 ++++++++++++++++--- 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/java/src/org/openqa/selenium/grid/jmx/BUILD.bazel b/java/src/org/openqa/selenium/grid/jmx/BUILD.bazel index 00baccd2980fd..5c21f1389830c 100644 --- a/java/src/org/openqa/selenium/grid/jmx/BUILD.bazel +++ b/java/src/org/openqa/selenium/grid/jmx/BUILD.bazel @@ -1,4 +1,4 @@ -load("//java:defs.bzl", "java_library") +load("//java:defs.bzl", "artifact", "java_library") java_library( name = "jmx", @@ -8,4 +8,7 @@ java_library( "//java/src/org/openqa/selenium/grid/session:__pkg__", "//java/test/org/openqa/selenium/grid:__subpackages__", ], + deps = [ + artifact("org.jspecify:jspecify"), + ], ) diff --git a/java/src/org/openqa/selenium/grid/jmx/MBean.java b/java/src/org/openqa/selenium/grid/jmx/MBean.java index ee2bc63e71eb9..3adfa50ea4ebf 100644 --- a/java/src/org/openqa/selenium/grid/jmx/MBean.java +++ b/java/src/org/openqa/selenium/grid/jmx/MBean.java @@ -118,6 +118,7 @@ private void collectAttributeInfo(Object bean) { .forEach(ai -> attributeMap.put(ai.name, ai)); } + @Nullable private AttributeInfo getAttributeInfo(Method m) { ManagedAttribute ma = m.getAnnotation(ManagedAttribute.class); if (ma == null) { @@ -125,13 +126,19 @@ private AttributeInfo getAttributeInfo(Method m) { } try { String name = "".equals(ma.name()) ? m.getName() : ma.name(); - return new AttributeInfo(name, ma.description(), findGetter(m), findSetter(m)); + Method getter = findGetter(m); + Method setter = findSetter(m); + if (getter == null || setter == null) { + return null; + } + return new AttributeInfo(name, ma.description(), getter, setter); } catch (Throwable t) { LOG.severe("Error during execution: " + t.getMessage()); return null; } } + @Nullable private Method findGetter(Method annotatedMethod) { ManagedAttribute ma = annotatedMethod.getAnnotation(ManagedAttribute.class); try { @@ -153,6 +160,7 @@ private Method findGetter(Method annotatedMethod) { } } + @Nullable private Method findSetter(Method annotatedMethod) { ManagedAttribute ma = annotatedMethod.getAnnotation(ManagedAttribute.class); if (!"".equals(ma.setter())) { @@ -172,6 +180,7 @@ private Method findSetter(Method annotatedMethod) { return null; } + @Nullable private Method findMethod(Class cls, String name) { return Stream.of(cls.getMethods()) .filter(m -> m.getName().equals(name)) @@ -186,6 +195,7 @@ private void collectOperationInfo(Object bean) { .forEach(oi -> operationMap.put(oi.name, oi)); } + @Nullable private OperationInfo getOperationInfo(Method m) { ManagedOperation mo = m.getAnnotation(ManagedOperation.class); if (mo == null) { @@ -215,10 +225,15 @@ private ObjectName generateObjectName(Object bean) { } } + @Nullable @Override public Object getAttribute(String attribute) { + AttributeInfo attributeInfo = attributeMap.get(attribute); + if (attributeInfo == null) { + return null; + } try { - Object res = attributeMap.get(attribute).getter.invoke(bean); + Object res = attributeInfo.getter.invoke(bean); if (res instanceof Map) { return ((Map) res) .entrySet().stream() @@ -236,8 +251,12 @@ public Object getAttribute(String attribute) { @Override public void setAttribute(Attribute attribute) { + AttributeInfo attributeInfo = attributeMap.get(attribute.getName()); + if (attributeInfo == null) { + return; + } try { - attributeMap.get(attribute.getName()).setter.invoke(bean, attribute.getValue()); + attributeInfo.setter.invoke(bean, attribute.getValue()); } catch (IllegalAccessException | InvocationTargetException e) { LOG.severe("Error during execution: " + e.getMessage()); } @@ -258,15 +277,21 @@ public AttributeList getAttributes(String[] attributes) { return resultList; } + @Nullable @Override public AttributeList setAttributes(AttributeList attributes) { return null; } + @Nullable @Override public Object invoke(String actionName, Object[] params, String[] signature) { + OperationInfo operationInfo = operationMap.get(actionName); + if (operationInfo == null) { + return null; + } try { - return operationMap.get(actionName).method.invoke(bean, params); + return operationInfo.method.invoke(bean, params); } catch (IllegalAccessException | InvocationTargetException e) { LOG.severe("Error during execution: " + e.getMessage()); return null; From 2d4d6fa2824a6a51bf5be57da608e77e4f5d1c92 Mon Sep 17 00:00:00 2001 From: Diego Molina Date: Sat, 28 Dec 2024 19:13:05 +0100 Subject: [PATCH 7/7] [java] Removing NullAway checks in JMXHelper as these are internal classes. --- .../org/openqa/selenium/grid/jmx/BUILD.bazel | 5 +-- .../openqa/selenium/grid/jmx/JMXHelper.java | 3 +- .../org/openqa/selenium/grid/jmx/MBean.java | 45 ++++++------------- 3 files changed, 16 insertions(+), 37 deletions(-) diff --git a/java/src/org/openqa/selenium/grid/jmx/BUILD.bazel b/java/src/org/openqa/selenium/grid/jmx/BUILD.bazel index 5c21f1389830c..00baccd2980fd 100644 --- a/java/src/org/openqa/selenium/grid/jmx/BUILD.bazel +++ b/java/src/org/openqa/selenium/grid/jmx/BUILD.bazel @@ -1,4 +1,4 @@ -load("//java:defs.bzl", "artifact", "java_library") +load("//java:defs.bzl", "java_library") java_library( name = "jmx", @@ -8,7 +8,4 @@ java_library( "//java/src/org/openqa/selenium/grid/session:__pkg__", "//java/test/org/openqa/selenium/grid:__subpackages__", ], - deps = [ - artifact("org.jspecify:jspecify"), - ], ) diff --git a/java/src/org/openqa/selenium/grid/jmx/JMXHelper.java b/java/src/org/openqa/selenium/grid/jmx/JMXHelper.java index ecc674d488666..2b4f19f6adebe 100644 --- a/java/src/org/openqa/selenium/grid/jmx/JMXHelper.java +++ b/java/src/org/openqa/selenium/grid/jmx/JMXHelper.java @@ -22,13 +22,12 @@ import javax.management.InstanceAlreadyExistsException; import javax.management.MBeanServer; import javax.management.ObjectName; -import org.jspecify.annotations.Nullable; public class JMXHelper { private static final Logger LOG = Logger.getLogger(JMXHelper.class.getName()); - @Nullable + @SuppressWarnings("NullAway") public MBean register(Object bean) { MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); MBean mBean = new MBean(bean); diff --git a/java/src/org/openqa/selenium/grid/jmx/MBean.java b/java/src/org/openqa/selenium/grid/jmx/MBean.java index 3adfa50ea4ebf..9687815ed9a93 100644 --- a/java/src/org/openqa/selenium/grid/jmx/MBean.java +++ b/java/src/org/openqa/selenium/grid/jmx/MBean.java @@ -34,7 +34,6 @@ import javax.management.MBeanOperationInfo; import javax.management.MalformedObjectNameException; import javax.management.ObjectName; -import org.jspecify.annotations.Nullable; public class MBean implements DynamicMBean { @@ -58,7 +57,7 @@ private static class AttributeInfo { this.setter = setter; } - @Nullable + @SuppressWarnings("NullAway") MBeanAttributeInfo getMBeanAttributeInfo() { try { return new MBeanAttributeInfo(name, description, getter, setter); @@ -118,7 +117,7 @@ private void collectAttributeInfo(Object bean) { .forEach(ai -> attributeMap.put(ai.name, ai)); } - @Nullable + @SuppressWarnings("NullAway") private AttributeInfo getAttributeInfo(Method m) { ManagedAttribute ma = m.getAnnotation(ManagedAttribute.class); if (ma == null) { @@ -126,19 +125,14 @@ private AttributeInfo getAttributeInfo(Method m) { } try { String name = "".equals(ma.name()) ? m.getName() : ma.name(); - Method getter = findGetter(m); - Method setter = findSetter(m); - if (getter == null || setter == null) { - return null; - } - return new AttributeInfo(name, ma.description(), getter, setter); + return new AttributeInfo(name, ma.description(), findGetter(m), findSetter(m)); } catch (Throwable t) { LOG.severe("Error during execution: " + t.getMessage()); return null; } } - @Nullable + @SuppressWarnings("NullAway") private Method findGetter(Method annotatedMethod) { ManagedAttribute ma = annotatedMethod.getAnnotation(ManagedAttribute.class); try { @@ -160,7 +154,7 @@ private Method findGetter(Method annotatedMethod) { } } - @Nullable + @SuppressWarnings("NullAway") private Method findSetter(Method annotatedMethod) { ManagedAttribute ma = annotatedMethod.getAnnotation(ManagedAttribute.class); if (!"".equals(ma.setter())) { @@ -180,7 +174,7 @@ private Method findSetter(Method annotatedMethod) { return null; } - @Nullable + @SuppressWarnings("NullAway") private Method findMethod(Class cls, String name) { return Stream.of(cls.getMethods()) .filter(m -> m.getName().equals(name)) @@ -195,7 +189,7 @@ private void collectOperationInfo(Object bean) { .forEach(oi -> operationMap.put(oi.name, oi)); } - @Nullable + @SuppressWarnings("NullAway") private OperationInfo getOperationInfo(Method m) { ManagedOperation mo = m.getAnnotation(ManagedOperation.class); if (mo == null) { @@ -225,15 +219,11 @@ private ObjectName generateObjectName(Object bean) { } } - @Nullable + @SuppressWarnings("NullAway") @Override public Object getAttribute(String attribute) { - AttributeInfo attributeInfo = attributeMap.get(attribute); - if (attributeInfo == null) { - return null; - } try { - Object res = attributeInfo.getter.invoke(bean); + Object res = attributeMap.get(attribute).getter.invoke(bean); if (res instanceof Map) { return ((Map) res) .entrySet().stream() @@ -249,14 +239,11 @@ public Object getAttribute(String attribute) { } } + @SuppressWarnings("NullAway") @Override public void setAttribute(Attribute attribute) { - AttributeInfo attributeInfo = attributeMap.get(attribute.getName()); - if (attributeInfo == null) { - return; - } try { - attributeInfo.setter.invoke(bean, attribute.getValue()); + attributeMap.get(attribute.getName()).setter.invoke(bean, attribute.getValue()); } catch (IllegalAccessException | InvocationTargetException e) { LOG.severe("Error during execution: " + e.getMessage()); } @@ -277,21 +264,17 @@ public AttributeList getAttributes(String[] attributes) { return resultList; } - @Nullable + @SuppressWarnings("NullAway") @Override public AttributeList setAttributes(AttributeList attributes) { return null; } - @Nullable + @SuppressWarnings("NullAway") @Override public Object invoke(String actionName, Object[] params, String[] signature) { - OperationInfo operationInfo = operationMap.get(actionName); - if (operationInfo == null) { - return null; - } try { - return operationInfo.method.invoke(bean, params); + return operationMap.get(actionName).method.invoke(bean, params); } catch (IllegalAccessException | InvocationTargetException e) { LOG.severe("Error during execution: " + e.getMessage()); return null;