This is a prototype of the JDO maven projects:
- api11 to build the jdo.jar which defines the JDO API version 1.1
- ri11 the current JDO1 RI
- tck11 the current JDO1 TCK
- api20 to build the jdo.jar which defines the JDO API version 2.0
- core20 the JDO2 core including utility and metadata model classes
- enhancer20 the JDO2 byte code enhancer 
- runtime20 the JDO2 runtime classes (pm, pmf, state manager, life cycle, 
  store manager interface, runtime meta data support)
- query20 the JDO2 JDOQL query compiler and JDOQL query tree nodes
- fostore20 the JDO2 file object store (fostore) datastore
- tck20 the JDO 2.0 TCK
- btree the Netbeans open source btree implementation used by ri11 and fostore20

-------------
Dependencies:
-------------

The JDO maven project define their dependencies in the project.xml file:
JDO1: api11, btree, ri11, tck11
JDO2: api20, core20, enhancer20, tck20, btree, runtime20, query20, fostore20

-------------
Prerequisites
-------------

- Maven
You need Maven version 1.0.1 or 1.0.2. You can download maven from 
http://maven.apache.org/start/download.html

- JNDI implementation (fscontext.jar and providerutil.jar)
The JNDI test cases in ri11, fostore20 and tck20 need a JNDI implementation.
To configure this please check the property jndi in project.properties of ri11,
fostore20 and tck20. It lists all jars of your JNDI implementation in a 
path-like syntax. Furthermore, the three subprojects have a properties file 
test/conf/jndi.properties defining all the necessary properties of the JNDI 
implemenation. The default setting in project.properties and jndi.properties 
use Sun's File System Service Provider implementation (fscontext.jar and 
providerutil.jar) and assume to find both jars in the directory trunk/lib/ext. 
For donwload please 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. The tck20 subproject 
automatically downloads the latest JPOX snapshot.

- 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/test/conf/derby.properties.

-------
Remarks
-------

(1) Please note, maven uses the user.home system property for the location
of the maven local repostitory: ${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 I set the 
system property by adding -Duser.home=%HOME% to the environment variable 
MAVEN_OPTS.

(2) The btree subproject checks out the Netbeans mdr btree implementation.
This requires cvs being installed on your system. The official netbeans cvs 
host might not work if you are behind a firewall that blocks the cvs port. 
Please consult http://www.netbeans.org/community/sources for more info. 
There is a special cvsroot if you are inside the Sun network (SWAN), please 
check the project.properties in the btree subproject.

If you do not have a cvs client installed on your system, you find a zip file 
including the Netbeans mdr btree implementation on the JDO wiki. Go to the 
bottom of page http://wiki.apache.org/jdo/SubversionRepository.

(3) Remarks about ri11:
- Calling 'maven build' in ri11 compiles the JDO RI sources and test classes 
and then runs the JUnit tests. 
- The maven goal runtest ('maven runtest') executes the full JDO RI test suite.
This includes running all the JUnit tests w/O and w/ security manager, plus 
some extra tests that require running more than one JVM. 
- If you prefer the JUnit gui please call 'maven -Dgui=true runtests'. This 
first starts a gui for running the JUnit tests w/o security manager. After 
you exit the gui it automatically starts a new gui running the JUnit tests
w/ security manager.

(4) Remarks about tck11:
Calling 'maven build' in tck11 compiles all the JDOTCK tests, runs the JDORI 
enhancer and then runs all the tests using the JDORI. 
To run the JDOTCK against an JDO implementation you should do the following:
- Place the jars of your JDO implementation in the directory iut_jars. All the 
jars in this directory are automatically added to the classpath.
- Check the property iut.runtck.properties in project.properties. It should 
refer to a file defining the PMF properties for your implementation. 
- Please add any system properties to the property iut.runtck.sysproperties in 
project.properties, e.g.
iut.runtck.sysproperties = -DMySystemProperty1=value -DMySystemProperty2=value
- If the JDO implementation comes with its own enhancer, please update the 
properties iut.enhancer.main, iut.enhancer.options, iut.enhancer.args, and 
iut.enhancer.sysproperties.
- Check the properties iut.applicationidentity.supported and 
iut.datastoreidentity.supported in project.properties and update them according 
to the JDO implementation to be tested.
- You run the TCK by calling 'maven runtck'. This first enhances the 
persistence-capable and persistence-aware classes for applicationidentity and 
for datastore identity. This uses the properties described in the previous item
in order to decide which kind of identitytype is supported. After enhancement 
'maven runtck' runs the JDO TCK test classes using the test configuration file
as specified by the property jdo.tck.configuration. You find the property in
project.properties.
- A test configuration is a file defining two properties:
jdo.tck.identitytype: either datastoreidentity or applicationidentity
jdo.tck.testclasses: a list of fully qualified class names of the test classes 
to be executed.
The first property is important to include the enhanced classes for this 
identitytype into the classpath. Today there is no checking whether the property
value is correct. There is a predefined property jdo.tck.alltests including all 
JDO TCK test classes. Please see the files datastoreidentity.conf and 
applicationidentity.conf in test/conf as an example.
- You can run the JUnit gui (instead of the batch mode) by setting the property
gui to true: 'maven -Dgui=true runtck'.

(5) Remarks about tck20:
This version of the TCK is under development.  It is premature to attempt to
run an implementation against it.  Currently only tests that use the persistence
capable classes in org.apache.jdo.tck.pc.mylib run without error.

- See Prerequisites concerning JPOX and Derby.

- Run "maven build" to build the tck.  This will compile, enhance, install the schemas, and run all the tests on all supported databases and identitytypes.

You may use the following custom goals and command line options
with tck20/maven:

Custom Goals:
    * 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

Command Line Options:
    -Djdo.tck.cfglist=<configuration file list>
          Overrides test/conf/configuration.list by supplying
          one or more space-separated test configuration files

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


Maven looks for the following configuration files in test/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
          [Not yet fully implemented]

For example, run "maven runtck.jdori" to run all tests or
"maven -Djdo.tck.cfg=<configuration file name> runtck.jdori"
to run one configuration.

(6) Logging
Apache JDO uses the apache commons logging package for logging.
Sub-projects ri11 and tck11 use several properties files to configure logging.
- common-logging.properties: specifies the logging implementation to use.
  It is tested with apache SimpleLog and JDK 1.4 logging.
- logging.properties: logger configuration when using JDK 1.4 logging.
- simplelog.properties: logger configuration when using apache SimpleLog.

(7) 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.

(8) 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 directoy including a maven project (e.g. api11) 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.
