@@ -932,7 +932,40 @@ public Acl getDefaultAcl(String bucket, Entity entity) {
932932
933933 @ Override
934934 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+ }
936969 }
937970
938971 @ Override
@@ -949,36 +982,17 @@ public Acl updateDefaultAcl(String bucket, Acl acl) {
949982
950983 Predicate <ObjectAccessControl > entityPredicate = objectAclEntityOrAltEq (entity );
951984
952- ImmutableList <ObjectAccessControl > collect =
985+ ImmutableList <ObjectAccessControl > newDefaultAcls =
953986 Streams .concat (
954987 resp .getDefaultObjectAclList ().stream ().filter (entityPredicate .negate ()),
955988 Stream .of (encode ))
956989 .collect (ImmutableList .toImmutableList ());
957990
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 ()));
967991 UpdateBucketRequest req =
968- opts .updateBucketsRequest ()
969- .apply (UpdateBucketRequest .newBuilder ())
970- .setBucket (update )
971- .build ();
992+ createUpdateRequest (bucket , newDefaultAcls , resp .getMetageneration ());
972993
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 );
980995
981- //noinspection DataFlowIssue
982996 Optional <Acl > first =
983997 updateResult .getDefaultObjectAclList ().stream ()
984998 .filter (entityPredicate )
@@ -1488,4 +1502,30 @@ private com.google.storage.v2.Bucket getBucketDefaultAcls(String bucketName) {
14881502 () -> storageClient .getBucketCallable ().call (req , grpcCallContext ),
14891503 Decoder .identity ());
14901504 }
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+ }
14911531}
0 commit comments