diff --git a/src/main/java/com/aliyun/oss/internal/OSSBucketOperation.java b/src/main/java/com/aliyun/oss/internal/OSSBucketOperation.java index 369d6b9f..c9003395 100644 --- a/src/main/java/com/aliyun/oss/internal/OSSBucketOperation.java +++ b/src/main/java/com/aliyun/oss/internal/OSSBucketOperation.java @@ -96,11 +96,7 @@ import static com.aliyun.oss.internal.ResponseParsers.getBucketTransferAccelerationResponseParser; import java.io.ByteArrayInputStream; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import com.aliyun.oss.ClientException; import com.aliyun.oss.HttpMethod; @@ -855,6 +851,10 @@ public VoidResult setBucketLifecycle(SetBucketLifecycleRequest setBucketLifecycl .setInputStreamWithLength(setBucketLifecycleRequestMarshaller.marshall(setBucketLifecycleRequest)) .setOriginalRequest(setBucketLifecycleRequest).build(); + if(!setBucketLifecycleRequest.getHeaders().isEmpty()){ + request.addHeader(OSSHeaders.OSS_HEADER_LIFECYCLE_OVERLAP, setBucketLifecycleRequest.getHeaders().get(OSSHeaders.OSS_HEADER_LIFECYCLE_OVERLAP)); + } + return doOperation(request, requestIdResponseParser, bucketName, null); } diff --git a/src/main/java/com/aliyun/oss/internal/OSSHeaders.java b/src/main/java/com/aliyun/oss/internal/OSSHeaders.java index 687630b4..9ba09a62 100644 --- a/src/main/java/com/aliyun/oss/internal/OSSHeaders.java +++ b/src/main/java/com/aliyun/oss/internal/OSSHeaders.java @@ -111,5 +111,5 @@ public interface OSSHeaders extends HttpHeaders { static final String OSS_RENAME_SOURCE = "x-oss-rename-source"; static final String OSS_RESOURCE_GROUP_ID = "x-oss-resource-group-id"; - + static final String OSS_HEADER_LIFECYCLE_OVERLAP = "x-oss-allow-same-action-overlap"; } diff --git a/src/test/java/com/aliyun/oss/integrationtests/BucketLifecycleTest.java b/src/test/java/com/aliyun/oss/integrationtests/BucketLifecycleTest.java index 72407c7b..69e21cb3 100644 --- a/src/test/java/com/aliyun/oss/integrationtests/BucketLifecycleTest.java +++ b/src/test/java/com/aliyun/oss/integrationtests/BucketLifecycleTest.java @@ -569,4 +569,59 @@ public void testUnormalDeleteBucketLifecycle() { ossClient.deleteBucket(bucketWithoutLifecycleConfiguration); } } + + @Test + public void testLifecycleOverlap() throws ParseException { + final String bucketName = super.bucketName + "normal-set-bucket-lifecycle"; + final String ruleId1 = "overlap/"; + final String matchPrefix1 = "Prefix"; + final String ruleId2 = "overlap/a"; + final String matchPrefix2 = "Prefix/SubPrefix"; + + try { + SetBucketLifecycleRequest request = new SetBucketLifecycleRequest(bucketName); + ossClient.createBucket(bucketName); + + + LifecycleRule rule = new LifecycleRule(ruleId1, matchPrefix1, RuleStatus.Enabled, + DateUtil.parseIso8601Date("2022-10-12T00:00:00.000Z")); + request.AddLifecycleRule(rule); + + rule = new LifecycleRule(ruleId2, matchPrefix2, RuleStatus.Enabled, + DateUtil.parseIso8601Date("2022-10-12T00:00:00.000Z")); + request.AddLifecycleRule(rule); + + try { + ossClient.setBucketLifecycle(request); + } catch (OSSException e){ + Assert.assertEquals("Overlap for same action type Expiration",e.getErrorMessage()); + } + request.addHeader("x-oss-allow-same-action-overlap", "true"); + ossClient.setBucketLifecycle(request); + + List rules = ossClient.getBucketLifecycle(bucketName); + Assert.assertEquals(rules.size(), 2); + + LifecycleRule r1 = rules.get(0); + Assert.assertEquals(r1.getId(), ruleId1); + Assert.assertEquals(r1.getPrefix(), matchPrefix1); + Assert.assertEquals(r1.getStatus(), RuleStatus.Enabled); + Assert.assertFalse(r1.hasCreatedBeforeDate()); + Assert.assertEquals(DateUtil.formatIso8601Date(r1.getExpirationTime()), + "2022-10-12T00:00:00.000Z"); + + LifecycleRule r2 = rules.get(1); + Assert.assertEquals(r2.getId(), ruleId2); + Assert.assertEquals(r2.getPrefix(), matchPrefix2); + Assert.assertEquals(r2.getStatus(), RuleStatus.Enabled); + Assert.assertFalse(r2.hasCreatedBeforeDate()); + Assert.assertEquals(DateUtil.formatIso8601Date(r2.getExpirationTime()), + "2022-10-12T00:00:00.000Z"); + + } catch (OSSException e) { + Assert.fail(e.getMessage()); + } finally { + ossClient.deleteBucket(bucketName); + } + } }