Skip to content

Commit 1d2edf4

Browse files
authored
Add S3Client objectExists support in S3Template (#978)
1 parent e722d3a commit 1d2edf4

File tree

3 files changed

+46
-0
lines changed

3 files changed

+46
-0
lines changed

spring-cloud-aws-s3-parent/spring-cloud-aws-s3/src/main/java/io/awspring/cloud/s3/S3Operations.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
* {@link S3Template}.
2929
*
3030
* @author Maciej Walkowiak
31+
* @author Ziemowit Stolarczyk
3132
* @since 3.0
3233
*/
3334
public interface S3Operations {
@@ -70,6 +71,15 @@ public interface S3Operations {
7071
*/
7172
void deleteObject(String s3Url);
7273

74+
/**
75+
* Checks if an S3 object exists.
76+
*
77+
* @param bucketName - the bucket name
78+
* @param key - the object key
79+
* @return true if object exists; false otherwise
80+
*/
81+
boolean objectExists(String bucketName, String key);
82+
7383
/**
7484
* Returns some or all (up to 1,000) of the objects in a bucket. Does not handle pagination. If you need pagination
7585
* you should use {@link S3PathMatchingResourcePatternResolver} or {@link S3Client}

spring-cloud-aws-s3-parent/spring-cloud-aws-s3/src/main/java/io/awspring/cloud/s3/S3Template.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import software.amazon.awssdk.services.s3.model.ListObjectsV2Request;
2929
import software.amazon.awssdk.services.s3.model.ListObjectsV2Response;
3030
import software.amazon.awssdk.services.s3.model.NoSuchBucketException;
31+
import software.amazon.awssdk.services.s3.model.NoSuchKeyException;
3132
import software.amazon.awssdk.services.s3.model.PutObjectRequest;
3233
import software.amazon.awssdk.services.s3.presigner.S3Presigner;
3334
import software.amazon.awssdk.services.s3.presigner.model.GetObjectPresignRequest;
@@ -39,6 +40,7 @@
3940
* Higher level abstraction over {@link S3Client} providing methods for the most common use cases.
4041
*
4142
* @author Maciej Walkowiak
43+
* @author Ziemowit Stolarczyk
4244
* @since 3.0
4345
*/
4446
public class S3Template implements S3Operations {
@@ -101,6 +103,19 @@ public void deleteObject(String s3Url) {
101103
this.deleteObject(location.getBucket(), location.getObject());
102104
}
103105

106+
@Override
107+
public boolean objectExists(String bucketName, String key) {
108+
Assert.notNull(bucketName, "bucketName is required");
109+
Assert.notNull(key, "key is required");
110+
try {
111+
s3Client.headObject(request -> request.bucket(bucketName).key(key));
112+
}
113+
catch (NoSuchBucketException | NoSuchKeyException e) {
114+
return false;
115+
}
116+
return true;
117+
}
118+
104119
@Override
105120
public List<S3Resource> listObjects(String bucketName, String prefix) {
106121
Assert.notNull(bucketName, "bucketName is required");

spring-cloud-aws-s3-parent/spring-cloud-aws-s3/src/test/java/io/awspring/cloud/s3/S3TemplateIntegrationTests.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@
6161
*
6262
* @author Maciej Walkowiak
6363
* @author Yuki Yoshida
64+
* @author Ziemowit Stolarczyk
6465
*/
6566
@Testcontainers
6667
class S3TemplateIntegrationTests {
@@ -164,6 +165,26 @@ void deletesObjectByS3Url() {
164165
.isThrownBy(() -> client.headObject(r -> r.bucket(BUCKET_NAME).key("key.txt")));
165166
}
166167

168+
@Test
169+
void whenObjectExistsShouldReturnTrue() {
170+
client.putObject(r -> r.bucket(BUCKET_NAME).key("key.txt"), RequestBody.fromString("hello"));
171+
172+
final boolean existsObject = s3Template.objectExists(BUCKET_NAME, "key.txt");
173+
174+
assertThat(existsObject).isTrue();
175+
}
176+
177+
@Test
178+
void whenObjectNotExistsShouldReturnFalse() {
179+
client.putObject(r -> r.bucket(BUCKET_NAME).key("key.txt"), RequestBody.fromString("hello"));
180+
181+
final boolean existsObject1 = s3Template.objectExists(BUCKET_NAME, "other-key.txt");
182+
final boolean existsObject2 = s3Template.objectExists("other-bucket", "key.txt");
183+
184+
assertThat(existsObject1).isFalse();
185+
assertThat(existsObject2).isFalse();
186+
}
187+
167188
@Test
168189
void listObjects() throws IOException {
169190
client.putObject(r -> r.bucket(BUCKET_NAME).key("hello-en.txt"), RequestBody.fromString("hello"));

0 commit comments

Comments
 (0)