in core/src/main/java/org/apache/struts2/components/IteratorComponent.java [253:331]
public boolean start(Writer writer) {
//Create an iterator status if the status attribute was set.
if (statusAttr != null) {
statusState = new IteratorStatus.StatusState();
status = new IteratorStatus(statusState);
}
if (beginStr != null)
begin = (Integer) findValue(beginStr, Integer.class);
if (endStr != null)
end = (Integer) findValue(endStr, Integer.class);
if (stepStr != null)
step = (Integer) findValue(stepStr, Integer.class);
ValueStack stack = getStack();
if (value == null && begin == null && end == null) {
value = "top";
}
Object iteratorTarget = findValue(value);
iterator = MakeIterator.convert(iteratorTarget);
if (begin != null) {
//default step to 1
if (step == null)
step = 1;
if (iterator == null) {
//classic for loop from 'begin' to 'end'
iterator = new CounterIterator(begin, end, step, null);
} else {
//only arrays and lists are supported
if (iteratorTarget.getClass().isArray()) {
Object[] values = (Object[]) iteratorTarget;
if (end == null)
end = step > 0 ? values.length - 1 : 0;
iterator = new CounterIterator(begin, end, step, Arrays.asList(values));
} else if (iteratorTarget instanceof List values) {
if (end == null)
end = step > 0 ? values.size() - 1 : 0;
iterator = new CounterIterator(begin, end, step, values);
} else {
//so the iterator is not based on an array or a list
LOG.error("Incorrect use of the iterator tag. When 'begin' is set, 'value' must be" +
" an Array or a List, or not set at all. 'begin', 'end' and 'step' will be ignored");
}
}
}
// get the first
if ((iterator != null) && iterator.hasNext()) {
Object currentValue = iterator.next();
stack.push(currentValue);
if (currentValue != null) {
threadAllowlist.allowClassHierarchy(currentValue.getClass());
}
String var = getVar();
if ((var != null)) {
putInContext(currentValue);
}
// Status object
if (statusAttr != null) {
statusState.setLast(!iterator.hasNext());
oldStatus = stack.getContext().get(statusAttr);
stack.getContext().put(statusAttr, status);
}
return true;
} else {
super.end(writer, "");
return false;
}
}