mirror of
https://github.com/praktimarc/kst4contest.git
synced 2026-06-23 06:16:37 +02:00
Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
a96d9ef1c3
|
@@ -1,60 +0,0 @@
|
|||||||
---
|
|
||||||
name: Bug Report
|
|
||||||
about: Report a problem with KST4Contest / Ein Problem mit KST4Contest melden
|
|
||||||
title: "[BUG] "
|
|
||||||
labels: bug
|
|
||||||
---
|
|
||||||
|
|
||||||
**DE:** Bitte fülle alle Felder so vollständig wie möglich aus. Das hilft, den Fehler schneller zu finden.
|
|
||||||
**EN:** Please fill in all fields as completely as possible. This helps to find the bug faster.
|
|
||||||
|
|
||||||
## Description / Beschreibung
|
|
||||||
|
|
||||||
<!-- EN: A clear and concise description of the bug. -->
|
|
||||||
<!-- DE: Eine klare und präzise Beschreibung des Problems. -->
|
|
||||||
|
|
||||||
## Steps to reproduce / Schritte zum Reproduzieren
|
|
||||||
|
|
||||||
<!-- EN: Step-by-step instructions to reproduce the bug. -->
|
|
||||||
<!-- DE: Schritt-für-Schritt-Anleitung, um den Fehler zu reproduzieren. -->
|
|
||||||
|
|
||||||
1.
|
|
||||||
2.
|
|
||||||
3.
|
|
||||||
|
|
||||||
## Expected behaviour / Erwartetes Verhalten
|
|
||||||
|
|
||||||
<!-- EN: What did you expect to happen? / DE: Was hätte passieren sollen? -->
|
|
||||||
|
|
||||||
## Actual behaviour / Tatsächliches Verhalten
|
|
||||||
|
|
||||||
<!-- EN: What actually happened? / DE: Was ist stattdessen passiert? -->
|
|
||||||
|
|
||||||
## Log file content / Inhalt der Logdatei
|
|
||||||
|
|
||||||
**EN:** Please paste the content of the error log file here. It is written automatically and contains error messages only — no personal data.
|
|
||||||
**DE:** Bitte füge hier den Inhalt der Fehler-Logdatei ein. Sie wird automatisch geschrieben und enthält nur Fehlermeldungen — keine persönlichen Daten.
|
|
||||||
|
|
||||||
| OS | Path / Pfad |
|
|
||||||
|----|-------------|
|
|
||||||
| Linux / macOS | `~/.praktiKST/kst4contest-errors.log` |
|
|
||||||
| Windows | `C:\Users\<YourName>\.praktiKST\kst4contest-errors.log` |
|
|
||||||
|
|
||||||
```
|
|
||||||
Paste log content here / Loginhalt hier einfügen
|
|
||||||
```
|
|
||||||
|
|
||||||
## Version
|
|
||||||
|
|
||||||
**KST4Contest version / Version** (e.g. 1.41.0):
|
|
||||||
|
|
||||||
**Java version / Java-Version** (`java -version`, e.g. 17.0.9):
|
|
||||||
|
|
||||||
**Operating system / Betriebssystem:** <!-- Linux / Windows / macOS -->
|
|
||||||
|
|
||||||
**Logging software / Logprogramm** (if applicable / falls relevant, e.g. UCXLog, N1MM+, WinTest):
|
|
||||||
|
|
||||||
## Checklist / Checkliste
|
|
||||||
|
|
||||||
- [ ] I have attached the log file / Ich habe die Logdatei angehängt
|
|
||||||
- [ ] I have checked that this issue has not been reported before / Ich habe geprüft, dass dieses Problem noch nicht gemeldet wurde
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
blank_issues_enabled: false
|
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
---
|
|
||||||
name: Feature Request
|
|
||||||
about: Suggest a new feature or improvement / Neue Funktion oder Verbesserung vorschlagen
|
|
||||||
title: "[FEATURE] "
|
|
||||||
labels: enhancement
|
|
||||||
---
|
|
||||||
|
|
||||||
**DE:** Bitte beschreibe deine Idee so genau wie möglich.
|
|
||||||
**EN:** Please describe your idea as precisely as possible.
|
|
||||||
|
|
||||||
## Summary / Zusammenfassung
|
|
||||||
|
|
||||||
<!-- EN: A short summary of the feature you'd like. -->
|
|
||||||
<!-- DE: Eine kurze Zusammenfassung der gewünschten Funktion. -->
|
|
||||||
|
|
||||||
## Motivation / Begründung
|
|
||||||
|
|
||||||
<!-- EN: Why would this feature be useful? What problem does it solve? -->
|
|
||||||
<!-- DE: Warum wäre diese Funktion nützlich? Welches Problem löst sie? -->
|
|
||||||
|
|
||||||
## Detailed description / Detaillierte Beschreibung
|
|
||||||
|
|
||||||
<!-- EN: Describe the feature in detail. How should it work? -->
|
|
||||||
<!-- DE: Beschreibe die Funktion im Detail. Wie soll sie funktionieren? -->
|
|
||||||
|
|
||||||
## Alternatives considered / Geprüfte Alternativen
|
|
||||||
|
|
||||||
<!-- EN: Have you considered any alternative solutions or workarounds? -->
|
|
||||||
<!-- DE: Hast du alternative Lösungen oder Workarounds in Betracht gezogen? -->
|
|
||||||
|
|
||||||
## Checklist / Checkliste
|
|
||||||
|
|
||||||
- [ ] I have checked that this feature has not been requested before / Ich habe geprüft, dass diese Funktion noch nicht angefragt wurde
|
|
||||||
@@ -11,10 +11,6 @@ on:
|
|||||||
env:
|
env:
|
||||||
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
|
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
packages: write
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build-windows-zip:
|
build-windows-zip:
|
||||||
name: Build Windows ZIP
|
name: Build Windows ZIP
|
||||||
@@ -87,6 +83,8 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
VERSION=$(grep -m1 '<version>' pom.xml | sed 's/.*<version>\(.*\)<\/version>.*/\1/')
|
VERSION=$(grep -m1 '<version>' pom.xml | sed 's/.*<version>\(.*\)<\/version>.*/\1/')
|
||||||
SHORT_SHA="${GITHUB_SHA::7}"
|
SHORT_SHA="${GITHUB_SHA::7}"
|
||||||
|
echo "VERSION=$VERSION" >> "$GITHUB_ENV"
|
||||||
|
echo "SHORT_SHA=$SHORT_SHA" >> "$GITHUB_ENV"
|
||||||
echo "ASSET_BASENAME=KST4Contest-${VERSION}-${SHORT_SHA}" >> "$GITHUB_ENV"
|
echo "ASSET_BASENAME=KST4Contest-${VERSION}-${SHORT_SHA}" >> "$GITHUB_ENV"
|
||||||
|
|
||||||
- name: Set up Java 17
|
- name: Set up Java 17
|
||||||
@@ -155,317 +153,6 @@ jobs:
|
|||||||
path: dist/KST4Contest-*-linux-x86_64.AppImage
|
path: dist/KST4Contest-*-linux-x86_64.AppImage
|
||||||
retention-days: 14
|
retention-days: 14
|
||||||
|
|
||||||
build-linux-deb:
|
|
||||||
name: Build Debian package
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v4.1.7
|
|
||||||
|
|
||||||
- name: Resolve nightly version info
|
|
||||||
run: |
|
|
||||||
VERSION=$(grep -m1 '<version>' pom.xml | sed 's/.*<version>\(.*\)<\/version>.*/\1/')
|
|
||||||
SHORT_SHA="${GITHUB_SHA::7}"
|
|
||||||
echo "ASSET_BASENAME=KST4Contest-${VERSION}-${SHORT_SHA}" >> "$GITHUB_ENV"
|
|
||||||
|
|
||||||
- name: Set up Java 17
|
|
||||||
uses: actions/setup-java@v4.1.0
|
|
||||||
with:
|
|
||||||
distribution: temurin
|
|
||||||
java-version: "17"
|
|
||||||
|
|
||||||
- name: Install packaging dependencies
|
|
||||||
run: |
|
|
||||||
sudo apt-get update -qq
|
|
||||||
sudo apt-get install -y --no-install-recommends fakeroot
|
|
||||||
|
|
||||||
- name: Ensure mvnw is executable
|
|
||||||
run: chmod +x mvnw
|
|
||||||
|
|
||||||
- name: Build JAR and copy runtime dependencies
|
|
||||||
run: |
|
|
||||||
./mvnw -B -DskipTests package dependency:copy-dependencies -DincludeScope=runtime -DoutputDirectory=target/dist-libs
|
|
||||||
cp "$(ls -t target/praktiKST-*.jar | head -n 1)" target/dist-libs/app.jar
|
|
||||||
|
|
||||||
- name: Build Debian package
|
|
||||||
run: |
|
|
||||||
mkdir -p dist
|
|
||||||
jpackage \
|
|
||||||
--type deb \
|
|
||||||
--name KST4Contest \
|
|
||||||
--input target/dist-libs \
|
|
||||||
--main-jar app.jar \
|
|
||||||
--main-class kst4contest.view.Kst4ContestApplication \
|
|
||||||
--module-path target/dist-libs \
|
|
||||||
--add-modules javafx.controls,javafx.graphics,javafx.fxml,javafx.web,javafx.media,java.sql \
|
|
||||||
--dest dist
|
|
||||||
DEB="$(ls dist/*.deb | head -n 1)"
|
|
||||||
if [ -z "$DEB" ]; then
|
|
||||||
echo "No DEB produced by jpackage" && exit 1
|
|
||||||
fi
|
|
||||||
mv "$DEB" "dist/${ASSET_BASENAME}-debian-amd64.deb"
|
|
||||||
|
|
||||||
- name: Upload Debian artifact
|
|
||||||
uses: actions/upload-artifact@v4.3.4
|
|
||||||
with:
|
|
||||||
name: linux-debian
|
|
||||||
path: dist/KST4Contest-*-debian-amd64.deb
|
|
||||||
retention-days: 14
|
|
||||||
|
|
||||||
build-linux-rpm:
|
|
||||||
name: Build Fedora package
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v4.1.7
|
|
||||||
|
|
||||||
- name: Resolve nightly version info
|
|
||||||
run: |
|
|
||||||
VERSION=$(grep -m1 '<version>' pom.xml | sed 's/.*<version>\(.*\)<\/version>.*/\1/')
|
|
||||||
SHORT_SHA="${GITHUB_SHA::7}"
|
|
||||||
echo "ASSET_BASENAME=KST4Contest-${VERSION}-${SHORT_SHA}" >> "$GITHUB_ENV"
|
|
||||||
|
|
||||||
- name: Set up Java 17
|
|
||||||
uses: actions/setup-java@v4.1.0
|
|
||||||
with:
|
|
||||||
distribution: temurin
|
|
||||||
java-version: "17"
|
|
||||||
|
|
||||||
- name: Install packaging dependencies
|
|
||||||
run: |
|
|
||||||
sudo apt-get update -qq
|
|
||||||
sudo apt-get install -y --no-install-recommends rpm
|
|
||||||
|
|
||||||
- name: Ensure mvnw is executable
|
|
||||||
run: chmod +x mvnw
|
|
||||||
|
|
||||||
- name: Build JAR and copy runtime dependencies
|
|
||||||
run: |
|
|
||||||
./mvnw -B -DskipTests package dependency:copy-dependencies -DincludeScope=runtime -DoutputDirectory=target/dist-libs
|
|
||||||
cp "$(ls -t target/praktiKST-*.jar | head -n 1)" target/dist-libs/app.jar
|
|
||||||
|
|
||||||
- name: Build Fedora package
|
|
||||||
run: |
|
|
||||||
mkdir -p dist
|
|
||||||
jpackage \
|
|
||||||
--type rpm \
|
|
||||||
--name KST4Contest \
|
|
||||||
--input target/dist-libs \
|
|
||||||
--main-jar app.jar \
|
|
||||||
--main-class kst4contest.view.Kst4ContestApplication \
|
|
||||||
--module-path target/dist-libs \
|
|
||||||
--add-modules javafx.controls,javafx.graphics,javafx.fxml,javafx.web,javafx.media,java.sql \
|
|
||||||
--dest dist
|
|
||||||
RPM="$(ls dist/*.rpm | head -n 1)"
|
|
||||||
if [ -z "$RPM" ]; then
|
|
||||||
echo "No RPM produced by jpackage" && exit 1
|
|
||||||
fi
|
|
||||||
mv "$RPM" "dist/${ASSET_BASENAME}-fedora-x86_64.rpm"
|
|
||||||
|
|
||||||
- name: Upload Fedora artifact
|
|
||||||
uses: actions/upload-artifact@v4.3.4
|
|
||||||
with:
|
|
||||||
name: linux-fedora
|
|
||||||
path: dist/KST4Contest-*-fedora-x86_64.rpm
|
|
||||||
retention-days: 14
|
|
||||||
|
|
||||||
build-linux-arch:
|
|
||||||
name: Build Arch Linux package
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v4.1.7
|
|
||||||
|
|
||||||
- name: Resolve nightly version info
|
|
||||||
run: |
|
|
||||||
VERSION=$(grep -m1 '<version>' pom.xml | sed 's/.*<version>\(.*\)<\/version>.*/\1/')
|
|
||||||
SHORT_SHA="${GITHUB_SHA::7}"
|
|
||||||
echo "VERSION=$VERSION" >> "$GITHUB_ENV"
|
|
||||||
echo "SHORT_SHA=$SHORT_SHA" >> "$GITHUB_ENV"
|
|
||||||
echo "ASSET_BASENAME=KST4Contest-${VERSION}-${SHORT_SHA}" >> "$GITHUB_ENV"
|
|
||||||
|
|
||||||
- name: Set up Java 17
|
|
||||||
uses: actions/setup-java@v4.1.0
|
|
||||||
with:
|
|
||||||
distribution: temurin
|
|
||||||
java-version: "17"
|
|
||||||
|
|
||||||
- name: Install packaging dependencies
|
|
||||||
run: |
|
|
||||||
sudo apt-get update -qq
|
|
||||||
sudo apt-get install -y --no-install-recommends zstd
|
|
||||||
|
|
||||||
- name: Ensure mvnw is executable
|
|
||||||
run: chmod +x mvnw
|
|
||||||
|
|
||||||
- name: Build JAR and copy runtime dependencies
|
|
||||||
run: |
|
|
||||||
./mvnw -B -DskipTests package dependency:copy-dependencies -DincludeScope=runtime -DoutputDirectory=target/dist-libs
|
|
||||||
cp "$(ls -t target/praktiKST-*.jar | head -n 1)" target/dist-libs/app.jar
|
|
||||||
|
|
||||||
- name: Build app-image with jpackage
|
|
||||||
run: |
|
|
||||||
mkdir -p dist
|
|
||||||
jpackage \
|
|
||||||
--type app-image \
|
|
||||||
--name KST4Contest \
|
|
||||||
--input target/dist-libs \
|
|
||||||
--main-jar app.jar \
|
|
||||||
--main-class kst4contest.view.Kst4ContestApplication \
|
|
||||||
--module-path target/dist-libs \
|
|
||||||
--add-modules javafx.controls,javafx.graphics,javafx.fxml,javafx.web,javafx.media,java.sql \
|
|
||||||
--dest dist
|
|
||||||
|
|
||||||
- name: Build Arch Linux package artifact
|
|
||||||
run: |
|
|
||||||
ARCH=$(uname -m)
|
|
||||||
PKGVER=$(printf '%s' "${VERSION}-${SHORT_SHA}" | sed 's/[^[:alnum:].+_]/_/g')
|
|
||||||
PKGROOT="target/archpkg"
|
|
||||||
rm -rf "$PKGROOT"
|
|
||||||
mkdir -p "$PKGROOT/usr/lib/KST4Contest" "$PKGROOT/usr/bin"
|
|
||||||
cp -a dist/KST4Contest/. "$PKGROOT/usr/lib/KST4Contest/"
|
|
||||||
cat > "$PKGROOT/usr/bin/KST4Contest" << 'EOF'
|
|
||||||
#!/bin/sh
|
|
||||||
exec /usr/lib/KST4Contest/bin/KST4Contest "$@"
|
|
||||||
EOF
|
|
||||||
chmod 755 "$PKGROOT/usr/bin/KST4Contest"
|
|
||||||
mkdir -p "$PKGROOT/usr/share/applications" "$PKGROOT/usr/share/icons/hicolor/256x256/apps"
|
|
||||||
cat > "$PKGROOT/usr/share/applications/KST4Contest.desktop" << 'EOF'
|
|
||||||
[Desktop Entry]
|
|
||||||
Type=Application
|
|
||||||
Name=KST4Contest
|
|
||||||
Comment=ON4KST Chat Client for VHF/UHF contest operation
|
|
||||||
Exec=KST4Contest
|
|
||||||
Icon=KST4Contest
|
|
||||||
Categories=Network;HamRadio;
|
|
||||||
Terminal=false
|
|
||||||
EOF
|
|
||||||
if [ -f "$PKGROOT/usr/lib/KST4Contest/lib/KST4Contest.png" ]; then
|
|
||||||
cp "$PKGROOT/usr/lib/KST4Contest/lib/KST4Contest.png" "$PKGROOT/usr/share/icons/hicolor/256x256/apps/KST4Contest.png"
|
|
||||||
fi
|
|
||||||
INSTALLED_SIZE=$(du -sk "$PKGROOT" | cut -f1)
|
|
||||||
cat > "$PKGROOT/.PKGINFO" << EOF
|
|
||||||
pkgname = kst4contest
|
|
||||||
pkgbase = kst4contest
|
|
||||||
pkgver = ${PKGVER}-1
|
|
||||||
pkgdesc = KST4Contest amateur radio contest logger
|
|
||||||
url = https://github.com/${{ github.repository }}
|
|
||||||
builddate = $(date +%s)
|
|
||||||
packager = GitHub Actions
|
|
||||||
size = ${INSTALLED_SIZE}
|
|
||||||
arch = ${ARCH}
|
|
||||||
license = custom
|
|
||||||
depend = java-runtime
|
|
||||||
EOF
|
|
||||||
tar --zstd -cf "dist/${ASSET_BASENAME}-archlinux-${ARCH}.pkg.tar.zst" -C "$PKGROOT" .
|
|
||||||
|
|
||||||
- name: Upload Arch Linux artifact
|
|
||||||
uses: actions/upload-artifact@v4.3.4
|
|
||||||
with:
|
|
||||||
name: linux-arch
|
|
||||||
path: dist/KST4Contest-*-archlinux-*.pkg.tar.zst
|
|
||||||
retention-days: 14
|
|
||||||
|
|
||||||
build-flatpak:
|
|
||||||
name: Build Flatpak
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v4.1.7
|
|
||||||
|
|
||||||
- name: Resolve nightly version info
|
|
||||||
run: |
|
|
||||||
VERSION=$(grep -m1 '<version>' pom.xml | sed 's/.*<version>\(.*\)<\/version>.*/\1/')
|
|
||||||
SHORT_SHA="${GITHUB_SHA::7}"
|
|
||||||
echo "VERSION=$VERSION" >> "$GITHUB_ENV"
|
|
||||||
echo "SHORT_SHA=$SHORT_SHA" >> "$GITHUB_ENV"
|
|
||||||
echo "ASSET_BASENAME=KST4Contest-${VERSION}-${SHORT_SHA}" >> "$GITHUB_ENV"
|
|
||||||
|
|
||||||
- name: Set up Java 17
|
|
||||||
uses: actions/setup-java@v4.1.0
|
|
||||||
with:
|
|
||||||
distribution: temurin
|
|
||||||
java-version: "17"
|
|
||||||
|
|
||||||
- name: Ensure mvnw is executable
|
|
||||||
run: chmod +x mvnw
|
|
||||||
|
|
||||||
- name: Install Flatpak tooling
|
|
||||||
run: |
|
|
||||||
sudo apt-get update -qq
|
|
||||||
sudo apt-get install -y --no-install-recommends flatpak flatpak-builder elfutils
|
|
||||||
flatpak remote-add --user --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
|
|
||||||
flatpak --user install -y flathub org.freedesktop.Platform//24.08 org.freedesktop.Sdk//24.08
|
|
||||||
|
|
||||||
- name: Build app-image with jpackage
|
|
||||||
run: |
|
|
||||||
./mvnw -B -DskipTests package dependency:copy-dependencies -DincludeScope=runtime -DoutputDirectory=target/dist-libs
|
|
||||||
cp "$(ls -t target/praktiKST-*.jar | head -n 1)" target/dist-libs/app.jar
|
|
||||||
mkdir -p target/flatpak-src
|
|
||||||
jpackage \
|
|
||||||
--type app-image \
|
|
||||||
--name KST4Contest \
|
|
||||||
--input target/dist-libs \
|
|
||||||
--main-jar app.jar \
|
|
||||||
--main-class kst4contest.view.Kst4ContestApplication \
|
|
||||||
--module-path target/dist-libs \
|
|
||||||
--add-modules javafx.controls,javafx.graphics,javafx.fxml,javafx.web,javafx.media,java.sql \
|
|
||||||
--dest target/flatpak-src
|
|
||||||
|
|
||||||
- name: Create Flatpak manifest
|
|
||||||
run: |
|
|
||||||
mkdir -p dist
|
|
||||||
cat > target/de.x08.KST4Contest.yml << 'EOF'
|
|
||||||
app-id: de.x08.KST4Contest
|
|
||||||
runtime: org.freedesktop.Platform
|
|
||||||
runtime-version: "24.08"
|
|
||||||
sdk: org.freedesktop.Sdk
|
|
||||||
command: KST4Contest
|
|
||||||
finish-args:
|
|
||||||
- --socket=wayland
|
|
||||||
- --socket=x11
|
|
||||||
- --share=network
|
|
||||||
- --share=ipc
|
|
||||||
- --device=dri
|
|
||||||
modules:
|
|
||||||
- name: kst4contest
|
|
||||||
buildsystem: simple
|
|
||||||
build-commands:
|
|
||||||
- install -d /app/lib/KST4Contest /app/bin /app/share/applications
|
|
||||||
- cp -a . /app/lib/KST4Contest/
|
|
||||||
- printf '#!/bin/sh\nexec /app/lib/KST4Contest/bin/KST4Contest "$@"\n' > /app/bin/KST4Contest
|
|
||||||
- chmod 755 /app/bin/KST4Contest
|
|
||||||
- echo '[Desktop Entry]' > /app/share/applications/de.x08.KST4Contest.desktop
|
|
||||||
- echo 'Type=Application' >> /app/share/applications/de.x08.KST4Contest.desktop
|
|
||||||
- echo 'Name=KST4Contest' >> /app/share/applications/de.x08.KST4Contest.desktop
|
|
||||||
- echo 'Comment=ON4KST Chat Client for VHF/UHF contest operation' >> /app/share/applications/de.x08.KST4Contest.desktop
|
|
||||||
- echo 'Exec=KST4Contest' >> /app/share/applications/de.x08.KST4Contest.desktop
|
|
||||||
- echo 'Icon=de.x08.KST4Contest' >> /app/share/applications/de.x08.KST4Contest.desktop
|
|
||||||
- printf 'Categories=Network;HamRadio;\n' >> /app/share/applications/de.x08.KST4Contest.desktop
|
|
||||||
- echo 'Terminal=false' >> /app/share/applications/de.x08.KST4Contest.desktop
|
|
||||||
- test -f /app/lib/KST4Contest/lib/KST4Contest.png && install -Dm644 /app/lib/KST4Contest/lib/KST4Contest.png /app/share/icons/hicolor/256x256/apps/de.x08.KST4Contest.png || true
|
|
||||||
sources:
|
|
||||||
- type: dir
|
|
||||||
path: flatpak-src/KST4Contest
|
|
||||||
EOF
|
|
||||||
|
|
||||||
- name: Build Flatpak bundle
|
|
||||||
run: |
|
|
||||||
flatpak-builder --force-clean target/flatpak-build target/de.x08.KST4Contest.yml
|
|
||||||
flatpak build-export target/flatpak-repo target/flatpak-build
|
|
||||||
flatpak build-bundle target/flatpak-repo "dist/${ASSET_BASENAME}-linux-x86_64.flatpak" de.x08.KST4Contest
|
|
||||||
|
|
||||||
- name: Upload Flatpak artifact
|
|
||||||
uses: actions/upload-artifact@v4.3.4
|
|
||||||
with:
|
|
||||||
name: linux-flatpak
|
|
||||||
path: dist/KST4Contest-*-linux-x86_64.flatpak
|
|
||||||
retention-days: 14
|
|
||||||
|
|
||||||
build-macos-dmg:
|
build-macos-dmg:
|
||||||
name: Build macOS DMG (${{ matrix.os }})
|
name: Build macOS DMG (${{ matrix.os }})
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ on:
|
|||||||
|
|
||||||
permissions:
|
permissions:
|
||||||
contents: write
|
contents: write
|
||||||
packages: write
|
|
||||||
|
|
||||||
env:
|
env:
|
||||||
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
|
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
|
||||||
@@ -135,313 +134,6 @@ jobs:
|
|||||||
name: linux-appimage
|
name: linux-appimage
|
||||||
path: dist/KST4Contest-${{ github.ref_name }}-linux-x86_64.AppImage
|
path: dist/KST4Contest-${{ github.ref_name }}-linux-x86_64.AppImage
|
||||||
|
|
||||||
build-linux-deb:
|
|
||||||
name: Build Debian package
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v4.1.7
|
|
||||||
|
|
||||||
- name: Set up Java 17
|
|
||||||
uses: actions/setup-java@v4.1.0
|
|
||||||
with:
|
|
||||||
distribution: temurin
|
|
||||||
java-version: "17"
|
|
||||||
|
|
||||||
- name: Install packaging dependencies
|
|
||||||
run: |
|
|
||||||
sudo apt-get update -qq
|
|
||||||
sudo apt-get install -y --no-install-recommends fakeroot
|
|
||||||
|
|
||||||
- name: Ensure mvnw is executable
|
|
||||||
run: chmod +x mvnw
|
|
||||||
|
|
||||||
- name: Build JAR and copy runtime dependencies
|
|
||||||
run: |
|
|
||||||
./mvnw -B -DskipTests package dependency:copy-dependencies -DincludeScope=runtime -DoutputDirectory=target/dist-libs
|
|
||||||
cp "$(ls -t target/praktiKST-*.jar | head -n 1)" target/dist-libs/app.jar
|
|
||||||
|
|
||||||
- name: Build Debian package
|
|
||||||
run: |
|
|
||||||
mkdir -p dist
|
|
||||||
jpackage \
|
|
||||||
--type deb \
|
|
||||||
--name KST4Contest \
|
|
||||||
--input target/dist-libs \
|
|
||||||
--main-jar app.jar \
|
|
||||||
--main-class kst4contest.view.Kst4ContestApplication \
|
|
||||||
--module-path target/dist-libs \
|
|
||||||
--add-modules javafx.controls,javafx.graphics,javafx.fxml,javafx.web,javafx.media,java.sql \
|
|
||||||
--dest dist
|
|
||||||
DEB="$(ls dist/*.deb | head -n 1)"
|
|
||||||
if [ -z "$DEB" ]; then
|
|
||||||
echo "No DEB produced by jpackage" && exit 1
|
|
||||||
fi
|
|
||||||
mv "$DEB" "dist/KST4Contest-${{ github.ref_name }}-debian-amd64.deb"
|
|
||||||
|
|
||||||
- name: Upload Debian artifact
|
|
||||||
uses: actions/upload-artifact@v4.3.4
|
|
||||||
with:
|
|
||||||
name: linux-debian
|
|
||||||
path: dist/KST4Contest-${{ github.ref_name }}-debian-amd64.deb
|
|
||||||
|
|
||||||
build-linux-rpm:
|
|
||||||
name: Build Fedora package
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v4.1.7
|
|
||||||
|
|
||||||
- name: Set up Java 17
|
|
||||||
uses: actions/setup-java@v4.1.0
|
|
||||||
with:
|
|
||||||
distribution: temurin
|
|
||||||
java-version: "17"
|
|
||||||
|
|
||||||
- name: Install packaging dependencies
|
|
||||||
run: |
|
|
||||||
sudo apt-get update -qq
|
|
||||||
sudo apt-get install -y --no-install-recommends rpm
|
|
||||||
|
|
||||||
- name: Ensure mvnw is executable
|
|
||||||
run: chmod +x mvnw
|
|
||||||
|
|
||||||
- name: Build JAR and copy runtime dependencies
|
|
||||||
run: |
|
|
||||||
./mvnw -B -DskipTests package dependency:copy-dependencies -DincludeScope=runtime -DoutputDirectory=target/dist-libs
|
|
||||||
cp "$(ls -t target/praktiKST-*.jar | head -n 1)" target/dist-libs/app.jar
|
|
||||||
|
|
||||||
- name: Build Fedora package
|
|
||||||
run: |
|
|
||||||
mkdir -p dist
|
|
||||||
jpackage \
|
|
||||||
--type rpm \
|
|
||||||
--name KST4Contest \
|
|
||||||
--input target/dist-libs \
|
|
||||||
--main-jar app.jar \
|
|
||||||
--main-class kst4contest.view.Kst4ContestApplication \
|
|
||||||
--module-path target/dist-libs \
|
|
||||||
--add-modules javafx.controls,javafx.graphics,javafx.fxml,javafx.web,javafx.media,java.sql \
|
|
||||||
--dest dist
|
|
||||||
RPM="$(ls dist/*.rpm | head -n 1)"
|
|
||||||
if [ -z "$RPM" ]; then
|
|
||||||
echo "No RPM produced by jpackage" && exit 1
|
|
||||||
fi
|
|
||||||
mv "$RPM" "dist/KST4Contest-${{ github.ref_name }}-fedora-x86_64.rpm"
|
|
||||||
|
|
||||||
- name: Upload Fedora artifact
|
|
||||||
uses: actions/upload-artifact@v4.3.4
|
|
||||||
with:
|
|
||||||
name: linux-fedora
|
|
||||||
path: dist/KST4Contest-${{ github.ref_name }}-fedora-x86_64.rpm
|
|
||||||
|
|
||||||
build-linux-arch:
|
|
||||||
name: Build Arch Linux package
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v4.1.7
|
|
||||||
|
|
||||||
- name: Set up Java 17
|
|
||||||
uses: actions/setup-java@v4.1.0
|
|
||||||
with:
|
|
||||||
distribution: temurin
|
|
||||||
java-version: "17"
|
|
||||||
|
|
||||||
- name: Install packaging dependencies
|
|
||||||
run: |
|
|
||||||
sudo apt-get update -qq
|
|
||||||
sudo apt-get install -y --no-install-recommends zstd
|
|
||||||
|
|
||||||
- name: Ensure mvnw is executable
|
|
||||||
run: chmod +x mvnw
|
|
||||||
|
|
||||||
- name: Build JAR and copy runtime dependencies
|
|
||||||
run: |
|
|
||||||
./mvnw -B -DskipTests package dependency:copy-dependencies -DincludeScope=runtime -DoutputDirectory=target/dist-libs
|
|
||||||
cp "$(ls -t target/praktiKST-*.jar | head -n 1)" target/dist-libs/app.jar
|
|
||||||
|
|
||||||
- name: Build app-image with jpackage
|
|
||||||
run: |
|
|
||||||
mkdir -p dist
|
|
||||||
jpackage \
|
|
||||||
--type app-image \
|
|
||||||
--name KST4Contest \
|
|
||||||
--input target/dist-libs \
|
|
||||||
--main-jar app.jar \
|
|
||||||
--main-class kst4contest.view.Kst4ContestApplication \
|
|
||||||
--module-path target/dist-libs \
|
|
||||||
--add-modules javafx.controls,javafx.graphics,javafx.fxml,javafx.web,javafx.media,java.sql \
|
|
||||||
--dest dist
|
|
||||||
|
|
||||||
- name: Build Arch Linux package artifact
|
|
||||||
run: |
|
|
||||||
ARCH=$(uname -m)
|
|
||||||
PKGVER=$(printf '%s' "${{ github.ref_name }}" | sed 's/[^[:alnum:].+_]/_/g')
|
|
||||||
PKGROOT="target/archpkg"
|
|
||||||
rm -rf "$PKGROOT"
|
|
||||||
mkdir -p "$PKGROOT/usr/lib/KST4Contest" "$PKGROOT/usr/bin"
|
|
||||||
cp -a dist/KST4Contest/. "$PKGROOT/usr/lib/KST4Contest/"
|
|
||||||
cat > "$PKGROOT/usr/bin/KST4Contest" << 'EOF'
|
|
||||||
#!/bin/sh
|
|
||||||
exec /usr/lib/KST4Contest/bin/KST4Contest "$@"
|
|
||||||
EOF
|
|
||||||
chmod 755 "$PKGROOT/usr/bin/KST4Contest"
|
|
||||||
mkdir -p "$PKGROOT/usr/share/applications" "$PKGROOT/usr/share/icons/hicolor/256x256/apps"
|
|
||||||
cat > "$PKGROOT/usr/share/applications/KST4Contest.desktop" << 'EOF'
|
|
||||||
[Desktop Entry]
|
|
||||||
Type=Application
|
|
||||||
Name=KST4Contest
|
|
||||||
Comment=ON4KST Chat Client for VHF/UHF contest operation
|
|
||||||
Exec=KST4Contest
|
|
||||||
Icon=KST4Contest
|
|
||||||
Categories=Network;HamRadio;
|
|
||||||
Terminal=false
|
|
||||||
EOF
|
|
||||||
if [ -f "$PKGROOT/usr/lib/KST4Contest/lib/KST4Contest.png" ]; then
|
|
||||||
cp "$PKGROOT/usr/lib/KST4Contest/lib/KST4Contest.png" "$PKGROOT/usr/share/icons/hicolor/256x256/apps/KST4Contest.png"
|
|
||||||
fi
|
|
||||||
INSTALLED_SIZE=$(du -sk "$PKGROOT" | cut -f1)
|
|
||||||
cat > "$PKGROOT/.PKGINFO" << EOF
|
|
||||||
pkgname = kst4contest
|
|
||||||
pkgbase = kst4contest
|
|
||||||
pkgver = ${PKGVER}-1
|
|
||||||
pkgdesc = KST4Contest amateur radio contest logger
|
|
||||||
url = https://github.com/${{ github.repository }}
|
|
||||||
builddate = $(date +%s)
|
|
||||||
packager = GitHub Actions
|
|
||||||
size = ${INSTALLED_SIZE}
|
|
||||||
arch = ${ARCH}
|
|
||||||
license = custom
|
|
||||||
depend = java-runtime
|
|
||||||
EOF
|
|
||||||
tar --zstd -cf "dist/KST4Contest-${{ github.ref_name }}-archlinux-${ARCH}.pkg.tar.zst" -C "$PKGROOT" .
|
|
||||||
|
|
||||||
- name: Upload Arch Linux artifact
|
|
||||||
uses: actions/upload-artifact@v4.3.4
|
|
||||||
with:
|
|
||||||
name: linux-arch
|
|
||||||
path: dist/KST4Contest-${{ github.ref_name }}-archlinux-*.pkg.tar.zst
|
|
||||||
|
|
||||||
build-flatpak:
|
|
||||||
name: Build Flatpak
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v4.1.7
|
|
||||||
|
|
||||||
- name: Set up Java 17
|
|
||||||
uses: actions/setup-java@v4.1.0
|
|
||||||
with:
|
|
||||||
distribution: temurin
|
|
||||||
java-version: "17"
|
|
||||||
|
|
||||||
- name: Ensure mvnw is executable
|
|
||||||
run: chmod +x mvnw
|
|
||||||
|
|
||||||
- name: Install Flatpak tooling
|
|
||||||
run: |
|
|
||||||
sudo apt-get update -qq
|
|
||||||
sudo apt-get install -y --no-install-recommends flatpak flatpak-builder elfutils
|
|
||||||
flatpak remote-add --user --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
|
|
||||||
flatpak --user install -y flathub org.freedesktop.Platform//24.08 org.freedesktop.Sdk//24.08
|
|
||||||
|
|
||||||
- name: Build app-image with jpackage
|
|
||||||
run: |
|
|
||||||
./mvnw -B -DskipTests package dependency:copy-dependencies -DincludeScope=runtime -DoutputDirectory=target/dist-libs
|
|
||||||
cp "$(ls -t target/praktiKST-*.jar | head -n 1)" target/dist-libs/app.jar
|
|
||||||
mkdir -p target/flatpak-src
|
|
||||||
jpackage \
|
|
||||||
--type app-image \
|
|
||||||
--name KST4Contest \
|
|
||||||
--input target/dist-libs \
|
|
||||||
--main-jar app.jar \
|
|
||||||
--main-class kst4contest.view.Kst4ContestApplication \
|
|
||||||
--module-path target/dist-libs \
|
|
||||||
--add-modules javafx.controls,javafx.graphics,javafx.fxml,javafx.web,javafx.media,java.sql \
|
|
||||||
--dest target/flatpak-src
|
|
||||||
|
|
||||||
- name: Create Flatpak manifest
|
|
||||||
run: |
|
|
||||||
mkdir -p dist
|
|
||||||
cat > target/de.x08.KST4Contest.yml << 'EOF'
|
|
||||||
app-id: de.x08.KST4Contest
|
|
||||||
runtime: org.freedesktop.Platform
|
|
||||||
runtime-version: "24.08"
|
|
||||||
sdk: org.freedesktop.Sdk
|
|
||||||
command: KST4Contest
|
|
||||||
finish-args:
|
|
||||||
- --socket=wayland
|
|
||||||
- --socket=x11
|
|
||||||
- --share=network
|
|
||||||
- --share=ipc
|
|
||||||
- --device=dri
|
|
||||||
modules:
|
|
||||||
- name: kst4contest
|
|
||||||
buildsystem: simple
|
|
||||||
build-commands:
|
|
||||||
- install -d /app/lib/KST4Contest /app/bin /app/share/applications
|
|
||||||
- cp -a . /app/lib/KST4Contest/
|
|
||||||
- printf '#!/bin/sh\nexec /app/lib/KST4Contest/bin/KST4Contest "$@"\n' > /app/bin/KST4Contest
|
|
||||||
- chmod 755 /app/bin/KST4Contest
|
|
||||||
- echo '[Desktop Entry]' > /app/share/applications/de.x08.KST4Contest.desktop
|
|
||||||
- echo 'Type=Application' >> /app/share/applications/de.x08.KST4Contest.desktop
|
|
||||||
- echo 'Name=KST4Contest' >> /app/share/applications/de.x08.KST4Contest.desktop
|
|
||||||
- echo 'Comment=ON4KST Chat Client for VHF/UHF contest operation' >> /app/share/applications/de.x08.KST4Contest.desktop
|
|
||||||
- echo 'Exec=KST4Contest' >> /app/share/applications/de.x08.KST4Contest.desktop
|
|
||||||
- echo 'Icon=de.x08.KST4Contest' >> /app/share/applications/de.x08.KST4Contest.desktop
|
|
||||||
- printf 'Categories=Network;HamRadio;\n' >> /app/share/applications/de.x08.KST4Contest.desktop
|
|
||||||
- echo 'Terminal=false' >> /app/share/applications/de.x08.KST4Contest.desktop
|
|
||||||
- test -f /app/lib/KST4Contest/lib/KST4Contest.png && install -Dm644 /app/lib/KST4Contest/lib/KST4Contest.png /app/share/icons/hicolor/256x256/apps/de.x08.KST4Contest.png || true
|
|
||||||
sources:
|
|
||||||
- type: dir
|
|
||||||
path: flatpak-src/KST4Contest
|
|
||||||
EOF
|
|
||||||
|
|
||||||
- name: Import Flatpak signing key
|
|
||||||
run: |
|
|
||||||
echo "${{ secrets.FLATPAK_GPG_PRIVATE_KEY }}" | gpg --batch --import
|
|
||||||
FLATPAK_GPG_KEY_ID=$(gpg --list-secret-keys --with-colons | awk -F: '/^fpr/{print $10; exit}')
|
|
||||||
echo "FLATPAK_GPG_KEY_ID=$FLATPAK_GPG_KEY_ID" >> "$GITHUB_ENV"
|
|
||||||
|
|
||||||
- name: Build Flatpak repo
|
|
||||||
run: |
|
|
||||||
flatpak-builder --force-clean target/flatpak-build target/de.x08.KST4Contest.yml
|
|
||||||
flatpak build-export --gpg-sign="$FLATPAK_GPG_KEY_ID" target/flatpak-repo target/flatpak-build stable
|
|
||||||
flatpak build-update-repo --gpg-sign="$FLATPAK_GPG_KEY_ID" target/flatpak-repo
|
|
||||||
|
|
||||||
- name: Create flatpakref
|
|
||||||
run: |
|
|
||||||
REPO_NAME="${GITHUB_REPOSITORY#*/}"
|
|
||||||
PAGES_URL="https://${GITHUB_REPOSITORY_OWNER}.github.io/${REPO_NAME}/"
|
|
||||||
GPG_KEY_B64=$(gpg --export "$FLATPAK_GPG_KEY_ID" | base64 -w 0)
|
|
||||||
cat > "dist/de.x08.KST4Contest.flatpakref" << EOF
|
|
||||||
[Flatpak Ref]
|
|
||||||
Name=de.x08.KST4Contest
|
|
||||||
Branch=stable
|
|
||||||
Title=KST4Contest – ON4KST Chat Client
|
|
||||||
Url=${PAGES_URL}
|
|
||||||
RuntimeRepo=https://flathub.org/repo/flathub.flatpakrepo
|
|
||||||
GPGKey=${GPG_KEY_B64}
|
|
||||||
IsRuntime=false
|
|
||||||
EOF
|
|
||||||
|
|
||||||
- name: Upload flatpakref
|
|
||||||
uses: actions/upload-artifact@v4.3.4
|
|
||||||
with:
|
|
||||||
name: flatpakref
|
|
||||||
path: dist/de.x08.KST4Contest.flatpakref
|
|
||||||
|
|
||||||
- name: Upload Flatpak OSTree repo
|
|
||||||
uses: actions/upload-artifact@v4.3.4
|
|
||||||
with:
|
|
||||||
name: flatpak-ostree-repo
|
|
||||||
path: target/flatpak-repo/
|
|
||||||
|
|
||||||
build-macos-dmg:
|
build-macos-dmg:
|
||||||
name: Build macOS DMG (${{ matrix.os }})
|
name: Build macOS DMG (${{ matrix.os }})
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
@@ -575,47 +267,14 @@ jobs:
|
|||||||
name: docs-pdf
|
name: docs-pdf
|
||||||
path: dist/KST4Contest-${{ github.ref_name }}-manual-*.pdf
|
path: dist/KST4Contest-${{ github.ref_name }}-manual-*.pdf
|
||||||
|
|
||||||
publish-flatpak-repo:
|
|
||||||
name: Publish Flatpak OSTree Repo to GitHub Pages
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
needs: build-flatpak
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Download OSTree repo artifact
|
|
||||||
uses: actions/download-artifact@v4.1.3
|
|
||||||
with:
|
|
||||||
name: flatpak-ostree-repo
|
|
||||||
path: flatpak-ostree-repo/
|
|
||||||
|
|
||||||
- name: Download flatpakref
|
|
||||||
uses: actions/download-artifact@v4.1.3
|
|
||||||
with:
|
|
||||||
name: flatpakref
|
|
||||||
path: flatpak-ostree-repo/
|
|
||||||
|
|
||||||
- name: Push to flatpak-repo branch
|
|
||||||
run: |
|
|
||||||
cd flatpak-ostree-repo
|
|
||||||
git init
|
|
||||||
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
|
|
||||||
git config user.name "github-actions[bot]"
|
|
||||||
git add -A
|
|
||||||
git commit -m "Flatpak repo: ${{ github.ref_name }}"
|
|
||||||
git push --force https://x-access-token:${{ secrets.GITHUB_TOKEN }}@github.com/${{ github.repository }}.git HEAD:flatpak-repo
|
|
||||||
|
|
||||||
release-tag:
|
release-tag:
|
||||||
name: Publish Tagged Release
|
name: Publish Tagged Release
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
needs:
|
needs:
|
||||||
- build-windows-zip
|
- build-windows-zip
|
||||||
- build-linux-appimage
|
- build-linux-appimage
|
||||||
- build-linux-deb
|
|
||||||
- build-linux-rpm
|
|
||||||
- build-linux-arch
|
|
||||||
- build-macos-dmg
|
- build-macos-dmg
|
||||||
- build-flatpak
|
|
||||||
- build-docs-pdf
|
- build-docs-pdf
|
||||||
- publish-flatpak-repo
|
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Download Windows artifact
|
- name: Download Windows artifact
|
||||||
@@ -637,30 +296,6 @@ jobs:
|
|||||||
merge-multiple: true
|
merge-multiple: true
|
||||||
path: release-assets/macos
|
path: release-assets/macos
|
||||||
|
|
||||||
- name: Download Debian artifact
|
|
||||||
uses: actions/download-artifact@v4.1.3
|
|
||||||
with:
|
|
||||||
name: linux-debian
|
|
||||||
path: release-assets/debian
|
|
||||||
|
|
||||||
- name: Download Fedora artifact
|
|
||||||
uses: actions/download-artifact@v4.1.3
|
|
||||||
with:
|
|
||||||
name: linux-fedora
|
|
||||||
path: release-assets/fedora
|
|
||||||
|
|
||||||
- name: Download Arch Linux artifact
|
|
||||||
uses: actions/download-artifact@v4.1.3
|
|
||||||
with:
|
|
||||||
name: linux-arch
|
|
||||||
path: release-assets/archlinux
|
|
||||||
|
|
||||||
- name: Download flatpakref
|
|
||||||
uses: actions/download-artifact@v4.1.3
|
|
||||||
with:
|
|
||||||
name: flatpakref
|
|
||||||
path: release-assets/flatpakref
|
|
||||||
|
|
||||||
- name: Download PDF manuals
|
- name: Download PDF manuals
|
||||||
uses: actions/download-artifact@v4.1.3
|
uses: actions/download-artifact@v4.1.3
|
||||||
with:
|
with:
|
||||||
@@ -681,10 +316,6 @@ jobs:
|
|||||||
artifacts: >-
|
artifacts: >-
|
||||||
release-assets/windows/praktiKST-${{ github.ref_name }}-windows-x64.zip,
|
release-assets/windows/praktiKST-${{ github.ref_name }}-windows-x64.zip,
|
||||||
release-assets/linux/KST4Contest-${{ github.ref_name }}-linux-x86_64.AppImage,
|
release-assets/linux/KST4Contest-${{ github.ref_name }}-linux-x86_64.AppImage,
|
||||||
release-assets/debian/KST4Contest-${{ github.ref_name }}-debian-amd64.deb,
|
|
||||||
release-assets/fedora/KST4Contest-${{ github.ref_name }}-fedora-x86_64.rpm,
|
|
||||||
release-assets/archlinux/KST4Contest-${{ github.ref_name }}-archlinux-*.pkg.tar.zst,
|
|
||||||
release-assets/flatpakref/de.x08.KST4Contest.flatpakref,
|
|
||||||
release-assets/macos/KST4Contest-${{ github.ref_name }}-macos-*.dmg,
|
release-assets/macos/KST4Contest-${{ github.ref_name }}-macos-*.dmg,
|
||||||
release-assets/docs/KST4Contest-${{ github.ref_name }}-manual-en.pdf,
|
release-assets/docs/KST4Contest-${{ github.ref_name }}-manual-en.pdf,
|
||||||
release-assets/docs/KST4Contest-${{ github.ref_name }}-manual-de.pdf
|
release-assets/docs/KST4Contest-${{ github.ref_name }}-manual-de.pdf
|
||||||
|
|||||||
@@ -0,0 +1,2 @@
|
|||||||
|
dr2x
|
||||||
|
oe3cin
|
||||||
+15832
File diff suppressed because it is too large
Load Diff
@@ -44,17 +44,6 @@ Der ON4KST-Chat ist der De-facto-Standard für Skeds auf den 144-MHz-und-höher-
|
|||||||
- **GitHub**: https://github.com/praktimarc/kst4contest
|
- **GitHub**: https://github.com/praktimarc/kst4contest
|
||||||
- **Download**: https://github.com/praktimarc/kst4contest/releases/latest
|
- **Download**: https://github.com/praktimarc/kst4contest/releases/latest
|
||||||
|
|
||||||
### Fehler melden (Issue erstellen)
|
|
||||||
|
|
||||||
Beim Melden eines Fehlers bitte **immer die Logdatei anhängen**. KST4Contest schreibt automatisch eine Fehler-Logdatei (nur Fehlermeldungen, keine persönlichen Daten):
|
|
||||||
|
|
||||||
| Betriebssystem | Pfad zur Logdatei |
|
|
||||||
|---|---|
|
|
||||||
| Linux / macOS | `~/.praktiKST/kst4contest-errors.log` |
|
|
||||||
| Windows | `C:\Users\<Benutzername>\.praktiKST\kst4contest-errors.log` |
|
|
||||||
|
|
||||||
Beim Erstellen eines Issues auf GitHub steht eine Vorlage bereit, die alle wichtigen Felder abfragt.
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Danksagungen
|
## Danksagungen
|
||||||
|
|||||||
@@ -42,19 +42,11 @@ Der Dateiname hat das Format `praktiKST-v<Versionsnummer>-windows-x64.zip `.
|
|||||||
|
|
||||||
### Linux
|
### Linux
|
||||||
|
|
||||||
Mehrere Paketformate stehen auf der Releases-Seite zur Verfügung:
|
Die aktuelle Version kann als AppImage heruntergeladen werden:
|
||||||
|
|
||||||
**https://github.com/praktimarc/kst4contest/releases/latest**
|
**https://github.com/praktimarc/kst4contest/releases/latest**
|
||||||
|
|
||||||
| Format | Dateiname | Geeignet für |
|
Der Dateiname hat das Format `KST4Contest-v<Versionsnummer>-linux-x86_64.AppImage`.
|
||||||
|---|---|---|
|
|
||||||
| AppImage | `KST4Contest-v<Version>-linux-x86_64.AppImage` | Alle Distributionen |
|
|
||||||
| Debian-Paket | `KST4Contest-v<Version>-debian-amd64.deb` | Debian, Ubuntu, Linux Mint, … |
|
|
||||||
| RPM-Paket | `KST4Contest-v<Version>-fedora-x86_64.rpm` | Fedora, RHEL, openSUSE, … |
|
|
||||||
| Arch-Paket | `KST4Contest-v<Version>-archlinux-x86_64.pkg.tar.zst` | Arch Linux, Manjaro, … |
|
|
||||||
| Flatpak | `de.x08.KST4Contest.flatpakref` | Alle Distributionen mit Flatpak |
|
|
||||||
|
|
||||||
> **Empfehlung für Linux:** Die Flatpak-Installation ist der einfachste Weg, immer aktuell zu bleiben – `flatpak update` erledigt alle zukünftigen Updates automatisch. Das Repository ist GPG-signiert.
|
|
||||||
|
|
||||||
### macOS
|
### macOS
|
||||||
|
|
||||||
@@ -80,47 +72,12 @@ Der Dateiname hat das Format `KST4Contest-v<Versionsnummer>-macos-<Architektur>.
|
|||||||
Die Einstellungen werden unter `%USERPROFILE%\.praktikst\preferences.xml` gespeichert.
|
Die Einstellungen werden unter `%USERPROFILE%\.praktikst\preferences.xml` gespeichert.
|
||||||
|
|
||||||
### Linux
|
### Linux
|
||||||
|
|
||||||
Die Einstellungen werden immer unter `~/.praktikst/preferences.xml` gespeichert.
|
|
||||||
|
|
||||||
#### AppImage
|
|
||||||
|
|
||||||
1. AppImage herunterladen.
|
1. AppImage herunterladen.
|
||||||
2. Ausführbar machen: `chmod +x KST4Contest-v<Version>-linux-x86_64.AppImage`
|
2. AppImage in gewünschten Ordner entpacken.
|
||||||
3. Starten.
|
3. AppImage ausführbar machen (geht im Terminal mit `chmod +x KST4Contest-v<Versionsnummer>-linux-x86_64.AppImage`)
|
||||||
|
4. AppImage ausführen.
|
||||||
|
|
||||||
#### Debian / Ubuntu
|
Die Einstellungen werden unter `~/.praktikst/preferences.xml` gespeichert.
|
||||||
|
|
||||||
```bash
|
|
||||||
sudo apt install ./KST4Contest-v<Version>-debian-amd64.deb
|
|
||||||
```
|
|
||||||
|
|
||||||
Oder die `.deb`-Datei im Dateimanager doppelklicken.
|
|
||||||
|
|
||||||
#### Fedora / RHEL
|
|
||||||
|
|
||||||
```bash
|
|
||||||
sudo dnf install ./KST4Contest-v<Version>-fedora-x86_64.rpm
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Arch Linux
|
|
||||||
|
|
||||||
```bash
|
|
||||||
sudo pacman -U KST4Contest-v<Version>-archlinux-x86_64.pkg.tar.zst
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Flatpak
|
|
||||||
|
|
||||||
Die Datei `de.x08.KST4Contest.flatpakref` aus dem [aktuellen Release](https://github.com/praktimarc/kst4contest/releases/latest) herunterladen und öffnen, oder:
|
|
||||||
```bash
|
|
||||||
flatpak install de.x08.KST4Contest.flatpakref
|
|
||||||
```
|
|
||||||
|
|
||||||
Oder den Remote manuell hinzufügen:
|
|
||||||
```bash
|
|
||||||
flatpak remote-add kst4contest https://praktimarc.github.io/kst4contest/
|
|
||||||
flatpak install kst4contest de.x08.KST4Contest
|
|
||||||
```
|
|
||||||
|
|
||||||
### macOS
|
### macOS
|
||||||
1. DMG-Datei für die eigene Architektur herunterladen (Apple Silicon oder Intel).
|
1. DMG-Datei für die eigene Architektur herunterladen (Apple Silicon oder Intel).
|
||||||
@@ -157,11 +114,10 @@ Die Einstellungsdatei (`preferences.xml`) bleibt erhalten, da sie im Benutzerord
|
|||||||
|
|
||||||
#### Linux
|
#### Linux
|
||||||
|
|
||||||
- **AppImage**: Neues AppImage herunterladen, ausführbar machen (`chmod +x`), altes optional löschen.
|
Derzeit folgendermaßen:
|
||||||
- **Debian/Ubuntu**: `sudo apt install ./KST4Contest-v<Version>-debian-amd64.deb`
|
1. neues AppImage herunterladen
|
||||||
- **Fedora/RHEL**: `sudo dnf upgrade ./KST4Contest-v<Version>-fedora-x86_64.rpm`
|
2. neues AppImage ausführbar makieren
|
||||||
- **Arch Linux**: `sudo pacman -U KST4Contest-v<Version>-archlinux-x86_64.pkg.tar.zst`
|
3. (optional) altes AppImage löschen.
|
||||||
- **Flatpak (Repository)**: `flatpak update` – aktualisiert alle Flatpak-Apps einschließlich KST4Contest.
|
|
||||||
|
|
||||||
#### macOS
|
#### macOS
|
||||||
|
|
||||||
|
|||||||
@@ -44,17 +44,6 @@ The ON4KST Chat is the de-facto standard for skeds on the 144 MHz and higher ban
|
|||||||
- **GitHub**: https://github.com/praktimarc/kst4contest
|
- **GitHub**: https://github.com/praktimarc/kst4contest
|
||||||
- **Download**: https://github.com/praktimarc/kst4contest/releases/latest
|
- **Download**: https://github.com/praktimarc/kst4contest/releases/latest
|
||||||
|
|
||||||
### Reporting a bug (creating an issue)
|
|
||||||
|
|
||||||
When reporting a bug, please **always attach the log file**. KST4Contest automatically writes an error log (error messages only, no personal data):
|
|
||||||
|
|
||||||
| Operating system | Log file location |
|
|
||||||
|---|---|
|
|
||||||
| Linux / macOS | `~/.praktiKST/kst4contest-errors.log` |
|
|
||||||
| Windows | `C:\Users\<YourName>\.praktiKST\kst4contest-errors.log` |
|
|
||||||
|
|
||||||
When opening an issue on GitHub, a template is provided that guides you through all relevant fields.
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Acknowledgements
|
## Acknowledgements
|
||||||
|
|||||||
@@ -42,19 +42,11 @@ The filename has the format `praktiKST-v<version_number>-windows-x64.zip`.
|
|||||||
|
|
||||||
### Linux
|
### Linux
|
||||||
|
|
||||||
Multiple package formats are available from the releases page:
|
The latest version can be downloaded as an AppImage:
|
||||||
|
|
||||||
**https://github.com/praktimarc/kst4contest/releases/latest**
|
**https://github.com/praktimarc/kst4contest/releases/latest**
|
||||||
|
|
||||||
| Format | Filename | Suitable for |
|
The filename has the format `KST4Contest-v<version_number>-linux-x86_64.AppImage`.
|
||||||
|---|---|---|
|
|
||||||
| AppImage | `KST4Contest-v<version>-linux-x86_64.AppImage` | All distributions |
|
|
||||||
| Debian package | `KST4Contest-v<version>-debian-amd64.deb` | Debian, Ubuntu, Linux Mint, … |
|
|
||||||
| RPM package | `KST4Contest-v<version>-fedora-x86_64.rpm` | Fedora, RHEL, openSUSE, … |
|
|
||||||
| Arch package | `KST4Contest-v<version>-archlinux-x86_64.pkg.tar.zst` | Arch Linux, Manjaro, … |
|
|
||||||
| Flatpak | `de.x08.KST4Contest.flatpakref` | All distributions with Flatpak |
|
|
||||||
|
|
||||||
> **Recommended for Linux:** The Flatpak installation is the easiest way to stay up to date — `flatpak update` handles all future updates automatically. The repository is GPG-signed for security.
|
|
||||||
|
|
||||||
### macOS
|
### macOS
|
||||||
|
|
||||||
@@ -80,47 +72,12 @@ The filename has the format `KST4Contest-v<version_number>-macos-<arch>.dmg`, wh
|
|||||||
Settings are stored at `%USERPROFILE%\.praktikst\preferences.xml`.
|
Settings are stored at `%USERPROFILE%\.praktikst\preferences.xml`.
|
||||||
|
|
||||||
### Linux
|
### Linux
|
||||||
|
|
||||||
Settings are always stored at `~/.praktikst/preferences.xml`.
|
|
||||||
|
|
||||||
#### AppImage
|
|
||||||
|
|
||||||
1. Download the AppImage.
|
1. Download the AppImage.
|
||||||
2. Make it executable: `chmod +x KST4Contest-v<version>-linux-x86_64.AppImage`
|
2. Unzip the AppImage into a folder of your choice.
|
||||||
3. Run it.
|
3. Make the AppImage executable (in the terminal with `chmod +x KST4Contest-v<version_number>-linux-x86_64.AppImage`)
|
||||||
|
4. Run the AppImage.
|
||||||
|
|
||||||
#### Debian / Ubuntu
|
Settings are stored at `~/.praktikst/preferences.xml`.
|
||||||
|
|
||||||
```bash
|
|
||||||
sudo apt install ./KST4Contest-v<version>-debian-amd64.deb
|
|
||||||
```
|
|
||||||
|
|
||||||
Or double-click the `.deb` file in your file manager.
|
|
||||||
|
|
||||||
#### Fedora / RHEL
|
|
||||||
|
|
||||||
```bash
|
|
||||||
sudo dnf install ./KST4Contest-v<version>-fedora-x86_64.rpm
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Arch Linux
|
|
||||||
|
|
||||||
```bash
|
|
||||||
sudo pacman -U KST4Contest-v<version>-archlinux-x86_64.pkg.tar.zst
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Flatpak
|
|
||||||
|
|
||||||
Download `de.x08.KST4Contest.flatpakref` from the [latest release](https://github.com/praktimarc/kst4contest/releases/latest) and open it, or run:
|
|
||||||
```bash
|
|
||||||
flatpak install de.x08.KST4Contest.flatpakref
|
|
||||||
```
|
|
||||||
|
|
||||||
Or add the remote manually:
|
|
||||||
```bash
|
|
||||||
flatpak remote-add kst4contest https://praktimarc.github.io/kst4contest/
|
|
||||||
flatpak install kst4contest de.x08.KST4Contest
|
|
||||||
```
|
|
||||||
|
|
||||||
### macOS
|
### macOS
|
||||||
1. Download the DMG file for your architecture (Apple Silicon or Intel).
|
1. Download the DMG file for your architecture (Apple Silicon or Intel).
|
||||||
@@ -157,11 +114,10 @@ The settings file (`preferences.xml`) is preserved because it is stored in the u
|
|||||||
|
|
||||||
#### Linux
|
#### Linux
|
||||||
|
|
||||||
- **AppImage**: Download the new AppImage, make it executable (`chmod +x`), optionally delete the old one.
|
Currently as follows:
|
||||||
- **Debian/Ubuntu**: `sudo apt install ./KST4Contest-v<version>-debian-amd64.deb`
|
1. Download the new AppImage
|
||||||
- **Fedora/RHEL**: `sudo dnf upgrade ./KST4Contest-v<version>-fedora-x86_64.rpm`
|
2. Mark the new AppImage as executable
|
||||||
- **Arch Linux**: `sudo pacman -U KST4Contest-v<version>-archlinux-x86_64.pkg.tar.zst`
|
3. (optional) Delete the old AppImage.
|
||||||
- **Flatpak (repository)**: `flatpak update` – updates all Flatpak apps including KST4Contest.
|
|
||||||
|
|
||||||
#### macOS
|
#### macOS
|
||||||
|
|
||||||
|
|||||||
+6
-9
@@ -9,8 +9,6 @@ import java.net.NoRouteToHostException;
|
|||||||
import java.net.SocketException;
|
import java.net.SocketException;
|
||||||
import java.net.UnknownHostException;
|
import java.net.UnknownHostException;
|
||||||
import java.util.TimerTask;
|
import java.util.TimerTask;
|
||||||
import java.util.logging.Level;
|
|
||||||
import java.util.logging.Logger;
|
|
||||||
|
|
||||||
import javafx.collections.ObservableList;
|
import javafx.collections.ObservableList;
|
||||||
import kst4contest.locatorUtils.Location;
|
import kst4contest.locatorUtils.Location;
|
||||||
@@ -19,7 +17,6 @@ import kst4contest.model.ChatMember;
|
|||||||
|
|
||||||
public class AirScoutPeriodicalAPReflectionInquirerTask extends TimerTask {
|
public class AirScoutPeriodicalAPReflectionInquirerTask extends TimerTask {
|
||||||
|
|
||||||
private static final Logger LOGGER = Logger.getLogger(AirScoutPeriodicalAPReflectionInquirerTask.class.getName());
|
|
||||||
private ChatController client;
|
private ChatController client;
|
||||||
|
|
||||||
public AirScoutPeriodicalAPReflectionInquirerTask(ChatController client) {
|
public AirScoutPeriodicalAPReflectionInquirerTask(ChatController client) {
|
||||||
@@ -58,7 +55,7 @@ public class AirScoutPeriodicalAPReflectionInquirerTask extends TimerTask {
|
|||||||
ownCallSign = this.client.getChatPreferences().getStn_loginCallSign();
|
ownCallSign = this.client.getChatPreferences().getStn_loginCallSign();
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
LOGGER.log(Level.SEVERE, "[ASPERIODICAL] Error parsing callsign", e);
|
System.out.println("[ASPERIODICAL, Error]: " + e.getMessage());
|
||||||
}
|
}
|
||||||
String myCallAndMyLocString = ownCallSign + "," + this.client.getChatPreferences().getStn_loginLocatorMainCat(); //bugfix, Airscout do not process 9A1W-2 but 9A1W like formatted calls
|
String myCallAndMyLocString = ownCallSign + "," + this.client.getChatPreferences().getStn_loginLocatorMainCat(); //bugfix, Airscout do not process 9A1W-2 but 9A1W like formatted calls
|
||||||
|
|
||||||
@@ -108,13 +105,13 @@ public class AirScoutPeriodicalAPReflectionInquirerTask extends TimerTask {
|
|||||||
dsocket.send(packet);
|
dsocket.send(packet);
|
||||||
dsocket.close();
|
dsocket.close();
|
||||||
} catch (UnknownHostException e1) {
|
} catch (UnknownHostException e1) {
|
||||||
LOGGER.log(Level.SEVERE, "[ASPERIODICAL] Unknown host", e1);
|
e1.printStackTrace();
|
||||||
} catch (NoRouteToHostException e) {
|
} catch (NoRouteToHostException e) {
|
||||||
LOGGER.log(Level.SEVERE, "[ASPERIODICAL] No route to host", e);
|
e.printStackTrace();
|
||||||
} catch (SocketException e) {
|
} catch (SocketException e) {
|
||||||
LOGGER.log(Level.SEVERE, "[ASPERIODICAL] Socket error", e);
|
e.printStackTrace();
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
LOGGER.log(Level.SEVERE, "[ASPERIODICAL] IO error sending query", e);
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
// System.out.println("[ASUDPTask, info:] sent query " + queryStringToAirScout);
|
// System.out.println("[ASUDPTask, info:] sent query " + queryStringToAirScout);
|
||||||
|
|
||||||
@@ -139,7 +136,7 @@ public class AirScoutPeriodicalAPReflectionInquirerTask extends TimerTask {
|
|||||||
dsocket.send(packet);
|
dsocket.send(packet);
|
||||||
dsocket.close();
|
dsocket.close();
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
LOGGER.log(Level.SEVERE, "[ASPERIODICAL] IO error sending watchlist", e);
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
|
||||||
// System.out.println("[ASUDPTask, info:] set watchlist: " + asWatchListStringSuffix);
|
// System.out.println("[ASUDPTask, info:] set watchlist: " + asWatchListStringSuffix);
|
||||||
|
|||||||
@@ -23,7 +23,6 @@ import kst4contest.locatorUtils.DirectionUtils;
|
|||||||
import kst4contest.logic.PriorityCalculator;
|
import kst4contest.logic.PriorityCalculator;
|
||||||
import kst4contest.model.*;
|
import kst4contest.model.*;
|
||||||
import kst4contest.test.MockKstServer;
|
import kst4contest.test.MockKstServer;
|
||||||
import kst4contest.utils.BoundedDequeObservableList;
|
|
||||||
import kst4contest.utils.PlayAudioUtils;
|
import kst4contest.utils.PlayAudioUtils;
|
||||||
import kst4contest.view.Kst4ContestApplication;
|
import kst4contest.view.Kst4ContestApplication;
|
||||||
|
|
||||||
@@ -1094,8 +1093,7 @@ public class ChatController implements ThreadStatusCallback, PstRotatorEventList
|
|||||||
// ******All abstract types below here are used by the messageprocessor!
|
// ******All abstract types below here are used by the messageprocessor!
|
||||||
// ***************
|
// ***************
|
||||||
|
|
||||||
private static final int MAX_CHAT_MESSAGES = 10000;
|
private ObservableList<ChatMessage> lst_globalChatMessageList = FXCollections.observableArrayList(); //All chatmessages will be put in there, later create filtered message lists
|
||||||
private final BoundedDequeObservableList<ChatMessage> lst_globalChatMessageList = new BoundedDequeObservableList<>(MAX_CHAT_MESSAGES); //All chatmessages will be put in there, later create filtered message lists
|
|
||||||
// private ObservableList<ChatMessage> lst_toAllMessageList = FXCollections.observableArrayList(); // directed to all
|
// private ObservableList<ChatMessage> lst_toAllMessageList = FXCollections.observableArrayList(); // directed to all
|
||||||
// (beacon)
|
// (beacon)
|
||||||
private FilteredList<ChatMessage> lst_toAllMessageList = new FilteredList<>(lst_globalChatMessageList); // directed to all
|
private FilteredList<ChatMessage> lst_toAllMessageList = new FilteredList<>(lst_globalChatMessageList); // directed to all
|
||||||
@@ -1240,14 +1238,13 @@ public class ChatController implements ThreadStatusCallback, PstRotatorEventList
|
|||||||
this.lst_selectedCallSignInfofilteredMessageList = lst_selectedCallSignInfofilteredMessageList;
|
this.lst_selectedCallSignInfofilteredMessageList = lst_selectedCallSignInfofilteredMessageList;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addChatMessage(ChatMessage message) {
|
|
||||||
lst_globalChatMessageList.addFirst(message);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ObservableList<ChatMessage> getLst_globalChatMessageList() {
|
public ObservableList<ChatMessage> getLst_globalChatMessageList() {
|
||||||
return lst_globalChatMessageList;
|
return lst_globalChatMessageList;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setLst_globalChatMessageList(ObservableList<ChatMessage> lst_globalChatMessageList) {
|
||||||
|
this.lst_globalChatMessageList = lst_globalChatMessageList;
|
||||||
|
}
|
||||||
|
|
||||||
public String getHostname() {
|
public String getHostname() {
|
||||||
return hostname;
|
return hostname;
|
||||||
|
|||||||
@@ -10,12 +10,9 @@ import java.net.Socket;
|
|||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.concurrent.ExecutorService;
|
import java.util.concurrent.ExecutorService;
|
||||||
import java.util.concurrent.Executors;
|
import java.util.concurrent.Executors;
|
||||||
import java.util.logging.Level;
|
|
||||||
import java.util.logging.Logger;
|
|
||||||
|
|
||||||
public class DXClusterThreadPooledServer implements Runnable{
|
public class DXClusterThreadPooledServer implements Runnable{
|
||||||
|
|
||||||
private static final Logger LOGGER = Logger.getLogger(DXClusterThreadPooledServer.class.getName());
|
|
||||||
private List<Socket> clientSockets = Collections.synchronizedList(new ArrayList<>()); //list of all connected clients
|
private List<Socket> clientSockets = Collections.synchronizedList(new ArrayList<>()); //list of all connected clients
|
||||||
|
|
||||||
private ThreadStatusCallback callBackToController;
|
private ThreadStatusCallback callBackToController;
|
||||||
@@ -114,7 +111,8 @@ public class DXClusterThreadPooledServer implements Runnable{
|
|||||||
System.out.println("-------------> ORIGINALEE VAL: " + aChatMember.getFrequency().getValue());
|
System.out.println("-------------> ORIGINALEE VAL: " + aChatMember.getFrequency().getValue());
|
||||||
System.out.println("-------------> NORMALIZED VAL: " + Utils4KST.normalizeFrequencyString(aChatMember.getFrequency().getValue(), chatController.getChatPreferences().getNotify_optionalFrequencyPrefix()) + " ");
|
System.out.println("-------------> NORMALIZED VAL: " + Utils4KST.normalizeFrequencyString(aChatMember.getFrequency().getValue(), chatController.getChatPreferences().getNotify_optionalFrequencyPrefix()) + " ");
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
LOGGER.log(Level.SEVERE, "DXCThPooledServer: Error accessing value in chatmember object", e);
|
System.out.println("DXCThPooledServer: Error accessing value in chatmember object: " + e.getMessage());
|
||||||
|
// e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
|
||||||
for (Socket socket : clientSockets) {
|
for (Socket socket : clientSockets) {
|
||||||
@@ -148,7 +146,8 @@ public class DXClusterThreadPooledServer implements Runnable{
|
|||||||
callBackToController.onThreadStatus(ThreadNickName,threadStateMessage);
|
callBackToController.onThreadStatus(ThreadNickName,threadStateMessage);
|
||||||
|
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
LOGGER.log(Level.SEVERE, "[DXClusterSrvr] broadcasting DXC-message to clients went wrong", e);
|
e.printStackTrace();
|
||||||
|
System.out.println("[DXClusterSrvr, Error:] broadcasting DXC-message to clients went wrong!");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -160,7 +159,6 @@ public class DXClusterThreadPooledServer implements Runnable{
|
|||||||
|
|
||||||
class DXClusterServerWorkerRunnable implements Runnable{
|
class DXClusterServerWorkerRunnable implements Runnable{
|
||||||
|
|
||||||
private static final Logger LOGGER = Logger.getLogger(DXClusterServerWorkerRunnable.class.getName());
|
|
||||||
protected Socket clientSocket = null;
|
protected Socket clientSocket = null;
|
||||||
protected String serverText = null;
|
protected String serverText = null;
|
||||||
private ChatController client = null;
|
private ChatController client = null;
|
||||||
@@ -199,13 +197,14 @@ class DXClusterServerWorkerRunnable implements Runnable{
|
|||||||
output.write(("\r\n").getBytes());
|
output.write(("\r\n").getBytes());
|
||||||
|
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
LOGGER.log(Level.SEVERE, "[DXClusterSrvr] keep-alive broadcast to client failed", e);
|
e.printStackTrace();
|
||||||
|
System.out.println("[DXClusterSrvr, Error:] broadcasting DXC-message to clients went wrong!");
|
||||||
dXCkeepAliveTimer.purge();
|
dXCkeepAliveTimer.purge();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
socket.close();
|
socket.close();
|
||||||
} catch (IOException ex) {
|
} catch (IOException ex) {
|
||||||
LOGGER.log(Level.SEVERE, "[DXClusterSrvr] error closing client socket", ex);
|
ex.printStackTrace();
|
||||||
}
|
}
|
||||||
finally {
|
finally {
|
||||||
this.cancel();
|
this.cancel();
|
||||||
@@ -225,7 +224,7 @@ class DXClusterServerWorkerRunnable implements Runnable{
|
|||||||
System.out.println("[DXClusterThreadPooledServer, Info:] New cluster client connected! "); //TODO: maybe integrate non blocking reader for client identification
|
System.out.println("[DXClusterThreadPooledServer, Info:] New cluster client connected! "); //TODO: maybe integrate non blocking reader for client identification
|
||||||
|
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
LOGGER.log(Level.SEVERE, "[DXClusterSrvr] error in worker runnable", e);
|
e.printStackTrace();
|
||||||
} finally {
|
} finally {
|
||||||
synchronized(dxClusterClientSocketsConnectedList) {
|
synchronized(dxClusterClientSocketsConnectedList) {
|
||||||
dxClusterClientSocketsConnectedList.remove(clientSocket); // Entferne den Client nach Verarbeitung
|
dxClusterClientSocketsConnectedList.remove(clientSocket); // Entferne den Client nach Verarbeitung
|
||||||
|
|||||||
@@ -2,8 +2,6 @@ package kst4contest.controller;
|
|||||||
|
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
import java.net.*;
|
import java.net.*;
|
||||||
import java.util.logging.Level;
|
|
||||||
import java.util.logging.Logger;
|
|
||||||
|
|
||||||
import kst4contest.model.ChatMessage;
|
import kst4contest.model.ChatMessage;
|
||||||
|
|
||||||
@@ -15,7 +13,6 @@ import kst4contest.model.ChatMessage;
|
|||||||
* No need for it as it´s not longer a console application
|
* No need for it as it´s not longer a console application
|
||||||
*/
|
*/
|
||||||
public class InputReaderThread extends Thread {
|
public class InputReaderThread extends Thread {
|
||||||
private static final Logger LOGGER = Logger.getLogger(InputReaderThread.class.getName());
|
|
||||||
private PrintWriter writer;
|
private PrintWriter writer;
|
||||||
private Socket socket;
|
private Socket socket;
|
||||||
private ChatController client;
|
private ChatController client;
|
||||||
@@ -42,7 +39,8 @@ public class InputReaderThread extends Thread {
|
|||||||
try {
|
try {
|
||||||
sendThisMessage23001 = reader.readLine();
|
sendThisMessage23001 = reader.readLine();
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
LOGGER.log(Level.SEVERE, "Error reading from stdin", e);
|
// TODO Auto-generated catch block
|
||||||
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
|
||||||
ownMSG.setMessageText("MSG|" + this.client.getChatCategoryMain().getCategoryNumber() + "|0|" + sendThisMessage23001 + "|0|");
|
ownMSG.setMessageText("MSG|" + this.client.getChatCategoryMain().getCategoryNumber() + "|0|" + sendThisMessage23001 + "|0|");
|
||||||
@@ -55,8 +53,8 @@ public class InputReaderThread extends Thread {
|
|||||||
try {
|
try {
|
||||||
this.sleep(500);
|
this.sleep(500);
|
||||||
} catch (InterruptedException e) {
|
} catch (InterruptedException e) {
|
||||||
LOGGER.log(Level.SEVERE, "InputReaderThread interrupted", e);
|
// TODO Auto-generated catch block
|
||||||
Thread.currentThread().interrupt();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -772,7 +772,7 @@ public class MessageBusManagementThread extends Thread {
|
|||||||
dummy.setCallSign("ALL");
|
dummy.setCallSign("ALL");
|
||||||
newMessageArrived.setReceiver(dummy);
|
newMessageArrived.setReceiver(dummy);
|
||||||
|
|
||||||
this.client.addChatMessage(newMessageArrived); // sdtout to all message-List
|
this.client.getLst_globalChatMessageList().add(0, newMessageArrived); // sdtout to all message-List
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
//message is directed to another chatmember, process as such!
|
//message is directed to another chatmember, process as such!
|
||||||
@@ -817,7 +817,7 @@ public class MessageBusManagementThread extends Thread {
|
|||||||
if (newMessageArrived.getReceiver().getCallSign()
|
if (newMessageArrived.getReceiver().getCallSign()
|
||||||
.equals(this.client.getChatPreferences().getStn_loginCallSign())) {
|
.equals(this.client.getChatPreferences().getStn_loginCallSign())) {
|
||||||
|
|
||||||
this.client.addChatMessage(newMessageArrived);
|
this.client.getLst_globalChatMessageList().add(0, newMessageArrived);
|
||||||
|
|
||||||
if (this.client.getChatPreferences().isNotify_playSimpleSounds()) {
|
if (this.client.getChatPreferences().isNotify_playSimpleSounds()) {
|
||||||
this.client.getPlayAudioUtils().playNoiseLauncher('P');
|
this.client.getPlayAudioUtils().playNoiseLauncher('P');
|
||||||
@@ -960,7 +960,7 @@ public class MessageBusManagementThread extends Thread {
|
|||||||
String originalMessage = newMessageArrived.getMessageText();
|
String originalMessage = newMessageArrived.getMessageText();
|
||||||
newMessageArrived
|
newMessageArrived
|
||||||
.setMessageText("(>" + newMessageArrived.getReceiver().getCallSign() + ")" + originalMessage);
|
.setMessageText("(>" + newMessageArrived.getReceiver().getCallSign() + ")" + originalMessage);
|
||||||
this.client.addChatMessage(newMessageArrived);
|
this.client.getLst_globalChatMessageList().add(0,newMessageArrived);
|
||||||
|
|
||||||
// If our message contained a frequency (e.g. "QRG is: 144.375"), record that
|
// If our message contained a frequency (e.g. "QRG is: 144.375"), record that
|
||||||
// WE sent our QRG to this OM – used by SKED frequency resolution.
|
// WE sent our QRG to this OM – used by SKED frequency resolution.
|
||||||
@@ -1031,7 +1031,7 @@ public class MessageBusManagementThread extends Thread {
|
|||||||
newMessageArrived.getSender().setInAngleAndRange(false);
|
newMessageArrived.getSender().setInAngleAndRange(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
this.client.addChatMessage(newMessageArrived);
|
this.client.getLst_globalChatMessageList().add(0, newMessageArrived);
|
||||||
// System.out.println("MSGBS bgfx: tx call = " + newMessageArrived.getSender().getCallSign() + " / rx call = " + newMessageArrived.getReceiver().getCallSign());
|
// System.out.println("MSGBS bgfx: tx call = " + newMessageArrived.getSender().getCallSign() + " / rx call = " + newMessageArrived.getReceiver().getCallSign());
|
||||||
}
|
}
|
||||||
} catch (NullPointerException referenceDeletedByUserLeftChatDuringMessageprocessing) {
|
} catch (NullPointerException referenceDeletedByUserLeftChatDuringMessageprocessing) {
|
||||||
@@ -1371,7 +1371,7 @@ public class MessageBusManagementThread extends Thread {
|
|||||||
dummy.setCallSign("ALL");
|
dummy.setCallSign("ALL");
|
||||||
newMessageArrived.setReceiver(dummy);
|
newMessageArrived.setReceiver(dummy);
|
||||||
|
|
||||||
this.client.addChatMessage(newMessageArrived); // sdtout to all message-List
|
this.client.getLst_globalChatMessageList().add(0, newMessageArrived); // sdtout to all message-List
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
//message is directed to another chatmember, process as such!
|
//message is directed to another chatmember, process as such!
|
||||||
@@ -1415,7 +1415,7 @@ public class MessageBusManagementThread extends Thread {
|
|||||||
if (newMessageArrived.getReceiver().getCallSign()
|
if (newMessageArrived.getReceiver().getCallSign()
|
||||||
.equals(this.client.getChatPreferences().getStn_loginCallSign())) {
|
.equals(this.client.getChatPreferences().getStn_loginCallSign())) {
|
||||||
|
|
||||||
this.client.addChatMessage(newMessageArrived);
|
this.client.getLst_globalChatMessageList().add(0, newMessageArrived);
|
||||||
|
|
||||||
System.out.println("Historic message directed to me: " + newMessageArrived.getReceiver().getCallSign() + ".");
|
System.out.println("Historic message directed to me: " + newMessageArrived.getReceiver().getCallSign() + ".");
|
||||||
|
|
||||||
@@ -1428,7 +1428,7 @@ public class MessageBusManagementThread extends Thread {
|
|||||||
String originalMessage = newMessageArrived.getMessageText();
|
String originalMessage = newMessageArrived.getMessageText();
|
||||||
newMessageArrived
|
newMessageArrived
|
||||||
.setMessageText("(>" + newMessageArrived.getReceiver().getCallSign() + ")" + originalMessage);
|
.setMessageText("(>" + newMessageArrived.getReceiver().getCallSign() + ")" + originalMessage);
|
||||||
this.client.addChatMessage(newMessageArrived);
|
this.client.getLst_globalChatMessageList().add(0,newMessageArrived);
|
||||||
|
|
||||||
// if you sent the message to another station, it will be sorted in to
|
// if you sent the message to another station, it will be sorted in to
|
||||||
// the "to me message list" with modified messagetext, added rxers callsign
|
// the "to me message list" with modified messagetext, added rxers callsign
|
||||||
@@ -1448,7 +1448,7 @@ public class MessageBusManagementThread extends Thread {
|
|||||||
newMessageArrived.getSender().setInAngleAndRange(false);
|
newMessageArrived.getSender().setInAngleAndRange(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
this.client.addChatMessage(newMessageArrived);
|
this.client.getLst_globalChatMessageList().add(0, newMessageArrived);
|
||||||
// System.out.println("MSGBS bgfx: tx call = " + newMessageArrived.getSender().getCallSign() + " / rx call = " + newMessageArrived.getReceiver().getCallSign());
|
// System.out.println("MSGBS bgfx: tx call = " + newMessageArrived.getSender().getCallSign() + " / rx call = " + newMessageArrived.getReceiver().getCallSign());
|
||||||
}
|
}
|
||||||
} catch (NullPointerException referenceDeletedByUserLeftChatDuringMessageprocessing) {
|
} catch (NullPointerException referenceDeletedByUserLeftChatDuringMessageprocessing) {
|
||||||
@@ -1521,7 +1521,7 @@ public class MessageBusManagementThread extends Thread {
|
|||||||
|
|
||||||
|
|
||||||
for (int i = 0; i < 10; i++) {
|
for (int i = 0; i < 10; i++) {
|
||||||
client.addChatMessage(pwErrorMsg);
|
client.getLst_globalChatMessageList().add(pwErrorMsg);
|
||||||
// client.getLst_toMeMessageList().add(pwErrorMsg);
|
// client.getLst_toMeMessageList().add(pwErrorMsg);
|
||||||
// client.getLst_toAllMessageList().add(pwErrorMsg);
|
// client.getLst_toAllMessageList().add(pwErrorMsg);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,8 +3,6 @@ package kst4contest.controller;
|
|||||||
import java.io.*;
|
import java.io.*;
|
||||||
import java.net.*;
|
import java.net.*;
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
import java.util.logging.Level;
|
|
||||||
import java.util.logging.Logger;
|
|
||||||
|
|
||||||
import kst4contest.model.ChatMessage;
|
import kst4contest.model.ChatMessage;
|
||||||
|
|
||||||
@@ -16,7 +14,6 @@ import kst4contest.model.ChatMessage;
|
|||||||
* @author www.codejava.net
|
* @author www.codejava.net
|
||||||
*/
|
*/
|
||||||
public class ReadThread extends Thread {
|
public class ReadThread extends Thread {
|
||||||
private static final Logger LOGGER = Logger.getLogger(ReadThread.class.getName());
|
|
||||||
private BufferedReader reader;
|
private BufferedReader reader;
|
||||||
private Socket socket;
|
private Socket socket;
|
||||||
private ChatController client;
|
private ChatController client;
|
||||||
@@ -46,7 +43,8 @@ public class ReadThread extends Thread {
|
|||||||
reader = new BufferedReader(new InputStreamReader(input, StandardCharsets.UTF_8));
|
reader = new BufferedReader(new InputStreamReader(input, StandardCharsets.UTF_8));
|
||||||
|
|
||||||
} catch (IOException ex) {
|
} catch (IOException ex) {
|
||||||
LOGGER.log(Level.SEVERE, "Error getting input stream", ex);
|
System.out.println("Error getting input stream: " + ex.getMessage());
|
||||||
|
ex.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -84,14 +82,15 @@ public class ReadThread extends Thread {
|
|||||||
|
|
||||||
}
|
}
|
||||||
catch (Exception sexc) {
|
catch (Exception sexc) {
|
||||||
LOGGER.log(Level.SEVERE, "[ReadThread] Socket closed unexpectedly", sexc);
|
System.out.println("[ReadThread, CRITICAL: ] Socket geschlossen: " + sexc.getMessage());
|
||||||
try {
|
try {
|
||||||
this.client.getSocket().close();
|
this.client.getSocket().close();
|
||||||
this.interrupt();
|
this.interrupt();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
LOGGER.log(Level.SEVERE, "[ReadThread] Error closing socket", e);
|
// TODO Auto-generated catch block
|
||||||
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,16 +7,12 @@ import java.io.FileOutputStream;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.util.logging.Level;
|
|
||||||
import java.util.logging.Logger;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This class has utility methods to handle application files inside the home directory.
|
* This class has utility methods to handle application files inside the home directory.
|
||||||
*/
|
*/
|
||||||
public class ApplicationFileUtils {
|
public class ApplicationFileUtils {
|
||||||
|
|
||||||
private static final Logger LOGGER = Logger.getLogger(ApplicationFileUtils.class.getName());
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the path of a file inside the home directory of the user.
|
* Gets the path of a file inside the home directory of the user.
|
||||||
* @param applicationName Name off the application which is used for the hidden directory
|
* @param applicationName Name off the application which is used for the hidden directory
|
||||||
@@ -65,7 +61,8 @@ public class ApplicationFileUtils {
|
|||||||
|
|
||||||
resourceStream.transferTo(fileOutputStream);
|
resourceStream.transferTo(fileOutputStream);
|
||||||
} catch (IOException ex) {
|
} catch (IOException ex) {
|
||||||
LOGGER.log(Level.SEVERE, "Exception when copying Application file: " + ex.getMessage(), ex);
|
System.err.println("Exception when copying Application file: " + ex.getMessage());
|
||||||
|
ex.printStackTrace(System.err);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,168 +0,0 @@
|
|||||||
package kst4contest.utils;
|
|
||||||
|
|
||||||
import javafx.collections.ObservableListBase;
|
|
||||||
|
|
||||||
import java.util.Arrays;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A bounded ObservableList backed by a circular buffer (ring buffer).
|
|
||||||
* <p>
|
|
||||||
* Provides O(1) {@link #addFirst} and {@link #addLast} as well as O(1)
|
|
||||||
* random access via {@link #get}. When the list reaches {@code maxCapacity},
|
|
||||||
* adding a new element at the front automatically evicts the oldest element
|
|
||||||
* at the back — and vice versa.
|
|
||||||
* <p>
|
|
||||||
* This is a drop-in replacement for {@code FXCollections.observableArrayList()}
|
|
||||||
* wherever elements are prepended frequently, e.g. chat message lists.
|
|
||||||
*/
|
|
||||||
public class BoundedDequeObservableList<E> extends ObservableListBase<E> {
|
|
||||||
|
|
||||||
private final int maxCapacity;
|
|
||||||
private final Object[] elements;
|
|
||||||
private int head = 0;
|
|
||||||
private int size = 0;
|
|
||||||
|
|
||||||
public BoundedDequeObservableList(int maxCapacity) {
|
|
||||||
if (maxCapacity <= 0) throw new IllegalArgumentException("maxCapacity must be > 0");
|
|
||||||
this.maxCapacity = maxCapacity;
|
|
||||||
this.elements = new Object[maxCapacity];
|
|
||||||
}
|
|
||||||
|
|
||||||
// ── read access ──────────────────────────────────────────────────────────
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int size() {
|
|
||||||
return size;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
public E get(int index) {
|
|
||||||
checkIndex(index);
|
|
||||||
return (E) elements[physicalIndex(index)];
|
|
||||||
}
|
|
||||||
|
|
||||||
// ── O(1) deque operations ─────────────────────────────────────────────────
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Inserts {@code element} at index 0 (newest-first order).
|
|
||||||
* If the list is already at capacity the oldest element (last index) is
|
|
||||||
* removed first — both changes are reported as a single compound change.
|
|
||||||
*/
|
|
||||||
public void addFirst(E element) {
|
|
||||||
beginChange();
|
|
||||||
if (size == maxCapacity) {
|
|
||||||
// evict last element
|
|
||||||
int lastPhysical = physicalIndex(size - 1);
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
E evicted = (E) elements[lastPhysical];
|
|
||||||
elements[lastPhysical] = null;
|
|
||||||
size--;
|
|
||||||
nextRemove(size, evicted); // index after decrement == old last index
|
|
||||||
}
|
|
||||||
head = (head - 1 + maxCapacity) % maxCapacity;
|
|
||||||
elements[head] = element;
|
|
||||||
size++;
|
|
||||||
nextAdd(0, 1);
|
|
||||||
endChange();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Appends {@code element} at the last index (oldest-first order).
|
|
||||||
* If the list is already at capacity the newest element (index 0) is
|
|
||||||
* removed first.
|
|
||||||
*/
|
|
||||||
public void addLast(E element) {
|
|
||||||
beginChange();
|
|
||||||
if (size == maxCapacity) {
|
|
||||||
// evict first element
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
E evicted = (E) elements[head];
|
|
||||||
elements[head] = null;
|
|
||||||
head = (head + 1) % maxCapacity;
|
|
||||||
size--;
|
|
||||||
nextRemove(0, evicted);
|
|
||||||
}
|
|
||||||
elements[physicalIndex(size)] = element;
|
|
||||||
size++;
|
|
||||||
nextAdd(size - 1, size);
|
|
||||||
endChange();
|
|
||||||
}
|
|
||||||
|
|
||||||
// ── standard List mutation (O(n) — use addFirst/addLast for hot path) ─────
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void add(int index, E element) {
|
|
||||||
if (index == 0) {
|
|
||||||
addFirst(element);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (index == size) {
|
|
||||||
addLast(element);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
checkIndexForAdd(index);
|
|
||||||
beginChange();
|
|
||||||
if (size == maxCapacity) {
|
|
||||||
int lastPhysical = physicalIndex(size - 1);
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
E evicted = (E) elements[lastPhysical];
|
|
||||||
elements[lastPhysical] = null;
|
|
||||||
size--;
|
|
||||||
nextRemove(size, evicted);
|
|
||||||
}
|
|
||||||
// shift elements [index .. size-1] one position towards the end
|
|
||||||
for (int i = size; i > index; i--) {
|
|
||||||
elements[physicalIndex(i)] = elements[physicalIndex(i - 1)];
|
|
||||||
}
|
|
||||||
elements[physicalIndex(index)] = element;
|
|
||||||
size++;
|
|
||||||
nextAdd(index, index + 1);
|
|
||||||
endChange();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public E remove(int index) {
|
|
||||||
checkIndex(index);
|
|
||||||
beginChange();
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
E removed = (E) elements[physicalIndex(index)];
|
|
||||||
// shift elements [index+1 .. size-1] one position towards the front
|
|
||||||
for (int i = index; i < size - 1; i++) {
|
|
||||||
elements[physicalIndex(i)] = elements[physicalIndex(i + 1)];
|
|
||||||
}
|
|
||||||
elements[physicalIndex(size - 1)] = null;
|
|
||||||
size--;
|
|
||||||
nextRemove(index, removed);
|
|
||||||
endChange();
|
|
||||||
return removed;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public E set(int index, E element) {
|
|
||||||
checkIndex(index);
|
|
||||||
beginChange();
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
E old = (E) elements[physicalIndex(index)];
|
|
||||||
elements[physicalIndex(index)] = element;
|
|
||||||
nextSet(index, old);
|
|
||||||
endChange();
|
|
||||||
return old;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ── helpers ───────────────────────────────────────────────────────────────
|
|
||||||
|
|
||||||
private int physicalIndex(int virtualIndex) {
|
|
||||||
return (head + virtualIndex) % maxCapacity;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void checkIndex(int index) {
|
|
||||||
if (index < 0 || index >= size)
|
|
||||||
throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void checkIndexForAdd(int index) {
|
|
||||||
if (index < 0 || index > size)
|
|
||||||
throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -3,12 +3,7 @@ package kst4contest.view;
|
|||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.net.URISyntaxException;
|
import java.net.URISyntaxException;
|
||||||
import java.nio.file.Path;
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.logging.FileHandler;
|
|
||||||
import java.util.logging.Level;
|
|
||||||
import java.util.logging.Logger;
|
|
||||||
import java.util.logging.SimpleFormatter;
|
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
import java.util.function.Predicate;
|
import java.util.function.Predicate;
|
||||||
|
|
||||||
@@ -8509,24 +8504,9 @@ public class Kst4ContestApplication extends Application implements StatusUpdateL
|
|||||||
|
|
||||||
|
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
setupFileLogging();
|
|
||||||
launch(args);
|
launch(args);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void setupFileLogging() {
|
|
||||||
try {
|
|
||||||
String logDir = Path.of(System.getProperty("user.home"), ".praktiKST").toString();
|
|
||||||
new File(logDir).mkdirs();
|
|
||||||
FileHandler fileHandler = new FileHandler(logDir + "/kst4contest-errors.log", true);
|
|
||||||
fileHandler.setLevel(Level.SEVERE);
|
|
||||||
fileHandler.setFormatter(new SimpleFormatter());
|
|
||||||
Logger rootLogger = Logger.getLogger("");
|
|
||||||
rootLogger.addHandler(fileHandler);
|
|
||||||
} catch (IOException e) {
|
|
||||||
System.err.println("Could not set up file logging: " + e.getMessage());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onThreadStatusChanged(String key, ThreadStateMessage threadStateMessage) {
|
public void onThreadStatusChanged(String key, ThreadStateMessage threadStateMessage) {
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ module praktiKST {
|
|||||||
requires jdk.xml.dom;
|
requires jdk.xml.dom;
|
||||||
requires java.sql;
|
requires java.sql;
|
||||||
requires javafx.media;
|
requires javafx.media;
|
||||||
requires java.logging;
|
|
||||||
exports kst4contest.controller.interfaces;
|
exports kst4contest.controller.interfaces;
|
||||||
exports kst4contest.controller;
|
exports kst4contest.controller;
|
||||||
exports kst4contest.locatorUtils;
|
exports kst4contest.locatorUtils;
|
||||||
|
|||||||
+1783
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user