#!/bin/bash

# systemctl will kill Tomcat if the Java was upgraded, hence check on start only
if [ "$1" = "start" ]; then
  jh=$(/usr/share/tomcat/service/jetpatch_choose_java_version.sh)
  IFS=':' read jdir jver <<<"$jh"
  if [ "$jdir" != "$JAVA_HOME" ]; then
    JAVA_HOME="$jdir"
    export JAVA_HOME
    sed -i 's#JAVA_HOME=.*#JAVA_HOME='"$JAVA_HOME"'#g' /usr/share/tomcat/service/tomcat.conf
  fi
  echo "JAVA_HOME was set to $JAVA_HOME" | systemd-cat -t JetPatch -p info
  if [ "$jver" != "$JAVA_MAJOR_VERSION" ]; then
    JAVA_MAJOR_VERSION="$jver"
    export JAVA_MAJOR_VERSION
    sed -i 's#JAVA_MAJOR_VERSION=.*#JAVA_MAJOR_VERSION='"$JAVA_MAJOR_VERSION"'#g' /usr/share/tomcat/service/tomcat.conf
  fi
fi

. /usr/share/tomcat/service/preamble

# All calculations in MB
function calc_mem() {
	local mem_to_use=0 sys_mem_total=0 avail_sys_mem=0 ;
	local min_mem=4096 # Minimum amount of RAM required In MBs for java
	local abs=${1} per=${2};

	sys_mem_total=$(cat /proc/meminfo | head -n 1 | awk '/[0-9]/ {print $2}')
	sys_mem_total=$(($sys_mem_total / 1024))
	sys_mem_to_use=$(($sys_mem_total * 80 / 100 | bc -l))
	avail_sys_mem=$(($sys_mem_to_use < $min_mem ? $min_mem : $sys_mem_to_use))

	mem_to_use="${avail_sys_mem}"
	if [ ${abs} -gt 0 ]; then 
		mem_to_use="${abs}"
	elif [ ${per} -gt 0 ]; then
		mem_to_use=$(($sys_mem_total * $per / 100 | bc -l))
	fi

	# Check for both MIN and Max range
	if [ $mem_to_use -lt $min_mem ]; then
		mem_to_use="$min_mem"
	elif [ $mem_to_use -gt $avail_sys_mem ]; then
		mem_to_use="$avail_sys_mem"
	fi

	echo "$mem_to_use"
}

MAIN_CLASS=org.apache.catalina.startup.Bootstrap

OPTIONS="-Dlogging.config=${CATALINA_HOME}/conf/log4j2.xml \
-Dcatalina.base=$CATALINA_BASE \
-Dcatalina.home=$CATALINA_HOME \
-Djava.io.tmpdir=$CATALINA_TMPDIR \
-Djava.security.disableSystemPropertiesFile=true \
-Djava.util.logging.config.file=${LOGGING_PROPERTIES} \
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager"
hdLoc=$(sed 's/^jvm\.heap\.dump\.location=\(.*\)/\1/;t;d' ${CATALINA_BASE}/conf/intigua.properties | head -1 | sed 's/\r$//;s/^[ \t]*//;s/[ \t]*$//')
[[ ! -z "$hdLoc" ]] && OPTIONS="${OPTIONS} -XX:HeapDumpPath=\"${hdLoc}\""
[[ -f /etc/default/intiguaTomcatDebug ]] && OPTIONS="${OPTIONS} -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000"
# For JMX to work, ensure 'hostname -i' returns real IP or hostname and not loopback. May be fixed by putting
# 'public-IP hostname' to /etc/hosts or by using '-Djava.rmi.server.hostname=<public/NAT address>'
[[ -f /etc/default/intiguaTomcatJmx ]] && OPTIONS="${OPTIONS} -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9010 -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false"
FLAGS="$JAVA_OPTS $CATALINA_OPTS"

if [ "$1" = "start" ]; then
  if [ "${SECURITY_MANAGER}" = "true" ]; then
    OPTIONS="${OPTIONS} \
    -Djava.security.manager \
    -Djava.security.policy==${CATALINA_BASE}/conf/catalina.policy"
  fi
  if [ -n "$JAVA_MAJOR_VERSION" ] && [ "$JAVA_MAJOR_VERSION" -lt 11 ]; then
    OPTIONS="${OPTIONS} -Djava.endorsed.dirs=$JAVA_ENDORSED_DIRS"
  fi
  # Calculating the memory to be assigned according to the properties defined in /usr/share/tomcat/default/conf/intigua.properties
  fraction=$(grep "^system\.java\.xmx\.fraction\.percent=" /usr/share/tomcat/default/conf/intigua.properties  | cut -d '=' -f2)
  absolute=$(grep "^system\.java\.xmx\.absolute=" /usr/share/tomcat/default/conf/intigua.properties | cut -d '=' -f2)
  # Calculating the memory to be assigned according to the user's settings
  if [ -z "$absolute" ]; then
	  absolute=0;
  fi
  if [ -z "$fraction" ]; then
	  fraction=0;
  fi
  mem=$(calc_mem $absolute $fraction)
  OPTIONS="${OPTIONS} -Xmx${mem}m"
  exec $JAVA_HOME/bin/java -classpath $CLASSPATH $FLAGS $OPTIONS $MAIN_CLASS "$@"
elif [ "$1" = "stop" ]; then
  $JAVA_HOME/bin/java -classpath $CLASSPATH $FLAGS $OPTIONS $MAIN_CLASS "$@"
fi
