#!/bin/bash
set -o errexit -o pipefail

declare -a java_args
declare -a app_args
FRAMEWORK_HOME=`dirname $0`/..
CONF_FILE=/etc/default/marathon

if [ -z ${MESOS_NATIVE_JAVA_LIBRARY+x} ]
then
  search_paths='/usr/lib /usr/local/lib'
  echo "MESOS_NATIVE_JAVA_LIBRARY is not set. Searching in $search_paths."
  export MESOS_NATIVE_JAVA_LIBRARY=$(find -L $search_paths -name libmesos.dylib -or -name libmesos.so 2>/dev/null | head -n1)
  export MESOS_NATIVE_LIBRARY=$MESOS_NATIVE_JAVA_LIBRARY
fi

echo "MESOS_NATIVE_LIBRARY, MESOS_NATIVE_JAVA_LIBRARY set to '$MESOS_NATIVE_JAVA_LIBRARY'"

# Read environment variables from config file
set -o allexport
[[ ! -f "$CONF_FILE" ]] || . "$CONF_FILE"
set +o allexport

addJava() { java_args=( "${java_args[@]}" "$1" ); }
addApplication() { app_args=( "${app_args[@]}" "$1" ); }
addDebugger() {
  addJava "-Xdebug"
  addJava "-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=$1"
}
die() {
  echo "Aborting: $@"
  exit 1
}
require_arg() {
  local type="$1"
  local opt="$2"
  local arg="$3"
  if [[ -z "$arg" ]] || [[ "${arg:0:1}" == "-" ]]; then
    die "$opt requires <$type> argument"
  fi
}

# Run the start-hook script [optional]
if [ -x "$HOOK_MARATHON_START" ]; then
  "$HOOK_MARATHON_START"
  # if a $HOOK_MARATHON_START.env file was produced it is evaluated
  starthook_env=${HOOK_MARATHON_START%.*}.env
  starthook_env=${starthook_env##*/}

  # In case the hook script needs to add/change environment variables or otherwise access the parent shell
  [ -f "$starthook_env" ] && source "$starthook_env"
else
  echo "No start hook file found (\$HOOK_MARATHON_START). Proceeding with the start script."
fi

# Filter out MARATHON_APP* env variables. All MARATHON_XXX=yyy variables are interpreted as -xxx yyy application parameter
for env_op in `env | grep -v ^MARATHON_APP | grep ^MARATHON_ | awk '{gsub(/MARATHON_/,""); gsub(/=/," "); printf("%s%s ", "--", tolower($1)); for(i=2;i<=NF;i++){printf("%s ", $i)}}'`; do
  addApplication "$env_op"
done

while [[ $# -gt 0 ]]; do
  case "$1" in
    -D*) addJava "$1" && shift ;;
    --jvm-debug) require_arg port "$1" "$2"; addDebugger "$2" && shift 2;;
    *) addApplication "$1" && shift ;;
  esac
done

if [ -n ${JVM_OPTS+x} ]
then
  for arg in ${JVM_OPTS[@]}
  do
    addJava "$arg"
  done
fi

if [ -n ${JAVA_OPTS+x} ]
then
  for arg in ${JAVA_OPTS[@]}
  do
    addJava "$arg"
  done
fi

# Start Marathon
marathon_jar=$(find "$FRAMEWORK_HOME"/target -name 'marathon-assembly-*.jar' | sort | tail -1)

if [[ ! -f $marathon_jar ]]; then
    echo "No 'marathon-assembly-*.jar' found in $FRAMEWORK_HOME/target"
    echo "Assemble jar with 'sbt assembly'"
    exit 1
fi

exec java "${java_args[@]}" -jar "$marathon_jar" "${app_args[@]}"
