Release Notes -- Apache Jackrabbit Oak -- Version 0.11

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

Jackrabbit Oak is an effort to implement a scalable and performant
hierarchical content repository for use as the foundation of modern
world-class web sites and  other demanding content applications.

The Oak effort is a part of the Apache Jackrabbit project.
Apache Jackrabbit is a project of the Apache Software Foundation.

Jackrabbit Oak 0.11 is to alpha-level software. Use at your own risk.

Changes in Oak 0.11
-------------------

New Features

  [OAK-335] Performance tests for microkernel - write tests
  [OAK-619] Lock-free MongoMK implementation
  [OAK-1121] Enhance observation mechanism to only listen to cluster local changes

Improvements

  [OAK-51] Access Control Management
  [OAK-66] JCR Node Type Management
  [OAK-76] Initial content in oak-run
  [OAK-91] Implement Authentication Support
  [OAK-98] Source code formatting, code conventions, Javadocs
  [OAK-366] MongoDB microkernal integration with OSGi
  [OAK-392] Review ContentSession#createBlob
  [OAK-414] Importing protected properties and nodes
  [OAK-615] UserValidator should check for cyclic group membership
  [OAK-630] SegmentMK: Implement compareAgainstBaseState
  [OAK-657] Add oak:unstructured
  [OAK-663] oak-jcr performance optimization
  [OAK-741] Better toString() methods
  [OAK-752] Remove deprecated code and code in "old" packages
  [OAK-776] NodeState convenience accessors
  [OAK-792] AccessControl Management: Document changes wrt. Jackrabbit
  [OAK-801] Add Javadoc to JsonObject.create(JsopTokenizer)
  [OAK-806] Content migration from Jackrabbit to Oak
  [OAK-855] NodeState.equals is sometimes very slow
  [OAK-874] Column names aren't reported properly for "select * from   [nodeType]" queries
  [OAK-900] Run Jackrabbit Observation tests
  [OAK-910] Privilege Management: Document changes wrt Jackrabbit
  [OAK-946] Improve support for debugging Oak
  [OAK-949] UserQuery does not properly work for the optional everyone group
  [OAK-954] Make Lucene analyzer configurable
  [OAK-987] Implement the MicroKernel API
  [OAK-993] Improve backward compatibility for Item.save and Item.refresh
  [OAK-1018] Optimise Session.getNode
  [OAK-1031] SegmentMK: Fewer segment lookups
  [OAK-1032] SegmentMK: One SegmentWriter per SegmentNodeStore
  [OAK-1036] SegmentMK: Auto-flushing SegmentNodeBuilder
  [OAK-1037] Improve performance of XmlImport
  [OAK-1048] Unify node type management in the query index impls
  [OAK-1052] Introduce execution context for executing queries
  [OAK-1058] Review TreeTypeProvider
  [OAK-1060] Periodically poll for external events
  [OAK-1078] Move node state based configuration to oak-solr-core
  [OAK-1079] Create separate OSGi service classes for SolrQueryIndex/IndexEditor providers
  [OAK-1084] Allow blacklisting of rogue observation listener
  [OAK-1086] NodeTypes of successive calls to node.getPrimaryNodetypes() are not equal
  [OAK-1088] Thread safe MongoDocumentStore
  [OAK-1101] Improve concurrency of branch lookups
  [OAK-1102] Isolate MicroKernel specific code in MongoMK
  [OAK-1105] Osgi pluggability for the TokenProvider
  [OAK-1110] Make NodeStateDiff composable
  [OAK-1112] Support user data in local events
  [OAK-1113] Immediate delivery of events from local commits
  [OAK-1117] [MongoMk]Flag document with children
  [OAK-1119] [MongoMK] Reduce number of calls made to Mongo DB when an Oak based application is restarted
  [OAK-1123] Reusable NodeStoreBranch base implementation
  [OAK-1126] Same node and property name support
  [OAK-1127] MixinTest.testRemoveInheritedMixin() may fail depending on test order
  [OAK-1131] Provide a way to inject Observer instances into NodeStore implementations
  [OAK-1135] NPE in CompiledPermissionImpl.getTreePermission()
  [OAK-1136] Revisit/Improve CompiledPermissionImpl.getTreePermission()
  [OAK-1139] Avoid the duplicate property lookup during getProperty("name").getString()
  [OAK-1142] Optimize node builders for the common case where there are no transient changes
  [OAK-1144] Avoid wrapping TreePermission into SecurityContext
  [OAK-1146] Remove equals/hashcode on SecureNodeState and TreePermissionImpl
  [OAK-1147] SecureNodeBuilder/SecureNodeState: Consider using 'TreePermission#canReadProperties'
  [OAK-1148] Incomplete Javadoc with NodeState#compareAgainstBaseState
  [OAK-1149] Avoid exists check in NodeDelegate.getChild() with empty path
  [OAK-1156] Improve the document cache invalidation logic to selectivly invalidate doc
  [OAK-1162] Make Solr index asynchronous by default
  [OAK-1169] Update Guava to version 15.0
  [OAK-1188] Input streams returned from Blob instances should implement available()

Bug

  [OAK-127] JCR: Support for XML imports
  [OAK-223] Missing path convertion in oak-jcr
  [OAK-244] ExportDocViewTest test failing
  [OAK-373] OOME running TCK
  [OAK-436] apache.jackrabbit.mk.store.NotFoundException
  [OAK-504] DefaultRevisionStore: Exception occurred in GC cycle: NotFoundException
  [OAK-567] DiffBuilder performance problem
  [OAK-587] DefaultRevisionStoreTest.testConcurrentGC fails every now and then.
  [OAK-724] Text.getRelativeParent() does not work with paths containing fully qualified names
  [OAK-745] Hardcoded OpenSecurityProvider in RootImpl constructor
  [OAK-901] Test root node type is not reported correctly
  [OAK-948] Compatibility - Oak not generates property change event for touched properties
  [OAK-970] DocumentViewImportTest fails with SegmentMK
  [OAK-1055] Occasional test failure in ObservationTest.observation()
  [OAK-1083] Query with descendent node and access control fails to return result
  [OAK-1085] Compatibility for queries with not(child/@prop) conditions
  [OAK-1087] TCK tests fail with SegmentMK and MongoStore
  [OAK-1089] Too many document splits
  [OAK-1090] Event-listener not notified on Node.orderBefore
  [OAK-1091] TokenLoginModule#commit should throw an exception if TokenInfo is not created
  [OAK-1093] IllegalArgumentException on Row.getValues()
  [OAK-1095] versionable path property has wrong type
  [OAK-1096] QueryManager does not have autorefresh
  [OAK-1097] VersionablePathHook ignores "modified" version histories
  [OAK-1098] AuthorizableImpl methods should convert path to Oak path
  [OAK-1104] SegmentNodeStore rebase operation assumes wrong child node order
  [OAK-1106] Query engine does not deal with remapped namespaces
  [OAK-1107] MongoMK may not detect changes with diffManyChildren()
  [OAK-1109] SegmentMK: failed to load segment
  [OAK-1111] Node#setProperty(String, Calendar) doesn't take time zone in account
  [OAK-1122] Empty branch commit returns head revision on trunk
  [OAK-1125] FileStore should inherit cache size setting
  [OAK-1128] Conditions of the form "(x=1 or x=2) or y=3" are not processed correctly
  [OAK-1129] Repeated MongoMK.rebase() always adds new revision
  [OAK-1132] QueryEngine #executeQuery creates a new revision on each call
  [OAK-1140] SecureNodeBuilder should use the base state for the security context
  [OAK-1141] SecureNodeBuilder.getChildNode() should not optimize for SecurityContext.canReadAll()
  [OAK-1143] [scala] Repository init throws "illegal cyclic reference involving class ChangeDispatcher"
  [OAK-1154] MongoMK throws exception when there are many listeners
  [OAK-1164] Duplicate binaries
  [OAK-1165] Too frequent document splits
  [OAK-1167] Background read may cause IllegalArgumentException
  [OAK-1170] Inconsistent reads with concurrent benchmark tests
  [OAK-1171] Query fails unexpectedly when property conversion is not possible
  [OAK-1172] AbstractTree.getChildrenCount() not very performant due to INTERNAL_NODE_NAMES
  [OAK-1173] NPE if checking for a non-existing node in version storage
  [OAK-1177] Node#isModified returns true if node has non-readable child
  [OAK-1178] MutableTree#isNew: replace implementation by NodeBuilder#isNew
  [OAK-1192] NPE in Versioning when a Node has a hidden child node
  [OAK-1194] Missing properties in Node.getReferences()
  [OAK-1196] Node.getReferences() should not show references in version storage

In addition to the above-mentioned changes, this release contains
all the changes included up to the Apache Jackrabbit Oak 0.10 release.

For more detailed information about all the changes in this and other
Oak releases, please see the Oak issue tracker at

  https://issues.apache.org/jira/browse/OAK

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

This release consists of a single source archive packaged as a zip file.
The archive can be unpacked with the jar tool from your JDK installation.
See the README.md file for instructions on how to build this release.

The source archive is accompanied by SHA1 and MD5 checksums and a PGP
signature that you can use to verify the authenticity of your download.
The public key used for the PGP signature can be found at
https://svn.apache.org/repos/asf/jackrabbit/dist/KEYS.

About Apache Jackrabbit Oak
---------------------------

Oak is an effort implement a scalable and performant hierarchical content 
repository for use as the foundation of modern world-class web sites and 
other demanding content applications. 

The Oak effort is a part of the Apache Jackrabbit project. 
Apache Jackrabbit is a project of the Apache Software Foundation.

For more information, visit http://jackrabbit.apache.org/oak

About The Apache Software Foundation
------------------------------------

Established in 1999, The Apache Software Foundation provides organizational,
legal, and financial support for more than 100 freely-available,
collaboratively-developed Open Source projects. The pragmatic Apache License
enables individual and commercial users to easily deploy Apache software;
the Foundation's intellectual property framework limits the legal exposure
of its 2,500+ contributors.

For more information, visit http://www.apache.org/
