diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/BucketInfo.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/BucketInfo.java index 038df91d9..602be08ac 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/BucketInfo.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/BucketInfo.java @@ -353,7 +353,9 @@ public LifecycleRule(LifecycleAction action, LifecycleCondition condition) { && condition.getMatchesStorageClass() == null && condition.getNumberOfNewerVersions() == null && condition.getDaysSinceNoncurrentTime() == null - && condition.getNoncurrentTimeBefore() == null) { + && condition.getNoncurrentTimeBefore() == null + && condition.getCustomTimeBefore() == null + && condition.getDaysSinceCustomTime() == null) { throw new IllegalArgumentException( "You must specify at least one condition to use object lifecycle " + "management. Please see https://cloud.google.com/storage/docs/lifecycle for details."); @@ -427,7 +429,12 @@ Rule toPb() { lifecycleCondition.getNoncurrentTimeBefore() == null ? null : new DateTime( - true, lifecycleCondition.getNoncurrentTimeBefore().getValue(), 0)); + true, lifecycleCondition.getNoncurrentTimeBefore().getValue(), 0)) + .setCustomTimeBefore( + lifecycleCondition.getCustomTimeBefore() == null + ? null + : new DateTime(true, lifecycleCondition.getCustomTimeBefore().getValue(), 0)) + .setDaysSinceCustomTime(lifecycleCondition.getDaysSinceCustomTime()); rule.setCondition(condition); @@ -472,7 +479,9 @@ public StorageClass apply(String storageClass) { } })) .setDaysSinceNoncurrentTime(condition.getDaysSinceNoncurrentTime()) - .setNoncurrentTimeBefore(condition.getNoncurrentTimeBefore()); + .setNoncurrentTimeBefore(condition.getNoncurrentTimeBefore()) + .setCustomTimeBefore(condition.getCustomTimeBefore()) + .setDaysSinceCustomTime(condition.getDaysSinceCustomTime()); return new LifecycleRule(lifecycleAction, conditionBuilder.build()); } @@ -492,6 +501,8 @@ public static class LifecycleCondition implements Serializable { private final List matchesStorageClass; private final Integer daysSinceNoncurrentTime; private final DateTime noncurrentTimeBefore; + private final DateTime customTimeBefore; + private final Integer daysSinceCustomTime; private LifecycleCondition(Builder builder) { this.age = builder.age; @@ -501,6 +512,8 @@ private LifecycleCondition(Builder builder) { this.matchesStorageClass = builder.matchesStorageClass; this.daysSinceNoncurrentTime = builder.daysSinceNoncurrentTime; this.noncurrentTimeBefore = builder.noncurrentTimeBefore; + this.customTimeBefore = builder.customTimeBefore; + this.daysSinceCustomTime = builder.daysSinceCustomTime; } public Builder toBuilder() { @@ -511,7 +524,9 @@ public Builder toBuilder() { .setIsLive(this.isLive) .setMatchesStorageClass(this.matchesStorageClass) .setDaysSinceNoncurrentTime(this.daysSinceNoncurrentTime) - .setNoncurrentTimeBefore(this.noncurrentTimeBefore); + .setNoncurrentTimeBefore(this.noncurrentTimeBefore) + .setCustomTimeBefore(this.customTimeBefore) + .setDaysSinceCustomTime(this.daysSinceCustomTime); } public static Builder newBuilder() { @@ -528,6 +543,8 @@ public String toString() { .add("matchesStorageClass", matchesStorageClass) .add("daysSinceNoncurrentTime", daysSinceNoncurrentTime) .add("noncurrentTimeBefore", noncurrentTimeBefore) + .add("customTimeBefore", customTimeBefore) + .add("daysSinceCustomTime", daysSinceCustomTime) .toString(); } @@ -563,6 +580,16 @@ public DateTime getNoncurrentTimeBefore() { return noncurrentTimeBefore; } + /* Returns the date in RFC 3339 format with only the date part (for instance, "2013-01-15").*/ + public DateTime getCustomTimeBefore() { + return customTimeBefore; + } + + /** Returns the number of days elapsed since the user-specified timestamp set on an object. */ + public Integer getDaysSinceCustomTime() { + return daysSinceCustomTime; + } + /** Builder for {@code LifecycleCondition}. */ public static class Builder { private Integer age; @@ -572,6 +599,8 @@ public static class Builder { private List matchesStorageClass; private Integer daysSinceNoncurrentTime; private DateTime noncurrentTimeBefore; + private DateTime customTimeBefore; + private Integer daysSinceCustomTime; private Builder() {} @@ -649,6 +678,27 @@ public Builder setNoncurrentTimeBefore(DateTime noncurrentTimeBefore) { return this; } + /** + * Sets the date in RFC 3339 format with only the date part (for instance, "2013-01-15"). + * Note that only date part will be considered, if the time is specified it will be + * truncated. This condition is satisfied when the custom time on an object is before this + * date in UTC. + */ + public Builder setCustomTimeBefore(DateTime customTimeBefore) { + this.customTimeBefore = customTimeBefore; + return this; + } + + /** + * Sets the number of days elapsed since the user-specified timestamp set on an object. The + * condition is satisfied if the days elapsed is at least this number. If no custom + * timestamp is specified on an object, the condition does not apply. + */ + public Builder setDaysSinceCustomTime(Integer daysSinceCustomTime) { + this.daysSinceCustomTime = daysSinceCustomTime; + return this; + } + /** Builds a {@code LifecycleCondition} object. * */ public LifecycleCondition build() { return new LifecycleCondition(this); diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/BucketInfoTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/BucketInfoTest.java index c7b3aa198..8def7c306 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/BucketInfoTest.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/BucketInfoTest.java @@ -338,6 +338,8 @@ public void testLifecycleRules() { .setNumberOfNewerVersions(10) .setDaysSinceNoncurrentTime(30) .setNoncurrentTimeBefore(new DateTime(System.currentTimeMillis())) + .setCustomTimeBefore(new DateTime(System.currentTimeMillis())) + .setDaysSinceCustomTime(30) .build()) .toPb(); assertEquals(StorageClass.COLDLINE.toString(), lifecycleRule.getAction().getStorageClass()); @@ -345,6 +347,9 @@ public void testLifecycleRules() { assertEquals(10, lifecycleRule.getCondition().getNumNewerVersions().intValue()); assertEquals(30, lifecycleRule.getCondition().getDaysSinceNoncurrentTime().intValue()); assertNotNull(lifecycleRule.getCondition().getNoncurrentTimeBefore()); + assertEquals(StorageClass.COLDLINE.toString(), lifecycleRule.getAction().getStorageClass()); + assertEquals(30, lifecycleRule.getCondition().getDaysSinceCustomTime().intValue()); + assertNotNull(lifecycleRule.getCondition().getCustomTimeBefore()); } @Test diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/StorageImplTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/StorageImplTest.java index 35c4e253c..590fe37af 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/StorageImplTest.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/StorageImplTest.java @@ -2252,6 +2252,8 @@ public void testBucketLifecycleRules() { .setMatchesStorageClass(ImmutableList.of(StorageClass.COLDLINE)) .setDaysSinceNoncurrentTime(30) .setNoncurrentTimeBefore(new DateTime(System.currentTimeMillis())) + .setCustomTimeBefore(new DateTime(System.currentTimeMillis())) + .setDaysSinceCustomTime(30) .build()))) .build(); EasyMock.expect( @@ -2268,5 +2270,7 @@ public void testBucketLifecycleRules() { assertEquals(1, lifecycleRule.getCondition().getMatchesStorageClass().size()); assertEquals(30, lifecycleRule.getCondition().getDaysSinceNoncurrentTime().intValue()); assertNotNull(lifecycleRule.getCondition().getNoncurrentTimeBefore()); + assertEquals(30, lifecycleRule.getCondition().getDaysSinceCustomTime().intValue()); + assertNotNull(lifecycleRule.getCondition().getCustomTimeBefore()); } } diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITStorageTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITStorageTest.java index d92ca5921..52947795b 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITStorageTest.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITStorageTest.java @@ -458,6 +458,8 @@ public void testGetBucketLifecycleRules() { .setMatchesStorageClass(ImmutableList.of(StorageClass.COLDLINE)) .setDaysSinceNoncurrentTime(30) .setNoncurrentTimeBefore(new DateTime(System.currentTimeMillis())) + .setCustomTimeBefore(new DateTime(System.currentTimeMillis())) + .setDaysSinceCustomTime(30) .build()))) .build()); Bucket remoteBucket = @@ -476,6 +478,8 @@ public void testGetBucketLifecycleRules() { assertEquals(1, lifecycleRule.getCondition().getMatchesStorageClass().size()); assertEquals(30, lifecycleRule.getCondition().getDaysSinceNoncurrentTime().intValue()); assertNotNull(lifecycleRule.getCondition().getNoncurrentTimeBefore()); + assertEquals(30, lifecycleRule.getCondition().getDaysSinceCustomTime().intValue()); + assertNotNull(lifecycleRule.getCondition().getCustomTimeBefore()); } finally { storage.delete(lifecycleTestBucketName); }