Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
65 commits
Select commit Hold shift + click to select a range
7a7e7a2
First pure JAVA zswag impl (wip)
fklebert Nov 25, 2025
fb3ab06
Fixes after code review
fklebert Nov 25, 2025
3f3d7e8
More fixes
fklebert Nov 25, 2025
bff53a0
test: Add unit tests for jzswag-desktop client.
fklebert May 5, 2026
706fbad
build: Add placeholder build.gradle for jzswag-android and jzswag-aaos.
fklebert May 5, 2026
5b37f81
doc: Update NEXT_STEPS.md with session-handoff notes.
fklebert May 5, 2026
864a959
jzswag: Port the core dispatch surface to actual parity with C++/Python
ke-fritz May 5, 2026
5b73718
jzswag: Wire OAuth2 + auth completeness, add unit tests
ke-fritz May 5, 2026
35c6cb9
docs: Restructure into per-language pages; document Java port
ke-fritz May 5, 2026
41229b5
jzswag: Bring Java port to parity with C++/Python
fklebert May 5, 2026
e99d97c
jzswag: Fix correctness bugs, add regression tests
fklebert May 5, 2026
c81b2c7
jzswag: Add CI and coverage
fklebert May 5, 2026
e9df48f
test: add unit-test suite for jzswag-api (0% → 99.7% line coverage)
ke-fritz May 5, 2026
ec4603d
test: expand jzswag-desktop coverage (29% → 62% line coverage)
ke-fritz May 5, 2026
e1ee80e
refactor: rename jzswag-desktop module to jzswag-jvm
ke-fritz May 5, 2026
f3d36a1
refactor: align Java package namespace with zserio (io.github.ndsev)
ke-fritz May 5, 2026
44c9126
refactor: rename desktop sub-package and Desktop* classes to jvm/Jvm*
ke-fritz May 5, 2026
2683b6f
docs: update references to jzswag-jvm and io.github.ndsev namespace
ke-fritz May 5, 2026
1f5e438
Merge commit '531f349bcae8d282a8d9ab998cf55803e81d4a2e' into jzswag
fklebert May 7, 2026
10a6523
refactor: extract jzswag-shared module from jzswag-jvm
ke-fritz May 6, 2026
a452c3b
feat: scaffold jzswag-android module (java-library + Robolectric stubs)
ke-fritz May 6, 2026
88c9c17
feat: implement AndroidHttpClient on top of OkHttp 4
ke-fritz May 6, 2026
16ade6a
feat: implement AndroidKeychain (platform Keystore + AES-GCM + Shared…
ke-fritz May 6, 2026
2029f50
feat: add AndroidLogging + AndroidZswagClient entry point
ke-fritz May 6, 2026
3890f24
test: add unit-test suite for jzswag-android (≥60% line coverage)
ke-fritz May 6, 2026
49bd616
docs+ci: update for the four-module layout (api/shared/jvm/android)
ke-fritz May 6, 2026
4c81937
chore: nest Java modules under libs/jzswag/ to declutter libs/
ke-fritz May 7, 2026
43db1f1
docs: correct two stale javadoc cross-refs in jzswag-api
ke-fritz May 7, 2026
7793b53
ci: fix jzswag build
fklebert May 7, 2026
b43b20f
Merge commit '43db1f112efa555735ec56360b18219a7ebd9837' into jzswag
fklebert May 7, 2026
5aea15a
fix: drop unused JvmOpenAPIClient import
fklebert May 7, 2026
dad3fb9
build: pin Java toolchain to Temurin 17 via Foojay resolver
fklebert May 7, 2026
32c1873
docs: move HTTP Settings File back into README, restore pymdown markers
fklebert May 7, 2026
c5e55c2
Merge remote-tracking branch 'origin/main' into jzswag
fklebert May 7, 2026
fb93b1b
chore: remove stub examples and consolidate docs
fklebert May 7, 2026
22dbddc
chore: gitignore .kotlin/ build cache directory
fklebert May 7, 2026
cdb9262
fix: assorted correctness issues found in PR review
fklebert May 7, 2026
df10ff6
fix: wire OAuth2 useForSpecFetch for protected spec endpoints
fklebert May 7, 2026
d99ab52
refactor: hoist KeychainException to jzswag-api
fklebert May 7, 2026
374c60c
chore: delete dead ZswagServiceClient + IZswagServiceClient
fklebert May 7, 2026
20f60fd
docs: align HTTP_SSL_STRICT description with actual semantics
fklebert May 7, 2026
8fec2e9
test: cover OpenAPIClient.applySecurity and OAuth2 cache/refresh
fklebert May 7, 2026
b06f699
fix: align Java HTTP_SSL_STRICT semantics with C++/Python
fklebert May 15, 2026
f460832
docs: extract CI/CD and release process into docs/release-process.md
fklebert May 15, 2026
a899c0d
docs: replace static architecture diagram with inline Mermaid
fklebert May 15, 2026
f730fad
docs: restyle architecture diagram with color-coded language groups
fklebert May 15, 2026
3a5b4e7
docs: switch architecture diagram to elk layout with step edges
fklebert May 15, 2026
0d93512
docs: simplify architecture diagram layout
fklebert May 15, 2026
b4e8b1d
docs: restore missing pieces from the original architecture diagram
fklebert May 15, 2026
2b905b0
refactor: rename Java ZswagClient to OAClient for parity with C++/Python
fklebert May 18, 2026
daef4c1
refactor: rename OpenAPIClient to OpenApiClient (and interface) for C…
fklebert May 18, 2026
79f95b6
docs: drop stale gh-pages coverage link, add codecov badge to cpp.md
fklebert May 18, 2026
b96ad5c
ci: restore GitHub Pages coverage publishing for C++ and Java
fklebert May 18, 2026
a49326f
feat(#113): Java multi-server selection via serverIndex parameter
fklebert May 18, 2026
ee2d2cb
fix: encode path parameter values per RFC 3986, not form-urlencoded
fklebert May 18, 2026
2f44736
fix: assorted parity gaps surfaced by the audit
fklebert May 18, 2026
0b288a6
feat: gzip auto-decompression in JvmHttpClient
fklebert May 18, 2026
80fc7fa
feat: wire HTTP_LOG_FILE and HTTP_LOG_FILE_MAXSIZE on the JVM
fklebert May 18, 2026
3aa7d8c
perf: cache proxied HttpClient/OkHttpClient instances per proxy tuple
fklebert May 18, 2026
cd88d13
feat: hot-reload HTTP_SETTINGS_FILE on mtime change
fklebert May 18, 2026
c4024a3
feat: HttpSettingsLoader.writeToFile for write-back support
fklebert May 18, 2026
659db62
feat: ParameterEncoder Map-shaped values + Windows keychain docs
fklebert May 18, 2026
2cd9bcc
fix: address final round of audit findings
fklebert May 21, 2026
453290d
Merge remote-tracking branch 'origin/main' into jzswag
josephbirkner Jun 16, 2026
364baa6
Merge remote-tracking branch 'origin/main' into jzswag
josephbirkner Jun 17, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 38 additions & 1 deletion .github/workflows/coverage.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ name: Code Coverage

on:
push:
branches: [master]
branches: [main, master]
pull_request:
workflow_dispatch:

Expand Down Expand Up @@ -91,3 +91,40 @@ jobs:
with:
recreate: true
path: code-coverage-results.md

# ----------------------------------------------------------------------
# Publish HTML report to GitHub Pages (main pushes only).
# Java coverage is deployed alongside by jzswag.yml under /java/; this
# workflow writes /cpp/ + the root landing index.html. Both jobs use
# peaceiris/actions-gh-pages with keep_files=true so they coexist.
# ----------------------------------------------------------------------
- name: Stage C++ report for GitHub Pages
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
run: |
mkdir -p site/cpp
cp -r coverage/* site/cpp/
# gcovr writes its entry point as coverage.html; an index.html
# redirect lets https://ndsev.github.io/zswag/cpp/ land on the report.
cat > site/cpp/index.html <<'EOF'
<!DOCTYPE html><meta http-equiv="refresh" content="0;url=coverage.html">
EOF
# Root landing page linking to both language reports.
cat > site/index.html <<'EOF'
<!DOCTYPE html>
<title>zswag coverage</title>
<style>body{font-family:system-ui,sans-serif;max-width:40rem;margin:3rem auto;padding:0 1rem;line-height:1.5}</style>
<h1>zswag coverage reports</h1>
<ul>
<li><a href="cpp/">C++</a> — httpcl + zswagcl (gcovr)</li>
<li><a href="java/">Java</a> — jzswag-api / shared / jvm / android (JaCoCo)</li>
</ul>
<p>Aggregated coverage is also tracked on <a href="https://codecov.io/gh/ndsev/zswag">Codecov</a>.</p>
EOF

- name: Deploy to GitHub Pages
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
uses: peaceiris/actions-gh-pages@v4
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
publish_dir: site
keep_files: true
152 changes: 152 additions & 0 deletions .github/workflows/jzswag.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,152 @@
name: jzswag (Java)

on:
push:
branches: [main, master]
pull_request:
workflow_dispatch:

jobs:
test:
name: test (${{ matrix.os }})
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-latest]

steps:
- name: Checkout code
uses: actions/checkout@v4
with:
submodules: recursive

- name: Set up JDK 17
# Gradle 9.x requires JVM 17+ to run the daemon; the build still targets Java 11
# via sourceCompatibility/targetCompatibility in the per-module build.gradle files.
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: '17'

- name: Cache Gradle
uses: actions/cache@v4
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle', '**/gradle-wrapper.properties') }}
restore-keys: ${{ runner.os }}-gradle-

- name: Build & test
run: ./gradlew :libs:jzswag:jzswag-api:test :libs:jzswag:jzswag-shared:test :libs:jzswag:jzswag-jvm:test :libs:jzswag:jzswag-android:test :libs:jzswag:jzswag-test:assemble --console=plain --stacktrace

- name: Upload JUnit reports
if: always()
uses: actions/upload-artifact@v4
with:
name: junit-${{ matrix.os }}
path: libs/jzswag/jzswag-*/build/test-results/test/*.xml
retention-days: 14

- name: Upload JaCoCo HTML reports
if: matrix.os == 'ubuntu-latest'
uses: actions/upload-artifact@v4
with:
name: jacoco-html
path: libs/jzswag/jzswag-*/build/reports/jacoco/test/html/
retention-days: 14

coverage:
# Single-OS coverage upload. Matches the C++ coverage.yml pattern (Codecov flag
# per language, separate name) so Java coverage is tracked independently of C++.
name: coverage
runs-on: ubuntu-latest
needs: test
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
submodules: recursive

- name: Set up JDK 17
# Gradle 9.x requires JVM 17+ to run the daemon; the build still targets Java 11
# via sourceCompatibility/targetCompatibility in the per-module build.gradle files.
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: '17'

- name: Cache Gradle
uses: actions/cache@v4
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle', '**/gradle-wrapper.properties') }}
restore-keys: ${{ runner.os }}-gradle-

- name: Run tests with coverage
run: |
./gradlew \
:libs:jzswag:jzswag-api:test :libs:jzswag:jzswag-api:jacocoTestReport \
:libs:jzswag:jzswag-shared:test :libs:jzswag:jzswag-shared:jacocoTestReport \
:libs:jzswag:jzswag-jvm:test :libs:jzswag:jzswag-jvm:jacocoTestReport \
:libs:jzswag:jzswag-android:test :libs:jzswag:jzswag-android:jacocoTestReport \
--console=plain

- name: Upload coverage to Codecov
uses: codecov/codecov-action@v4
with:
files: libs/jzswag/jzswag-api/build/reports/jacoco/test/jacocoTestReport.xml,libs/jzswag/jzswag-shared/build/reports/jacoco/test/jacocoTestReport.xml,libs/jzswag/jzswag-jvm/build/reports/jacoco/test/jacocoTestReport.xml,libs/jzswag/jzswag-android/build/reports/jacoco/test/jacocoTestReport.xml
flags: unittests-java
name: codecov-java
fail_ci_if_error: false
env:
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}

- name: Coverage PR comment (informational)
if: github.event_name == 'pull_request'
uses: madrapps/jacoco-report@v1.7.1
with:
paths: libs/jzswag/jzswag-api/build/reports/jacoco/test/jacocoTestReport.xml,libs/jzswag/jzswag-shared/build/reports/jacoco/test/jacocoTestReport.xml,libs/jzswag/jzswag-jvm/build/reports/jacoco/test/jacocoTestReport.xml,libs/jzswag/jzswag-android/build/reports/jacoco/test/jacocoTestReport.xml
token: ${{ secrets.GITHUB_TOKEN }}
title: Java Coverage (api / shared / jvm / android)
# Threshold per the parity goal — every module ships with ≥60% line coverage
# on its own tests. Ratchet up as more tests land.
min-coverage-overall: 60
min-coverage-changed-files: 50
update-comment: true

# ----------------------------------------------------------------------
# Publish JaCoCo HTML reports to GitHub Pages (main pushes only).
# Coexists with /cpp/ + root index.html written by coverage.yml; both
# workflows use keep_files=true to avoid clobbering each other.
# ----------------------------------------------------------------------
- name: Stage Java reports for GitHub Pages
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
run: |
mkdir -p site/java
for m in api shared jvm android; do
cp -r libs/jzswag/jzswag-$m/build/reports/jacoco/test/html site/java/$m
done
cat > site/java/index.html <<'EOF'
<!DOCTYPE html>
<title>jzswag JaCoCo coverage</title>
<style>body{font-family:system-ui,sans-serif;max-width:40rem;margin:3rem auto;padding:0 1rem;line-height:1.5}</style>
<h1>jzswag JaCoCo coverage</h1>
<ul>
<li><a href="api/">jzswag-api</a></li>
<li><a href="shared/">jzswag-shared</a></li>
<li><a href="jvm/">jzswag-jvm</a></li>
<li><a href="android/">jzswag-android</a></li>
</ul>
EOF

- name: Deploy to GitHub Pages
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
uses: peaceiris/actions-gh-pages@v4
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
publish_dir: site
keep_files: true
51 changes: 50 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -142,4 +142,53 @@ dist/
_deps/

CLAUDE.md
links
links

# Java / Gradle
.gradle/
.gradletasknamecache
gradle-app.setting
.kotlin/
*.class
*.jar
*.war
*.ear
hs_err_pid*
# Negation must come after *.jar — gitignore evaluates rules top-to-bottom and a
# later pattern overrides earlier ones. The Gradle wrapper jar is checked in.
!gradle/wrapper/gradle-wrapper.jar

# Android
local.properties
captures/
*.apk
*.aab
*.aar
.cxx/

# Generated zserio sources (regenerated during build)
libs/jzswag/jzswag-test/src/main/java/calculator/

# Kotlin temporarily disabled
**/kotlin-disabled/

# IntelliJ IDEA
*.iml
*.ipr
*.iws
.idea/
out/

# Eclipse
.classpath
.project
.settings/
bin/

# NetBeans
nbproject/private/
build/
nbbuild/
dist/
nbdist/
.nb-gradle/
Loading
Loading