Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package icedtea-web for openSUSE:Factory 
checked in at 2021-05-19 17:49:39
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/icedtea-web (Old)
 and      /work/SRC/openSUSE:Factory/.icedtea-web.new.2988 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "icedtea-web"

Wed May 19 17:49:39 2021 rev:33 rq:894317 version:1.8.6

Changes:
--------
--- /work/SRC/openSUSE:Factory/icedtea-web/icedtea-web.changes  2021-03-08 
15:18:13.937981532 +0100
+++ /work/SRC/openSUSE:Factory/.icedtea-web.new.2988/icedtea-web.changes        
2021-05-19 17:50:01.805371100 +0200
@@ -1,0 +2,8 @@
+Wed May 19 10:58:51 UTC 2021 - Ferdinand Thiessen <[email protected]>
+
+- Update to 1.8.6
+  * JARs downloaded with URI-escaped characters don't get loaded
+  * Reduced number of threads spawned for downloading of resources
+  * handle broken XML in jnlp
+
+-------------------------------------------------------------------

Old:
----
  IcedTea-Web-icedtea-web-1.8.4.tar.gz

New:
----
  IcedTea-Web-icedtea-web-1.8.6.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ icedtea-web.spec ++++++
--- /var/tmp/diff_new_pack.ogXd19/_old  2021-05-19 17:50:02.321368937 +0200
+++ /var/tmp/diff_new_pack.ogXd19/_new  2021-05-19 17:50:02.325368920 +0200
@@ -29,7 +29,7 @@
 %bcond_without docs
 %bcond_with plugin
 Name:           icedtea-web
-Version:        1.8.4
+Version:        1.8.6
 Release:        0
 Summary:        Java Web Start implementation
 License:        GPL-2.0-only WITH Classpath-exception-2.0

++++++ IcedTea-Web-icedtea-web-1.8.4.tar.gz -> 
IcedTea-Web-icedtea-web-1.8.6.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/IcedTea-Web-icedtea-web-1.8.4/.gitattributes 
new/IcedTea-Web-icedtea-web-1.8.6/.gitattributes
--- old/IcedTea-Web-icedtea-web-1.8.4/.gitattributes    1970-01-01 
01:00:00.000000000 +0100
+++ new/IcedTea-Web-icedtea-web-1.8.6/.gitattributes    2021-02-23 
13:05:13.000000000 +0100
@@ -0,0 +1,5 @@
+# Declare files that will always have LF line endings on checkout.
+*.sh           eol=lf
+
+# Declare files that will always have CRLF line endings on checkout.
+*.bat text eol=crlf
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/IcedTea-Web-icedtea-web-1.8.4/.github/workflows/build.yml 
new/IcedTea-Web-icedtea-web-1.8.6/.github/workflows/build.yml
--- old/IcedTea-Web-icedtea-web-1.8.4/.github/workflows/build.yml       
1970-01-01 01:00:00.000000000 +0100
+++ new/IcedTea-Web-icedtea-web-1.8.6/.github/workflows/build.yml       
2021-02-23 13:05:13.000000000 +0100
@@ -0,0 +1,393 @@
+name: Build
+on:
+  workflow_dispatch:
+    inputs:
+        release:
+          description: 'Set to True if are running a release'     
+          required: true
+          default: 'False'
+        version:
+          description: 'If running a release, set the version e.g 
(icedtea-web-1.8.4)'     
+          required: true
+          default: 'icedtea-web-1.8.x'
+  pull_request:
+    branches:
+      - 1.8
+jobs:
+  release:
+    if: github.event.inputs.release == 'True'
+    name: Create Draft release
+    runs-on: ubuntu-latest
+    outputs:
+      upload_url: ${{ steps.create_release.outputs.upload_url }}
+    steps:
+    - name: Create Draft Release
+      id: create_release
+      uses: actions/create-release@v1
+      env:
+        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+      with:
+        tag_name: ${{ github.event.inputs.version }}
+        release_name: 'Official Release of ${{ github.event.inputs.version }}'
+        draft: true
+        prerelease: false
+
+  linux:
+    if: always()
+    needs: release
+    name: Linux
+    runs-on: ubuntu-latest
+    container: centos:7
+    steps:
+      - uses: actions/checkout@v2
+        with:
+          path: icedtea-web
+
+      - name: Install Dependencies
+        run: |
+          yum -y install autoconf bind-utils bzip2 cpio elfutils-libelf-devel 
gcc gcc-c++ glibc glibc-common glibc-devel \
+          gmp-devel java-1.8.0-openjdk-devel libcurl-devel make mpfr-devel 
perl unzip which zip
+          curl -o tagsoup.jar 
"https://repo1.maven.org/maven2/org/ccil/cowan/tagsoup/tagsoup/1.2.1/tagsoup-1.2.1.jar";
+          sha256sum tagsoup.jar | awk 
'$1!="ac97f7b4b1d8e9337edfa0e34044f8d0efe7223f6ad8f3a85d54cc1018ea2e04"{exit 1}'
+          curl -o rhino.zip 
"https://ftp.mozilla.org/pub/mozilla.org/js/rhino1_6R7.zip";
+          sha256sum rhino.zip | awk 
'$1!="c94c6de3a29b3acbc4eee732e688f75a5d94bd02c9878be4ceb4d3cd220f3866"{exit 1}'
+          unzip -j rhino.zip "*/js.jar"
+
+      - name: Compile rust
+        run: |
+          curl -o rust.tar.gz 
"https://static.rust-lang.org/dist/rust-1.34.1-x86_64-unknown-linux-gnu.tar.gz";
+          sha256sum rust.tar.gz | awk 
'$1!="8e2eead11bd5bf61409e29018d007c6fc874bcda2ff54db3d04d1691e779c14e"{exit 1}'
+          tar -zxf rust.tar.gz
+          cd rust-1.34.1-x86_64-unknown-linux-gnu
+          ./install.sh
+
+      - name: Compile pkg-config
+        run: |
+          curl -o pkg-config.tar.gz 
"https://pkg-config.freedesktop.org/releases/pkg-config-0.29.2.tar.gz";
+          sha256sum pkg-config.tar.gz | awk 
'$1!="6fc69c01688c9458a57eb9a1664c9aba372ccda420a02bf4429fe610e7e7d591"{exit 1}'
+          tar -zxf pkg-config.tar.gz
+          cd pkg-config-0.29.2
+          ./configure --with-internal-glib
+          make install
+
+      - name: Compile automake
+        run: |
+          curl -o automake-1.13.1.tar.gz 
"https://ftp.gnu.org/gnu/automake/automake-1.13.1.tar.gz";
+          sha256sum automake-1.13.1.tar.gz | awk 
'$1!="51bc10031847e9965c4f2c16a0a66552309ce28ea82b1afa8cef736643ebaa27"{exit 1}'
+          tar -zxf automake-1.13.1.tar.gz 
+          cd automake-1.13.1
+          bash configure
+          make && make install
+          rm -rf /usr/local/bin/automake
+          ln -s /usr/local/bin/automake-1.13 /usr/local/bin/automake
+
+      - name: Build
+        run: |
+          export ICEDTEAWEB_INSTALL="/icedtea-web-image"
+          export JAVA_EXE="$(which java)"
+          export JAVA_PATH="$(readlink -e "${JAVA_EXE}")"
+          export BIN_PATH="$(dirname "${JAVA_PATH}")"
+          export JRE_PATH="$(dirname "${BIN_PATH}")"
+          export JAVA_HOME="$(dirname "${JRE_PATH}")"
+          export TAGSOUP="${PWD}/tagsoup.jar"
+          export RHINO="${PWD}/js.jar"
+          export ACLOCAL_PATH="/usr/local/share/aclocal"
+          export PATH="/usr/local/bin:${PATH}"
+          export WORKSPACE="${PWD}"
+          pkg-config --version
+          cd icedtea-web
+          echo "Invoking autogen.sh"
+          ./autogen.sh
+          echo "Incoking IcedTea-Web configure"
+          ./configure --disable-native-plugin --prefix="${ICEDTEAWEB_INSTALL}" 
--with-itw-libs=BUNDLED --with-rhino="${RHINO}" --with-tagsoup="${TAGSOUP}" 
--with-jdk-home="${JAVA_HOME}"
+          echo "Build IcedTea-Web"
+          make DESTDIR="${WORKSPACE}"
+          
+      - name: Build Distribution
+        run: |
+          export WORKSPACE="${PWD}"
+          echo "Create IcedTea-Web Distribution"
+          cd icedtea-web
+          make linux-bin-dist DESTDIR="${WORKSPACE}"
+          find . -name "icedtea-web-*.linux.bin.zip"
+          for zip in icedtea-web-*.linux.bin.zip; do
+            sha256sum "$zip" > "$zip.sha256.txt"
+          done
+
+      - uses: actions/upload-artifact@v2
+        with:
+          name: icedtea-web_build_x86-64_linux
+          path: |
+            icedtea-web/icedtea-web-*.linux.bin.*
+
+      - name: Upload binary
+        uses: actions/upload-release-asset@v1
+        if: github.event.inputs.release == 'True'
+        env:
+          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+        with:
+          upload_url: ${{ needs.release.outputs.upload_url }}
+          asset_path: icedtea-web/${{ github.event.inputs.version 
}}.linux.bin.zip
+          asset_name: ${{ github.event.inputs.version }}.linux.bin.zip
+          asset_content_type: application/zip
+
+      - name: Upload shasum
+        uses: actions/upload-release-asset@v1
+        if: github.event.inputs.release == 'True'
+        env:
+          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+        with:
+          upload_url: ${{ needs.release.outputs.upload_url }}
+          asset_path: icedtea-web/${{ github.event.inputs.version 
}}.linux.bin.zip.sha256.txt
+          asset_name: ${{ github.event.inputs.version 
}}.linux.bin.zip.sha256.txt
+          asset_content_type: application/zip
+
+  portable:
+    if: always()
+    needs: release
+    name: Portable
+    runs-on: ubuntu-latest
+    container: centos:7
+    steps:
+      - uses: actions/checkout@v2
+        with:
+          path: icedtea-web
+
+      - name: Install Dependencies
+        run: |
+          yum -y install autoconf bind-utils bzip2 cpio elfutils-libelf-devel 
gcc gcc-c++ glibc glibc-common glibc-devel \
+          gmp-devel java-1.8.0-openjdk-devel libcurl-devel make mpfr-devel 
perl unzip which zip
+          curl -o tagsoup.jar 
"https://repo1.maven.org/maven2/org/ccil/cowan/tagsoup/tagsoup/1.2.1/tagsoup-1.2.1.jar";
+          sha256sum tagsoup.jar | awk 
'$1!="ac97f7b4b1d8e9337edfa0e34044f8d0efe7223f6ad8f3a85d54cc1018ea2e04"{exit 1}'
+          curl -o mslinks.jar 
"https://repo1.maven.org/maven2/com/github/vatbub/mslinks/1.0.5/mslinks-1.0.5.jar";
+          sha256sum mslinks.jar | awk 
'$1!="e14d756f81b310b75baeb5baf219d25592b6a8635eb215c4059f17493b0cea5c"{exit 1}'
+          curl -o rhino.zip 
"https://ftp.mozilla.org/pub/mozilla.org/js/rhino1_6R7.zip";
+          sha256sum rhino.zip | awk 
'$1!="c94c6de3a29b3acbc4eee732e688f75a5d94bd02c9878be4ceb4d3cd220f3866"{exit 1}'
+          unzip -j rhino.zip "*/js.jar"
+
+      - name: Compile pkg-config
+        run: |
+          curl -o pkg-config.tar.gz 
"https://pkg-config.freedesktop.org/releases/pkg-config-0.29.2.tar.gz";
+          sha256sum pkg-config.tar.gz | awk 
'$1!="6fc69c01688c9458a57eb9a1664c9aba372ccda420a02bf4429fe610e7e7d591"{exit 1}'
+          tar -zxf pkg-config.tar.gz
+          cd pkg-config-0.29.2
+          ./configure --with-internal-glib
+          make install
+
+      - name: Compile automake
+        run: |
+          curl -o automake-1.13.1.tar.gz 
"https://ftp.gnu.org/gnu/automake/automake-1.13.1.tar.gz";
+          sha256sum automake-1.13.1.tar.gz | awk 
'$1!="51bc10031847e9965c4f2c16a0a66552309ce28ea82b1afa8cef736643ebaa27"{exit 1}'
+          tar -zxf automake-1.13.1.tar.gz 
+          cd automake-1.13.1
+          bash configure
+          make && make install
+          rm -rf /usr/local/bin/automake
+          ln -s /usr/local/bin/automake-1.13 /usr/local/bin/automake
+
+      - name: Build
+        run: |
+          export ICEDTEAWEB_INSTALL="/icedtea-web-image"
+          export JAVA_EXE="$(which java)"
+          export JAVA_PATH="$(readlink -e "${JAVA_EXE}")"
+          export BIN_PATH="$(dirname "${JAVA_PATH}")"
+          export JRE_PATH="$(dirname "${BIN_PATH}")"
+          export JAVA_HOME="$(dirname "${JRE_PATH}")"
+          export WORKSPACE="${PWD}"
+          pkg-config --version
+          cd icedtea-web
+          echo "Invoking autogen.sh"
+          ./autogen.sh
+          echo "Incoking IcedTea-Web configure"
+          ./configure --disable-native-plugin --enable-bats-on-linux 
--enable-shell-launchers --prefix="${ICEDTEAWEB_INSTALL}" 
--with-itw-libs=BUNDLED --with-rhino="${WORKSPACE}/js.jar" 
--with-mslinks="${WORKSPACE}/mslinks.jar" 
--with-tagsoup="${WORKSPACE}/tagsoup.jar" --with-jdk-home="${JAVA_HOME}"
+          echo "Build IcedTea-Web"
+          make DESTDIR="${WORKSPACE}/dest"
+          
+      - name: Build Distribution
+        run: |
+          export WORKSPACE="${PWD}"
+          echo "Create IcedTea-Web Distribution"
+          cd icedtea-web
+          make linux-bin-dist DESTDIR="${WORKSPACE}/dest"
+          find . -name "icedtea-web-*.linux.bin.zip"
+          for zip in icedtea-web-*.linux.bin.zip; do
+            zip_rename="${zip/linux/portable}"
+              mv "$zip" "$zip_rename"
+            sha256sum "$zip_rename" > "$zip_rename.sha256.txt"
+          done
+
+      - uses: actions/upload-artifact@v2
+        with:
+          name: icedtea-web_build_x86-64_portable
+          path: |
+            icedtea-web/icedtea-web-*.portable.bin.*
+
+      - name: Upload binary
+        uses: actions/upload-release-asset@v1
+        if: github.event.inputs.release == 'True'
+        env:
+          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+        with:
+          upload_url: ${{ needs.release.outputs.upload_url }}
+          asset_path: icedtea-web/${{ github.event.inputs.version 
}}.portable.bin.zip
+          asset_name: ${{ github.event.inputs.version }}.portable.bin.zip
+          asset_content_type: application/zip
+
+      - name: Upload shasum
+        uses: actions/upload-release-asset@v1
+        if: github.event.inputs.release == 'True'
+        env:
+          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+        with:
+          upload_url: ${{ needs.release.outputs.upload_url }}
+          asset_path: icedtea-web/${{ github.event.inputs.version 
}}.portable.bin.zip.sha256.txt
+          asset_name: ${{ github.event.inputs.version 
}}.portable.bin.zip.sha256.txt
+          asset_content_type: application/zip
+
+  windows:
+    if: always()
+    needs: release
+    name: Windows
+    runs-on: windows-latest
+    steps:
+      - name: Restore cygwin packages from cache
+        id: cygwin
+        uses: actions/cache@v2
+        with:
+          path: C:\cygwin_packages
+          key: cygwin-packages-${{ runner.os }}-v1
+
+      - name: Install Cygwin
+        run: |
+          Invoke-WebRequest -UseBasicParsing 
'https://cygwin.com/setup-x86_64.exe' -OutFile 'C:\temp\cygwin.exe'
+          Invoke-WebRequest -UseBasicParsing 
'https://cygwin.com/setup-x86_64.exe.sig' -OutFile 'C:\temp\cygwin.exe.sig'
+          gpg --keyserver keys.gnupg.net --recv-key 1A698DE9E2E56300
+          gpg --keyserver keys.gnupg.net --recv-key 676041BA
+          gpg --keyid-format=long --with-fingerprint --verify 
'C:\temp\cygwin.exe.sig' 'C:\temp\cygwin.exe'
+          Start-Process -Wait -FilePath 'C:\temp\cygwin.exe' -ArgumentList 
'--packages 
autoconf,automake,cpio,curl,gcc,git,gnupg,grep,libtool,make,mingw64-x86_64-gcc-core,perl,pkg-config,unzip,wget,zip
 --quiet-mode --download --local-install --delete-orphans --site 
https://mirrors.kernel.org/sourceware/cygwin/ --local-package-dir 
C:\cygwin_packages --root C:\cygwin64'
+
+      - name: Set PATH
+        run: echo "C:\cygwin64\bin" | Out-File -FilePath $env:GITHUB_PATH 
-Encoding utf8 -Append
+
+      - name: Cygwin git configuration
+        shell: bash
+        run: mkdir $HOME && git config --system core.autocrlf false
+
+      - uses: actions/checkout@v2
+
+      - name: Install Dependencies
+        run: |
+          # Create C:/cygwin64/usr/share/java if it doesn't exist
+          New-Item -Path C:\cygwin64\usr\share\java -Type Directory
+          # Retrieve tagsoup jar
+          Invoke-WebRequest -UseBasicParsing 
'https://repo1.maven.org/maven2/org/ccil/cowan/tagsoup/tagsoup/1.2.1/tagsoup-1.2.1.jar'
 -OutFile 'C:\cygwin64\usr\share\java\tagsoup.jar'
+          $checksum = (Get-FileHash -Algorithm SHA256 
'C:\cygwin64\usr\share\java\tagsoup.jar' | Select-Object -ExpandProperty Hash)
+          If ($checksum -ne 
"AC97F7B4B1D8E9337EDFA0E34044F8D0EFE7223F6AD8F3A85D54CC1018EA2E04") {
+            Write-Host "Checksums did not match!"
+            exit 1
+          }
+          # Retrieve mslinks jar
+          Invoke-WebRequest -UseBasicParsing 
'https://repo1.maven.org/maven2/com/github/vatbub/mslinks/1.0.5/mslinks-1.0.5.jar'
 -OutFile 'C:\cygwin64\usr\share\java\mslinks.jar'
+          $checksum = (Get-FileHash -Algorithm SHA256 
'C:\cygwin64\usr\share\java\mslinks.jar' | Select-Object -ExpandProperty Hash)
+          If ($checksum -ne 
"E14D756F81B310B75BAEB5BAF219D25592B6A8635EB215C4059F17493B0CEA5C") {
+            Write-Host "Checksums did not match!"
+            exit 1
+          }
+          # Retrieve Wixgen jar
+          Invoke-WebRequest -UseBasicParsing 
'https://github.com/akashche/wixgen/releases/download/1.7/wixgen.jar' -OutFile 
'C:\cygwin64\usr\share\java\wixgen.jar'
+          $checksum = (Get-FileHash -Algorithm SHA256 
'C:\cygwin64\usr\share\java\wixgen.jar' | Select-Object -ExpandProperty Hash)
+          If ($checksum -ne 
"57E68A91C46A2F4B1B41A3F93793E331D62D6D151DDC222FA4D3EC9CE876F967") {
+            Write-Host "Checksums did not match!"
+            exit 1
+          }
+          # Retrieve Rhino
+          Invoke-WebRequest -UseBasicParsing 
'https://ftp.mozilla.org/pub/mozilla.org/js/rhino1_6R7.zip' -OutFile 
'rhino1_6R7.zip'
+          $checksum = (Get-FileHash -Algorithm SHA256 'rhino1_6R7.zip' | 
Select-Object -ExpandProperty Hash) 
+          If ($checksum -ne 
"C94C6DE3A29B3ACBC4EEE732E688F75A5D94BD02C9878BE4CEB4D3CD220F3866") {
+            Write-Host "Checksums did not match!"
+            exit 1
+          }
+          7z.exe x rhino1_6R7.zip
+          Move-Item -Path rhino1_6R7\js.jar -Destination 
C:\cygwin64\usr\share\java
+          # Retrieve AzureSignTool
+          New-Item -Path C:\AzureSignTool -Type Directory
+          Invoke-WebRequest -UseBasicParsing 
'https://github.com/vcsjones/AzureSignTool/releases/download/1.0.1/AzureSignTool.zip'
 -OutFile 'AzureSignTool.zip'
+          $checksum = (Get-FileHash -Algorithm SHA256 'AzureSignTool.zip' | 
Select-Object -ExpandProperty Hash) 
+          If ($checksum -ne 
"4178B8E5DC6423E75DA2184C3B0D78167A0A59B82A20842884B780B1E815BA89") {
+            Write-Host "Checksums did not match!"
+            exit 1
+          }
+          Expand-Archive -LiteralPath 'AzureSignTool.zip' -DestinationPath 
'C:\AzureSignTool'
+
+      - name: Enable 8dot3 shortnames
+        run: |
+          fsutil behavior set disable8dot3 0
+          cmd /c dir /x "C:\Program Files (x86)"
+          fsutil file setshortname "C:\Program Files (x86)\WiX Toolset v3.11" 
"WIXTOO~1.14"
+        shell: cmd
+
+      - name: Build
+        run: bash .github/workflows/windows_build.sh
+        shell: cmd
+
+      - uses: actions/upload-artifact@v2
+        with:
+          name: icedtea-web_build_x86-64_win
+          path: |
+            icedtea-web-*.win.bin.*
+            win-installer.build/icedtea-web-*.msi*
+
+      - name: Codesign
+        run: bash .github/workflows/windows_sign.sh
+        if: github.event.inputs.release == 'True'
+        env:
+          description_url: 'https://adoptopenjdk.net'
+          key_vault_url: 'https://adoptopenjdk-codesign.vault.azure.net'
+          key_vault_certificate: 'LondonJavaCommunity'
+          key_vault_client_id: ${{ secrets.key_vault_client_id }}
+          key_vault_client_secret: ${{ secrets.key_vault_client_secret }}
+        shell: cmd
+
+      - name: Upload binary
+        uses: actions/[email protected]
+        if: github.event.inputs.release == 'True'
+        env:
+          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+        with:
+          upload_url: ${{ needs.release.outputs.upload_url }}
+          asset_path: release/${{ github.event.inputs.version }}.win.bin.zip
+          asset_name: ${{ github.event.inputs.version }}.win.bin.zip
+          asset_content_type: application/zip
+
+      - name: Upload shasum
+        uses: actions/[email protected]
+        if: github.event.inputs.release == 'True'
+        env:
+          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+        with:
+          upload_url: ${{ needs.release.outputs.upload_url }}
+          asset_path: release/${{ github.event.inputs.version 
}}.win.bin.zip.sha256.txt
+          asset_name: ${{ github.event.inputs.version }}.win.bin.zip.sha256.txt
+          asset_content_type: application/zip
+
+      - name: Upload MSI
+        uses: actions/[email protected]
+        if: github.event.inputs.release == 'True'
+        env:
+          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+        with:
+          upload_url: ${{ needs.release.outputs.upload_url }}
+          asset_path: release/${{ github.event.inputs.version }}.msi
+          asset_name: ${{ github.event.inputs.version }}.msi
+          asset_content_type: application/zip
+
+      - name: Upload MSI shasum
+        uses: actions/[email protected]
+        if: github.event.inputs.release == 'True'
+        env:
+          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+        with:
+          upload_url: ${{ needs.release.outputs.upload_url }}
+          asset_path: release/${{ github.event.inputs.version }}.msi.sha256.txt
+          asset_name: ${{ github.event.inputs.version }}.msi.sha256.txt
+          asset_content_type: application/zip
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/IcedTea-Web-icedtea-web-1.8.4/.github/workflows/windows_build.sh 
new/IcedTea-Web-icedtea-web-1.8.6/.github/workflows/windows_build.sh
--- old/IcedTea-Web-icedtea-web-1.8.4/.github/workflows/windows_build.sh        
1970-01-01 01:00:00.000000000 +0100
+++ new/IcedTea-Web-icedtea-web-1.8.6/.github/workflows/windows_build.sh        
2021-02-23 13:05:13.000000000 +0100
@@ -0,0 +1,27 @@
+#!/bin/bash
+export WORKSPACE="${PWD}"
+export RUSTFLAGS="-C target-feature=+crt-static"
+export ICEDTEAWEB_INSTALL="$(cygpath -u "${WORKSPACE}/icedtea-web-image")"
+export WIXPATH="$(cygpath -u "C:/PROGRA~2/WIXTOO~1.14/bin")"
+export WIXGEN="$(cygpath -u "C:/cygwin64/usr/share/java/wixgen.jar")"
+export PATH="${PATH}:/cygdrive/c/rust/bin:${WIXPATH}"
+export JVM_HOME_SHORT="$(cygpath -d "${JAVA_HOME}")"
+export JVMPATH="$(cygpath -u ${JVM_HOME_SHORT})"
+echo "Configure IcedTea-Web"
+./autogen.sh
+./configure --disable-native-plugin --prefix="${ICEDTEAWEB_INSTALL}" 
--with-wix=${WIXPATH} --with-wixgen=${WIXGEN} --with-itw-libs=BUNDLED 
--with-jdk-home="${JVMPATH}"
+echo "Build IcedTea-Web"
+make
+echo "Create IcedTea-Web Distribution"
+make win-bin-dist
+find . -name "icedtea-web-*.win.bin.zip"
+echo "Create IcedTea-Web MSI"
+make win-installer
+find . -name "icedtea-web-*.msi"
+echo "Generate shasums"
+for zip in icedtea-web-*.win.bin.zip; do
+       shasum -a 256 "$zip" > "$zip.sha256.txt"
+done
+for msi in **/icedtea-web-*.msi; do
+       shasum -a 256 "$msi" > "$msi.sha256.txt"
+done
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/IcedTea-Web-icedtea-web-1.8.4/.github/workflows/windows_sign.sh 
new/IcedTea-Web-icedtea-web-1.8.6/.github/workflows/windows_sign.sh
--- old/IcedTea-Web-icedtea-web-1.8.4/.github/workflows/windows_sign.sh 
1970-01-01 01:00:00.000000000 +0100
+++ new/IcedTea-Web-icedtea-web-1.8.6/.github/workflows/windows_sign.sh 
2021-02-23 13:05:13.000000000 +0100
@@ -0,0 +1,44 @@
+#!/bin/bash
+export WORKSPACE="${PWD}"
+export TMP_PATH="$(cygpath -u "${WORKSPACE}/tmp")"
+export RELEASE_PATH="$(cygpath -u "${WORKSPACE}/release")"
+export ARCHIVE_NAME_WITH_PATH="$(find . -name "icedtea-web-*.win.bin.zip")"
+export ARCHIVE_NAME="$(basename "${ARCHIVE_NAME_WITH_PATH}")"
+export MSI_NAME_WITH_PATH="$(find . -name "icedtea-web-*.msi")"
+export MSI_NAME="$(basename "${MSI_NAME_WITH_PATH}")"
+
+mkdir ${TMP_PATH}
+mkdir ${RELEASE_PATH}
+
+unzip -q ${ARCHIVE_NAME} -d ${TMP_PATH}
+cd ${TMP_PATH}
+
+echo "Signing Binary"
+find . -type f -name '*.exe' > sign.txt
+
+/cygdrive/c/AzureSignTool/AzureSignTool.exe sign --file-digest sha256 
--description-url "$description_url" \
+--no-page-hashing --timestamp-rfc3161 http://timestamp.digicert.com 
--timestamp-digest sha256 \
+--azure-key-vault-url "$key_vault_url" --azure-key-vault-client-id 
"$key_vault_client_id" \
+--azure-key-vault-client-secret "$key_vault_client_secret" 
--azure-key-vault-certificate "$key_vault_certificate" \
+--input-file-list sign.txt
+
+zip -rq ${ARCHIVE_NAME} *
+cp ${ARCHIVE_NAME} ${RELEASE_PATH}/${ARCHIVE_NAME}
+
+echo "Signing Installer"
+cp ${WORKSPACE}/win-installer.build/${MSI_NAME} ${TMP_PATH}/${MSI_NAME}
+
+/cygdrive/c/AzureSignTool/AzureSignTool.exe sign "${MSI_NAME}" --file-digest 
sha256 \
+--description-url "$description_url" --no-page-hashing --timestamp-rfc3161 
http://timestamp.digicert.com \
+--timestamp-digest sha256 --azure-key-vault-url "$key_vault_url" 
--azure-key-vault-client-id "$key_vault_client_id" \
+--azure-key-vault-client-secret "$key_vault_client_secret" 
--azure-key-vault-certificate "$key_vault_certificate"
+
+cp ${TMP_PATH}/${MSI_NAME} ${RELEASE_PATH}/${MSI_NAME}
+
+ls ${RELEASE_PATH}
+
+cd $RELEASE_PATH
+
+for zip in icedtea-web-*; do
+       shasum -a 256 "$zip" > "$zip.sha256.txt"
+done
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/IcedTea-Web-icedtea-web-1.8.4/ChangeLog 
new/IcedTea-Web-icedtea-web-1.8.6/ChangeLog
--- old/IcedTea-Web-icedtea-web-1.8.4/ChangeLog 2020-06-04 13:08:14.000000000 
+0200
+++ new/IcedTea-Web-icedtea-web-1.8.6/ChangeLog 2021-02-23 13:05:13.000000000 
+0100
@@ -1,3 +1,18 @@
+2021-02-23  George Adams <[email protected]>
+
+    Release changes
+       * Fix missing mslinks in Windows build
+
+2021-02-22  Hendrik Ebbers <[email protected]>
+
+        Release changes
+       * Change so that it can also be built under freebsd
+       * fix for cargo test sometimes fails when make runs with several 
simultaneous jobs
+       * JARs downloaded with URI-escaped characters don't get loaded
+       * Reduced number of threads spawned for downloading of resources
+       * handle broken XML in jnlp
+       * Migrated to GitHub Action release support
+
 2020-06-03  Hendrik Ebbers <[email protected]>
 
         Release changes
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/IcedTea-Web-icedtea-web-1.8.4/Makefile.am 
new/IcedTea-Web-icedtea-web-1.8.6/Makefile.am
--- old/IcedTea-Web-icedtea-web-1.8.4/Makefile.am       2020-06-04 
13:08:14.000000000 +0200
+++ new/IcedTea-Web-icedtea-web-1.8.6/Makefile.am       2021-02-23 
13:05:13.000000000 +0100
@@ -956,10 +956,10 @@
 # there is curently harecoded sh, so it can somehow basically work
 # see the DESKTOP_SUFFIX for final tuning
 launcher.build/$(javaws) launcher.build/$(itweb_settings) 
launcher.build/$(policyeditor): rust-launcher/src/main.rs 
rust-launcher/Cargo.toml
-       export ITW_TMP_REPLACEMENT=$(TESTS_DIR)/rust_tests_tmp ; \
-       mkdir -p $$ITW_TMP_REPLACEMENT; \
        filename=`basename $@` ; \
        type=$${filename%.*} ; \
+       export ITW_TMP_REPLACEMENT=$(TESTS_DIR)/rust_tests_tmp/$$type ; \
+       mkdir -p $$ITW_TMP_REPLACEMENT; \
        srcs=$(TOP_SRC_DIR)/rust-launcher ; \
        outs=$(TOP_BUILD_DIR)/launcher.in.$$type  ; \
        mkdir -p launcher.build  ; \
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/IcedTea-Web-icedtea-web-1.8.4/NEWS 
new/IcedTea-Web-icedtea-web-1.8.6/NEWS
--- old/IcedTea-Web-icedtea-web-1.8.4/NEWS      2020-06-04 13:08:14.000000000 
+0200
+++ new/IcedTea-Web-icedtea-web-1.8.6/NEWS      2021-02-23 13:05:13.000000000 
+0100
@@ -8,6 +8,17 @@
 
 CVE-XXXX-YYYY: http://www.cve.mitre.org/cgi-bin/cvename.cgi?name=XXXX-YYYY
 
+New in release 1.8.6 (2021-02-23):
+* Fix missing mslinks in Windows build
+
+New in release 1.8.5 (2021-02-22):
+* Change so that it can also be built under freebsd
+* fix for cargo test sometimes fails when make runs with several simultaneous 
jobs
+* JARs downloaded with URI-escaped characters don't get loaded
+* Reduced number of threads spawned for downloading of resources
+* handle broken XML in jnlp
+* Migrated to GitHub Action release support
+
 New in release 1.8.4 (2020-06-03):
 * Backport of https://github.com/AdoptOpenJDK/IcedTea-Web/pull/389
 * Backport of https://github.com/AdoptOpenJDK/IcedTea-Web/pull/384
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/IcedTea-Web-icedtea-web-1.8.4/configure.ac 
new/IcedTea-Web-icedtea-web-1.8.6/configure.ac
--- old/IcedTea-Web-icedtea-web-1.8.4/configure.ac      2020-06-04 
13:08:14.000000000 +0200
+++ new/IcedTea-Web-icedtea-web-1.8.6/configure.ac      2021-02-23 
13:05:13.000000000 +0100
@@ -1,4 +1,4 @@
-AC_INIT([icedtea-web],[1.8.4],[[email protected]], 
[icedtea-web], [http://icedtea.classpath.org/wiki/IcedTea-Web])
+AC_INIT([icedtea-web],[1.8.6],[[email protected]], 
[icedtea-web], [http://icedtea.classpath.org/wiki/IcedTea-Web])
 AM_INIT_AUTOMAKE([1.9 tar-pax foreign])
 AC_CONFIG_FILES([Makefile netx.manifest])
 AM_MAINTAINER_MODE([enable])
@@ -71,7 +71,7 @@
 build_linux=no
 build_windows=no
 case "${host_os}" in
-    linux*)
+    linux*|freebsd*)
         build_linux=yes
         ;;
     cygwin*)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/IcedTea-Web-icedtea-web-1.8.4/netx/net/sourceforge/jnlp/Launcher.java 
new/IcedTea-Web-icedtea-web-1.8.6/netx/net/sourceforge/jnlp/Launcher.java
--- old/IcedTea-Web-icedtea-web-1.8.4/netx/net/sourceforge/jnlp/Launcher.java   
2020-06-04 13:08:14.000000000 +0200
+++ new/IcedTea-Web-icedtea-web-1.8.6/netx/net/sourceforge/jnlp/Launcher.java   
2021-02-23 13:05:13.000000000 +0100
@@ -552,7 +552,7 @@
             }
 
             OutputController.getLogger().log(OutputController.Level.ERROR_ALL, 
"Starting application [" + mainName + "] ...");
-            
+
             Class<?> mainClass = app.getClassLoader().loadClass(mainName);
 
             Method main = mainClass.getMethod("main", new Class<?>[] { 
String[].class });
@@ -572,6 +572,7 @@
 
             main.setAccessible(true);
 
+            JNLPRuntime.addStartupTrackingEntry("invoking main()");
             OutputController.getLogger().log("Invoking main() with args: " + 
Arrays.toString(args));
             main.invoke(null, new Object[] { args });
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/IcedTea-Web-icedtea-web-1.8.4/netx/net/sourceforge/jnlp/OptionsDefinitions.java
 
new/IcedTea-Web-icedtea-web-1.8.6/netx/net/sourceforge/jnlp/OptionsDefinitions.java
--- 
old/IcedTea-Web-icedtea-web-1.8.4/netx/net/sourceforge/jnlp/OptionsDefinitions.java
 2020-06-04 13:08:14.000000000 +0200
+++ 
new/IcedTea-Web-icedtea-web-1.8.6/netx/net/sourceforge/jnlp/OptionsDefinitions.java
 2021-02-23 13:05:13.000000000 +0100
@@ -78,6 +78,7 @@
         JNLP("-jnlp","BOJnlp", NumberOfArguments.ONE),
         HTML("-html","BOHtml", NumberOfArguments.ONE_OR_MORE),
         BROWSER("-browser", "BrowserArg", NumberOfArguments.ONE_OR_MORE),
+        STARTUP_TRACKER("-startuptracker","BOStartupTracker"),
         //itweb settings
         LIST("-list", "IBOList"),
         GET("-get", "name", "IBOGet", NumberOfArguments.ONE_OR_MORE),
@@ -222,7 +223,8 @@
             OPTIONS.TRUSTNONE,
             OPTIONS.JNLP,
             OPTIONS.HTML,
-            OPTIONS.BROWSER
+            OPTIONS.BROWSER,
+            OPTIONS.STARTUP_TRACKER
         });
     }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/IcedTea-Web-icedtea-web-1.8.4/netx/net/sourceforge/jnlp/cache/CacheEntry.java
 
new/IcedTea-Web-icedtea-web-1.8.6/netx/net/sourceforge/jnlp/cache/CacheEntry.java
--- 
old/IcedTea-Web-icedtea-web-1.8.4/netx/net/sourceforge/jnlp/cache/CacheEntry.java
   2020-06-04 13:08:14.000000000 +0200
+++ 
new/IcedTea-Web-icedtea-web-1.8.6/netx/net/sourceforge/jnlp/cache/CacheEntry.java
   2021-02-23 13:05:13.000000000 +0100
@@ -47,6 +47,8 @@
     /** info about the cached file */
     private final PropertiesFile properties;
 
+    private File localFile;
+
     /**
      * Create a CacheEntry for the resources specified as a remote
      * URL.
@@ -58,8 +60,8 @@
         this.location = location;
         this.version = version;
         
-        File infoFile = CacheUtil.getCacheFile(location, version);
-        infoFile = new File(infoFile.getPath() + CacheDirectory.INFO_SUFFIX); 
// replace with something that can't be clobbered
+        this.localFile = CacheUtil.getCacheFile(location, version);
+        File infoFile = new File(localFile.getPath() + 
CacheDirectory.INFO_SUFFIX); // replace with something that can't be clobbered
 
         properties = new PropertiesFile(infoFile, R("CAutoGen"));
     }
@@ -130,7 +132,11 @@
      * @return whether the cache contains the version
      */
     public boolean isCurrent(long lastModified) {
-        boolean cached = isCached();
+        return isCurrent(lastModified, null);
+    }
+
+    public boolean isCurrent(long lastModified, File cachedFile) {
+        boolean cached = isCached(cachedFile);
         OutputController.getLogger().log("isCurrent:isCached " + cached);
 
         if (!cached) {
@@ -153,7 +159,16 @@
      * @return true if the resource is in the cache
      */
     public boolean isCached() {
-        File localFile = getCacheFile();
+        return isCached(null);
+    }
+
+    public boolean isCached(File cachedFile) {
+        final File localFile;
+        if (null == version && null != cachedFile) {
+            localFile = cachedFile;
+        } else {
+            localFile = getCacheFile();
+        }
         if (!localFile.exists())
             return false;
 
@@ -224,4 +239,7 @@
         return properties.isHeldByCurrentThread();
     }
 
+    public File getLocalFile() {
+        return localFile;
+    }
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/IcedTea-Web-icedtea-web-1.8.4/netx/net/sourceforge/jnlp/cache/CacheUtil.java
 
new/IcedTea-Web-icedtea-web-1.8.6/netx/net/sourceforge/jnlp/cache/CacheUtil.java
--- 
old/IcedTea-Web-icedtea-web-1.8.4/netx/net/sourceforge/jnlp/cache/CacheUtil.java
    2020-06-04 13:08:14.000000000 +0200
+++ 
new/IcedTea-Web-icedtea-web-1.8.6/netx/net/sourceforge/jnlp/cache/CacheUtil.java
    2021-02-23 13:05:13.000000000 +0100
@@ -422,14 +422,13 @@
      * @return whether the cache contains the version
      * @throws IllegalArgumentException if the source is not cacheable
      */
-    public static boolean isCurrent(URL source, Version version, long 
lastModifed) {
+    public static boolean isCurrent(URL source, Version version, long 
lastModifed, CacheEntry entry, File cachedFile) {
 
         if (!isCacheable(source, version))
             throw new IllegalArgumentException(R("CNotCacheable", source));
 
         try {
-            CacheEntry entry = new CacheEntry(source, version); // could pool 
this
-            boolean result = entry.isCurrent(lastModifed);
+            boolean result = entry.isCurrent(lastModifed, cachedFile);
 
             OutputController.getLogger().log("isCurrent: " + source + " = " + 
result);
 
@@ -796,6 +795,8 @@
             }
             URL undownloaded[] = urlList.toArray(new URL[urlList.size()]);
 
+            final int maxUrls = 
Integer.parseInt(JNLPRuntime.getConfiguration().getProperty(DeploymentConfiguration.KEY_MAX_URLS_DOWNLOAD_INDICATOR));
+
             listener = indicator.getListener(app, title, undownloaded);
 
             do {
@@ -810,20 +811,30 @@
 
                 int percent = (int) ((100 * read) / Math.max(1, total));
 
+                int urlCounter = 0;
                 for (URL url : undownloaded) {
+                    if (urlCounter > maxUrls) {
+                        break;
+                    }
                     listener.progress(url, "version",
                                       tracker.getAmountRead(url),
                                       tracker.getTotalSize(url),
                                       percent);
+                    urlCounter += 1;
                 }
             } while (!tracker.waitForResources(resources, 
indicator.getUpdateRate()));
 
             // make sure they read 100% until indicator closes
+            int urlCounter = 0;
             for (URL url : undownloaded) {
+                if (urlCounter > maxUrls) {
+                    break;
+                }
                 listener.progress(url, "version",
                                   tracker.getTotalSize(url),
                                   tracker.getTotalSize(url),
                                   100);
+                urlCounter += 1;
             }
         } catch (InterruptedException ex) {
             OutputController.getLogger().log(ex);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/IcedTea-Web-icedtea-web-1.8.4/netx/net/sourceforge/jnlp/cache/CachedDaemonThreadPoolProvider.java
 
new/IcedTea-Web-icedtea-web-1.8.6/netx/net/sourceforge/jnlp/cache/CachedDaemonThreadPoolProvider.java
--- 
old/IcedTea-Web-icedtea-web-1.8.4/netx/net/sourceforge/jnlp/cache/CachedDaemonThreadPoolProvider.java
       2020-06-04 13:08:14.000000000 +0200
+++ 
new/IcedTea-Web-icedtea-web-1.8.6/netx/net/sourceforge/jnlp/cache/CachedDaemonThreadPoolProvider.java
       2021-02-23 13:05:13.000000000 +0100
@@ -36,9 +36,14 @@
  exception statement from your version. */
 package net.sourceforge.jnlp.cache;
 
+import net.sourceforge.jnlp.config.DeploymentConfiguration;
+import net.sourceforge.jnlp.runtime.JNLPRuntime;
+
 import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
+import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
 
 public class CachedDaemonThreadPoolProvider {
@@ -81,6 +86,19 @@
         }
     }
 
-    public static final ExecutorService DAEMON_THREAD_POOL = 
Executors.newCachedThreadPool(new DaemonThreadFactory());
+    public static synchronized ExecutorService getThreadPool() {
+        if (null == DAEMON_THREAD_POOL) {
+            final int nThreads = 
Integer.parseInt(JNLPRuntime.getConfiguration().getProperty(DeploymentConfiguration.KEY_BACKGROUND_THREADS_COUNT));
+            ThreadPoolExecutor pool = new ThreadPoolExecutor(nThreads, 
nThreads,
+                    60L, TimeUnit.SECONDS,
+                    new LinkedBlockingQueue<Runnable>(),
+                    new DaemonThreadFactory());
+            pool.allowCoreThreadTimeOut(true);
+            DAEMON_THREAD_POOL = pool;
+        }
+        return DAEMON_THREAD_POOL;
+    }
+
+    private static ExecutorService DAEMON_THREAD_POOL = null;
 
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/IcedTea-Web-icedtea-web-1.8.4/netx/net/sourceforge/jnlp/cache/ResourceDownloader.java
 
new/IcedTea-Web-icedtea-web-1.8.6/netx/net/sourceforge/jnlp/cache/ResourceDownloader.java
--- 
old/IcedTea-Web-icedtea-web-1.8.4/netx/net/sourceforge/jnlp/cache/ResourceDownloader.java
   2020-06-04 13:08:14.000000000 +0200
+++ 
new/IcedTea-Web-icedtea-web-1.8.6/netx/net/sourceforge/jnlp/cache/ResourceDownloader.java
   2021-02-23 13:05:13.000000000 +0100
@@ -153,7 +153,12 @@
             URLConnection connection = 
ConnectionFactory.getConnectionFactory().openConnection(location.URL); // this 
won't change so should be okay not-synchronized
             connection.addRequestProperty("Accept-Encoding", "pack200-gzip, 
gzip");
 
-            File localFile = CacheUtil.getCacheFile(resource.getLocation(), 
resource.getDownloadVersion());
+            File localFile = null;
+            if (resource.getRequestVersion() == resource.getDownloadVersion()) 
{
+                localFile = entry.getLocalFile();
+            } else {
+                localFile = CacheUtil.getCacheFile(resource.getLocation(), 
resource.getDownloadVersion());
+            }
             Long size = location.length;
             if (size == null) {
                 size = connection.getContentLengthLong();
@@ -162,7 +167,7 @@
             if (lm == null) {
                 lm = connection.getLastModified();
             }
-            boolean current = CacheUtil.isCurrent(resource.getLocation(), 
resource.getRequestVersion(), lm) && resource.getUpdatePolicy() != 
UpdatePolicy.FORCE;
+            boolean current = CacheUtil.isCurrent(resource.getLocation(), 
resource.getRequestVersion(), lm, entry, localFile) && 
resource.getUpdatePolicy() != UpdatePolicy.FORCE;
             if (!current) {
                 if (entry.isCached()) {
                     entry.markForDelete();
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/IcedTea-Web-icedtea-web-1.8.4/netx/net/sourceforge/jnlp/cache/ResourceTracker.java
 
new/IcedTea-Web-icedtea-web-1.8.6/netx/net/sourceforge/jnlp/cache/ResourceTracker.java
--- 
old/IcedTea-Web-icedtea-web-1.8.4/netx/net/sourceforge/jnlp/cache/ResourceTracker.java
      2020-06-04 13:08:14.000000000 +0200
+++ 
new/IcedTea-Web-icedtea-web-1.8.6/netx/net/sourceforge/jnlp/cache/ResourceTracker.java
      2021-02-23 13:05:13.000000000 +0100
@@ -28,10 +28,7 @@
 import java.io.File;
 import java.net.MalformedURLException;
 import java.net.URL;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.EnumSet;
-import java.util.List;
+import java.util.*;
 
 import net.sourceforge.jnlp.DownloadOptions;
 import net.sourceforge.jnlp.Version;
@@ -105,6 +102,7 @@
 
     /** the resources known about by this resource tracker */
     private final List<Resource> resources = new ArrayList<>();
+    private final HashMap<String, Resource> resourcesMap = new HashMap<>();
 
     /** download listeners for this tracker */
     private final List<DownloadListener> listeners = new ArrayList<>();
@@ -155,6 +153,7 @@
                 return;
             resource.addTracker(this);
             resources.add(resource);
+            resourcesMap.put(location.toString(), resource);
         }
 
         if (options == null) {
@@ -190,6 +189,7 @@
 
             if (resource != null) {
                 resources.remove(resource);
+                resourcesMap.remove(location.toString());
                 resource.removeTracker(this);
             }
 
@@ -508,7 +508,7 @@
      * @param resource  resource to be download
      */
     protected void startDownloadThread(Resource resource) {
-        CachedDaemonThreadPoolProvider.DAEMON_THREAD_POOL.execute(new 
ResourceDownloader(resource, lock));
+        CachedDaemonThreadPoolProvider.getThreadPool().execute(new 
ResourceDownloader(resource, lock));
     }
 
     static Resource selectByFilter(Collection<Resource> source, 
Filter<Resource> filter) {
@@ -569,6 +569,12 @@
      */
     private Resource getResource(URL location) {
         synchronized (resources) {
+            if (null != location) {
+                Resource res = resourcesMap.get(location.toString());
+                if (null != res && UrlUtils.urlEquals(res.getLocation(), 
location)) {
+                    return res;
+                }
+            }
             for (Resource resource : resources) {
                 if (UrlUtils.urlEquals(resource.getLocation(), location))
                     return resource;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/IcedTea-Web-icedtea-web-1.8.4/netx/net/sourceforge/jnlp/config/Defaults.java
 
new/IcedTea-Web-icedtea-web-1.8.6/netx/net/sourceforge/jnlp/config/Defaults.java
--- 
old/IcedTea-Web-icedtea-web-1.8.4/netx/net/sourceforge/jnlp/config/Defaults.java
    2020-06-04 13:08:14.000000000 +0200
+++ 
new/IcedTea-Web-icedtea-web-1.8.6/netx/net/sourceforge/jnlp/config/Defaults.java
    2021-02-23 13:05:13.000000000 +0100
@@ -466,6 +466,21 @@
                         BasicValueValidators.getRangedIntegerValidator(0, 
1000),
                         String.valueOf(10)// treshold when applet is 
considered as too small
                 },
+                {
+                        DeploymentConfiguration.KEY_ENABLE_CACHE_FSYNC,
+                        BasicValueValidators.getBooleanValidator(),
+                        String.valueOf(false)
+                },
+                {
+                        DeploymentConfiguration.KEY_BACKGROUND_THREADS_COUNT,
+                        BasicValueValidators.getRangedIntegerValidator(1, 16),
+                        String.valueOf(3)
+                },
+                {
+                        
DeploymentConfiguration.KEY_MAX_URLS_DOWNLOAD_INDICATOR,
+                        BasicValueValidators.getRangedIntegerValidator(1, 
1024),
+                        String.valueOf(16)
+                },
                 //**************
                 //* Native (rust) only - beggin
                 //**************
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/IcedTea-Web-icedtea-web-1.8.4/netx/net/sourceforge/jnlp/config/DeploymentConfiguration.java
 
new/IcedTea-Web-icedtea-web-1.8.6/netx/net/sourceforge/jnlp/config/DeploymentConfiguration.java
--- 
old/IcedTea-Web-icedtea-web-1.8.4/netx/net/sourceforge/jnlp/config/DeploymentConfiguration.java
     2020-06-04 13:08:14.000000000 +0200
+++ 
new/IcedTea-Web-icedtea-web-1.8.6/netx/net/sourceforge/jnlp/config/DeploymentConfiguration.java
     2021-02-23 13:05:13.000000000 +0100
@@ -250,7 +250,10 @@
     public static final String KEY_SMALL_SIZE_OVERRIDE_TRESHOLD = 
"deployment.small.size.treshold";
     public static final String KEY_SMALL_SIZE_OVERRIDE_WIDTH = 
"deployment.small.size.override.width";
     public static final String KEY_SMALL_SIZE_OVERRIDE_HEIGHT = 
"deployment.small.size.override.height";
-    
+    public static final String KEY_ENABLE_CACHE_FSYNC = 
"deployment.enable.cache.fsync";
+    public static final String KEY_BACKGROUND_THREADS_COUNT = 
"deployment.background.threads.count";
+    public static final String KEY_MAX_URLS_DOWNLOAD_INDICATOR = 
"deployment.max.urls.download.indicator";
+
     public static final String TRANSFER_TITLE = "Legacy configuration and 
cache found. Those will be now transported to new locations";
     
     private ConfigurationException loadingException = null;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/IcedTea-Web-icedtea-web-1.8.4/netx/net/sourceforge/jnlp/resources/Messages.properties
 
new/IcedTea-Web-icedtea-web-1.8.6/netx/net/sourceforge/jnlp/resources/Messages.properties
--- 
old/IcedTea-Web-icedtea-web-1.8.4/netx/net/sourceforge/jnlp/resources/Messages.properties
   2020-06-04 13:08:14.000000000 +0200
+++ 
new/IcedTea-Web-icedtea-web-1.8.6/netx/net/sourceforge/jnlp/resources/Messages.properties
   2021-02-23 13:05:13.000000000 +0100
@@ -357,6 +357,7 @@
 BOHelp1     = Prints out information about supported command and basic usage.
 BOHelp2     = Prints out information about supported command and basic usage. 
Can also take an parameter, and then it prints detailed help for this command.
 BOTrustnone = Instead of asking user, will foretold all answers as no.
+BOStartupTracker = Enable startup time tracker
 
 # Itweb-settings boot commands
 IBOList=Shows a list of all the IcedTea-Web settings and their current values.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/IcedTea-Web-icedtea-web-1.8.4/netx/net/sourceforge/jnlp/runtime/Boot.java 
new/IcedTea-Web-icedtea-web-1.8.6/netx/net/sourceforge/jnlp/runtime/Boot.java
--- 
old/IcedTea-Web-icedtea-web-1.8.4/netx/net/sourceforge/jnlp/runtime/Boot.java   
    2020-06-04 13:08:14.000000000 +0200
+++ 
new/IcedTea-Web-icedtea-web-1.8.6/netx/net/sourceforge/jnlp/runtime/Boot.java   
    2021-02-23 13:05:13.000000000 +0100
@@ -107,6 +107,10 @@
 
         optionParser = new OptionParser(argsIn, 
OptionsDefinitions.getJavaWsOptions());
 
+        if 
(optionParser.hasOption(OptionsDefinitions.OPTIONS.STARTUP_TRACKER)) {
+            JNLPRuntime.initStartupTracker();
+        }
+
         if (optionParser.hasOption(OptionsDefinitions.OPTIONS.VERBOSE)) {
             JNLPRuntime.setDebug(true);
         }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/IcedTea-Web-icedtea-web-1.8.4/netx/net/sourceforge/jnlp/runtime/CachedJarFileCallback.java
 
new/IcedTea-Web-icedtea-web-1.8.6/netx/net/sourceforge/jnlp/runtime/CachedJarFileCallback.java
--- 
old/IcedTea-Web-icedtea-web-1.8.4/netx/net/sourceforge/jnlp/runtime/CachedJarFileCallback.java
      2020-06-04 13:08:14.000000000 +0200
+++ 
new/IcedTea-Web-icedtea-web-1.8.6/netx/net/sourceforge/jnlp/runtime/CachedJarFileCallback.java
      2021-02-23 13:05:13.000000000 +0100
@@ -43,6 +43,7 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
+import java.net.URISyntaxException;
 import java.net.URL;
 import java.net.URLConnection;
 import java.security.AccessController;
@@ -103,9 +104,11 @@
 
         if (UrlUtils.isLocalFile(localUrl)) {
             // if it is known to us, just return the cached file
-            JarFile returnFile = new JarFile(localUrl.getPath());
+            JarFile returnFile=null;
             
             try {
+               localUrl.toURI().getPath();
+               returnFile = new JarFile(localUrl.toURI().getPath());
                 
                 // Blank out the class-path because:
                 // 1) Web Start does not support it
@@ -117,6 +120,8 @@
 
             } catch (NullPointerException npe) {
                 // Discard NPE here. Maybe there was no manifest, maybe there 
were no attributes, etc.
+                       } catch (URISyntaxException e) {
+                               // should not happen as localUrl was built 
using localFile.toURI().toURL(), see JNLPClassLoader.activateJars(List<JARDesc>)
             }
 
             return returnFile;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/IcedTea-Web-icedtea-web-1.8.4/netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java
 
new/IcedTea-Web-icedtea-web-1.8.6/netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java
--- 
old/IcedTea-Web-icedtea-web-1.8.4/netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java
    2020-06-04 13:08:14.000000000 +0200
+++ 
new/IcedTea-Web-icedtea-web-1.8.6/netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java
    2021-02-23 13:05:13.000000000 +0100
@@ -709,7 +709,9 @@
             fillInPartJars(initialJars); // add in each initial part's lazy 
jars
         }
 
+        JNLPRuntime.addStartupTrackingEntry("JARs download enter");
         waitForJars(initialJars); //download the jars first.
+        JNLPRuntime.addStartupTrackingEntry("JARs download complete");
 
         //A ZipException will propagate later on if the jar is invalid and not 
checked here
         if (shouldFilterInvalidJars()) {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/IcedTea-Web-icedtea-web-1.8.4/netx/net/sourceforge/jnlp/runtime/JNLPRuntime.java
 
new/IcedTea-Web-icedtea-web-1.8.6/netx/net/sourceforge/jnlp/runtime/JNLPRuntime.java
--- 
old/IcedTea-Web-icedtea-web-1.8.4/netx/net/sourceforge/jnlp/runtime/JNLPRuntime.java
        2020-06-04 13:08:14.000000000 +0200
+++ 
new/IcedTea-Web-icedtea-web-1.8.6/netx/net/sourceforge/jnlp/runtime/JNLPRuntime.java
        2021-02-23 13:05:13.000000000 +0100
@@ -170,6 +170,7 @@
 
     private static Boolean onlineDetected = null;
 
+    private static long startupTrackerMoment = 0;
 
     /** 
      * Header is not checked and so eg
@@ -891,6 +892,19 @@
         JNLPRuntime.ignoreHeaders = ignoreHeaders;
     }
 
+    // may only be called from Boot
+    public static void initStartupTracker() {
+        startupTrackerMoment = System.currentTimeMillis();
+    }
+
+    public static void addStartupTrackingEntry(String message) {
+        if (startupTrackerMoment > 0) {
+            long time = (System.currentTimeMillis() - 
startupTrackerMoment)/1000;
+            String msg = "Startup tracker: seconds elapsed: [" + time + "], 
message: [" + message + "]";
+            OutputController.getLogger().log(OutputController.Level.ERROR_ALL, 
msg);
+        }
+    }
+
     private static boolean isPluginDebug() {
         if (pluginDebug == null) {
             try {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/IcedTea-Web-icedtea-web-1.8.4/netx/net/sourceforge/jnlp/tools/JarCertVerifier.java
 
new/IcedTea-Web-icedtea-web-1.8.6/netx/net/sourceforge/jnlp/tools/JarCertVerifier.java
--- 
old/IcedTea-Web-icedtea-web-1.8.4/netx/net/sourceforge/jnlp/tools/JarCertVerifier.java
      2020-06-04 13:08:14.000000000 +0200
+++ 
new/IcedTea-Web-icedtea-web-1.8.6/netx/net/sourceforge/jnlp/tools/JarCertVerifier.java
      2021-02-23 13:05:13.000000000 +0100
@@ -39,15 +39,18 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.Vector;
+import java.util.concurrent.Callable;
+import java.util.concurrent.Future;
 import java.util.jar.JarEntry;
 import java.util.regex.Pattern;
 
 import net.sourceforge.jnlp.JARDesc;
 import net.sourceforge.jnlp.JNLPFile;
 import net.sourceforge.jnlp.LaunchException;
+import net.sourceforge.jnlp.cache.CachedDaemonThreadPoolProvider;
 import net.sourceforge.jnlp.cache.ResourceTracker;
 import net.sourceforge.jnlp.runtime.JNLPClassLoader.SecurityDelegate;
+import net.sourceforge.jnlp.runtime.JNLPRuntime;
 import net.sourceforge.jnlp.security.AppVerifier;
 import net.sourceforge.jnlp.security.CertVerifier;
 import net.sourceforge.jnlp.security.CertificateUtils;
@@ -226,37 +229,36 @@
     private void verifyJars(List<JARDesc> jars, ResourceTracker tracker)
             throws Exception {
 
+        List<String> filesToVerify = new ArrayList<>();
         for (JARDesc jar : jars) {
+            File jarFile = tracker.getCacheFile(jar.getLocation());
 
-            try {
-
-                File jarFile = tracker.getCacheFile(jar.getLocation());
+            // some sort of resource download/cache error. Nothing to add
+            // in that case ... but don't fail here
+            if (jarFile == null) {
+                continue;
+            }
 
-                // some sort of resource download/cache error. Nothing to add
-                // in that case ... but don't fail here
-                if (jarFile == null) {
-                    continue;
-                }
+            String localFile = jarFile.getAbsolutePath();
+            if (verifiedJars.contains(localFile)
+                    || unverifiedJars.contains(localFile)) {
+                continue;
+            }
 
-                String localFile = jarFile.getAbsolutePath();
-                if (verifiedJars.contains(localFile)
-                        || unverifiedJars.contains(localFile)) {
-                    continue;
-                }
+            filesToVerify.add(localFile);
+        }
 
-                VerifyResult result = verifyJar(localFile);
+        List<VerifiedJarFile> verified = verifyJarsParallel(filesToVerify);
 
-                if (result == VerifyResult.UNSIGNED) {
-                    unverifiedJars.add(localFile);
-                } else if (result == VerifyResult.SIGNED_NOT_OK) {
-                    verifiedJars.add(localFile);
-                } else if (result == VerifyResult.SIGNED_OK) {
-                    verifiedJars.add(localFile);
-                }
-            } catch (Exception e) {
-                // We may catch exceptions from using verifyJar()
-                // or from checkTrustedCerts
-                throw e;
+        for (VerifiedJarFile vjf : verified) {
+            VerifyResult result = verifyJarEntryCerts(vjf.file, 
vjf.hasManifest, vjf.entriesVec);
+            String localFile = vjf.file;
+            if (result == VerifyResult.UNSIGNED) {
+                unverifiedJars.add(localFile);
+            } else if (result == VerifyResult.SIGNED_NOT_OK) {
+                verifiedJars.add(localFile);
+            } else if (result == VerifyResult.SIGNED_OK) {
+                verifiedJars.add(localFile);
             }
         }
 
@@ -264,6 +266,31 @@
             checkTrustedCerts(certPath);
     }
 
+    private List<VerifiedJarFile> verifyJarsParallel(List<String> files) 
throws Exception {
+        JNLPRuntime.addStartupTrackingEntry("JARs verification enter");
+        List<Callable<VerifiedJarFile>> callables = new 
ArrayList<>(files.size());
+        for (final String fi : files) {
+            callables.add(new Callable<VerifiedJarFile>() {
+                @Override
+                public VerifiedJarFile call() throws Exception {
+                    return verifyJar(fi);
+                }
+            });
+        }
+        List<Future<VerifiedJarFile>> futures = 
CachedDaemonThreadPoolProvider.getThreadPool().invokeAll(callables);
+        List<VerifiedJarFile> results = new ArrayList<>(files.size());
+        try {
+            for (Future<VerifiedJarFile> fu : futures) {
+                results.add(fu.get());
+            }
+        } catch (Exception e) {
+            OutputController.getLogger().log(OutputController.Level.ERROR_ALL, 
e);
+            throw e;
+        }
+        JNLPRuntime.addStartupTrackingEntry("JARs verification complete");
+        return results;
+    }
+
     /**
      * Checks through all the jar entries of jarName for signers, storing all 
the common ones in the certs hash map.
      * 
@@ -273,15 +300,15 @@
      * @throws Exception
      *             Will be thrown if there are any problems with the jar.
      */
-    private VerifyResult verifyJar(String jarName) throws Exception {
+    private VerifiedJarFile verifyJar(String jarName) throws Exception {
         try (JarFile jarFile = new JarFile(jarName, true)) {
-            Vector<JarEntry> entriesVec = new Vector<JarEntry>();
+            List<JarEntry> entriesVec = new ArrayList<>();
             byte[] buffer = new byte[8192];
 
             Enumeration<JarEntry> entries = jarFile.entries();
             while (entries.hasMoreElements()) {
                 JarEntry je = entries.nextElement();
-                entriesVec.addElement(je);
+                entriesVec.add(je);
 
                 InputStream is = jarFile.getInputStream(je);
                 try {
@@ -295,8 +322,7 @@
                     }
                 }
             }
-            return verifyJarEntryCerts(jarName, jarFile.getManifest() != null,
-                    entriesVec);
+            return new VerifiedJarFile(jarName, null != jarFile.getManifest(), 
entriesVec);
 
         } catch (Exception e) {
             OutputController.getLogger().log(OutputController.Level.ERROR_ALL, 
e);
@@ -318,7 +344,7 @@
      *             Will be thrown if there are issues with entries.
      */
     VerifyResult verifyJarEntryCerts(String jarName, boolean jarHasManifest,
-            Vector<JarEntry> entries) throws Exception {
+            List<JarEntry> entries) throws Exception {
         // Contains number of entries the cert with this CertPath has signed.
         Map<CertPath, Integer> jarSignCount = new HashMap<>();
         int numSignableEntriesInJar = 0;
@@ -629,4 +655,16 @@
         }
         return sum;
     }
+
+    private static class VerifiedJarFile {
+        final String file;
+        final boolean hasManifest;
+        private final List<JarEntry> entriesVec;
+
+        private VerifiedJarFile(String file, boolean hasManifest, 
List<JarEntry> entriesVec) {
+            this.file = file;
+            this.hasManifest = hasManifest;
+            this.entriesVec = entriesVec;
+        }
+    }
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/IcedTea-Web-icedtea-web-1.8.4/netx/net/sourceforge/jnlp/util/PropertiesFile.java
 
new/IcedTea-Web-icedtea-web-1.8.6/netx/net/sourceforge/jnlp/util/PropertiesFile.java
--- 
old/IcedTea-Web-icedtea-web-1.8.4/netx/net/sourceforge/jnlp/util/PropertiesFile.java
        2020-06-04 13:08:14.000000000 +0200
+++ 
new/IcedTea-Web-icedtea-web-1.8.6/netx/net/sourceforge/jnlp/util/PropertiesFile.java
        2021-02-23 13:05:13.000000000 +0100
@@ -23,6 +23,8 @@
 import java.io.InputStream;
 import java.util.Properties;
 
+import net.sourceforge.jnlp.config.DeploymentConfiguration;
+import net.sourceforge.jnlp.runtime.JNLPRuntime;
 import net.sourceforge.jnlp.util.lockingfile.LockedFile;
 import net.sourceforge.jnlp.util.logging.OutputController;
 
@@ -168,7 +170,9 @@
                 store(s, header);
 
                 // fsync()
-                s.getChannel().force(true);
+                if 
(Boolean.parseBoolean(JNLPRuntime.getConfiguration().getProperty(DeploymentConfiguration.KEY_ENABLE_CACHE_FSYNC)))
 {
+                    s.getChannel().force(true);
+                }
                 lastStore = file.lastModified();
             } finally {
                 if (s != null) s.close();
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/IcedTea-Web-icedtea-web-1.8.4/netx/net/sourceforge/nanoxml/XMLElement.java 
new/IcedTea-Web-icedtea-web-1.8.6/netx/net/sourceforge/nanoxml/XMLElement.java
--- 
old/IcedTea-Web-icedtea-web-1.8.4/netx/net/sourceforge/nanoxml/XMLElement.java  
    2020-06-04 13:08:14.000000000 +0200
+++ 
new/IcedTea-Web-icedtea-web-1.8.6/netx/net/sourceforge/nanoxml/XMLElement.java  
    2021-02-23 13:05:13.000000000 +0100
@@ -1002,7 +1002,8 @@
         }
         if (buf.length() == 0) {
             while (ch != '/') {
-                if (ch == '!') {
+                // jnlp files from a MFSys25  contain '<?-- JViewerVersion 
3.30a -->', Treat as a comment
+                if (ch == '!' || ch == '?') {
                     ch = this.readChar();
                     if (ch != '-') {
                         throw this.expectedInput("Comment or Element");
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/IcedTea-Web-icedtea-web-1.8.4/tests/netx/unit/net/sourceforge/jnlp/runtime/CachedJarFileCallbackTest.java
 
new/IcedTea-Web-icedtea-web-1.8.6/tests/netx/unit/net/sourceforge/jnlp/runtime/CachedJarFileCallbackTest.java
--- 
old/IcedTea-Web-icedtea-web-1.8.4/tests/netx/unit/net/sourceforge/jnlp/runtime/CachedJarFileCallbackTest.java
       1970-01-01 01:00:00.000000000 +0100
+++ 
new/IcedTea-Web-icedtea-web-1.8.6/tests/netx/unit/net/sourceforge/jnlp/runtime/CachedJarFileCallbackTest.java
       2021-02-23 13:05:13.000000000 +0100
@@ -0,0 +1,55 @@
+package net.sourceforge.jnlp.runtime;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URL;
+import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
+import java.util.Arrays;
+import java.util.List;
+import java.util.jar.JarFile;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import net.sourceforge.jnlp.util.FileTestUtils;
+import net.sourceforge.jnlp.util.FileUtils;
+
+public class CachedJarFileCallbackTest {
+       private File tempDirectory;
+
+       @Before
+       public void before() throws IOException {
+               tempDirectory = FileTestUtils.createTempDirectory();
+       }
+
+       @After
+       public void after() throws IOException {
+               FileUtils.recursiveDelete(tempDirectory, 
tempDirectory.getParentFile());
+       }
+
+       @Test
+       public void testRetrieve() throws Exception {
+               List<String> names = Arrays.asList("test1.0.jar", 
"[email protected]");
+               
+               for (String name: names) {
+                       // URL-encode the filename
+                       name = URLEncoder.encode(name, 
StandardCharsets.UTF_8.name());
+                       // create temp jar file
+                       File jarFile = new File(tempDirectory, name);
+                       FileTestUtils.createJarWithContents(jarFile /* no 
contents */);
+
+                       // JNLPClassLoader.activateJars uses toUri().toURL() to 
get the local file URL
+                       URL localUrl = jarFile.toURI().toURL();
+                       URL remoteUrl = new URL("http://localhost/"; + name);
+                       // add jar to cache
+                       CachedJarFileCallback cachedJarFileCallback = 
CachedJarFileCallback.getInstance();
+                       cachedJarFileCallback.addMapping(remoteUrl, localUrl);
+                       // retrieve from cache (throws exception if file not 
found)
+                       try (JarFile fromCacheJarFile = 
cachedJarFileCallback.retrieve(remoteUrl)) {
+                               // nothing to do, we just wanted to make sure 
that the local file existed
+                       }
+               }
+       }
+}

Reply via email to