$Id$ = 1.3 = == Backwards Compatibility == This release is backwards-compatible with version 1.2 for normal use of Orchestra, but does make some changes in core classes that will affect people who have modified the internal implementation of Orchestra. * ConversationManager.getConversationContext(Long) was previously protected and is now public. This is theoretically a binary-incompatible change as existing subclasses that override the method using scope of protected will now fail to compile. However it is extremely unlikely that anyone has done this. Commit: r702065 == Bugfixes * ORCHESTRA-29: access-scoped conversations always get discarded during ajax requests from the NetAdvantage ajax library * Fix potential problem on JSF1.2 where ViewHandler methods that are new to JSF1.2 would not be delegated to the underlying implementation (r697803) * Don't trigger creation of a Session if one does not yet exist. In particular, this fixes problems with Weblets when cookies are disabled; with that combination a separate Session was being created for each weblet request. See r687072. * Fix SpringBasicFrameworkAdapter.getBean(String), which threw an exception if the bean did not exist instead of simply returning null. == Known Issues * As far as we know, Orchestra still does not work with Portlets (ORCHESTRA-17, ORCHESTRA-22). At least, problems have been reported against earlier versions and no-one has tested this release with Portlets. == Major Changes === Access Scoped Conversations === The check for unused access-scoped conversations now occurs only at the end of the render phase for a *new* view; previously the check was performed at the end of every render phase. The new approach works better with ajax calls, where only part of a page is rendered and therefore conversations may not be accessed for a particular ajax call even though they are still in use by the overall page. This also fixes a bug related to validation; when validation failed for a page and a conversation was only ever accessed via the "value" EL expression for an input component, then the converation would be discarded because after validation failure input components just render their cached submittedValue rather than evaluate their EL expressions. Delaying purging of access-scoped conversations until after render of a new view avoids this issue. This does introduce some possible behavioural changes. Previously if a conversation was only accessed by components which can be toggled between rendered and not-rendered then when the components were not rendered the conversation would be discarded; ie hiding/showing a component would reset it. Now the conversation is preserved, ie hiding/showing a component does not reset its state. === Invocation of Beans in Invalidated Conversations Now Detected === Previously if a non-scoped-proxy referenced a bean in a conversation that had been deleted, then invoking that proxy would not report an error - though things would probably not work, as all the other beans in the conversation have been removed. Now an IllegalStateException gets thrown if this ever happens. It is pretty difficult to actually get into this situation without using the Conversation.bind(Object) method (which was added in the 1.3 release) so this is unlikely to affect existing code. And if it does, that code was probably broken anyway. == New Features === Binding of arbitrary beans === Method Conversation.bind(Object) has been added to provide the ability to associate an arbitrary bean with a specific conversation. Method ConversationUtils.bindToCurrent(Object) is a convenient wrapper for this method. This is particularly useful when a conversation-scoped backing bean wants to provide a getter method for an EL expression to access a persistent object. By using the bind method, calls by the EL expression into the persistent object will set up the conversation (and therefore the persistence context) that is needed to walk lazy relations for that object. === ViewControllerManager instance now available === Orchestra uses a singleton ViewControllerManager object to invoke "lifecycle" methods on backing beans (which may implement the ViewController interface, or use naming-conventions). Previously the ViewControllerManager instance could not be retrieved by user code; now it can be accessed via new class ViewControllerManagerFactory. == ConversationContext Tracks Child Contexts === In version 1.2, the ability for a ConversationContext to have a "parent" context was added. However the conversation timeout logic was not modified; a context A (and conversations in the context) would still time out using the normal settings even when there was a context B that referenced A as its parent. When a context A has one or more child contexts (ie contexts that reference it as their parent), then it implies that eventually the user will return to it, so it makes sense to suppress timeouts for a context (and all its conversations) when the context has one or more child contexts. This has been implemented for version 1.3. To do this, a context needs to *know* whether it has children, so the previously one-way relation (child->parent) is now a two-way relation. As a result, the following methods have been added to ConversationContext: * addChild, removeChild, hasChildren. In addition, method "clear" was renamed to "invalidate" (although a clear method exists that delegates to invalidate for backwards compatibility). See r674857. == Improved Filter Control === All of the ServletFilters provided by Orchestra now take init parameters named "excludePrefix" and "excludeSuffix", to allow fine-tuning of which urls they apply to. This is useful due to the very primitive features available in the standard web.xml filter-mapping. == History 1.0 release based on r583187 Branched for 1.1 release on r634925 Branched for 1.2 release on r671173 Branched for 1.3 release on r707462