#!/bin/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 -euo pipefail
trap 'echo Error in $0 at line $LINENO: $(cd "'$PWD'" && awk "NR == $LINENO" $0)' ERR

. ${IMPALA_HOME}/bin/impala-config.sh > /dev/null 2>&1

# TODO: remove this once we understand why Hive looks in HDFS for many of its jars

# Remove all directories in one command for efficiency
${HADOOP_HOME}/bin/hadoop fs -rm -skipTrash -r -f ${FILESYSTEM_PREFIX}${HIVE_HOME}/lib/ \
  ${FILESYSTEM_PREFIX}${HBASE_HOME}/lib/ \
  ${FILESYSTEM_PREFIX}${HADOOP_HOME}/share/hadoop/common/ \
  ${FILESYSTEM_PREFIX}${HADOOP_HOME}/share/hadoop/mapreduce/ \
  ${FILESYSTEM_PREFIX}${HADOOP_HOME}/share/hadoop/tools/lib \
  ${FILESYSTEM_PREFIX}${HADOOP_LZO}/build \
  ${FILESYSTEM_PREFIX}${SENTRY_HOME}/lib/ \
  ${FILESYSTEM_PREFIX}${IMPALA_HOME}/thirdparty/postgresql-jdbc/

TMP_DIR=$(mktemp -d)

# Create the directory structure to copy over
mkdir -p ${TMP_DIR}/${HIVE_HOME}/lib \
  ${TMP_DIR}/${HBASE_HOME}/lib \
  ${TMP_DIR}/${HADOOP_HOME}/share/hadoop/common/lib \
  ${TMP_DIR}/${HADOOP_HOME}/share/hadoop/mapreduce \
  ${TMP_DIR}/${HADOOP_HOME}/share/hadoop/tools/lib \
  ${TMP_DIR}/${HADOOP_LZO}/build \
  ${TMP_DIR}/${SENTRY_HOME}/lib \
  ${TMP_DIR}/${IMPALA_HOME}/thirdparty/postgresql-jdbc/

# Add symbolic links to files in the appropriate places
ln -s ${HIVE_HOME}/lib/*.jar ${TMP_DIR}/${HIVE_HOME}/lib
ln -s ${HBASE_HOME}/lib/*.jar ${TMP_DIR}/${HBASE_HOME}/lib
ln -s ${HADOOP_HOME}/share/hadoop/common/*.jar \
  ${TMP_DIR}/${HADOOP_HOME}/share/hadoop/common
ln -s ${HADOOP_HOME}/share/hadoop/common/lib/*.jar \
  ${TMP_DIR}/${HADOOP_HOME}/share/hadoop/common/lib
ln -s ${HADOOP_HOME}/share/hadoop/mapreduce/*.jar \
  ${TMP_DIR}/${HADOOP_HOME}/share/hadoop/mapreduce
ln -s ${HADOOP_HOME}/share/hadoop/tools/lib/*.jar \
  ${TMP_DIR}/${HADOOP_HOME}/share/hadoop/tools/lib
ln -s ${HADOOP_LZO}/build/hadoop-lzo*.jar ${TMP_DIR}/${HADOOP_LZO}/build
ln -s ${SENTRY_HOME}/lib/*.jar ${TMP_DIR}/${SENTRY_HOME}/lib
# This is the only item that uses a different path
# TODO: why is this path different?
ln -s ${POSTGRES_JDBC_DRIVER} ${TMP_DIR}/${IMPALA_HOME}/thirdparty/postgresql-jdbc

${HADOOP_HOME}/bin/hadoop fs -put ${TMP_DIR}/* ${FILESYSTEM_PREFIX}/

rm -r ${TMP_DIR}
