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

# -------------------------------------------------------------------
# P R O J E C T  P R O P E R T I E S
# -------------------------------------------------------------------

maven.changelog.factory=org.apache.maven.svnlib.SvnChangeLogFactory

maven.compile.debug = on
maven.compile.optimize = off
maven.compile.deprecation = on
maven.compile.target = 1.3
maven.compile.source = 1.3

# Jar Manifest Additional Attributes
maven.jar.manifest.attributes.list=Implementation-Vendor-Id,X-Compile-Source-JDK,X-Compile-Target-JDK
maven.jar.manifest.attribute.Implementation-Vendor-Id=org.apache
maven.jar.manifest.attribute.X-Compile-Source-JDK=${maven.compile.source}
maven.jar.manifest.attribute.X-Compile-Target-JDK=${maven.compile.target}

maven.javadoc.private = off
maven.javadoc.links=http://java.sun.com/j2se/1.3/docs/api/

maven.xdoc.date=bottom
maven.xdoc.poweredby.image=maven-feather.png
maven.xdoc.version=${pom.currentVersion}
maven.xdoc.developmentProcessUrl=http://jakarta.apache.org/commons/charter.html
maven.xdoc.includeProjectDocumentation=yes

#maven.linkcheck.enable = off
maven.repo.remote=http://repo1.maven.org/maven,http://people.apache.org/repository
maven.repo.apache.releases=scp://www.apache.org
maven.repo.apache.releases.directory=/www/www.apache.org/dist/java-repository
maven.repo.list=apache.snapshots
maven.repo.apache.snapshots=scp://people.apache.org
maven.repo.apache.snapshots.directory=/www/people.apache.org/repository
maven.junit.fork = true
maven.junit.sysproperties = test.basedir test.basedir.res test.ftp.uri test.smb.uri test.webdav.uri test.sftp.uri test.http.uri
maven.junit.jvmargs = -Xss8192k
maven.test.failure.ignore=true
maven.ant.excludeTests=**/*.java

test.hostname=172.16.110.129
test.user=vfsusr
test.password=vfs%2f%25\\te:st
test.path=/vfstest

test.data.src=${maven.src.dir}/../core/src/test/test-data
test.basedir=${maven.build.dir}/test-classes/test-data
test.basedir.res=test-data
test.policy=${maven.test.data.src}/test.policy
test.secure=false
test.smb.uri=smb://${test.user}:${test.password}@${test.hostname}/${test.user}${test.path}
test.ftp.uri=ftp://${test.user}:${test.password}@${test.hostname}${test.path}
test.http.uri=http://${test.hostname}${test.path}
test.webdav.uri=webdav://${test.user}:${test.password}@${test.hostname}${test.path}
test.sftp.uri=sftp://${test.user}:${test.password}@${test.hostname}${test.path}

maven.checkstyle.properties = ${basedir}/checkstyle.properties

maven.dist.src.assembly.dir=${maven.dist.assembly.dir}/src/${maven.final.name}-src
