26
26
*/
27
27
package com .emc .object .s3 ;
28
28
29
+ import com .emc .object .s3 .bean .ObjectLockLegalHold ;
30
+ import com .emc .object .s3 .bean .ObjectLockRetention ;
31
+ import com .emc .object .s3 .bean .ObjectLockRetentionMode ;
29
32
import com .emc .object .util .RestUtil ;
30
33
34
+ import java .time .ZonedDateTime ;
31
35
import java .util .*;
32
36
33
37
public class S3ObjectMetadata {
@@ -48,6 +52,8 @@ public class S3ObjectMetadata {
48
52
private Date httpExpires ;
49
53
private Date lastModified ;
50
54
private String versionId ;
55
+ private ObjectLockLegalHold objectLockLegalHold ;
56
+ private ObjectLockRetention objectLockRetention ;
51
57
private Map <String , String > userMetadata = new TreeMap <String , String >(String .CASE_INSENSITIVE_ORDER );
52
58
53
59
public static <T > S3ObjectMetadata fromHeaders (Map <String , List <T >> headers ) {
@@ -77,6 +83,8 @@ public static <T> S3ObjectMetadata fromHeaders(Map<String, List<T>> headers) {
77
83
objectMetadata .expirationDate = getExpirationDate (headers );
78
84
objectMetadata .expirationRuleId = getExpirationRuleId (headers );
79
85
objectMetadata .userMetadata = getUserMetadata (headers );
86
+ objectMetadata .objectLockLegalHold = getObjectLockLegalHold (headers );
87
+ objectMetadata .objectLockRetention = getObjectLockRetention (headers );
80
88
return objectMetadata ;
81
89
}
82
90
@@ -124,6 +132,24 @@ protected static String getUserMetadataKey(String headerName) {
124
132
return null ;
125
133
}
126
134
135
+ protected static <T > ObjectLockLegalHold getObjectLockLegalHold (Map <String , List <T >> headers ) {
136
+ String objectLockLegalHold = RestUtil .getFirstAsString (headers , S3Constants .AMZ_OBJECT_LOCK_LEGAL_HOLD );
137
+ if (objectLockLegalHold != null ) {
138
+ return new ObjectLockLegalHold ().withStatus (ObjectLockLegalHold .Status .valueOf (objectLockLegalHold ));
139
+ }
140
+ return null ;
141
+ }
142
+
143
+ protected static <T > ObjectLockRetention getObjectLockRetention (Map <String , List <T >> headers ) {
144
+ String objectLockRetentionMode = RestUtil .getFirstAsString (headers , S3Constants .AMZ_OBJECT_LOCK_MODE );
145
+ String retainUntilDate = RestUtil .getFirstAsString (headers , S3Constants .AMZ_OBJECT_LOCK_RETAIN_UNTIL_DATE );
146
+ if (objectLockRetentionMode != null && retainUntilDate != null ) {
147
+ return new ObjectLockRetention ().withMode (ObjectLockRetentionMode .valueOf (objectLockRetentionMode ))
148
+ .withRetainUntilDate (Date .from (ZonedDateTime .parse (retainUntilDate , RestUtil .iso8601MillisecondFormatter ).toInstant ()));
149
+ }
150
+ return null ;
151
+ }
152
+
127
153
public Map <String , List <Object >> toHeaders () {
128
154
Map <String , List <Object >> headers = new HashMap <String , List <Object >>();
129
155
RestUtil .putSingle (headers , RestUtil .HEADER_CACHE_CONTROL , cacheControl );
@@ -134,6 +160,15 @@ public Map<String, List<Object>> toHeaders() {
134
160
RestUtil .putSingle (headers , RestUtil .HEADER_EXPIRES , RestUtil .headerFormat (httpExpires ));
135
161
RestUtil .putSingle (headers , RestUtil .EMC_RETENTION_PERIOD , retentionPeriod );
136
162
RestUtil .putSingle (headers , RestUtil .EMC_RETENTION_POLICY , retentionPolicy );
163
+ if (objectLockLegalHold != null )
164
+ RestUtil .putSingle (headers , S3Constants .AMZ_OBJECT_LOCK_LEGAL_HOLD , objectLockLegalHold .getStatus ());
165
+ //Object Lock Mode and RetainUntilDate must both be supplied
166
+ if (objectLockRetention != null && objectLockRetention .getMode () != null && objectLockRetention .getRetainUntilDate () != null ) {
167
+ RestUtil .putSingle (headers , S3Constants .AMZ_OBJECT_LOCK_MODE , objectLockRetention .getMode ());
168
+ RestUtil .putSingle (headers , S3Constants .AMZ_OBJECT_LOCK_RETAIN_UNTIL_DATE ,
169
+ RestUtil .iso8601MillisecondFormatter .format (objectLockRetention .getRetainUntilDate ().toInstant ()));
170
+ }
171
+
137
172
headers .putAll (getUmdHeaders (userMetadata ));
138
173
return headers ;
139
174
}
@@ -285,6 +320,22 @@ public String getDecodedUserMetadata(String name) {
285
320
return RestUtil .urlDecode (getUserMetadata (name ));
286
321
}
287
322
323
+ public ObjectLockLegalHold getObjectLockLegalHold () {
324
+ return objectLockLegalHold ;
325
+ }
326
+
327
+ public void setObjectLockLegalHold (ObjectLockLegalHold objectLockLegalHold ) {
328
+ this .objectLockLegalHold = objectLockLegalHold ;
329
+ }
330
+
331
+ public ObjectLockRetention getObjectLockRetention () {
332
+ return objectLockRetention ;
333
+ }
334
+
335
+ public void setObjectLockRetention (ObjectLockRetention objectLockRetention ) {
336
+ this .objectLockRetention = objectLockRetention ;
337
+ }
338
+
288
339
public S3ObjectMetadata addUserMetadata (String name , String value ) {
289
340
userMetadata .put (name , value );
290
341
return this ;
@@ -343,4 +394,14 @@ public S3ObjectMetadata withRetentionPolicy(String retentionPolicy) {
343
394
setRetentionPolicy (retentionPolicy );
344
395
return this ;
345
396
}
397
+
398
+ public S3ObjectMetadata withObjectLockLegalHold (ObjectLockLegalHold objectLockLegalHold ) {
399
+ setObjectLockLegalHold (objectLockLegalHold );
400
+ return this ;
401
+ }
402
+
403
+ public S3ObjectMetadata withObjectLockRetention (ObjectLockRetention objectLockRetention ) {
404
+ setObjectLockRetention (objectLockRetention );
405
+ return this ;
406
+ }
346
407
}
0 commit comments