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

maven.repo.remote=\
http://repo1.maven.org/maven,\
http://download.java.net/maven/1

# Current version number
jdo.currentVersion = 3.0

# Make sure the compiled class still work with Java SE 5
maven.compile.source = 1.5
maven.compile.target = 1.5

# refer to LICENSE file in root directory
maven.license.licenseFile = ${basedir}/../LICENSE.txt

# checkstyle settings
maven.checkstyle.properties = ${basedir}/../jdo_checks.xml
maven.checkstyle.header.file = ${basedir}/../LICENSE.txt

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

# Set the javadoc title 
maven.javadoc.windowtitle = ${pom.name} ${pom.currentVersion}

# project lists
#   please note, the project lists must not include blanks
jdo3.projects=api/project.xml,tck/project.xml
jdo11.projects=api11/project.xml,btree/project.xml,ri11/project.xml,tck11/project.xml
jdo2.projects=api2/project.xml,util20/project.xml,model20/project.xml,enhancer20/project.xml,\
runtime20/project.xml,query20/project.xml,btree/project.xml,fostore20/project.xml,\
tck2/project.xml
tck2.projects=api2/project.xml,util20/project.xml,model20/project.xml,enhancer20/project.xml,tck2/project.xml
fostore20.projects=api2/project.xml,util20/project.xml,model20/project.xml,runtime20/project.xml,query20/project.xml,btree/project.xml,fostore20/project.xml,enhancer20/project.xml

# release properties
jdo.releases.dir = ${basedir.substring(0, basedir.lastIndexOf('jdo'))}jdo/releases
jdo.releases.dist.dir = ${jdo.releases.dir}/${pom.currentVersion}/dist
