# ***************************************************************************************************************************
# * 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.                                              *
# ***************************************************************************************************************************

#================================================================================
# Basic configuration file for SaaS microservices
# Subprojects can use this as a starting point.
#================================================================================

#================================================================================
# REST settings
#================================================================================
[REST]

resources = org.apache.juneau.rest.test.Root

# Ports to try.
# 0 means try a random port.
# 3 0's means try 3 random ports.
port = 10001, 0, 0, 0

# Authentication:  NONE, BASIC.
authType = NONE

# What to do when the config file is saved.
# Possible values:
# 	NOTHING - Don't do anything. 
#	RESTART_SERVER - Restart the Jetty server.
#	RESTART_SERVICE - Shutdown and exit with code '3'.
saveConfigAction = RESTART_SERVER

useSsl = false

#================================================================================
# Bean properties on the org.eclipse.jetty.util.ssl.SslSocketFactory class
#--------------------------------------------------------------------------------
# Specify any of the following fields:
# 	allowRenegotiate (boolean)
# 	certAlias (String)
# 	crlPath (String)
# 	enableCRLDP (boolean)
# 	enableOCSP (boolean)
# 	excludeCipherSuites (String[]) 
# 	excludeProtocols (String[])
# 	includeCipherSuites (String[])
# 	includeProtocols (String...)
# 	keyManagerPassword (String)
# 	keyStore (String)
# 	keyStorePassword (String)
# 	keyStorePath (String)
# 	keyStoreProvider (String)
# 	keyStoreType (String)
# 	maxCertPathLength (int)
# 	needClientAuth (boolean)
# 	ocspResponderURL (String)
# 	protocol (String)
# 	provider (String)
# 	secureRandomAlgorithm (String)
# 	sessionCachingEnabled (boolean) 
# 	sslKeyManagerFactoryAlgorithm (String)
# 	sslSessionCacheSize (int)
# 	sslSessionTimeout (int)
# 	trustAll (boolean)
# 	trustManagerFactoryAlgorithm (String)
# 	trustStore (String)
# 	trustStorePassword (String)
# 	trustStoreProvider (String)
# 	trustStoreType (String)
# 	validateCerts (boolean)
# 	validatePeerCerts (boolean)
# 	wantClientAuth (boolean)			
#================================================================================
[REST-SslContextFactory]
keyStorePath = client_keystore.jks
keyStorePassword* = {HRAaRQoT}
excludeCipherSuites = TLS_DHE.*, TLS_EDH.*
excludeProtocols = SSLv3
allowRenegotiate = false

#================================================================================
# Logger settings
# See FileHandler Java class for details.
#================================================================================
[Logging]
logDir = logs
logFile = test.%g.log
dateFormat = yyyy.MM.dd hh:mm:ss
format = [{date} {level}] {msg}%n
append = false
limit = 10M
count = 5
levels = { com.foo.team:'INFO' }
useStackTraceHashes = true
consoleLevel = WARNING

[Test]
int1 = 1
int2 = 1,2,3
int3 = $C{Test/int1, -1}
int4 = $C{Test/int3, -1}
int5 = $C{XXX, -1}
boolean1 = true
boolean2 = true,true
path = $E{PATH}
testManifestEntry = $MF{Test-Entry}
