#   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://commons.apache.org/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
