@@ -932,7 +932,40 @@ public Acl getDefaultAcl(String bucket, Entity entity) {
932
932
933
933
@ Override
934
934
public boolean deleteDefaultAcl (String bucket , Entity entity ) {
935
- return throwNotYetImplemented (fmtMethodName ("deleteDefaultAcl" , String .class , Entity .class ));
935
+ try {
936
+ com .google .storage .v2 .Bucket resp = getBucketDefaultAcls (bucket );
937
+ String encode = codecs .entity ().encode (entity );
938
+
939
+ Predicate <ObjectAccessControl > entityPredicate = objectAclEntityOrAltEq (encode );
940
+
941
+ List <ObjectAccessControl > currentDefaultAcls = resp .getDefaultObjectAclList ();
942
+ ImmutableList <ObjectAccessControl > newDefaultAcls =
943
+ currentDefaultAcls .stream ()
944
+ .filter (entityPredicate .negate ())
945
+ .collect (ImmutableList .toImmutableList ());
946
+ if (newDefaultAcls .equals (currentDefaultAcls )) {
947
+ // we didn't actually filter anything out, no need to send an RPC, simply return false
948
+ return false ;
949
+ }
950
+ long metageneration = resp .getMetageneration ();
951
+
952
+ UpdateBucketRequest req = createUpdateRequest (bucket , newDefaultAcls , metageneration );
953
+
954
+ com .google .storage .v2 .Bucket updateResult = updateBucket (req );
955
+ // read the response to ensure there is no longer an acl for the specified entity
956
+ Optional <ObjectAccessControl > first =
957
+ updateResult .getDefaultObjectAclList ().stream ().filter (entityPredicate ).findFirst ();
958
+ return !first .isPresent ();
959
+ } catch (NotFoundException e ) {
960
+ // HttpStorageRpc returns false if the bucket doesn't exist :(
961
+ return false ;
962
+ } catch (StorageException se ) {
963
+ if (se .getCode () == 404 ) {
964
+ return false ;
965
+ } else {
966
+ throw se ;
967
+ }
968
+ }
936
969
}
937
970
938
971
@ Override
@@ -949,36 +982,17 @@ public Acl updateDefaultAcl(String bucket, Acl acl) {
949
982
950
983
Predicate <ObjectAccessControl > entityPredicate = objectAclEntityOrAltEq (entity );
951
984
952
- ImmutableList <ObjectAccessControl > collect =
985
+ ImmutableList <ObjectAccessControl > newDefaultAcls =
953
986
Streams .concat (
954
987
resp .getDefaultObjectAclList ().stream ().filter (entityPredicate .negate ()),
955
988
Stream .of (encode ))
956
989
.collect (ImmutableList .toImmutableList ());
957
990
958
- com .google .storage .v2 .Bucket update =
959
- com .google .storage .v2 .Bucket .newBuilder ()
960
- .setName (bucketNameCodec .encode (bucket ))
961
- .addAllDefaultObjectAcl (collect )
962
- .build ();
963
- Opts <BucketTargetOpt > opts =
964
- Opts .from (
965
- UnifiedOpts .fields (ImmutableSet .of (BucketField .DEFAULT_OBJECT_ACL )),
966
- UnifiedOpts .metagenerationMatch (resp .getMetageneration ()));
967
991
UpdateBucketRequest req =
968
- opts .updateBucketsRequest ()
969
- .apply (UpdateBucketRequest .newBuilder ())
970
- .setBucket (update )
971
- .build ();
992
+ createUpdateRequest (bucket , newDefaultAcls , resp .getMetageneration ());
972
993
973
- GrpcCallContext grpcCallContext = GrpcCallContext .createDefault ();
974
- com .google .storage .v2 .Bucket updateResult =
975
- Retrying .run (
976
- getOptions (),
977
- retryAlgorithmManager .getFor (req ),
978
- () -> storageClient .updateBucketCallable ().call (req , grpcCallContext ),
979
- Decoder .identity ());
994
+ com .google .storage .v2 .Bucket updateResult = updateBucket (req );
980
995
981
- //noinspection DataFlowIssue
982
996
Optional <Acl > first =
983
997
updateResult .getDefaultObjectAclList ().stream ()
984
998
.filter (entityPredicate )
@@ -1488,4 +1502,30 @@ private com.google.storage.v2.Bucket getBucketDefaultAcls(String bucketName) {
1488
1502
() -> storageClient .getBucketCallable ().call (req , grpcCallContext ),
1489
1503
Decoder .identity ());
1490
1504
}
1505
+
1506
+ private com .google .storage .v2 .Bucket updateBucket (UpdateBucketRequest req ) {
1507
+ GrpcCallContext grpcCallContext = GrpcCallContext .createDefault ();
1508
+ return Retrying .run (
1509
+ getOptions (),
1510
+ retryAlgorithmManager .getFor (req ),
1511
+ () -> storageClient .updateBucketCallable ().call (req , grpcCallContext ),
1512
+ Decoder .identity ());
1513
+ }
1514
+
1515
+ private static UpdateBucketRequest createUpdateRequest (
1516
+ String bucket , ImmutableList <ObjectAccessControl > newDefaultAcls , long metageneration ) {
1517
+ com .google .storage .v2 .Bucket update =
1518
+ com .google .storage .v2 .Bucket .newBuilder ()
1519
+ .setName (bucketNameCodec .encode (bucket ))
1520
+ .addAllDefaultObjectAcl (newDefaultAcls )
1521
+ .build ();
1522
+ Opts <BucketTargetOpt > opts =
1523
+ Opts .from (
1524
+ UnifiedOpts .fields (ImmutableSet .of (BucketField .DEFAULT_OBJECT_ACL )),
1525
+ UnifiedOpts .metagenerationMatch (metageneration ));
1526
+ return opts .updateBucketsRequest ()
1527
+ .apply (UpdateBucketRequest .newBuilder ())
1528
+ .setBucket (update )
1529
+ .build ();
1530
+ }
1491
1531
}
0 commit comments