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

#
# Remove the ASF snapshot repository when IO 1.3 is released
#
maven.repo.remote=http://repo1.maven.org/maven,http://people.apache.org/repo/m1-snapshot-repository

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

maven.changes.issue.template=%URL%/browse/%ISSUE% 

compile.debug = on
compile.optimize = off
compile.deprecation = off

maven.compile.source=1.3
maven.compile.target=1.3

# Jar Manifest and Additional Attributes
maven.jar.manifest=${basedir}/src/conf/MANIFEST.MF
maven.jar.manifest.attributes.list=Specification-Version,X-Compile-Source-JDK,X-Compile-Target-JDK
maven.jar.manifest.attribute.Specification-Version=${pom.currentVersion}
maven.jar.manifest.attribute.X-Compile-Source-JDK=${maven.compile.source}
maven.jar.manifest.attribute.X-Compile-Target-JDK=${maven.compile.target}

maven.checkstyle.properties = ${basedir}/src/checkstyle/fileupload_checks.xml

maven.pmd.rulesetfiles=src/checkstyle/fileupload_basic.xml,rulesets/unusedcode.xml,rulesets/imports.xml

maven.javadoc.additionalparam=-tag todo:a:"To Do:"
maven.linkcheck.enable=true

maven.changelog.type=date
#maven.changelog.date=lastRelease
maven.changelog.date=2006-06-08

# documentation properties
maven.xdoc.date=left
maven.xdoc.version=${pom.currentVersion}
maven.xdoc.developmentProcessUrl=http://jakarta.apache.org/commons/charter.html
maven.xdoc.poweredby.image=maven-feather.png

