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

#
#  This file contains defaults for development.  If you are cross-
#  developing in multiple environments, just change the defaults
#  in this file.
#
#  Any changes in this file will be reflected in the default
#  jspwiki.properties-file when it is run.
#
@appname@=JSPWiki
@logfile@=/tmp/jspwiki.log
@securitylog@=/tmp/security.log
@spamlog@=/tmp/spamlog.log

@tests.pagedir@=/tmp/testrepository
@tests.workdir@=/tmp/testworkdir
@tests.logfile@=/tmp/jspwikitests.log
@testcontainerlog@=tests/build/webtests/testcontainer.log

@tests.auth.filename=/tmp/testrepository/auth.txt
@tests.filter@=tests/etc/filters.xml

# JavaMail configuration
@mail.smtp.host@=127.0.0.1
@mail.smtp.port@=25
@mail.from@=JSPWiki <JSPWiki@localhost>
#@mail.smtp.account@=foo
#@mail.smtp.password@=foopassword

#  Enable these if you wish to create a static content tarball
#  for use with Apache or another front-end web server.
#  You should specify user and group names that make sense for
#  your environment.

static.user = apache
static.group = daemon
jks.password = jspwiki

#
#  JDBC testing properties
#
jdbc.driver.id=hsql
jdbc.driver.jar=tests/lib/hsqldb-1.8.0.10.jar
jdbc.driver.class=org.hsqldb.jdbcDriver
jdbc.driver.url=jdbc:hsqldb:hsql://localhost/jspwiki
jdbc.admin.id=SA
jdbc.admin.password=
jdbc.user.id=jspwiki
jdbc.user.password=password

#
#  Running webtests
#

#  Which browser to use?
#webtests.browser=*safari
#  if you run firefox, and it is not in your PATH, you can specify this :
#webtests.browser=*firefox /usr/bin/firefox
webtests.browser=*firefox /usr/lib/firefox/firefox

# For generating API diffs (you must have DependencyFinder installed)
#dependencyfinder.dir=../lib/DependencyFinder
#jarfile.old=../JSPWiki-2.6.3-src/build/JSPWiki.jar
#jspwiki.test.skip=whatever
