#!/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 our absolute path                                                      
# resolve links - $0 may be a softlink                                           
this="${BASH_SOURCE-$0}"                                                         
while [ -h "$this" ]; do                                                         
    ls=`ls -ld "$this"`                                                          
    link=`expr "$ls" : '.*-> \(.*\)$'`                                           
    if expr "$link" : '.*/.*' > /dev/null; then                                  
        this="$link"                                                             
    else                                                                         
        this=`dirname "$this"`/"$link"                                           
    fi                                                                           
done                                                                             
                                                                                 
# convert relative path to absolute path                                         
bin=`dirname "$this"`                                                            
script=`basename "$this"`                                                        
bin=`unset CDPATH; cd "$bin"; pwd`                                               
this="$bin/$script"                                                              


if [ -e "$bin/../libexec/hcat-config.sh" ]; then
  . "$bin"/../libexec/hcat-config.sh
else
  . "$bin"/hcat-config.sh
fi

# filter debug command line parameter
debug=false
dump_classpath=false

for f in $@; do
     if [[ $f = "-secretDebugCmd" ]]; then
        debug=true
     else
        remaining="${remaining} $f"
     fi
     if [[ $f = "-classpath" ]]; then
        dump_classpath=true
     fi
done

# check for hive in the path
HIVE_IN_PATH=`which hive 2>/dev/null`
if [ -f ${HIVE_IN_PATH} ]; then
  #dir of hive scrip
  HIVE_DIR=`dirname "$HIVE_IN_PATH"`
  #one level up for base dir
  HIVE_DIR=`dirname "$HIVE_DIR"`
fi

# HIVE_HOME env variable overrides hive in the path
HIVE_HOME=${HIVE_HOME:-$HIVE_DIR}

if [ "$HIVE_HOME" == "" ]; then
  echo "Cannot find hive installation: \$HIVE_HOME must be set or hive must be in the path";
  exit 4;
fi

if [ "$HIVE_HOME" == '/usr' ] || [ "$HIVE_HOME" == '/usr/' ]; then
  #this would be a hive rpm install, bigtop rpm  has HIVE_HOME dir
  #structure in /usr/lib/hive. Use that if the dir structure looks good
  if [ -d '/usr/lib/hive/conf' ] && [ -d '/usr/lib/hive/lib' ]; then
    HIVE_HOME='/usr/lib/hive/';
  fi
fi



HIVE_LIB_DIR=${HIVE_HOME}/lib
if [ ! -d "$HIVE_LIB_DIR" ]; then
  echo "Cannot find lib dir within HIVE_HOME : $HIVE_LIB_DIR";
  exit 4;
fi

HIVE_CONF_DIR=${HIVE_HOME}/conf
if [ ! -d "$HIVE_CONF_DIR" ]; then
  echo "Cannot find conf dir within HIVE_HOME : $HIVE_CONF_DIR";
  exit 4;
fi


# Find our hcatalog jar
shopt -s extglob
if (( `ls -1 $HCAT_PREFIX/share/hcatalog/hcatalog-[0-9]*.jar | wc -l` > 1 )) ; then
    echo "Error:  found more than one hcatalog jar in $HCAT_PREFIX/share/hcatalog"
    exit 1
fi
HCAT_JAR=`ls $HCAT_PREFIX/share/hcatalog/hcatalog-[0-9]*.jar`

# Find the storage-handler jars.
for jar in ${HCAT_PREFIX}/share/hcatalog/lib/*.jar ; do
	HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$jar
done

# Add all of the other jars to our classpath
for jar in ${HIVE_LIB_DIR}/*.jar ; do
	HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$jar
done

# Put external jars, hcat jar, and config file in the classpath
HADOOP_CLASSPATH=${HADOOP_CLASSPATH}:${HCAT_CLASSPATH}:${HCAT_JAR}:${HIVE_CONF_DIR}

if [ -n "$HBASE_CONF_DIR" ] && [ -d $HBASE_CONF_DIR ]; then
    HADOOP_CLASSPATH=${HADOOP_CLASSPATH}:${HBASE_CONF_DIR}
fi

export HADOOP_CLASSPATH=$HADOOP_CLASSPATH
export HADOOP_OPTS=$HADOOP_OPTS
# run it
if [ "$debug" == "true" ]; then
	echo "Would run:"
	echo "exec $HADOOP_PREFIX/bin/hadoop jar $HCAT_JAR org.apache.hcatalog.cli.HCatCli $remaining"
	echo "with HADOOP_CLASSPATH set to ($HADOOP_CLASSPATH)"
	echo "and HADOOP_OPTS set to ($HADOOP_OPTS)"
elif [ "$dump_classpath" == "true" ]; then
    echo $HADOOP_CLASSPATH
else
	exec $HADOOP_PREFIX/bin/hadoop jar  $HCAT_JAR org.apache.hcatalog.cli.HCatCli "$@"
fi

