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

##
## Tries to recreate Gradle's gradlew command in pure bash.
## This way you don't have to worry about binaries in your build.
##
## Dependencies
## unzip
##

set -e
set -o pipefail

APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`

# Use the maximum available, or set MAX_FD != -1 to use that value.
    MAX_FD="maximum"

# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS="-Dorg.gradle.appname=$APP_BASE_NAME"

bin=`dirname "$0"`
bin=`cd "$bin">/dev/null; pwd`

if [ -e "$bin/gradle/wrapper/gradle-wrapper.properties" ]; then
  . "$bin/gradle/wrapper/gradle-wrapper.properties"
else
  # the location that the wrapper is at doesn't have a properties
  # check PWD, gradlew may be shared
  if [ -e "$PWD/gradle/wrapper/gradle-wrapper.properties" ]; then
    . "$PWD/gradle/wrapper/gradle-wrapper.properties"
  else
    echo "Unable to locate gradle-wrapper.properties.  Not at $PWD/gradle/wrapper/gradle-wrapper.properties or $bin/gradle/wrapper/gradle-wrapper.properties" 1>&2
    exit 1
  fi
fi

warn ( ) {
    echo "$*"
}

die ( ) {
    echo
    echo "$*"
    echo
    exit 1
}

# OS specific support (must be 'true' or 'false').
darwin=false
case "`uname`" in
  Darwin* )
    darwin=true
    ;;
esac

# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
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
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >&-
APP_HOME="`pwd -P`"
cd "$SAVED" >&-

CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar

# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
        # IBM's JDK on AIX uses strange locations for the executables
        JAVACMD="$JAVA_HOME/jre/sh/java"
    else
        JAVACMD="$JAVA_HOME/bin/java"
    fi
    if [ ! -x "$JAVACMD" ] ; then
        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME

Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
    fi
else
    JAVACMD="java"
    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.

Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi

# Increase the maximum file descriptors if we can.
if [ "$darwin" = "false" ] ; then
    MAX_FD_LIMIT=`ulimit -H -n`
    if [ $? -eq 0 ] ; then
        if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
            MAX_FD="$MAX_FD_LIMIT"
        fi
        ulimit -n $MAX_FD
        if [ $? -ne 0 ] ; then
            warn "Could not set maximum file descriptor limit: $MAX_FD"
        fi
    else
        warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
    fi
fi

# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
    GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi

# does not match gradle's hash
# waiting for http://stackoverflow.com/questions/26642077/java-biginteger-in-bash-rewrite-gradlew
hash() {
  local input="$1"
  if $darwin; then
    md5 -q -s "$1"
  else
    echo -n "$1" | md5sum  | cut -d" " -f1
  fi
}

dist_path() {
  local dir=$(basename $distributionUrl | sed 's;.zip;;g')
  local id=$(hash "$distributionUrl")

  echo "$HOME/.gradle/${distributionPath:-wrapper/dists}/$dir/$id"
}

zip_path() {
  local dir=$(basename $distributionUrl | sed 's;.zip;;g')
  local id=$(hash "$distributionUrl")

  echo "$HOME/.gradle/${zipStorePath:-wrapper/dists}/$dir/$id"
}

download() {
  local base_path=$(dist_path)
  local file_name=$(basename $distributionUrl)
  local dir_name=$(echo "$file_name" | sed 's;-bin.zip;;g' | sed 's;-src.zip;;g' |sed 's;-all.zip;;g')

  if [ ! -d "$base_path" ]; then
    mkdir -p "$base_path"
  else
    # if data already exists, it means we failed to do this before
    # so cleanup last run and try again
    rm -rf $base_path/*
  fi

  # download dist. curl on mac doesn't like the cert provided...
  local zip_path=$(zip_path)
  curl --insecure -L -o "$zip_path/$file_name" "$distributionUrl"

  pushd "$base_path"
    touch "$file_name.lck"
    unzip "$zip_path/$file_name" 1> /dev/null
    touch "$file_name.ok"
  popd
}

is_cached() {
  local file_name=$(basename $distributionUrl)

  [ -e "$(dist_path)/$file_name.ok" ]
}

lib_path() {
  local base_path=$(dist_path)
  local file_name=$(basename $distributionUrl | sed 's;-bin.zip;;g' | sed 's;-src.zip;;g' |sed 's;-all.zip;;g')

  echo "$base_path/$file_name/lib"
}

classpath() {
  local dir=$(lib_path)
  local cp=$(ls -1 $dir/*.jar | tr '\n' ':')
  echo "$dir:$cp"
}

# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
function splitJvmOpts() {
    JVM_OPTS=("$@")
}

main() {
  if ! is_cached; then
    download
  fi

  eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
  JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"

  $JAVACMD "${JVM_OPTS[@]}" -cp $(classpath) org.gradle.launcher.GradleMain "$@"
}

main "$@"

