Release Notes -- Apache Jackrabbit -- Version 1.1.1


Introduction
------------

The Apache Jackrabbit project is an effort to build and maintain
an open source implementation of the Content Repository for Java
Technology API (JCR) specified in the Java Specification Request 170
(JSR-170). The project also produces a various tools and components
related to the JCR API.

Apache Jackrabbit 1.1.1 is  a patch release that fixes a number of
issues, see the include change history for details. No new features
or configuration changes have been introduced since the 1.1 release.

See the Apache Jackrabbit website at http://jackrabbit.apache.org/
for more information.


Release Contents
----------------

The main contents of this release are the Apache Jackrabbit core
content repository implementation and the related general-purpose
JCR utilities:

     jackrabbit-core-1.1.1-src.jar

     jackrabbit-core-1.1.1.jar
     jackrabbit-jcr-commons-1.1.1.jar

This release contains also additional components that offer extra
functionality for use with either Apache Jackrabbit core or any
JCR compliant content repository. These modules should be considered
beta quality:

 * RMI network layer for the JCR API.

     jackrabbit-jcr-rmi-1.1.1-src.jar
     jackrabbit-jcr-rmi-1.1.1.jar

 * Deployable Jackrabbit installation with WebDAV support for JCR.

     jackrabbit-jcr-server-1.1.1-src.jar

     jackrabbit-jcr-webdav-1.1.1.jar
     jackrabbit-jcr-client-1.1.1.jar
     jackrabbit-jcr-server-1.1.1.jar
     jackrabbit-server-1.1.1.war

 * J2EE Connector Architecture (JCA) resource adapter for Jackrabbit.

     jackrabbit-jca-1.1.1-src.jar
     jackrabbit-jca-1.1.1.rar

 * Text indexing filters for Jackrabbit. Includes example filters
   for Adobe PDF and MS Excel, PowerPoint, and Word.

     jackrabbit-index-filters-1.1.1-src.jar
     jackrabbit-index-filters-1.1.1.jar

All components are released as a source jar file and one or more compiled
binary files. All files contain a README.txt file with more information.
Note that external runtime dependencies are only included for the war
and rar archives. Other dependencies can be downloaded either manually
or automatically using the Maven build system.

Each release file is accompanied by SHA1 and MD5 checksums and a PGP
signature. The public key used for the signatures can be found
in the KEYS file located in the parent directory.


Upgrading from 1.0
------------------

Apache Jackrabbit 1.1.1 is fully compatible with the 1.0 release. An
Apache Jackrabbit 1.0 installation can be upgraded by replacing
the relevant jar files with the new versions. No changes to repository
contents are needed.


Change History
--------------

Changes since 1.1:

    * [JCR-67] - Node.canAddMixin(String)
    * [JCR-550] - OutOfMemoryError when re-indexing the repository
    * [JCR-562] - 'OR' in XPath query badly interpreted
    * [JCR-563] - encode/decode
    * [JCR-574] - MsExcelTextFilter throws Exception. Repository is not
    * [JCR-586] - Removing a mixin that adds a same-name-sibling child node
    * [JCR-587] - XMLTextFilter does not extract text elements
    * [JCR-594] - It's not possible to register event listeners that filters
    * [JCR-598] - DateValue.equals() relies on Calendar.equals()
    * [JCR-600] - Repository does not release all resources on shutdown
    * [JCR-602] - importXML still depends on Xerces
    * [JCR-603] - OracleFileSystem can't handle empty files
    * [JCR-605] - Error when registering node types on virgin repository
    * [JCR-606] - RMI-DateValue does not support full ISO8601 format
    * [JCR-620] - Workspace.getImportHandler() doesn't handle namespace
    * [JCR-624] - OutOfMemoryError When repeat login and the logout many times
    * [JCR-628] - OutOfMemory problem: HandleMonitor does not release closed
    * [JCR-629] - CompactNodeTypeDefWriter does not escaped names properly
    * [JCR-636] - Local AuthContext authenticates if LoginModule should be
    * [JCR-637] - Multiple namespace definitions in CND prevent definition of
    * [JCR-646] - Misleading exception message for jcr:deref()
    * [JCR-649] - Like expression does not match line terminator in String

See the issue tracker at http://issues.apache.org/jira/browse/JCR for
issue details and the full change histories of all Apache Jackrabbit versions.


Known Issues
------------

The known issues in this release are listed below:

    * [JCR-18] - Multithreading issue with versioning
    * [JCR-43] - Restore on node creates same-name-sibling of OPV-Version
    * [JCR-320] - BinaryValue equals fails for two objects with two different
    * [JCR-385] - ClassCastExeption when executing union queries
    * [JCR-392] - Accessing element by number does not work
    * [JCR-406] - If header evaluation compliance provlems
    * [JCR-435] - Node.update() does not work correct for SNS
    * [JCR-441] - Session logout doesn't release locks acquired using
    * [JCR-449] - inconsistency in internal version items during commits
    * [JCR-517] - Reserved status of namespace jcr not enforced.
    * [JCR-522] - XPath parser too tolerant
    * [JCR-529] - New versions added after a restore have bad version name
    * [JCR-537] - Failure to remove a versionable node
    * [JCR-538] - failing Node.checkin() or Node.checkout() might leave
    * [JCR-544] - JCR-Server: Workspace.restore not mapped correctly
    * [JCR-546] - Deadlock during checkin
    * [JCR-566] - Versioning bug with restore and transactions
    * [JCR-575] - unicode escapes in files generated by JJTree
    * [JCR-591] - XPath position function does not work
    * [JCR-604] - After saving over Webdav the jcr:encoding property is
    * [JCR-607] - Importing XML at root level using a session from JCA throws
    * [JCR-609] - Empty custom_nodetypes.xml after restart
    * [JCR-614] - Weird locking behaviour in CachingHierarchyManager
    * [JCR-617] - CachingHieraarchyManager may serve moved items
    * [JCR-622] - Auto Reconnect for RepositoryAccessServlet
    * [JCR-625] - Memory is not freed up when jackrabbit-server war is
    * [JCR-632] - VersionManager lock not released in some circumstances
    * [JCR-639] - Allow modification of OPV=IGNORE items even if parent node
    * [JCR-641] - can't add lock token to session after 3 login/logout
    * [JCR-643] - Own AccessManager + VersionManager : AccesDenied problem
    * [JCR-648] - NullPointerException in SessionItemStateManager

Please use the issue tracker to report any other issues you may encounter.
