#!/bin/sh

# Copyright (c) 2013, 2022, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation.
#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.


#
# resolve symlinks
#

PRG=$0

while [ -h "$PRG" ]; do
    ls=$(ls -ld "$PRG")
    link=$(expr "$ls" : '^.*-> \(.*\)$' 2>/dev/null)
    if expr "$link" : '^/' 2> /dev/null >/dev/null; then
	PRG="$link"
    else
	PRG="$(dirname "$PRG")/$link"
    fi
done

progdir=$(dirname "$PRG")
APPNAME=$(basename "$PRG")
old=$(pwd)
cd "$progdir"/.. || exit 1
basedir=$(pwd)
cd "$old" || exit 1
LIBNAME="visualizer"



case "$(uname)" in
	Darwin*)
		# set default userdir and cachedir on Mac OS X
		DEFAULT_USERDIR_ROOT="${HOME}/Library/Application Support/${APPNAME}"
		DEFAULT_CACHEDIR_ROOT="${HOME}/Library/Caches/${APPNAME}"
	;;
	*) 
        # set default userdir and cachedir on unix systems
        DEFAULT_USERDIR_ROOT="${HOME}/.${APPNAME}"
        DEFAULT_CACHEDIR_ROOT="${HOME}/.cache/${APPNAME}"
        ;;
esac

export DEFAULT_USERDIR_ROOT
export DEFAULT_CACHEDIR_ROOT

if [ -f "${basedir}/../../lib/${LIBNAME}/etc/${APPNAME}".conf ] ; then
    old=$(pwd)
    cd "$basedir/../.." || exit 1
    jdkhome=$(pwd)    
    cd "$old" || exit 1
fi
if [ -f "$basedir/etc/${APPNAME}".conf ] ; then
    . "$basedir/etc/${APPNAME}".conf
fi

# #68373: look for userdir, but do not modify "$@"
userdir="${default_userdir}"
cachedir="${default_cachedir}"

founduserdir=""
for opt in "$@"; do
    if [ "${founduserdir}" = "yes" ]; then
        userdir="$opt"
        break
    elif [ "$opt" = "--userdir" ]; then
        founduserdir="yes"
    fi
done
foundcachedir=""
for opt in "$@"; do
    if [ "${foundcachedir}" = "yes" ]; then
        cachedir="$opt"
        break
    elif [ "$opt" = "--cachedir" ]; then
        foundcachedir="yes"
    fi
done

if [ -f "${userdir}/etc/$APPNAME".conf ] ; then
    . "${userdir}/etc/$APPNAME".conf
fi

if [ -n "$jdkhome" ] && [ ! -d "$jdkhome" ] && [ -d "$progdir/../$jdkhome" ]; then
    # #74333: permit jdkhome to be defined as relative to app dir
    jdkhome="$progdir/../$jdkhome"
fi

if [ ! -f "$basedir/etc/${APPNAME}".clusters ]; then
    echo Cannot read cluster file: "$basedir/etc/${APPNAME}.clusters" 1>&2
    exit 1
fi

readClusters() {
    grep -v "^#" "$basedir/etc/${APPNAME}".clusters | grep -v "^$" | grep -v platform | while read -r X; do
        if expr "$X" : "/.*" >/dev/null; then
            echo "$X"
  else
            echo "$basedir/$X"
  fi
  done
}

absolutize_paths() {
    while read -r path; do
        if [ -d "$path" ]; then
            (cd "$path" 2>/dev/null && pwd)
        else
            echo "$path"
        fi
    done
}

clusters=$(readClusters | absolutize_paths | tr '\012' ':')

if [ ! -z "$extra_clusters" ] ; then
    clusters="$clusters:$extra_clusters"
fi

launchNbexec() {
    nbexec=$(grep -v "^#" "$basedir/etc/${APPNAME}".clusters | grep -v "^$" | grep platform | while read -r X; do
        if expr "$X" : "/.*" >/dev/null; then
           echo "$X/lib/nbexec"
        elif [ -f "$basedir/$X/lib/nbexec" ]; then
            echo "$basedir/$X/lib/nbexec"
        fi
    done | head -n 1)
    sh=sh
    # #73162: Ubuntu uses the ancient Bourne shell, which does not implement trap well.
    if [ -x /bin/bash ]
    then
        sh=/bin/bash
    fi
    if [ "${founduserdir}" = "yes" ]; then
        exec $sh "$nbexec" "$@"
    else
        if [ "${foundcachedir}" = "yes" ]; then
            exec $sh "$nbexec" --userdir "${userdir}" "$@"
        else
            exec $sh "$nbexec" --userdir "${userdir}" --cachedir "${cachedir}" "$@"
        fi
    fi
}

# in case of macosx, the apple.laf.useScreenMenuBar property should be ideally in the Info.plist file
# but it doesn't get propagated into the executed java VM. 
case "$(uname)" in
    Darwin*)
        eval launchNbexec \
            --jdkhome '"$jdkhome"' \
            -J-Xdock:name="${APPNAME}" \
            '"-J-Xdock:icon=$basedir/${APPNAME}/${APPNAME}.icns"' \
            --branding "${APPNAME}" \
            --clusters '"$clusters"' \
            -J-Dnetbeans.importclass=org.graalvm.visualizer.upgrader.Upgrader \
            ${default_options} \
            '"$@"'
        ;;
    *)  
        eval launchNbexec \
            --jdkhome '"$jdkhome"' \
            --branding "${APPNAME}" \
            --clusters '"$clusters"' \
            -J-Dnetbeans.importclass=org.graalvm.visualizer.upgrader.Upgrader \
            ${default_options} \
            '"$@"'
        ;;
esac
