Commons-Collections is a classic example of an open-source project evolving over time. This page documents some of the key stages.
Collections 1.0 was a gathering of different Collection, Comparator, Iterator and Utility classes written elsewhere in Jakarta. At this stage, the component focussed mainly on getting re-use of code by making everything avaialable together.
All classes were placed in one package except the comparators, which had their own subpackage.
Collections 2.0 started the process of growth. The Bag interface was added with various implementations. Also added were additional collections implementations.
All classes were placed in one package except the comparators, which had their own subpackage.
Collections 2.1 increased the growth again. The Buffer interface was added, unifying various previous implementations. Numerous decorators were added as inner classes that behave like the unmodifiable or synchronized JDK decorators.
As the size of the component increased, the iterators were broken out into their own subpackage. Thus there were now three packages, main, comparator and iterator.
Collections 3.0 represents a re-birth of collections after an 18 month absence. Many, many classes had been added to CVS but not released including primitive and event-generating classes. In order to control the size of the collections distribution, these became two new projects - primitives and events.
New interfaces BidiMap, MapIterator, ResettableIterator and KeyValue were added. Also added were many new implementations of existing collections, especially Maps.
As more decorators were added the decision was taken to create a new subpackage for the decorators (no more inner classes). However, it became clear that whether a class was a decorator or not was not the most important division in finding a collection. As a result of this, and the general ongoing growth in the component, a full subpackage layout was chosen - one subpackage for each principal collections interface.
Essentially the 3.0 release represents the result of changing from a 'dumping ground' of re-used collections to a component designed for the purpose. Of course, backwards compatibility has been retained during all transitions using deprecation.
Collections 2.1.1 is a patch release to v2.1. Unfortunately, v3.0 created a binary incompatibility in the IteratorUtils class. This patch was created as a work around, enabling v2.1.1 to be compatible with v3.1.
Collections 3.1 fixes some bugs in v3.0 and adds a few new enhancements. The most notable change is a new list implementation, TreeList, that is well balanced for insertions and removals at any index. Other changes include more classes implementing Serializable and a ReferenceIdentityMap.