private DataRow extractDataRow(final ReportEvent event) {
    if (event.isDeepTraversing() == false) {
      return getDataRow();
    }

    return event.getOriginatingState().getDataRow();
  }
  /**
   * Receives notification that a row of data is being processed.
   *
   * @param event the event.
   */
  public void itemsAdvanced(final ReportEvent event) {
    if (event.isDeepTraversing()) {
      if ("index".equals(event.getOriginatingState().getReport().getMetaData().getName())) {
        return;
      }
    }

    final Object o = computeDataValue(event);
    if (o == null) {
      return;
    }

    if (FunctionUtilities.isDefinedPrepareRunLevel(this, event)) {
      dataStorage.put(String.valueOf(o), new IndexDataHolder(o));
    } else if (FunctionUtilities.isLayoutLevel(event)) {
      final IndexDataHolder o1 = dataStorage.get(String.valueOf(o));
      if (o1 == null) {
        throw new IllegalStateException(
            "Unable to compute index: Function values changed between prepare and layout run");
      }
      o1.addPage(pageFunction.getPage());
    }
  }