com.nextdoor.bender.handler.s3.S3Handler.java Source code

Java tutorial

Introduction

Here is the source code for com.nextdoor.bender.handler.s3.S3Handler.java

Source

/*
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
 * in compliance with the License. You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software distributed under the License
 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
 * or implied. See the License for the specific language governing permissions and limitations under
 * the License.
 *
 * Copyright 2017 Nextdoor.com, Inc
 *
 */

package com.nextdoor.bender.handler.s3;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;

import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.s3.event.S3EventNotification;
import com.amazonaws.services.s3.event.S3EventNotification.S3EventNotificationRecord;
import com.google.gson.Gson;
import com.nextdoor.bender.InternalEvent;
import com.nextdoor.bender.InternalEventIterator;
import com.nextdoor.bender.LambdaContext;
import com.nextdoor.bender.aws.AmazonS3ClientFactory;
import com.nextdoor.bender.config.Source;
import com.nextdoor.bender.handler.BaseHandler;
import com.nextdoor.bender.handler.Handler;
import com.nextdoor.bender.handler.HandlerException;
import com.nextdoor.bender.utils.SourceUtils;
import com.nextdoor.bender.utils.SourceUtils.SourceNotFoundException;

public class S3Handler extends BaseHandler<S3EventNotification> implements Handler<S3EventNotification> {
    private static final Logger logger = Logger.getLogger(S3Handler.class);
    private static final Gson gson = new Gson();
    private InternalEventIterator<InternalEvent> recordIterator;
    private Source source;
    private boolean logTrigger = false;
    protected AmazonS3ClientFactory s3ClientFactory = new AmazonS3ClientFactory();

    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);
    }

    @Override
    public Source getSource() {
        return this.source;
    }

    @Override
    public String getSourceName() {
        return "aws:s3";
    }

    @Override
    public void onException(Exception e) {
        /*
         * Always close the iterator to prevent connection leaking
         */
        try {
            if (this.recordIterator != null) {
                this.recordIterator.close();
            }
        } catch (IOException e1) {
            logger.error("unable to close record iterator", e1);
        }
    }

    @Override
    public InternalEventIterator<InternalEvent> getInternalEventIterator() {
        return this.recordIterator;
    }
}