/** * Copyright 2014-2017 Riccardo Massera (TheCoder4.Eu) and Stephan Rauh (http://www.beyondjava.net). * * This file is part of BootsFaces. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package net.bootsfaces.component; import java.lang.reflect.Array; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.List; import java.util.Map; import javax.faces.component.UIComponent; import javax.faces.component.UISelectItem; import javax.faces.component.UISelectItems; import javax.faces.context.FacesContext; import javax.faces.model.SelectItem; /** * Collection of helper methods dealing with f:selectItem and f:selectItems. * * @author Stephan Rauh * */ public class SelectItemUtils { @SuppressWarnings("rawtypes") public static List<SelectItemAndComponent> collectOptions(FacesContext context, UIComponent menu) { List<SelectItemAndComponent> items = new ArrayList<SelectItemAndComponent>(); List<UIComponent> selectItems = menu.getChildren(); for (UIComponent kid : selectItems) { if (kid instanceof UISelectItem) { UISelectItem option = (UISelectItem) kid; items.add(new SelectItemAndComponent(kid, toSelectItem(option))); } else if (kid instanceof UISelectItems) { UISelectItems uiSelectItems = ((UISelectItems) kid); Object value = uiSelectItems.getValue(); if (value != null) { if (value instanceof SelectItem) { items.add(new SelectItemAndComponent(kid, (SelectItem)value)); } else { if (value.getClass().isArray()) { for (int i = 0; i < Array.getLength(value); i++) { Object item = Array.get(value, i); if (item instanceof SelectItem) items.add(new SelectItemAndComponent(kid, (SelectItem)item)); else items.add(new SelectItemAndComponent(kid, createSelectItem(context, uiSelectItems, item, null))); } } else if (value instanceof Map) { Map map = (Map) value; for (Iterator it = map.keySet().iterator(); it.hasNext();) { Object key = it.next(); items.add(new SelectItemAndComponent(kid, createSelectItem(context, uiSelectItems, map.get(key), String.valueOf(key)))); } } else if (value instanceof Collection) { Collection collection = (Collection) value; for (Iterator it = collection.iterator(); it.hasNext();) { Object item = it.next(); if (item instanceof SelectItem) items.add(new SelectItemAndComponent(kid, (SelectItem)item)); else items.add(new SelectItemAndComponent(kid, createSelectItem(context, uiSelectItems, item, null))); } } } } } } return items; } private static SelectItem toSelectItem(UISelectItem option) { SelectItem item = (SelectItem) option.getValue(); if (item == null) { item = new SelectItem(); item.setDescription(option.getItemDescription()); item.setDisabled(option.isItemDisabled()); item.setEscape(option.isItemEscaped()); item.setLabel(option.getItemLabel()); item.setNoSelectionOption(option.isNoSelectionOption()); item.setValue(option.getItemValue()); } return item; } /** * Copied from the InputRenderer class of PrimeFaces 5.1. * * @param context * @param uiSelectItems * @param value * @param label * @return */ private static SelectItem createSelectItem(FacesContext context, UISelectItems uiSelectItems, Object value, Object label) { String var = (String) uiSelectItems.getAttributes().get("var"); Map<String, Object> attrs = uiSelectItems.getAttributes(); Map<String, Object> requestMap = context.getExternalContext().getRequestMap(); if (var != null) { requestMap.put(var, value); } Object itemLabelValue = attrs.get("itemLabel"); Object itemValue = attrs.get("itemValue"); String description = (String) attrs.get("itemDescription"); Object itemDisabled = attrs.get("itemDisabled"); Object itemEscaped = attrs.get("itemLabelEscaped"); Object noSelection = attrs.get("noSelectionOption"); if (itemValue == null) { itemValue = value; } if (itemLabelValue == null) { itemLabelValue = label; } String itemLabel = itemLabelValue == null ? String.valueOf(value) : String.valueOf(itemLabelValue); boolean disabled = itemDisabled == null ? false : Boolean.valueOf(itemDisabled.toString()); boolean escaped = itemEscaped == null ? false : Boolean.valueOf(itemEscaped.toString()); boolean noSelectionOption = noSelection == null ? false : Boolean.valueOf(noSelection.toString()); if (var != null) { requestMap.remove(var); } return new SelectItem(itemValue, itemLabel, description, disabled, escaped, noSelectionOption); } }