public void encodeRow(ResponseWriter writer, FacesContext facesContext, RowHolderBase holder)
      throws IOException {
    RowHolder rowHolder = (RowHolder) holder;
    Row row = rowHolder.getRow();
    putRowStylesIntoContext(facesContext, rowHolder);
    rowHolder.setRowStart(true);
    Iterator<UIComponent> components = row.columns();
    if (rowHolder.isUpdatePartial()) {
      partialStart(
          facesContext,
          ((AbstractCollapsibleSubTable) row).getRelativeClientId(facesContext) + ":b");
    }

    int columnNumber = 0;
    while (components.hasNext()) {
      UIComponent component = components.next();
      if (component.isRendered()) {
        if (component instanceof UIColumn) {
          component.getAttributes().put(COLUMN_CLASS, getColumnClass(rowHolder, columnNumber));
          encodeColumn(facesContext, writer, (UIColumn) component, rowHolder);
          columnNumber++;
        } else if (component instanceof AbstractCollapsibleSubTable) {
          if (component.isRendered()) {
            encodeRowEnd(writer);
          }

          component.encodeAll(facesContext);
          rowHolder.setRowStart(true);
        }
      }
    }

    encodeRowEnd(writer);

    if (rowHolder.isUpdatePartial()) {
      partialEnd(facesContext);
    }
  }