@REM
@REM Licensed to the Apache Software Foundation (ASF) under one
@REM or more contributor license agreements.  See the NOTICE file
@REM distributed with this work for additional information
@REM regarding copyright ownership.  The ASF licenses this file
@REM to you under the Apache License, Version 2.0 (the
@REM "License"); you may not use this file except in compliance
@REM with the License.  You may obtain a copy of the License at
@REM
@REM   http://www.apache.org/licenses/LICENSE-2.0
@REM
@REM Unless required by applicable law or agreed to in writing,
@REM software distributed under the License is distributed on an
@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@REM KIND, either express or implied.  See the License for the
@REM specific language governing permissions and limitations
@REM under the License.
@REM

@echo off

if "%JAVA_HOME%" == "" (
  for %%i in (java.exe) do set "JAVACMD=%%~$PATH:i"
) else (
  set "JAVACMD=%JAVA_HOME%\bin\java.exe"
)

if not exist "%JAVACMD%" (
  echo The JAVA_HOME environment variable is not defined correctly, so Pulsar CLI cannot be started. >&2
  echo JAVA_HOME is set to "%JAVA_HOME%", but "%JAVACMD%" does not exist. >&2
  exit /B 1
)

for %%i in ("%~dp0.") do SET "SCRIPT_PATH=%%~fi"
set "PULSAR_HOME_DIR=%SCRIPT_PATH%\..\"
for %%i in ("%PULSAR_HOME_DIR%.") do SET "PULSAR_HOME=%%~fi"
set "PULSAR_CLASSPATH=%PULSAR_CLASSPATH%;%PULSAR_HOME%\lib\*"


if "%PULSAR_CLIENT_CONF%" == "" set "PULSAR_CLIENT_CONF=%PULSAR_HOME%\conf\client.conf"
if "%PULSAR_LOG_CONF%" == "" set "PULSAR_LOG_CONF=%PULSAR_HOME%\conf\log4j2.yaml"

set "PULSAR_LOG_CONF_DIR1=%PULSAR_LOG_CONF%\..\"
for %%i in ("%PULSAR_LOG_CONF_DIR1%.") do SET "PULSAR_LOG_CONF_DIR=%%~fi"
for %%a in ("%PULSAR_LOG_CONF%") do SET "PULSAR_LOG_CONF_BASENAME=%%~nxa"

set "PULSAR_CLASSPATH=%PULSAR_CLASSPATH%;%PULSAR_LOG_CONF_DIR%"
if not "%PULSAR_EXTRA_CLASSPATH%" == "" set "PULSAR_CLASSPATH=%PULSAR_CLASSPATH%;%PULSAR_EXTRA_CLASSPATH%"


if "%PULSAR_PERFTEST_CONF%" == "" set "PULSAR_PERFTEST_CONF=%PULSAR_CLIENT_CONF%"


set "OPTS=%OPTS% -Dlog4j.configurationFile="%PULSAR_LOG_CONF_BASENAME%""
set "OPTS=%OPTS% -Djava.net.preferIPv4Stack=true"


set "OPTS=-cp "%PULSAR_CLASSPATH%" %OPTS%"
set "OPTS=%OPTS% %PULSAR_EXTRA_OPTS%"

if "%PULSAR_LOG_DIR%" == "" set "PULSAR_LOG_DIR=%PULSAR_HOME%\logs"
if "%PULSAR_LOG_FILE%" == "" set "PULSAR_LOG_FILE=pulsar-perftest.log"
if "%PULSAR_LOG_APPENDER%" == "" set "PULSAR_LOG_APPENDER=Console"
if "%PULSAR_LOG_LEVEL%" == "" set "PULSAR_LOG_LEVEL=info"
if "%PULSAR_LOG_ROOT_LEVEL%" == "" set "PULSAR_LOG_ROOT_LEVEL=%PULSAR_LOG_LEVEL%"


set "OPTS=%OPTS% -Dpulsar.log.appender=%PULSAR_LOG_APPENDER%"
set "OPTS=%OPTS% -Dpulsar.log.dir=%PULSAR_LOG_DIR%"
set "OPTS=%OPTS% -Dpulsar.log.level=%PULSAR_LOG_LEVEL%"
set "OPTS=%OPTS% -Dpulsar.log.root.level=%PULSAR_LOG_ROOT_LEVEL%"

set "COMMAND=%1"

for /f "tokens=1,* delims= " %%a in ("%*") do set "_args=%%b"

if "%COMMAND%" == "produce" (
  call :execCmdWithConfigFile org.apache.pulsar.testclient.PerformanceProducer
  exit /B %ERROR_CODE%
)
if "%COMMAND%" == "consume" (
  call :execCmdWithConfigFile org.apache.pulsar.testclient.PerformanceConsumer
  exit /B %ERROR_CODE%
)
if "%COMMAND%" == "transaction" (
  call :execCmdWithConfigFile org.apache.pulsar.testclient.PerformanceTransaction
  exit /B %ERROR_CODE%
)
if "%COMMAND%" == "read" (
  call :execCmdWithConfigFile org.apache.pulsar.testclient.PerformanceReader
  exit /B %ERROR_CODE%
)
if "%COMMAND%" == "monitor-brokers" (
  call :execCmd org.apache.pulsar.testclient.BrokerMonitor
  exit /B %ERROR_CODE%
)
if "%COMMAND%" == "simulation-client" (
  call :execCmd org.apache.pulsar.testclient.LoadSimulationClient
  exit /B %ERROR_CODE%
)
if "%COMMAND%" == "simulation-controller" (
  call :execCmd org.apache.pulsar.testclient.LoadSimulationController
  exit /B %ERROR_CODE%
)
if "%COMMAND%" == "websocket-producer" (
  call :execCmd org.apache.pulsar.proxy.socket.client.PerformanceClient
  exit /B %ERROR_CODE%
)
if "%COMMAND%" == "managed-ledger" (
  call :execCmd org.apache.pulsar.testclient.ManagedLedgerWriter
  exit /B %ERROR_CODE%
)
if "%COMMAND%" == "gen-doc" (
  call :execCmd  org.apache.pulsar.testclient.CmdGenerateDocumentation
  exit /B %ERROR_CODE%
)

call :usage
exit /B %ERROR_CODE%

:execCmdWithConfigFile
"%JAVACMD%" %OPTS% %1 --conf-file "%PULSAR_PERFTEST_CONF%" %_args%
if ERRORLEVEL 1 (
  call :error
)
goto :eof

:execCmd
"%JAVACMD%" %OPTS% %1 %_args%
if ERRORLEVEL 1 (
  call :error
)
goto :eof



:error
set ERROR_CODE=1
goto :eof




:usage
echo Usage: pulsar-perf COMMAND
echo where command is one of:
echo     produce                 Run a producer
echo     consume                 Run a consumer
echo     transaction             Run a transaction repeatedly
echo     read                    Run a topic reader
echo     websocket-producer      Run a websocket producer
echo     managed-ledger          Write directly on managed-ledgers
echo     monitor-brokers         Continuously receive broker data and/or load reports
echo     simulation-client       Run a simulation server acting as a Pulsar client
echo     simulation-controller   Run a simulation controller to give commands to servers
echo     gen-doc                 Generate documentation automatically.
echo     help                    This help message
echo or command is the full name of a class with a defined main() method.
echo Environment variables:
echo     PULSAR_LOG_CONF               Log4j configuration file (default %PULSAR_HOME%\logs)
echo     PULSAR_CLIENT_CONF            Configuration file for client (default: %PULSAR_HOME%\conf\client.conf)
echo     PULSAR_EXTRA_OPTS             Extra options to be passed to the jvm
echo     PULSAR_EXTRA_CLASSPATH        Add extra paths to the pulsar classpath
goto error
