public TupleDescriptor buildDescriptor(ExecRow row, TupleDescriptor parentDesc, DataDictionary dd)
      throws StandardException {

    if (SanityManager.DEBUG) {
      SanityManager.ASSERT(
          row.nColumns() == ASYNCEEVENTLISTENERS_COLUMN_COUNT,
          "Wrong number of columns for a ASYNCEEVENTLISTENERS row");
    }

    DataValueDescriptor col;
    UUID id;

    col = row.getColumn(SENDER_ID);
    String senderId = col.getString();

    id = getUUIDFactory().recreateUUID(senderId);

    col = row.getColumn(LISTENER_CLASS);
    String className = col.getString();

    col = row.getColumn(SERVER_GROUPS);
    String serverGroups = col.getString();

    col = row.getColumn(MANUAL_START);
    Boolean manualStart = col.getBoolean();

    col = row.getColumn(BATCH_CONFLATION);
    Boolean batchConflation = col.getBoolean();

    col = row.getColumn(BATCH_SIZE);
    Integer batchSize = col.getInt();

    col = row.getColumn(BATCH_TIME_INTERVAL);
    Integer batchTimeInterval = col.getInt();

    col = row.getColumn(IS_PERSISTENCE);
    Boolean isPersistent = col.getBoolean();

    col = row.getColumn(DISK_SYNCHRONOUS);
    Boolean diskSynchronous = col.getBoolean();

    col = row.getColumn(DISK_STORE_NAME);
    String diskStoreName = col.getString();

    col = row.getColumn(MAX_QUEUE_MEMORY);
    Integer maxQueueMemory = col.getInt();

    col = row.getColumn(ALERT_THRESHOLD);
    Integer alertThreshold = col.getInt();

    col = row.getColumn(IS_STARTED);
    Boolean isStarted = col.getBoolean();

    col = row.getColumn(INIT_PARAMS);
    String initParams = col.getString();

    return new GfxdAsyncEventListenerDescriptor(
        dd,
        id,
        senderId,
        className,
        serverGroups,
        manualStart,
        batchConflation,
        batchSize,
        batchTimeInterval,
        isPersistent,
        diskSynchronous,
        diskStoreName,
        maxQueueMemory,
        alertThreshold,
        isStarted,
        initParams);
  }