67448 Commits
Author SHA1 Message Date
Axel Uhl 182e7a00dd bug6318: remove now-unused logger field from TestORCPerformanceCurve
The logger field became unused once the country-overview-based online fetch
was replaced with a fixed GER bulk fetch in setUp (its only use was the
"Trying to read country certificates for ..." info line). Remove the field
and the now-unused java.util.logging.Logger import so the workspace stays
warning-free.

Assisted-By: Claude Opus 4.8 (claude-opus-5-5)
2026-10-17 10:27:55 +02:00
Axel Uhl 933111da2e bug6318: rewrite ORC public certificate search onto live WPub.dll JSON actions
The legacy data.orc.org WPub.dll XML entry points the adapter depended on
were decommissioned: search() POSTed action=ListCert and
getCountriesWithValidCertificates() GET /RMS, both parsed as XML. They now
302-redirect to HTML / return empty bodies, so parsing as XML tripped the
DOCTYPE / NPE path and failed every ORC test.

Rework the adapter onto the two surviving JSON actions:
  - ?action=DownBoatRMS&RefNo=<ref>&ext=json  (single certificate)
  - ?action=DownRMS&CountryId=<IOC>&ext=json  (per-country bulk)
The global DownRMS (no CountryId) still yields the Countries list used by
getCountriesWithValidCertificates().

ORCPublicCertificateDatabaseImpl:
  - new httpGetJson() (HttpGet + lax redirects + Basic auth; inline
    BOMInputStream charset detection; JSONParser), wrapping org.json.simple
    ParseException in IOException so no org.json type leaks into signatures;
  - parseHandleFromJson() mapping the rich rms-row schema (NatAuth->country,
    BIN->fileId, GPH, RefNo, Family, Age_Year->yearBuilt, IssueDate) with
    tolerant asString/asDouble/asInteger helpers and familyFromString();
  - search(): RefNo-direct via DownBoatRMS, else per-country bulk via DownRMS
    with client-side matchesClientFilters() (name/sail/boatclass/year); the
    JSON actions return only valid certs, so includeInvalid is retained for
    API compatibility but no longer branches;
  - getCountriesWithValidCertificates() reads the top-level Countries array,
    skips the ORC pseudo-entry; throws clause narrowed to IOException;
  - searchForUpdate() now queries by RefNo (dxtName no longer exists);
  - fuzzy search derives the issuing country from the sail-number prefix
    (countryFromSailNumber) so bulk lookups have a CountryId;
  - dead XML parseHandle(Node)/parseCountryOverview(Node) removed.

ORCPublicCertificateDatabase: narrow getCountriesWithValidCertificates()
throws to IOException; Javadoc updated to the JSON actions; https.

Tests: FailIfNoValidOrcCertificateRule probes a fixed strong country (GER)
instead of the now-unavailable cert-count ranking. TestORCPublicCertificate-
Database replaces the dead FRA00013881/SOULMATE fixture with a live
self-seeding pickSeedHandle(); all live tests gated by
@FailIfNoValidOrcCertificates. TestORCPerformanceCurve.setUp fetches the GER
bulk JSON directly. Full com.sap.sailing.domain.orc package: 28/28 green.

Assisted-By: Claude Opus 4.8 (claude-opus-5-5)
2026-10-17 09:44:42 +02:00
Masha Kashirina 2243a83b19 reviews to separate file for future safe merging 2026-10-15 18:21:11 +02:00
Masha Kashirina 2610cb7dc7 merge conflict resolution for githubpages 2026-10-15 18:05:20 +02:00
Masha Kashirina 2439300b4f new reviews for github pages 2026-10-15 17:52:55 +02:00
Axel Uhl 44e9eedfbc bu6202: release notes main-202610122310 main-202610122234 2026-10-12 22:17:59 +02:00
Axel Uhl bc79a79b0c Merge branch 'eclipse-main' into bug6202 2026-10-12 21:55:15 +02:00
Masha Kashirina 428801937b Merge branch 'main' into bug6202 2026-10-11 20:00:54 +02:00
Masha Kashirina 55f2b55fea bug6202: test update + cleanup/bugs 2026-10-11 19:48:59 +02:00
MashaKashirinaandCopilot Autofix powered by AI d1f028a291 Fix for code scanning alert no. 47
Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>
2026-10-11 18:54:07 +02:00
Masha Kashirina 8f33836ce8 clear reviews + sclear scrolling 2026-10-10 15:21:29 +02:00
Masha Kashirina 1ab9b27652 Merge branch 'main' into githubpagesdocs 2026-10-10 14:22:53 +02:00
Axel Uhl fbff5aedf4 Merge branch 'eclipse-main' into translation main-202610092054 2026-10-08 18:45:17 +02:00
service-tip-git cb0e12f961 [INTERNAL] Translation delivery: commit by LX Lab
Change-Id: I417331743cd379c8207fc68e82df910fe5fb9c43
2026-10-08 15:18:36 +00:00
Axel UhlandCopilot b334fac7f5 bug6316: activate Java-11 fragment profile for all JDKs >= 9
The with-java11-non-android-relevant profile was bounded by an upper JDK
version, so with Maven running on JDK 25 the routeconverterjava11extension
fragment was missing from the test runtime. On docker-* branches (tests
on JDK 8 with JavaSE-11.profile) routeconverter then loaded javax.xml.bind
from rt.jar via boot delegation, while Tycho 5's new test TCCL exposes
jaxb-impl's META-INF/services entry, so the bundled impl (wired to the
jaxb-api bundle) got picked, causing JAXB ClassCastExceptions and
IllegalAnnotationsExceptions in com.sap.sailing.server.trackfiles.test.

Assisted-By: Claude Opus 5.5

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
main-202610072309
2026-10-07 21:56:18 +02:00
Axel Uhl 9092744d4a bug6241 aftermath: dispatch regatta raceAdded catch-up outside computeIfAbsent to fix replication initial-load deadlock
The runWhenDoneLoading rewrite in 15dbbc03a1 (companion bug6241
listener-leak fix) made runWhenDoneLoading register a race-removal
listener on the race's regatta via TrackedRegatta.addRaceListener. When
a replica performs its initial load from a master
(RacingEventServiceImpl.initiallyFillFromInternal), it registers a
synchronous RaceAdditionListener on each deserialized regatta. Those
regattas already contain their races, so addRaceListener's catch-up loop
fires raceAdded for every existing race -- and it did so from INSIDE the
ConcurrentHashMap.computeIfAbsent mapping function, because the
SynchronousRunnableExecutor runs the dispatch inline. raceAdded then
called runWhenDoneLoading, which re-entered addRaceListener and nested a
second computeIfAbsent on the same raceListeners map while the outer one
still held the key's reservation node. ConcurrentHashMap forbids the
mapping function from modifying the map, so the nested update spun/blocked
forever on the reservation node -- a single-threaded self-deadlock, not a
lock-ordering deadlock.

This affected production: a replica would hang indefinitely during
initial load from a non-empty master (both automatic replica startup via
the replication Activator and operator-initiated replication). It also
wedged the CI build, which runs the replication initial-load tests;
TrackedRaceWithSensorFixStoreContentsReplicationTest hung until the 6h
GitHub Actions cap cancelled the job. The normal getOrCreateTrackedRegatta
path was unaffected because the listener there is registered on a
freshly-created empty regatta (zero-race catch-up, no re-entry).

Fix: TrackedRegattaImpl.addRaceListener now captures the catch-up work in
a holder inside the mapping function and runs it AFTER computeIfAbsent
returns, with the entry fully installed and no reservation node held. The
holder is populated only when a new entry was actually created, preserving
the duplicate-registration collapse, and the catch-up dispatch still runs
under the trackedRacesLock read lock, so ordering relative to enqueEvent
is unchanged. A nested addRaceListener for a different listener key now
proceeds normally.

TrackedRaceWithSensorFixStoreContentsReplicationTest now passes in ~7s.

Assisted-By: Claude (Anthropic claude-4.8-opus)
main-202610071431
2026-10-07 14:07:58 +02:00
Axel Uhl 6cb7d291e5 bug6316: add junit-platform-suite bundles to target platform for Tycho 5
Tycho 4.0.x implicitly contributed the JUnit Platform "suite" bundles to the
tycho-surefire test runtime, so our target platform never had to provide
org.junit.platform.suite.api itself. Tycho 5.0.4 no longer injects them, which
broke test resolution for every *.test bundle with:

  Cannot resolve project dependencies:
    You requested to install 'java.package; org.junit.platform.suite.api
    [1.0.0,2.0.0)' but it could not be found

The 2024-12 release repository we already reference for JUnit 5 (Platform
1.11.3 / Jupiter 5.11.3) also provides the split suite artifacts, so add them
from the same repository and include them as bundles:

  junit-platform-suite-api / -commons / -engine (+ .source) 1.11.3

suite-engine is included as well, at effectively no cost, to also support
running JUnit Platform @Suite classes via the suite engine.

Assisted-By: Claude Opus 4.8
main-202610070035
2026-10-06 19:46:29 +02:00
Axel Uhl 3cda4269cd Merge branch 'eclipse-main' into bug6316 2026-10-06 18:10:51 +02:00
Axel Uhl b7f5edf70e Bump pinned Apache Maven from 3.9.11 to 3.9.16
3.9.16 is the newest release on the Maven 3.9.x line (which Tycho 4.0.x
requires) and is the version the GitHub runner image shipped as default
before image 20261004.327.1 bumped the default to the Tycho-incompatible
3.10.0. Pinning the image's former default avoids a per-run download.

Assisted-By: Claude Opus 4.8
main-202610061922
2026-10-06 18:08:33 +02:00
Axel Uhl defa035a70 bug6316: upgrade Eclipse Tycho from 4.0.12 to 5.0.4
Tycho 4.0.x is end-of-life (4.0.13 was the final release); upstream
recommends migrating to the 5.x main line. Tycho 5.x requires Java 21+ as
its runtime VM, which release.yml already satisfies (Maven runs on JDK
25), and still targets the Maven 3.9.x line, so the existing Maven 3.9.11
pin remains valid.

Only java/pom.xml is bumped. The standalone java/com.amazon.aws.aws-java-api
module is deliberately left at Tycho 1.7.0: it builds its local p2 repo
under JDK 8, and Tycho 5.x cannot run on Java 8.

This is an initial probe to see how the release build reacts; serialization/
replication validation (see Bugzilla 3859 note in java/pom.xml) still pending.

Assisted-By: Claude Opus 4.8
2026-10-06 17:40:15 +02:00
Axel Uhl 2550cecea3 Pin Apache Maven to 3.9.11 for Tycho 4.0.x compatibility
The GitHub-hosted ubuntu runner image bumped its default Apache Maven
from 3.9.x to 3.10.0 (image ubuntu24/20261004.327). Tycho 4.0.x requires
the Maven 3.9.x line; under Maven 3.10.0 Tycho's Sisu/Guice component
wiring fails at extension bootstrap with "No implementation for
MavenTargetLocationFactory was bound" while provisioning
DefaultTargetPlatformFactory, breaking the build.

Pin Maven to 3.9.11 via setup-maven in every workflow that runs Maven
(release, build-aws-sdk-p2, build-sailing-base-p2, build-jetty-p2) so the
build no longer depends on whatever Maven the runner image ships. The
action is SHA-pinned consistently (stCarolas/setup-maven v5.1).

Assisted-By: Claude Opus 4.8
2026-10-06 17:33:04 +02:00
Axel Uhl b516c7957e fixed typo in wiki tutorials home.md main-202610061400 2026-10-06 13:13:21 +02:00
Axel Uhl 179a3ee25c Merge remote-tracking branch 'eclipse/main' into eclipse-main 2026-10-06 13:05:21 +02:00
Axel Uhl ab8a04f8e7 Merge branch 'eclipse-main' into hyperspace 2026-10-06 13:04:14 +02:00
Axel Uhl 024d1d65be hyperspace: raise Gradle Java source/target from 8 to 17
JDK 21 flagged source/target 8 as obsolete. The Gradle app build already
runs under JDK 17 (buildAndUpdateProduct.sh / release.yml), and AGP 8.7
permits Java 17, so bump sourceCompatibility/targetCompatibility and the
ext compat vars to 17. This covers the 4 mobile modules and the 8 java/
library subprojects compiled by Gradle; the separate Tycho/Maven OSGi
build is unaffected (its BREE pins it to Java 8 independently).

Assisted-By: Claude (claude-opus-5-5)
2026-10-06 11:34:23 +02:00
Axel Uhl 51f9c0ee6b sorted links in Wiki/tutorial support.sapsailing.com section main-202610060027 2026-10-06 00:09:06 +02:00
axeluhl fa9a59d324 Updated smartphone-tracking.md (markdown) 2026-10-05 23:59:05 +02:00
axeluhl 551cc68e88 Updated smartphone-tracking.md (markdown) 2026-10-05 23:58:56 +02:00
Axel Uhl 5e802fbf46 Merge pull request #6314 from janhamann/wiki/smartphone-tracking-guide
wiki: Add step-by-step guide for event hosts on Smartphone Tracking;
2026-10-05 23:29:45 +02:00
Axel Uhl cdefc5f107 Revise smartphone tracking documentation for clarity
Updated instructions for smartphone tracking, including clarifications on server requirements, competitor registration, and tracking management. Enhanced details on using the Race Manager app and handling competitor invitations.
2026-10-05 23:26:06 +02:00
Axel Uhl baa80a0126 fixed link from planning.md to smartphone-tracking-general 2026-10-05 21:01:47 +02:00
Axel Uhl 98a09bd4e7 Merge remote-tracking branch 'eclipse/main' into eclipse-main 2026-10-05 21:01:42 +02:00
Jan Hamann 688648bae3 wiki: Add step-by-step guide for event hosts on Smartphone Tracking;
New page wiki/howto/eventmanagers/smartphone-tracking.md walks event hosts
through setting up smartphone tracking in the order they actually do it:
event structure, denoting races (incl. the race name prefix dialog),
competitor registration, course layout, the three ways to bring phones in
(device mapping QR code, e-mail invitation, open-regatta registration link),
starting tracking and typical problems. Button and dialog names were taken from the
current Admin Console string messages where available.

Linked from Home.md; the two older pages
info/mobile/smartphone-tracking-steps and -general now point to it.

Assisted-By: Claude Code with Claude Sonnet 5.5
2026-10-05 19:49:24 +02:00
Axel Uhl 22e789d921 Bind httpprinter debug socket to loopback only
Fixes CodeQL py/bind-socket-all-network-interfaces by binding the
local debug HTTP printer to 127.0.0.1 instead of all interfaces
(host = ''). The script is a small local debugging utility, so
restricting it to loopback does not affect its intended use.

Assisted-By: Claude Opus 4.8
main-202610051921
2026-10-05 18:37:26 +02:00
Axel Uhl 42bdfb2cb4 checking MDI URL for trusted domains also from admin console UI 2026-10-05 18:18:24 +02:00
ospo-renovate[bot] b1ec9c1908 Migrate config renovate.json main-202610051420 2026-10-05 13:42:19 +02:00
Axel Uhl 6c397255bd Merge pull request #6313 from eclipse-sailing-analytics/hyperspace
Upgrading targetSDK to 36, handling edge-to-edge / insets and opting out of predictive "Back" button
2026-10-05 13:27:46 +02:00
Axel Uhl b3ab8d8d62 Merge pull request #36 from SAP-Sailing-Analytics/renovate/lock-file-maintenance
Lock file maintenance
2026-10-05 12:12:42 +02:00
ospo-renovate[bot] 22dd5aef07 Lock file maintenance 2026-10-05 10:12:28 +00:00
Axel Uhl b70837f803 Merge pull request #35 from SAP-Sailing-Analytics/renovate/rubygems-sinatra-vulnerability
Update dependency sinatra to v4 [SECURITY]
2026-10-05 12:12:00 +02:00
ospo-renovate[bot] afe1eb54a7 Update dependency sinatra to v4 [SECURITY] 2026-10-05 10:11:51 +00:00
Axel Uhl 88a8587f91 Merge pull request #34 from SAP-Sailing-Analytics/renovate/rubygems-webrick-vulnerability
Update dependency webrick to v1.8.2 [SECURITY]
2026-10-05 12:11:32 +02:00
Axel Uhl 4bcf7cabad Merge pull request #33 from SAP-Sailing-Analytics/renovate/rubygems-rack-vulnerability
Update dependency rack to v2.2.23 [SECURITY]
2026-10-05 12:11:15 +02:00
Axel Uhl 05f8a658c9 hyperspace: fix Play Services version skew crashing QR scanner (Buoy Pinger)
After the Android 16 / AGP 8 / JDK 21 upgrades, opening the QR code scanner
in the Buoy Pinger app crashed with NoClassDefFoundError for the internal
GMS classes zzdkv / zzbgl when constructing BarcodeDetector.Builder.

Root cause: play-services-maps:17.0.1 forced play-services-basement/base up to
17.0.0 in the Buoy Pinger graph, while play-services-vision stayed at 12.0.1.
Vision 12.0.1 references internal classes that existed in basement 12.x but
were removed in 17.0.0, so they fail to resolve at runtime. Race Manager was
unaffected only because it pulls no maps dependency, keeping its whole GMS
stack at 12.x.

Fix (preserving minSdk 16 for old tracking/pinging hardware):
- Bump play-services-vision 12.0.1 -> 19.0.0. Vision 19.0.0 depends on
  basement/base 17.0.0 (the versions maps 17.0.1 already pulls) and keeps
  minSdk 14; the BarcodeDetector API is unchanged, so no barcode code changes.
- Bump play-services-location 12.0.1 -> 21.0.1 so Race Manager's fused-location
  calls do not hit the same basement mismatch once vision raises basement; it
  resolves to basement 18.1.0 (minSdk 14), consistent across all three apps.
- Modernize WindFragment's deprecated LocationRequest API (create()/setPriority/
  setInterval/setFastestInterval and LocationRequest.PRIORITY_HIGH_ACCURACY) to
  LocationRequest.Builder with Priority.PRIORITY_HIGH_ACCURACY.

Verified: all three app modules (Buoy Pinger, Tracking, Race Manager) compile
cleanly against the bumped versions, with no location deprecation warnings.
Runtime QR scan not yet smoke-tested on a device.

Assisted-By: Claude Opus 4.8 (claude-opus-5-5)
2026-10-05 11:40:26 +02:00
Axel UhlandCopilot bd7ce48e65 hyperspace: target Android 16 (API level 36) as required by Google Play
Since August 31, 2026 Google Play rejects app updates not targeting API
level 36 ("Target SDK of artifact is too low: <versionCode>").

Build:
- AGP 8.7.3 -> 8.13.2 (8.7 supports at most API 35; 8.13 supports 36.1
  and works with our Gradle 8.14.3 / JDK 21)
- compileSdk 33 -> 36, targetSdk 35 -> 36, buildTools 34.0.0 -> 36.0.0
- azure-pipelines/main.yml: androidVersion 35 -> 36

Apps (all via the shared library, so all apps get it):
- Predictive back: opt out with android:enableOnBackInvokedCallback="false"
  so that the existing onBackPressed() overrides and KEYCODE_BACK handling
  keep being invoked on Android 16.
- Large screens: temporarily opt out of ignored orientation/resizability
  restrictions on sw600dp displays with
  PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY (ignored from API 37 on).
- Edge-to-edge, enforced without opt-out for targetSdk 36: new
  SystemBarInsetsHandler, registered by LoggableApplication on Android 15+
  devices, pads each activity's content view by the system bar, display
  cutout and (unless adjustPan/adjustNothing) keyboard insets so content
  no longer hides behind the status and navigation/button bar, and fills
  the status bar area with the theme's colorPrimaryDark as before.

Document the androidVersion / Play target API requirement in
building-and-deploying.md.

Assisted-By: Claude Opus 5.5

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-10-05 01:35:05 +02:00
ospo-renovate[bot] 9c5ba791b8 Update dependency webrick to v1.8.2 [SECURITY] 2026-10-04 21:47:52 +00:00
ospo-renovate[bot] 3d1b2fd10d Update dependency rack to v2.2.23 [SECURITY] 2026-10-04 21:47:40 +00:00
Axel Uhl c37c5f5502 bug6312: allow operators to set the initial admin password via SAILING_ADMIN_INITIAL_PASSWORD
When a fresh instance starts with an empty security store (one that does
not replicate its security service from a master), initEmptyStore() creates
the default "admin" user. Until now this always used the well-known password
"admin", created the account without enforcing a strong password, and logged
the password in cleartext.

Operators can now set the SAILING_ADMIN_INITIAL_PASSWORD environment variable
to supply the initial admin password. When set to a non-blank value, that
value is used and a strong password is enforced; the password value is never
logged. When unset, the previous "admin" default is kept for backward
compatibility (test / docker-deploy / CI) but a security warning is logged
recommending the variable be set, and noting that future versions may require
it. The cleartext password is no longer logged in either case.

This is opt-in and non-breaking; forcing the variable is left to a later
change after a deprecation period.

Assisted-By: Claude (Opus)
2026-10-04 23:00:56 +02:00
Axel Uhl b2632c3882 Stop logging OAuth tokens, secrets, and request tokens
OAuthRealm and SecurityServiceImpl logged OAuth credentials in cleartext:
the access token, its token value, secret, and raw provider response, as
well as the request token and verifier. These are sensitive values that
should never reach log files, where they widen the blast radius if logs
are leaked or aggregated.

Replace them with non-sensitive success/failure messages that identify
the provider only. The request-token/verifier lines are also dropped to
FINE since they carry no diagnostic value beyond the provider name.

Assisted-By: Claude (Opus)
2026-10-04 22:47:17 +02:00
Axel Uhl 46222d2d65 added configuration/listSailingAnalyticsServers script;
with valid AWS credentials in the env vars (see awsmfa) this script
will use findSailingAnalyticsServers and show the process configurations
found on them under /home/sailing/servers/*
2026-10-04 21:00:49 +02:00