#!/bin/sh
#
# Copyright (c) 2011, 2018 Oracle and/or its affiliates. All rights reserved.
#
# This program and the accompanying materials are made available under the
# terms of the Eclipse Public License v. 2.0, which is available at
# http://www.eclipse.org/legal/epl-2.0.
#
# This Source Code may also be made available under the following Secondary
# Licenses when the conditions for such availability set forth in the
# Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
# version 2 with the GNU Classpath Exception, which is available at
# https://www.gnu.org/software/classpath/license.html.
#
# SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
#

# 

# set -x

chooseJava() {
#
# Looks for Java at AS_JAVA, JAVA_HOME or in the path.
# Sets javaSearchType to tell which was used to look for java,
# javaSearchTarget to the location (or path), and
# JAVA to the found java executable.
#
# If the user specifies AS_JAVA or JAVA_HOME record that setting
# to be passed as a property to the bootstrap program.
#
    # Depends upon Java from ../config/asenv.conf
    if [ "${AS_JAVA}" != "" ]; then
        javaSearchType=AS_JAVA
        javaSearchTarget="$AS_JAVA"
        JAVA="${AS_JAVA}/bin/java"
    elif [ "${JAVA_HOME}" != "" ]; then
        javaSearchType=JAVA_HOME
        javaSearchTarget="$JAVA_HOME"
        JAVA="${JAVA_HOME}/bin/java"
    else
        # Look in the PATH.
        seekJavaOnPath
        javaSearchType=PATH
        javaSearchTarget=$PATH
    fi
#
# Make sure java really exists where we were told to look.  If not
# display how we tried to find it and then try to run it, letting the shell
# issue the error so we don't have to do i18n of our own message from the script.

    if [ ! -x "${JAVA}" ]; then
        echo
        echo $javaSearchType=$javaSearchTarget
        echo
        ${JAVA}
        exit
    fi
ACCJava="${JAVA}"
export ACCJava
}

seekJavaOnPath() {
        JAVA=`which java`
}


_AS_INSTALL=$S1AS_HOME
echo "_AS_INSTALL now defined as $_AS_INSTALL"
export _AS_INSTALL
case "`uname`" in
  CYGWIN*) _AS_INSTALL=`cygpath --windows $_AS_INSTALL`
           cygwinProp=-Dorg.glassfish.isCygwin=true
esac
. "${_AS_INSTALL}/config/asenv.conf"

chooseJava

#
# Submits an app client for execution using Java Web Start
#
# Accepts the same command options as the appclient script so the test
# files can continue to invoke the appclient using the ${APPCLIENT}
# property substitution.
#
# Requirements:
#   env vars set
#     JAVA_HOME
#     APS_HOME
#
#
# This script runs a Java program to compute the URL to invoke the app client using
# Java Web Start.  The program then returns a javaws command which launches the
# app client.
#
eval `"${ACCJava}" -classpath "${APS_HOME}/lib/javaws-util.jar" util.LaunchJavaWS "$@"`
