#!/bin/bash

# We require the config/testenv file.
[ -f config/testEnv ] || exit $?

# Source test configuration file. 
. config/testEnv

# Check that these variables have been defined, and export them.
export ACS_INSTANCE
export ACS_TMP
export ACS_CDB
export ACS_LOG_STDOUT

export TMCDB_STANDALONE_DEBUG
export TMCDB_CONFIGURATION_NAME
export TMCDB_STARTUP_NAME
export JAVA_OPTIONS

RETVAL=0

createLock() {
    # To be sure, delete all temporary and the recovery files before starting
    if [ -e "$ACS_TMP" ]; then
        if [ -e "$ACS_LOCK" ]; then
           printf "*** Lock file %s already exists, exiting\n" "$ACS_LOCK"
           exit 0
        fi
        rm -rf "$ACS_TMP" &> /dev/null
    fi
    mkdir "$ACS_TMP"
    date > "$ACS_LOCK"
}

clearLock() {
    rm -f "$ACS_LOCK" &> /dev/null
}

checkInstances() {
    instanceFile="${ACS_TMP}/acs_instance"
    if [ -e ${instanceFile} ]; then
        fileInstance=`cat ${instanceFile}`
        if [ ${fileInstance} != $ACS_INSTANCE ]; then
            printf "*** Discrepancy in ACS instance\n"
            printf "    env:   ACS_INSTANCE = %s\n" $ACS_INSTANCE
            printf "    file:  ACS_INSTANCE = %s\n" $fileInstance
        fi
    else
        printf "*** Missing ACS instance file ${instanceFile}"
    fi
    rm -f "$ACS_LOCK" &> /dev/null
}

start() {
    printf "Starting test\n"
    startHSQLDB
    startACS
}

suspend() {
    printf "Suspending test\n"
    stopACS
}

restart() {
    printf "Restarting test\n"
    startACS
}

stop() {
    printf "Stopping test\n"
    stopACS
    stopHSQLDB
}

startHSQLDB() {
    printf "Starting HSQLDB\n"
    java -cp $(searchFile lib/hsqldb.jar)/lib/hsqldb.jar org.hsqldb.Server -database.0 file:"$DBDIR/$DBNAME" -dbname.0 "$DBNAME" -port "$DBPORT" &> tmp/hsqldb.log &
    # allow some time for the database to start
    sleep 5
    if test -f "$INTROOT/config/CreateHsqldbTables.sql"; then
        printf "Creating tables... "
        ./scripts/sqltool "\i $INTROOT/config/CreateHsqldbTables.sql"
    elif test -f "ACSROOT/config/CreateHsqldbTables.sql"; then
        printf "Creating tables..."
        ./scripts/sqltool "\i $ACSROOT/config/CreateHsqldbTables.sql"
    fi
}

stopHSQLDB() {
    printf "Stopping HSQLDB\n"
    # Get the location of hsqldb.jar.
    if test -a $ACSROOT/lib/sqltool.jar; then
        HSQLDB_JAR=$ACSROOT/lib/sqltool.jar
    elif test -a $INTROOT/lib/sqltool.jar; then
        HSQLDB_JAR=$INTROOT/lib/sqltool.jar
    fi
    java -jar "$HSQLDB_JAR" --rcFile "$SQLTOOL_RC_FILE" --sql "shutdown;" "$DBNAME"
}

startACS() {
    # Unpack the CDB
    if test -n "$CDB_PACKED_FILE"; then
        CDB_ABS_LOC=`pwd`/$CDB_PACKED_FILE
        cd $ACS_CDB
        tar xvf "$CDB_ABS_LOC" &> /dev/null
        cd - &> /dev/null
    fi
    # Unpack TMCDB_DATA
    if test -n "$TMCDB_DATA_PACKED_FILE"; then
        TMCDB_DATA_ABS_LOC=`pwd`/$TMCDB_DATA_PACKED_FILE
        cd $ACS_CDB
        tar xvf "$TMCDB_DATA_ABS_LOC" &> /dev/null
        cd - &> /dev/null
    fi
    
    # Now see if we should wait for the interface repository to load
    if [ -n "$IDL_FILES_TO_LOAD" ]; then
        noloadifr='--noloadifr'
    fi

    #
    # Start the ORB services and manager and optionally load the interface repository
    #
    printf "Starting ACS\n"
    echo "$ACS_INSTANCE" > $ACS_TMP/acs_instance
    if [ -n "$noloadifr" ]; then
        # acsutilTATPrologue -l $noloadifr
        acsutilBlock -t 60 -f $ACS_TMP/acsStart.log -b "Manager is up and running" \
            -x acsStart --noloadifr &> $ACS_TMP/acsutilBlock-ACS.log
        if [ -n "$IDL_FILES_TO_LOAD" ]; then
            acsstartupLoadIFR  "$IDL_FILES_TO_LOAD" &> $ACS_TMP/loadifr.log
        fi
    else 
        # acsutilTATPrologue -l
        acsutilBlock -t 60 -f $ACS_TMP/acsStart.log -b "Manager is up and running" \
            -x acsStart &> $ACS_TMP/acsutilBlock-ACS.log
    fi
    
    # Start ACS containers
    declare -a CONTAINERS
    COUNTER=0
    for DIR in $ACS_CONTAINERS; do
        CONTAINERS[$COUNTER]=$DIR
        let COUNTER++
    done
    N=${#CONTAINERS[*]}
    for (( COUNTER=0; COUNTER<$N; COUNTER++)) ; do
        CONTAINER_TYPE="java"
        
        echo "${CONTAINERS[$COUNTER]}" | grep -q java
        if [ $? -eq 0 ] ; then
            CONTAINER_TYPE="java"
        fi
        echo "${CONTAINERS[$COUNTER]}" | grep -q python
        if [ $? -eq 0 ] ; then
            CONTAINER_TYPE="py"
        fi
        echo "${CONTAINERS[$COUNTER]}" | grep -q cpp
        if [ $? -eq 0 ] ; then
            CONTAINER_TYPE="cpp"
        fi
        LOG_FILE=$ACS_TMP/${CONTAINERS[$COUNTER]//\//_}.log
        # printf "%d) %s %s %s\n" "$COUNTER" "${CONTAINERS[$COUNTER]}" "$CONTAINER_TYPE" "$LOG_FILE"
        printf "Starting container %s\n" "${CONTAINERS[$COUNTER]}"
        
        logfile=$ACS_TMP/container-$c.log
        acsutilBlock -t 60 -f $LOG_FILE -b "components activated." \
           -x acsStartContainer -$CONTAINER_TYPE ${CONTAINERS[$COUNTER]} > \
           $ACS_TMP/acsutilBlock-$c.log 2>&1
        
    done
    
    #
    # Now start the archive
    #
    # ARCHIVE_CMD="tomcat start"
    # LOGFILE=$ACS_TMP/archive.log
    # ${ARCHIVE_CMD} > $LOGFILE 2>&1 &
    # pid=$!
    # echo $pid > $ACS_TMP/archive.pid
    # acsutilBlock -t 60 -f $LOGFILE -b "Initialized Archive subsystem."
    printf "Starting Tomcat\n"
    tomcat start &> $ACS_TMP/archive.log
    PID=$!
    echo $PID > $ACS_TMP/archive.pid
}

stopACS() {
    acsutilTATEpilogue
    printf "Stopping Tomcat\n"
    if [ -r "$ACS_TMP/archive.pid" ]; then
	    tomcat stop &> $ACS_TMP/archiveStop.log
    fi
}

startUnit() {
    # Unpack TMCDB_DATA
    if test -n "$TMCDB_DATA_PACKED_FILE"; then
        TMCDB_DATA_ABS_LOC=`pwd`/$TMCDB_DATA_PACKED_FILE
        cd $ACS_CDB
        tar xvf "$TMCDB_DATA_ABS_LOC" &> /dev/null
        cd - &> /dev/null
    fi
    startHSQLDB    
}

stopUnit() {
    stopHSQLDB
}

case "$1" in
    start)
        createLock
        start
        checkInstances
        ;;
    suspend)
        suspend
        clearLock
        ;;
    restart)
        createLock
        restart
        checkInstances
        ;;
    stop)
        stop
        clearLock
        ;;
    startUnit)
        createLock
        startUnit
        ;;
    stopUnit)
        stopUnit
        clearLock
        ;;
    *)
        printf "Usage: $0 {start|stop|suspend|restart}\n"
        exit 1
esac

exit $RETVAL
