This file lists all 3rd party libraries (and their versions!!!) that
are required to build or run the project.

If you're a developer editing this file, please keep all listings in alphabetical order for
convenient lookup.

Some notes:

- Each 3rd party library is stored in a directory named after the
  open-source project or company that created it.  This makes for
  easy organization of lots of libs.

- Jar files stored _do not_ have version numbers
  actually in their file name.  If the jar originally comes as such,
  it is renamed with the version number stripped off.  The version
  number is instead maintained in this file.  The reason for this is
  so that every time we need to upgrade any 3rd party library,
  we don't have to edit any build.xml or properies files to reflect
  a potential name change due to a version number - you just note
  that change once in this file and overwrite the old jar, checking
  in that overwrite to CVS in the process.

- Each 3rd party lib is listed here along with what it is
  used for and if its needed for build-time, run-time or both.

- Thanks to the gents working on the Spring Framework (http://www.springframework.org)
  that provided the template and the idea for this file.

* atunit/atunut.jar
- AtUnit 1.0
- Used in unit tests

* easymock/easymock.jar, easymockclassextension.jar
- EasyMock 2.2 w/ ClassExtension 2.2 (http://www.easymock.org)
- Used in test cases for creating dynamic mock objects

* ehcache/ehcache.jar
- ehcache 1.3.0 (http://ehcache.sourceforge.net/)
- Required for compiling, using ehcache cache manager, and for runtime session management

* google-collections/google-collect.jar
- Google Collections Snapshot 20071022
- Used in test cases for conveniently constructing collections

* hsqldb/hsqldb.jar
- HSQLDB 1.8.0.7 (http://www.hsqldb.org)
- Used in the sample application to show an example of a JDBC-based Realm.

* j2ee/jsp-api.jar
- JSP API 2.0 (http://java.sun.com/products/jsp)
- Required for building the RI tag libraries

* j2ee/servlet-api.jar
- Servlet API 2.4 (http://java.sun.com/products/servlet)
- required for building web support classes (Servlet Filters, etc)

* jakarta-commons/commons-logging.jar
- Commons Logging 1.0.4 (http://jakarta.apache.org/commons/logging)
- required by the RI during build and runtime for logging support

* jakarta-commons/commons-beanutils-core.jar
- Commons BeanUtils 1.7.0 (http://jakarta.apache.org/commons/beanutils/index.html)
- required for building and running JSecurity
- used for constructing Permissions in the Reference Implementation's PermissionAnnotationAuthorizationModule

* jboss/jboss-aop.jar
- JBoss AOP jar from the JBoss 4.0.4.GA Application Server release
- Required at build time for JBoss integration support classes.

* jug/jug.jar, jug/jug-native.zip
- Java Uuid Genrator (JUG) v. 2.0.0 (LGPL jar) (http://jug.safehaus.org/)
- used as a fallback UUID generator for memory-based session management if below Java 1.5

* junit/junit.jar
- JUnit Test Framework 4.1 (http://www.junit.org)
- Required for building and running test cases

* log4j/log4j.jar
- Log4J 1.2.9 (http://logging.apache.org/log4j)
- required by the RI during build and runtime for logging support

* quartz/quartz.jar
- Quartz 1.5.2 (http://www.opensymphony.com/quartz)
- required during build and runtime for Quartz-based session validation support

* retroweaver/retroweaver.jar,retroweaver-rt.jar
- Retroweaver 2.0 (http://retroweaver.sourceforge.net)
- required for retroweaving to support JDK 1.3 and 1.4
- rt jar is required at runtime if running in 1.3 or 1.4

* spring/spring.jar
- Spring Application Framework 2.0.2 (http://springframework.org)
- required to build Spring integration support and sample apps
