#!/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.
set -x

. `dirname $0`/bigtop.bom
#
# Resolve source directory
#

# $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

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

RELEASE_DIR=$PWD

# IMPORTANT: THE FULL_VERSION, if set, will be used only for the final TARBALL,
#            Everything inside of the TARBALL uses the version specified in the POM
if [ -z "${FULL_VERSION}" ]; then
  FULL_VERSION=${OOZIE_VERSION}
  echo "Warning: FULL_VERSION not specified. Default version [${FULL_VERSION}] will be used."
fi
VERSION_SUFFIX="-${FULL_VERSION}"

#
# Build Oozie
#

echo "Starting system build"

# Test if there is a + sign in the dir path
# We need to do this because in Linux Sun JVM inteprets '+' as ' ' in URLs
# testcases uses URLs to access testcases directories and OpenJPA enhancer uses them as well
WORKDIR=${RELEASE_DIR}
if [[ "${WORKDIR}" == *\+* ]]; then
  # There is a + sign. Create a temp work dir
  # and copy over the files to that place
  WORKDIR=`mktemp -d /tmp/oozie.XXXXXX`
  echo "Created temporary workspace directory: ${WORKDIR}"
  cp -R ${RELEASE_DIR}/* ${WORKDIR}
fi

# Delete and recreate build directory
BUILDDIR=${WORKDIR}/build
rm -rf ${BUILDDIR}
mkdir -p ${BUILDDIR}

EXTRA_GOALS=""

# Check if maven deploy should be done or not
if [ "${DO_MAVEN_DEPLOY}" = "deploy" ]; then
  EXTRA_GOALS="${EXTRA_GOALS} source:jar deploy"
fi

# Disable Codehaus repository since it's out of service
sed -i.bak "/http:\/\/repository.codehaus.org/a\\
            <releases>\\
                <enabled>false</enabled>\\
            </releases>" ${WORKDIR}/pom.xml

export MAVEN_OPTS="-Xmx2g"

# Invoke Oozie build script
MKDISTRO_ARGS=" -DjavaVersion=${JDK_VERSION} -DtargetJavaVersion=${JDK_VERSION} -DminJavaVersion=${JDK_VERSION} "
MKDISTRO_ARGS+="-DskipTests -Phadoop-3 -Pspark-2 -Puber "
MKDISTRO_ARGS+="-Dhadoop.version=${HADOOP_VERSION} "
MKDISTRO_ARGS+="-Dhadoop.auth.version=${HADOOP_VERSION} "
MKDISTRO_ARGS+="-Dhive.version=${HIVE_VERSION} "
MKDISTRO_ARGS+="-Dsqoop.version=${SQOOP_VERSION} "
MKDISTRO_ARGS+="-Dspark.version=${SPARK_VERSION} "
MKDISTRO_ARGS+="-Dspark.scala.binary.version=${SCALA_VERSION%.*} "
MKDISTRO_ARGS+="-Dspark.guava.version=27.0-jre "
MKDISTRO_ARGS+="-Dcommons.lang3.version=3.9 "
MKDISTRO_ARGS+="-Djackson.version=2.9.10 "
${WORKDIR}/bin/mkdistro.sh ${MKDISTRO_ARGS} ${EXTRA_GOALS} -Dmaven.repo.local=${HOME}/.m2/repository "$@"
MKDISTRO_RESULT=$?
if [ "${MKDISTRO_RESULT}" != "0" ]; then
  echo "ERROR: mkdistro.sh failed with error ${MKDISTRO_RESULT}"
  echo "Build files from failed build: ${WORKDIR}"
  exit ${MKDISTRO_RESULT}
fi

#
# Expand Oozie TAR and create Bigtop Ooozie TAR
#
# (TODO: This logic is kind of twisted, revisit.)
# (TODO: Consider doing the source copy before the build if we can assume a clean checkout.)
#

EXPTMPDIR=${BUILDDIR}/temp
mkdir -p ${EXPTMPDIR}
URLSAFE_VERSION_SUFFIX=`echo ${VERSION_SUFFIX}| sed -e "s/+/-/"`
ORIGINAL_NAME=oozie${VERSION_SUFFIX}
URLSAFE_NAME=oozie${URLSAFE_VERSION_SUFFIX}
EXPDIR=${EXPTMPDIR}/${URLSAFE_NAME}
(
cd ${EXPTMPDIR}
tar zxf ${WORKDIR}/distro/target/oozie-*.tar.gz
if [ "${FULL_VERSION}" != "${OOZIE_VERSION}" ]; then
  mv ${EXPTMPDIR}/oozie-* ${EXPDIR}
fi

cd ${EXPDIR}

SRCDIR=${EXPDIR}/src
mkdir -p ${SRCDIR}
for srcfile in ${WORKDIR}/*
do
  if [ "${srcfile}" != "${BUILDDIR}" ]; then
    cp -R ${srcfile} ${SRCDIR}
  fi
done
rm -rf ${SRCDIR}/target \
       ${SRCDIR}/*/target \
       ${SRCDIR}/core/build \
       ${SRCDIR}/core/pig*.log \
       ${SRCDIR}/core/pig*.properties \
       ${SRCDIR}/examples/mem \
       ${SRCDIR}/examples/oozietests \
       ${SRCDIR}/mkdistro-*.out \
       ${SRCDIR}/*.iml \
       ${SRCDIR}/*/*.iml \
       ${SRCDIR}/*.ipr \
       ${SRCDIR}/*.iws 

cp ${SRCDIR}/LICENSE.txt ${EXPDIR}
cp ${SRCDIR}/NOTICE.txt ${EXPDIR}
cd ${EXPDIR}
jar xf ${EXPDIR}/docs.zip
rm -rf ${EXPDIR}/docs.zip
rm -rf ${EXPDIR}/WEB-INF
rm -rf ${EXPDIR}/META-INF
cd ${EXPTMPDIR}
if [ "${URLSAFE_NAME}" != "${ORIGINAL_NAME}" ]; then
  mv ${URLSAFE_NAME} ${ORIGINAL_NAME}
fi
tar cfz oozie${VERSION_SUFFIX}.tar.gz ${ORIGINAL_NAME}
mv oozie${VERSION_SUFFIX}.tar.gz ${BUILDDIR}
cd ${BUILDDIR}
rm -rf ${EXPTMPDIR}
)

# If a temp work dir was created, move the files back to
# basedir and clean it up.

if [ "${WORKDIR}" != "${RELEASE_DIR}" ]; then
  echo "Moving built files from temporary location to work dir"
  mv ${WORKDIR}/build ${RELEASE_DIR}/build
  rm -rf ${WORKDIR}
fi

echo "Build available at: ${RELEASE_DIR}/build"

(cd ${RELEASE_DIR} ; tar --strip-components 1 -xzvf build/oozie${VERSION_SUFFIX}.tar.gz; rm -f bin/mkdistro.sh)

echo "SUCCESS: Build complete"
exit 0
