in tobago-core/src/main/java/org/apache/myfaces/tobago/internal/util/SelectItemUtils.java [108:201]
public boolean hasNext() {
if (nextItem != null) {
return true;
}
if (nestedItems != null) {
if (nestedItems.hasNext()) {
return true;
}
nestedItems = null;
}
UIComponent child = null;
while (children.hasNext()) {
final UIComponent c = children.next();
// When there is other components nested that does
// not extends from UISelectItem or UISelectItems
// the behavior for this iterator is just skip this
// element(s) until an element that extends from these
// classes are found. If there is no more elements
// that conform this condition, just return false.
if (c instanceof UISelectItem || c instanceof UISelectItems) {
child = c;
break;
}
}
if (child == null) {
return false;
}
if (child instanceof UISelectItem) {
final UISelectItem uiSelectItem = (UISelectItem) child;
Object item = uiSelectItem.getValue();
if (item == null) {
// no value attribute --> create the SelectItem out of the other attributes
final Object itemValue = uiSelectItem.getItemValue();
String label = uiSelectItem.getItemLabel();
final String description = uiSelectItem.getItemDescription();
final boolean disabled = uiSelectItem.isItemDisabled();
// boolean escape = uiSelectItem.isItemEscaped();
boolean noSelectionOption = uiSelectItem.isNoSelectionOption();
if (label == null && itemValue != null) {
label = itemValue.toString();
}
String image = null;
Markup markup = null;
if (uiSelectItem instanceof org.apache.myfaces.tobago.component.UISelectItem) {
final org.apache.myfaces.tobago.component.UISelectItem tobagoSelectItem
= (org.apache.myfaces.tobago.component.UISelectItem) uiSelectItem;
image = tobagoSelectItem.getItemImage();
markup = tobagoSelectItem.getMarkup();
}
item = new org.apache.myfaces.tobago.model.SelectItem(itemValue, label, description, disabled,
true, noSelectionOption, image, markup);
} else if (!(item instanceof SelectItem)) {
final ValueExpression expression = uiSelectItem.getValueExpression("value");
throw new IllegalArgumentException("ValueExpression '"
+ (expression == null ? null : expression.getExpressionString()) + "' of UISelectItem : "
+ child + " does not reference an Object of type SelectItem");
}
nextItem = (SelectItem) item;
return true;
} else { // UISelectItems
currentUISelectItems = (UISelectItems) child;
final Object value = currentUISelectItems.getValue();
if (value instanceof SelectItem) {
nextItem = (SelectItem) value;
return true;
} else if (value != null && value.getClass().isArray()) {
// value is any kind of array (primitive or non-primitive)
// --> we have to use class Array to get the values
final int length = Array.getLength(value);
final Collection<Object> items = new ArrayList<>(length);
for (int i = 0; i < length; i++) {
items.add(Array.get(value, i));
}
nestedItems = items.iterator();
return hasNext();
} else if (value instanceof Iterable) {
// value is Iterable --> Collection, DataModel,...
nestedItems = ((Iterable<?>) value).iterator();
return hasNext();
} else if (value instanceof Map) {
final Map<Object, Object> map = (Map<Object, Object>) value;
final Collection<SelectItem> items = new ArrayList<>(map.size());
for (final Map.Entry<Object, Object> entry : map.entrySet()) {
items.add(new org.apache.myfaces.tobago.model.SelectItem(entry.getValue(), entry.getKey().toString()));
}
nestedItems = items.iterator();
return hasNext();
}
}
return false;
}