3131import com .google .cloud .storage .UnifiedOpts .NamedField ;
3232import com .google .common .base .MoreObjects ;
3333import com .google .common .collect .ImmutableList ;
34+ import com .google .common .collect .ImmutableMap ;
3435import com .google .common .collect .ImmutableSet ;
3536import com .google .common .io .BaseEncoding ;
3637import java .io .Serializable ;
@@ -112,6 +113,7 @@ public class BlobInfo implements Serializable {
112113 private final Retention retention ;
113114 private final OffsetDateTime softDeleteTime ;
114115 private final OffsetDateTime hardDeleteTime ;
116+ private ObjectContexts contexts ;
115117 private final transient ImmutableSet <NamedField > modifiedFields ;
116118
117119 /** This class is meant for internal use only. Users are discouraged from using this class. */
@@ -289,6 +291,167 @@ public static Mode[] values() {
289291 }
290292 }
291293
294+ public static final class ObjectContexts implements Serializable {
295+
296+ private static final long serialVersionUID = -5993852233545224424L ;
297+
298+ private final ImmutableMap <String , ObjectCustomContextPayload > custom ;
299+
300+ private ObjectContexts (Builder builder ) {
301+ this .custom = builder .custom ;
302+ }
303+
304+ public static Builder newBuilder () {
305+ return new Builder ();
306+ }
307+
308+ public Builder toBuilder () {
309+ return new Builder ().setCustom (this .custom );
310+ }
311+
312+ /** Returns the map of user-defined object contexts. */
313+ public Map <String , ObjectCustomContextPayload > getCustom () {
314+ return custom ;
315+ }
316+
317+ @ Override
318+ public int hashCode () {
319+ return Objects .hash (custom );
320+ }
321+
322+ @ Override
323+ public boolean equals (Object obj ) {
324+ if (this == obj ) {
325+ return true ;
326+ }
327+ if (obj == null || getClass () != obj .getClass ()) {
328+ return false ;
329+ }
330+ final ObjectContexts other = (ObjectContexts ) obj ;
331+ return Objects .equals (this .custom , other .custom );
332+ }
333+
334+ @ Override
335+ public String toString () {
336+ return MoreObjects .toStringHelper (this ).add ("custom" , custom ).toString ();
337+ }
338+
339+ public static final class Builder {
340+
341+ private ImmutableMap <String , ObjectCustomContextPayload > custom ;
342+
343+ private Builder () {}
344+
345+ public Builder setCustom (Map <String , ObjectCustomContextPayload > custom ) {
346+ this .custom = custom == null ? ImmutableMap .of () : ImmutableMap .copyOf (custom );
347+ return this ;
348+ }
349+
350+ public ObjectContexts build () {
351+ return new ObjectContexts (this );
352+ }
353+ }
354+ }
355+
356+ /** Represents the payload of a user-defined object context. */
357+ public static final class ObjectCustomContextPayload implements Serializable {
358+
359+ private static final long serialVersionUID = 557621132294323214L ;
360+
361+ private final String value ;
362+ private final OffsetDateTime createTime ;
363+ private final OffsetDateTime updateTime ;
364+
365+ private ObjectCustomContextPayload (Builder builder ) {
366+ this .value = builder .value ;
367+ this .createTime = builder .createTime ;
368+ this .updateTime = builder .updateTime ;
369+ }
370+
371+ public static Builder newBuilder () {
372+ return new Builder ();
373+ }
374+
375+ public Builder toBuilder () {
376+ return new Builder ()
377+ .setValue (this .value )
378+ .setCreateTime (this .createTime )
379+ .setUpdateTime (this .updateTime );
380+ }
381+
382+ public String getValue () {
383+ return value ;
384+ }
385+
386+ public OffsetDateTime getCreateTime () {
387+ return createTime ;
388+ }
389+
390+ public OffsetDateTime getUpdateTime () {
391+ return updateTime ;
392+ }
393+
394+ @ Override
395+ public int hashCode () {
396+ return Objects .hash (value , createTime , updateTime );
397+ }
398+
399+ @ Override
400+ public boolean equals (Object obj ) {
401+ if (obj == this ) {
402+ return true ;
403+ }
404+ if (obj == null || getClass () != obj .getClass ()) {
405+ return false ;
406+ }
407+ ObjectCustomContextPayload other = (ObjectCustomContextPayload ) obj ;
408+ return Objects .equals (value , other .value )
409+ && Objects .equals (createTime , other .createTime )
410+ && Objects .equals (updateTime , other .updateTime );
411+ }
412+
413+ @ Override
414+ public String toString () {
415+ return MoreObjects .toStringHelper (this )
416+ .add ("value" , value )
417+ .add ("createTime" , createTime )
418+ .add ("updateTime" , updateTime )
419+ .toString ();
420+ }
421+
422+ public static final class Builder {
423+
424+ private String value ;
425+ private OffsetDateTime createTime ;
426+ private OffsetDateTime updateTime ;
427+
428+ private Builder () {}
429+
430+ public Builder (String value ) {
431+ setValue (value );
432+ }
433+
434+ public Builder setValue (String value ) {
435+ this .value = value ;
436+ return this ;
437+ }
438+
439+ public Builder setCreateTime (OffsetDateTime createTime ) {
440+ this .createTime = createTime ;
441+ return this ;
442+ }
443+
444+ public Builder setUpdateTime (OffsetDateTime updateTime ) {
445+ this .updateTime = updateTime ;
446+ return this ;
447+ }
448+
449+ public ObjectCustomContextPayload build () {
450+ return new ObjectCustomContextPayload (this );
451+ }
452+ }
453+ }
454+
292455 /** Builder for {@code BlobInfo}. */
293456 public abstract static class Builder {
294457
@@ -543,6 +706,8 @@ Builder setRetentionExpirationTimeOffsetDateTime(OffsetDateTime retentionExpirat
543706
544707 public abstract Builder setRetention (Retention retention );
545708
709+ public abstract Builder setContexts (ObjectContexts contexts );
710+
546711 /** Creates a {@code BlobInfo} object. */
547712 public abstract BlobInfo build ();
548713
@@ -607,6 +772,8 @@ Builder setRetentionExpirationTimeOffsetDateTime(OffsetDateTime retentionExpirat
607772 abstract Builder clearTemporaryHold ();
608773
609774 abstract Builder clearRetentionExpirationTime ();
775+
776+ abstract Builder clearContexts ();
610777 }
611778
612779 static final class BuilderImpl extends Builder {
@@ -644,6 +811,7 @@ static final class BuilderImpl extends Builder {
644811 private Retention retention ;
645812 private OffsetDateTime softDeleteTime ;
646813 private OffsetDateTime hardDeleteTime ;
814+ private ObjectContexts contexts ;
647815 private final ImmutableSet .Builder <NamedField > modifiedFields = ImmutableSet .builder ();
648816
649817 BuilderImpl (BlobId blobId ) {
@@ -684,6 +852,7 @@ static final class BuilderImpl extends Builder {
684852 retention = blobInfo .retention ;
685853 softDeleteTime = blobInfo .softDeleteTime ;
686854 hardDeleteTime = blobInfo .hardDeleteTime ;
855+ contexts = blobInfo .contexts ;
687856 }
688857
689858 @ Override
@@ -1095,6 +1264,13 @@ public Builder setRetention(Retention retention) {
10951264 return this ;
10961265 }
10971266
1267+ @ Override
1268+ public Builder setContexts (ObjectContexts contexts ) {
1269+ modifiedFields .add (BlobField .OBJECT_CONTEXTS );
1270+ this .contexts = contexts ;
1271+ return this ;
1272+ }
1273+
10981274 @ Override
10991275 public BlobInfo build () {
11001276 checkNotNull (blobId );
@@ -1285,6 +1461,12 @@ Builder clearRetentionExpirationTime() {
12851461 this .retentionExpirationTime = null ;
12861462 return this ;
12871463 }
1464+
1465+ @ Override
1466+ Builder clearContexts () {
1467+ this .contexts = null ;
1468+ return this ;
1469+ }
12881470 }
12891471
12901472 BlobInfo (BuilderImpl builder ) {
@@ -1321,6 +1503,7 @@ Builder clearRetentionExpirationTime() {
13211503 retention = builder .retention ;
13221504 softDeleteTime = builder .softDeleteTime ;
13231505 hardDeleteTime = builder .hardDeleteTime ;
1506+ contexts = builder .contexts ;
13241507 modifiedFields = builder .modifiedFields .build ();
13251508 }
13261509
@@ -1731,6 +1914,10 @@ public Retention getRetention() {
17311914 return retention ;
17321915 }
17331916
1917+ public ObjectContexts getContexts () {
1918+ return contexts ;
1919+ }
1920+
17341921 /** Returns a builder for the current blob. */
17351922 public Builder toBuilder () {
17361923 return new BuilderImpl (this );
@@ -1745,6 +1932,7 @@ public String toString() {
17451932 .add ("size" , getSize ())
17461933 .add ("content-type" , getContentType ())
17471934 .add ("metadata" , getMetadata ())
1935+ .add ("contexts" , getContexts ())
17481936 .toString ();
17491937 }
17501938
@@ -1783,7 +1971,8 @@ public int hashCode() {
17831971 retention ,
17841972 retentionExpirationTime ,
17851973 softDeleteTime ,
1786- hardDeleteTime );
1974+ hardDeleteTime ,
1975+ contexts );
17871976 }
17881977
17891978 @ Override
@@ -1827,7 +2016,8 @@ public boolean equals(Object o) {
18272016 && Objects .equals (retentionExpirationTime , blobInfo .retentionExpirationTime )
18282017 && Objects .equals (retention , blobInfo .retention )
18292018 && Objects .equals (softDeleteTime , blobInfo .softDeleteTime )
1830- && Objects .equals (hardDeleteTime , blobInfo .hardDeleteTime );
2019+ && Objects .equals (hardDeleteTime , blobInfo .hardDeleteTime )
2020+ && Objects .equals (contexts , blobInfo .contexts );
18312021 }
18322022
18332023 ImmutableSet <NamedField > getModifiedFields () {
0 commit comments