From 54fcb5403510fa359de188d63daabe884546be1e Mon Sep 17 00:00:00 2001 From: Weidong Xu Date: Fri, 16 Oct 2026 10:13:59 +0800 Subject: [PATCH 1/4] chore(http-client-java): add Java dependency version sync script Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 6dc9e98a-42fc-4fcf-b49c-b0823d177763 --- ...tp-client-java-sync-dependency-versions.md | 7 + packages/http-client-java/CONTRIBUTING.md | 12 ++ .../eng/versioning/Sync-Versions.Tests.ps1 | 132 ++++++++++++++++++ .../eng/versioning/Sync-Versions.ps1 | 110 +++++++++++++++ .../eng/versioning/external_dependencies.txt | 39 ++++++ 5 files changed, 300 insertions(+) create mode 100644 .chronus/changes/http-client-java-sync-dependency-versions.md create mode 100644 packages/http-client-java/eng/versioning/Sync-Versions.Tests.ps1 create mode 100644 packages/http-client-java/eng/versioning/Sync-Versions.ps1 create mode 100644 packages/http-client-java/eng/versioning/external_dependencies.txt diff --git a/.chronus/changes/http-client-java-sync-dependency-versions.md b/.chronus/changes/http-client-java-sync-dependency-versions.md new file mode 100644 index 00000000000..c471f7d4d18 --- /dev/null +++ b/.chronus/changes/http-client-java-sync-dependency-versions.md @@ -0,0 +1,7 @@ +--- +changeKind: internal +packages: + - "@typespec/http-client-java" +--- + +Add a PowerShell script to sync Java dependency versions with Azure SDK for Java. diff --git a/packages/http-client-java/CONTRIBUTING.md b/packages/http-client-java/CONTRIBUTING.md index a3f31973065..8a610503e49 100644 --- a/packages/http-client-java/CONTRIBUTING.md +++ b/packages/http-client-java/CONTRIBUTING.md @@ -79,6 +79,18 @@ When writing / updating Java tests, you can manually 1. Start the test server with `npm run spector-serve` (or `npm run spector-start` to start as a background process, `npm run spector-stop` to stop). 2. Run the Java tests in the module. +## Sync Java Dependency Versions + +From this package directory, run `pwsh eng\versioning\Sync-Versions.ps1` to sync +`Project.Dependency`, generator/module POMs, the customization POM, and the generated-POM +template with Azure SDK for Java's version files. Use `-WhatIf` to preview changes. + +`eng\versioning\external_dependencies.txt` lists the packages to sync; append `;version` +to pin a package. The script prefers the first (released) version in `version_client.txt`, +then falls back to `external_dependencies.txt`. Unlisted dependencies are unchanged. + +Run the script's offline tests with `pwsh eng\versioning\Sync-Versions.Tests.ps1`. + ## Format Code Before creating pull request, the code is required to be well-formatted. diff --git a/packages/http-client-java/eng/versioning/Sync-Versions.Tests.ps1 b/packages/http-client-java/eng/versioning/Sync-Versions.Tests.ps1 new file mode 100644 index 00000000000..74be415500f --- /dev/null +++ b/packages/http-client-java/eng/versioning/Sync-Versions.Tests.ps1 @@ -0,0 +1,132 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + +$ErrorActionPreference = 'Stop' +. (Join-Path $PSScriptRoot 'Sync-Versions.ps1') + +function Assert-Equal($Expected, $Actual) +{ + if ($Expected -cne $Actual) + { + throw "Expected '$Expected', got '$Actual'." + } +} + +$clientVersions = Read-Versions @' +# Released version precedes the development version. +com.azure:azure-core;1.2.3;1.3.0-beta.1 +io.clientcore:core;1.0.0-beta.11;1.0.0-beta.12 +'@ +$externalVersions = Read-Versions @' +com.azure:azure-core;0.9.0 +testdep_net.bytebuddy:byte-buddy;1.17.7 +org.mockito:mockito-core;5.0.0 +'@ +$packages = Read-Versions @' +com.azure:azure-core +io.clientcore:core +net.bytebuddy:byte-buddy +org.mockito:mockito-core;4.11.0 +'@ +$versions = Resolve-Versions $packages @($clientVersions, $externalVersions) +Assert-Equal '1.2.3' $versions['com.azure:azure-core'] +Assert-Equal '1.0.0-beta.11' $versions['io.clientcore:core'] +Assert-Equal '1.17.7' $versions['net.bytebuddy:byte-buddy'] +Assert-Equal '4.11.0' $versions['org.mockito:mockito-core'] + +$failed = $false +try +{ + Resolve-Versions (Read-Versions 'missing:dependency') @($clientVersions, $externalVersions) +} +catch +{ + if ($_.Exception.Message -notlike '*missing:dependency*') { throw } + $failed = $true +} +Assert-Equal $true $failed + +$root = Join-Path ([System.IO.Path]::GetTempPath()) "java-version-sync-$([guid]::NewGuid())" +try +{ + $generator = Join-Path $root 'generator' + $module = Join-Path $generator 'http-client-generator-core' + $resources = Join-Path $module 'src\main\resources' + $javaDirectory = Join-Path $module 'src\main\java\com\microsoft\typespec\http\client\generator\core\model\projectmodel' + $target = Join-Path $module 'target' + $customization = Join-Path $generator 'http-client-generator-test\customization' + foreach ($directory in @($resources, $javaDirectory, $target, $customization)) + { + $null = New-Item -ItemType Directory -Path $directory -Force + } + $pom = @' + + + + com.microsoft.typespec + typespec-java-generator + 1.0.0-beta.1 + + + + com.azure + + azure-core + old + + io.clientcorecore + + + + unlistedlibraryold + + + org.mockitomockito-coreold + + + +'@ + $pom = $pom.Replace("`r`n", "`n").Replace("`n", "`r`n") + $pomFiles = @( + (Join-Path $generator 'pom.xml'), + (Join-Path $module 'pom.xml'), + (Join-Path $resources 'pom.xml'), + (Join-Path $customization 'pom.xml') + ) + foreach ($file in $pomFiles + (Join-Path $target 'pom.xml')) + { + [System.IO.File]::WriteAllText($file, $pom) + } + $javaFile = Join-Path $javaDirectory 'Project.java' + $java = " AZURE_CORE(`"com.azure`", `"azure-core`", `"old`"),`n" + + " CLIENTCORE(`"io.clientcore`", `"core`", `"old`");`n" + [System.IO.File]::WriteAllText($javaFile, $java) + + Update-VersionFiles -Root $root -Versions $versions -WhatIf + Assert-Equal $pom ([System.IO.File]::ReadAllText($pomFiles[0])) + Assert-Equal $java ([System.IO.File]::ReadAllText($javaFile)) + + Update-VersionFiles -Root $root -Versions $versions + $expected = $pom.Replace(" old", " 1.2.3") + $expected = $expected.Replace('mockito-coreold', + 'mockito-core4.11.0') + foreach ($file in $pomFiles) + { + Assert-Equal $expected ([System.IO.File]::ReadAllText($file)) + } + Assert-Equal $pom ([System.IO.File]::ReadAllText((Join-Path $target 'pom.xml'))) + Assert-Equal ($java.Replace('"old"),', '"1.2.3"),').Replace('"old");', '"1.0.0-beta.11");')) ` + ([System.IO.File]::ReadAllText($javaFile)) + + $modified = (Get-Item $javaFile).LastWriteTimeUtc + Update-VersionFiles -Root $root -Versions $versions + Assert-Equal $modified (Get-Item $javaFile).LastWriteTimeUtc + Write-Host 'Version sync tests passed.' +} +finally +{ + if (Test-Path -LiteralPath $root) + { + Remove-Item -LiteralPath $root -Recurse -Force + } +} diff --git a/packages/http-client-java/eng/versioning/Sync-Versions.ps1 b/packages/http-client-java/eng/versioning/Sync-Versions.ps1 new file mode 100644 index 00000000000..91b85c305a7 --- /dev/null +++ b/packages/http-client-java/eng/versioning/Sync-Versions.ps1 @@ -0,0 +1,110 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + +[CmdletBinding(SupportsShouldProcess)] +param() + +$ErrorActionPreference = 'Stop' + +function Read-Versions([string] $Content) +{ + $versions = @{} + foreach ($line in $Content -split '\r?\n') + { + $line = $line.Trim() + if (!$line -or $line.StartsWith('#')) { continue } + $fields = $line -split ';' + $package = $fields[0] -replace '^testdep_', '' + if ($package -notmatch '^[\w.-]+:[\w.-]+$') + { + throw "Invalid package coordinate: $line" + } + $versions[$package] = if ($fields.Length -gt 1) { $fields[1].Trim() } else { '' } + } + return $versions +} + +function Resolve-Versions([hashtable] $Packages, [hashtable[]] $Sources) +{ + $versions = @{} + foreach ($package in $Packages.Keys) + { + $version = $Packages[$package] + if (!$version) + { + foreach ($source in $Sources) + { + if ($source[$package]) + { + $version = $source[$package] + break + } + } + } + if (!$version) { throw "Version not found for package $package" } + $versions[$package] = $version + } + return $versions +} + +function Update-VersionFiles +{ + [CmdletBinding(SupportsShouldProcess)] + param([string] $Root, [hashtable] $Versions) + + $generator = Join-Path $Root 'generator' + $core = Join-Path $generator 'http-client-generator-core' + $pomFiles = @((Get-Item (Join-Path $generator 'pom.xml')).FullName) + $pomFiles += Get-ChildItem -Path $generator -Directory | ForEach-Object { + $pom = Join-Path $_.FullName 'pom.xml' + if (Test-Path -LiteralPath $pom) { $pom } + } + $pomFiles += Join-Path $core 'src\main\resources\pom.xml' + $pomFiles += Join-Path $generator 'http-client-generator-test\customization\pom.xml' + $javaFile = Join-Path $core 'src\main\java\com\microsoft\typespec\http\client\generator\core\model\projectmodel\Project.java' + $updates = @{} + foreach ($file in $pomFiles + $javaFile) + { + $content = [System.IO.File]::ReadAllText($file) + if ($file -eq $javaFile) + { + $pattern = '(?m)(?^\s*[A-Z][A-Z_]*\("(?[^"]+)",\s*"(?[^"]+)",\s*")(?[^"]+)(?"\)[,;])' + } + else + { + # Match comments separately so commented-out dependencies are never changed. + $gap = '(?:\s|)*' + $pattern = "|(?(?[^<]+)$gap(?[^<]+)$gap)(?[^<]+)(?)" + $null = [xml] $content + } + $updated = [regex]::Replace($content, $pattern, [System.Text.RegularExpressions.MatchEvaluator] { + param($match) + if (!$match.Groups['prefix'].Success) { return $match.Value } + $package = "$($match.Groups['group'].Value.Trim()):$($match.Groups['artifact'].Value.Trim())" + if (!$Versions.ContainsKey($package)) { return $match.Value } + return $match.Groups['prefix'].Value + $Versions[$package] + $match.Groups['suffix'].Value + }, [System.Text.RegularExpressions.RegexOptions]::Singleline) + if ($updated -cne $content) { $updates[$file] = $updated } + } + + # Read and validate all inputs before writing any changes. + foreach ($file in $updates.Keys | Sort-Object) + { + if ($PSCmdlet.ShouldProcess($file, 'Sync dependency versions')) + { + [System.IO.File]::WriteAllText($file, $updates[$file]) + Write-Host "Updated $file" + } + } +} + +if ($MyInvocation.InvocationName -ne '.') +{ + $root = [System.IO.Path]::GetFullPath((Join-Path $PSScriptRoot '..\..')) + $baseUri = 'https://raw.githubusercontent.com/Azure/azure-sdk-for-java/main/eng/versioning' + $clientVersions = Read-Versions (Invoke-WebRequest "$baseUri/version_client.txt").Content + $externalVersions = Read-Versions (Invoke-WebRequest "$baseUri/external_dependencies.txt").Content + $packages = Read-Versions ([System.IO.File]::ReadAllText((Join-Path $PSScriptRoot 'external_dependencies.txt'))) + $versions = Resolve-Versions $packages @($clientVersions, $externalVersions) + Update-VersionFiles -Root $root -Versions $versions -WhatIf:$WhatIfPreference +} diff --git a/packages/http-client-java/eng/versioning/external_dependencies.txt b/packages/http-client-java/eng/versioning/external_dependencies.txt new file mode 100644 index 00000000000..cc746374dab --- /dev/null +++ b/packages/http-client-java/eng/versioning/external_dependencies.txt @@ -0,0 +1,39 @@ +# Packages to sync from azure-sdk-for-java. Add ;version to pin a package. +com.azure:azure-client-sdk-parent +com.azure.v2:azure-client-sdk-parent +com.azure.v2:azure-core +com.azure:azure-core +com.azure:azure-core-experimental +com.azure:azure-core-http-netty +com.azure:azure-core-management +com.azure:azure-core-test +com.azure:azure-identity +com.azure:azure-json +com.azure:azure-xml + +io.clientcore:core +io.clientcore:annotation-processor + +com.fasterxml.jackson.core:jackson-databind +com.fasterxml.jackson.dataformat:jackson-dataformat-xml +com.fasterxml.jackson.datatype:jackson-datatype-jsr310 +org.slf4j:slf4j-api +org.slf4j:slf4j-simple +org.junit.jupiter:junit-jupiter-api +org.junit.jupiter:junit-jupiter-engine +org.junit.jupiter:junit-jupiter-params +io.projectreactor:reactor-test + +# Mockito 4.11.0 is the last version supporting Java 8. +org.mockito:mockito-core;4.11.0 +net.bytebuddy:byte-buddy +net.bytebuddy:byte-buddy-agent + +org.apache.maven.plugins:maven-clean-plugin +org.apache.maven.plugins:maven-compiler-plugin +org.apache.maven.plugins:maven-install-plugin +org.apache.maven.plugins:maven-jar-plugin +org.apache.maven.plugins:maven-javadoc-plugin +org.apache.maven.plugins:maven-resources-plugin +org.apache.maven.plugins:maven-shade-plugin +org.apache.maven.plugins:maven-surefire-plugin From b10a67db3a918c43c04f1ebfa65813d7178f5b2f Mon Sep 17 00:00:00 2001 From: Weidong Xu Date: Fri, 16 Oct 2026 10:24:37 +0800 Subject: [PATCH 2/4] chore(http-client-java): sync Java dependency versions Handle numeric enum names and update the test token cache import for Azure Core 1.60.0. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 6dc9e98a-42fc-4fcf-b49c-b0823d177763 --- ...ync-dependency-versions-2026-9-16-10-20-30.md | 7 +++++++ .../eng/versioning/Sync-Versions.Tests.ps1 | 5 ++++- .../eng/versioning/Sync-Versions.ps1 | 2 +- .../pom.xml | 8 ++++---- .../generator/http-client-generator-core/pom.xml | 2 +- .../core/model/projectmodel/Project.java | 14 +++++++------- .../src/main/resources/pom.xml | 8 ++++---- .../generator/http-client-generator-mgmt/pom.xml | 6 +++--- .../generator/http-client-generator-test/pom.xml | 16 ++++++++-------- .../util/BearerTokenAuthenticationPolicy.java | 2 +- .../generator/http-client-generator/pom.xml | 6 +++--- packages/http-client-java/generator/pom.xml | 8 ++++---- 12 files changed, 47 insertions(+), 37 deletions(-) create mode 100644 .chronus/changes/chore-java-sync-dependency-versions-2026-9-16-10-20-30.md diff --git a/.chronus/changes/chore-java-sync-dependency-versions-2026-9-16-10-20-30.md b/.chronus/changes/chore-java-sync-dependency-versions-2026-9-16-10-20-30.md new file mode 100644 index 00000000000..e0b0bf4752a --- /dev/null +++ b/.chronus/changes/chore-java-sync-dependency-versions-2026-9-16-10-20-30.md @@ -0,0 +1,7 @@ +--- +changeKind: dependencies +packages: + - "@typespec/http-client-java" +--- + +Sync Java runtime, test, and Maven plugin dependency versions with Azure SDK for Java. \ No newline at end of file diff --git a/packages/http-client-java/eng/versioning/Sync-Versions.Tests.ps1 b/packages/http-client-java/eng/versioning/Sync-Versions.Tests.ps1 index 74be415500f..079dbb9b1d4 100644 --- a/packages/http-client-java/eng/versioning/Sync-Versions.Tests.ps1 +++ b/packages/http-client-java/eng/versioning/Sync-Versions.Tests.ps1 @@ -15,6 +15,7 @@ function Assert-Equal($Expected, $Actual) $clientVersions = Read-Versions @' # Released version precedes the development version. com.azure:azure-core;1.2.3;1.3.0-beta.1 +com.azure.v2:azure-client-sdk-parent;2.0.0-beta.2;2.0.0-beta.3 io.clientcore:core;1.0.0-beta.11;1.0.0-beta.12 '@ $externalVersions = Read-Versions @' @@ -24,6 +25,7 @@ org.mockito:mockito-core;5.0.0 '@ $packages = Read-Versions @' com.azure:azure-core +com.azure.v2:azure-client-sdk-parent io.clientcore:core net.bytebuddy:byte-buddy org.mockito:mockito-core;4.11.0 @@ -99,6 +101,7 @@ try } $javaFile = Join-Path $javaDirectory 'Project.java' $java = " AZURE_CORE(`"com.azure`", `"azure-core`", `"old`"),`n" + + " AZURE_CLIENT_SDK_PARENT_V2(`"com.azure.v2`", `"azure-client-sdk-parent`", `"old-v2`"),`n" + " CLIENTCORE(`"io.clientcore`", `"core`", `"old`");`n" [System.IO.File]::WriteAllText($javaFile, $java) @@ -115,7 +118,7 @@ try Assert-Equal $expected ([System.IO.File]::ReadAllText($file)) } Assert-Equal $pom ([System.IO.File]::ReadAllText((Join-Path $target 'pom.xml'))) - Assert-Equal ($java.Replace('"old"),', '"1.2.3"),').Replace('"old");', '"1.0.0-beta.11");')) ` + Assert-Equal ($java.Replace('"old"),', '"1.2.3"),').Replace('"old");', '"1.0.0-beta.11");').Replace('"old-v2"', '"2.0.0-beta.2"')) ` ([System.IO.File]::ReadAllText($javaFile)) $modified = (Get-Item $javaFile).LastWriteTimeUtc diff --git a/packages/http-client-java/eng/versioning/Sync-Versions.ps1 b/packages/http-client-java/eng/versioning/Sync-Versions.ps1 index 91b85c305a7..27f4d1b73db 100644 --- a/packages/http-client-java/eng/versioning/Sync-Versions.ps1 +++ b/packages/http-client-java/eng/versioning/Sync-Versions.ps1 @@ -68,7 +68,7 @@ function Update-VersionFiles $content = [System.IO.File]::ReadAllText($file) if ($file -eq $javaFile) { - $pattern = '(?m)(?^\s*[A-Z][A-Z_]*\("(?[^"]+)",\s*"(?[^"]+)",\s*")(?[^"]+)(?"\)[,;])' + $pattern = '(?m)(?^\s*[A-Z][A-Z_0-9]*\("(?[^"]+)",\s*"(?[^"]+)",\s*")(?[^"]+)(?"\)[,;])' } else { diff --git a/packages/http-client-java/generator/http-client-generator-clientcore-test/pom.xml b/packages/http-client-java/generator/http-client-generator-clientcore-test/pom.xml index cbe2e1abe62..f1941780c33 100644 --- a/packages/http-client-java/generator/http-client-generator-clientcore-test/pom.xml +++ b/packages/http-client-java/generator/http-client-generator-clientcore-test/pom.xml @@ -34,7 +34,7 @@ io.projectreactor reactor-test - 3.7.18 + 3.8.7 org.mockito @@ -47,13 +47,13 @@ net.bytebuddy byte-buddy - 1.17.7 + 1.18.11 test net.bytebuddy byte-buddy-agent - 1.17.7 + 1.18.11 test @@ -80,7 +80,7 @@ org.apache.maven.plugins maven-compiler-plugin - 3.14.0 + 3.15.0 run-annotation-processing diff --git a/packages/http-client-java/generator/http-client-generator-core/pom.xml b/packages/http-client-java/generator/http-client-generator-core/pom.xml index 967250d04ef..ebf9351f5a8 100644 --- a/packages/http-client-java/generator/http-client-generator-core/pom.xml +++ b/packages/http-client-java/generator/http-client-generator-core/pom.xml @@ -59,7 +59,7 @@ com.azure azure-core - 1.58.1 + 1.60.0 test diff --git a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/model/projectmodel/Project.java b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/model/projectmodel/Project.java index a48d03be21d..eb497a8a4ef 100644 --- a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/model/projectmodel/Project.java +++ b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/model/projectmodel/Project.java @@ -59,14 +59,14 @@ public class Project { public enum Dependency { // azure AZURE_CLIENT_SDK_PARENT("com.azure", "azure-client-sdk-parent", "1.7.0"), - AZURE_CLIENT_SDK_PARENT_V2("com.azure.v2", "azure-client-sdk-parent", "2.0.0-beta.1"), - AZURE_CORE("com.azure", "azure-core", "1.58.1"), + AZURE_CLIENT_SDK_PARENT_V2("com.azure.v2", "azure-client-sdk-parent", "2.0.0-beta.2"), + AZURE_CORE("com.azure", "azure-core", "1.60.0"), AZURE_CORE_V2("com.azure.v2", "azure-core", "2.0.0-beta.1"), - AZURE_CORE_MANAGEMENT("com.azure", "azure-core-management", "1.19.5"), - AZURE_CORE_HTTP_NETTY("com.azure", "azure-core-http-netty", "1.16.5"), - AZURE_CORE_TEST("com.azure", "azure-core-test", "1.27.0-beta.16"), - AZURE_IDENTITY("com.azure", "azure-identity", "1.18.4"), - AZURE_CORE_EXPERIMENTAL("com.azure", "azure-core-experimental", "1.0.0-beta.68"), + AZURE_CORE_MANAGEMENT("com.azure", "azure-core-management", "1.19.8"), + AZURE_CORE_HTTP_NETTY("com.azure", "azure-core-http-netty", "1.16.8"), + AZURE_CORE_TEST("com.azure", "azure-core-test", "1.27.0-beta.19"), + AZURE_IDENTITY("com.azure", "azure-identity", "1.18.7"), + AZURE_CORE_EXPERIMENTAL("com.azure", "azure-core-experimental", "1.0.0-beta.71"), CLIENTCORE("io.clientcore", "core", "1.0.0-beta.11"); diff --git a/packages/http-client-java/generator/http-client-generator-core/src/main/resources/pom.xml b/packages/http-client-java/generator/http-client-generator-core/src/main/resources/pom.xml index 37a349981aa..73543435537 100644 --- a/packages/http-client-java/generator/http-client-generator-core/src/main/resources/pom.xml +++ b/packages/http-client-java/generator/http-client-generator-core/src/main/resources/pom.xml @@ -40,19 +40,19 @@ com.azure azure-core - 1.58.1 + 1.60.0 com.azure azure-core-http-netty - 1.16.5 + 1.16.8 com.azure azure-core-test - 1.27.0-beta.16 + 1.27.0-beta.19 test @@ -63,7 +63,7 @@ org.apache.maven.plugins maven-compiler-plugin - 3.14.0 + 3.15.0 11 11 diff --git a/packages/http-client-java/generator/http-client-generator-mgmt/pom.xml b/packages/http-client-java/generator/http-client-generator-mgmt/pom.xml index 7dc631a0999..2767158d682 100644 --- a/packages/http-client-java/generator/http-client-generator-mgmt/pom.xml +++ b/packages/http-client-java/generator/http-client-generator-mgmt/pom.xml @@ -36,7 +36,7 @@ com.azure azure-core-management - 1.19.5 + 1.19.8 test @@ -68,13 +68,13 @@ net.bytebuddy byte-buddy - 1.17.7 + 1.18.11 test net.bytebuddy byte-buddy-agent - 1.17.7 + 1.18.11 test diff --git a/packages/http-client-java/generator/http-client-generator-test/pom.xml b/packages/http-client-java/generator/http-client-generator-test/pom.xml index a67b1f61bc1..96146c0c030 100644 --- a/packages/http-client-java/generator/http-client-generator-test/pom.xml +++ b/packages/http-client-java/generator/http-client-generator-test/pom.xml @@ -23,7 +23,7 @@ com.azure azure-core - 1.58.1 + 1.60.0 com.azure @@ -38,12 +38,12 @@ com.fasterxml.jackson.dataformat jackson-dataformat-xml - 2.18.7 + 2.18.11 com.azure azure-core-test - 1.27.0-beta.16 + 1.27.0-beta.19 test @@ -55,12 +55,12 @@ com.azure azure-identity - 1.18.4 + 1.18.7 com.azure azure-core-management - 1.19.5 + 1.19.8 org.junit.jupiter @@ -71,7 +71,7 @@ io.projectreactor reactor-test - 3.7.18 + 3.8.7 org.mockito @@ -84,13 +84,13 @@ net.bytebuddy byte-buddy - 1.17.7 + 1.18.11 test net.bytebuddy byte-buddy-agent - 1.17.7 + 1.18.11 test diff --git a/packages/http-client-java/generator/http-client-generator-test/src/test/java/authentication/util/BearerTokenAuthenticationPolicy.java b/packages/http-client-java/generator/http-client-generator-test/src/test/java/authentication/util/BearerTokenAuthenticationPolicy.java index ef1a6119b63..37def1ac159 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/test/java/authentication/util/BearerTokenAuthenticationPolicy.java +++ b/packages/http-client-java/generator/http-client-generator-test/src/test/java/authentication/util/BearerTokenAuthenticationPolicy.java @@ -4,6 +4,7 @@ package authentication.util; import com.azure.core.credential.AccessToken; +import com.azure.core.credential.AccessTokenCache; import com.azure.core.credential.TokenCredential; import com.azure.core.credential.TokenRequestContext; import com.azure.core.http.HttpHeaderName; @@ -13,7 +14,6 @@ import com.azure.core.http.HttpPipelineNextSyncPolicy; import com.azure.core.http.HttpResponse; import com.azure.core.http.policy.HttpPipelinePolicy; -import com.azure.core.implementation.AccessTokenCache; import com.azure.core.util.logging.ClientLogger; import java.util.Objects; import reactor.core.publisher.Mono; diff --git a/packages/http-client-java/generator/http-client-generator/pom.xml b/packages/http-client-java/generator/http-client-generator/pom.xml index 614d27bd771..2645c6089c8 100644 --- a/packages/http-client-java/generator/http-client-generator/pom.xml +++ b/packages/http-client-java/generator/http-client-generator/pom.xml @@ -52,13 +52,13 @@ com.fasterxml.jackson.core jackson-databind - 2.18.10 + 2.18.11 test com.fasterxml.jackson.datatype jackson-datatype-jsr310 - 2.18.4 + 2.18.11 test @@ -75,7 +75,7 @@ org.apache.maven.plugins maven-shade-plugin - 3.6.0 + 3.6.2 package diff --git a/packages/http-client-java/generator/pom.xml b/packages/http-client-java/generator/pom.xml index 83b81a56d05..e71bfbb0653 100644 --- a/packages/http-client-java/generator/pom.xml +++ b/packages/http-client-java/generator/pom.xml @@ -56,7 +56,7 @@ org.apache.maven.plugins maven-compiler-plugin - 3.14.0 + 3.15.0 ${maven.compiler.source} ${maven.compiler.target} @@ -66,7 +66,7 @@ org.apache.maven.plugins maven-surefire-plugin - 3.5.3 + 3.5.6 alphabetical false @@ -91,13 +91,13 @@ org.apache.maven.plugins maven-jar-plugin - 3.4.2 + 3.5.0 org.apache.maven.plugins maven-javadoc-plugin - 3.11.3 + 3.12.0 From 5bd42408b63bebdafb4941708f932fd51e259915 Mon Sep 17 00:00:00 2001 From: Weidong Xu Date: Fri, 16 Oct 2026 11:35:49 +0800 Subject: [PATCH 3/4] fix(http-client-java): cache XML pagination response bytes Reuse cached response bytes when reading XML page items and the next link. Add sync and async pagination regression coverage. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 6dc9e98a-42fc-4fcf-b49c-b0823d177763 --- ...-dependency-versions-2026-9-16-11-27-54.md | 7 ++++ .../generator/core/util/TemplateUtil.java | 4 +- .../implementation/XmlPaginationsImpl.java | 4 +- .../payload/pageable/XmlPaginationTests.java | 40 +++++++++++++++++++ 4 files changed, 51 insertions(+), 4 deletions(-) create mode 100644 .chronus/changes/chore-java-sync-dependency-versions-2026-9-16-11-27-54.md create mode 100644 packages/http-client-java/generator/http-client-generator-test/src/test/java/payload/pageable/XmlPaginationTests.java diff --git a/.chronus/changes/chore-java-sync-dependency-versions-2026-9-16-11-27-54.md b/.chronus/changes/chore-java-sync-dependency-versions-2026-9-16-11-27-54.md new file mode 100644 index 00000000000..2f78378784f --- /dev/null +++ b/.chronus/changes/chore-java-sync-dependency-versions-2026-9-16-11-27-54.md @@ -0,0 +1,7 @@ +--- +changeKind: fix +packages: + - "@typespec/http-client-java" +--- + +Fix XML pagination with stream-backed responses by caching response bytes before reading items and the next link. \ No newline at end of file diff --git a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/util/TemplateUtil.java b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/util/TemplateUtil.java index 93d77a9479f..268f02e5fff 100644 --- a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/util/TemplateUtil.java +++ b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/util/TemplateUtil.java @@ -283,7 +283,7 @@ private static void writeXmlPagingHelperMethods(JavaClass classBlock) { + "java.util.function.Function valueReader, String... path)", block -> { block.line( - "try (com.azure.xml.XmlReader reader = com.azure.xml.XmlReader.fromStream(binaryData.toStream())) {"); + "try (com.azure.xml.XmlReader reader = com.azure.xml.XmlReader.fromBytes(binaryData.toBytes())) {"); block.indent(() -> { block.line("reader.nextElement();"); block.line("return getXmlValues(reader, valueReader, path, 0);"); @@ -313,7 +313,7 @@ private static void writeXmlPagingHelperMethods(JavaClass classBlock) { }); classBlock.privateMethod("String getXmlNextLink(BinaryData binaryData, String... path)", block -> { block.line( - "try (com.azure.xml.XmlReader reader = com.azure.xml.XmlReader.fromStream(binaryData.toStream())) {"); + "try (com.azure.xml.XmlReader reader = com.azure.xml.XmlReader.fromBytes(binaryData.toBytes())) {"); block.indent(() -> { block.line("reader.nextElement();"); block.line("return getXmlNextLink(reader, path, 0);"); diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/payload/pageable/implementation/XmlPaginationsImpl.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/payload/pageable/implementation/XmlPaginationsImpl.java index 8986bca9518..007f1596a42 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/main/java/payload/pageable/implementation/XmlPaginationsImpl.java +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/payload/pageable/implementation/XmlPaginationsImpl.java @@ -510,7 +510,7 @@ private String getNextLink(BinaryData binaryData, String... path) { private List getXmlValues(BinaryData binaryData, java.util.function.Function valueReader, String... path) { - try (com.azure.xml.XmlReader reader = com.azure.xml.XmlReader.fromStream(binaryData.toStream())) { + try (com.azure.xml.XmlReader reader = com.azure.xml.XmlReader.fromBytes(binaryData.toBytes())) { reader.nextElement(); return getXmlValues(reader, valueReader, path, 0); } catch (javax.xml.stream.XMLStreamException e) { @@ -535,7 +535,7 @@ private List getXmlValues(com.azure.xml.XmlReader reader, } private String getXmlNextLink(BinaryData binaryData, String... path) { - try (com.azure.xml.XmlReader reader = com.azure.xml.XmlReader.fromStream(binaryData.toStream())) { + try (com.azure.xml.XmlReader reader = com.azure.xml.XmlReader.fromBytes(binaryData.toBytes())) { reader.nextElement(); return getXmlNextLink(reader, path, 0); } catch (javax.xml.stream.XMLStreamException e) { diff --git a/packages/http-client-java/generator/http-client-generator-test/src/test/java/payload/pageable/XmlPaginationTests.java b/packages/http-client-java/generator/http-client-generator-test/src/test/java/payload/pageable/XmlPaginationTests.java new file mode 100644 index 00000000000..8aecff52be8 --- /dev/null +++ b/packages/http-client-java/generator/http-client-generator-test/src/test/java/payload/pageable/XmlPaginationTests.java @@ -0,0 +1,40 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package payload.pageable; + +import com.azure.core.http.HttpHeaderName; +import com.azure.core.http.HttpHeaders; +import com.azure.core.test.http.MockHttpResponse; +import java.nio.charset.StandardCharsets; +import java.util.List; +import java.util.stream.Collectors; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; +import payload.pageable.models.XmlPet; +import reactor.core.publisher.Mono; + +public class XmlPaginationTests { + @ParameterizedTest + @ValueSource(booleans = { false, true }) + public void testStreamedResponseWithNextLink(boolean async) { + PageableClientBuilder builder + = new PageableClientBuilder().endpoint("http://localhost:3000").httpClient(request -> { + boolean nextPage = "/next-page".equals(request.getUrl().getPath()); + String body = "" + (nextPage ? "2" : "1") + "pet" + + (nextPage ? "" : "http://localhost:3000/next-page") + ""; + return Mono.just(new MockHttpResponse(request, 200, + new HttpHeaders().set(HttpHeaderName.CONTENT_TYPE, "application/xml"), + body.getBytes(StandardCharsets.UTF_8))); + }); + List ids = async + ? builder.buildXmlPaginationAsyncClient().listWithNextLink().map(XmlPet::getId).collectList().block() + : builder.buildXmlPaginationClient() + .listWithNextLink() + .stream() + .map(XmlPet::getId) + .collect(Collectors.toList()); + Assertions.assertEquals(List.of("1", "2"), ids); + } +} From 517ea0e87949374231365e78ac849b326b2e8345 Mon Sep 17 00:00:00 2001 From: Weidong Xu Date: Fri, 16 Oct 2026 11:50:08 +0800 Subject: [PATCH 4/4] docs(http-client-java): sync JAR versions during dependency updates Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 6dc9e98a-42fc-4fcf-b49c-b0823d177763 --- .github/instructions/http-client-java.instructions.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/instructions/http-client-java.instructions.md b/.github/instructions/http-client-java.instructions.md index 1e4c64acd43..e5d7d9a7caa 100644 --- a/.github/instructions/http-client-java.instructions.md +++ b/.github/instructions/http-client-java.instructions.md @@ -16,9 +16,10 @@ Steps: 3. Update package versions in `overrides` (keep the semver ranges) in the other two `package.json` files to match the corresponding package versions in the root `package.json`. 4. Save the files and run `npm install` in the root so that `package-lock.json` is updated. 5. Commit the changes to `package.json` and `package-lock.json`. -6. If there is an update to the `http-specs` or `azure-http-specs` libraries, run `Generate.ps1` in `generator/http-client-generator-test` and commit the generated changes in that folder. -7. If there is an update to the `http-specs` library, run `Generate.ps1` in `generator/http-client-generator-clientcore-test` and commit the generated changes in that folder. -8. Call `pnpm change add @typespec/http-client-java --kind=dependencies --message=""`. Commit the new md file in ".chronus" folder of repository root. +6. Run `pwsh eng\versioning\Sync-Versions.ps1` from the package root to also update Java/JAR dependency versions. Commit the Java and POM changes. +7. If there is an update to the `http-specs` or `azure-http-specs` libraries, run `Generate.ps1` in `generator/http-client-generator-test` and commit the generated changes in that folder. +8. If there is an update to the `http-specs` library, run `Generate.ps1` in `generator/http-client-generator-clientcore-test` and commit the generated changes in that folder. +9. Call `pnpm change add @typespec/http-client-java --kind=dependencies --message=""`. Commit the new md file in ".chronus" folder of repository root. # Prepare for minor/patch release