#!/bin/sh
#
# Copyright (c) 2007, 2020, 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.  Oracle designates this
# particular file as subject to the "Classpath" exception as provided
# by Oracle in the LICENSE file that accompanied this code.
#
# 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

if [ -f "`dirname "$PRG"`/../Resources/visualvm/etc/visualvm.conf" ] ; then
    PRG="`dirname "$PRG"`/../Resources/visualvm/bin/visualvm"
fi

progdir=`dirname "$PRG"`
old=`pwd`
cd "$progdir"/..
basedir=`pwd`
cd "$old"

case "`uname`" in
    Darwin*)
        # set default userdir and cachedir on macOS
        DEFAULT_USERDIR_ROOT="${HOME}/Library/Application Support/VisualVM"
        DEFAULT_CACHEDIR_ROOT=${HOME}/Library/Caches/VisualVM
        ;;
    *) 
        # set default userdir and cachedir on unix systems
        DEFAULT_USERDIR_ROOT=${HOME}/.visualvm
        DEFAULT_CACHEDIR_ROOT=${HOME}/.cache/visualvm
        ;;
esac


if [ -f "$progdir"/../lib/visualvm/etc/visualvm.conf ] ; then
    visualvm_jdkhome="$basedir"
    old=`pwd`
    cd "$progdir/../lib/visualvm/"
    basedir=`pwd`
    cd "$old"
    . "$progdir"/../lib/visualvm/etc/visualvm.conf
elif [ -f "$progdir"/../etc/visualvm.conf ] ; then
    . "$progdir"/../etc/visualvm.conf
fi


export DEFAULT_USERDIR_ROOT

# #68373: look for userdir, but do not modify "$@"
userdir="${visualvm_default_userdir}"
cachedir="${visualvm_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/visualvm.conf ] ; then
    . "${userdir}"/etc/visualvm.conf
fi


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

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

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

visualvm_clusters=`readClusters | absolutize_paths | tr '\012' ':'`

if [ ! -z "$visualvm_extraclusters" ] ; then
    visualvm_clusters="$visualvm_clusters:$visualvm_extraclusters"
fi

heap_size () {
    mem=640
    case "`uname`" in
        Linux*)
        mem=`cat /proc/meminfo | grep MemTotal | tr -d [:space:][:alpha:]:`
        mem=`expr $mem / 1024`
        ;;
    SunOS*)
        mem=`/usr/sbin/prtconf | grep Memory | /usr/bin/tr -dc '[0-9]'`
        ;;
    Darwin*)
        mem=`/usr/sbin/sysctl hw.memsize | tr -d [:alpha:][:space:].:`
        mem=`expr $mem / 1048576`
        ;;
        *) 
        ;;
    esac
    if [ -z "$mem" ] ; then
        mem=640
    fi
    mem=`expr $mem / 5`
    if [ $mem -gt 1024 ] ; then
        mem=1024
    elif [ $mem -lt 96 ] ; then
        mem=96
    fi
    max_heap_size=$mem
    return 0
}


if grep -v -- "-J-Xmx" >/dev/null <<EOF ; then
${visualvm_default_options}
EOF
        heap_size
	visualvm_default_options="-J-Xmx${max_heap_size}m ${visualvm_default_options}"
fi

launchNbexec() {
    nbexec=`grep -v "^#" "$basedir"/etc/visualvm.clusters | grep -v "^$" | grep platform | while read 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`
    if [ \! -n "$nbexec" ] ; then
      nbexec="$basedir"/platform/lib/nbexec
    fi
    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 macOS, 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 '"$visualvm_jdkhome"' \
            -J-Xdock:name=VisualVM \
            '"-J-Xdock:icon=$basedir/etc/visualvm.icns"' \
            --branding visualvm \
            --clusters '"$visualvm_clusters"' \
            --laf com.apple.laf.AquaLookAndFeel \
            ${visualvm_default_options} \
            '"$@"'
        ;;
    *)
        eval launchNbexec \
            --jdkhome '"$visualvm_jdkhome"' \
            --branding visualvm \
            --clusters '"$visualvm_clusters"' \
            ${visualvm_default_options} \
            '"$@"'
        ;;
esac
