class S3Handler extends BaseHandler<S3EventNotification> implements Handler<S3EventNotification> {

  public void handler(S3EventNotification event, Context context) throws HandlerException {
    if (!initialized) {
      init(context);
      S3HandlerConfig handlerConfig = (S3HandlerConfig) this.config.getHandlerConfig();
      this.logTrigger = handlerConfig.getLogS3Trigger();
    }

    if (this.logTrigger) {
      logger.info("trigger: " + gson.toJson(event));
    }

    /*
     * Validate the S3 file matches the regex
     */
    List<S3EventNotificationRecord> toProcess =
        new ArrayList<S3EventNotificationRecord>(event.getRecords());
    for (S3EventNotificationRecord record : event.getRecords()) {
      String s3Path = String.format("s3://%s/%s", record.getS3().getBucket().getName(),
          record.getS3().getObject().getKey());
      try {
        this.source = SourceUtils.getSource(s3Path, this.sources);
      } catch (SourceNotFoundException e) {
        logger.warn("Skipping processing " + s3Path);
        toProcess.remove(record);
      }
    }

    if (toProcess.size() == 0) {
      logger.warn("Nothing to process");
      return;
    }

    this.recordIterator =
        new S3EventIterator(new LambdaContext(context), toProcess, s3ClientFactory);

    super.process(context);
  }

}