#!/bin/sh

# qftest start script

#----------------------------------------------------------------------
# Parse arguments and split them into
# - args for this script: -dbg, -java
# - args for java: everything starting with -J
# - qftest args: the rest
#----------------------------------------------------------------------
jexe=java
jargs=
qfargs=
mainclass=QFTest

# Do not use CLASSPATH any longer
if [ -n "$CLASSPATH" ]; then
    export CLASSPATH=
fi
if [ -n "$QFTEST_CLASSPATH" ]; then
    export CLASSPATH=$QFTEST_CLASSPATH
fi

classpath=$CLASSPATH
systemdir=
if [ -n "$ZSH_VERSION" ]; then
    setopt shwordsplit 2> /dev/null # only required for zsh
fi

while [ $# -gt 0 ]; do
    case "$1" in
        -J*)
            sarg=$1;;
        -*)
            sarg=-$(echo "$1" | tr '[:upper:]' '[:lower:]' | tr -d ._:-);;
        *)
            sarg=$1;;
    esac
    case $sarg in
        -dbg)
            QFTEST_DEBUG=1; export QFTEST_DEBUG
            qfargs="$qfargs '$1'"
            ;;
        -batch)
            mainclass=QFTestRunner
            ;;
        -noagent)
            noagent=1
            ;;
        -ipv6 | -ip6)
            ipv6=1
            ;;
        -systemdir)
            if [ $# -eq 1 ]; then
                echo Need argument for $1 >&2
                exit 254
            fi
            shift
            systemdir=$1
            echo "got systemdir: '$systemdir'"
            qfargs="$qfargs -systemdir '$1'"
            ;;
        -systemdir=*)
            systemdir=`expr "$1" : '-[^=]*=\(.*\)'`
            echo "got systemdir: '$systemdir'"
            qfargs="$qfargs '$1'"
            ;;
        -java)
            if [ $# -eq 1 ]; then
                echo Need argument for $1 >&2
                exit 254
            fi
            shift
            jexe=$1
            skipjexe=1
            ;;
        -J-cp | -J-classpath)
            if [ $# -eq 1 ]; then
                echo Need argument for $1 >&2
                exit 254
            fi
            shift
            classpath=$1
            ;;
        -J-Xbootclasspath/p:*)
            noxboot=1
            arg=`expr "$1" : '-J\(.*\)'`
            jargs="$jargs '$arg'"
            ;;
        -J-Duser.language=*)
            nolang=1
            arg=`expr "$1" : '-J\(.*\)'`
            jargs="$jargs '$arg'"
            ;;
        -J-Dqftest.home=*)
            noqftesthome=1
            arg=`expr "$1" : '-J\(.*\)'`
            jargs="$jargs '$arg'"
            shift
            ;;
        -J-Dqftest.versionhome=*)
            noqftestversionhome=1
            arg=`expr "$1" : '-J\(.*\)'`
            jargs="$jargs '$arg'"
            shift
            ;;
        -J-Dqftest.java=*)
            noqftestjava=1
            arg=`expr "$1" : '-J\(.*\)'`
            jargs="$jargs '$arg'"
            shift
            ;;
        -J-Dqftest.editor=*)
            noeditor=1
            arg=`expr "$1" : '-J\(.*\)'`
            jargs="$jargs '$arg'"
            shift
            ;;
	-J-Dsun.io.useCanonCaches=*)
	    nocanoncache=1
            arg=`expr "$1" : '-J\(.*\)'`
            jargs="$jargs '$arg'"
	    shift
	    ;;
        -J-mx*|-J-Xmx*)
            noxmem=1
            arg=`expr "$1" : '-J\(.*\)'`
            jargs="$jargs '$arg'"
            ;;
        -J-ms*|-J-Xms*)
            nosmem=1
            arg=`expr "$1" : '-J\(.*\)'`
            jargs="$jargs '$arg'"
            ;;
        -J*)
            arg=`expr "$1" : '-J\(.*\)'`
            jargs="$jargs '$arg'"
            ;;
        -options | -options=*)
            noopts=1
            qfargs="$qfargs '$1'"
            ;;
        -shell | -shell=*)
            noshell=1
            qfargs="$qfargs '$1'"
            ;;
        -shellarg | -shellarg=*)
            noshellarg=1
            qfargs="$qfargs '$1'"
            ;;
        *)
            qfargs="$qfargs '$1'"
            ;;
    esac
    shift
done

if [ -n "$QFTEST_DEBUG" ]; then
    echo --------------------------------------------------
    echo This is QF-Test
    echo Java executable: $jexe
    echo Java arguments: $jargs
    echo qftest arguments: $qfargs
fi

#----------------------------------------------------------------------
# Locate this shell skript
#----------------------------------------------------------------------
binary=$0
if [ -n "$QFTEST_DEBUG" ]; then
    echo binary: $binary
fi
while [ -L "$binary" ]; do
    link=`ls -ld "$binary"`
    link=`expr "$link" : '.*-> \(.*\)$'`
    if [ -n "$QFTEST_DEBUG" ]; then
        echo following link: $link
    fi
    case $link in
    /*)
        binary=$link
        ;;
    *)
        binary=`dirname "$binary"`/$link
        ;;
    esac
done

bindir=`dirname "$binary"`
bindir=`cd "$bindir"; pwd`
basedir=`dirname "$bindir"`
topdir=`dirname "$basedir"`
if [ -n "$QFTEST_DEBUG" ]; then
    echo bindir: $bindir
    echo basedir: $basedir
    echo topdir: $topdir
fi

if [ -z "$QFTEST_BIN" ]; then
    QFTEST_BIN=$bindir; export QFTEST_BIN
fi

#----------------------------------------------------------------------
# Possibly load launcher.cfg
#----------------------------------------------------------------------
javamem=1024
launcherfile=
if [ -n "$systemdir" ]; then
    if [ -f "$systemdir/launcher.cfg" ]; then
        launcherfile="$systemdir/launcher.cfg"
    fi
else
    if [ -f "$topdir/launcher.cfg" ]; then
        launcherfile="$topdir/launcher.cfg"
    fi
fi
if [ -n "$launcherfile" ]; then
    usemyjre=
    myjre=
    java=
    jdk=
    lang=
    . "$launcherfile"
fi
if [ -z "$skipjexe" ]; then
    if [ "$usemyjre" != no ]; then
        # Look for own JRE
        uname -a | grep -q Linux
        if [ $? ]; then
            uname -a | grep -q x86_64
            if [ $? ]; then
                if [ -d "$basedir/jre/linux64" ]; then
                    myjre="$basedir/jre/linux64"
                elif [ -d "$basedir/jre/linux32" ]; then
                    myjre="$basedir/jre/linux32"
                fi
            elif [ -d "$basedir/jre/linux32" ]; then
                myjre="$basedir/jre/linux32"
            fi
            # echo myjre: $myjre
        fi
        if [ "$(uname)" = "Darwin" ]; then
          plugin_jre=$(bash -c "f='$basedir/../../../Plugins/*.j*/Contents/Home/jre';IFS=;echo \$f")
          plugin2_jre=$(bash -c "f='$basedir/../../../Plugins/*.j*/Contents/Home';IFS=;echo \$f")
          embedded_jre=$(bash -c "f='$basedir/jre/osx64*/Contents/Home/jre';IFS=;echo \$f")
          embedded2_jre=$(bash -c "f='$basedir/jre/osx64*/Contents/Home';IFS=;echo \$f")
          if [ -e "$plugin_jre/bin/java" ]; then
              myjre="$plugin_jre"
          elif [ -e "$plugin2_jre/bin/java" ]; then
              myjre="$plugin2_jre"
          elif [ -e "$embedded_jre/bin/java" ]; then
              myjre="$embedded_jre"
          elif [ -e "$embedded2_jre/bin/java" ]; then
              myjre="$embedded2_jre"
          fi
        fi
        if [ -n "$myjre" ]; then
            jexe="$myjre/bin/java"
            if [ -n "$QFTEST_DEBUG" ]; then
                echo "Using my own java: $jexe"
            fi
        fi
    fi
    if [ -z "$myjre" ]; then
        if [ -n "$java" ]; then
            jexe=$java
        fi
        if [ -n "$QFTEST_DEBUG" ]; then
            echo "Using configured java: $jexe"
        fi
    fi
fi
if [ -z "$nolang" -a -n "$lang" ]; then
    jargs="$jargs '-Duser.language=$lang'"
    if [ -n "$QFTEST_DEBUG" ]; then
        echo "Using language: $lang"
    fi
fi
if [ -n "$QFTEST_DEBUG" ]; then
    echo javamem: $javamem
fi
if [ -z "$nocanoncache" ]; then
    jargs="$jargs -Dsun.io.useCanonCaches=true"
fi

#----------------------------------------------------------------------
# Setup PATH and CLASSPATH
# use -classpath for the qftest server jars
#----------------------------------------------------------------------
CPTMP=$CLASSPATH
CLASSPATH=$classpath
client=0
. "$bindir/fixcp"
classpath="-classpath '$CLASSPATH'"
CLASSPATH=$CPTMP

if [ -n "$javaopt" ]; then
    jargs="$jargs $javaopt"
fi

if [ `basename "$jexe"` != "$jexe" ]; then
    # Put the directory of the java executable on the PATH
    dir=`dirname "$jexe"`
    dir=`cd "$dir"; pwd`
    # now that QF-Test comes with its own JRE we put the Java directory at the end of PATH
    PATH="$PATH:$dir"
    # make java executable absolute
    jbase=`basename "$jexe"`
    jexe="$dir/$jbase"
fi

PATH="$PATH:$bindir"

export PATH

#----------------------------------------------------------------------
# Setup agent
#----------------------------------------------------------------------
case "$JAVA_TOOL_OPTIONS" in
    *-javaagent:*jasmine.jar*)
	# Agent from functional tester that messes up QF-Test startup
	export JAVA_TOOL_OPTIONS=
	;;
esac
case "$JAVA_TOOL_OPTIONS" in
    *-javaagent:*qfconnect.jar*)
	noagent=1
	;;
esac
if [ -z "$noagent" ]; then
    jargs="$jargs \"-javaagent:$basedir/misc/qfconnect.jar=main\""
fi
if [ -z "$ipv6" ]; then
    jargs="$jargs -Djava.net.preferIPv4Stack=true"
fi

#----------------------------------------------------------------------
# Add Mac specific options
#----------------------------------------------------------------------
if [ "$(uname)" = "Darwin" ]; then
    ApplicationSupportDirectory=$(osascript -e 'tell application "System Events"' -e 'get POSIX path of (path to application support folder from user domain)' -e 'end tell')
    SystemApplicationSupportDirectory=$(osascript -e 'tell application "System Events"' -e 'get POSIX path of (path to application support folder from local domain)' -e 'end tell')
    CachesDirectory=$(osascript -e 'tell application "System Events"' -e 'get POSIX path of (path to "cach" from user domain)' -e 'end tell')
    AutosavedInformationDirectory=$(osascript -e 'tell application "System Events"' -e 'get POSIX path of (path to "asav" from user domain)' -e 'end tell')
    jargs="-Xdock:name=QF-Test -Xdock:icon='$basedir/misc/qfs.icns' -DSystemApplicationSupportDirectory='$SystemApplicationSupportDirectory' -DApplicationSupportDirectory='$ApplicationSupportDirectory' -DCachesDirectory='$CachesDirectory' $jargs"
    if [ -z "$noopts" ]; then
        if [ -f "$ApplicationSupportDirectory/de.qfs.apps.qftest/qftest.options" ]; then
            noopts=1
            qfargs="'-options=$ApplicationSupportDirectory/de.qfs.apps.qftest/qftest.options' $qfargs"
        fi
    fi
fi

if [ -z "$noopts" ]; then
    if [ -f "~/.qftest/qftest.options" ]; then
        qfargs="'-options=~/.qftest/qftest.options' $qfargs"
    elif [ -f "$HOME/.qftest/qftest.options" ]; then # ~expansion is not working in "" under alpine linux
        qfargs="'-options=$HOME/.qftest/qftest.options' $qfargs"
    else
	if [ -n "$systemdir" -a -f "$systemdir/qftest.options" ]; then
            qfargs="'-options=$systemdir/qftest.options' $qfargs"
        elif [ -f "$topdir/qftest.options" ]; then
            qfargs="'-options=$topdir/qftest.options' $qfargs"
        else
            qfargs="'-options=$bindir/qftest.options' $qfargs"
        fi
    fi
fi

if [ -z "$noshell" ]; then
    qfargs="-shell=/bin/sh $qfargs"
fi
if [ -z "$noshellarg" ]; then
    qfargs="-shellarg=-c $qfargs"
fi

#----------------------------------------------------------------------
# Add qftest.home and qftest.home definitions
#----------------------------------------------------------------------
if [ -z "$noqftesthome" ]; then
    jargs="$jargs -Dqftest.home='$topdir'"
fi
if [ -z "$noqftestversionhome" ]; then
    jargs="$jargs -Dqftest.versionhome='$basedir'"
fi
if [ -n "$skipjexe" -a -z "$noqftestjava" ]; then
    jargs="$jargs -Dqftest.java='$jexe'"
fi

#----------------------------------------------------------------------
# Add qftest.display for -reuse
#----------------------------------------------------------------------
jargs="$jargs -Dqftest.display='$DISPLAY'"

#----------------------------------------------------------------------
# Add editor
#----------------------------------------------------------------------
if [ -n "$EDITOR" -a -z "$noeditor" ]; then
    jargs="$jargs -Dqftest.editor='$EDITOR'"
fi

#----------------------------------------------------------------------
# Make sure there's enough memory
#----------------------------------------------------------------------
if [ -z "$noxmem" ]; then
    jargs="$jargs -Xmx${javamem}m"
fi
if [ -z "$nosmem" ]; then
    jargs="$jargs -Xms16m"
fi

#----------------------------------------------------------------------
# That's it
#----------------------------------------------------------------------
if [ -n "$QFTEST_DEBUG" ]; then
    echo executing "'$jexe'" $jargs $classpath \
        de.qfs.apps.qftest.start.$mainclass $qfargs
    echo --------------------------------------------------
fi
eval exec "'$jexe'" $jargs $classpath \
    de.qfs.apps.qftest.start.$mainclass $qfargs
