#  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.
#
#----------------------------------------------
#  Cocoon Build Properties
#----------------------------------------------

# NOTE: don't modify this file directly but copy the properties you need
# to modify over to a file named 'local.build.properties' and modify that. 
# The build system will override these properties with the ones in the 
# 'local.build.properties' file.

# ---- Webapp ------------------------------------------------------------------

#exclude.webapp.samples=true
exclude.webapp.test-suite=true

# ---- Build Exclusions --------------------------------------------------------

exclude.deprecated=true
exclude.javadocs=true
# Include Java source code into the binary jar files
#include.sources-in-jars=true
# Include Java source code into separate, source only jar files
#include.sources-jars=true

# ---- Configuration -----------------------------------------------------------

#include.driver.oracle=true
#include.driver.postgre=true
#include.driver.odbc=true
#config.allow-reloads=true
#config.enable-uploads=true
#config.enable-instrumentation=true

# ---- Validation --------------------------------------------------------------

#exclude.validate.config=true
#exclude.validate.jars=true

# ---- Anteater ----------------------------------------------------------------

anteater.home = /default-from-build.properties/anteater-0.9.16
anteater.target.host = localhost
anteater.target.port = 8888
anteater.target.base.path = /
anteater.option.haltonerror = true

# disable some long-running tests by default
# anteater.test.bug26186InternalRequestMemoryLeak.enabled = true

# ---- htmlUnit ----------------------------------------------------------------

# htmlunit can be downloaded from http://htmlunit.sourceforge.net/
# Tests currently require htmlunit 1.13, please change this 
# comment and the default value below if moving to another version

htmlunit.home = /default-from-build.properties/htmlunit-1.13
htmlunit.test.baseurl=http://localhost:8888/

# for serious leak testing increase iteration count to 10000
htmlunit.test.Bug26186InternalRequestMemoryLeak.iterations=1

# This can be changed to run only a subset of the tests
# The mask is used in ant <fileset>/<include> elements
htmlunit.test.include=**/*TestCase.class

# ---- JUnit -------------------------------------------------------------------

junit.test.debugport=8000
#junit.testcase=org.apache.cocoon.util.test.NetUtilsTestCase
junit.test.loglevel=0

# ---- IDE ---------------------------------------------------------------------

ide.eclipse.outputdir=${build.root}/eclipse/classes
ide.eclipse.export.libs=false

# ---- Build -------------------------------------------------------------------

build.root=build
build=${build.root}/${name}-${version}
build.dest=${build}/classes
build.mocks=${build}/mocks
build.test=${build}/test
build.test.output=${build.test}/output
build.test.report=${build.test}/report
build.test.htmlunit=${build.test}/htmlunit
build.test.htmlunit.output=${build.test.htmlunit}/output
build.test.htmlunit.report=${build.test.htmlunit}/report
build.javadocs=${build}/javadocs
build.context=${build}/documentation
build.blocks=${build}/blocks
build.deprecated=${build}/deprecated
build.samples=${build}/samples
build.temp=${build}/temp
build.mounttable=../../mount-table.xml

# ---- Webapp Build Properties -------------------------------------------------

build.webapp=${build.root}/webapp
build.webapp.webinf=${build.webapp}/WEB-INF
build.webapp.classes=${build.webapp.webinf}/classes
build.webapp.lib=${build.webapp.webinf}/lib
build.webapp.samples=${build.webapp}/samples
build.webapp.test-suite=${build.webapp}/test-suite
build.webapp.loglevel=INFO
build.webapp.logappend=false
# Change the sample's hsqldb server port to run multiple Cocoons on a single machine
#build.webapp.hsqldb-server-port=9003
build.war=${build}/${name}.war

# ---- Standalone-demo Build Properties ----------------------------------------

build.standalone.demo=${build.root}/standalone-demo

# ---- Compilation -------------------------------------------------------------

compiler=modern
compiler.debug=on
compiler.optimize=on
compiler.deprecation=off
compiler.nowarn=on
source.vm=1.4

# ---- System Properties -------------------------------------------------------

# WARNING: you shouldn't need to modify anything below here since there is a
# very high change of breaking the build system. Do it only if you know what
# you're doing.

packages=org.apache

# Project descriptor
gump.descriptor=gump.xml

# Directory Layout
src=src
java=${src}/java
mocks=${src}/mocks
test=${src}/test
resources=${src}/resources
resources.styles=${resources}/styles
resources.logos=${resources}/logos
resources.javadoc=${resources}/javadoc
blocks=${src}${file.separator}blocks
samples=${src}/samples
webapp=${src}/webapp
webapp.samples=${webapp}/samples
webapp.test-suite=${webapp}/test-suite
customconf=${src}/confpatch

# Deprecated Stuff
deprecated=${src}/deprecated
deprecated.src=${deprecated}/java
deprecated.conf=${deprecated}/conf

# Tools
tools=tools
tools.lib=${tools}/lib
tools.src=${tools}/src
tools.tasks.src=${tools.src}/anttasks
tools.tasks.dest=${tools}/anttasks
tools.loader.src=${tools.src}/loader
tools.loader.dest=${tools}/loader
tools.jetty=${tools}/jetty

# Libraries
lib=lib
lib.core=${lib}/core
lib.endorsed=${lib}/endorsed
lib.optional=${lib}/optional
lib.local=${lib}/local

# Distribution Directories
dist.root=dist
dist=${dist.root}/${name}-${version}
dist.name=${name}-${version}
dist.target=${dist.root}

# Site Directory
site=../cocoon-site/site/2.1

# Legal
legal=legal
