@Override
  public void encodeMetaComponent(
      FacesContext facesContext, UIComponent component, String metaComponentId) throws IOException {
    AbstractCollapsibleSubTable subTable = (AbstractCollapsibleSubTable) component;

    if (AbstractCollapsibleSubTable.BODY.equals(metaComponentId)) {
      ResponseWriter writer = facesContext.getResponseWriter();
      UIDataTableBase dataTableBase = findParent(subTable);

      String updateId =
          dataTableBase.getRelativeClientId(facesContext) + ":" + subTable.getId() + TB_ROW;

      partialStart(facesContext, updateId);
      encodeTableRows(writer, facesContext, subTable, false);
      partialEnd(facesContext);
    }
  }
  @Override
  public void encodeTableBodyStart(
      ResponseWriter writer, FacesContext facesContext, UIDataTableBase dataTableBase)
      throws IOException {
    AbstractCollapsibleSubTable subTable = (AbstractCollapsibleSubTable) dataTableBase;

    UIDataTableBase component = findParent(subTable);
    if (component instanceof AbstractDataTable) {
      writer.startElement(HtmlConstants.TBODY_ELEMENT, null);
      writer.writeAttribute(
          HtmlConstants.ID_ATTRIBUTE,
          component.getRelativeClientId(facesContext) + ":" + subTable.getId() + TB_ROW,
          null);
      writer.writeAttribute(HtmlConstants.CLASS_ATTRIBUTE, getTableSkinClass(), null);

      String predefinedStyles = !subTable.isExpanded() ? DISPLAY_NONE : null;
      encodeStyle(writer, facesContext, subTable, predefinedStyles);
    }
  }