This is the official release of the JDO 2 project. It includes
the JDO 2.0 TCK and its dependencies:

- api20 contains source to build jdo.jar, which defines the JDO API version 2.0
- core20 contains the JDO2 core, including utility and metadata model classes
- enhancer20 contains the utility classes used for verifying enhanced files
- tck20 contains the JDO 2.0 Technology Compatibility Kit

-------------
Prerequisites
-------------

- Maven
You must have Maven version 1.0.1 or 1.0.2 to build the projects from source
and to execute the TCK. You can download maven from 
http://maven.apache.org/start/download.html

Note that maven uses the user.home system property for the location
of the maven local repository: ${user.home}/.maven/repository.
Under Windows this system property is C:\Documents and Settings\<user> 
no matter what the HOME variable is set to. As a workaround you may set the 
system property by adding -Duser.home=%HOME% to the environment variable 
MAVEN_OPTS.

- JNDI implementation (fscontext.jar and providerutil.jar)
The JNDI test cases in tck20 need a JNDI implementation.
The TCK is configured to use Sun's JNDI implementation.
To use your own implementation, put the implementation
jar files into lib/ext and update jndi.properties in the TCK directory
src/conf.  To download Sun's implementation, go to 
http://java.sun.com/products/jndi/downloads/index.html,
click the Download button at 'Download JNDI 1.2.1 & More', accept a license 
agreement, download 'File System Service Provider, 1.2 Beta 3' and then unpack
the downloaded zip. It includes the jars fscontext.jar and providerutil.jar.

- JPOX
The Reference Implementation for JDO 2.0 is JPOX 1.1.0. The tck20 subproject 
automatically downloads the JPOX jar files via maven configuration.

- derby
The default datastore for tck20 is derby. The tck20 subproject 
automatically downloads version 10.1.1.0 of derby and derbytools.
NOTE!! Mac OSX users must uncomment derby.storage.fileSyncTransactionLog=true 
in tck20/src/conf/derby.properties. For details, please see the Derby JIRA 
issue DERBY-1 at http://issues.apache.org/jira/browse/DERBY-1

-------
Notes
-------

- Logging
Apache JDO uses the apache commons logging package for logging.

- Checkstyle
The file jdo_check.xml includes the checkstyle configuration. It is borrowed
from the sun_checks.xml, but does not use all of the sun rules and customizes 
some other rules. The checkstyle configuration is not yet finished.

- Mevenide
Mevenide is a nice maven plugin for IDEs (see http://mevenide.codehaus.org).
You find download instructions in http://mevenide.codehaus.org/download.html.
For Netbeans, once you installed the plugin, you should be able to open an 
existing maven project by File -> Open Project -> Open Project Folder.
Navigate to a directory including a maven project (e.g. api20) and choose this 
directory. Netbeans will create a project folder. If you right-click the Maven 
project you can examine the contents of the project.xml (see Properties) or 
execute goals.

-------
Running the TCK
-------

This version of the TCK is final.  

In the tck20 project, run "maven build" to build the tck.  This will 
compile, enhance, install the schemas, and run all the tests on the RI on all 
supported databases and identitytypes.

You may use the following custom goals and command line options
with the tck20 project:

Custom Goals:
    * help - displays help text describing custom goals and options
    * runtck.jdori - runs the TCK on the JDO Reference Implementation
    * runtck.iut - runs the TCK on the implementation under test
    * installSchema - installs the database schema
    * enhance.jdori - enhances the class files using the JDO RI enhancer
    * enhance.iut - enhances the class files using the
                    implementation under test's enhancer
    * debugtck.jdori - waits for a debugger to attach and then runs the TCK
                     on the JDO RI
    * debugtck.iut - waits for a debugger to attach and then runs the TCK
                     on the implementation under test


Command Line Options:
    -Djdo.tck.cfglist=<configuration file list>
          Overrides the definition of jdo.tck.cfglist found in
          tck20/src/conf/configuration.list by supplying
          one or more space-separated test configuration files.
          Test configuration files typically have the .conf extension.
          To run a single test, create a .conf file (copy an existing
          file) and put the test into the jdo.tck.classes property.

      -Djdo.tck.dblist=<database list>
          Overrides the property value in project.properties by supplying
          one or more space-separated database names

      -Djdo.tck.identitytypes=<identity type list>
            Overrides the property value in project.properties by supplying
            one or more space-separated identity types (applicationidentity
            or datastoreidentity) to use for this run.

      -Djdo.tck.cleanupaftertest=xxx - true/false. Setting it to false will
            retain data in database after test. This will allow inspection of
            data after test is run. Default is true

      -Djdo.tck.debug.port=##### - the port number the JVM should listen for
            a debugger on (default 8787)

      -Djdo.tck.debug.jvmargs=xxx - the "-Xdebug ..." arguments in the event
            you want to supply your own debug directives


Maven looks for the following configuration files in src/conf:
    * configurations.list
          A list of files. Each file listed is a test configuration file.
    * test configuration files
          Each of these files sets values for
                jdo.tck.testdescription - an optional string describing
                    the purpose of these tests
                jdo.tck.classes - a list of one or more test classes.
                jdo.tck.testdata - fully qualified file name
                    (not required by all tests)
                jdo.tck.standarddata - fully qualified file name
                    (not required by all tests)
                jdo.tck.mapping - file designator that maven.xml uses
                    to build a javax.jdo.option.Mapping value and
                    corresponding schema name
    * exclude.list
          A list of test classes NOT to execute during a TCK test run

Examples:
   maven -Djdo.tck.identitytypes=datastoreidentity installSchema
       Installs the database schema for datastore identity for all
       supported databases

   maven -Djdo.tck.cfglist="alltests.conf cfg1.conf" runtck.jdori
       Runs the test configurations specified in alltests.conf and cfg1.conf
       on the JDORI, using all supported identity types and databases.

   maven -Djdo.tck.cfglist=detach.conf debugtck.jdori
       Runs the test detach.conf configuration, waiting for a debugger to
       attach on the default port

   maven -Djdo.tck.cfglist=detach.conf -Djdo.tck.debug.port=9343 debugtck.jdori
       Runs the test detach.conf configuration, waiting for a debugger to
       attach on port 9343

Note:
   By default, the database schema is NOT installed when the custom goals
     runtck.iut and runtck.jdori are run.
   maven build installs the database schema and runs the TCK on the
     JDO Reference Implementation.
   Enhancement is always done before running the TCK when the enhanced classes
     are not up to date.

