#  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 = RCSFileProvider

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

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

#
# 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.groupManager        = org.apache.wiki.auth.authorize.DefaultGroupManager
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.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.rootCategory=DEBUG,FileLog

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.logger.SecurityLog=INFO, SecurityAppender
