IndexOutOfBoundsException in custom compound compoment
------------------------------------------------------

                 Key: MYFACES-1783
                 URL: https://issues.apache.org/jira/browse/MYFACES-1783
             Project: MyFaces Core
          Issue Type: Bug
    Affects Versions:  1.2.0
         Environment: Windows XP, java 1.6.0_03
myfaces 1.2.1-SNAPSHOT and 1.2.0 on jetty-6.1.0pre0
            Reporter: Jeroen Verhagen
             Fix For: 1.2.1-SNAPSHOT


The following code for a custom (compound) component causes and 
IndexOutOfBoundsException on submit. It renders OK.  

 package com.mycompany;

import javax.el.ELContext;
import javax.el.ExpressionFactory;
import javax.el.ValueExpression;
import javax.faces.application.Application;
import javax.faces.component.EditableValueHolder;
import javax.faces.component.UIComponent;
import javax.faces.component.UIInput;
import javax.faces.component.UISelectItems;
import javax.faces.component.html.HtmlSelectOneRadio;
import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;
import javax.faces.convert.BooleanConverter;
import javax.faces.model.SelectItem;
import java.io.IOException;
import java.util.Map;

public class UIBooleanFieldset extends UIInput {

        public UIBooleanFieldset() {
                setConverter(new BooleanConverter());
                setRendererType(null);

                Application application = 
FacesContext.getCurrentInstance().getApplication();
                HtmlSelectOneRadio htmlSelectOneRadio = (HtmlSelectOneRadio) 
application.createComponent(HtmlSelectOneRadio.COMPONENT_TYPE);

                htmlSelectOneRadio.setId(getId() + "_radios");
                ExpressionFactory ef = 
FacesContext.getCurrentInstance().getApplication().getExpressionFactory();
                ELContext elContext = 
FacesContext.getCurrentInstance().getELContext();
                ValueExpression sexValueExpression = 
ef.createValueExpression(elContext, "#{persoonBean.sex}", String.class);
                htmlSelectOneRadio.setValueExpression("value", 
sexValueExpression);
                htmlSelectOneRadio.setLayout("pageDirection");

                UISelectItems selectItems = (UISelectItems) 
application.createComponent(UISelectItems.COMPONENT_TYPE);
                ValueExpression sexItemsValueExpression = 
ef.createValueExpression(elContext, "#{persoonBean.sexItems}", 
SelectItem[].class);
                selectItems.setValueExpression("value", 
sexItemsValueExpression);

                htmlSelectOneRadio.getChildren().add(selectItems);
                getChildren().add(htmlSelectOneRadio);
        }


        public void encodeBegin(FacesContext context) throws IOException {
                ResponseWriter writer = context.getResponseWriter();
                String clientId = getClientId(context);

                writer.startElement("fieldset", this);
                writer.startElement("legend", this);
                writer.writeText(getAttributes().get("legend"), this, clientId);

        }

        public void encodeEnd(FacesContext context) throws IOException {
                ResponseWriter writer = context.getResponseWriter();
                writer.endElement("legend");
                writer.endElement("fieldset");
        }

        public void decode(FacesContext context, UIComponent component) {
                EditableValueHolder fieldset = (EditableValueHolder) component;
                Map<String, String> requestMap = 
context.getExternalContext().getRequestParameterMap();
                String clientId = component.getClientId(context);

                try {
                        int submittedValue = Integer.parseInt((String) 
requestMap.get(clientId));

                        int newValue = 0;
                        fieldset.setSubmittedValue("" + newValue);
                        fieldset.setValid(true);
                } catch (NumberFormatException ex) {
                        // let the converter take care of bad input, but we 
still have
                        // to set the submitted value, or the converter won't 
have
                        // any input to deal with
                        fieldset.setSubmittedValue((String) 
requestMap.get(clientId));
                }
        }

}


The exception:

ava.lang.IndexOutOfBoundsException: Index: 1, Size: 1
       at java.util.ArrayList.RangeCheck(ArrayList.java:546)
       at java.util.ArrayList.get(ArrayList.java:321)
       at 
javax.faces.component.UIComponentBase.processRestoreState(UIComponentBase.java:740)
       at 
javax.faces.component.UIComponentBase.processRestoreState(UIComponentBase.java:743)
       at 
javax.faces.component.UIComponentBase.processRestoreState(UIComponentBase.java:743)
       at 
org.apache.myfaces.application.jsp.JspStateManagerImpl.restoreView(JspStateManagerImpl.java:300)
       at 
org.apache.myfaces.application.jsp.JspViewHandlerImpl.restoreView(JspViewHandlerImpl.java:354)
       at 
org.apache.myfaces.lifecycle.RestoreViewExecutor.execute(RestoreViewExecutor.java:85)
       at 
org.apache.myfaces.lifecycle.LifecycleImpl.executePhase(LifecycleImpl.java:95)
       at 
org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:70)
       at javax.faces.webapp.FacesServlet.service(FacesServlet.java:137)
       at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487)

I had similar problems using Sun RI jsf-impl 1.2-b19 and jsf-api 1.2_02.


-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to