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

#
#  Property file for tests.
#
#
#  Which page provider class to use.  Possibilities are:
#
#    RCSFileProvider for simple RCS-based file storage
#    FileSystemProvider for simple pure file storage with no version information
#
jspwiki.pageProvider = org.apache.wiki.providers.FileSystemProvider

jspwiki.usePageCache = true
#
#  Determines where wiki files are kept.
#
jspwiki.fileSystemProvider.pageDir = @tests.pagedir@
jspwiki.workDir = @tests.workdir@

jspwiki.translatorReader.camelCaseLinks = true

jspwiki.breakTitleWithSpaces = true

jspwiki.translatorReader.matchEnglishPlurals = true
jspwiki.translatorReader.useOutlinkImage = false

jspwiki.attachmentProvider = BasicAttachmentProvider
jspwiki.basicAttachmentProvider.storageDir = @tests.pagedir@

jspwiki.encoding = ISO-8859-1

jspwiki.filterConfig = @tests.filter@

jspwiki.baseURL = http://localhost/
jspwiki.referenceStyle = relative
jspwiki.searchProvider = BasicSearchProvider
jspwiki.authorizer=org.apache.wiki.TestAuthorizer

#
#  Special page references.
#
#  The URL is relative to Wiki.jsp.  However, if you use
#  a full, absolute URL, you can also do that.
#
# Example to redirect all requests to a page called 'OriginalWiki'
# to the original wikiwiki at http://c2.com/cgi/wiki
#
# jspwiki.specialPage.OriginalWiki = http://c2.com/cgi/wiki
#
jspwiki.specialPage.RecentChanges = RecentChanges.jsp
jspwiki.specialPage.Search = Search.jsp

# InterWiki links The %s is replaced with the page reference (specify
# multiple times to get multiple references).  Page references should
# appear in format : [wiki:wikipage].  

jspwiki.interWikiRef.JSPWiki = http://www.ecyrd.com/JSPWiki/Wiki.jsp?page=%s

jspwiki.rss.generate = false

#
# Define which image types are inlined.
# These are your standard glob expressions (just like in your
# Windows or UNIX shells).
#

jspwiki.translatorReader.inlinePattern.1 = *.jpg
jspwiki.translatorReader.inlinePattern.2 = *.png
jspwiki.translatorReader.inlinePattern.3 = http://images.com/*

#
# Security: use standard providers for user/group auth, user management
# and ACLs. Use a test userdatabase for storing users.
#
jspwiki.aclManager          = org.apache.wiki.auth.acl.DefaultAclManager
#jspwiki.authorizer          = org.apache.wiki.auth.authorize.WebContainerAuthorizer
jspwiki.groupdatabase = org.apache.wiki.auth.authorize.XMLGroupDatabase
jspwiki.xmlGroupDatabaseFile = tests/etc/groupdatabase.xml
jspwiki.userdatabase        = org.apache.wiki.auth.user.XMLUserDatabase
jspwiki.xmlUserDatabaseFile = tests/etc/userdatabase.xml
jspwiki.admin.user = admin

jspwiki.userdatabase.datasource=jdbc/UserDatabase
jspwiki.userdatabase.table=users
jspwiki.userdatabase.uid=uid
jspwiki.userdatabase.email=email
jspwiki.userdatabase.fullName=full_name
jspwiki.userdatabase.loginName=login_name
jspwiki.userdatabase.password=password
jspwiki.userdatabase.wikiName=wiki_name
jspwiki.userdatabase.created=created
jspwiki.userdatabase.modified=modified
jspwiki.userdatabase.lockExpiry=lock_expiry
jspwiki.userdatabase.attributes=attributes
jspwiki.userdatabase.roleTable=roles
jspwiki.userdatabase.role=role
jspwiki.groupdatabase.datasource=jdbc/GroupDatabase
jspwiki.groupdatabase.table=groups
jspwiki.groupdatabase.membertable=group_members
jspwiki.groupdatabase.created=created
jspwiki.groupdatabase.creator=creator
jspwiki.groupdatabase.name=name
jspwiki.groupdatabase.member=member
jspwiki.groupdatabase.modified=modified
jspwiki.groupdatabase.modifier=modifier

#
#  Configure logs.
#
#  Send mail on alerts
#
#
#  Log only interesting stuff on screen.
#
#log4j.appender.console = org.apache.log4j.ConsoleAppender
#log4j.appender.console.Threshold = WARN
 
#log4j.appender.console.layout = org.apache.log4j.PatternLayout
#log4j.appender.console.layout.ConversionPattern = %-5p: %m%n

#
#  Log everything into a file.
log4j.rootCategory=INFO,FileLog
# log4j.logger.org.apache.wiki=INFO, FileLog
log4j.logger.org.mortbay=INFO, TestContainerLog
log4j.logger.SecurityLog=INFO, SecurityAppender

log4j.appender.FileLog = org.apache.log4j.RollingFileAppender
log4j.appender.FileLog.MaxFileSize    = 10MB
log4j.appender.FileLog.MaxBackupIndex = 14
log4j.appender.FileLog.File = @tests.logfile@
log4j.appender.FileLog.layout = org.apache.log4j.PatternLayout
log4j.appender.FileLog.layout.ConversionPattern=%d [%t] %p %c %x - %m%n

log4j.appender.SecurityAppender = org.apache.log4j.RollingFileAppender
log4j.appender.SecurityAppender.MaxFileSize    = 10MB
log4j.appender.SecurityAppender.MaxBackupIndex = 14
log4j.appender.SecurityAppender.File = @securitylog@
log4j.appender.SecurityAppender.layout = org.apache.log4j.PatternLayout
log4j.appender.SecurityAppender.layout.ConversionPattern=%d %p - %m%n

log4j.appender.TestContainerLog = org.apache.log4j.RollingFileAppender
log4j.appender.TestContainerLog.MaxFileSize    = 10MB
log4j.appender.TestContainerLog.MaxBackupIndex = 14
log4j.appender.TestContainerLog.layout = org.apache.log4j.PatternLayout
log4j.appender.TestContainerLog.layout.ConversionPattern=%d [%t] %p %c %x - %m%n
log4j.appender.TestContainerLog.File= @testcontainerlog@


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

# Workflow test properties
jspwiki.approver.workflow.saveWikiPage=
jspwiki.approver.workflow.foo=janne
jspwiki.approver.workflow.bar=Admin
