package com.scopely.infrastructure.kinesis; import com.amazonaws.services.kinesis.connectors.KinesisConnectorConfiguration; import com.amazonaws.services.kinesis.connectors.impl.AllPassFilter; import com.amazonaws.services.kinesis.connectors.impl.BasicMemoryBuffer; import com.amazonaws.services.kinesis.connectors.interfaces.IBuffer; import com.amazonaws.services.kinesis.connectors.interfaces.IEmitter; import com.amazonaws.services.kinesis.connectors.interfaces.IFilter; import com.amazonaws.services.kinesis.connectors.interfaces.IKinesisConnectorPipeline; import com.amazonaws.services.kinesis.connectors.interfaces.ITransformer; import com.amazonaws.services.kinesis.connectors.interfaces.ITransformerBase; import com.amazonaws.services.kinesis.model.Record; import com.amazonaws.services.s3.AmazonS3; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; import java.time.format.DateTimeFormatter; import java.util.Arrays; import java.util.Base64; public class S3RecorderPipeline implements IKinesisConnectorPipeline<byte[], byte[]> { private static final Logger LOGGER = LoggerFactory.getLogger(S3RecorderPipeline.class); public static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd"); private final AmazonS3 s3; public S3RecorderPipeline(AmazonS3 amazonS3) { s3 = amazonS3; } @Override public IEmitter<byte[]> getEmitter(KinesisConnectorConfiguration configuration) { return new InjectableS3Emitter(configuration, s3); } @Override public IBuffer<byte[]> getBuffer(KinesisConnectorConfiguration configuration) { return new BasicMemoryBuffer<>(configuration); } @Override public ITransformerBase<byte[], byte[]> getTransformer(KinesisConnectorConfiguration configuration) { return new ITransformer<byte[], byte[]>() { @Override public byte[] toClass(Record record) throws IOException { return record.getData().array(); } @Override public byte[] fromClass(byte[] record) throws IOException { byte[] encoded = Base64.getEncoder().encode(record); byte[] expanded = Arrays.copyOf(encoded, encoded.length + 1); expanded[encoded.length] = '\n'; return expanded; } }; } @Override public IFilter<byte[]> getFilter(KinesisConnectorConfiguration configuration) { return new AllPassFilter<>(); } }