docs: protected int renderGroupOrItemRadio(FacesContext facesContext,
                                           UIComponent uiComponent, SelectItem selectItem,
                                           Object currentValue,
                                           Converter converter, boolean pageDirectionLayout,
                                           Integer itemNum) throws IOException
      {
  
          ResponseWriter writer = facesContext.getResponseWriter();
  
          boolean isSelectItemGroup = (selectItem instanceof SelectItemGroup);
  
          // TODO : Check here for getSubmittedValue. Look at RendererUtils.getValue
          // this is useless object creation
  //        Object itemValue = selectItem.getValue();
  
          UISelectOne selectOne = (UISelectOne)uiComponent;
  
          if (isSelectItemGroup) 
          {
              if (pageDirectionLayout)
              {
                  writer.startElement(HTML.TR_ELEM, null); // selectOne);
              }
  
              writer.startElement(HTML.TD_ELEM, null); // selectOne);
              if (selectItem.isEscape())
              {
                  writer.writeText(selectItem.getLabel(),HTML.LABEL_ATTR);
              }
              else
              {
                  writer.write(selectItem.getLabel());
              }
              writer.endElement(HTML.TD_ELEM);
  
              if (pageDirectionLayout)
              {
                  writer.endElement(HTML.TR_ELEM);
                  writer.startElement(HTML.TR_ELEM, null); // selectOne);
              }
              writer.startElement(HTML.TD_ELEM, null); // selectOne);
  
              writer.startElement(HTML.TABLE_ELEM, null); // selectOne);
              writer.writeAttribute(HTML.BORDER_ATTR, "0", null);
              
              if(!pageDirectionLayout)
              {
                  writer.startElement(HTML.TR_ELEM, null); // selectOne);
              }
  
              SelectItemGroup group = (SelectItemGroup) selectItem;
              SelectItem[] selectItems = group.getSelectItems();
  
              for (SelectItem groupSelectItem : selectItems)
              { 
                  itemNum = renderGroupOrItemRadio(facesContext, selectOne, groupSelectItem, currentValue, 
                                                   converter, pageDirectionLayout, itemNum);
              }
  
              if(!pageDirectionLayout)
              {
                  writer.endElement(HTML.TR_ELEM);
              }
              writer.endElement(HTML.TABLE_ELEM);
              writer.endElement(HTML.TD_ELEM);
  
              if (pageDirectionLayout)
              {
                  writer.endElement(HTML.TR_ELEM);
              }
  
          } 
          else 
          {
              String itemStrValue = org.apache.myfaces.shared.renderkit.RendererUtils.getConvertedStringValue(
                      facesContext, selectOne, converter, selectItem.getValue());
              boolean itemChecked = (itemStrValue == null) ? 
                      itemStrValue == currentValue : 
                      "".equals(itemStrValue) ? 
                              (currentValue == null || itemStrValue.equals(currentValue)) : 
                              itemStrValue.equals(currentValue);
              
              // IF the hideNoSelectionOption attribute of the component is true
              // AND this selectItem is the "no selection option"
              // AND there are currently selected items
              // AND this item (the "no selection option") is not selected
              if (HtmlRendererUtils.isHideNoSelectionOption(uiComponent) && selectItem.isNoSelectionOption() 
                      && currentValue != null && !"".equals(currentValue) && !itemChecked)
              {
                  // do not render this selectItem
                  return itemNum;
              }
              
              writer.write("\t\t");
              if (pageDirectionLayout)
              {
                  writer.startElement(HTML.TR_ELEM, null); // selectOne);
              }
              writer.startElement(HTML.TD_ELEM, null); // selectOne);
      
              boolean itemDisabled = selectItem.isDisabled();
      
              String itemId = renderRadio(facesContext, selectOne, itemStrValue, itemDisabled, 
                      itemChecked, false, itemNum);
      
              // label element after the input
              boolean componentDisabled = isDisabled(facesContext, selectOne);
              boolean disabled = (componentDisabled || itemDisabled);
      
              HtmlRendererUtils.renderLabel(writer, selectOne, itemId, selectItem, disabled);
      
              writer.endElement(HTML.TD_ELEM);
              if (pageDirectionLayout)
              {
                  writer.endElement(HTML.TR_ELEM);
              }
              
              // we rendered one radio --> increment itemNum
              itemNum++;
          }
          return itemNum;
      }