// scan up the component hierarchy until the real owner is found and collect all cloned // components. private static List<Component> scanClones(DataBinder binder, Component comp) { if (DataBinder.isTemplate(comp)) { final List<Component> owners = scanClones(binder, binder.getCollectionOwner(comp)); // recursive final List<Component> kidowners = new LinkedList<Component>(); for (Component owner : owners) { final CollectionItem decor = binder.getCollectionItemByOwner(owner); // backward compatible, CollectionItemEx.getItems() is faster if (decor instanceof CollectionItemExt) { final CollectionItemExt decorex = (CollectionItemExt) decor; for (final Iterator iti = decorex.getItems(owner).iterator(); iti.hasNext(); ) { final Component item = (Component) iti.next(); kidowners.add(DataBinder.lookupClone(item, comp)); } } else { try { for (int j = 0; true; ++j) { // iterate until out of bound final Component item = decor.getComponentAtIndexByOwner(owner, j); kidowners.add(DataBinder.lookupClone(item, comp)); } } catch (IndexOutOfBoundsException ex) { // ignore, iterate until out of bound } } } return kidowners; } else { final List<Component> owners = new ArrayList<Component>(); owners.add(comp); return owners; } }