You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by lu...@apache.org on 2014/04/07 13:39:43 UTC

svn commit: r1585455 - in /myfaces/shared/trunk: ./ core/ core/src/main/java/org/apache/myfaces/shared/renderkit/html/ core/src/main/java/org/apache/myfaces/shared/renderkit/html/util/ core/src/main/java/org/apache/myfaces/shared/resource/ core/src/mai...

Author: lu4242
Date: Mon Apr  7 11:39:43 2014
New Revision: 1585455

URL: http://svn.apache.org/r1585455
Log:
synch shared with latest code

Added:
    myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/util/SelectItemInfo.java
    myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/util/SelectItemsUtils.java
    myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/resource/ContractResourceLoaderWrapper.java
Modified:
    myfaces/shared/trunk/core/pom.xml
    myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/CommonPropertyUtils.java
    myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlCheckboxRendererBase.java
    myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlRadioRendererBase.java
    myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlSelectableRendererBase.java
    myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/util/SelectItemsIterator.java
    myfaces/shared/trunk/pom.xml

Modified: myfaces/shared/trunk/core/pom.xml
URL: http://svn.apache.org/viewvc/myfaces/shared/trunk/core/pom.xml?rev=1585455&r1=1585454&r2=1585455&view=diff
==============================================================================
--- myfaces/shared/trunk/core/pom.xml (original)
+++ myfaces/shared/trunk/core/pom.xml Mon Apr  7 11:39:43 2014
@@ -143,7 +143,7 @@
     <profile>
       <id>synch-myfaces-impl-shared</id>
       <properties>
-        <myfaces.impl.shared.version>2.2.0-SNAPSHOT</myfaces.impl.shared.version>
+        <myfaces.impl.shared.version>2.2.3-SNAPSHOT</myfaces.impl.shared.version>
       </properties>
       <activation>
         <property>

Modified: myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/CommonPropertyUtils.java
URL: http://svn.apache.org/viewvc/myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/CommonPropertyUtils.java?rev=1585455&r1=1585454&r2=1585455&view=diff
==============================================================================
--- myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/CommonPropertyUtils.java (original)
+++ myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/CommonPropertyUtils.java Mon Apr  7 11:39:43 2014
@@ -105,6 +105,17 @@ public final class CommonPropertyUtils
                     HTML.STYLE_CLASS_ATTR, HTML.CLASS_ATTR);
         }
     }
+    
+    public static void renderStyleClassProperty(ResponseWriter writer,
+            long commonPropertiesMarked, UIComponent component)
+            throws IOException
+    {
+        if ((commonPropertiesMarked & CommonPropertyConstants.STYLECLASS_PROP) != 0)
+        {
+            HtmlRendererUtils.renderHTMLStringAttribute(writer, component,
+                    HTML.STYLE_CLASS_ATTR, HTML.CLASS_ATTR);
+        }
+    }
 
     public static void renderEventProperties(ResponseWriter writer,
             long commonPropertiesMarked, UIComponent component)

Modified: myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlCheckboxRendererBase.java
URL: http://svn.apache.org/viewvc/myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlCheckboxRendererBase.java?rev=1585455&r1=1585454&r2=1585455&view=diff
==============================================================================
--- myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlCheckboxRendererBase.java (original)
+++ myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlCheckboxRendererBase.java Mon Apr  7 11:39:43 2014
@@ -42,6 +42,8 @@ import javax.faces.model.SelectItemGroup
 
 import org.apache.myfaces.shared.renderkit.JSFAttr;
 import org.apache.myfaces.shared.renderkit.html.util.ResourceUtils;
+import org.apache.myfaces.shared.renderkit.html.util.SelectItemInfo;
+import org.apache.myfaces.shared.renderkit.html.util.SelectItemsUtils;
 
 public class HtmlCheckboxRendererBase extends HtmlRenderer
 {
@@ -74,7 +76,7 @@ public class HtmlCheckboxRendererBase ex
         {
             Boolean value = org.apache.myfaces.shared.renderkit.RendererUtils.getBooleanValue( uiComponent );
             boolean isChecked = value != null ? value.booleanValue() : false;
-            renderCheckbox(facesContext, uiComponent, EXTERNAL_TRUE_VALUE, false,isChecked, true, null); 
+            renderCheckbox(facesContext, uiComponent, EXTERNAL_TRUE_VALUE, uiComponent, false,isChecked, true, null); 
                 //TODO: the selectBoolean is never disabled
         }
         else if (uiComponent instanceof UISelectMany)
@@ -151,14 +153,16 @@ public class HtmlCheckboxRendererBase ex
 
         int itemNum = 0;
 
-        for (Iterator it = org.apache.myfaces.shared.renderkit.RendererUtils.getSelectItemList(
+        for (Iterator it = SelectItemsUtils.getSelectItemInfoList(
                 selectMany, facesContext)
                 .iterator(); it.hasNext();)
         {
-            SelectItem selectItem = (SelectItem) it.next();
+            SelectItemInfo selectItemInfo = (SelectItemInfo) it.next();
+            SelectItem selectItem = (SelectItem) selectItemInfo.getItem();
             
             itemNum = renderGroupOrItemCheckbox(facesContext, selectMany, 
-                                                selectItem, useSubmittedValues, lookupSet, 
+                                                selectItem, selectItemInfo.getComponent(),
+                                                useSubmittedValues, lookupSet, 
                                                 converter, pageDirectionLayout, itemNum);
         }
 
@@ -198,6 +202,17 @@ public class HtmlCheckboxRendererBase ex
                                              Converter converter, boolean pageDirectionLayout, 
                                              Integer itemNum) throws IOException
     {
+        return renderGroupOrItemCheckbox(facesContext, uiComponent, selectItem, null, useSubmittedValues, lookupSet, 
+                converter, pageDirectionLayout, itemNum);
+    }
+    
+    protected int renderGroupOrItemCheckbox(FacesContext facesContext,
+                                             UIComponent uiComponent, SelectItem selectItem, 
+                                             UIComponent selectItemComponent,
+                                             boolean useSubmittedValues, Set lookupSet,
+                                             Converter converter, boolean pageDirectionLayout, 
+                                             Integer itemNum) throws IOException
+    {
 
         ResponseWriter writer = facesContext.getResponseWriter();
 
@@ -289,7 +304,8 @@ public class HtmlCheckboxRendererBase ex
 
             boolean disabled = selectItem.isDisabled();
 
-            String itemId = renderCheckbox(facesContext, selectMany, itemStrValue, disabled, checked, false, itemNum);
+            String itemId = renderCheckbox(facesContext, selectMany, itemStrValue, selectItemComponent,
+                    disabled, checked, false, itemNum);
 
             // label element after the input
             boolean componentDisabled = isDisabled(facesContext, selectMany);
@@ -323,7 +339,16 @@ public class HtmlCheckboxRendererBase ex
      * @return the 'id' value of the rendered element
      */
     protected String renderCheckbox(FacesContext facesContext,
-            UIComponent uiComponent, String value, boolean disabled, boolean checked, 
+            UIComponent uiComponent, String value,
+            boolean disabled, boolean checked, 
+            boolean renderId, Integer itemNum) throws IOException
+    {
+        return renderCheckbox(facesContext, uiComponent, value, null, disabled, checked, renderId, itemNum);
+    }
+    
+    protected String renderCheckbox(FacesContext facesContext,
+            UIComponent uiComponent, String value, UIComponent selectItemComponent,
+            boolean disabled, boolean checked, 
             boolean renderId, Integer itemNum) throws IOException
     {
         String clientId = uiComponent.getClientId(facesContext);
@@ -333,7 +358,7 @@ public class HtmlCheckboxRendererBase ex
 
         ResponseWriter writer = facesContext.getResponseWriter();
 
-        writer.startElement(HTML.INPUT_ELEM, uiComponent);
+        writer.startElement(HTML.INPUT_ELEM, selectItemComponent);
 
         if (itemId != null)
         {

Modified: myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlRadioRendererBase.java
URL: http://svn.apache.org/viewvc/myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlRadioRendererBase.java?rev=1585455&r1=1585454&r2=1585455&view=diff
==============================================================================
--- myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlRadioRendererBase.java (original)
+++ myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlRadioRendererBase.java Mon Apr  7 11:39:43 2014
@@ -40,6 +40,8 @@ import javax.faces.model.SelectItemGroup
 import org.apache.myfaces.shared.renderkit.JSFAttr;
 import org.apache.myfaces.shared.renderkit.RendererUtils;
 import org.apache.myfaces.shared.renderkit.html.util.ResourceUtils;
+import org.apache.myfaces.shared.renderkit.html.util.SelectItemInfo;
+import org.apache.myfaces.shared.renderkit.html.util.SelectItemsUtils;
 
 public class HtmlRadioRendererBase
         extends HtmlRenderer
@@ -109,7 +111,7 @@ public class HtmlRadioRendererBase
         }
 
         Converter converter;
-        List selectItemList = org.apache.myfaces.shared.renderkit.RendererUtils.getSelectItemList(
+        List<SelectItemInfo> selectItemList = SelectItemsUtils.getSelectItemInfoList(
                 selectOne, facesContext);
         converter = HtmlRendererUtils.findUIOutputConverterFailSafe(facesContext, selectOne);
         
@@ -119,12 +121,13 @@ public class HtmlRadioRendererBase
 
         int itemNum = 0;
 
-        for (Iterator it = selectItemList.iterator(); it.hasNext(); )
+        for (Iterator<SelectItemInfo> it = selectItemList.iterator(); it.hasNext(); )
         {
-            SelectItem selectItem = (SelectItem)it.next();
+            SelectItemInfo selectItemInfo = (SelectItemInfo)it.next();
+            SelectItem selectItem = selectItemInfo.getItem();
 
             itemNum = renderGroupOrItemRadio(facesContext, selectOne,
-                                             selectItem, currentValue,
+                                             selectItem, selectItemInfo.getComponent(), currentValue,
                                              converter, pageDirectionLayout, itemNum);
         }
 
@@ -157,7 +160,6 @@ public class HtmlRadioRendererBase
          return (String)selectOne.getAttributes().get(JSFAttr.STYLE_CLASS_ATTR);
      }
 
-
     /**
      * Renders the given SelectItem(Group)
      * @return the itemNum for the next item
@@ -168,6 +170,17 @@ public class HtmlRadioRendererBase
                                          Converter converter, boolean pageDirectionLayout,
                                          Integer itemNum) throws IOException
     {
+        return renderGroupOrItemRadio(facesContext, uiComponent, selectItem, null, 
+                currentValue, converter, pageDirectionLayout, itemNum);
+    }
+
+    protected int renderGroupOrItemRadio(FacesContext facesContext,
+                                         UIComponent uiComponent, SelectItem selectItem, 
+                                         UIComponent selectItemComponent,
+                                         Object currentValue,
+                                         Converter converter, boolean pageDirectionLayout,
+                                         Integer itemNum) throws IOException
+    {
 
         ResponseWriter writer = facesContext.getResponseWriter();
 
@@ -264,7 +277,7 @@ public class HtmlRadioRendererBase
     
             boolean itemDisabled = selectItem.isDisabled();
     
-            String itemId = renderRadio(facesContext, selectOne, itemStrValue, itemDisabled, 
+            String itemId = renderRadio(facesContext, selectOne, itemStrValue, selectItemComponent, itemDisabled, 
                     itemChecked, false, itemNum);
     
             // label element after the input
@@ -297,6 +310,18 @@ public class HtmlRadioRendererBase
         renderRadio(facesContext, (UIInput) uiComponent, value, disabled, checked, renderId, 0);
     }
 
+    
+    protected String renderRadio(FacesContext facesContext,
+                               UIInput uiComponent,
+                               String value,
+                               boolean disabled,
+                               boolean checked,
+                               boolean renderId,
+                               Integer itemNum)
+            throws IOException
+    {
+        return renderRadio(facesContext, uiComponent, value, null, disabled, checked, renderId, itemNum);
+    }    
     /**
      * Renders the input item
      * @return the 'id' value of the rendered element
@@ -304,6 +329,7 @@ public class HtmlRadioRendererBase
     protected String renderRadio(FacesContext facesContext,
                                UIInput uiComponent,
                                String value,
+                               UIComponent selectItemComponent,
                                boolean disabled,
                                boolean checked,
                                boolean renderId,
@@ -317,7 +343,7 @@ public class HtmlRadioRendererBase
 
         ResponseWriter writer = facesContext.getResponseWriter();
 
-        writer.startElement(HTML.INPUT_ELEM, uiComponent);
+        writer.startElement(HTML.INPUT_ELEM, selectItemComponent);
 
         if (itemId != null)
         {

Modified: myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlSelectableRendererBase.java
URL: http://svn.apache.org/viewvc/myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlSelectableRendererBase.java?rev=1585455&r1=1585454&r2=1585455&view=diff
==============================================================================
--- myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlSelectableRendererBase.java (original)
+++ myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlSelectableRendererBase.java Mon Apr  7 11:39:43 2014
@@ -30,7 +30,8 @@ import javax.faces.component.behavior.Cl
 import javax.faces.context.FacesContext;
 import javax.faces.context.ResponseWriter;
 import javax.faces.convert.Converter;
-import org.apache.myfaces.shared.renderkit.RendererUtils;
+import org.apache.myfaces.shared.renderkit.html.util.SelectItemInfo;
+import org.apache.myfaces.shared.renderkit.html.util.SelectItemsUtils;
 
 public class HtmlSelectableRendererBase extends HtmlRenderer
 {
@@ -55,16 +56,15 @@ public class HtmlSelectableRendererBase 
         }
         writer.writeAttribute(HTML.NAME_ATTR,
                 uiComponent.getClientId(facesContext), null);
-        List selectItemList;
+        List<SelectItemInfo> selectItemList;
         if (selectMany)
         {
             writer.writeAttribute(HTML.MULTIPLE_ATTR, HTML.MULTIPLE_ATTR, null);
-            selectItemList = org.apache.myfaces.shared.renderkit.RendererUtils
-                    .getSelectItemList((UISelectMany) uiComponent, facesContext);
+            selectItemList = SelectItemsUtils.getSelectItemInfoList((UISelectMany) uiComponent, facesContext);
         }
         else
         {
-            selectItemList = RendererUtils.getSelectItemList(
+            selectItemList = SelectItemsUtils.getSelectItemInfoList(
                     (UISelectOne) uiComponent, facesContext);
         }
 
@@ -157,7 +157,7 @@ public class HtmlSelectableRendererBase 
         Set lookupSet = HtmlRendererUtils.getSubmittedOrSelectedValuesAsSet(selectMany,
                 uiComponent, facesContext, converter);
 
-        HtmlRendererUtils.renderSelectOptions(facesContext, uiComponent, converter, lookupSet,
+        SelectItemsUtils.renderSelectOptions(facesContext, uiComponent, converter, lookupSet,
                 selectItemList);
         // bug #970747: force separate end tag
         writer.writeText(HtmlRendererUtils.STR_EMPTY, null);

Added: myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/util/SelectItemInfo.java
URL: http://svn.apache.org/viewvc/myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/util/SelectItemInfo.java?rev=1585455&view=auto
==============================================================================
--- myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/util/SelectItemInfo.java (added)
+++ myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/util/SelectItemInfo.java Mon Apr  7 11:39:43 2014
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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 org.apache.myfaces.shared.renderkit.html.util;
+
+import javax.faces.component.UIComponent;
+import javax.faces.model.SelectItem;
+
+/**
+ *
+ * @author lu4242
+ */
+public class SelectItemInfo
+{
+    private final SelectItem item;
+    
+    private final UIComponent component;
+
+    public SelectItemInfo(SelectItem item, UIComponent component)
+    {
+        this.item = item;
+        this.component = component;
+    }
+
+    /**
+     * @return the item
+     */
+    public SelectItem getItem()
+    {
+        return item;
+    }
+
+    /**
+     * @return the component
+     */
+    public UIComponent getComponent()
+    {
+        return component;
+    }
+    
+}

Added: myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/util/SelectItemsUtils.java
URL: http://svn.apache.org/viewvc/myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/util/SelectItemsUtils.java?rev=1585455&view=auto
==============================================================================
--- myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/util/SelectItemsUtils.java (added)
+++ myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/util/SelectItemsUtils.java Mon Apr  7 11:39:43 2014
@@ -0,0 +1,222 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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 org.apache.myfaces.shared.renderkit.html.util;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+import javax.faces.component.UIComponent;
+import javax.faces.component.UISelectMany;
+import javax.faces.component.UISelectOne;
+import javax.faces.context.FacesContext;
+import javax.faces.context.ResponseWriter;
+import javax.faces.convert.Converter;
+import javax.faces.model.SelectItem;
+import javax.faces.model.SelectItemGroup;
+import org.apache.myfaces.shared.component.EscapeCapable;
+import org.apache.myfaces.shared.renderkit.JSFAttr;
+import org.apache.myfaces.shared.renderkit.RendererUtils;
+import org.apache.myfaces.shared.renderkit.html.HTML;
+import static org.apache.myfaces.shared.renderkit.html.HtmlRendererUtils.isHideNoSelectionOption;
+import org.apache.myfaces.shared.util.SelectItemsIterator;
+
+/**
+ * Utility methods to manipulate SelectItem/SelectItems
+ */
+public class SelectItemsUtils
+{
+    private static final char TABULATOR = '\t';
+
+    public static List<SelectItemInfo> getSelectItemInfoList(UISelectMany uiSelectMany,
+            FacesContext facesContext)
+    {
+        List<SelectItemInfo> list = new ArrayList<SelectItemInfo>();
+
+        for (SelectItemsIterator iter = new SelectItemsIterator(uiSelectMany, facesContext); iter
+                .hasNext();)
+        {
+            list.add(new SelectItemInfo(iter.next(), iter.getCurrentComponent()));
+        }
+        return list;
+    }
+
+    public static List<SelectItemInfo> getSelectItemInfoList(UISelectOne uiSelectOne,
+            FacesContext facesContext)
+    {
+        List<SelectItemInfo> list = new ArrayList<SelectItemInfo>();
+        for (SelectItemsIterator iter = new SelectItemsIterator(uiSelectOne, facesContext); iter
+                .hasNext();)
+        {
+            list.add(new SelectItemInfo(iter.next(), iter.getCurrentComponent()));
+        }
+        return list;
+    }
+    
+public static void renderSelectOptions(FacesContext context,
+            UIComponent component, Converter converter, Set lookupSet,
+            List<SelectItemInfo> selectItemList) throws IOException
+    {
+        ResponseWriter writer = context.getResponseWriter();
+        // check for the hideNoSelectionOption attribute
+        boolean hideNoSelectionOption = isHideNoSelectionOption(component);
+        boolean componentDisabled = isTrue(component.getAttributes()
+                .get("disabled"));
+
+        for (Iterator<SelectItemInfo> it = selectItemList.iterator(); it.hasNext();)
+        {
+            SelectItemInfo selectItemInfo = it.next();
+            SelectItem selectItem = selectItemInfo.getItem();
+            if (selectItem instanceof SelectItemGroup)
+            {
+                writer.startElement(HTML.OPTGROUP_ELEM, selectItemInfo.getComponent()); // component);
+                writer.writeAttribute(HTML.LABEL_ATTR, selectItem.getLabel(),
+                        null);
+                SelectItem[] selectItems = ((SelectItemGroup) selectItem)
+                        .getSelectItems();
+                List<SelectItemInfo> selectItemsGroupList = new ArrayList<SelectItemInfo>(selectItems.length);
+                for (SelectItem item : selectItems)
+                {
+                    selectItemsGroupList.add(new SelectItemInfo(item, null));
+                }
+                renderSelectOptions(context, component, converter, lookupSet,
+                        selectItemsGroupList);
+                writer.endElement(HTML.OPTGROUP_ELEM);
+            }
+            else
+            {
+                String itemStrValue = org.apache.myfaces.shared.renderkit.RendererUtils
+                        .getConvertedStringValue(context, component, converter,
+                                selectItem);
+                boolean selected = lookupSet.contains(itemStrValue); 
+                //TODO/FIX: we always compare the String vales, better fill lookupSet with Strings 
+                //only when useSubmittedValue==true, else use the real item value Objects
+
+                // 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 there is currently no value on UISelectOne, lookupSet contains "")
+                if (hideNoSelectionOption && selectItem.isNoSelectionOption()
+                        && lookupSet.size() != 0
+                        && !(lookupSet.size() == 1 && lookupSet.contains(""))
+                        && !selected)
+                {
+                    // do not render this selectItem
+                    continue;
+                }
+
+                writer.write(TABULATOR);
+                writer.startElement(HTML.OPTION_ELEM, selectItemInfo.getComponent()); // component);
+                if (itemStrValue != null)
+                {
+                    writer.writeAttribute(HTML.VALUE_ATTR, itemStrValue, null);
+                }
+                else
+                {
+                    writer.writeAttribute(HTML.VALUE_ATTR, "", null);
+                }
+
+                if (selected)
+                {
+                    writer.writeAttribute(HTML.SELECTED_ATTR, HTML.SELECTED_ATTR, null);
+                }
+
+                boolean disabled = selectItem.isDisabled();
+                if (disabled)
+                {
+                    writer.writeAttribute(HTML.DISABLED_ATTR, HTML.DISABLED_ATTR, null);
+                }
+
+                String labelClass = null;
+
+                if (componentDisabled || disabled)
+                {
+                    labelClass = (String) component.getAttributes().get(
+                            JSFAttr.DISABLED_CLASS_ATTR);
+                }
+                else
+                {
+                    labelClass = (String) component.getAttributes().get(
+                            JSFAttr.ENABLED_CLASS_ATTR);
+                }
+                if (labelClass != null)
+                {
+                    writer.writeAttribute("class", labelClass, "labelClass");
+                }
+
+                boolean escape;
+                if (component instanceof EscapeCapable)
+                {
+                    escape = ((EscapeCapable) component).isEscape();
+
+                    // Preserve tomahawk semantic. If escape=false
+                    // all items should be non escaped. If escape
+                    // is true check if selectItem.isEscape() is
+                    // true and do it.
+                    // This is done for remain compatibility.
+                    if (escape && selectItem.isEscape())
+                    {
+                        writer.writeText(selectItem.getLabel(), null);
+                    }
+                    else
+                    {
+                        writer.write(selectItem.getLabel());
+                    }
+                }
+                else
+                {
+                    escape = RendererUtils.getBooleanAttribute(component,
+                            JSFAttr.ESCAPE_ATTR, false);
+                    //default is to escape
+                    //In JSF 1.2, when a SelectItem is created by default 
+                    //selectItem.isEscape() returns true (this property
+                    //is not available on JSF 1.1).
+                    //so, if we found a escape property on the component
+                    //set to true, escape every item, but if not
+                    //check if isEscape() = true first.
+                    if (escape || selectItem.isEscape())
+                    {
+                        writer.writeText(selectItem.getLabel(), null);
+                    }
+                    else
+                    {
+                        writer.write(selectItem.getLabel());
+                    }
+                }
+
+                writer.endElement(HTML.OPTION_ELEM);
+            }
+        }
+    }
+
+    private static boolean isTrue(Object obj)
+    {
+        if (obj instanceof String)
+        {
+            return Boolean.valueOf((String) obj);
+        }
+        if (!(obj instanceof Boolean))
+        {
+            return false;
+        }
+        return ((Boolean) obj).booleanValue();
+    }
+}

Added: myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/resource/ContractResourceLoaderWrapper.java
URL: http://svn.apache.org/viewvc/myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/resource/ContractResourceLoaderWrapper.java?rev=1585455&view=auto
==============================================================================
--- myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/resource/ContractResourceLoaderWrapper.java (added)
+++ myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/resource/ContractResourceLoaderWrapper.java Mon Apr  7 11:39:43 2014
@@ -0,0 +1,132 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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 org.apache.myfaces.shared.resource;
+
+import java.io.InputStream;
+import java.net.URL;
+import java.util.Comparator;
+import javax.faces.FacesWrapper;
+
+/**
+ *
+ */
+public abstract class ContractResourceLoaderWrapper extends ContractResourceLoader
+    implements FacesWrapper<ContractResourceLoader>
+{
+
+    public ContractResourceLoaderWrapper()
+    {
+        super(null);
+    }
+
+    @Override
+    public String getResourceVersion(String path, String contractName)
+    {
+        return getWrapped().getResourceVersion(path, contractName);
+    }
+
+    @Override
+    public String getLibraryVersion(String path, String contractName)
+    {
+        return getWrapped().getLibraryVersion(path, contractName);
+    }
+
+    @Override
+    public ResourceMeta createResourceMeta(String prefix, String libraryName, 
+        String libraryVersion, String resourceName, String resourceVersion, String contractName)
+    {
+        return getWrapped().createResourceMeta(prefix, libraryName, 
+            libraryVersion, resourceName, resourceVersion, contractName);
+    }
+
+    @Override
+    public boolean libraryExists(String libraryName, String contractName)
+    {
+        return getWrapped().libraryExists(libraryName, contractName);
+    }
+
+    @Override
+    public URL getResourceURL(ResourceMeta resourceMeta)
+    {
+        return getWrapped().getResourceURL(resourceMeta);
+    }
+
+    @Override
+    public InputStream getResourceInputStream(ResourceMeta resourceMeta)
+    {
+        return getWrapped().getResourceInputStream(resourceMeta);
+    }
+
+    @Override
+    public boolean libraryExists(String libraryName)
+    {
+        return getWrapped().libraryExists(libraryName);
+    }
+
+    @Override
+    public ResourceMeta createResourceMeta(String prefix, String libraryName, 
+        String libraryVersion, String resourceName, String resourceVersion)
+    {
+        return getWrapped().createResourceMeta(prefix, libraryName, 
+            libraryVersion, resourceName, resourceVersion);
+    }
+
+    @Override
+    public String getLibraryVersion(String path)
+    {
+        return getWrapped().getLibraryVersion(path);
+    }
+
+    @Override
+    public String getResourceVersion(String path)
+    {
+        return getWrapped().getResourceVersion(path);
+    }
+
+    @Override
+    public void setPrefix(String prefix)
+    {
+        getWrapped().setPrefix(prefix);
+    }
+
+    @Override
+    public String getPrefix()
+    {
+        return getWrapped().getPrefix();
+    }
+
+    @Override
+    protected void setVersionComparator(Comparator<String> versionComparator)
+    {
+        getWrapped().setVersionComparator(versionComparator);
+    }
+
+    @Override
+    protected Comparator<String> getVersionComparator()
+    {
+        return getWrapped().getVersionComparator();
+    }
+
+    @Override
+    public boolean resourceExists(ResourceMeta resourceMeta)
+    {
+        return getWrapped().resourceExists(resourceMeta);
+    }
+
+}

Modified: myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/util/SelectItemsIterator.java
URL: http://svn.apache.org/viewvc/myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/util/SelectItemsIterator.java?rev=1585455&r1=1585454&r2=1585455&view=diff
==============================================================================
--- myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/util/SelectItemsIterator.java (original)
+++ myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/util/SelectItemsIterator.java Mon Apr  7 11:39:43 2014
@@ -58,6 +58,7 @@ public class SelectItemsIterator impleme
     private final Iterator<UIComponent> _children;
     private Iterator<? extends Object> _nestedItems;
     private SelectItem _nextItem;
+    private UIComponent _currentComponent;
     private UISelectItems _currentUISelectItems;
     private FacesContext _facesContext;
 
@@ -83,6 +84,7 @@ public class SelectItemsIterator impleme
                 return true;
             }
             _nestedItems = null;
+            _currentComponent = null;
         }
         if (_children.hasNext())
         {
@@ -136,12 +138,14 @@ public class SelectItemsIterator impleme
                             + " does not reference an Object of type SelectItem");
                 }
                 _nextItem = (SelectItem) item;
+                _currentComponent = child;
                 return true;
             }
             else if (child instanceof UISelectItems)
             {
                 _currentUISelectItems = ((UISelectItems) child);
                 Object value = _currentUISelectItems.getValue();
+                _currentComponent = child;
 
                 if (value instanceof SelectItem)
                 {
@@ -201,6 +205,10 @@ public class SelectItemsIterator impleme
                     }
                 }
             }
+            else
+            {
+                _currentComponent = null;
+            }
         }
         return false;
     }
@@ -300,6 +308,11 @@ public class SelectItemsIterator impleme
         throw new UnsupportedOperationException();
     }
     
+    public UIComponent getCurrentComponent()
+    {
+        return _currentComponent;
+    }
+
     private boolean getBooleanAttribute(UIComponent component, String attrName, boolean defaultValue)
     {
         Object value = component.getAttributes().get(attrName);

Modified: myfaces/shared/trunk/pom.xml
URL: http://svn.apache.org/viewvc/myfaces/shared/trunk/pom.xml?rev=1585455&r1=1585454&r2=1585455&view=diff
==============================================================================
--- myfaces/shared/trunk/pom.xml (original)
+++ myfaces/shared/trunk/pom.xml Mon Apr  7 11:39:43 2014
@@ -127,7 +127,7 @@
     <dependency>
       <groupId>org.apache.myfaces.core</groupId>
       <artifactId>myfaces-api</artifactId>
-      <version>2.2.0-beta</version>
+      <version>2.2.0</version>
       <scope>provided</scope>
     </dependency>