/**
   * Check to ensure that a docbook row has the required number of columns for a table.
   *
   * @param row The DOM row element to be checked.
   * @param numColumns The number of entry elements that should exist in the row.
   * @return True if the row has the required number of entries, otherwise false.
   */
  public static boolean validateTableRow(final Node row, final int numColumns) {
    assert row != null;
    assert row.getNodeName().equals("row") || row.getNodeName().equals("tr");

    if (row.getNodeName().equals("row")) {
      final List<Node> entries = XMLUtilities.getDirectChildNodes(row, "entry");
      final List<Node> entryTbls = XMLUtilities.getDirectChildNodes(row, "entrytbl");

      if ((entries.size() + entryTbls.size()) <= numColumns) {
        for (final Node entryTbl : entryTbls) {
          if (!validateEntryTbl((Element) entryTbl)) return false;
        }
        return true;
      } else {
        return false;
      }
    } else {
      final List<Node> nodes = XMLUtilities.getDirectChildNodes(row, "td", "th");

      return nodes.size() <= numColumns;
    }
  }
  /**
   * Check to ensure that a Docbook tgroup isn't missing an row entries, using number of cols
   * defined for the tgroup.
   *
   * @param tgroup The DOM tgroup element to be checked.
   * @return True if the tgroup has the required number of entries, otherwise false.
   */
  public static boolean validateTableGroup(final Element tgroup) {
    assert tgroup != null;
    assert tgroup.getNodeName().equals("tgroup");

    final Integer numColumns = Integer.parseInt(tgroup.getAttribute("cols"));

    // Check that all the thead, tbody and tfoot elements have the correct number of entries.
    final List<Node> nodes = XMLUtilities.getDirectChildNodes(tgroup, "thead", "tbody", "tfoot");
    for (final Node ele : nodes) {
      // Find all child nodes that are a row
      final NodeList children = ele.getChildNodes();
      for (int i = 0; i < children.getLength(); i++) {
        final Node node = children.item(i);
        if (node.getNodeName().equals("row") || node.getNodeName().equals("tr")) {
          if (!validateTableRow(node, numColumns)) return false;
        }
      }
    }

    return true;
  }