#!/usr/bin/env bash
#
# vim:et:ft=sh:sts=2:sw=2
#
#/**
# * 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.
# */

BINDIR=`dirname "$0"`
BK_HOME=`cd ${BINDIR}/..;pwd`

source ${BK_HOME}/bin/common.sh

DLOG_MODULE_NAME="(org.apache.distributedlog-)?distributedlog-core"
DLOG_MODULE_PATH=stream/distributedlog/core
DLOG_MODULE_HOME=${BK_HOME}/${DLOG_MODULE_PATH}

# find the module jar
DLOG_JAR=$(find_module_jar ${DLOG_MODULE_PATH} ${DLOG_MODULE_NAME})

# set up the classpath
DLOG_CLASSPATH=$(set_module_classpath ${DLOG_MODULE_PATH})

# default variables
DEFAULT_CONF=${BK_HOME}/conf/bk_server.conf
DEFAULT_CLI_CONF=${BK_HOME}/conf/bk_server.conf
DEFAULT_LOG_CONF=${BK_HOME}/conf/log4j.properties
DEFAULT_CLI_LOG_CONF=${BK_HOME}/conf/log4j.cli.properties

dlog_help() {
    cat <<EOF
Usage: dlog <command>
where command is one of:
    local               Run distributedlog sandbox
    tool                Run distributedlog tool
    admin               Run distributedlog admin tool
    help                This help message

or command is the full name of a class with a defined main() method.

Environment variables:

    BOOKIE_CONF            Bookie configuration file (default: ${DEFAULT_CONF})
    BOOKIE_EXTRA_OPTS      Extra options to be passed to the bookie jvm
    BOOKIE_EXTRA_CLASSPATH Add extra paths to the bookie classpath
    CLI_CONF               CLI configuration file (default: ${DEFAULT_CLI_CONF})
    CLI_EXTRA_OPTS         Extra options to be passed to the CLI jvm
    CLI_EXTRA_CLASSPATH    Add extra paths to the CLI classpath

These variable can also be set in conf/bkenv.sh & conf/bk_cli_env.sh
EOF
}

# if no args specified, show usage
if [ $# = 0 ]; then
  dlog_help;
  exit 1;
fi

# get arguments
COMMAND=$1
shift

if [ ${COMMAND} == "local" ]; then
  DLOG_CONF=${BOOKIE_CONF:-"${DEFAULT_CONF}"}
  DLOG_LOG_CONF=${BOOKIE_LOG_CONF:-"${DEFAULT_LOG_CONF}"}
  DLOG_LOG_DIR=${BOOKIE_LOG_DIR:-"${BK_HOME}/logs"}
  DLOG_LOG_FILE=${BOOKIE_LOG_FILE:-"dlog.log"}
  DLOG_ROOT_LOGGER=${BOOKIE_ROOT_LOGGER:-"INFO,CONSOLE"}
  DLOG_EXTRA_CLASSPATH=${BOOKIE_EXTRA_CLASSPATH}
  DLOG_GC_OPTS=$(build_bookie_jvm_opts ${DLOG_LOG_DIR} "dlog_gc_%p.log")
  DLOG_EXTRA_OPTS=${BOOKIE_EXTRA_OPTS}
  DLOG_LOGGING_OPTS=$(build_logging_opts ${DLOG_LOG_CONF} ${DLOG_LOG_DIR} ${DLOG_LOG_FILE} ${DLOG_ROOT_LOGGER})
else
  DLOG_CONF=${CLI_CONF:-"${DEFAULT_CLI_CONF}"}
  DLOG_LOG_CONF=${CLI_LOG_CONF:-"${DEFAULT_CLI_LOG_CONF}"}
  DLOG_LOG_DIR=${CLI_LOG_DIR:-"${BK_HOME}/logs"}
  DLOG_LOG_FILE=${CLI_LOG_FILE:-"dlog-cli.log"}
  DLOG_ROOT_LOGGER=${CLI_ROOT_LOGGER:-"INFO,ROLLINGFILE"}
  DLOG_EXTRA_CLASSPATH=${CLI_EXTRA_CLASSPATH}
  DLOG_GC_OPTS=$(build_cli_jvm_opts ${DLOG_LOG_DIR} "dlog-cli-gc.log")
  DLOG_EXTRA_OPTS=${CLI_EXTRA_OPTS}
  DLOG_LOGGING_OPTS=$(build_cli_logging_opts ${DLOG_LOG_CONF} ${DLOG_LOG_DIR} ${DLOG_LOG_FILE} ${DLOG_ROOT_LOGGER})
fi

DLOG_CLASSPATH="$DLOG_JAR:$DLOG_CLASSPATH:$DLOG_EXTRA_CLASSPATH"
DLOG_CLASSPATH="`dirname $DLOG_LOG_CONF`:$DLOG_CLASSPATH"

# Build the OPTS
BOOKIE_OPTS=$(build_bookie_opts)
NETTY_OPTS=$(build_netty_opts)
OPTS="${OPTS} -cp ${DLOG_CLASSPATH} ${BOOKIE_OPTS} ${DLOG_GC_OPTS} ${NETTY_OPTS} ${DLOG_LOGGING_OPTS} ${DLOG_EXTRA_OPTS}"

if [ ! -d ${DLOG_LOG_DIR} ]; then
    mkdir ${DLOG_LOG_DIR}
fi

#Change to BK_HOME to support relative paths
cd "$BK_HOME"
case "${COMMAND}" in
  local)
    exec ${JAVA} ${OPTS} ${JMX_ARGS} -Dzookeeper.4lw.commands.whitelist='*' org.apache.distributedlog.LocalDLMEmulator $@
    ;;
  tool)
    exec ${JAVA} ${OPTS} org.apache.distributedlog.tools.Tool org.apache.distributedlog.tools.DistributedLogTool $@
    ;;
  admin)
    exec ${JAVA} ${OPTS} org.apache.distributedlog.tools.Tool org.apache.distributedlog.admin.DistributedLogAdmin $@
    ;;
  help)
    dlog_help
    ;;
  *)
    exec ${JAVA} ${OPTS} ${COMMAND} $@
    ;;
esac

