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


# Usage:
# . bigtop-detect-javahome ["version_regexp"]
# Params:
#         version_regexp - an optional parameter to specify java version regexp to look for, examples: "1\.8", "17" , "17\.0\..*", etc.


# Override JAVA_HOME in the file below if you want to disable
# automatic JAVA_HOME detection
# Default directory for bigtop configurations
BIGTOP_DEFAULTS_DIR=${BIGTOP_DEFAULTS_DIR-/etc/default}

[ -n "${BIGTOP_DEFAULTS_DIR}" -a -r ${BIGTOP_DEFAULTS_DIR}/bigtop-utils ] && . ${BIGTOP_DEFAULTS_DIR}/bigtop-utils

# Source adcm_jvm_path for potential custom JAVA_HOME (TRINO_JAVA_HOME, ...)
[ -r ${BIGTOP_DEFAULTS_DIR}/adcm_jvm_path ] && . ${BIGTOP_DEFAULTS_DIR}/adcm_jvm_path


JAVA8_HOME_CANDIDATES=(
    '/usr/java/jdk1.8'
    '/usr/java/jre1.8'
    '/usr/lib/jvm/j2sdk1.8-oracle'
    '/usr/lib/jvm/j2sdk1.8-oracle/jre'
    '/usr/lib/jvm/java-8-oracle'
    '/usr/lib/jdk8-latest'
    '/usr/lib/jvm/java-1.8.0'
    '/usr/lib/jvm/java-1.8.0-oracle'
    '/usr/lib/jvm/bellsoft-java8-amd64'
)

JAVA17_HOME_CANDIDATES=(
    '/usr/lib/jvm/bellsoft-java17-amd64'
    '/usr/lib/jvm/bellsoft-java17'             
    '/usr/lib/jvm/liberica-jdk-17*'             
    '/usr/lib/jvm/liberica-jre-17*'            
    '/usr/lib/jvm/zulu-17*'                     
    '/usr/lib/jvm/temurin-17*'                  
    '/usr/lib/jvm/adoptopenjdk-17*'              
    '/usr/lib/jvm/jdk-17*'                      
    '/usr/lib/jvm/java-17*'              
    '/usr/lib/jvm/openjdk-17*'                  
    '/usr/lib/jvm/openjdk-17*'                  
    '/opt/java/bellsoft-java17-amd64'           
    '/opt/java/temurin-17*'                     
    '/usr/local/java/bellsoft-java17-amd64'
    '/usr/lib/jvm/openjdk17'     
    '/usr/lib64/jvm/java-17*'
)

JAVA22_HOME_CANDIDATES=(
    '/usr/lib/jvm/bellsoft-java22-amd64'
    '/usr/lib/jvm/bellsoft-java22'             
    '/usr/lib/jvm/liberica-jdk-22*'             
    '/usr/lib/jvm/liberica-jre-22*'            
    '/usr/lib/jvm/zulu-22*'                     
    '/usr/lib/jvm/temurin-22*'                  
    '/usr/lib/jvm/adoptopenjdk-22*'              
    '/usr/lib/jvm/jdk-22*'                      
    '/usr/lib/jvm/java-22-openjdk'              
    '/usr/lib/jvm/openjdk-22*'                  
    '/opt/java/bellsoft-java22-amd64'           
    '/opt/java/temurin-22*'                     
    '/usr/local/java/bellsoft-java22-amd64'
	  '/usr/lib/jvm/openjdk22'     
)


OPENJAVA8_HOME_CANDIDATES=(
    '/usr/lib/jvm/jre-1.8.0-openjdk'
    '/usr/lib/jvm/java-1.8.0-openjdk-amd64'
    '/usr/lib/jvm/java-1.8.0-openjdk-ppc64el'
    '/usr/lib/jvm/java-1.8.0-openjdk'
    '/usr/lib64/jvm/java-1.8.0-openjdk-1.8.0'
)

MISCJAVA_HOME_CANDIDATES=(
    '/Library/Java/Home'
    '/usr/java/default'
    '/usr/lib/jvm/java'
    '/usr/lib/jvm/jre'
    '/usr/lib/jvm/default-java'
    '/usr/lib/jvm/java-openjdk'
    '/usr/lib/jvm/jre-openjdk'
    '/usr/lib/jvm/java-oracle'
)

# Detect JAVA_HOME based on the service name (ADH_SERVICE_NAME)
case ${ADH_SERVICE_NAME} in
  TRINO)
    # If TRINO_JAVA_HOME is defined in adcm_jvm_path, use it directly
    if [ -n "${TRINO_JAVA_HOME}" ]; then
      export JAVA_HOME=${TRINO_JAVA_HOME}
      echo "Using TRINO_JAVA_HOME: ${JAVA_HOME}"
    else
      # If TRINO_JAVA_HOME is not set, search through the Java 22 candidates
      JAVA_HOME_CANDIDATES=(${JAVA22_HOME_CANDIDATES[@]})
    fi
    ;;
  *)
    # Default case: search through all Java8 candidates (Java 8, OpenJDK, misc paths)
    JAVA_HOME_CANDIDATES=(${JAVA8_HOME_CANDIDATES[@]}
                         ${OPENJAVA8_HOME_CANDIDATES[@]}
                         ${MISCJAVA_HOME_CANDIDATES[@]}
                         ${JAVA17_HOME_CANDIDATES[@]})
    ;;
esac

# Attempt to find JAVA_HOME if not already set
required_java_version=$1
if [ -z "$required_java_version" ]; then
  required_java_version=17 # set default java version
fi
if [ -z "${JAVA_HOME}" ]; then
  for candidate_regex in "${JAVA_HOME_CANDIDATES[@]}"; do
    for candidate in `ls -rvd ${candidate_regex}* 2>/dev/null`; do
      if [ -e "${candidate}/bin/java" ]; then
        # Check agains the required version number if it was provided
        if ! "${candidate}"/bin/java -XshowSettings:properties --version 2>&1 | grep -E "java.version[^\.]" | awk '{print $3}' | grep -E "^${required_java_version}" > /dev/null; then
          continue
        fi
        export JAVA_HOME=${candidate}
        break 2
      fi
    done
  done
fi
