#  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

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

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

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

# Optionally enable remote debugging when running the JUnit tests.
# Uncomment one of the following lines only, the property must be present even if empty.
# Note that setting suspend=y might cause the JVM to stop several times when running the
# tests, as the build forks a new JVM at several points.
# This is most useful together with the junit.test.include.* properties below
#junit.test.jvmargs=-Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n
junit.test.jvmargs=

# Define which JUnit tests to run - useful to run a subset of tests
junit.test.include.1=**/*TestCase.class
junit.test.include.2=**/*Test.class

# ---- 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.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
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=src/gump/module.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
