New & Noteworthy for Eclipse Handly 0.8
Eclipse Handly 0.8 release attempts to finalize model-related parts of the Core API. To that end, it contains many API enhancements to elements, element deltas, the model, and working copy management. It also introduces new naming convention for model *Impl* interface methods and a separate package for model implementation support. Also, some optimizations have been made in skeletal implementations to allow Handly-based models scale even better than before.
Due to the API rework involved, this release introduces a number of breaking changes. Please see the migration guide if you are a current adopter.
Here are the highlights of this release.
Enhancements in Elements (525952)
About 30 new API methods have been added to class Elements, in particular handle-only utility methods around the parent chain, such as findAncestorOfType and findAncestorOfTypeUntil, findCommonAncestor, isAncestorOf, removeDescendants, etc.
Enhancements in ElementDelta (520334)
Both API and implementation of ElementDelta have been significantly enhanced. Among other things, a number of protected methods such as mergeWith_ and copyFrom_ have been introduced to give model implementors more control over the default implementation. Also, the number of array reallocations in ElementDelta has been greatly reduced, and subclasses of ElementDelta can now avoid copying of arrays returned from get*Children_() methods when conversion to a more specific runtime type is necessary.
Enhancements in the Model Object API (522115)
The model object API has been restructured for consistency with element and element delta API. IModel is now a marker interface. Clients that implemented IModel need to implement IModelImpl, a newly introduced interface. Clients that called methods on IModel need to call corresponding methods of the new class Models.
Generic Way to Create Element Handles (525679)
A new API, IElementHandleFactory, supports a generic way of creating the element handle from its stable string representation ("memento"). It also supports creating the element handle from its corresponding IResource handle. It is an option, not a requirement for a Handly-based model to implement the new API.
Other API Enhancements
- New package for model implementation support, org.eclipse.handly.model.impl.support, has been introduced (526682). The skeletal implementations of model *Impl* interfaces along with other supporting classes and interfaces have moved from org.eclipse.handly.model.impl to this new package. The *Impl* interfaces themselves have remained in the org.eclipse.handly.model.impl package.
- New naming convention for model *Impl* interface methods has been introduced (521851). All methods of *Impl* interfaces in org.eclipse.handly.model.impl and org.eclipse.handly.model.impl.support packages have adopted new naming convention based on the '_' (underscore) suffix instead of the former 'h' prefix. For example, IElementImpl.hName() has been renamed to getName_(), etc.
- A number of additional array utilities has been provided to help avoid the cost of creating and using higher-level wrapper objects for arrays (526551)
- StructureHelper API has been reworked completely (522481).
- A new design for working copy management has been implemented (520063).
- A number of input element provider related API enhancements has been made in Handly UI (526776).
Other Implementation Enhancements
- Implementation of IElementImplSupport.open_ has been made more robust (525394)
- Default implementation of equals has been optimized for elements (522488)
- Implementation of Body has been optimized (522484)
Enhancements in JModel Example (526924)
The class JavaElement has been introduced as the root of Java element class hierarchy. Example projects have been renamed, and exemplary implementation of a new API, IElementHandleFactory, has been provided (class JavaElementHandleFactory). Also, the JModel example demonstrates how to utilize optimizations in Handly 0.8 to avoid copying of arrays returned from ElementDelta.get*Children_() and Body.getChildren().