#!/bin/sh

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

#===========================================================================================
# Java 环境设置
#===========================================================================================
error_exit ()
{
    echo "ERROR: $1 !!"
    exit 1
}


check_java_version ()
{
  _java=$1
  _version=$2
  version=$("$_java" -version 2>&1 | awk -F '"' '/version/ {print $2}' | grep -o '^[0-9]\+\.\+[0-9]\+')
  flag="true"
  if [[ $(echo "$version < $_version" | bc) -eq 1 ]]; then
      flag="false"
  fi

  if [[ $("$_java" -version 2>&1) != *"64-Bit"* ]]; then
      flag="false"
  fi

  echo $flag
}

check_java_opts ()
{
  export IFS=" "
  flag="true"
  count=0
  for opt in $1; do
    if [[ $opt == *"-Xms"* ]]; then
        xms=`echo $opt | tr -d -c 0-9`
        if [[ $xms -lt 4 ]]; then
            flag="false"
        fi
        (( count++ ))
    fi
    if [[ $opt == *"-Xmx"* ]]; then
        xmx=`echo $opt | tr -d -c 0-9`
        if [[ $xmx -lt 4 ]]; then
            flag="false"
        fi
        (( count++ ))
    fi
  done
  if [[ $count -lt 2 ]]; then
      flag="false"
  fi
  echo $flag
}

[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=$HOME/jdk/java
[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/usr/java
[ ! -e "$JAVA_HOME/bin/java" ] && error_exit "Please set the JAVA_HOME variable in your environment, We need java(x64)!"

export JAVA_HOME
export JAVA="$JAVA_HOME/bin/java"
export BASE_DIR=$(dirname $0)/..
export CLASSPATH=.:${BASE_DIR}/conf:${CLASSPATH}
export LANG=en_US.UTF-8


#===========================================================================================
# JVM Parameters Configuration
#===========================================================================================

JAVA_OPT="${JAVA_OPT} -server -Xms8g -Xmx8g -XX:PermSize=128m -XX:MaxPermSize=320m"
JAVA_OPT="${JAVA_OPT} -XX:+UseG1GC -XX:G1HeapRegionSize=16m -XX:G1ReservePercent=25 -XX:InitiatingHeapOccupancyPercent=30 -XX:SoftRefLRUPolicyMSPerMB=0 -XX:SurvivorRatio=8 -XX:+DisableExplicitGC"
JAVA_OPT="${JAVA_OPT} -verbose:gc"
JAVA_OPT="${JAVA_OPT} -XX:-OmitStackTraceInFastThrow"
JAVA_OPT="${JAVA_OPT} -XX:+AlwaysPreTouch"
JAVA_OPT="${JAVA_OPT} -XX:MaxDirectMemorySize=10g"
JAVA_OPT="${JAVA_OPT} -XX:-UseLargePages -XX:-UseBiasedLocking"
if [[ $(check_java_version "$JAVA" "9") == "false" ]]; then
  JAVA_OPT="${JAVA_OPT} -Xloggc:/dev/shm/mq_gc_%p.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCApplicationStoppedTime -XX:+PrintAdaptiveSizePolicy"
  JAVA_OPT="${JAVA_OPT} -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=30m"
  JAVA_OPT="${JAVA_OPT} -Djava.ext.dirs=${BASE_DIR}/lib:${JAVA_HOME}/jre/lib/ext"
  JAVA_OPT="${JAVA_OPT} -cp ${CLASSPATH}"
else
  if [ "$(uname)" == "Darwin" ]; then
    JAVA_OPT="${JAVA_OPT} -Xlog:gc:/tmp/mq_gc_$$.log -Xlog:gc*"
    JAVA_OPT="${JAVA_OPT} -cp $(find "${BASE_DIR}/lib" -name '*.jar' | tr "\n" ":"):${CLASSPATH}"
  else
    JAVA_OPT="${JAVA_OPT} -Xlog:gc:/dev/shm/mq_gc_%p.log -Xlog:gc*"
    JAVA_OPT="${JAVA_OPT} -cp $(find "${BASE_DIR}/lib" -name '*.jar' | sed ':a;N;s/\n/:/;ba;'):${CLASSPATH}"
  fi
fi
JAVA_OPT="${JAVA_OPT} -DisSyncFlush=false"

#===========================================================================================
# Log Configuration for auth module.
#===========================================================================================
JAVA_OPT="${JAVA_OPT} -Dons.api.loggingCharset=UTF-8"
JAVA_OPT="${JAVA_OPT} -Dons.api.loggingLevel=INFO"

#===========================================================================================
# SSL Configuration
#===========================================================================================
JAVA_OPT="${JAVA_OPT} -Dtls.server.mode=disabled"
JAVA_OPT="${JAVA_OPT} -Dtls.private.key.encrypted=false"
JAVA_OPT="${JAVA_OPT} -Djdk.tls.rejectClientInitiatedRenegotiation=true"

if [[ $(check_java_opts "$JAVA_OPT") == "false" ]]; then
    error_exit "Too small heap mem size or Xms/Xms/Xmn are missing, we need Xms >= 4g, Xmx >= 4g and Xmn >= 2g."
fi

if [[ $(check_java_version "$JAVA" "1.7") == "false" ]]; then
    error_exit "Java version is too low, we need java(x64) 1.7+!"
fi

numactl --interleave=all pwd > /dev/null 2>&1
if [ $? -eq 0 ]
then
    exec numactl --interleave=all $JAVA ${JAVA_OPT} $@
else
    exec $JAVA ${JAVA_OPT} $@
fi
