#!/bin/bash
#
# Copyright (c) 2018 Oracle and/or its affiliates. All rights reserved.
#
# This program and the accompanying materials are made available under the
# terms of the Eclipse Distribution License v. 1.0, which is available at
# http://www.eclipse.org/org/documents/edl-v10.php.
#
# SPDX-License-Identifier: BSD-3-Clause
#

if [ "$NO_HARNESS" = "" ]; then
  echo "NO_HARNESS property not set. It must point to jaxws-ri/tests/unit/no-harness directory. Exiting."
  return 1;
fi

function prolog() {
    if [ "$debug" = "true" ]; then
       echo ""
       echo "== $1 ============================================================================================================="
       echo ""
    else
       echo "" >> log.txt 2>&1
       echo "== $1 =============================================================================================================" >> log.txt 2>&1
       echo "" >> log.txt 2>&1
    fi;
}

function log() {
    if [ "$debug" = "true" ]; then
       echo $1
    fi;
    echo $1 >> log.txt 2>&1
}

function r {
    if [ $L_STATUS -ne 0 ]; then
        return $L_STATUS;
    fi;
    if [ "$failFast" = "true" ]; then
        if [ $G_STATUS -ne 0 ]; then
            return $G_STATUS;
        fi;
    fi;
    if [ "$debug" = "true" ]; then
       #echo $CTX: $G_STATUS
       echo "$@"
       echo ""
       "$@"
    else
       echo "$@" >> log.txt 2>&1
       echo "" >> log.txt 2>&1
       "$@" >> log.txt 2>&1
    fi;

    local status=$?
    if [ $status -ne 0 ]; then
        G_STATUS=$status
        L_STATUS=$status
        log "FAILED:$CTX"
    fi
    return $status
}

function mkdirp() {
    log "creating directory [$1]"
    mkdir -p $1 > /dev/null 2>&1 | true
}

function cpwsdl() {
    #log "copying [$1/$2] to [services/$SVC_DIR/war/WEB-INF/wsdl/]"
    log "copying [$1/$2] to [deploy-classes/WEB-INF/wsdl/]"

    #create directories for target file ...

    #WSDL_DIR=services/$SVC_DIR/war/WEB-INF/wsdl
    WSDL_DIR=deploy-classes/WEB-INF/wsdl
    mkdir -p $WSDL_DIR/$2 > /dev/null 2>&1 | true
    rm -rf $WSDL_DIR/$2 > /dev/null 2>&1 | true

    # make actual copy ...
    cp $1/$2 $WSDL_DIR/$2 > /dev/null 2>&1 | true
}

function cpclasses() {
    mkdirp deploy-classes
    log "copying [$1] to [deploy-classes/]"
#    log "copying [$1] to [services/$SVC_DIR/war/WEB-INF/classes/]"
#    cp  $1 services/$SVC_DIR/war/WEB-INF/classes/ > /dev/null 2>&1 | true
    cp $1 deploy-classes > /dev/null 2>&1 | true
}

#function prepareModule() {
#    MODULE=$1
#    MODS=/Users/miran/dev/jigsaw/TESTS/JAXWS/unit/mods
#
#    log "preparing module [$MODULE]"
#
#    mkdir -p ../mods/
#
#    #no module-info.java generating
#    if [ -d $MODS/$MODULE ]; then
#       cp -r $MODS/$MODULE ../mods/
#    fi;
#
#    rm -rf ../mods/$MODULE/module-info.*
#
#    mkdir -p ../mods/$MODULE/bsh
#
#    # add libraries to module sources
#    cp -r $SHARED_DIR/classes/* ../mods/$MODULE/ >> log.txt 2>&1 | true
#
#    # SERVER
#    if [ "$MODULE" = "server" ]; then
#        # TODO: this is server!
#        if [ -f services/$SVC_DIR/gen-src/module-info.java ]; then
#            echo "CHECK THIS: $CTX services/$SVC_DIR/gen-src/module-info.java " >> log.txt 2>&1
#            cp -r services/$SVC_DIR/gen-src/module-info.java ../mods/server/
#        fi;
#
#        if [ -d services/$SVC_DIR/war/WEB-INF/classes ]; then
#            cp -r services/$SVC_DIR/war/WEB-INF/classes/* ../mods/server/
#        fi;
#
#        cp -r bsh/Deploy*.class ../mods/server/bsh
#        cp -r bsh/Endpoint*.class ../mods/server/bsh
#
##        # module-info generated by ws-tools
##        cp -r services/$SVC_DIR/war/WEB-INF/classes/module-info.java ../mods/$MODULE/
#    else
#        cp -r client-classes/* ../mods/$MODULE/  > /dev/null 2>&1 | true
#        cp -r client-source/module-info.java ../mods/$MODULE/  > /dev/null 2>&1 | true
#
##        # module-info generated by ws-tools
##        cp -r client-source/module-info.java ../mods/$MODULE/
#
#        # aleady in client-classes ...
#        #cp -r bsh/Client*.class ../mods/$MODULE/bsh
#    fi;
#
#    if [ -f ../mods/$MODULE/module-info.java ]; then
#        r javac $TOOL_JAVA_OPTS ../mods/$MODULE/module-info.java
#    else
#        echo "FAILED: $CTX: mising module-info.java!!!!" >> log.txt 2>&1
#        export G_STATUS=1
#        return -1;
#    fi;
#
#    if [ "$MODULE" = "server" ]; then
#        mkdirp ../mods-server
#        mv ../mods/$MODULE ../mods-server/
#    fi;
#}

function runServer() {
    CP=$1
    CLAZZ=$2

    # unpacking testutil to module's classes
    cp -R $SHARED_DIR/classes/* deploy-classes/ >> log.txt 2>&1

    if [ "$useNamedModule" = "true" ]; then

#        if [ -f "deploy-classes/module-info.java" ]; then
#            cp deploy-classes/module-info.java deploy-source
#        fi

        r cp $SHARED_DIR/module-info/$SERVICE_ID/module-info-server.java deploy-source/module-info.java
        r javac -d deploy-classes deploy-source/module-info.java >> log.txt 2>&1

        # prepareModule classes-deploy server
        r mkdirp tmp/server
        r mv deploy-classes/* tmp/server
        r rm -rf deploy-classes
        r mv tmp deploy-classes

        r java $SERVER_JAVA_OPTS -DdeployPort=$PORT -DstopPort=$STOP_PORT -mp deploy-classes -m server/$CLAZZ  >> log.txt 2>&1 &
    else
        r java $SERVER_JAVA_OPTS -DdeployPort=$PORT -DstopPort=$STOP_PORT -cp deploy-classes $CLAZZ  >> log.txt 2>&1 &
    fi;
}

function runClient() {
    CP=$1
    CLAZZ=$2

    # unpacking testutil to module's classes
    cp -R $SHARED_DIR/classes/* client-classes/ >> log.txt 2>&1

    if [ "$useNamedModule" = "true" ]; then

        r cp $SHARED_DIR/module-info/$SERVICE_ID/module-info-client.java client-source/module-info.java
        r javac -d client-classes/ client-source/module-info.java >> log.txt 2>&1

        # prepareModule classes-deploy server
        r mkdirp tmp/client
        r cp -Rf client-classes/* tmp/client
        r rm -rf client-classes-module|true
        r mv tmp client-classes-module

        r java $CLIENT_JAVA_OPTS -DdeployPort=$PORT -DstopPort=$STOP_PORT -mp client-classes-module -m client/$CLAZZ  >> log.txt 2>&1
    else
        r java $CLIENT_JAVA_OPTS -DdeployPort=$PORT -DstopPort=$STOP_PORT -cp client-classes $CLAZZ  >> log.txt 2>&1
    fi;
}

SHARED_DIR=$NO_HARNESS/SHARED/
SHARED_LIB=$SHARED_DIR/lib/jaxwsTestUtil.jar:$SHARED_DIR/classes

function collectSources() {
    local FILE=$1
    local TARGET_DIR=$2
    if [ -f $FILE ]; then
        TARGET_FILE=$(targetPath $FILE "")
        cpp $FILE $TARGET_DIR/$TARGET_FILE
    fi

    if [ -d $FILE ]; then
        DIR=$FILE
        SRC_FILES=`find $DIR -name '*.java'`
        for file in $SRC_FILES
        do
            TARGET_FILE=$(targetPath $file $DIR)
            cpp $file $TARGET_DIR/$TARGET_FILE
        done
    fi
}

function cpp() {
    local FILE=$1
    local TARGET_FILE=$2
    local TARGET_DIR=$(dirname $TARGET_FILE)

    echo " [$FILE] > [$TARGET_FILE]" >> log.txt 2>&1

    mkdirp $TARGET_DIR
    cp -R $FILE $TARGET_DIR/ >> log.txt 2>&1
}

function targetPath() {
    file=$1
    DIR=$2

    #echo "FILE: [$file]" >> log.txt 2>&1
    PACKAGE_FROM_SOURCE=$(packageFromSource $file)
    TARGET_PATH=${r"${file//$DIR\//}"}

    if [ "" = "$PACKAGE_FROM_SOURCE" ]; then
        #echo " > [$TARGET_PATH]" >> log.txt 2>&1
        echo "$TARGET_PATH";
    else
        CORRECT_PATH=$(packageFromSource $file)/$(basename $file)
        echo "$CORRECT_PATH";
        #echo " > [$CORRECT_PATH]" >> log.txt 2>&1
    fi
}

function packageFromSource() {
    JAVA_SOURCE=$1
    PACKAGE=`grep -e "^package " $JAVA_SOURCE | awk 'BEGIN{RS=";";FS=" "} {print $2;}'`
    echo "${r"${PACKAGE//.//}"}"
}

function clean() {
    DIR=$1
    if [ -d $DIR ]; then
        echo "Cleaning $DIR ..." >> log.txt 2>&1
        rm -rf $DIR
    fi;
}

# params: source-dir dest-dir
function compileModuleInfos() {
    SRC_FILES=`find $1 -name 'module-info.java'`
    for file in $SRC_FILES
    do
        r javac -d $2 $file
    done
}

