# build.type should be set to an appropriate value for Milestone Builds {ie. "M4") and be blank for Release Builds
release.version=2.5.2
#These are "default" values. They should already be set by the time this file is loaded
# ie. do NOT depend upon the fact that they will be at runtime as they are defined here.
# ---------------------------------------------------------------
junit.lib=${basedir}/junit.jar
build.root.dir=${basedir}
log.dir=${basedir}/log

# Dependency definitions
# ----------------------
jdbc.driver.lib=${jdbc.driver.lib.dir}/mysql-connector-java-5.1.17-bin.jar
jdbc.driver.lib.dir=/shared/common/mysql-connector-java-5.1.17

# Orbit drop used:  http://download.eclipse.org/tools/orbit/downloads/drops/R20100519200754/
#    The following shell command run from the build server will result in the latest
#    Orbit release "R" build:
#        ls -r /home/data/httpd/download.eclipse.org/tools/orbit/downloads/drops/ | grep -m1 R20
#
# "junit.lib" property is defined in "init" target of autobuild.xml
junit.drop=R200709171314
junit.bundle=org.junit_3.8.2.v200706111738
activation.bundle=javax.activation_1.1.0.v200706111329
mail.bundle=javax.mail_1.4.0.v200706111329
maven.ant.bundle=maven-ant-tasks-2.0.8
bndtool.prefix=bnd
bndtool.separator=-
bndtool.criteria=[0.0.350,0.1.0)


extensions.depend.dir=${build.deps.dir}

# URLs to Download Build dependencies
junit.url=http://download.eclipse.org/tools/orbit/downloads/drops/${junit.drop}/bundles/${junit.bundle}.zip
activation.url=http://download.eclipse.org/tools/orbit/downloads/drops/${junit.drop}/bundles/${activation.bundle}.jar
mail.url=http://download.eclipse.org/tools/orbit/downloads/drops/${junit.drop}/bundles/${mail.bundle}.jar
mavenant.url=http://archive.apache.org/dist/maven/binaries/${maven.ant.bundle}.jar

# Logfile definitions
# -------------------
core.test.regression.log=${log.dir}/core.test.regression.log
result.file=${log.dir}/jpa.results

#Automated Build Artifact Definitions
# -----------------------------------
core.test.properties=${basedir}/core.test.properties

#Automated Testing and Test Result Definitions
# --------------------------------------------
# set this to a non existant directory so the tests do not include the struct converter tests
eclipselink.extension.oracle.test=.
eclipselink.extension.oracle.test.trunk=.

# db.user, db.pwd and db.url need to be defined in ${env.HOME_DIR}/db.dat
# db.url left in here for documentation purposes
jdbc.driver.jar=${jdbc.driver.lib}
db.driver=com.mysql.jdbc.Driver
db.url=jdbc:mysql://localhost/eclipselink
db.user=
db.pwd=
db.platform=org.eclipse.persistence.platform.database.MySQLPlatform

# logging level for SRG/LRG testing
# ---------------------------------
test.logging.level=FINEST
#test.logging.level=NONE

# Publishing and Signing Definitions
# ----------------------------------
eclipselink.root.download.dir=/home/data/httpd/download.eclipse.org/rt/eclipselink
signing.dir=/opt/public/download-staging.priv/rt/eclipselink

p2.milestone.repos.name=EclipseLink Milestone Repository
p2.release.repos.name=EclipseLink Release Repository
p2.nightly.repos.name=EclipseLink Nightly Build Repository

