#!/usr/bin/env bash
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

# resolve links - $0 may be a softlink
PRG="${0}"

while [ -h "${PRG}" ]; do
  ls=`ls -ld "${PRG}"`
  link=`expr "$ls" : '.*-> \(.*\)$'`
  if expr "$link" : '/.*' > /dev/null; then
    PRG="$link"
  else
    PRG=`dirname "${PRG}"`/"$link"
  fi
done

BASEDIR=`dirname ${PRG}`
BASEDIR=`cd ${BASEDIR}/..;pwd`

if [ -r "${BASEDIR}/conf/oozie-client-env.sh" ]; then
  source "${BASEDIR}/conf/oozie-client-env.sh"
fi

if [ "${OOZIE_URL}" = "" ]; then
  export OOZIE_URL="http://$(hostname -f):11000/oozie"
fi

#Create lib directory from war if lib doesn't exist
if [ ! -d "${BASEDIR}/lib" ]; then
  mkdir ${BASEDIR}/lib
  unzip ${BASEDIR}/oozie.war WEB-INF/lib/*.jar -d ${BASEDIR}/lib > /dev/null
  mv ${BASEDIR}/lib/WEB-INF/lib/*.jar ${BASEDIR}/lib/
  rmdir ${BASEDIR}/lib/WEB-INF/lib
  rmdir ${BASEDIR}/lib/WEB-INF
fi

OOZIECPPATH=""
for i in "${BASEDIR}/lib/"*.jar; do
  OOZIECPPATH="${OOZIECPPATH}:$i"
done
for i in "${BASEDIR}/libext/"*.jar; do
  OOZIECPPATH="${OOZIECPPATH}:$i"
done


if test -z ${JAVA_HOME}
then
    JAVA_BIN=java
else
    JAVA_BIN=${JAVA_HOME}/bin/java
fi

# Prime OOZIE_CLIENT_OPTS with JAVA_PROPERTIES for backwards compatibility
OOZIE_CLIENT_OPTS="${JAVA_PROPERTIES} ${OOZIE_CLIENT_OPTS}"

while [[ ${1} =~ ^\-D ]]; do
  OOZIE_CLIENT_OPTS="${OOZIE_CLIENT_OPTS} ${1}"
  shift
done
${JAVA_BIN} ${OOZIE_CLIENT_OPTS} -cp ${OOZIECPPATH} org.apache.oozie.cli.OozieCLI "${@}"
