|
17 | 17 | package com.google.cloud.storage; |
18 | 18 |
|
19 | 19 | import static com.google.cloud.RetryHelper.runWithRetries; |
| 20 | +import static com.google.cloud.storage.PolicyHelper.convertFromApiPolicy; |
| 21 | +import static com.google.cloud.storage.PolicyHelper.convertToApiPolicy; |
20 | 22 | import static com.google.cloud.storage.spi.v1.StorageRpc.Option.DELIMITER; |
21 | 23 | import static com.google.cloud.storage.spi.v1.StorageRpc.Option.IF_GENERATION_MATCH; |
22 | 24 | import static com.google.cloud.storage.spi.v1.StorageRpc.Option.IF_GENERATION_NOT_MATCH; |
|
31 | 33 | import static com.google.common.base.Preconditions.checkState; |
32 | 34 | import static java.nio.charset.StandardCharsets.UTF_8; |
33 | 35 |
|
| 36 | +import java.io.ByteArrayInputStream; |
| 37 | +import java.io.InputStream; |
| 38 | +import java.io.UnsupportedEncodingException; |
| 39 | +import java.net.MalformedURLException; |
| 40 | +import java.net.URL; |
| 41 | +import java.net.URLEncoder; |
| 42 | +import java.util.Arrays; |
| 43 | +import java.util.Collections; |
| 44 | +import java.util.EnumMap; |
| 45 | +import java.util.List; |
| 46 | +import java.util.Map; |
| 47 | +import java.util.Set; |
| 48 | +import java.util.concurrent.Callable; |
| 49 | +import java.util.concurrent.TimeUnit; |
| 50 | + |
34 | 51 | import com.google.api.gax.core.Page; |
35 | 52 | import com.google.api.services.storage.model.BucketAccessControl; |
36 | 53 | import com.google.api.services.storage.model.ObjectAccessControl; |
37 | 54 | import com.google.api.services.storage.model.StorageObject; |
| 55 | +import com.google.api.services.storage.model.TestIamPermissionsResponse; |
38 | 56 | import com.google.auth.ServiceAccountSigner; |
39 | 57 | import com.google.cloud.BaseService; |
40 | 58 | import com.google.cloud.BatchResult; |
41 | 59 | import com.google.cloud.PageImpl; |
42 | 60 | import com.google.cloud.PageImpl.NextPageFetcher; |
| 61 | +import com.google.cloud.Policy; |
43 | 62 | import com.google.cloud.ReadChannel; |
44 | 63 | import com.google.cloud.RetryHelper.RetryHelperException; |
45 | 64 | import com.google.cloud.storage.Acl.Entity; |
|
49 | 68 | import com.google.common.base.Function; |
50 | 69 | import com.google.common.collect.ImmutableList; |
51 | 70 | import com.google.common.collect.ImmutableMap; |
| 71 | +import com.google.common.collect.ImmutableSet; |
52 | 72 | import com.google.common.collect.Iterables; |
53 | 73 | import com.google.common.collect.Lists; |
54 | 74 | import com.google.common.collect.Maps; |
|
57 | 77 | import com.google.common.net.UrlEscapers; |
58 | 78 | import com.google.common.primitives.Ints; |
59 | 79 |
|
60 | | -import java.io.ByteArrayInputStream; |
61 | | -import java.io.InputStream; |
62 | | -import java.io.UnsupportedEncodingException; |
63 | | -import java.net.MalformedURLException; |
64 | | -import java.net.URL; |
65 | | -import java.net.URLEncoder; |
66 | | -import java.util.Arrays; |
67 | | -import java.util.Collections; |
68 | | -import java.util.EnumMap; |
69 | | -import java.util.List; |
70 | | -import java.util.Map; |
71 | | -import java.util.concurrent.Callable; |
72 | | -import java.util.concurrent.TimeUnit; |
73 | | - |
74 | 80 | final class StorageImpl extends BaseService<StorageOptions> implements Storage { |
75 | 81 |
|
76 | 82 | private static final byte[] EMPTY_BYTE_ARRAY = {}; |
@@ -854,6 +860,58 @@ public List<ObjectAccessControl> call() { |
854 | 860 | throw StorageException.translateAndThrow(e); |
855 | 861 | } |
856 | 862 | } |
| 863 | + |
| 864 | + @Override |
| 865 | + public Policy getIamPolicy(final String bucket) { |
| 866 | + try { |
| 867 | + return convertFromApiPolicy(runWithRetries(new Callable<com.google.api.services.storage.model.Policy>() { |
| 868 | + @Override |
| 869 | + public com.google.api.services.storage.model.Policy call() { |
| 870 | + return storageRpc.getIamPolicy(bucket); |
| 871 | + } |
| 872 | + }, getOptions().getRetrySettings(), EXCEPTION_HANDLER, getOptions().getClock())); |
| 873 | + } catch (RetryHelperException e){ |
| 874 | + throw StorageException.translateAndThrow(e); |
| 875 | + } |
| 876 | + } |
| 877 | + |
| 878 | + @Override |
| 879 | + public Policy setIamPolicy(final String bucket, final Policy policy) { |
| 880 | + try { |
| 881 | + return convertFromApiPolicy(runWithRetries(new Callable<com.google.api.services.storage.model.Policy>() { |
| 882 | + @Override |
| 883 | + public com.google.api.services.storage.model.Policy call() { |
| 884 | + return storageRpc.setIamPolicy(bucket, convertToApiPolicy(policy)); |
| 885 | + } |
| 886 | + }, getOptions().getRetrySettings(), EXCEPTION_HANDLER, getOptions().getClock())); |
| 887 | + } catch (RetryHelperException e) { |
| 888 | + throw StorageException.translateAndThrow(e); |
| 889 | + } |
| 890 | + } |
| 891 | + |
| 892 | + @Override |
| 893 | + public List<Boolean> testIamPermissions(final String bucket, final List<String> permissions) { |
| 894 | + try { |
| 895 | + TestIamPermissionsResponse response = runWithRetries(new Callable<TestIamPermissionsResponse>() { |
| 896 | + @Override |
| 897 | + public TestIamPermissionsResponse call() { |
| 898 | + return storageRpc.testIamPermissions(bucket, permissions); |
| 899 | + } |
| 900 | + }, getOptions().getRetrySettings(), EXCEPTION_HANDLER, getOptions().getClock()); |
| 901 | + final Set<String> heldPermissions = |
| 902 | + response.getPermissions() != null |
| 903 | + ? ImmutableSet.copyOf(response.getPermissions()) |
| 904 | + : ImmutableSet.<String>of(); |
| 905 | + return Lists.transform(permissions, new Function<String, Boolean>() { |
| 906 | + @Override |
| 907 | + public Boolean apply(String permission) { |
| 908 | + return heldPermissions.contains(permission); |
| 909 | + } |
| 910 | + }); |
| 911 | + } catch (RetryHelperException e) { |
| 912 | + throw StorageException.translateAndThrow(e); |
| 913 | + } |
| 914 | + } |
857 | 915 |
|
858 | 916 | private static <T> void addToOptionMap(StorageRpc.Option option, T defaultValue, |
859 | 917 | Map<StorageRpc.Option, Object> map) { |
|
0 commit comments