#
# 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.compile.source = 1.5
maven.compile.target = 1.5

# Manifest seed file
maven.jar.manifest = ${basedir}/../JDO3.MF

# exclude list - tests listed here will not be executed
jdo.tck.excludelist = ${basedir}/src/conf/exclude.list

# Maven repository
maven.repo.remote =\
http://repo1.maven.org/maven,\
http://www.datanucleus.org/downloads/maven,\
http://www.datanucleus.org/downloads/maven-nightly,\
http://download.java.net/maven/1
maven.checkstyle.properties = ${basedir}/../jdo_checks.xml

# iut properties file
iut.pmf.properties = iut-pmf.properties

# The IUT enhancer, defaults to RI enhancer
iut.enhanced.dir = ${maven.build.dir}/enhanced/iut

# JUnit settings
jdo.tck.testrunnerclass = org.apache.jdo.tck.util.BatchTestRunner

# Databasesettings
database.runtck.sysproperties = -Dderby.system.home="${jdo.tck.testdir}/database/${jdo.tck.database}"

# JDO TCK settings
# Setting this property to false will turn off cleanup of data from database to inspect database contents after test run
jdo.tck.cleanupaftertest = true
jdo.tck.dblist=derby
jdo.tck.identitytypes=applicationidentity datastoreidentity
jdo.tck.testclasses.dir = ${maven.build.dir}/classes
jdo.tck.testdir = ${maven.build.dir}
jdo.tck.resultprinterclass = org.apache.jdo.tck.util.BatchResultPrinter
jdo.tck.log.directory = ${maven.build.dir}/logs
jdo.tck.log.directory.database = ${jdo.tck.log.directory}/database
jdo.tck.log.directory.enhancer = ${jdo.tck.log.directory}/enhancer
jdo.tck.signaturefile = ${basedir}/src/conf/jdo-3_0-signatures.txt
jdori.pmf.properties = jdori-pmf.properties
jdori.runtck.sysproperties = -Xmx512m

# dependencies
jdo.api.jarfile = ${pom.getDependencyPath('javax.jdo:jdo-api')}
datanucleus.jdori.jarfile = ${pom.getDependencyPath('org.datanucleus:datanucleus-core')}
datanucleus.enhancer.jarfile = ${pom.getDependencyPath('org.datanucleus:datanucleus-enhancer')}
datanucleus.rdbms.jarfile = ${pom.getDependencyPath('org.datanucleus:datanucleus-rdbms')}
datanucleus.jpa.jarfile = ${pom.getDependencyPath('org.datanucleus:datanucleus-jpa')}
asm.jarfile = ${pom.getDependencyPath('asm:asm')}
junit.jarfile = ${pom.getDependencyPath('junit:junit')}
jta.jarfile = ${pom.getDependencyPath('javax.transaction:transaction-api')}
springcore.jarfile = ${pom.getDependencyPath('org.springframework:spring-core')}
springbeans.jarfile = ${pom.getDependencyPath('org.springframework:spring-beans')}
logging.commons.jarfile = ${pom.getDependencyPath('commons-logging:commons-logging')}
logging.log4j.jarfile = ${pom.getDependencyPath('log4j')}
derby.jarfile = ${pom.getDependencyPath('org.apache.derby:derby')}
derbytools.jarfile = ${pom.getDependencyPath('org.apache.derby:derbytools')}
jpa.jarfile = ${pom.getDependencyPath('org.apache.geronimo.specs:geronimo-jpa_2.0_spec')}
xmlparser =

# JDORI enhancer
jdori.enhanced.dir = ${maven.build.dir}/enhanced/jdori
jdori.enhancer.main = javax.jdo.Enhancer
jdori.enhancer.options = -r -v -d "${enhanced.dir}"
jdori.enhancer.args = ${jdo.tck.jdometadata.files}

# connection pooling dependencies
datanucleus.connectionpool.jarfile = ${pom.getDependencyPath('org.datanucleus:datanucleus-connectionpool')}
c3p0.jarfile = ${pom.getDependencyPath('c3p0')}
dbcp.jarfile = ${pom.getDependencyPath('commons-dbcp')}
pool.jarfile = ${pom.getDependencyPath('commons-pool')}
collections.jarfile = ${pom.getDependencyPath('commons-collections')}

# datanucleus dependencies


# includes PA class sources and PC class sources
jdo.tck.pcclasses.sources = \
    org/apache/jdo/tck/api/**/*.java \
    org/apache/jdo/tck/pc/**/*.java \
    org/apache/jdo/tck/models/inheritance/*.java

# includes PA classes and PC classes
jdo.tck.pcclasses.files = \
    org/apache/jdo/tck/api/**/*.class \
    org/apache/jdo/tck/pc/**/*.class \
    org/apache/jdo/tck/models/inheritance/*.class

jdo.tck.jdometadata.files = \
    package.jdo \
    org/apache/jdo/tck/ \
    org/apache/jdo/tck/api/instancecallbacks/ \
    org/apache/jdo/tck/pc/
