#  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.
#
#  Java and Windows do not mix too well, so you will have to put
#  four \'s for every \ in the path...
#
@appname@=JSPWiki
@pagedir@=C:\\\\temp\\\\wikipages
@logfile@=C:\\\\temp\\\\jspwiki.log
@securitylog@=C:\\\\temp\\\\security.log
@spamlog@=C:\\\\temp\\\\spamlog.log

@tests.pagedir@=C:\\\\temp\\\\testrepository
@tests.workdir@=C:\\\\temp\\\\testworkdir
@tests.logfile@=C:\\\\temp\\\\jspwikitests.log
@testcontainerlog@=tests\\\\build\\\\webtests\\\\testcontainer.log

@tests.auth.filename=C:\\\\temp\\\\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/lib/firefox/firefox-2-bin

# 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
