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

# checkstyle settings
maven.checkstyle.properties = ${basedir}/../jdo_checks.xml

# dependencies
jdo.api.jarfile = ${pom.getDependencyPath('javax.jdo:jdo2-api')}
jdo.jdoutil.jarfile = ${pom.getDependencyPath('org.apache.jdo:jdo2-util')}
jdo.jdomodel.jarfile = ${pom.getDependencyPath('org.apache.jdo:jdo2-model')}
logging.jarfile = ${pom.getDependencyPath('commons-logging:commons-logging')}
xmlparser = 

# enhancer 
jdo.enhancer.enhanced.dir = ${maven.build.dir}/test-classes
jdo.enhancer.main = org.apache.jdo.enhancer.Main
jdo.enhancer.options = -f -d "${jdo.enhancer.enhanced.dir}" -s "${jdo.enhancer.sourcepath}"
jdo.enhancer.sourcepath = ${maven.build.dir}/test-classes${path.separator}${jdo.api.jarfile}
jdo.enhancer.classpath = ${maven.build.dir}/classes${path.separator}${jdo.jdoutil.jarfile}${path.separator}${jdo.jdomodel.jarfile}${path.separator}${jdo.api.jarfile}${path.separator}${logging.jarfile}
jdo.annotationtest.main = org.apache.jdo.impl.enhancer.util.AnnotationTest
jdo.annotationtest.options = -s "${jdo.enhancer.enhanced.dir}${path.separator}${jdo.enhancer.sourcepath}"
jdo.augmentationtest.main = org.apache.jdo.impl.enhancer.util.AugmentationTest
jdo.augmentationtest.options = -s "${jdo.enhancer.enhanced.dir}${path.separator}${jdo.enhancer.sourcepath}"
jdo.xmlexists.main = org.apache.jdo.impl.model.jdo.xml.XMLExists
jdo.xmlexists.classpath = ${maven.build.dir}/test-classes${path.separator}${path.separator}${jdo.jdoutil.jarfile}${path.separator}${jdo.jdomodel.jarfile}${path.separator}${jdo.api.jarfile}${path.separator}${logging.jarfile}

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