@@ -353,7 +353,9 @@ public LifecycleRule(LifecycleAction action, LifecycleCondition condition) {
353353 && condition .getMatchesStorageClass () == null
354354 && condition .getNumberOfNewerVersions () == null
355355 && condition .getDaysSinceNoncurrentTime () == null
356- && condition .getNoncurrentTimeBefore () == null ) {
356+ && condition .getNoncurrentTimeBefore () == null
357+ && condition .getCustomTimeBefore () == null
358+ && condition .getDaysSinceCustomTime () == null ) {
357359 throw new IllegalArgumentException (
358360 "You must specify at least one condition to use object lifecycle "
359361 + "management. Please see https://cloud.google.com/storage/docs/lifecycle for details." );
@@ -427,7 +429,12 @@ Rule toPb() {
427429 lifecycleCondition .getNoncurrentTimeBefore () == null
428430 ? null
429431 : new DateTime (
430- true , lifecycleCondition .getNoncurrentTimeBefore ().getValue (), 0 ));
432+ true , lifecycleCondition .getNoncurrentTimeBefore ().getValue (), 0 ))
433+ .setCustomTimeBefore (
434+ lifecycleCondition .getCustomTimeBefore () == null
435+ ? null
436+ : new DateTime (true , lifecycleCondition .getCustomTimeBefore ().getValue (), 0 ))
437+ .setDaysSinceCustomTime (lifecycleCondition .getDaysSinceCustomTime ());
431438
432439 rule .setCondition (condition );
433440
@@ -472,7 +479,9 @@ public StorageClass apply(String storageClass) {
472479 }
473480 }))
474481 .setDaysSinceNoncurrentTime (condition .getDaysSinceNoncurrentTime ())
475- .setNoncurrentTimeBefore (condition .getNoncurrentTimeBefore ());
482+ .setNoncurrentTimeBefore (condition .getNoncurrentTimeBefore ())
483+ .setCustomTimeBefore (condition .getCustomTimeBefore ())
484+ .setDaysSinceCustomTime (condition .getDaysSinceCustomTime ());
476485
477486 return new LifecycleRule (lifecycleAction , conditionBuilder .build ());
478487 }
@@ -492,6 +501,8 @@ public static class LifecycleCondition implements Serializable {
492501 private final List <StorageClass > matchesStorageClass ;
493502 private final Integer daysSinceNoncurrentTime ;
494503 private final DateTime noncurrentTimeBefore ;
504+ private final DateTime customTimeBefore ;
505+ private final Integer daysSinceCustomTime ;
495506
496507 private LifecycleCondition (Builder builder ) {
497508 this .age = builder .age ;
@@ -501,6 +512,8 @@ private LifecycleCondition(Builder builder) {
501512 this .matchesStorageClass = builder .matchesStorageClass ;
502513 this .daysSinceNoncurrentTime = builder .daysSinceNoncurrentTime ;
503514 this .noncurrentTimeBefore = builder .noncurrentTimeBefore ;
515+ this .customTimeBefore = builder .customTimeBefore ;
516+ this .daysSinceCustomTime = builder .daysSinceCustomTime ;
504517 }
505518
506519 public Builder toBuilder () {
@@ -511,7 +524,9 @@ public Builder toBuilder() {
511524 .setIsLive (this .isLive )
512525 .setMatchesStorageClass (this .matchesStorageClass )
513526 .setDaysSinceNoncurrentTime (this .daysSinceNoncurrentTime )
514- .setNoncurrentTimeBefore (this .noncurrentTimeBefore );
527+ .setNoncurrentTimeBefore (this .noncurrentTimeBefore )
528+ .setCustomTimeBefore (this .customTimeBefore )
529+ .setDaysSinceCustomTime (this .daysSinceCustomTime );
515530 }
516531
517532 public static Builder newBuilder () {
@@ -528,6 +543,8 @@ public String toString() {
528543 .add ("matchesStorageClass" , matchesStorageClass )
529544 .add ("daysSinceNoncurrentTime" , daysSinceNoncurrentTime )
530545 .add ("noncurrentTimeBefore" , noncurrentTimeBefore )
546+ .add ("customTimeBefore" , customTimeBefore )
547+ .add ("daysSinceCustomTime" , daysSinceCustomTime )
531548 .toString ();
532549 }
533550
@@ -563,6 +580,16 @@ public DateTime getNoncurrentTimeBefore() {
563580 return noncurrentTimeBefore ;
564581 }
565582
583+ /* Returns the date in RFC 3339 format with only the date part (for instance, "2013-01-15").*/
584+ public DateTime getCustomTimeBefore () {
585+ return customTimeBefore ;
586+ }
587+
588+ /** Returns the number of days elapsed since the user-specified timestamp set on an object. */
589+ public Integer getDaysSinceCustomTime () {
590+ return daysSinceCustomTime ;
591+ }
592+
566593 /** Builder for {@code LifecycleCondition}. */
567594 public static class Builder {
568595 private Integer age ;
@@ -572,6 +599,8 @@ public static class Builder {
572599 private List <StorageClass > matchesStorageClass ;
573600 private Integer daysSinceNoncurrentTime ;
574601 private DateTime noncurrentTimeBefore ;
602+ private DateTime customTimeBefore ;
603+ private Integer daysSinceCustomTime ;
575604
576605 private Builder () {}
577606
@@ -649,6 +678,27 @@ public Builder setNoncurrentTimeBefore(DateTime noncurrentTimeBefore) {
649678 return this ;
650679 }
651680
681+ /**
682+ * Sets the date in RFC 3339 format with only the date part (for instance, "2013-01-15").
683+ * Note that only date part will be considered, if the time is specified it will be
684+ * truncated. This condition is satisfied when the custom time on an object is before this
685+ * date in UTC.
686+ */
687+ public Builder setCustomTimeBefore (DateTime customTimeBefore ) {
688+ this .customTimeBefore = customTimeBefore ;
689+ return this ;
690+ }
691+
692+ /**
693+ * Sets the number of days elapsed since the user-specified timestamp set on an object. The
694+ * condition is satisfied if the days elapsed is at least this number. If no custom
695+ * timestamp is specified on an object, the condition does not apply.
696+ */
697+ public Builder setDaysSinceCustomTime (Integer daysSinceCustomTime ) {
698+ this .daysSinceCustomTime = daysSinceCustomTime ;
699+ return this ;
700+ }
701+
652702 /** Builds a {@code LifecycleCondition} object. * */
653703 public LifecycleCondition build () {
654704 return new LifecycleCondition (this );
0 commit comments