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

set -e

BASEDIR=$(dirname "$0")
DLOG_ROOT="${BASEDIR}/.."
DLOG_HOME="${DLOG_ROOT}"

usage() {
  cat <<EOF
Usage: runner <command>
where command is one of:
  local               Run distributedlog sandbox
  example             Run distributedlog example
  tool                Run distributedlog tool
  proxy_tool          Run distributedlog proxy tool to interact with proxies
  balancer            Run distributedlog balancer
  admin               Run distributedlog admin tool
  zkshell             Run zookeeper shell
  bkshell             Run bookkeeper shell
  help                This help message

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

Environment variables:
  DLOG_LOG_CONF        Log4j configuration file (default $DEFAULT_LOG_CONF)
  DLOG_EXTRA_OPTS      Extra options to be passed to the jvm
  DLOG_EXTRA_CLASSPATH Add extra paths to the dlog classpath

These variable can also be set in conf/dlogenv.sh
EOF
}

source "${DLOG_ROOT}"/../scripts/common.sh

# get arguments
COMMAND=$1
shift

case "${COMMAND}" in
  local)
    exec java $OPTS $JMX_ARGS org.apache.distributedlog.LocalDLMEmulator $@
    ;;
  tool)
    exec java $OPTS org.apache.distributedlog.tools.Tool org.apache.distributedlog.tools.DistributedLogTool $@
    ;;
  proxy_tool)
    exec java $OPTS org.apache.distributedlog.tools.Tool org.apache.distributedlog.service.tools.ProxyTool $@
    ;;
  balancer)
    exec java $OPTS org.apache.distributedlog.tools.Tool org.apache.distributedlog.service.balancer.BalancerTool $@
    ;;
  admin)
    exec java $OPTS org.apache.distributedlog.tools.Tool org.apache.distributedlog.admin.DistributedLogAdmin $@
    ;;
  zkshell)
    exec java $OPTS org.apache.zookeeper.ZooKeeperMain -server $@
    ;;
  bkshell)
    ENTRY_FORMATTER_ARG="-DentryFormatterClass=${ENTRY_FORMATTER_CLASS:-org.apache.bookkeeper.util.StringEntryFormatter}"
    exec java $OPTS $ENTRY_FORMATTER_ARG org.apache.bookkeeper.bookie.BookieShell -conf $BOOKIE_CONF $@
    ;;
  help)
    usage
    ;;
  *)
    exec java $OPTS $COMMAND $@
    ;;
esac


