Skip to content

Commit b2b0594

Browse files
committed
feat: add static factory for custom S3 endpoint in S3ObjectMonitor for local testing
1 parent f52a262 commit b2b0594

File tree

2 files changed

+33
-0
lines changed

2 files changed

+33
-0
lines changed

service/src/main/java/org/whispersystems/textsecuregcm/configuration/MonitoredS3ObjectConfiguration.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,19 @@
77

88
import com.fasterxml.jackson.annotation.JsonTypeName;
99
import jakarta.validation.constraints.NotBlank;
10+
import java.net.URI;
1011
import java.time.Duration;
1112
import java.util.concurrent.ScheduledExecutorService;
1213
import org.whispersystems.textsecuregcm.s3.S3ObjectMonitor;
1314
import software.amazon.awssdk.auth.credentials.AwsCredentialsProvider;
15+
import javax.annotation.Nullable;
1416

1517
@JsonTypeName("default")
1618
public record MonitoredS3ObjectConfiguration(
1719
@NotBlank String s3Region,
1820
@NotBlank String s3Bucket,
1921
@NotBlank String objectKey,
22+
@Nullable URI endpointOverride,
2023
Long maxSize,
2124
Duration refreshInterval) implements S3ObjectMonitorFactory {
2225

@@ -36,6 +39,10 @@ public record MonitoredS3ObjectConfiguration(
3639
public S3ObjectMonitor build(final AwsCredentialsProvider awsCredentialsProvider,
3740
final ScheduledExecutorService refreshExecutorService) {
3841

42+
if (endpointOverride != null && !endpointOverride.toString().isEmpty()) {
43+
return S3ObjectMonitor.createCustomS3(awsCredentialsProvider, endpointOverride, s3Region, s3Bucket, objectKey,
44+
maxSize, refreshExecutorService, refreshInterval);
45+
}
3946
return new S3ObjectMonitor(awsCredentialsProvider, s3Region, s3Bucket, objectKey, maxSize, refreshExecutorService,
4047
refreshInterval);
4148
}

service/src/main/java/org/whispersystems/textsecuregcm/s3/S3ObjectMonitor.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import com.google.common.annotations.VisibleForTesting;
99
import java.io.IOException;
1010
import java.io.InputStream;
11+
import java.net.URI;
1112
import java.time.Duration;
1213
import java.util.concurrent.ScheduledExecutorService;
1314
import java.util.concurrent.ScheduledFuture;
@@ -21,10 +22,13 @@
2122
import software.amazon.awssdk.core.ResponseInputStream;
2223
import software.amazon.awssdk.regions.Region;
2324
import software.amazon.awssdk.services.s3.S3Client;
25+
import software.amazon.awssdk.services.s3.S3ClientBuilder;
26+
import software.amazon.awssdk.services.s3.S3Configuration;
2427
import software.amazon.awssdk.services.s3.model.GetObjectRequest;
2528
import software.amazon.awssdk.services.s3.model.GetObjectResponse;
2629
import software.amazon.awssdk.services.s3.model.HeadObjectRequest;
2730
import software.amazon.awssdk.services.s3.model.HeadObjectResponse;
31+
import javax.annotation.Nullable;
2832

2933
/**
3034
* An S3 object monitor watches a specific object in an S3 bucket and notifies a listener if that object changes.
@@ -65,6 +69,28 @@ public S3ObjectMonitor(
6569
refreshInterval);
6670
}
6771

72+
// allows specifying a custom S3 endpoint
73+
static public S3ObjectMonitor createCustomS3(final AwsCredentialsProvider awsCredentialsProvider,
74+
final URI s3Endpoint,
75+
final String s3Region,
76+
final String s3Bucket,
77+
final String objectKey,
78+
final long maxObjectSize,
79+
final ScheduledExecutorService refreshExecutorService,
80+
final Duration refreshInterval) {
81+
final S3ClientBuilder s3ClientBuilder = S3Client.builder()
82+
.region(Region.of(s3Region))
83+
.credentialsProvider(awsCredentialsProvider)
84+
.endpointOverride(s3Endpoint)
85+
.serviceConfiguration(S3Configuration.builder()
86+
.pathStyleAccessEnabled(true).build());
87+
return new S3ObjectMonitor(s3ClientBuilder.build(), s3Bucket,
88+
objectKey,
89+
maxObjectSize,
90+
refreshExecutorService,
91+
refreshInterval);
92+
}
93+
6894
@VisibleForTesting
6995
S3ObjectMonitor(
7096
final S3Client s3Client,

0 commit comments

Comments
 (0)