Index: /trunk/.github/workflows/ant.yml
===================================================================
--- /trunk/.github/workflows/ant.yml	(revision 16776)
+++ /trunk/.github/workflows/ant.yml	(revision 16776)
@@ -0,0 +1,94 @@
+name: Java CI
+env:
+  junit_platform_version: "1.6.2"
+  # ANT_HOME is also our ant version
+  ANT_HOME: "apache-ant-1.10.8"
+on:
+  push:
+    branches: [master]
+  pull_request:
+    branches: [master]
+
+defaults:
+  run:
+    shell: bash
+
+jobs:
+  build:
+    runs-on: ${{ matrix.os }}
+    strategy:
+      fail-fast: false
+      matrix:
+        # test against latest update of each major Java version, as well as specific updates of LTS versions:
+        java: [8, 11, 14]
+        os: [ubuntu-latest, macos-latest, windows-latest]
+        headless: ["true", "false"]
+        exclude:
+          - java: 8
+            os: macos-latest
+          - java: 11
+            os: macos-latest
+          - headless: "false"
+            os: macos-latest
+          - headless: "false"
+            os: windows-latest
+    name: Java ${{ matrix.java }} on ${{ matrix.os }} with headless=${{ matrix.headless }}
+    steps:
+      - name: Checkout
+        uses: actions/checkout@v2
+        with:
+          fetch-depth: 64
+      - name: Cache
+        uses: actions/cache@v2.0.0
+        with:
+          path: |
+            ~/.ivy2/cache/
+            ~/work/josm/josm/tools/
+          key: ${{ runner.os }}-ivy2-${{ hashFiles('ivy.xml') }}
+      - name: Setup java
+        uses: actions/setup-java@v1.3.0
+        with:
+          java-version: ${{ matrix.java }}
+      - name: Install ant ${{ env.ANT_HOME }} and junit ${{ env.junit_platform_version }}
+        # Todo: cache ant and junit, saves 12 seconds.
+        run: |
+          curl -s https://downloads.apache.org/ant/binaries/${{ env.ANT_HOME }}-bin.tar.gz | tar -xz
+          curl -o ${{ env.ANT_HOME }}/lib/junit-platform-console-standalone-${{ env.junit_platform_version }}.jar  "https://repo1.maven.org/maven2/org/junit/platform/junit-platform-console-standalone/${{ env.junit_platform_version }}/junit-platform-console-standalone-${{ env.junit_platform_version }}.jar"
+      - name: Print ant version, expecting ${{ env.ANT_HOME }}
+        run: ${{ env.ANT_HOME }}/bin/ant -version
+      - name: Build with Ant, headless ${{ matrix.headless }}
+        run: |
+          ANT="${{ env.ANT_HOME }}/bin/ant -DnoJavaFX=true test-unit-hardfail"
+          if [ "${{ matrix.headless }}" == "true" ]; then
+            $ANT -Dtest.headless=true
+          else
+            xvfb-run $ANT -Dtest.headless=false
+          fi
+      - name: Dump errors if failed
+        if: ${{ failure() }}
+        run: "grep -L ', Failures: 0, Skipped: ' test/report/*.txt | xargs cat"
+      - name: Set revision env variable
+        if: ${{ always() }}
+        # Careful, you will only have a resources/REVISION if you've already built
+        run: echo "::set-env name=josm_revision::`awk '/Revision/{print $2}' resources/REVISION`"
+      - name: Upload Ant reports
+        if: ${{ always() }}
+        uses: actions/upload-artifact@v2
+        with:
+          name: Ant reports for JOSM ${{ env.josm_revision }} on java ${{ matrix.java }} on ${{ matrix.os }} with headless=${{ matrix.headless }}
+          path: test/report/*.txt
+      - name: Build and package for macOS
+        if: ${{ runner.os == 'macos' && always() }}
+        env:
+          CERT_MACOS_P12: ${{ secrets.CERT_MACOS_P12 }}
+          CERT_MACOS_PW: ${{ secrets.CERT_MACOS_PW }}
+          APPLE_ID_PW: ${{ secrets.APPLE_ID_PW }}
+        run: |
+          $ANT_HOME/bin/ant dist
+          ./native/macosx/macos-jpackage.sh ${{ env.josm_revision }}
+      - name: Upload JOSM.app for macOS
+        if: ${{ runner.os == 'macos' && always() }}
+        uses: actions/upload-artifact@v2
+        with:
+          name: JOSM.app revision ${{ env.josm_revision }}
+          path: dist/JOSM.zip
Index: unk/native/macosx/JOSM.app/Contents/Info.plist_template.xml
===================================================================
--- /trunk/native/macosx/JOSM.app/Contents/Info.plist_template.xml	(revision 16775)
+++ 	(revision )
@@ -1,265 +1,0 @@
-<key>NSSupportsAutomaticGraphicsSwitching</key>
-<true/>
-<key>CFBundleAllowMixedLocalizations</key>
-<string>true</string>
-<key>UTExportedTypeDeclarations</key>
-<array>
-    <!-- Export JOSM file format UTI (*.osm) -->
-    <dict>
-        <key>UTTypeIdentifier</key>
-        <string>org.openstreetmap.josm.osm</string>
-        <key>UTTypeDescription</key>
-        <string>JOSM File</string>
-        <key>UTTypeIconFile</key>
-        <string>JOSM.icns</string>
-        <key>UTTypeReferenceURL</key>
-        <string>http://wiki.openstreetmap.org/wiki/JOSM_file_format</string>
-        <key>UTTypeConformsTo</key>
-        <array>
-            <string>public.xml</string>
-        </array>
-        <key>UTTypeTagSpecification</key>
-        <dict>
-            <key>com.apple.ostype</key>
-            <string>JOSM</string>
-            <key>public.filename-extension</key>
-            <array>
-                <string>osm</string>
-            </array>
-            <key>public.mime-type</key>
-            <string>application/x-osm+xml</string>
-        </dict>
-    </dict>
-    <!-- Export JOSM session file format UTI (*.jos) -->
-    <dict>
-        <key>UTTypeIdentifier</key>
-        <string>org.openstreetmap.josm.jos</string>
-        <key>UTTypeDescription</key>
-        <string>JOS File</string>
-        <key>UTTypeIconFile</key>
-        <string>JOSM.icns</string>
-        <key>UTTypeConformsTo</key>
-        <array>
-            <string>public.xml</string>
-        </array>
-        <key>UTTypeTagSpecification</key>
-        <dict>
-            <key>com.apple.ostype</key>
-            <string>JOSM</string>
-            <key>public.filename-extension</key>
-            <array>
-                <string>jos</string>
-            </array>
-            <key>public.mime-type</key>
-            <string>application/x-josm-session+xml</string>
-        </dict>
-    </dict>
-    <!-- Export JOSM session file format UTI (*.joz) -->
-    <dict>
-        <key>UTTypeIdentifier</key>
-        <string>org.openstreetmap.josm.joz</string>
-        <key>UTTypeDescription</key>
-        <string>JOZ File</string>
-        <key>UTTypeIconFile</key>
-        <string>JOSM.icns</string>
-        <key>UTTypeConformsTo</key>
-        <array>
-            <string>com.pkware.zip-archive</string>
-        </array>
-        <key>UTTypeTagSpecification</key>
-        <dict>
-            <key>com.apple.ostype</key>
-            <string>JOSM</string>
-            <key>public.filename-extension</key>
-            <array>
-                <string>joz</string>
-            </array>
-            <key>public.mime-type</key>
-            <string>application/x-josm-session+zip</string>
-        </dict>
-    </dict>
-    <!-- Export GeoJSON file format UTI (*.geojson) -->
-    <dict>
-        <key>UTTypeIdentifier</key>
-        <string>public.geojson</string>
-        <key>UTTypeDescription</key>
-        <string>GeoJSON File</string>
-        <key>UTTypeIconFile</key>
-        <string>JOSM.icns</string>
-        <key>UTTypeConformsTo</key>
-        <array>
-            <string>public.json</string>
-        </array>
-        <key>UTTypeTagSpecification</key>
-        <dict>
-            <key>com.apple.ostype</key>
-            <string>GeoJSON</string>
-            <key>public.filename-extension</key>
-            <array>
-                <string>geojson</string>
-            </array>
-        </dict>
-    </dict>
-</array>
-<key>UTImportedTypeDeclarations</key>
-<array>
-    <!-- Import GPX file format "standard" UTI (*.gpx) -->
-    <dict>
-        <key>UTTypeIdentifier</key>
-        <string>com.topografix.gpx</string>
-        <key>UTTypeReferenceURL</key>
-        <string>http://www.topografix.com/GPX/1/1/</string>
-        <key>UTTypeDescription</key>
-        <string>GPS Exchange Format (GPX)</string>
-        <key>UTTypeConformsTo</key>
-        <array>
-            <string>public.xml</string>
-        </array>
-        <key>UTTypeTagSpecification</key>
-        <dict>
-            <key>public.filename-extension</key>
-            <array>
-                <string>gpx</string>
-            </array>
-            <key>public.mime-type</key>
-            <string>application/gpx+xml</string>
-        </dict>
-    </dict>
-    <!-- Import GPX file format Apple UTI (*.gpx) -->
-    <dict>
-        <key>UTTypeIdentifier</key>
-        <string>com.apple.dt.document.gpx</string>
-        <key>UTTypeReferenceURL</key>
-        <string>http://www.topografix.com/GPX/1/1/</string>
-        <key>UTTypeDescription</key>
-        <string>GPX File</string>
-        <key>UTTypeConformsTo</key>
-        <array>
-            <string>public.xml</string>
-        </array>
-        <key>UTTypeTagSpecification</key>
-        <dict>
-            <key>public.filename-extension</key>
-            <array>
-                <string>gpx</string>
-            </array>
-            <key>public.mime-type</key>
-            <string>application/gpx+xml</string>
-        </dict>
-    </dict>
-</array>
-<key>CFBundleDocumentTypes</key>
-<array>
-    <!-- Registers opening *.osm files -->
-    <dict>
-        <key>CFBundleTypeIconFile</key>
-        <string>JOSM.icns</string>
-        <key>CFBundleTypeName</key>
-        <string>OSM Files</string>
-        <key>CFBundleTypeRole</key>
-        <string>Editor</string>
-        <key>LSHandlerRank</key>
-        <string>Owner</string>
-        <key>LSItemContentTypes</key>
-        <array>
-            <string>org.openstreetmap.josm.osm</string>
-        </array>
-        <key>NSExportableTypes</key>
-        <array>
-            <string>org.openstreetmap.josm.osm</string>
-            <string>com.topografix.gpx</string>
-            <string>com.pkware.zip-archive</string>
-            <string>org.gnu.gnu-zip-archive</string>
-            <string>public.archive.bzip2</string>
-        </array>
-    </dict>
-    <!-- Registers opening *.jos files -->
-    <dict>
-        <key>CFBundleTypeIconFile</key>
-        <string>JOSM.icns</string>
-        <key>CFBundleTypeName</key>
-        <string>JOS Files</string>
-        <key>CFBundleTypeRole</key>
-        <string>Editor</string>
-        <key>LSHandlerRank</key>
-        <string>Owner</string>
-        <key>LSItemContentTypes</key>
-        <array>
-            <string>org.openstreetmap.josm.jos</string>
-        </array>
-    </dict>
-    <!-- Registers opening *.joz files -->
-    <dict>
-        <key>CFBundleTypeIconFile</key>
-        <string>JOSM.icns</string>
-        <key>CFBundleTypeName</key>
-        <string>JOZ Files</string>
-        <key>CFBundleTypeRole</key>
-        <string>Editor</string>
-        <key>LSHandlerRank</key>
-        <string>Owner</string>
-        <key>LSItemContentTypes</key>
-        <array>
-            <string>org.openstreetmap.josm.joz</string>
-        </array>
-    </dict>
-    <!-- Registers opening *.geojson files -->
-    <dict>
-        <key>CFBundleTypeIconFile</key>
-        <string>JOSM.icns</string>
-        <key>CFBundleTypeName</key>
-        <string>GeoJSON Files</string>
-        <key>CFBundleTypeRole</key>
-        <string>Editor</string>
-        <key>LSHandlerRank</key>
-        <string>Owner</string>
-        <key>LSItemContentTypes</key>
-        <array>
-            <string>public.geojson</string>
-        </array>
-    </dict>
-    <!-- Registers opening *.gpx files -->
-    <dict>
-        <key>CFBundleTypeIconFile</key>
-        <string>JOSM.icns</string>
-        <key>CFBundleTypeName</key>
-        <string>GPX Files</string>
-        <key>CFBundleTypeRole</key>
-        <string>Editor</string>
-        <key>LSHandlerRank</key>
-        <string>Alternate</string>
-        <key>LSItemContentTypes</key>
-        <array>
-            <string>com.topografix.gpx</string>
-            <string>com.apple.dt.document.gpx</string>
-        </array>
-        <key>NSExportableTypes</key>
-        <array>
-            <string>org.openstreetmap.josm.osm</string>
-        </array>
-    </dict>
-    <!-- Registers opening *.osm.zip, *.osm.gz, *.osm.bz2 files -->
-    <dict>
-        <key>CFBundleTypeIconFile</key>
-        <string>JOSM.icns</string>
-        <key>CFBundleTypeName</key>
-        <string>OSM Compressed Files</string>
-        <key>CFBundleTypeRole</key>
-        <string>Editor</string>
-        <key>LSHandlerRank</key>
-        <string>Alternate</string>
-        <key>LSItemContentTypes</key>
-        <array>
-            <string>com.pkware.zip-archive</string>
-            <string>org.gnu.gnu-zip-archive</string>
-            <string>public.archive.bzip2</string>
-        </array>
-        <key>NSExportableTypes</key>
-        <array>
-            <string>org.openstreetmap.josm.osm</string>
-            <string>com.pkware.zip-archive</string>
-            <string>org.gnu.gnu-zip-archive</string>
-            <string>public.archive.bzip2</string>
-        </array>
-    </dict>
-</array>
Index: /trunk/native/macosx/bz2.properties
===================================================================
--- /trunk/native/macosx/bz2.properties	(revision 16776)
+++ /trunk/native/macosx/bz2.properties	(revision 16776)
@@ -0,0 +1,3 @@
+extension=bz2
+mime-type=application/x-bzip2
+description=OpenStreetMap BZipped
Index: /trunk/native/macosx/geojson.properties
===================================================================
--- /trunk/native/macosx/geojson.properties	(revision 16776)
+++ /trunk/native/macosx/geojson.properties	(revision 16776)
@@ -0,0 +1,3 @@
+extension=geojson
+mime-type=application/geo+json
+description=GeoJSON
Index: /trunk/native/macosx/gpx.properties
===================================================================
--- /trunk/native/macosx/gpx.properties	(revision 16776)
+++ /trunk/native/macosx/gpx.properties	(revision 16776)
@@ -0,0 +1,3 @@
+extension=gpx
+mime-type=application/gpx+xml
+description=GPS Exchange Format (GPX)
Index: /trunk/native/macosx/gz.properties
===================================================================
--- /trunk/native/macosx/gz.properties	(revision 16776)
+++ /trunk/native/macosx/gz.properties	(revision 16776)
@@ -0,0 +1,3 @@
+extension=gz
+mime-type=application/gzip
+description=OpenStreetMap BZipped
Index: /trunk/native/macosx/jos.properties
===================================================================
--- /trunk/native/macosx/jos.properties	(revision 16776)
+++ /trunk/native/macosx/jos.properties	(revision 16776)
@@ -0,0 +1,3 @@
+extension=joz
+mime-type=application/x-josm-session+xml
+description=JOSM Session
Index: /trunk/native/macosx/josm.entitlements
===================================================================
--- /trunk/native/macosx/josm.entitlements	(revision 16776)
+++ /trunk/native/macosx/josm.entitlements	(revision 16776)
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>com.apple.security.cs.allow-jit</key>
+	<true/>
+	<key>com.apple.security.cs.allow-unsigned-executable-memory</key>
+	<true/>
+	<key>com.apple.security.cs.disable-executable-page-protection</key>
+	<true/>
+	<key>com.apple.security.cs.disable-library-validation</key>
+	<true/>
+	<key>com.apple.security.cs.allow-dyld-environment-variables</key>
+	<true/>
+</dict>
+</plist>
Index: /trunk/native/macosx/joz.properties
===================================================================
--- /trunk/native/macosx/joz.properties	(revision 16776)
+++ /trunk/native/macosx/joz.properties	(revision 16776)
@@ -0,0 +1,3 @@
+extension=joz
+mime-type=application/x-josm-session+zip
+description=JOSM Zipped Session
Index: /trunk/native/macosx/macos-jpackage.sh
===================================================================
--- /trunk/native/macosx/macos-jpackage.sh	(revision 16776)
+++ /trunk/native/macosx/macos-jpackage.sh	(revision 16776)
@@ -0,0 +1,89 @@
+#!/bin/bash
+
+set -Eeou pipefail
+
+# Don't show one time passwords
+set +x
+
+SIGNING_KEY_NAME="Developer ID Application: FOSSGIS e.V. (P8AAAGN2AM)"
+IMPORT_AND_UNLOCK_KEYCHAIN=${IMPORT_AND_UNLOCK_KEYCHAIN:-1}
+
+if [ -z "${1-}" ]
+then
+    echo "Usage: $0 josm_revision"
+    exit 1
+fi
+
+echo "Building JOSM.app"
+
+jpackage -n "JOSM" --input dist --main-jar josm-custom.jar \
+    --main-class org.openstreetmap.josm.gui.MainApplication \
+    --icon ./native/macosx/JOSM.icns --type app-image --dest dist \
+    --java-options "-Xmx8192m" --app-version $1 \
+    --copyright "JOSM, and all its integral parts, are released under the GNU General Public License v2 or later" \
+    --vendor "https://josm.openstreetmap.de" \
+    --file-associations native/macosx/bz2.properties \
+    --file-associations native/macosx/geojson.properties \
+    --file-associations native/macosx/gpx.properties \
+    --file-associations native/macosx/gz.properties \
+    --file-associations native/macosx/jos.properties \
+    --file-associations native/macosx/joz.properties \
+    --file-associations native/macosx/osm.properties \
+    --file-associations native/macosx/zip.properties \
+    --add-modules java.base,java.datatransfer,java.desktop,java.logging,java.management,java.naming,java.net.http,java.prefs,java.rmi,java.scripting,java.sql,java.transaction.xa,java.xml,jdk.crypto.ec,jdk.jfr,jdk.jsobject,jdk.unsupported,jdk.unsupported.desktop,jdk.xml.dom
+
+echo "Building done."
+
+if [[ $IMPORT_AND_UNLOCK_KEYCHAIN == 1 ]]; then
+    if [ -z "$CERT_MACOS_P12" ]
+    then
+        echo "CERT_MACOS_P12 must be set in the environment. Won't sign app."
+        exit 1
+    fi
+
+
+    if [ -z "$CERT_MACOS_PW" ]
+    then
+        echo "CERT_MACOS_P12 must be set in the environment. Won't sign app."
+        exit 1
+    fi
+
+    echo "Preparing certificates/keychain for signing…"
+
+    KEYCHAIN=build.keychain
+    KEYCHAIN_PW=`head /dev/urandom | base64 | head -c 20`
+    CERTIFICATE_P12=certificate.p12
+
+    echo $CERT_MACOS_P12 | base64 --decode > $CERTIFICATE_P12
+    security create-keychain -p $KEYCHAIN_PW $KEYCHAIN
+    security default-keychain -s $KEYCHAIN
+    security unlock-keychain -p $KEYCHAIN_PW $KEYCHAIN
+    security import $CERTIFICATE_P12 -k $KEYCHAIN -P $CERT_MACOS_PW -T /usr/bin/codesign
+    security set-key-partition-list -S apple-tool:,apple: -s -k $KEYCHAIN_PW $KEYCHAIN
+    rm $CERTIFICATE_P12
+
+    echo "Signing preparation done."
+fi
+
+echo "Signing App Bundle…"
+
+codesign -vvv --timestamp --options runtime --deep --force --sign "$SIGNING_KEY_NAME" \
+    dist/JOSM.app/Contents/MacOS/JOSM \
+    dist/JOSM.app/Contents/MacOS/libapplauncher.dylib \
+    dist/JOSM.app/Contents/runtime/Contents/Home/lib/*.jar \
+    dist/JOSM.app/Contents/runtime/Contents/Home/lib/*.dylib \
+    dist/JOSM.app/Contents/runtime/Contents/MacOS/libjli.dylib
+
+codesign -vvv --timestamp --entitlements native/macosx/josm.entitlements --options runtime --force --sign "$SIGNING_KEY_NAME" dist/JOSM.app
+
+codesign -vvv dist/JOSM.app
+
+echo "Preparing for notarization"
+ditto -c -k --keepParent dist/JOSM.app dist/JOSM.zip
+
+echo "Uploading to Apple"
+xcrun altool --notarize-app -f dist/JOSM.zip -p "$APPLE_ID_PW" -u "thomas.skowron@fossgis.de" --primary-bundle-id de.openstreetmap.josm
+
+# Prepare for upload-artifact
+mkdir dist-macOS
+unzip dist/JOSM.zip -d dist-macOS
Index: /trunk/native/macosx/osm.properties
===================================================================
--- /trunk/native/macosx/osm.properties	(revision 16776)
+++ /trunk/native/macosx/osm.properties	(revision 16776)
@@ -0,0 +1,3 @@
+extension=osm
+mime-type=application/x-osm+xml
+description=OpenStreetMap
Index: /trunk/native/macosx/zip.properties
===================================================================
--- /trunk/native/macosx/zip.properties	(revision 16776)
+++ /trunk/native/macosx/zip.properties	(revision 16776)
@@ -0,0 +1,3 @@
+extension=zip
+mime-type=application/zip
+description=OpenStreetMap Zipped
