#!/bin/bash
#---------------------------------------------
# Script to start GEONExT
#---------------------------------------------

#---------------------------------------------
# Used environment variables:
#
# GN_SCRIPTNAME=<name of originally called script to start GeoGebra> # If unset, name of this script will be used.
#
# GN_PATH=<path of directory containing geonext.jar> # If unset, path of this script will be used.
# In this case if the path of script does not contain the geonext.jar file, /usr/share/geonext will be used.
#
# GN_SYS_CONFIG_PATH=<path of system directory containing geonext.conf>
#
# GN_CONFIG_PATH=<path of directory containing .config/$GN_SCRIPTNAME/geonext.conf> # If unset, $HOME will be used.
#
# JAVACMD=<Java command> # If unset, java will be used.
#
# GN_XMS=<initial Java heap size> # If unset, 32m will be used.
#
# GN_XMX=<maximum Java heap size> # If unset, 1024m will be used.
#
# GN_DJAVA_LIBRARY_PATH=<native library path>
#
# GN_DSUN_JAVA2D_XRENDER=<boolean>
#
# GN_DSUN_JAVA2D_OPENGL=<boolean>

#---------------------------------------------
# If $GN_SCRIPTNAME not set, use name of this script.

if [ -z "$GN_SCRIPTNAME" ]; then
	GN_SCRIPTNAME="$(basename $0)"
fi

#---------------------------------------------
# If $GN_PATH not set, use path of this script.

if [ -z "$GN_PATH" ]; then
	GN_PATH="${BASH_SOURCE[0]}"
	if [ -h "${GN_PATH}" ]; then
		while [ -h "${GN_PATH}" ]; do
			GN_PATH=`readlink "${GN_PATH}"`
		done
	fi
	pushd . > /dev/null
	cd `dirname ${GN_PATH}` > /dev/null
	GN_PATH=`pwd`
	popd > /dev/null
	test -r "${GN_PATH}/geonext.jar" || GN_PATH='/usr/share/geonext'
fi

#---------------------------------------------
# If $GN_CONFIG_PATH not set, use $HOME.

if [ -z "$GN_CONFIG_PATH" ]; then
	GN_CONFIG_PATH="$HOME"
fi

#---------------------------------------------
# If $JAVACMD not set, use java.

if [ -z "$JAVACMD" ]; then
	JAVACMD='java'
fi

#---------------------------------------------
# If $GN_XMS not set, use 32m.

if [ -z "$GN_XMS" ]; then
	GN_XMS='32m'
fi

#---------------------------------------------
# If $GN_XMX not set, use 1024m.

if [ -z "$GN_XMX" ]; then
	GN_XMX='1024m'
fi

#---------------------------------------------
# If $GN_SYS_CONFIG_PATH is set, read system config files (if exist).

if [ -n "$GN_SYS_CONFIG_PATH" ]; then
	if [ -e "$GN_SYS_CONFIG_PATH/geonext.conf" ]; then
		. "$GN_SYS_CONFIG_PATH/geonext.conf"
	fi
	if [ -e "$GN_SYS_CONFIG_PATH/geonext.conf.local" ]; then
		. "$GN_SYS_CONFIG_PATH/geonext.conf.local"
	fi
fi

#---------------------------------------------
# Prefer default settings from system config files.

if [ -n "$DEFAULT_JAVACMD" ]; then
	JAVACMD="$DEFAULT_JAVACMD"
	unset DEFAULT_JAVACMD
fi
if [ -n "$DEFAULT_GN_XMS" ]; then
	GN_XMS="$DEFAULT_GN_XMS"
	unset DEFAULT_GN_XMS
fi
if [ -n "$DEFAULT_GN_XMX" ]; then
	GN_XMX="$DEFAULT_GN_XMX"
	unset DEFAULT_GN_XMX
fi
if [ -n "$DEFAULT_GN_DJAVA_LIBRARY_PATH" ]; then
	GN_DJAVA_LIBRARY_PATH="$DEFAULT_GN_DJAVA_LIBRARY_PATH"
	unset DEFAULT_GN_DJAVA_LIBRARY_PATH
fi
if [ -n "$DEFAULT_GN_DSUN_JAVA2D_XRENDER" ]; then
	GN_DSUN_JAVA2D_XRENDER="$DEFAULT_GN_DSUN_JAVA2D_XRENDER"
	unset DEFAULT_GN_DSUN_JAVA2D_XRENDER
fi
if [ -n "$DEFAULT_GN_DSUN_JAVA2D_OPENGL" ]; then
	GN_DSUN_JAVA2D_OPENGL="$DEFAULT_GN_DSUN_JAVA2D_OPENGL"
	unset DEFAULT_GN_DSUN_JAVA2D_OPENGL
fi

#---------------------------------------------
# Read user config file (if exists) and rewrite it.

GN_CONFIG_FILE="$GN_CONFIG_PATH/.config/$GN_SCRIPTNAME/geonext.conf"
if [ ! -w "$GN_CONFIG_FILE" ]; then
	if [ ! -e "$GN_CONFIG_FILE" -a -w "$GN_CONFIG_PATH/.config/$GN_SCRIPTNAME" ]; then
		touch "$GN_CONFIG_FILE"
	elif [ ! -e "$GN_CONFIG_PATH/.config/$GN_SCRIPTNAME" -a -w "$GN_CONFIG_PATH/.config" ]; then
		mkdir "$GN_CONFIG_PATH/.config/$GN_SCRIPTNAME"
		touch "$GN_CONFIG_FILE"
	elif [ ! -e "$GN_CONFIG_PATH/.config" -a -w "$GN_CONFIG_PATH" ]; then
		mkdir "$GN_CONFIG_PATH/.config"
		mkdir "$GN_CONFIG_PATH/.config/$GN_SCRIPTNAME"
		touch "$GN_CONFIG_FILE"
	fi
fi
if [ -w "$GN_CONFIG_FILE" ]; then
	. "$GN_CONFIG_FILE"
	true > "$GN_CONFIG_FILE"
	cat > "$GN_CONFIG_FILE" << EOF
# This is the default GEONExT configuration file. It shows what the defaults
# for various options happen to be.
#
# If you don't need to change the default, you shouldn't uncomment the line.
# Doing so may cause run-time problems.


# JAVA OPTIONS
# -----------------------------------------------------------------------------

# Set Java command, e.g. '/usr/bin/java'.
#
`if [ ! -n "$DEFAULT_JAVACMD" ]; then echo "#DEFAULT_JAVACMD='$JAVACMD'"; else echo "DEFAULT_JAVACMD='$DEFAULT_JAVACMD'"; fi`

# Set initial Java heap size, e.g. '32m'.
#
`if [ ! -n "$DEFAULT_GN_XMS" ]; then echo "#DEFAULT_GN_XMS='$GN_XMS'"; else echo "DEFAULT_GN_XMS='$DEFAULT_GN_XMS'"; fi`

# Set maximum Java heap size, e.g '512m'.
#
`if [ ! -n "$DEFAULT_GN_XMX" ]; then echo "#DEFAULT_GN_XMX='$GN_XMX'"; else echo "DEFAULT_GN_XMX='$DEFAULT_GN_XMX'"; fi`

# Set native library path, e.g. '/usr/lib/jni'.
#
`if [ ! -n "$DEFAULT_GN_DJAVA_LIBRARY_PATH" -a -n "$GN_DJAVA_LIBRARY_PATH" ]; then echo "#DEFAULT_GN_DJAVA_LIBRARY_PATH='$GN_DJAVA_LIBRARY_PATH'"; elif [ ! -n "$DEFAULT_GN_DJAVA_LIBRARY_PATH" -a ! -n "$GN_DJAVA_LIBRARY_PATH" ]; then echo "#DEFAULT_GN_DJAVA_LIBRARY_PATH=''"; else echo "DEFAULT_GN_DJAVA_LIBRARY_PATH='$DEFAULT_GN_DJAVA_LIBRARY_PATH'"; fi`

# Enable/disable the Xrender pipeline (true/false).
#
`if [ ! -n "$DEFAULT_GN_DSUN_JAVA2D_XRENDER" -a -n "$GN_DSUN_JAVA2D_XRENDER" ]; then echo "#DEFAULT_GN_DSUN_JAVA2D_XRENDER='$GN_DSUN_JAVA2D_XRENDER'"; elif [ ! -n "$DEFAULT_GN_DSUN_JAVA2D_XRENDER" -a ! -n "$GN_DSUN_JAVA2D_XRENDER" ]; then echo "#DEFAULT_GN_DSUN_JAVA2D_XRENDER=''"; else echo "DEFAULT_GN_DSUN_JAVA2D_XRENDER='$DEFAULT_GN_DSUN_JAVA2D_XRENDER'"; fi`

# Enable/disable the OpenGL pipeline (true/false).
#
`if [ ! -n "$DEFAULT_GN_DSUN_JAVA2D_OPENGL" -a -n "$GN_DSUN_JAVA2D_OPENGL" ]; then echo "#DEFAULT_GN_DSUN_JAVA2D_OPENGL='$GN_DSUN_JAVA2D_OPENGL'"; elif [ ! -n "$DEFAULT_GN_DSUN_JAVA2D_OPENGL" -a ! -n "$GN_DSUN_JAVA2D_OPENGL" ]; then echo "#DEFAULT_GN_DSUN_JAVA2D_OPENGL=''"; else echo "DEFAULT_GN_DSUN_JAVA2D_OPENGL='$DEFAULT_GN_DSUN_JAVA2D_OPENGL'"; fi`

EOF
fi

#---------------------------------------------
# Prefer default settings from user config file.

if [ -n "$DEFAULT_JAVACMD" ]; then
	JAVACMD="$DEFAULT_JAVACMD"
fi
if [ -n "$DEFAULT_GN_XMS" ]; then
	GN_XMS="$DEFAULT_GN_XMS"
fi
if [ -n "$DEFAULT_GN_XMX" ]; then
	GN_XMX="$DEFAULT_GN_XMX"
fi
if [ -n "$DEFAULT_GN_DJAVA_LIBRARY_PATH" ]; then
	GN_DJAVA_LIBRARY_PATH="$DEFAULT_GN_DJAVA_LIBRARY_PATH"
fi
if [ -n "$DEFAULT_GN_DSUN_JAVA2D_XRENDER" ]; then
	GN_DSUN_JAVA2D_XRENDER="$DEFAULT_GN_DSUN_JAVA2D_XRENDER"
fi
if [ -n "$DEFAULT_GN_DSUN_JAVA2D_OPENGL" ]; then
	GN_DSUN_JAVA2D_OPENGL="$DEFAULT_GN_DSUN_JAVA2D_OPENGL"
fi

#---------------------------------------------
# Define usage function.

function func_usage()
{
	cat << _USAGE
Usage: $GN_SCRIPTNAME [Java-options] [GEONExT-options] [FILE]

GEONExT - Dynamic mathematics software

Java options:
  -JavaCMD=<command>                 Set Java command, default $JAVACMD
  -Xms<size>                         Set initial Java heap size, default $GN_XMS
  -Xmx<size>                         Set maximum Java heap size, default $GN_XMX
  -Djava.library.path=<path>         Set native library path`if [ -n "$GN_DJAVA_LIBRARY_PATH" ]; then echo ", default $GN_DJAVA_LIBRARY_PATH"; fi`
  -Dsun.java2d.xrender=<boolean>     Enable/disable the Xrender pipeline (Use True for verbose output and true for non-verbose output)`if [ -n "$GN_DSUN_JAVA2D_XRENDER" ]; then echo ", default $GN_DSUN_JAVA2D_XRENDER"; fi`
  -Dsun.java2d.opengl=<boolean>      Enable/disable the OpenGL pipeline (Use True for verbose output and true for non-verbose output)`if [ -n "$GN_DSUN_JAVA2D_OPENGL" ]; then echo ", default $GN_DSUN_JAVA2D_OPENGL"; fi`

GEONExT options:
  --help                             Print this help message
_USAGE
}

#---------------------------------------------
# Check for option --help and pass Java options to Java.

for i in "$@"; do
	case "$i" in
	--help | --hel | --he | --h )
		func_usage; exit 0 ;;
	esac
	if [ $(expr match "$i" '.*-Xms') -ne 0 ]; then
		GN_XMS=${i:4}
		shift $((1))
	elif [ $(expr match "$i" '.*-Xmx') -ne 0 ]; then
		GN_XMX=${i:4}
		shift $((1))
	elif [ $(expr match "$i" '.*-Djava.library.path=') -ne 0 ]; then
		GN_DJAVA_LIBRARY_PATH=${i:20}
		shift $((1))
	elif [ $(expr match "$i" '.*-Dsun.java2d.xrender=') -ne 0 ]; then
		GN_DSUN_JAVA2D_XRENDER=${i:21}
		shift $((1))
	elif [ $(expr match "$i" '.*-Dsun.java2d.opengl=') -ne 0 ]; then
		GN_DSUN_JAVA2D_OPENGL=${i:20}
		shift $((1))
	elif [ $(expr match "$i" '.*-JavaCMD=') -ne 0 ]; then
		JAVACMD=${i:9}
		shift $((1))
	fi
done
JAVA_OPTS=("-Xms$GN_XMS" "-Xmx$GN_XMX")
if [ -n "$GN_DJAVA_LIBRARY_PATH" ]; then
	JAVA_OPTS[${#JAVA_OPTS[*]}]="-Djava.library.path=$GN_DJAVA_LIBRARY_PATH"
fi
if [ -n "$GN_DSUN_JAVA2D_XRENDER" ]; then
	JAVA_OPTS[${#JAVA_OPTS[*]}]="-Dsun.java2d.xrender=$GN_DSUN_JAVA2D_XRENDER"
fi
if [ -n "$GN_DSUN_JAVA2D_OPENGL" ]; then
	JAVA_OPTS[${#JAVA_OPTS[*]}]="-Dsun.java2d.opengl=$GN_DSUN_JAVA2D_OPENGL"
fi

#---------------------------------------------
# Run

exec "$JAVACMD" "${JAVA_OPTS[@]}" -cp "$GN_PATH/geonext.jar" "geonext/Geonext" "$@"
