#!/bin/sh
# Command line wrapper for running JavaServer.
# Copyright (c) 2005 Ken Neighbors <ken@nsds.com>
# All Rights Reserved.  This shell script is free software.  It may be
# used, redistributed and/or modified under the terms of the Perl
# Artistic License or the GNU Lesser General Public License.

# Location of JAR files required by JavaServer.
JAVASERVER_CLASSPATH=/usr/share/java/javaserver.jar:/usr/share/java/log4j-1.2.jar

# Parse command line arguments, looking for --debug-wrapper, --umask,
# --classpath-from, and --java-opts-from.  Any other arguments are
# saved in JAVASERVER_OPTS to be passed to the JavaServer program.
DEBUG_WRAPPER=
UMASK=
CLASSPATH_FROM=
JAVA_OPTS_FROM=
JAVASERVER_OPTS=
while [ $# -gt 0 ]; do
    case "$1" in
	--debug-wrapper)
	    DEBUG_WRAPPER="true"
	    shift
	    ;;
	--umask)
	    UMASK=$2
	    shift
	    shift
	    ;;
	--umask=*)
	    UMASK=${1#--umask=}
	    shift
	    ;;
	--classpath-from)
	    CLASSPATH_FROM="$CLASSPATH_FROM $2"
	    CLASSPATH_FROM=${CLASSPATH_FROM%/} # remove trailing slash
	    shift
	    shift
	    ;;
	--classpath-from=*)
	    CLASSPATH_FROM="$CLASSPATH_FROM ${1#--classpath-from=}"
	    CLASSPATH_FROM=${CLASSPATH_FROM%/} # remove trailing slash
	    shift
	    ;;
	--java-opts-from)
	    JAVA_OPTS_FROM="$JAVA_OPTS_FROM $2"
	    JAVA_OPTS_FROM=${JAVA_OPTS_FROM%/} # remove trailing slash
	    shift
	    shift
	    ;;
	--java-opts-from=*)
	    JAVA_OPTS_FROM="$JAVA_OPTS_FROM ${1#--java-opts-from=}"
	    JAVA_OPTS_FROM=${JAVA_OPTS_FROM%/} # remove trailing slash
	    shift
	    ;;
	--help)
	    cat <<EOF
Wrapper script usage:
javaserver [--debug-wrapper] [--umask=<umask>]
[--classpath-from=<directory-or-file>]
[--java-opts-from=<directory-or-file>]
[--authfile=<authfile>] [<port>] [--help]

Help provided by JavaServer program:
EOF
	    CLASSPATH=$JAVASERVER_CLASSPATH
	    export CLASSPATH
	    exec java com.zzo.javaserver.JavaServer --help
	    ;;
	*)
	    JAVASERVER_OPTS="$JAVASERVER_OPTS $1"
	    shift
	    ;;
    esac
done

# Set umask.
if [ -n "$DEBUG_WRAPPER" ]; then
    UMASK_OLD=`umask`
    if [ -n "$UMASK" ]; then
	echo >&2 "Changing umask from $UMASK_OLD to $UMASK"
    else
	echo >&2 "Leaving umask at $UMASK_OLD"
    fi
fi
if [ -n "$UMASK" ]; then
    umask $UMASK
fi

# The following function reads all lines from a file and adds each
# line to VARIABLE, separated by the character specified as the second
# argument.  If a directory is given as the first argument, then this
# function processes each file in that directory which is listed by
# the run-parts command.
# Synopsis: add_to_variable $FILE_OR_DIRECTORY $SEPARATOR
function add_to_variable () {
    if [ -d "$1" ]; then
	for file in `run-parts $1 --list`; do
	    if [ -n "$DEBUG_WRAPPER" ]; then
		echo >&2 "  $1 (directory)"
	    fi
	    add_to_variable $file "$2"
	done
    elif [ -e "$1" ]; then
	for line in `cat $1 | xargs`; do
	    if [ -n "$DEBUG_WRAPPER" ]; then
		echo >&2 "  $1: $line"
	    fi
	    VARIABLE="$VARIABLE$2$line"
	done
    else
	echo >&2 "$1 does not exist; ignored"
    fi
}

# Construct CLASSPATH from --classpath-from options.
if [ -n "$DEBUG_WRAPPER" ]; then
    echo >&2 "Constructing CLASSPATH ..."
    echo >&2 "  JavaServer CLASSPATH: $JAVASERVER_CLASSPATH"
    if [ -n "$CLASSPATH" ]; then
	echo >&2 "  existing CLASSPATH: $CLASSPATH"
    fi
fi
VARIABLE=$CLASSPATH
for source in $CLASSPATH_FROM; do
    add_to_variable $source ":"
done
CLASSPATH=$VARIABLE
CLASSPATH=${CLASSPATH#:} # remove leading colon

# Add location of JavaServer JAR files to beginning of CLASSPATH
CLASSPATH=$JAVASERVER_CLASSPATH:$CLASSPATH
CLASSPATH=${CLASSPATH%:} # remove trailing colon
export CLASSPATH
if [ -n "$DEBUG_WRAPPER" ]; then
    echo >&2 "Final CLASSPATH: $CLASSPATH"
fi

# Construct JAVA_OPTS from --java-opts-from options.  The following
# function reads all lines from a file and adds each line to the
# JAVA_OPTS.  If a directory is given as an argument, then this
# function processes each file in that directory returned by the
# run-parts command.
if [ -n "$DEBUG_WRAPPER" ]; then
    echo >&2 "Constructing JAVA_OPTS ..."
    if [ -n "$JAVA_OPTS" ]; then
	echo >&2 "  existing JAVA_OPTS: $JAVA_OPTS"
    fi
fi
VARIABLE=$JAVA_OPTS
for source in $JAVA_OPTS_FROM; do
    add_to_variable $source " "
done
JAVA_OPTS=$VARIABLE
export JAVA_OPTS
if [ -n "$DEBUG_WRAPPER" ]; then
    echo >&2 "Final JAVA_OPTS: $JAVA_OPTS"
fi

# Execute the JavaServer program, passing along any command line arguments.
if [ -n "$DEBUG_WRAPPER" ]; then
    echo >&2 "exec java $JAVA_OPTS com.zzo.javaserver.JavaServer $JAVASERVER_OPTS"
fi
exec java $JAVA_OPTS com.zzo.javaserver.JavaServer $JAVASERVER_OPTS
