#!/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.

# -----------------------------------------------------------------------------
# Lenya Unix Shell Script
#
# $Id$
# -----------------------------------------------------------------------------

# Configuration variables
#
# LENYA_HOME
#   The root of the Lenya distribution
#
# LENYA_WEBAPP_HOME
#   The root of the Lenya web application
#
# LENYA_LIB
#   Folder containing all the library files needed by the Lenya CLI
#
# JAVA_HOME
#   Home of Java installation.
#
# JAVA_OPTIONS
#   Extra options to pass to the JVM
#
# JAVA_DEBUG_ARGS
#   The command line arguments for the internal JVM debugger
#
# JAVA_PROFILE_ARGS
#   The command line arguments for the internal JVM profiler
#
# JETTY_PORT
#   Override the default port for Jetty
#
# JETTY_ADMIN_PORT
#   The port where the jetty web administration should bind
#


usage()
{
    echo "Usage: $0 (action)"
    echo "actions:"
    echo "  cli               Run Lenya from the command line"
    echo "  servlet           Run Lenya in a servlet container"
    echo "  servlet-admin     Run Lenya in a servlet container and turn on container web administration"
    echo "  servlet-debug     Run Lenya in a servlet container and turn on JVM remote debug"
    echo "  servlet-profile   Run Lenya in a servlet container and turn on JVM profiling"
    exit 1
}

#[ $# -gt 0 ] || usage

DEFAULT_ACTION="servlet"
ACTION=$1
if [ -n "$ACTION" ]
then
  shift
else
  ACTION=$DEFAULT_ACTION
  echo "$0: executing default action '$ACTION', use -h to see other actions"
fi
ARGS="$*"

# ----- Verify and Set Required Environment Variables -------------------------

if [ "$JAVA_HOME" = "" ] ; then
  echo You must set JAVA_HOME to point at your Java Development Kit installation
  exit 1
fi

if [ "$JAVA_OPTIONS" = "" ] ; then
  JAVA_OPTIONS='-Xms32M -Xmx512M -Djava.awt.headless=true'
fi

if [ "$LENYA_HOME" = "" ] ; then
  LENYA_HOME='.'
  # TODO: Make it startable from any directory
  #LENYA_HOME=`dirname $0`
  #echo "LENYA_HOME: $LENYA_HOME"
fi

if [ "$LENYA_WEBAPP_HOME" = "" ] ; then
  STANDALONE_WEBAPP=../webapp
  if [ -d $STANDALONE_WEBAPP ] ; then
    # for standalone-webapp setup
    LENYA_WEBAPP_HOME=$STANDALONE_WEBAPP
  else
    # when in the build environment
    LENYA_WEBAPP_HOME="$LENYA_HOME/build/lenya/webapp"
  fi
fi
echo "$0: using $LENYA_WEBAPP_HOME as the webapp directory"

if [ "$LENYA_LIB" = "" ] ; then
  LENYA_LIB="$LENYA_WEBAPP_HOME/WEB-INF/lib"
fi


# Set Jetty Port
if [ -f local.build.properties ] ; then
  JETTY_PORT=`grep web.app.server.jetty.port $LENYA_HOME/local.build.properties | grep -v "#" | sed -e 's/web\.app\.server\.jetty\.port=//'`
fi
if [ "$JETTY_PORT" = "" ] ; then
  JETTY_PORT=`grep web.app.server.jetty.port $LENYA_HOME/build.properties | grep -v "#" | sed -e 's/web\.app\.server\.jetty\.port=//'`
fi
echo "INFO: Jetty Port is $JETTY_PORT"

# Set Jetty Admin Port
if [ -f local.build.properties ] ; then
  JETTY_ADMIN_PORT=`grep web.app.server.jetty.admin.port $LENYA_HOME/local.build.properties | grep -v "#" | sed -e 's/web\.app\.server\.jetty\.admin\.port=//'`
fi
if [ "$JETTY_ADMIN_PORT" = "" ] ; then
  JETTY_ADMIN_PORT=`grep web.app.server.jetty.admin.port $LENYA_HOME/build.properties | grep -v "#" | sed -e 's/web\.app\.server\.jetty\.admin\.port=//'`
fi
echo "INFO: Jetty Admin Port is $JETTY_ADMIN_PORT"

if [ "$JAVA_DEBUG_ARGS" = "" ] ; then
  JAVA_DEBUG_ARGS='-Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n'
fi

if [ "$JAVA_PROFILE_ARGS" = "" ] ; then
  JAVA_PROFILE_ARGS='-Xrunhprof:heap=all,cpu=samples,thread=y,depth=3'
fi


# ----- Set platform specific variables

PATHSEP=":";
case "`uname`" in
   CYGWIN*) PATHSEP=";" ;;
esac

# ----- Set Local Variables ( used to minimize cut/paste) ---------------------

JAVA="$JAVA_HOME/bin/java"
ENDORSED_LIBS="${LENYA_HOME}/externals/cocoon_2_1_x/lib/endorsed"
ENDORSED="-Djava.endorsed.dirs=$ENDORSED_LIBS"
PARSER=-Dorg.xml.sax.parser=org.apache.xerces.parsers.SAXParser
LOADER=Loader
LOADER_LIB="${LENYA_HOME}/tools/loader"

CLI=-Dloader.main.class=org.apache.lenya.Main
CLI_LIBRARIES="-Dloader.jar.repositories=$LENYA_LIB"

JETTY=-Dloader.main.class=org.mortbay.jetty.plus.Server
JETTY_CONF="$LENYA_HOME/tools/jetty/conf"
JETTY_MAIN="$JETTY_CONF/main.xml"
JETTY_ADMIN="$JETTY_CONF/admin.xml"
JETTY_WEBAPP="-Dwebapp=$LENYA_WEBAPP_HOME"
JETTY_HOME="-Dhome=$LENYA_HOME"
JETTY_PORT_ARGS="-Djetty.port=$JETTY_PORT"
JETTY_ADMIN_ARGS="-Djetty.admin.port=$JETTY_ADMIN_PORT"
JETTY_LIBRARIES="-Dloader.jar.repositories=$LENYA_HOME/tools/jetty/lib${PATHSEP}$LENYA_HOME/tools/jetty/extra/lib${PATHSEP}$LENYA_HOME/tools/jetty/extra/ext${PATHSEP}$LENYA_HOME/tools/jetty/ext${PATHSEP}$LENYA_HOME/tools/jetty/extra/resources${PATHSEP}${ENDORSED_LIBS}"
JETTY_URI_CHARSET="-Dorg.mortbay.util.URI.charset=ISO-8859-1"

# ----- Do the action ----------------------------------------------------------

if [ -d build ]; then
    echo "INFO: build/lenya/webapp directory already exists."
else
    if [ -f lenya.war ]; then
        echo "INFO: lenya.war will be unpacked ..."
        mkdir -p build/lenya/webapp
        cp lenya.war build/lenya/webapp/.
        cd build/lenya/webapp
        $JAVA_HOME/bin/jar -xf lenya.war
        cd ../../..
        mkdir -p build/lenya/webapp/WEB-INF/logs
        rm build/lenya/webapp/lenya.war
    else
        echo "INFO: No such war file lenya.war or build directory!"
        exit 1
    fi
fi

case "$ACTION" in
  cli)
        $JAVA $JAVA_OPTIONS -cp $LOADER_LIB $ENDORSED $CLI_LIBRARIES $CLI $LOADER $ARGS
        ;;

  servlet)
        $JAVA $JAVA_OPTIONS -cp $LOADER_LIB $ENDORSED $PARSER $JETTY_PORT_ARGS $JETTY_LIBRARIES $JETTY_WEBAPP $JETTY_HOME $JETTY_URI_CHARSET $JETTY $LOADER $JETTY_MAIN
        ;;

  servlet-admin)
        $JAVA $JAVA_OPTIONS -cp $LOADER_LIB $ENDORSED $PARSER $JETTY_PORT_ARGS $JETTY_ADMIN_ARGS $JETTY_LIBRARIES $JETTY_WEBAPP $JETTY_HOME $JETTY_URI_CHARSET $JETTY $LOADER $JETTY_MAIN $JETTY_ADMIN
        ;;

  servlet-debug)
        $JAVA $JAVA_OPTIONS $JAVA_DEBUG_ARGS -cp $LOADER_LIB $ENDORSED $PARSER $JETTY_PORT_ARGS $JETTY_LIBRARIES $JETTY_WEBAPP $JETTY_HOME  $JETTY_URI_CHARSET $JETTY $LOADER $JETTY_MAIN
        ;;

  servlet-profile)
        $JAVA $JAVA_OPTIONS $JAVA_PROFILE_ARGS -cp $LOADER_LIB $ENDORSED $PARSER $JETTY_ARGS $JETTY_LIBRARIES $JETTY_WEBAPP $JETTY_HOME $JETTY_URI_CHARSET $JETTY $LOADER $JETTY_MAIN
        ;;

  *)
        usage
        ;;
esac

exit 0
