diff --git a/.github/workflows/buildcache.yml b/.github/workflows/buildcache.yml index bb5d7b47361..419588304f3 100644 --- a/.github/workflows/buildcache.yml +++ b/.github/workflows/buildcache.yml @@ -34,7 +34,7 @@ jobs: fail-fast: false matrix: os: [ubuntu, macos, windows] - jdk: [8, 11, 17] + jdk: [8, 11, 17, 21] name: '${{ matrix.os }}, ${{ matrix.jdk }} seed build cache' runs-on: ${{ matrix.os }}-latest diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index fb932aac893..c380a56c4e0 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -115,6 +115,40 @@ jobs: echo sqlsh call sqlsh.bat -o headers "select count(*) commits, author from (select substring(author, 1, position(' <' in author)-1) author from git_commits) group by author order by count(*) desc, author limit 20" + windows-jdk21: + if: github.event.action != 'labeled' + name: 'Windows (JDK 21)' + runs-on: windows-latest + steps: + - uses: actions/checkout@v3 + with: + fetch-depth: 50 + - name: 'Set up JDK 21' + uses: actions/setup-java@v2 + with: + java-version: 21 + distribution: 'zulu' + - uses: burrunan/gradle-cache-action@v1 + name: Test + env: + S3_BUILD_CACHE_ACCESS_KEY_ID: ${{ secrets.S3_BUILD_CACHE_ACCESS_KEY_ID }} + S3_BUILD_CACHE_SECRET_KEY: ${{ secrets.S3_BUILD_CACHE_SECRET_KEY }} + GRADLE_ENTERPRISE_ACCESS_KEY: ${{ secrets.GE_ACCESS_TOKEN }} + with: + job-id: jdk${{ matrix.jdk }} + remote-build-cache-proxy-enabled: false + arguments: --scan --no-parallel --no-daemon build + - name: 'sqlline and sqllsh' + shell: cmd + run: | + call sqlline.bat -e '!quit' + echo. + echo Sqlline example/csv + call example/csv/sqlline.bat --verbose -u jdbc:calcite:model=example/csv/src/test/resources/model.json -n admin -p admin -f example/csv/src/test/resources/smoke_test.sql + echo. + echo sqlsh + call sqlsh.bat -o headers "select count(*) commits, author from (select substring(author, 1, position(' <' in author)-1) author from git_commits) group by author order by count(*) desc, author limit 20" + linux-jdk8-oldest-guava-tz: if: github.event.action != 'labeled' name: 'Linux (JDK 8), oldest Guava, America/New_York Timezone' @@ -220,9 +254,35 @@ jobs: remote-build-cache-proxy-enabled: false arguments: --scan --no-parallel --no-daemon -Pguava.version=${{ env.GUAVA }} build - linux-jdk19: # latest JDK version supported by ForbiddenAPIs plugin, keep this updated (see https://jdk.java.net/) + linux-jdk121: # LTS JDK version, don't remove until EOL + if: github.event.action != 'labeled' + name: 'Linux (JDK 21)' + runs-on: ubuntu-latest + env: + GUAVA: '21.0' # oldest Guava + steps: + - uses: actions/checkout@v3 + with: + fetch-depth: 50 + - name: 'Set up JDK 21' + uses: actions/setup-java@v2 + with: + java-version: 21 + distribution: 'zulu' + - uses: burrunan/gradle-cache-action@v1 + name: Test + env: + S3_BUILD_CACHE_ACCESS_KEY_ID: ${{ secrets.S3_BUILD_CACHE_ACCESS_KEY_ID }} + S3_BUILD_CACHE_SECRET_KEY: ${{ secrets.S3_BUILD_CACHE_SECRET_KEY }} + GRADLE_ENTERPRISE_ACCESS_KEY: ${{ secrets.GE_ACCESS_TOKEN }} + with: + job-id: jdk${{ matrix.jdk }} + remote-build-cache-proxy-enabled: false + arguments: --scan --no-parallel --no-daemon -Pguava.version=${{ env.GUAVA }} build + + linux-jdk22: # latest JDK version supported by ForbiddenAPIs plugin, keep this updated (see https://jdk.java.net/) if: github.event.action != 'labeled' - name: 'Linux (JDK 19)' + name: 'Linux (JDK 22)' runs-on: ubuntu-latest env: GUAVA: '21.0' # oldest Guava @@ -230,10 +290,10 @@ jobs: - uses: actions/checkout@v3 with: fetch-depth: 50 - - name: 'Set up JDK 19' + - name: 'Set up JDK 22' uses: actions/setup-java@v2 with: - java-version: 19 + java-version: 22 distribution: 'zulu' - uses: burrunan/gradle-cache-action@v1 name: Test @@ -293,16 +353,16 @@ jobs: mac: if: github.event.action != 'labeled' - name: 'macOS (JDK 19)' + name: 'macOS (JDK 21)' runs-on: macos-latest steps: - uses: actions/checkout@v3 with: fetch-depth: 50 - - name: 'Set up JDK 19' + - name: 'Set up JDK 21' uses: actions/setup-java@v2 with: - java-version: 19 + java-version: 21 distribution: 'zulu' - uses: burrunan/gradle-cache-action@v1 name: Test @@ -311,7 +371,7 @@ jobs: S3_BUILD_CACHE_SECRET_KEY: ${{ secrets.S3_BUILD_CACHE_SECRET_KEY }} GRADLE_ENTERPRISE_ACCESS_KEY: ${{ secrets.GE_ACCESS_TOKEN }} with: - job-id: jdk19 + job-id: jdk21 remote-build-cache-proxy-enabled: false arguments: --scan --no-parallel --no-daemon build javadoc - name: 'sqlline and sqllsh' diff --git a/build.gradle.kts b/build.gradle.kts index 60d340ac34e..be829ddbb6c 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -811,6 +811,9 @@ allprojects { inputs.property("java.vm.version", System.getProperty("java.vm.version")) options.encoding = "UTF-8" options.compilerArgs.add("-Xlint:deprecation") + // JDK 1.8 is deprecated https://bugs.openjdk.org/browse/JDK-8173605 + // and now it requires -Xlint:-options to mute warnings about its deprecation + options.compilerArgs.add("-Xlint:-options") if (werror) { options.compilerArgs.add("-Werror") } diff --git a/core/src/main/java/org/apache/calcite/runtime/HttpUtils.java b/core/src/main/java/org/apache/calcite/runtime/HttpUtils.java index 9191dc1a3ae..23c4130de31 100644 --- a/core/src/main/java/org/apache/calcite/runtime/HttpUtils.java +++ b/core/src/main/java/org/apache/calcite/runtime/HttpUtils.java @@ -22,7 +22,7 @@ import java.io.UnsupportedEncodingException; import java.io.Writer; import java.net.HttpURLConnection; -import java.net.URL; +import java.net.URI; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.util.Map; @@ -35,7 +35,7 @@ private HttpUtils() {} public static HttpURLConnection getURLConnection(String url) throws IOException { - return (HttpURLConnection) new URL(url).openConnection(); + return (HttpURLConnection) URI.create(url).toURL().openConnection(); } public static void appendURLEncodedArgs( diff --git a/core/src/main/java/org/apache/calcite/util/Sources.java b/core/src/main/java/org/apache/calcite/util/Sources.java index d1846505564..7cf91db5e96 100644 --- a/core/src/main/java/org/apache/calcite/util/Sources.java +++ b/core/src/main/java/org/apache/calcite/util/Sources.java @@ -82,7 +82,7 @@ public static Source fromCharSource(CharSource source) { public static Source url(String url) { try { - return of(new URL(url)); + return of(URI.create(url).toURL()); } catch (MalformedURLException | IllegalArgumentException e) { throw new RuntimeException("Malformed URL: '" + url + "'", e); } @@ -222,7 +222,7 @@ private static URL fileToUrl(File file) { // That is why java.net.URLEncoder.encode(java.lang.String, java.lang.String) is not // suitable because it replaces " " with "+". String encodedPath = new URI(null, null, filePath, null).getRawPath(); - return new URL("file", null, 0, encodedPath); + return URI.create("file:" + encodedPath).toURL(); } catch (MalformedURLException | URISyntaxException e) { throw new IllegalArgumentException("Unable to create URL for file " + filePath, e); } diff --git a/core/src/main/java/org/apache/calcite/util/Util.java b/core/src/main/java/org/apache/calcite/util/Util.java index 0674009f7fa..e08f8f5b754 100644 --- a/core/src/main/java/org/apache/calcite/util/Util.java +++ b/core/src/main/java/org/apache/calcite/util/Util.java @@ -69,6 +69,7 @@ import java.lang.reflect.Field; import java.math.BigDecimal; import java.net.MalformedURLException; +import java.net.URI; import java.net.URL; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; @@ -654,7 +655,7 @@ public static URL toURL(File file) throws MalformedURLException { } } path = "file://" + path; - return new URL(path); + return URI.create(path).toURL(); } /** diff --git a/gradle.properties b/gradle.properties index e43da370954..49eb254a70f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -50,7 +50,7 @@ com.github.johnrengelman.shadow.version=5.1.0 com.github.spotbugs.version=2.0.0 com.github.vlsi.vlsi-release-plugins.version=1.90 com.google.protobuf.version=0.8.10 -de.thetaphi.forbiddenapis.version=3.5.1 +de.thetaphi.forbiddenapis.version=3.7 jacoco.version=0.8.12 kotlin.version=1.9.22 net.ltgt.errorprone.version=1.3.0 @@ -85,8 +85,8 @@ aggdesigner-algorithm.version=6.0 apiguardian-api.version=1.1.2 arrow-gandiva.version=15.0.0 arrow.version=15.0.0 -asm.version=7.2 -byte-buddy.version=1.9.3 +asm.version=9.6 +byte-buddy.version=1.14.15 cassandra-all.version=4.1.3 cassandra-java-driver-core.version=4.17.0 cassandra-unit.version=4.3.1.0 @@ -143,7 +143,7 @@ junit5.version=5.9.1 kafka-clients.version=2.1.1 kerby.version=1.1.1 log4j2.version=2.17.1 -mockito.version=2.23.4 +mockito.version=3.12.4 mongodb-driver-sync.version=4.10.2 # 1.43.0 is the last version with Java 8 support mongo-java-server.version=1.43.0 diff --git a/site/_docs/howto.md b/site/_docs/howto.md index 9304c153f6f..02f8e7c12f7 100644 --- a/site/_docs/howto.md +++ b/site/_docs/howto.md @@ -31,7 +31,7 @@ adapters. ## Building from a source distribution -Prerequisite is Java (JDK 8, 11, 17 or 19) +Prerequisite is Java (JDK 8, 11, 17, 21 or 22) and Gradle (version 8.7) on your path. Unpack the source distribution `.tar.gz` file, @@ -51,7 +51,7 @@ tests (but you should use the `gradle` command rather than ## Building from Git Prerequisites are git -and Java (JDK 8, 11, 17 or 19) on your path. +and Java (JDK 8, 11, 17, 21 or 22) on your path. Create a local copy of the GitHub repository, `cd` to its root directory, diff --git a/splunk/src/main/java/org/apache/calcite/adapter/splunk/SplunkDriver.java b/splunk/src/main/java/org/apache/calcite/adapter/splunk/SplunkDriver.java index 13b37abe163..7f9a5f07f8a 100644 --- a/splunk/src/main/java/org/apache/calcite/adapter/splunk/SplunkDriver.java +++ b/splunk/src/main/java/org/apache/calcite/adapter/splunk/SplunkDriver.java @@ -24,6 +24,7 @@ import org.apache.calcite.linq4j.Enumerator; import org.apache.calcite.schema.SchemaPlus; +import java.net.URI; import java.net.URL; import java.sql.Connection; import java.sql.SQLException; @@ -77,7 +78,7 @@ protected SplunkDriver() { throw new IllegalArgumentException( "Must specify 'password' property"); } - URL url2 = new URL(url1); + URL url2 = URI.create(url1).toURL(); splunkConnection = new SplunkConnectionImpl(url2, user, password); } } catch (Exception e) { diff --git a/splunk/src/main/java/org/apache/calcite/adapter/splunk/search/SplunkConnectionImpl.java b/splunk/src/main/java/org/apache/calcite/adapter/splunk/search/SplunkConnectionImpl.java index 9dcc92f5b2a..d6414ee7e03 100644 --- a/splunk/src/main/java/org/apache/calcite/adapter/splunk/search/SplunkConnectionImpl.java +++ b/splunk/src/main/java/org/apache/calcite/adapter/splunk/search/SplunkConnectionImpl.java @@ -35,6 +35,7 @@ import java.io.PrintWriter; import java.io.StringWriter; import java.net.MalformedURLException; +import java.net.URI; import java.net.URL; import java.nio.charset.StandardCharsets; import java.util.Arrays; @@ -68,7 +69,7 @@ public class SplunkConnectionImpl implements SplunkConnection { public SplunkConnectionImpl(String url, String username, String password) throws MalformedURLException { - this(new URL(url), username, password); + this(URI.create(url).toURL(), username, password); } public SplunkConnectionImpl(URL url, String username, String password) { diff --git a/src/main/config/forbidden-apis/signatures.txt b/src/main/config/forbidden-apis/signatures.txt index 98d477ed4cd..8ff151b6f90 100644 --- a/src/main/config/forbidden-apis/signatures.txt +++ b/src/main/config/forbidden-apis/signatures.txt @@ -109,3 +109,11 @@ org.hamcrest.Matcher#matches(java.lang.Object) java.util.Locale#(java.lang.String) java.util.Locale#(java.lang.String,java.lang.String) java.util.Locale#(java.lang.String,java.lang.String,java.lang.String) + +@defaultMessage Use "java.net.URI.toURL" +java.net.URL#(java.lang.String) +java.net.URL#(java.net.URL, java.lang.String) +java.net.URL#(java.net.URL, java.lang.String, java.net.URLStreamHandler) +java.net.URL#(java.lang.String, java.lang.String, int, java.lang.String) +java.net.URL#(java.lang.String, java.lang.String, java.lang.String) +java.net.URL#(java.lang.String, java.lang.String, int, java.lang.String, java.net.URLStreamHandler)