package org.hypergraphql.services; import com.amazonaws.auth.AWSCredentials; import com.amazonaws.auth.AWSStaticCredentialsProvider; import com.amazonaws.auth.BasicAWSCredentials; import com.amazonaws.regions.Regions; import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.AmazonS3Client; import com.amazonaws.services.s3.model.S3Object; import java.io.InputStream; import java.net.URI; public class S3Service { private AWSCredentials credentials(final String key, final String secret) { return new BasicAWSCredentials(key, secret); } public AmazonS3 buildS3(final URI uri, final String key, final String secret) { final Regions region = extractRegion(uri); return AmazonS3Client.builder() .withRegion(region) .withCredentials(new AWSStaticCredentialsProvider(credentials(key, secret))) .build(); } public InputStream openS3Stream(final URI uri, final String key, final String secret) { S3Object s3Object = getObject(uri, key, secret); return s3Object.getObjectContent(); } private S3Object getObject(final URI uri, final String key, final String secret) { final AmazonS3 s3 = buildS3(uri, key, secret); final String bucketName = extractBucket(uri); final String objectName = extractObjectName(uri); return s3.getObject(bucketName, objectName); } String extractBucket(final URI uri) { return uri.getPath().split("/")[1]; } Regions extractRegion(final URI uri) { final String regionString = uri.getHost().split("\\.")[0]; switch(regionString.toUpperCase()) { case ("S3"): return Regions.US_EAST_1; default: final String regionPart = regionString.substring(regionString.indexOf("-") + 1); return Regions.fromName(regionPart); } } String extractObjectName(final URI uri) { return uri.getPath().substring(uri.getPath().indexOf("/", 1) + 1); } }