Design Note: Extended Handling of Nested Features (revised)

Last Updated: 09/09/2002

Change History:

* 9/10: initial content
 

Introduction

This document is based on an earlier document of the identical title that outlined possible options to handle requested design changes and enhancements of the Eclipse Update component. Since some of the requests have been addressed in 2.0.1 release, this document outlines only the changes that will be attempted in the fall of 2002. The changes will eventually end up in Eclipse 2.1 release, but may be available earlier in a service (fix pack) release based on 2.0.1 stream.

The Problem

The original (2.0.0) Eclipse Update design provides for feature nesting using the 'includes' element. Nesting is referential i.e. features are defined outside of the parent feature. The referencing is 'rigid' in that an exact version of the included feature has to be specified. Any other version will break the reference. In addition, child features are restricted in a number of ways:

This design is sufficient to support traditional products that all originate from one team. The team can be large and the product (root feature) can have elaborate feature hierarchy, but all the peaces come from the same place and must have exact versions to ensure they all work together as tested.

However, there is a number of scenarios where this structure is too limiting. When larger products are composed of smaller ones (making product suites), they typically span teams, even companies. More latitude is required in the way feature hierarchies are specified, as well as in the way updates are delivered. The following limitations need addressing:

  1. Product managers are willing to give up full control over the exact versions of the included features (products) when they are provided by separate product teams. They want to allow users to individually update member products (children in the hierarchy) within the fix pack version space (the exact 'room' for upgrades should be defined upfront). If versions start to diverge too much, a new version of the root feature can bring this back to normal.
  2. When it comes to updates, product managers want to be able to define whether child features go to the parent for their updates or can go to their own update sites.
  3. At the opposite side of the spectrum, product managers may want to prevent a child in the hierarchy to be updated ever (that is, outside of the hierarchy). If a new version of a child feature is installed as a root feature, the Eclipse run time will pick the newer version, thus having the same effect as updating the child. In case of the classic product structure, a mechanism to prohibit this is needed.

The Proposed Solution

We will extend the <includes> element to support several additional attributes that capture the semantics described above. In particular, the <includes> element would be extended as follows (elements that are new compared to the 2.0.1 release are shown in dark red):

<!ELEMENT includes EMPTY>
<!ATTLIST includes
    id                    CDATA #REQUIRED
    version               CDATA #REQUIRED
    name                  CDATA #IMPLIED
    optional              (true | false) "false"
        match                 (perfect | equivalent | compatible | greaterOrEqual) "perfect"  
    update-allowed        (true | false) "true"
    search-location       (root | self | both) "root"
>

 The update-allowed attribute is used as follows [21352]:

The match attribute and the search-location attribute are used as follows [21351]: Eclipse 2.0 clients that have not updated to the 2.0.1 support would ignore the additional attributes and enforce the stricter 2.0 <includes> semantics. This avoids having to support an additional concrete feature type implementation in 2.0.1.