#!/usr/bin/env bash
# $Id: startJava,v 1.74 2018-01-18 11:27:31 jcj Exp $
#
# Start a Java Application
# Should work with (JRE|JDK)1.1.7, jre1.4.1, jre1.5.0, 1.6,1.7
# startJava <main class> [options]
#
# Special environment variables used for java applications:
# FORCE_MY_JAVA         if this exists, the Java from $JAVA_HOME is taken;
#                       otherwise this script tries to find a Java and sets
#                       $JAVA_HOME accordingly
# JAVA_HOME             used, if $FORCE_MY_JAVA is set.
#                       set to the location of the Java found by this
#                       script otherwise
# JAVA1_COMPAT          if this exist (export JAVA1_COMPAT=1) the options
#                       are build compatible with old Java1 runtime environments
# JAVA_SMALL_MEM        if this exist java will allocate less memory as a maximum
# JAVA                  set to the path to executable java interpreter
#                       found by this script
# ------------------------------------------------------------------------
# supported options:
# -verbose              print lots of debugging information
#
$DBG_SH # dormant debugging directive as suggested by DDJ 1992
# can be activated by DBG_SH='set -x' startJava
#
# For Testing the ArtCom-Java-installation try "startJavaTest" or
# "startSwingTest"

# --- prepare environment as needed by our application programs: ---
CALLED_IN=`dirname $0`
. $CALLED_IN/.ac-sh-funcs
# make the CALLED_IN directory canonic,
# i.e /bitslib/bin to /opt/artcom/bitslib/bin
CALLED_IN=`cd $CALLED_IN; $CANONPWD`

# --- scan options and args: ---
OPT=
MAINCLASS=
for ARG in "$@"; do
    case "$ARG" in
        --verbose|-verbose|-v) VERBOSE=true ; shift
	;;
	-*) OPT="$OPT $ARG" ; shift
	;;
	*)  if [ -z "$MAINCLASS" ]
	    then MAINCLASS="$ARG" ; shift
		 break
	    fi
	;;
    esac
done
if [ "$DBG_SH" ]
then echo "--- startJava args remaining: $@ ---" 1>&2
fi

# --- This has been copied from startArtCom and slightly modified: ---
if [ -f $BITSDAT/stopped ]
then echo "ArtCom software is currently disabled
using the file $BITSDAT/stopped.
(Possibly due to a software upgrade?)
Ask your system administrator.

Die ArtCom Anwendungen sind zur Zeit gesperrt durch
die Datei $BITSDAT/stopped.
(Möglicherweise wegen einer Systemaktualisierung?)
Fragen Sie ihren Systemverwalter." | AC_NO_RUN_FILE=Y Notify
     exit 1
fi

if [ -z "$AC_START_ALREADY_LOGGED" ]
then CALLER=`id -nu`
     TIMESTAMP=`LANG=en_EN date +%Y-%m-%d_%H.%M_%a`
     echo "$TIMESTAMP $CALLER $MAINCLASS" >>"$BITSDAT/starts.log"
     if [ ! -r "$BITSDAT/defaultuser" ] && [ "$CALLER" != "root" ]
     then echo "$CALLER" >"$BITSDAT/defaultuser"
     fi
     export AC_START_ALREADY_LOGGED=true
fi
# --- end of copied code ---

if [ -z "$MAINCLASS" ]
then echo "startJava: Start a Java Application"
     echo "(Needs ArtCom Script 'lookup')"
     echo "usage: startJava [-verbose] main-class [main-class options]"
     echo ""
     exit 1 ;
fi

ARTCOM_HOME=`cd $CALLED_IN; cd ../..; $CANONPWD`; export ARTCOM_HOME

if [ -e "$CALLED_IN/../ARCH" ]
then ARTCOM_ARCH=`cat $CALLED_IN/../ARCH`
else ARTCOM_ARCH=i386
fi

GuessWhichJava() {
    if JAVA_COMMAND_IN_PATH=`which java`
    then if JAVA_CANON=`readlink --canonicalize $JAVA_COMMAND_IN_PATH`
         then if JAVA_BIN_DIR=`dirname $JAVA_CANON`
	      then export JAVA_HOME=`dirname $JAVA_BIN_DIR`
	           return 0
	      fi
	 fi
    fi
    return 1
}

# Java Runtime Enviroment
# Mit 32-Bit-ArtCom-Software wird zunchst in /opt/artcom/java32 gesucht,
# mit 64-Bit-ArtCom-Software wird zunchst in /opt/artcom/java64 gesucht.
# Die sollten Symlinks auf das zu benutzende Java sein.
# Aus historischen Grnden werden 32-Bit-JREs anschlieend in /opt/artcom/java7,
# /opt/artcom/java6, /opt/artcom/java5 bzw. /opt/artcom/java2 gesucht.
# Der erste Treffer wird genommen.
if [ -z "$FORCE_MY_JAVA" ] || [ -z "$JAVA_HOME" ]
then
  if [ "$ARTCOM_ARCH" = "x86_64" ]
  then
     if [ -d "$ARTCOM_HOME"/java64 ]
     then JAVA_HOME="$ARTCOM_HOME"/java64
     elif [ -d /opt/artcom/java64 ]
     then JAVA_HOME=/opt/artcom/java64
     elif GuessWhichJava
     then : Fine
     fi
  else
     if [ -d "$ARTCOM_HOME"/java32 ]
     then JAVA_HOME="$ARTCOM_HOME"/java32
     elif [ -d /opt/artcom/java32 ]
     then JAVA_HOME=/opt/artcom/java32
     elif [ -d "$ARTCOM_HOME"/java8 ]
     then JAVA_HOME="$ARTCOM_HOME"/java8
     elif [ -d /opt/artcom/java8 ]
     then JAVA_HOME=/opt/artcom/java8
     elif [ -d "$ARTCOM_HOME"/java7 ]
     then JAVA_HOME="$ARTCOM_HOME"/java7
     elif [ -d /opt/artcom/java7 ]
     then JAVA_HOME=/opt/artcom/java7
     elif [ -d "$ARTCOM_HOME"/java6 ]
     then JAVA_HOME="$ARTCOM_HOME"/java6
     elif [ -d /opt/artcom/java6 ]
     then JAVA_HOME=/opt/artcom/java6
     elif [ -d "$ARTCOM_HOME"/java5 ]
     then JAVA_HOME="$ARTCOM_HOME"/java5
     elif [ -d /opt/artcom/java5 ]
     then JAVA_HOME=/opt/artcom/java5
     elif [ -d "$ARTCOM_HOME"/java2 ]
     then JAVA_HOME="$ARTCOM_HOME"/java2
     elif [ -d /opt/artcom/java2 ]
     then JAVA_HOME=/opt/artcom/java2
     elif [ -d "$ARTCOM_HOME"/java1 ]
     then JAVA_HOME="$ARTCOM_HOME"/java1
          JAVA1_COMPAT=True
     elif [ -d /opt/artcom/java1 ]
     then JAVA_HOME=/opt/artcom/java1
          JAVA1_COMPAT=True
     elif GuessWhichJava
     then : Fine
     else echo "cannot find path to a Java Runtime Enviroment (JRE)"
          exit 1
     fi
  fi
fi

#
if [ "$VERBOSE" ]
then echo "$0: JAVA_HOME=$JAVA_HOME"
fi

if [ -x "$JAVA_HOME/bin/java" ]
then JAVA=$JAVA_HOME/bin/java
elif [ -x "$JAVA_HOME/bin/jre" ]
then JAVA=$JAVA_HOME/bin/jre
else echo "cannot find a 'java' or a 'jre' command in JAVA_HOME=$JAVA_HOME"
     exit 1
fi
# Issue 3465
export LIBXCB_ALLOW_SLOPPY_LOCK=1
export JAVA JAVA_HOME

if [ $VERBOSE ]
then echo "$0: JAVA=$JAVA"
fi

# Classpath
if [[ "$_java" ]]; then
    version=$("$_java" -version 2>&1 | awk -F '"' '/version/ {print $2}')
    #echo version "$version"
    if [[ "$version" < "9" ]]; then
        if   [ -r $JAVA_HOME/lib/classes.zip ]          # Jdk 1.1.x
        then RT=$JAVA_HOME/lib/classes.zip
        elif [ -r $JAVA_HOME/lib/rt.jar ]               # Jre 1.1.x/1.2
        then RT=$JAVA_HOME/lib/rt.jar
        elif [ -r $JAVA_HOME/jre/lib/rt.jar ]           # Jdk 1.2
        then RT=$JAVA_HOME/jre/lib/rt.jar
        else echo "cannot find JAVA base classes (classes.zip/rt.jar)"
            exit 1
        fi
    fi
fi
CLASSPATH=$RT:$BITSLIB/java/lib/classpath.jar
# Newer JREs include swing; only Java1 didn't:
if [ -n "$JAVA1_COMPAT" ]
then CLASSPATH=$CLASSPATH:$BITSLIB/java/lib/swingall.jar
     CLASSPATH=$CLASSPATH:$BITSLIB/java/lib/crimson.jar
fi
CLASSPATH=$CLASSPATH:$BITSLIB/java/lib/commons-lang.jar
CLASSPATH=$CLASSPATH:$BITSLIB/java/lib/commons-net-3.4.jar
CLASSPATH=$CLASSPATH:$BITSLIB/java/lib/jakarta-oro-2.0.8.jar
CLASSPATH=$CLASSPATH:$BITSLIB/java/lib/jh.jar
CLASSPATH=$CLASSPATH:$BITSLIB/java/lib/gnu.jar
CLASSPATH=$CLASSPATH:$BITSLIB/java/lib/jamod-1.2-SNAPSHOT.jar
CLASSPATH=$CLASSPATH:$BITSLIB/java/lib/poi-3.17.jar
CLASSPATH=$CLASSPATH:$BITSLIB/java
if [ -r $AC_CUSTOMER/artcom.jar ]
then CLASSPATH=$CLASSPATH:$AC_CUSTOMER/artcom.jar
else CLASSPATH=$CLASSPATH:$BITSLIB/java/lib/artcom.jar
fi
CLASSPATH=$CLASSPATH:$BITSLIB/java/lib/artcomLook.jar

# Maximum memory. On modern machines you can write one
# of the following values into $AC_CUSTOMER/JAVAMAXMEM:
# - on most 32 bit linux machines with 32 bit ArtCom software:  2560m
# - on most 64 bit linux machines with 32 bit ArtCom software:  3584m
MAXMEMORY=1536m
JAVASTACKSIZE=2m
if CheckFlag JAVA_SMALL_MEM
then # Set a maximum of 1024MB memory.
     JAVASTACKSIZE=
     MAXMEMORY=1024m
elif [ -r "$AC_CUSTOMER/JAVAMAXMEM" ]
then MAXMEMORY=`cat "$AC_CUSTOMER/JAVAMAXMEM"`
elif [ "$ARTCOM_ARCH" = "x86_64" ]
then MAXMEMORY=2048m
fi

if [ -z "$JAVA1_COMPAT" ]
then # with newer JREs there are not many options needed:
     OPT="-Xmx$MAXMEMORY"
     THREADTYPE=
else # configure the xml parser if we still use java 1.1
     JAVA_VERSION=`$JAVA -version 2>&1`
     OPT="-Djavax.xml.parsers.DocumentBuilderFactory=org.apache.crimson.jaxp.DocumentBuilderFactoryImpl"
     OPT="$OPT -Djavax.xml.parsers.SAXParserFactory=org.apache.crimson.jaxp.SAXParserFactoryImpl"
     # the old historic way to set all options.
     THREADTYPE="-green"
     #Note that this wont work on java 1.3 a.s.o....
     if echo "$JAVA_VERSION" | grep -q "1\.2"
     then OPT="$OPT -Xmx$MAXMEMORY"
     else OPT="$OPT -mx$MAXMEMORY"
     fi
fi
# append the Xss option to avoid Stack-Size overflow [Issue1671]
if [ -z "$JAVA1_COMPAT" ] && [ -n "$JAVASTACKSIZE" ]
then OPT="$OPT -Xss$JAVASTACKSIZE"
fi
# Run Java application
# Note! $THREADTYPE must be the first parameter, because the Java
# programm often is a script, which test the first parameter to be
# "-green" or "-native"
#
# Because Java cannot access enviroment variables directly, we provide
# at least $BITSLIB as Java System Property. Other environment and flags
# variables can be accessed via libartcom after the shared library has
# been dynamically loaded from $BITSLIB/java/lib/.
$JAVA $THREADTYPE $OPT \
    -Dartcom.bitslib="$BITSLIB" \
    -classpath "$CLASSPATH" $MAINCLASS "$@"
