#!/bin/sh
#
#  Licensed to the Apache Software Foundation (ASF) under one or more
#  contributor license agreements.  See the NOTICE file distributed with
#  this work for additional information regarding copyright ownership.
#  The ASF licenses this file to You under the Apache License, Version 2.0
#  (the "License"); you may not use this file except in compliance with
#  the License.  You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
#   Unless required by applicable law or agreed to in writing, software
#   distributed under the License is distributed on an "AS IS" BASIS,
#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#   See the License for the specific language governing permissions and
#   limitations under the License.

# --------------------------------------------------------------------
# $Rev: 641813 $ $Date: 2008-03-27 09:45:31 -0400 (Thu, 27 Mar 2008) $
# --------------------------------------------------------------------

# -----------------------------------------------------------------------------
# Start/Stop Script for the Geronimo Server
#
# This script is based upon Tomcat's catalina.sh file to enable
# those familiar with Tomcat to quickly get started with Geronimo.
#
# This script file can be used directly instead of startup.sh and
# shutdown.sh as they call this script file anyway.
#
# You should not have to edit this file.  If you wish to have environment
# variables set each time you run this script refer to the information
# on the setenv.sh script that is called by this script below.
#
# Invocation Syntax:
#
#   geronimo.sh command [geronimo_args]
#
#   For detailed command usage information, just run geronimo.sh without any
#   arguments.
#
# Environment Variable Prequisites:
#
#   GERONIMO_HOME   (Optional) May point at your Geronimo top-level directory.
#                   If not specified, it will default to the parent directory
#                   of the location of this script.
#
#   GERONIMO_BASE   (Optional) Base directory for resolving dynamic portions
#                   of a Geronimo installation.  If not present, resolves to
#                   the same directory that GERONIMO_HOME points to.
#
#   GERONIMO_OPTS   (Optional) Java runtime options used when the "start",
#                   "stop", or "run" command is executed.
#
#   GERONIMO_OUT    (Optional) File that Geronimo's stdout and stderr streams
#                   will be redirected to if Geronimo is started in the
#                   background.
#                   Defaults to $GERONIMO_BASE/var/log/geronimo.out
#
#   GERONIMO_PID    (Optional) Path of the file which should contains the pid
#                   of the Geronimo java process, when start (fork) is used
#
#   GERONIMO_TMPDIR (Optional) Directory path location of temporary directory
#                   the JVM should use (java.io.tmpdir).
#                   Defaults to $GERONIMO_BASE/var/temp.
#
#   JAVA_HOME       Points to your Java Development Kit installation.
#                   JAVA_HOME doesn't need to be set if JRE_HOME is set
#                   unless you use the "debug" command.
#                   It is mandatory either JAVA_HOME or JRE_HOME are set.
#
#   JRE_HOME        Points to your Java Runtime Environment installation.
#                   Set this if you wish to run Geronimo using the JRE
#                   instead of the JDK (except for the "debug" command).
#                   Defaults to JAVA_HOME if empty.
#                   It is mandatory either JAVA_HOME or JRE_HOME are set.
#
#   JAVA_OPTS       (Optional) Java runtime options used when the "start",
#                   "stop", or "run" command is executed.
#
#   JDB_SRCPATH     (Optional) The Source Path to be used by jdb debugger
#                   when the "debug" command is executed.
#                   Defaults to %GERONIMO_HOME%\src
#
#   JPDA_ADDRESS    (Optional) Java runtime options used when the "jpda start"
#                   command is executed. The default is 8000.
#
#   JPDA_TRANSPORT  (Optional) JPDA transport used when the "jpda start"
#                   command is executed. The default is "dt_socket".
#
#   JPDA_OPTS       (Optional) JPDA command line options.
#                   Only set this if you need to use some unusual JPDA
#                   command line options.  This overrides the use of the
#                   other JPDA_* environment variables.
#                   Defaults to JPDA command line options contructed from
#                   the JPDA_ADDRESS, JPDA_SUSPEND and JPDA_TRANSPORT
#                   environment variables.
#
#   JPDA_SUSPEND    (Optional) Suspend the JVM before the main class is loaded.
#                   Valid values are 'y' and 'n'.  The default is "n".
#
#   START_OS_CMD    (Optional) Operating system command that will be placed in
#                   front of the java command when starting Geronimo in the
#                   background.  This can be useful on operating systems where
#                   the OS provides a command that allows you to start a process
#                   with in a specified CPU or priority.
#
# Troubleshooting execution of this script file:
#
#  GERONIMO_ENV_INFO (Optional) Environment variable that when set to "on"
#                    (the default) outputs the values of the GERONIMO_HOME,
#                    GERONIMO_BASE, GERONIMO_TMPDIR, JAVA_HOME and
#                    JRE_HOME before the command is issued. Set to "off"
#                    if you do not want this information displayed.
#
# Scripts called by this script:
#
#   $GERONIMO_HOME/bin/setenv.sh
#                   (Optional) This script file is called if it is present.
#                   Its contents may set one or more of the above environment
#                   variables.  It is preferable (to simplify migration to
#                   future Geronimo releases) to set environment variables
#                   in this file rather than modifying Geronimo's script files.
#
#   $GERONIMO_HOME/bin/setjavaenv.sh
#                   This batch file is called to set environment variables
#                   relating to the java or jdb executable to invoke.
#                   This file should not need to be modified.
#
# Exit Codes:
#
#  0 - Success
#  1 - Error
# -----------------------------------------------------------------------------

# OS specific support.  $var _must_ be set to either true or false.
cygwin=false
os400=false
case "`uname`" in
CYGWIN*) cygwin=true;;
OS400*) os400=true;;
esac

# resolve links - $0 may be a softlink
PRG="$0"

while [ -h "$PRG" ]; do
  ls=`ls -ld "$PRG"`
  link=`expr "$ls" : '.*-> \(.*\)$'`
  if expr "$link" : '/.*' > /dev/null; then
    PRG="$link"
  else
    PRG=`dirname "$PRG"`/"$link"
  fi
done

# Get standard environment variables
PRGDIR=`dirname "$PRG"`

# Only set GERONIMO_HOME if not already set
[ -z "$GERONIMO_HOME" ] && GERONIMO_HOME=`cd "$PRGDIR/.." ; pwd`

if [ -r "$GERONIMO_HOME"/bin/setenv.sh ]; then
  . "$GERONIMO_HOME"/bin/setenv.sh
fi

# For Cygwin, ensure paths are in UNIX format before anything is touched
if $cygwin; then
  [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
  [ -n "$JRE_HOME" ] && JRE_HOME=`cygpath --unix "$JRE_HOME"`
  [ -n "$JDB_SRCPATH" ] && JDB_SRCPATH=`cygpath --unix "$JDB_SRCPATH"`
  [ -n "$GERONIMO_HOME" ] && GERONIMO_HOME=`cygpath --unix "$GERONIMO_HOME"`
  [ -n "$GERONIMO_BASE" ] && GERONIMO_BASE=`cygpath --unix "$GERONIMO_BASE"`
fi

# For OS400
if $os400; then
  # Set job priority to standard for interactive (interactive - 6) by using
  # the interactive priority - 6, the helper threads that respond to requests
  # will be running at the same priority as interactive jobs.
  COMMAND='chgjob job('$JOBNAME') runpty(6)'
  system $COMMAND

  # Enable multi threading
  export QIBM_MULTI_THREADED=Y
fi

# Get standard Java environment variables
# (based upon Tomcat's setclasspath.sh but renamed since Geronimo's classpath
# is set in the JAR manifest)
if $os400; then
  # -r will Only work on the os400 if the files are:
  # 1. owned by the user
  # 2. owned by the PRIMARY group of the user
  # this will not work if the user belongs in secondary groups
  BASEDIR="$GERONIMO_HOME"
  . "$GERONIMO_HOME"/bin/setjavaenv.sh
else
  if [ -r "$GERONIMO_HOME"/bin/setjavaenv.sh ]; then
    BASEDIR="$GERONIMO_HOME"
    . "$GERONIMO_HOME"/bin/setjavaenv.sh
  else
    echo "Cannot find $GERONIMO_HOME/bin/setjavaenv.sh"
    echo "This file is needed to run this program"
    exit 1
  fi
fi

if [ -z "$GERONIMO_BASE" ] ; then
  GERONIMO_BASE="$GERONIMO_HOME"
fi

if [ -z "$GERONIMO_TMPDIR" ] ; then
  # Define the java.io.tmpdir to use for Geronimo
  # A relative value will be resolved relative to each instance
  GERONIMO_TMPDIR=var/temp
fi

if [ -z "$GERONIMO_OUT" ] ; then
  # Define the output file we are to redirect both stdout and stderr to
  # when Geronimo is started in the background
  GERONIMO_OUT="$GERONIMO_BASE"/var/log/geronimo.out
fi

if [ -z "$JDB_SRCPATH" ] ; then
  # Define the source path to be used by the JDB debugger
  JDB_SRCPATH="$GERONIMO_HOME"/src
fi

# For Cygwin, switch paths to Windows format before running java
if $cygwin; then
  JAVA_HOME=`cygpath --absolute --windows "$JAVA_HOME"`
  JRE_HOME=`cygpath --absolute --windows "$JRE_HOME"`
  JDB_SRCPATH=`cygpath --absolute --windows "$JDB_SRCPATH"`
  GERONIMO_HOME=`cygpath --absolute --windows "$GERONIMO_HOME"`
  GERONIMO_BASE=`cygpath --absolute --windows "$GERONIMO_BASE"`
  GERONIMO_TMPDIR=`cygpath --windows "$GERONIMO_TMPDIR"`
  EXT_DIRS="$GERONIMO_BASE/lib/ext;$JRE_HOME/lib/ext"
  ENDORSED_DIRS="$GERONIMO_BASE/lib/endorsed;$JRE_HOME/lib/endorsed"
else
  EXT_DIRS="$GERONIMO_BASE/lib/ext:$JRE_HOME/lib/ext"
  ENDORSED_DIRS="$GERONIMO_BASE/lib/endorsed:$JRE_HOME/lib/endorsed"
fi

# ----- Execute The Requested Command -----------------------------------------
if [ "$GERONIMO_ENV_INFO" != "off" ] ; then
  echo "Using GERONIMO_BASE:   $GERONIMO_BASE"
  echo "Using GERONIMO_HOME:   $GERONIMO_HOME"
  echo "Using GERONIMO_TMPDIR: $GERONIMO_TMPDIR"
  if [ "$1" = "debug" ] ; then
    echo "Using JAVA_HOME:       $JAVA_HOME"
    echo "Using JDB_SRCPATH:     $JDB_SRCPATH"
  else
    echo "Using JRE_HOME:        $JRE_HOME"
  fi
fi

LONG_OPT=
if [ "$1" = "start" ] ; then
  LONG_OPT=--long
  if [ "$GERONIMO_ENV_INFO" != "off" ] ; then
    echo "Using GERONIMO_OUT:    $GERONIMO_OUT"
  fi
fi

if [ "$1" = "jpda" ] ; then
  if [ -z "$JPDA_SUSPEND" ]; then
    JPDA_SUSPEND="n"
  fi
  if [ -z "$JPDA_TRANSPORT" ]; then
    JPDA_TRANSPORT="dt_socket"
  fi
  if [ -z "$JPDA_ADDRESS" ]; then
    JPDA_ADDRESS="8000"
  fi
  if [ -z "$JPDA_OPTS" ]; then
    JPDA_OPTS="-Xdebug -Xrunjdwp:transport=$JPDA_TRANSPORT,address=$JPDA_ADDRESS,server=y,suspend=$JPDA_SUSPEND"
  fi
  if [ "$GERONIMO_ENV_INFO" != "off" ] ; then
    echo "Using JPDA_OPTS:       $JPDA_OPTS"
  fi
  GERONIMO_OPTS="$GERONIMO_OPTS $JPDA_OPTS"
  shift
fi

# Setup the Java programming language agent
JAVA_AGENT_JAR="$GERONIMO_BASE/bin/jpa.jar"
if [ -f "$JAVA_AGENT_JAR" ]; then
    JAVA_AGENT_OPTS="-javaagent:$JAVA_AGENT_JAR"
else
    JAVA_AGENT_OPTS=""
fi

if [ "$1" = "debug" ] ; then
  if $os400; then
    echo "Debug command not available on OS400"
    exit 1
  else
    echo "Note: The jdb debugger will start Geronimo in another process and connect to it."
    echo "      To terminate Geronimo when running under jdb, run the "geronimo stop" command"
    echo "      in another window.  Do not use Ctrl-C as that will terminate the jdb client"
    echo "      (the debugger itself) but will not stop the Geronimo process."
    shift
    exec "$_RUNJDB" $JAVA_OPTS $GERONIMO_OPTS \
      -sourcepath "$JDB_SRCPATH" \
      -Djava.endorsed.dirs="$ENDORSED_DIRS" \
      -Djava.ext.dirs="$EXT_DIRS" \
      -Dorg.apache.geronimo.base.dir="$GERONIMO_BASE" \
      -Djava.io.tmpdir="$GERONIMO_TMPDIR" \
      -classpath "$GERONIMO_HOME"/bin/server.jar \
      org.apache.geronimo.cli.daemon.DaemonCLI $LONG_OPT "$@"
  fi

elif [ "$1" = "run" ]; then
  shift
  exec "$_RUNJAVA" $JAVA_OPTS $GERONIMO_OPTS \
    $JAVA_AGENT_OPTS \
    -Dorg.apache.geronimo.base.dir="$GERONIMO_BASE" \
    -Djava.endorsed.dirs="$ENDORSED_DIRS" \
    -Djava.ext.dirs="$EXT_DIRS" \
    -Djava.io.tmpdir="$GERONIMO_TMPDIR" \
    -jar "$GERONIMO_HOME"/bin/server.jar $LONG_OPT "$@"

elif [ "$1" = "start" ] ; then
  shift
  touch "$GERONIMO_OUT"
  $START_OS_CMD "$_RUNJAVA" $JAVA_OPTS $GERONIMO_OPTS \
    $JAVA_AGENT_OPTS \
    -Dorg.apache.geronimo.base.dir="$GERONIMO_BASE" \
    -Djava.endorsed.dirs="$ENDORSED_DIRS" \
    -Djava.ext.dirs="$EXT_DIRS" \
    -Djava.io.tmpdir="$GERONIMO_TMPDIR" \
    -jar "$GERONIMO_HOME"/bin/server.jar $LONG_OPT "$@" \
    >> $GERONIMO_OUT 2>&1 &
    echo ""
    echo "Geronimo started in background. PID: $!"
    if [ ! -z "$GERONIMO_PID" ]; then
      echo $! > $GERONIMO_PID
    fi

elif [ "$1" = "stop" ] ; then
  shift
  FORCE=0
# support -force as that is the option Tomcat uses, we will document
# --force as the option to be consistent with other Geronimo options.
  if [ "$1" = "--force" -o "$1" = "-force" ]; then
    shift
    FORCE=1
  fi

  "$_RUNJAVA" $JAVA_OPTS $GERONIMO_OPTS \
    -Dorg.apache.geronimo.base.dir="$GERONIMO_BASE" \
    -Djava.endorsed.dirs="$ENDORSED_DIRS" \
    -Djava.ext.dirs="$EXT_DIRS" \
    -Djava.io.tmpdir="$GERONIMO_TMPDIR" \
    -jar "$GERONIMO_HOME"/bin/shutdown.jar "$@"

  if [ $FORCE -eq 1 ]; then
    if [ ! -z "$GERONIMO_PID" ]; then
       echo "Killing: `cat $GERONIMO_PID`"
       kill -9 `cat $GERONIMO_PID`
    fi
  fi

else

  echo "Usage: geronimo.sh command [geronimo_args]"
  echo "commands:"
  echo "  debug             Debug Geronimo in jdb debugger"
  echo "  jpda run          Start Geronimo in foreground under JPDA debugger"
  echo "  jpda start        Start Geronimo in background under JPDA debugger"
  echo "  run               Start Geronimo in the foreground"
  echo "  start             Start Geronimo in the background"
  echo "  stop              Stop Geronimo"
  echo "  stop --force      Stop Geronimo (followed by kill -KILL)"
  echo ""
  echo "args for debug, jpda run, jpda start, run and start commands:"
  echo "       --quiet       No startup progress"
  echo "       --long        Long startup progress"
  echo "  -v   --verbose     INFO log level"
  echo "  -vv  --veryverbose DEBUG log level"
  echo "       --override    Override configurations. USE WITH CAUTION!"
  echo "       --help        Detailed help."
  echo ""
  echo "args for stop command:"
  echo "       --user        Admin user"
  echo "       --password    Admin password"
  echo "       --port        RMI port to connect to"
  exit 1

fi
