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

# local build.properties
#
# $Id$
#

# compile switches
compile.debug= true
compile.optimize= false
compile.deprecation= true
compile.encoding= utf-8
compile.source=1.5
compile.target=1.5

# project identification
project.name=VelocityTools
project.version=2.0-beta3
project.libname=velocity-tools
project.id=${project.libname}-${project.version}

struts.name=VelocityTools
struts.libname=${project.libname}
struts.description=a set of utilities for use with the Velocity template engine and Struts web framework
struts.id=${struts.libname}-${project.version}

view.name=VelocityView
view.libname=${project.libname}-view
view.description=a set of utilities for use with the Velocity template engine
view.id=${view.libname}-${project.version}

generic.name=Velocity GenericTools
generic.libname=${project.libname}-generic
generic.description=a set of non-J2EE utilities for use with the Velocity template engine
generic.id=${generic.libname}-${project.version}

# source directories
source.home=${basedir}/src
examples.home=${basedir}/examples
conf.home=${source.home}/conf
classes.src=${source.home}/main/java
macros.src=${source.home}/velocity
docs.src=${basedir}/xdocs

# build directories
build.dir=${basedir}/build
mvn.build.dir=${basedir}/target
classes.dir=${build.dir}/classes
lib.dir=${basedir}/lib
dist.dir=${basedir}/dist
docs.dir=${basedir}/docs
release.dir=${dist.dir}/release/${project.id}

# distribution properties
publish.server=people.apache.org
publish.dir=~/public_html/velocity/tools/${project.version}
publish.docs.dir=/www/velocity.apache.org/tools/

# javadoc properties
javadoc.dir=${docs.dir}/javadoc
javadoc.title=${project.name} ${project.version} Documentation
javadoc.year=2003-2007
javadocs.ref.jsdk= http://java.sun.com/j2se/1.5.0/docs/api/

# test directories
test.dir=${basedir}/test
test.conf.dir=${test.dir}/conf
test.lib.dir=${test.dir}/lib
test.src.dir=${source.home}/test/java
test.build.dir=${build.dir}/test
test.build.src.dir=${test.build.dir}/src
test.classes.dir=${test.build.dir}/classes
test.rst.dir=${test.build.dir}/rst
test.log.dir=${test.build.dir}/log

# Needs to be configured with system location of findbugs for findbugs task
findbugs.home=*unset*

# Needs to be configured with system location of PMD for pmd task
pmd.home=*unset*

#test switches
test.haltonerror=true
test.haltonfailure=true
test.compile.source=1.5
test.compile.target=1.5

#test webcontainer parameters
test.webcontainer.port=8081
test.webcontainer.control.port=8082


# #######################################################################
#
# Downloading jars from ibiblio repository
#
# #######################################################################

# Settings for the proxy to use for download. Change this if you must
# use a proxy from your host. If the proxy.host property is unset, no
# proxy is used.
#
proxy.host=
proxy.port= 80

# We download directly from the ibiblio maven repository
#
#repo.m1.url=http://www.ibiblio.org/maven
repo.m1.url=http://mirrors.ibiblio.org/pub/mirrors/maven2
repo.m2.url=http://www.ibiblio.org/maven2

# Skip or force downloading of dependencies
skip.jar.loading= false
force.jar.loading= false

# Jars to be downloaded for compilation
#
jar.antlr.version= 2.7.2
jar.commons-beanutils.version= 1.7.0
jar.commons-chain.version= 1.1
jar.commons-collections.version= 3.2
jar.commons-digester.version= 1.8
jar.commons-lang.version= 2.2
jar.commons-logging.version= 1.1
jar.commons-validator.version= 1.3.1
jar.dom4j.version= 1.1
jar.oro.version= 2.0.8
jar.servletapi.version= 2.3
jar.sslext.version = 1.2-0
jar.struts-core.version = 1.3.8
jar.struts-taglib.version = 1.3.8
jar.struts-tiles.version = 1.3.8
jar.velocity.version= 1.5

# Jars to be downloaded for building documentation
#
jar.velocity-dvsl.version= 1.0

# Jars needed for testing
#
jar.httpunit.version=1.6.1
jar.jetty.version=6.0.1
jar.js.version = 1.6R5
jar.nekohtml.version=0.9.5
jar.xercesimpl.version=2.8.1
jar.xmlparserapis.version=2.6.2
jar.junit.version=4.1
jar.maven.ant.version=2.0.9

########################################################################
# Maven Ant Task settings
maven.pom=${basedir}/pom.xml
maven.build.dir= ${mvn.build.dir}
wagon-ssh.version=1.0-beta-2
# POM distributionManagement is used if this is not set
#maven.remote.repository=

# Full paths to the jars for building the examples
antlr.jar=${lib.dir}/antlr-${jar.antlr.version}.jar
commons-beanutils.jar=${lib.dir}/commons-beanutils-${jar.commons-beanutils.version}.jar
commons-chain.jar=${lib.dir}/commons-chain-${jar.commons-chain.version}.jar
commons-collections.jar=${lib.dir}/commons-collections-${jar.commons-collections.version}.jar
commons-digester.jar=${lib.dir}/commons-digester-${jar.commons-digester.version}.jar
commons-lang.jar=${lib.dir}/commons-lang-${jar.commons-lang.version}.jar
commons-logging.jar=${lib.dir}/commons-logging-${jar.commons-logging.version}.jar
commons-validator.jar=${lib.dir}/commons-validator-${jar.commons-validator.version}.jar
dom4j.jar=${lib.dir}/dom4j-${jar.dom4j.version}.jar
servlet.jar=${lib.dir}/servletapi-${jar.servletapi.version}.jar
struts-core.jar=${lib.dir}/struts-core-${jar.struts-core.version}.jar
struts-taglib.jar=${lib.dir}/struts-taglib-${jar.struts-taglib.version}.jar
struts-tiles.jar=${lib.dir}/struts-tiles-${jar.struts-tiles.version}.jar
sslext.jar=${lib.dir}/sslext-${jar.sslext.version}.jar
oro.jar=${lib.dir}/oro-${jar.oro.version}.jar
velocity.jar=${lib.dir}/velocity-${jar.velocity.version}.jar
