The JCasIterable is an Iterable and an Iterator at the same time. The iterator() method returns just "this". This goes against the expectation that an Iterable should return a fresh iterator when iterator() is called.
JCasIterable should therefore be split. The JCasIterable should only be creatable with descriptions.
Calling iterator should create a new JCasIterator which then is based on concrete reader and AE instances.