Hi,

I was able to create a (not really) simple example to reproduce the described 
behavior but with two differences: First, I
get only the second exception and second, the exception is also thrown with 
myFaces 1.1.4. With a really simple
example there's no problem. But life isn't such simple like tests and demos...


Here comes the source code:

test.jsp

<%@ taglib uri="http://myfaces.apache.org/tobago/component"; prefix="tc" 
%><%@ taglib uri="http://java.sun.com/jsf/core"; prefix="f" 
%><%@ page contentType="text/html;charset=UTF-8" language="java" 
%><%@ page pageEncoding="UTF-8" 
%><f:view
 ><tc:page id="testPage1" width="300px" height="200px">
    <tc:button label="Foreach test" 
      action="#{controller.foreachTest}" />      
  </tc:page>
</f:view>

foreach.jsp

<%@ taglib uri="http://myfaces.apache.org/tobago/component"; prefix="tc" 
%><%@ taglib uri="http://java.sun.com/jsf/core"; prefix="f" 
%><%@ page contentType="text/html;charset=UTF-8" language="java" 
%><%@ page pageEncoding="UTF-8" 
%><f:view
 ><tc:page id="testPage2" width="300px" height="200px">
    <jsp:include page="foreach1.jsp"/>
  </tc:page>
</f:view>

foreach1.jsp

<%@ taglib uri="http://myfaces.apache.org/tobago/component"; prefix="tc" 
%><%@ taglib uri="http://java.sun.com/jsf/core"; prefix="f" 
%><%@ page contentType="text/html;charset=UTF-8" language="java" 
%><%@ taglib uri="http://java.sun.com/jsp/jstl/core"; prefix="c" 
%><%@ page pageEncoding="UTF-8" 
%><f:subview id="foreachView"
 ><tc:panel>
    <f:facet name="layout">
      <tc:gridLayout rows="fixed;*"/>
    </f:facet>
    <%@ include file="foreach2.jsp" %>
    <tc:cell/>
  </tc:panel>
</f:subview>

foreach2.jsp

<%@ page pageEncoding="UTF-8" %>
  <tc:panel id="foreachPanel">

    <f:facet name="layout">
      <tc:gridLayout
        rows="fixed;#{controller.layoutRows}fixed"
        columns="1*;1*"/>
    </f:facet>
    
    <tc:label value="Column 1"/>
    <tc:label value="Column 2"/>
    
    <c:forEach items="${controller.list}" 
      varStatus="status" begin="0">
      <tc:panel id="panel_${status.index}">
        <f:facet name="layout">
          <tc:gridLayout cellspacing="0" 
            rows="fixed"
            columns="1*;1*"/>
        </f:facet>            
        <tc:in id="column1_${status.index}_1" 
          rendered="true"
          value="#{controller.list[${status.index}].column1}"/>
        <tc:in id="column1_${status.index}_2" 
          rendered="false"
          value="#{controller.list[${status.index}].column1}"/>
      </tc:panel>
      <tc:in id="column2_${status.index}" 
        value="#{controller.list[${status.index}].column2}"/>
    </c:forEach>

    <tc:button id="insertButton" 
      label="insert"
      action="#{controller.insert}"/>
    <tc:button id="deleteButton" 
      label="delete"
      action="#{controller.delete}"/>
    
  </tc:panel>

Controller.java

package de.wlps.test.tobago;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class Controller {
  
  private static final Log LOG = LogFactory.getLog(Controller.class);

  private List<Row> list = new ArrayList<Row>();

  public Controller() {
    LOG.debug("Controller");
    list.add(new Row("Value 1/1", "Value 2/1"));
  }
  
  public String foreachTest() {
    LOG.debug("foreachTest");
    return "foreach";
  }

  public String insert() {
    LOG.debug("insert");
    list.add(new Row("Value 1/" + (list.size()+1), "Value 2/" + 
(list.size()+1)));
    return "foreach";
  }

  public String delete() {
    LOG.debug("delete");
    if (list.size() > 0) {
      list.remove(list.size() - 1);
    }
    return "foreach";
  }
  
  public List<Row> getList() {
    LOG.debug("getList");
    return list;
  }
  
  public String getLayoutRows() {
    LOG.debug("getLayoutRows");
    String rows = "";
    for (int i = 0; i < list.size(); i++) {
      rows += "fixed;";
    }
    return rows;
  }
  
  public class Row {
    
    private String column1;
    private String column2;
    
    
    public Row(String column1, String column2) {
      super();
      this.column1 = column1;
      this.column2 = column2;
    }
    
    public String getColumn1() {
      return column1;
    }
    
    public void setColumn1(String column1) {
      this.column1 = column1;
    }
    
    public String getColumn2() {
      return column2;
    }
    
    public void setColumn2(String column2) {
      this.column2 = column2;
    }
    
  }
}

faces-config.xml

<faces-config>

  <application>
    <locale-config>
      <default-locale>en</default-locale>
      <supported-locale>de</supported-locale>
    </locale-config>
  </application>
  
  <managed-bean>
    <managed-bean-name>controller</managed-bean-name>
    <managed-bean-class>de.wlps.test.tobago.Controller</managed-bean-class>
    <managed-bean-scope>session</managed-bean-scope>
  </managed-bean>

  <navigation-rule>
    <from-view-id>/test.jsp</from-view-id>
    <navigation-case>
    <from-outcome>foreach</from-outcome>
    <to-view-id>/foreach.jsp</to-view-id>
    </navigation-case>
  </navigation-rule>

</faces-config>


Start with test.jsp, press the "Foreach test" button and then press the 
"insert" button. This should insert a new row
in the list. But you will get this exception:

2007-04-27 17:47:07 http-8080-Processor23 ERROR - 
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/tobago-test].[jsp]:704
 - Servlet.ser
vice() for servlet jsp threw exception
java.lang.IllegalStateException: Client-id : _idJsp6 is duplicated in the faces 
tree. Component : testPage2:foreachView:_idJsp6, path: {Component-Path
 : [Class: org.apache.myfaces.tobago.component.UIViewRoot,ViewId: 
/foreach.jsp][Class: org.apache.myfaces.tobago.component.UIPage,Id: 
testPage2][Class
: javax.faces.component.UINamingContainer,Id: foreachView][Class: 
org.apache.myfaces.tobago.component.UIPanel,Id: _idJsp0][Class: 
org.apache.myfaces.t
obago.component.UICell,Id: _idJsp6]}
        at 
org.apache.myfaces.application.jsp.JspStateManagerImpl.checkForDuplicateIds(JspStateManagerImpl.java:350)


Because the duplicate id is a generated id there must be a problem with the id 
generator or with the foreach tag.
If you make the example simplier, for example remove the panel in the foreach 
loop or remove one of the includes,
the problem disappers.

Maybe this problem has nothing to do with Tobago. If so, please forward it to 
the myFaces developers.

Regards
Helmut


  ----- Original Message ----- 
  From: Helmut Swaczinna 
  To: users@myfaces.apache.org 
  Sent: Wednesday, April 25, 2007 3:55 PM
  Subject: [Tobago] c:forEach doesn't work anymore with myFaces 1.1.5


  Hi,

  I use the c:forEach tag in some pages and it worked with myFaces 1.1.4. Now I 
had to switch to myFaces 1.1.5
  (because there was an other bug with Tobago and myFaces 1.1.4) and it doesn't 
work anymore. When the page is
  displayed for the first time everything is ok. But when the number of rows in 
the underlying list changes and the
  page is redisplayed I always get an exception:

  java.lang.ArrayIndexOutOfBoundsException: 5
          at 
org.apache.myfaces.tobago.util.LayoutInfo.getSpaceForColumn(LayoutInfo.java:206)
          at 
org.apache.myfaces.tobago.renderkit.html.scarborough.standard.tag.GridLayoutRenderer.setColumnWidths(GridLayoutRenderer.java:706)
          at 
org.apache.myfaces.tobago.renderkit.html.scarborough.standard.tag.GridLayoutRenderer.layoutWidth(GridLayoutRenderer.java:543)
          at 
org.apache.myfaces.tobago.renderkit.html.scarborough.standard.tag.GridLayoutRenderer.layoutEnd(GridLayoutRenderer.java:493)
          at 
org.apache.myfaces.tobago.renderkit.html.scarborough.standard.tag.GridLayoutRenderer.encodeChildrenOfComponent(GridLayoutRenderer.java:233)

  or

  java.lang.IllegalStateException: Client-id : _idJsp350 is duplicated in the 
faces tree. Component : editPage:detailView:anteileView2:_idJsp350, path:
  {Component-Path : [Class: 
org.apache.myfaces.tobago.component.UIViewRoot,ViewId: /edit.jsp][Class: 
org.apache.myfaces.tobago.component.UIPage,Id: edit
  Page][Class: org.apache.myfaces.tobago.component.UIPanel,Id: panel][Class: 
org.apache.myfaces.tobago.component.UIPanel,Id: mainPanel][Class: org.apach
  e.myfaces.tobago.component.UICell,Id: _idJsp86][Class: 
javax.faces.component.UINamingContainer,Id: detailView][Class: 
org.apache.myfaces.tobago.compon
  ent.UIPanel,Id: panel][Class: 
org.apache.myfaces.tobago.component.UITabGroup,Id: _idJsp87][Class: 
org.apache.myfaces.tobago.component.UIPanel,Id: ante
  ileTab][Class: javax.faces.component.UINamingContainer,Id: 
anteileView2][Class: org.apache.myfaces.tobago.component.UIPanel,Id: 
panel][Class: org.apac
  he.myfaces.tobago.component.UIPanel,Id: copartnerPanel][Class: 
org.apache.myfaces.tobago.component.UICell,Id: _idJsp349][Class: 
org.apache.myfaces.tob
  ago.component.UIPanel,Id: _idJsp350]}
          at 
org.apache.myfaces.application.jsp.JspStateManagerImpl.checkForDuplicateIds(JspStateManagerImpl.java:329)


  Do I have to change my code when I switch to myFaces 1.1.5? Do I need a new 
jstl version?
  I'm using jstl 1.1.0 and Tobago 1.0.11 snapshot from a week ago.

  Regards
  Helmut


Reply via email to