class BootstrapSCNProcessor {

public boolean shouldBypassSnapshot(long sinceScn, long startScn, List<SourceStatusInfo> srcList)
    throws SQLException, BootstrapProcessingException
    {
      if ((srcList == null) || (srcList.isEmpty()))
        return false;

      if ( sinceScn <= 0 )
      {
        // client is requesting full bootstrap. Cannot guarantee with just log tables.
        LOG.info("Client requesting from SCN (" + sinceScn + "). Bootstrap Snapshot will not be bypassed !!");
        return false;
      }

      for (SourceStatusInfo pair: srcList)
      {
        boolean disableSnapshotBypass = _config.isBypassSnapshotDisabled(pair.getSrcName());

        if ( disableSnapshotBypass)
          return false;

        boolean canCatchupFromLog = validateIfCanCatchupFromLog(sinceScn, startScn, pair.getSrcId());
        if (! canCatchupFromLog)
          return false;


        long threshold = _config.getRowsThresholdForSnapshotBypass(pair.getSrcName());

        if ( threshold == Long.MAX_VALUE)
        {
          // If the threshold for snapshot bypass is infinity, then we should bypass snapshot
          // for this source i.e., fetch from log table. Hence do not bother to get number of rows affected
          // for this source, as it could potentially be an expensive query
          continue;
        }

        long currRows = getRowDiff(sinceScn, startScn, pair.getSrcId());

        if (currRows > threshold)
        {
          LOG.info("Threshold check failed for source (" + pair.getSrcName() + ") Threshold:" + threshold + ",Approx Rows:" + currRows );
          return false;
        }
      }

      return true;
}

public  BootstrapSCNProcessor(BootstrapServerStaticConfig config,
              DbusEventsStatisticsCollector curStatsCollector);
protected  BootstrapSCNProcessor();

}