view package-files/osx/JavaApplicationStub @ 31:99a0eb385c9a default tip

Work around annoying Swing glitch.
author David Barts <n5jrn@me.com>
date Sat, 20 Aug 2022 09:19:49 -0700
parents 92afaa27f40a
children
line wrap: on
line source

#!/bin/bash

# This is based on Tobias Fischer's universalJavaApplicationStub:
# https://github.com/tofi86/universalJavaApplicationStub
#
# Therefore this part of JpegWasher is covered by the same MIT license
# that his code is:
#
# The MIT License (MIT)
#
# Copyright (c) 2014-2020 Tobias Fischer
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.

# Establish our application names
appname="@app.name@"
appdom="@app.domain@"

# Make a place for our logs to go
appsupp="$HOME/Library/Application Support/$appdom"
logfile="$appsupp/launcher.log"

function die {
    osascript -e "tell application \"System Events\" to display dialog \"${1}\" with title \"Fatal Error\" buttons {\" OK \"} default button 1"
    exit ${2:-1}
}

# Initialize files and dirs, bail if we can't.
if [ ! -d "$appsupp" ]
then
    if ! mkdir -p "$appsupp"
    then
		die "Unable to create folder '$appsupp'" 2
    fi
fi
> "$logfile"
if [ $? -ne 0 ]
then
    die "Unable to create file '$logfile'" 2
fi

function stub_logger {
    echo "$(date +%c) - $1" >> "$logfile"
}

# Was originally just for debugging, but I think this could be useful
# for later troubleshooting "in the wild."
stub_logger "execution begins"
{
    echo "****** BEGIN ARGUMENT AND ENVIRONMENT DUMP *******"
    echo "Arguments:" "$0" "$@"
    echo "Directory:" $(pwd)
    env
    echo "******* END ARGUMENT AND ENVIRONMENT DUMP ********"
} >> "$logfile"

# Change to the application root directory, two up from where this script
# (which should contain an absolute path) is.
mydir="${0%/*}"
cd "$mydir/../.." || die "Unable to cd '$mydir/../..'"

# Determine where Java is, bail if we can't.
if [ -n "$JAVA_HOME" ]
then
    if [ ! -d "$JAVA_HOME" ]
    then
        die "'$JAVA_HOME' does not exist"
    fi
else
    export JAVA_HOME="$(/usr/libexec/java_home)"
    if [ $? -ne 0 -o ! -d "$JAVA_HOME" ]
    then
        die "Unable to locate Java."
    fi
fi

java="$JAVA_HOME/bin/java"
if [ ! -x "$java" ]
then
    die "'$java' not found or not executable"
fi

function plist_get {
	/usr/libexec/PlistBuddy -c "print $1" Contents/Info.plist 2> /dev/null
}
function must_get {
    plist_get "$@" || die "Info.plist key '$1' not found."
}

# Load some parameters from Contents/Info.plist
estat=0
CFBundleName=$(must_get ':CFBundleName')
CFBundleIconFile=$(must_get ':CFBundleIconFile')
JVMMainClassName=$(must_get ':JVMMainClassName')
JVMClassPath=$(must_get ':JVMClassPath')
JVMVersion=$(must_get ':JVMVersion')

# Sanity check our JVM version
if [[ "$JVMVersion" == *+ ]]
then
    op='>'
    JVMVersion="${JVMVersion%+}"
else
    op='='
fi
version=$("$java" -version 2>&1 | awk '/version/{print $3}' | sed -E -e 's/"//g' -e 's/-ea//g')
if [ ! "$version" "$op" "$JVMVersion" ]
then
    die "'$java' too old"
fi

# Load the JVMOptions array (if found)
JVMOptions=()
let i=0
while true
do
    j="$(plist_get :JVMOptions:$i)"
    if [ -z "$j" ]
    then
        break
    fi
    JVMOptions+=("$j")
    let i+=1
done

# Fatal error if we cannot change to HOME or HOME not defined
approot="$(pwd)"
if [ -z "$HOME" ]
then
    die "HOME not defined!"
fi
cd "$HOME" || die "Unable to cd '$HOME'"

# And off we go!
jcmd=( "$JAVA_HOME/bin/java" -cp "$approot/$JVMClassPath"
    -Xdock:icon="$approot/Contents/Resources/$CFBundleIconFile"
    -Xdock:name="$CFBundleName" "${JVMOptions[@]}" "$JVMMainClassName" )

stub_logger "Executing: ${jcmd[*]}"
exec "${jcmd[@]}"

# This shouldn't happen...
die "Could not launch Java."