# ***************************************************************************************************************************
# * 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 = $S{user.dir}/target/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}
