#!/bin/bash
##
## (C) Copyright 2010-2011 Nuxeo SAS (http://nuxeo.com/) and contributors.
##
## All rights reserved. This program and the accompanying materials
## are made available under the terms of the GNU Lesser General Public License
## (LGPL) version 2.1 which accompanies this distribution, and is available at
## http://www.gnu.org/licenses/lgpl.html
##
## This library 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
## Lesser General Public License for more details.
##
## Contributors:
##     Julien Carsique
##     Florent Guillaume
##
## Shell script calling a multi-OS Nuxeo Java launcher.
## Using explicitely bash to avoid dash which is not POSIX.
##
MAX_FD_LIMIT_HELP_URL="http://doc.nuxeo.com/display/KB/java.net.SocketException+Too+many+open+files"

: ${NUXEO_HOME:=$(cd "$(dirname "$0")"/..; pwd -P)}
: ${NUXEO_CONF:="$NUXEO_HOME"/bin/nuxeo.conf}


## Helper functions
warn() {
  echo "WARNING: $*"
}

die() {
  echo "ERROR: $*"
  exit 1
}


## OS detection
cygwin=false
darwin=false
#linux=false
case "`uname`" in
  CYGWIN*) cygwin=true;;
  Darwin*) darwin=true;;
  #Linux) linux=true;;
esac

## Empty $GREP_OPTIONS to prevent some undesirable behaviors
GREP_OPTIONS=""

## Setup the JVM (find JAVA_HOME if undefined; use JAVA if defined)
while read line; do
  case $line in
    JAVA_HOME=*) JAVA_HOME="$(echo $line | cut -d= -f2-)" ;;
  esac
done << EOF
`grep "^JAVA_HOME=" "$NUXEO_CONF"`
EOF
if [ -z "$JAVA" ]; then
  JAVA=java
fi
if [ -z "$JAVA_HOME" ]; then
  JAVA=`which $JAVA`
  # follow symlinks
  while [ -h "$JAVA" ]; do
    ls=`ls -ld "$JAVA"`
    link=`expr "$ls" : '.*-> \(.*\)$'`
    case "$link" in
      /*) JAVA="$link" ;;
      *)  JAVA=`dirname "$JAVA"`/"$link" ;;
    esac
  done
  JAVA_HOME=`dirname "$JAVA"`
  JAVA_HOME=`dirname "$JAVA_HOME"`
fi
PATH="$JAVA_HOME/bin:$PATH"

## Setup JAVA_OPTS
while read line; do
  case $line in
    JAVA_OPTS=*)
      line=$(echo $line | cut -d= -f2-)
      # expand $JAVA_OPTS
      case $line in
        \$JAVA_OPTS*) JAVA_OPTS="$JAVA_OPTS $(echo $line | cut -c 12-)" ;;
        *) JAVA_OPTS="$line" ;;
      esac
      ;;
  esac
done << EOF
`grep "^JAVA_OPTS=" "$NUXEO_CONF"`
EOF
# Defaults
: ${JAVA_OPTS:="-Xms512m -Xmx1024m -XX:MaxPermSize=512m -Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000 -Dfile.encoding=UTF-8"}
# Force IPv4
JAVA_OPTS="$JAVA_OPTS -Djava.net.preferIPv4Stack=true"

if [[ ! "x$@" =~ gui ]]; then
  # Set AWT headless
  JAVA_OPTS="$JAVA_OPTS -Djava.awt.headless=true"
fi

# Set -server if possible
if ! [[ "x$JAVA_OPTS" =~ -server ]]; then
  # Enable -server if we have HotSpot
  if [[ x`"$JAVA" -version 2>&1` =~ HotSpot ]]; then
    "$JAVA" -server -version >/dev/null 2>&1
    if [ $? -eq 0 ]; then
      JAVA_OPTS="-server $JAVA_OPTS"
    fi
  fi
fi

## OS specific checks
# Check file descriptor limit is not too low
if [ $cygwin = false ]; then
  MAX_FD_LIMIT=`ulimit -H -n`
  if [ $? -eq 0 ]; then
    if [ $darwin = true ] && [ "$MAX_FD_LIMIT" = "unlimited" ]; then
      MAX_FD_LIMIT=`sysctl -n kern.maxfilesperproc`
      ulimit -n $MAX_FD_LIMIT
    fi
    if [ $MAX_FD_LIMIT -lt 2048 ]; then
      warn "Maximum file descriptor limit is too low: $MAX_FD_LIMIT"
      warn "See: $MAX_FD_LIMIT_HELP_URL"
    fi
  else
    warn "Could not get system maximum file descriptor limit (got $MAX_FD_LIMIT)"
  fi
fi


## nuxeo.log.dir
LOG_DIR=$(grep "^nuxeo.log.dir=" "$NUXEO_CONF" | cut -d= -f2-)
# Defaults
: ${LOG_DIR:="$NUXEO_HOME"/log}


# For Cygwin, ensure paths are in UNIX format before anything is touched
if [ "$cygwin" = "true" ]; then
  [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath -am "$JAVA_HOME"`
  NUXEO_HOME=`cygpath -am "$NUXEO_HOME"`
  NUXEO_CONF=`cygpath -am "$NUXEO_CONF"`
  LOG_DIR=`cygpath -am "$LOG_DIR"`
fi


## Launcher
NUXEO_LAUNCHER="$NUXEO_HOME"/bin/nuxeo-launcher.jar
if [ ! -e "$NUXEO_LAUNCHER" ]; then
    echo Could not locate $NUXEO_LAUNCHER
    # echo Please check that you are in the bin directory when running this script.
    exit 1
fi

echo "[`date`] Command: $0 $@" >> $LOG_DIR/nuxeoctl.log

#LAUNCHER_DEBUG="-Xdebug -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=y"

echo Launcher command: $JAVA $LAUNCHER_DEBUG -Dlauncher.java.opts="$JAVA_OPTS" -Dnuxeo.home="$NUXEO_HOME" -Dnuxeo.conf="$NUXEO_CONF" -Dnuxeo.log.dir="$LOG_DIR" -jar $NUXEO_LAUNCHER $@
echo [`date`] Launcher command: $JAVA $LAUNCHER_DEBUG -Dlauncher.java.opts="$JAVA_OPTS" -Dnuxeo.home="$NUXEO_HOME" -Dnuxeo.conf="$NUXEO_CONF" -Dnuxeo.log.dir="$LOG_DIR" -jar $NUXEO_LAUNCHER $@ >> $LOG_DIR/nuxeoctl.log
exec "$JAVA" $LAUNCHER_DEBUG -Dlauncher.java.opts="$JAVA_OPTS" -Dnuxeo.home="$NUXEO_HOME" -Dnuxeo.conf="$NUXEO_CONF" -Dnuxeo.log.dir="$LOG_DIR" -jar "$NUXEO_LAUNCHER" "$@"
