in empire-db-jsf2/src/main/java/org/apache/empire/jsf2/controls/SelectInputControl.java [285:384]
public void syncOptions(UISelectOne input, TextResolver textResolver, InputInfo ii)
{
// get the options
Options options = ii.getOptions();
if (options==null)
{ // invalid options
if (ii.getColumn()!=null)
log.warn("No options given for column {}", ii.getColumn().getName());
else
log.warn("No options given for select tag {}", input.getClientId());
options = new Options();
}
// check grouping
OptionGroupResolver optionGroupResolver = options.getOptionGroupResolver();
if (optionGroupResolver!=null)
{ // not (yet) supported
log.debug("SyncOptions is not supported for grouped SelectItems for column {}", ii.getColumn().getName());
return;
}
// list and type
Class<?> exprType = (Class<?>)input.getAttributes().get(SelectInputControl.VALUE_EXPRESSION_TYPE);
List<SelectItem> selectItemList = getSelectItemList(input);
// prepare
Object currentValue = ii.getValue(true);
boolean hasEmpty = isEmptyEntryRequired(input, options, ii, currentValue);
// boolean isInsideUIData = ii.isInsideUIData();
// Compare child-items with options
Iterator<OptionEntry> ioe = options.iterator();
OptionEntry oe = (ioe.hasNext() ? ioe.next() : null);
// sync
Iterator<SelectItem> ico = selectItemList.iterator();
int lastIndex = 0;
boolean emptyPresent = false;
while (ico.hasNext())
{
lastIndex++;
SelectItem si = ico.next();
Object ov = si.getValue();
// check empty
if (ObjectUtils.isEmpty(ov) && hasEmpty)
{ emptyPresent = true;
continue;
}
// skip inactive
while (oe != null && !oe.isActive())
{ // check for current
if (ObjectUtils.compareEqual(oe.getValue(), currentValue))
break;
// next oe
oe = (ioe.hasNext() ? ioe.next() : null);
}
if (oe == null)
{ // remove obsolete items
lastIndex--;
for (int index = selectItemList.size() - 1; index >= lastIndex; index--)
selectItemList.remove(index);
// done
return;
}
if (ObjectUtils.compareEqual(ov, oe.getValue()))
{ // update label and continue
setItemLabel(si, textResolver, oe);
oe = (ioe.hasNext() ? ioe.next() : null);
continue;
}
// Not equal - do a full reload
selectItemList.clear();
if (hasEmpty)
{ // add empty entry
addSelectItem(selectItemList, textResolver, new OptionEntry("", getNullText(ii)), exprType);
}
for (OptionEntry opt : options)
{ // Option entries
if (opt.isActive() || ObjectUtils.compareEqual(opt.getValue(), currentValue))
{ // add active or current item
addSelectItem(selectItemList, textResolver, opt, exprType);
}
}
// done
return;
}
// check empty entry
if (hasEmpty && !emptyPresent)
{ // add missing empty entry
addSelectItem(selectItemList, textResolver, new OptionEntry("", getNullText(ii)), exprType, 0);
}
// Are there any items left?
while (oe != null)
{ // add missing item
if (oe.isActive() || ObjectUtils.compareEqual(oe.getValue(), currentValue))
{ // add item
addSelectItem(selectItemList, textResolver, oe, exprType);
}
oe = (ioe.hasNext() ? ioe.next() : null);
}
}