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

##############
# Properties used by forrest.build.xml for building the website
##############

project.name=forrest

#project.skin=Don't specify a skin for Forrest, we will always use the 
#             default one defined in main/webapp/default-forrest.properties
project.content-dir=.
project.xdocs-dir=${project.content-dir}/content/xdocs
project.raw-content-dir=${project.content-dir}/content
project.configfile=${project.home}/conf/cli.xconf
project.urifile=${project.home}/conf/uris.txt
project.skinconf=${project.content-dir}/skinconf.xml

project.bugtracking-url=http://issues.apache.org/jira/browse/
project.issues-rss-url=https://issues.apache.org/jira/secure/IssueNavigator.jspa?view=rss&pid=12310000&fixfor=12310092&resolutionIds=-1&sorter/field=priority&sorter/order=DESC&tempMax=25&reset=true&decorator=none

# The URL to start crawling from
#project.start-uri=linkmap.html

# The names of plugins that are required to build the project
# comma separated list (no spaces)
# Run "forrest available-plugins" for a list of plug-ins currently available
project.required.plugins=org.apache.forrest.plugin.input.dtdx,org.apache.forrest.plugin.input.projectInfo,org.apache.forrest.plugin.output.POD,org.apache.forrest.plugin.output.pdf,org.apache.forrest.plugin.output.Text,org.apache.forrest.plugin.input.glossary

# Max memory to allocate to Java
# FIXME: See issue FOR-572
forrest.maxmemory=128m

forrest.validate=true
