#!/bin/bash -e

source $OPENSHIFT_CARTRIDGE_SDK_BASH

JBOSSEAP_BIN_DIR=${OPENSHIFT_JBOSSEAP_DIR}/bin
JBOSSEAP_PID_FILE=${OPENSHIFT_HOMEDIR}/app-root/runtime/jbosseap.pid

source $JBOSSEAP_BIN_DIR/util

cartridge_type="jbosseap"

# Check if the jbossas process is running
function isrunning() {

    # Check for running app
    if [ -f "$JBOSSEAP_PID_FILE" ]; then
      jbpid=$(cat $JBOSSEAP_PID_FILE);
      if /bin/ps --pid $jbpid 1>&2 >/dev/null;
      then
        return 0
      fi
    fi

    return 1
}

# Kill the process given by $1 and its children
killtree() {
    local _pid=$1
    for _child in $(ps -o pid --no-headers --ppid ${_pid}); do
        killtree ${_child}
    done

    local should_be_gone_pid=$(ps -o pid -p ${_pid} --no-headers)
    if [ -z $should_be_gone_pid ]; then
        return
    else
        kill -TERM ${_pid}
    fi

    local count=0
    while [ ${count} -lt 15 ]
    do
        local should_be_gone_pid=$(ps -o pid -p ${_pid} --no-headers)
        if [ -z $should_be_gone_pid ]; then
                return
        else
                sleep 2
                let count=${count}+1
        fi
    done

    local should_be_gone_pid=$(ps -o pid -p ${_pid} --no-headers)
    if [ ! -z $should_be_gone_pid ]
    then
        kill -9 ${_pid}
    fi
}

# Check if the server http port is up
function ishttpup() {

    let count=0
    while [ ${count} -lt 24 ]
    do
        if /usr/sbin/lsof -P -n -i "@${OPENSHIFT_JBOSSEAP_IP}:${OPENSHIFT_JBOSSEAP_HTTP_PORT}" | grep "(LISTEN)" > /dev/null; then
            echo "Found ${OPENSHIFT_JBOSSEAP_IP}:${OPENSHIFT_JBOSSEAP_HTTP_PORT} listening port"
            return 0
        fi
        let count=${count}+1

        sleep 2
    done

    return 1
}

function build() {

  CONFIG_DIR="${OPENSHIFT_JBOSSEAP_DIR}/standalone/configuration"
  OPENSHIFT_MAVEN_MIRROR="${CONFIG_DIR}/settings.base.xml"
  if $(echo $OPENSHIFT_GEAR_DNS | egrep -qe "\.rhcloud\.com")
  then
      OPENSHIFT_MAVEN_MIRROR="${CONFIG_DIR}/settings.rhcloud.xml"
  fi

  max_memory_bytes=$(oo-cgroup-read memory.limit_in_bytes)
  max_memory_mb=$(expr $max_memory_bytes / 1048576)

  # If hot deploy is enabled, we need to restrict the Maven memory size to fit
  # alongside the running application server. For now, just hard-code it to 64
  # and figure out how to apply a scaling factor later.
  if marker_present hot_deploy
  then
      echo "Scaling down Maven heap settings due to presence of hot_deploy marker"

      if [ -z $MAVEN_JVM_HEAP_RATIO ]; then
      MAVEN_JVM_HEAP_RATIO=0.25
    fi
  else
    if [ -z $MAVEN_JVM_HEAP_RATIO ]; then
      MAVEN_JVM_HEAP_RATIO=0.75
    fi
  fi

  max_heap=$( echo "$max_memory_mb * $MAVEN_JVM_HEAP_RATIO" | bc | awk '{print int($1+0.5)}')

  OPENSHIFT_MAVEN_XMX="-Xmx${max_heap}m"

  if [ -z "$BUILD_NUMBER" ]
  then
      if marker_present force_clean_build
      then
          echo ".openshift/markers/force_clean_build found!  Removing Maven dependencies." 1>&2
          rm -rf ${OPENSHIFT_HOMEDIR}.m2/* ${OPENSHIFT_HOMEDIR}.m2/.[^.]*
      fi

      if [ -f ${OPENSHIFT_REPO_DIR}pom.xml ] && ! marker_present skip_maven_build
      then
          update-configuration

          export MAVEN_OPTS="$OPENSHIFT_MAVEN_XMX"
          pushd ${OPENSHIFT_REPO_DIR} > /dev/null

          if [ -z "$MAVEN_OPTS" ]; then
            export MAVEN_OPTS="$OPENSHIFT_MAVEN_XMX"
          fi

          if [ -z "$MAVEN_ARGS" ]; then
          export MAVEN_ARGS="clean package -Popenshift -DskipTests"
          fi

          echo "Found pom.xml... attempting to build with 'mvn -e ${MAVEN_ARGS}'"

          if [ -n "$OPENSHIFT_MAVEN_MIRROR" ]
          then
              mvn --global-settings $OPENSHIFT_MAVEN_MIRROR --version
              mvn --global-settings $OPENSHIFT_MAVEN_MIRROR $MAVEN_ARGS
          else
              mvn --version
              mvn $MAVEN_ARGS
          fi
          popd > /dev/null

          CART_NAME=${cartridge_type}
      fi
  fi

}

function deploy() {
  echo "Deploying JBoss"

  if [ "$(ls ${OPENSHIFT_REPO_DIR}/deployments)" ]; then
    rsync -r --delete --exclude ".*" ${OPENSHIFT_REPO_DIR}/deployments/ ${OPENSHIFT_JBOSSEAP_DIR}/standalone/deployments/
  else
    rm -rf ${OPENSHIFT_JBOSSEAP_DIR}/standalone/deployments/*
  fi
}

function start() {
    echo "Starting $cartridge_type cart"

  if marker_present "enable_jpda"; then
    export ENABLE_JPDA=1
  fi

  # Check for running app
  if isrunning; then
    echo "Application is already running"
  else
    ${JBOSSEAP_BIN_DIR}/standalone.sh > ${OPENSHIFT_TMP_DIR}/${cartridge_type}.log 2>&1 &
    PROCESS_ID=$!
    echo "$PROCESS_ID" > ${JBOSSEAP_PID_FILE}
    if ! ishttpup; then
      echo "Timed out waiting for http listening port"
      exit 1
    fi
  fi
}


function stop() {
  echo "Stopping $cartridge_type cart"

  if isrunning; then
    if [ -f "$JBOSSEAP_PID_FILE" ]; then
      pid=$(cat $JBOSSEAP_PID_FILE);
      echo "Sending SIGTERM to jboss:$pid ..." 1>&2
      killtree $pid
    else 
      echo "Failed to locate JBOSS PID File" 1>&2
    fi
  fi
}

function restart() {
    echo "Restarting $cartridge_type cart"

    stop

    start
}

function status() {
   if isrunning
   then
      client_result "Application is running"
   else
      client_result "Application is either stopped or inaccessible"
   fi
}

function reload() {
    echo "Reloading $cartridge_type cart"
    restart
}

# Clean up any log files
function tidy() {
  client_message "Emptying log dir: $OPENSHIFT_JBOSSEAP_LOG_DIR"
  shopt -s dotglob
  rm -rf $OPENSHIFT_JBOSSEAP_LOG_DIR/*
}

function threaddump() {
  echo "Thread dump for $cartridge_type cart"

    if ! isrunning; then
        echo "Application is stopped"
        exit 1
    elif [ -f "$JBOSSEAP_PID_FILE" ]; then
        pid=$(cat $JBOSSEAP_PID_FILE);
        java_pid=$(ps h --ppid $pid -o '%p')
        kill -3 $java_pid

        client_result "Success"
        client_result ""
        client_result "The thread dump file will be available via: rhc tail $OPENSHIFT_APP_NAME -f ${OPENSHIFT_TMP_DIR}${cartridge_type}.log -o '-n 250'"
    else 
        echo "Failed to locate JBOSS PID File"
    fi
}

case "$1" in
  build)           build ;;
  deploy)          deploy ;;
  start)           start ;;
  stop)            stop ;;
  restart)         restart ;;
  status)          status ;;
  reload)          reload ;;
  tidy)            tidy ;;
  threaddump)      threaddump ;;
  update-configuration) update-configuration ;;
  *)               exit 0
esac

