# ***************************************************************************************************************************
# * 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.                                              *
# ***************************************************************************************************************************

#=======================================================================================================================
# REST settings
#=======================================================================================================================
[REST]

# Comma-delimited list of key-value pairs that represent locations of static files that can be served up by your @RestResource-annotated
# classes.  These are static files that are served up by the servlet under the specified sub-paths.
# For example, given the following setting...
# 	staticFiles = htdocs:my-docs,styles/my-styles
# ...the URI "/servletPath/htdocs/javadoc.css" resolves to the path "/my-docs/javadoc.css".
# This path can be relative to the working directory, classpath root, or package of your resource class.
# Used by the BasicRestConfig interface that defines the following value:
# 	staticFiles="$C{REST/staticFiles}"
staticFiles = htdocs:htdocs

# Stylesheet to use for HTML views.
# Used by the BasicRestConfig interface that defines the following value:
# 	stylesheet="$C{REST/theme,servlet:/htdocs/themes/devops.css}"
theme = servlet:/htdocs/themes/devops.css

# Various look-and-feel settings used in the BasicRestConfig interface.
headerIcon = servlet:/htdocs/images/juneau.png
headerLink = http://juneau.apache.org
footerIcon = servlet:/htdocs/images/asf.png
footerLink = http://www.apache.org
favicon = $C{REST/headerIcon}
head = <link rel='icon' href='$U{$C{REST/favicon}}'/>
header = 
	<a href='$U{$C{REST/headerLink}}'>
		<img src='$U{$C{REST/headerIcon}}' style='position:absolute;top:5;right:5;background-color:transparent;height:30px'/>
	</a>
footer = 
	<a href='$U{$C{REST/footerLink}}'>
		<img style='float:right;padding-right:20px;height:32px' src='$U{$C{REST/footerIcon}}'>
	</a>

#=======================================================================================================================
# SqlQueryResource properties
#=======================================================================================================================
[SqlQueryResource]
driver = org.apache.derby.jdbc.EmbeddedDriver
directory = target/derby/testDB
connectionUrl = jdbc:derby:$C{SqlQueryResource/directory};create=true
allowTempUpdates = true
includeRowNums = false

#=======================================================================================================================
# Source code location
#=======================================================================================================================
[Source]
gitHub = https://github.com/apache/juneau-petstore/blob/master/juneau-petstore-server/src/main/java/

#=======================================================================================================================
# PetStoreResource properties
#=======================================================================================================================
[PetStore]
headerImage = <a href='http://swagger.io'><img src='$U{servlet:/htdocs/cat.png}' style='position:absolute;top:5;right:5;background-color:transparent;height:30px'/></a>
