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

# Path to java executable
${wrapper.java.command}


wrapper.java.mainclass=org.apache.directory.server.wrapper.ApacheDsTanukiWrapper
wrapper.max_failed_invocations=1

wrapper.java.classpath.1=../lib/*.jar

# Java Library Path (location of Wrapper.DLL or libwrapper.so)
wrapper.java.library.path.1=../lib

# Java Additional Parameters
wrapper.java.additional.1=-Dlog4j.configuration=${double.quote}file:///%INSTANCE_DIRECTORY%/conf/log4j.properties${double.quote}
wrapper.java.additional.2=-Dapacheds.var.dir=${double.quote}%INSTANCE_DIRECTORY%${double.quote}
wrapper.java.additional.3=-Dapacheds.log.dir=${double.quote}%INSTANCE_DIRECTORY%/log${double.quote}
wrapper.java.additional.4=-Dapacheds.run.dir=${double.quote}%INSTANCE_DIRECTORY%/run${double.quote}
wrapper.java.additional.5=-Dapacheds.instance=${double.quote}%INSTANCE%${double.quote}

# Initial Java Heap Size (in MB)
#wrapper.java.initmemory=1024

# Maximum Java Heap Size (in MB)
#wrapper.java.maxmemory=2048

# Application parameters.  Add parameters as needed starting from 1
wrapper.app.parameter.1=${double.quote}%INSTANCE_DIRECTORY%${double.quote}

#********************************************************************
# Wrapper Logging Properties
#********************************************************************
# Format of output for the console.  (See docs for formats)
wrapper.console.format=PM

# Log Level for console output.  (See docs for log levels)
wrapper.console.loglevel=INFO

# Log file to use for wrapper output logging.
wrapper.logfile=%INSTANCE_DIRECTORY%/log/wrapper.log

# Format of output for the log file.  (See docs for formats)
wrapper.logfile.format=LPTM

# Log Level for log file output.  (See docs for log levels)
wrapper.logfile.loglevel=INFO

# Maximum size that the log file will be allowed to grow to before
#  the log is rolled. Size is specified in bytes.  The default value
#  of 0, disables log rolling.  May abbreviate with the 'k' (kb) or
#  'm' (mb) suffix.  For example: 10m = 10 megabytes.
wrapper.logfile.maxsize=1m

# Maximum number of rolled log files which will be allowed before old
#  files are deleted.  The default value of 0 implies no limit.
wrapper.logfile.maxfiles=5

# Log Level for sys/event log output.  (See docs for log levels)
wrapper.syslog.loglevel=NONE

# Number of seconds to allow between the time that the Wrapper 
#  launches the JVM process and the time that the JVM side of the 
#  Wrapper responds that the application has started.
wrapper.startup.timeout=120

# Number of seconds to allow between the Wrapper pinging the JVM and 
#  the response from the JVM.
wrapper.ping.timeout=240

#********************************************************************
# Wrapper Windows NT/2000/XP Service Properties
#********************************************************************
# WARNING - Do not modify any of these properties when an application
#  using this configuration file has been installed as a service.
#  Please uninstall the service before modifying this section.  The
#  service can then be reinstalled.

# Title to use when running as a console
wrapper.console.title=apacheds-%INSTANCE%

# Name of the service
wrapper.ntservice.name=apacheds-%INSTANCE%

# Display name of the service
wrapper.ntservice.displayname=ApacheDS - %INSTANCE%

# Description of the service
wrapper.ntservice.description=ApacheDS %INSTANCE% server instance

# Service dependencies.  Add dependencies as needed starting from 1
#wrapper.ntservice.dependency.1=

# Mode in which the service is installed.  AUTO_START or DEMAND_START
wrapper.ntservice.starttype=AUTO_START

# Allow the service to interact with the desktop.
wrapper.ntservice.interactive=false