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


# 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'
    '/usr/lib/jvm/java-arenadata-openjdk-8'
)

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/java-arenadata-openjdk-17'   
    '/usr/lib64/jvm/java-17*'
)

JAVA21_HOME_CANDIDATES=(
    '/usr/lib/jvm/java-21*'
    '/usr/lib/jvm/jdk-21*'
    '/usr/lib/jvm/java-arenadata-openjdk-21'
)

JAVA23_HOME_CANDIDATES=(
    '/usr/lib/jvm/bellsoft-java23-amd64'
    '/usr/lib/jvm/bellsoft-java23'             
    '/usr/lib/jvm/liberica-jdk-23*'             
    '/usr/lib/jvm/liberica-jre-23*'            
    '/usr/lib/jvm/zulu-23*'                     
    '/usr/lib/jvm/temurin-23*'                  
    '/usr/lib/jvm/adoptopenjdk-23*'              
    '/usr/lib/jvm/jdk-23*'                      
    '/usr/lib/jvm/java-23-openjdk'              
    '/usr/lib/jvm/openjdk-23*'                  
    '/opt/java/bellsoft-java23-amd64'           
    '/opt/java/temurin-23*'                     
    '/usr/local/java/bellsoft-java23-amd64'
    '/usr/lib/jvm/java-arenadata-openjdk-23'
)


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 23 candidates
      JAVA_HOME_CANDIDATES=(${JAVA23_HOME_CANDIDATES[@]})
    fi
    ;;
  FLINK2)
    # If FLINK2_JAVA_HOME is defined, use it directly
    if [ -n "${FLINK2_JAVA_HOME}" ]; then
      export JAVA_HOME=${FLINK2_JAVA_HOME}
      echo "Using FLINK2_JAVA_HOME: ${JAVA_HOME}"
    else
      # If FLINK2_JAVA_HOME is not set, search through the Java 17 candidates
      JAVA_HOME_CANDIDATES=(${JAVA17_HOME_CANDIDATES[@]})
    fi
    ;;
  OZONE)
    # If OZONE_JAVA_HOME is defined in adcm_jvm_path, use it directly
    if [ -n "${OZONE_JAVA_HOME}" ]; then
      export JAVA_HOME=${OZONE_JAVA_HOME}
      echo "Using OZONE_JAVA_HOME: ${JAVA_HOME}"
    else
      # If OZONE_JAVA_HOME is not set, search through the Java 21 candidates
      JAVA_HOME_CANDIDATES=(${JAVA21_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[@]})
    ;;
esac

# Attempt to find JAVA_HOME if not already set
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
          export JAVA_HOME="${candidate}"
          break 2
        fi
      done
  done
fi
