#!/bin/sh

#
# 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"`
if [ -z "$APP_DOCK_NAME" ] ; then
  APP_DOCK_NAME="$APPNAME"
fi 
# Show message if executed from DMG
name=`uname`
#echo OS: "$name" > ~/out.txt
#echo progdir: "$progdir" >> ~/out.txt
if [ "$name" = "Darwin" ]; then
    testdmg=`echo "$progdir" | sed "s#^/Volumes/Maltego[^/]\\{1,\\}/Maltego.\\{0,\\}\\$#ISDMG#g"`
    #echo path: "$testdmg" >> ~/out.txt
    if [ "$testdmg" = "ISDMG" ]; then
        osascript -e 'tell app "Finder" to display dialog "Please drag Maltego to Applications and run it from there."' 
        exit 1
    fi
fi

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

if [ -f "$progdir/../etc/$APPNAME".conf ] ; then
    . "$progdir/../etc/$APPNAME".conf
fi

# XXX does not correctly deal with spaces in non-userdir params
args=""

case "`uname`" in
    Darwin*)
        if [ ! -z "$default_mac_userdir" ]; then
          userdir="${default_mac_userdir}"
        else
          userdir="${default_userdir}"
        fi
        ;;
    *)
        userdir="${default_userdir}"
        ;;
esac
while [ $# -gt 0 ] ; do
    case "$1" in
        --userdir) shift; if [ $# -gt 0 ] ; then userdir="$1"; fi
            ;;
        *) args="$args \"$1\""
            ;;
    esac
    shift
done

if [ ! -z "$default_cachedir" ]; then
    cachedir="${default_cachedir}"
else
    cachedir="${userdir}/var/cache"
fi

if [ -f "${userdir}/etc/$APPNAME".conf ] ; then
    . "${userdir}/etc/$APPNAME".conf
    if [ -n "$jdkhome" -a \! -d "$jdkhome" -a -d "$progdir/../$jdkhome" ]; then
        # #74333: permit jdkhome to be defined as relative to app dir
        jdkhome="$progdir/../$jdkhome"
    fi
    if [ -n "$jdkhome" -a \! -d "$jdkhome" ]; then # not empty and not directory
        rm -f "${userdir}/etc/$APPNAME".conf # etc conf is wrong so remove it
    else
        jdk_version=$("${jdkhome}/bin/java" -version 2>&1 | "/usr/bin/awk" -F '"' '/version/ {print substr($2, 1, 3)}')
        jdk_version_2=$("${jdkhome}/bin/java" -version 2>&1 | "/usr/bin/awk" -F '"' '/version/ {print substr($2, 1, 2)}')
        full_stop=$("${jdkhome}/bin/java" -version 2>&1 | "/usr/bin/awk" -F '"' '/version/ {print substr($2, 2, 1)}')
        if [ "$jdk_version" \!= "1.8" -a "$jdk_version_2" \!= "9." ] ; then   
            if [ "$full_stop" = "." ] ; then  
                rm -f "${userdir}/etc/$APPNAME".conf
            fi
        fi
    fi
fi

if [ \! -f "${userdir}/etc/$APPNAME".conf ]; then # if etc conf does not exist or was removed
    if type java && ! java -version 2>&1 | /usr/bin/awk 'index($0, "Unable to locate a Java Runtime") { found = 1; exit } END { exit !found }'; then
        echo "found java executable in PATH"
        _java=java
    elif [ -n "$JAVA_HOME" ] && [ -x "$JAVA_HOME/bin/java" ];  then
        echo "found java executable in JAVA_HOME"
        _java="$JAVA_HOME/bin/java"
    else
        JAVA_HOME=`/usr/libexec/java_home`
        if [ -n "$JAVA_HOME" ] && [ -x "$JAVA_HOME/bin/java" ];  then
            echo "found java executable using /usr/libexec/java_home"
            _java="$JAVA_HOME/bin/java"
        else
            echo "Cannot find Java. Please install Java or add to PATH or JAVA_HOME if already installed."
            if [ "$name" = "Darwin" ]; then
                osascript -e 'tell app "SystemUIServer" to display dialog "Please install Java to run Maltego.
Visit docs.maltego.com for support." with title "Java Not Found" buttons {"OK"} default button "OK" with icon stop'
                exit 1
            elif [ "$name" = "Linux" ]; then
                msg="Please install Java to run Maltego.
Visit docs.maltego.com for support."
                if [ -x /usr/bin/zenity ]; then
                    unset WINDOWID
                    exec zenity --error --title="Java Not Found" --width=450 --text="$msg" 2> /dev/null
                elif [ -x /usr/bin/xmessage ]; then
                    exec xmessage -title "Java Not Found" -nearmouse -buttons Ok:0 -default Ok "$msg"
                else
                    echo "$msg"
                    exit 1
                fi
            else 
                echo "$msg"
                exit 1
            fi
        fi
    fi
    if [ "$_java" ]; then
        # TODO MACOS CHECK AGAIN, # TODO LINUX CHECK AGAIN
        # $_java -jar "$progdir/../maltego-ui/modules/ext/Java_Config_App.jar" -nogui
        $_java -jar "$progdir/../maltego-ui/modules/ext/com.paterva.maltego.java-config-ui/com-paterva-maltego/java-config-app.jar" -nogui
        result=$?
        if [ $result -eq 1 ]; then
            exit 1
        fi
        if [ -f "${userdir}/etc/$APPNAME".conf ] ; then
            . "${userdir}/etc/$APPNAME".conf
        fi
    fi
fi

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

readClusters() {
  if [ -x /usr/ucb/echo ]; then
    echo=/usr/ucb/echo
  else
    echo=echo
  fi
  while read X; do
    if [ "$X" \!= "" ]; then
      $echo "$progdir/../$X"
    fi
  done
}

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

clusters=`(cat "$progdir/../etc/$APPNAME".clusters; echo) | readClusters | absolutize_paths | tr '\012' ':'`

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

nbexec=`echo "$progdir"/../platform*/lib/nbexec`

case "`uname`" in
    Darwin*)
        eval exec sh '"$nbexec"' \
            --jdkhome '"$jdkhome"' \
            -J-Dcom.apple.mrj.application.apple.menu.about.name='"$APPNAME"' \
            -J-Xdock:name='"$APP_DOCK_NAME"' \
            '"-J-Xdock:icon=$progdir/../../$APPNAME.icns"' \
            --clusters '"$clusters"' \
            --userdir '"${userdir}"' \
            --cachedir '"${cachedir}"' \
            ${default_options} \
            "$args"
        ;;
    *)  
       sh=sh
       # #73162: Ubuntu uses the ancient Bourne shell, which does not implement trap well.
       if [ -x /bin/bash ]
       then
           sh=/bin/bash
       fi
       eval exec $sh '"$nbexec"' \
            --jdkhome '"$jdkhome"' \
            --clusters '"$clusters"' \
            --userdir '"${userdir}"' \
            --cachedir '"${cachedir}"' \
            ${default_options} \
            "$args"
       exit 1
        ;;
esac
