com.azure.storage.blob.BlobContainerClient Maven / Gradle / Ivy
Show all versions of azure-storage-blob Show documentation
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
package com.azure.storage.blob;
import com.azure.core.annotation.ReturnType;
import com.azure.core.annotation.ServiceClient;
import com.azure.core.annotation.ServiceMethod;
import com.azure.core.http.HttpPipeline;
import com.azure.core.http.rest.PagedIterable;
import com.azure.core.http.rest.Response;
import com.azure.core.util.Context;
import com.azure.storage.blob.models.BlobContainerAccessPolicies;
import com.azure.storage.blob.models.BlobContainerProperties;
import com.azure.storage.blob.models.BlobItem;
import com.azure.storage.blob.models.BlobRequestConditions;
import com.azure.storage.blob.models.BlobSignedIdentifier;
import com.azure.storage.blob.models.CpkInfo;
import com.azure.storage.blob.models.ListBlobsOptions;
import com.azure.storage.blob.models.PublicAccessType;
import com.azure.storage.blob.models.StorageAccountInfo;
import com.azure.storage.blob.models.TaggedBlobItem;
import com.azure.storage.blob.models.UserDelegationKey;
import com.azure.storage.blob.options.BlobContainerCreateOptions;
import com.azure.storage.blob.options.FindBlobsOptions;
import com.azure.storage.blob.sas.BlobServiceSasSignatureValues;
import com.azure.storage.common.StorageSharedKeyCredential;
import com.azure.storage.common.implementation.StorageImplUtils;
import reactor.core.publisher.Mono;
import java.time.Duration;
import java.time.OffsetDateTime;
import java.util.List;
import java.util.Map;
import static com.azure.storage.common.implementation.StorageImplUtils.blockWithOptionalTimeout;
/**
* Client to a container. It may only be instantiated through a {@link BlobContainerClientBuilder} or via the method
* {@link BlobServiceClient#getBlobContainerClient(String)}. This class does not hold any state about a particular
* container but is instead a convenient way of sending off appropriate requests to the resource on the service. It may
* also be used to construct URLs to blobs.
*
*
* This client contains operations on a container. Operations on a blob are available on {@link BlobClient} through
* {@link #getBlobClient(String)}, and operations on the service are available on {@link BlobServiceClient}.
*
*
* Please refer to the Azure
* Docs for more information on containers.
*/
@ServiceClient(builder = BlobContainerClientBuilder.class)
public final class BlobContainerClient {
private final BlobContainerAsyncClient client;
/**
* Special container name for the root container in the Storage account.
*/
public static final String ROOT_CONTAINER_NAME = BlobContainerAsyncClient.ROOT_CONTAINER_NAME;
/**
* Special container name for the static website container in the Storage account.
*/
public static final String STATIC_WEBSITE_CONTAINER_NAME = BlobContainerAsyncClient.STATIC_WEBSITE_CONTAINER_NAME;
/**
* Special container name for the logs container in the Storage account.
*/
public static final String LOG_CONTAINER_NAME = BlobContainerAsyncClient.LOG_CONTAINER_NAME;
/**
* Package-private constructor for use by {@link BlobContainerClientBuilder}.
*
* @param client the async container client
*/
BlobContainerClient(BlobContainerAsyncClient client) {
this.client = client;
}
/**
* Initializes a new BlobClient object by concatenating blobName to the end of ContainerAsyncClient's URL. The new
* BlobClient uses the same request policy pipeline as the ContainerAsyncClient.
*
* @param blobName A {@code String} representing the name of the blob. If the blob name contains special characters,
* pass in the url encoded version of the blob name.
*
*
Code Samples
*
*
*
* BlobClient blobClient = client.getBlobClient(blobName);
*
*
* @return A new {@link BlobClient} object which references the blob with the specified name in this container.
*/
public BlobClient getBlobClient(String blobName) {
return new BlobClient(client.getBlobAsyncClient(blobName));
}
/**
* Initializes a new BlobClient object by concatenating blobName to the end of ContainerAsyncClient's URL. The new
* BlobClient uses the same request policy pipeline as the ContainerAsyncClient.
*
* Code Samples
*
*
*
* BlobClient blobClient = client.getBlobClient(blobName, snapshot);
*
*
*
* @param blobName A {@code String} representing the name of the blob. If the blob name contains special characters,
* pass in the url encoded version of the blob name.
* @param snapshot the snapshot identifier for the blob.
* @return A new {@link BlobClient} object which references the blob with the specified name in this container.
*/
public BlobClient getBlobClient(String blobName, String snapshot) {
return new BlobClient(client.getBlobAsyncClient(blobName, snapshot));
}
/**
* Initializes a new BlobClient object by concatenating blobName to the end of ContainerAsyncClient's URL. The new
* BlobClient uses the same request policy pipeline as the ContainerAsyncClient.
*
* @param blobName A {@code String} representing the name of the blob. If the blob name contains special characters,
* pass in the url encoded version of the blob name.
* @param versionId the version identifier for the blob, pass {@code null} to interact with the latest blob version.
* @return A new {@link BlobClient} object which references the blob with the specified name in this container.
*/
public BlobClient getBlobVersionClient(String blobName, String versionId) {
return new BlobClient(client.getBlobVersionAsyncClient(blobName, versionId));
}
/**
* Get the container name.
*
* Code Samples
*
*
*
* String containerName = client.getBlobContainerName();
* System.out.println("The name of the blob is " + containerName);
*
*
*
* @return The name of container.
*/
public String getBlobContainerName() {
return this.client.getBlobContainerName();
}
/**
* Get the url of the storage account.
*
* @return the URL of the storage account
*/
public String getAccountUrl() {
return this.client.getAccountUrl();
}
/**
* Gets the URL of the container represented by this client.
*
* @return the URL.
*/
public String getBlobContainerUrl() {
return client.getBlobContainerUrl();
}
/**
* Get associated account name.
*
* @return account name associated with this storage resource.
*/
public String getAccountName() {
return this.client.getAccountName();
}
/**
* Get a client pointing to the account.
*
* @return {@link BlobServiceClient}
*/
public BlobServiceClient getServiceClient() {
return this.client.getServiceClientBuilder().buildClient();
}
/**
* Gets the service version the client is using.
*
* @return the service version the client is using.
*/
public BlobServiceVersion getServiceVersion() {
return this.client.getServiceVersion();
}
/**
* Gets the {@link HttpPipeline} powering this client.
*
* @return The pipeline.
*/
public HttpPipeline getHttpPipeline() {
return client.getHttpPipeline();
}
/**
* Gets the {@link CpkInfo} associated with this client that will be passed to {@link BlobClient BlobClients} when
* {@link #getBlobClient(String) getBlobClient} is called.
*
* @return the customer provided key used for encryption.
*/
public CpkInfo getCustomerProvidedKey() {
return client.getCustomerProvidedKey();
}
/**
* Gets the {@code encryption scope} used to encrypt this blob's content on the server.
*
* @return the encryption scope used for encryption.
*/
public String getEncryptionScope() {
return client.getEncryptionScope();
}
/**
* Gets if the container this client represents exists in the cloud.
*
* Code Samples
*
*
*
* System.out.printf("Exists? %b%n", client.exists());
*
*
*
* @return true if the container exists, false if it doesn't
*/
@ServiceMethod(returns = ReturnType.SINGLE)
public boolean exists() {
return existsWithResponse(null, Context.NONE).getValue();
}
/**
* Gets if the container this client represents exists in the cloud.
* Code Samples
*
*
*
* Context context = new Context("Key", "Value");
* System.out.printf("Exists? %b%n", client.existsWithResponse(timeout, context).getValue());
*
*
*
* @param timeout An optional timeout value beyond which a {@link RuntimeException} will be raised.
* @param context Additional context that is passed through the Http pipeline during the service call.
* @return true if the container exists, false if it doesn't
*/
@ServiceMethod(returns = ReturnType.SINGLE)
public Response existsWithResponse(Duration timeout, Context context) {
Mono> response = client.existsWithResponse(context);
return blockWithOptionalTimeout(response, timeout);
}
/**
* Creates a new container within a storage account. If a container with the same name already exists, the operation
* fails. For more information, see the
* Azure Docs.
*
* Code Samples
*
*
*
* try {
* client.create();
* System.out.printf("Create completed%n");
* } catch (BlobStorageException error) {
* if (error.getErrorCode().equals(BlobErrorCode.CONTAINER_ALREADY_EXISTS)) {
* System.out.printf("Can't create container. It already exists %n");
* }
* }
*
*
*/
@ServiceMethod(returns = ReturnType.SINGLE)
public void create() {
createWithResponse(null, null, null, Context.NONE);
}
/**
* Creates a new container within a storage account. If a container with the same name already exists, the operation
* fails. For more information, see the
* Azure Docs.
*
* Code Samples
*
*
*
* Map<String, String> metadata = Collections.singletonMap("metadata", "value");
* Context context = new Context("Key", "Value");
*
* System.out.printf("Create completed with status %d%n",
* client.createWithResponse(metadata, PublicAccessType.CONTAINER, timeout, context).getStatusCode());
*
*
*
* @param metadata Metadata to associate with the container. If there is leading or trailing whitespace in any
* metadata key or value, it must be removed or encoded.
* @param accessType Specifies how the data in this container is available to the public. See the
* x-ms-blob-public-access header in the Azure Docs for more information. Pass null for no public access.
* @param timeout An optional timeout value beyond which a {@link RuntimeException} will be raised.
* @param context Additional context that is passed through the Http pipeline during the service call.
* @return A response containing status code and HTTP headers
*/
@ServiceMethod(returns = ReturnType.SINGLE)
public Response createWithResponse(Map metadata, PublicAccessType accessType,
Duration timeout, Context context) {
Mono> response = client.createWithResponse(metadata, accessType, context);
return blockWithOptionalTimeout(response, timeout);
}
/**
* Creates a new container within a storage account if it does not exist. For more information, see the
* Azure Docs.
*
* Code Samples
*
*
*
* boolean result = client.createIfNotExists();
* System.out.println("Create completed: " + result);
*
*
*
* @return {@code true} if container is successfully created, {@code false} if container already exists.
*/
@ServiceMethod(returns = ReturnType.SINGLE)
public boolean createIfNotExists() {
return createIfNotExistsWithResponse(null, null, null).getValue();
}
/**
* Creates a new container within a storage account if it does not exist. For more information, see the
* Azure Docs.
*
* Code Samples
*
*
*
* Map<String, String> metadata = Collections.singletonMap("metadata", "value");
* Context context = new Context("Key", "Value");
* BlobContainerCreateOptions options = new BlobContainerCreateOptions().setMetadata(metadata)
* .setPublicAccessType(PublicAccessType.CONTAINER);
*
* Response<Boolean> response = client.createIfNotExistsWithResponse(options, timeout, context);
* if (response.getStatusCode() == 409) {
* System.out.println("Already existed.");
* } else {
* System.out.printf("Create completed with status %d%n", response.getStatusCode());
* }
*
*
*
* @param options {@link BlobContainerCreateOptions}
* @param timeout An optional timeout value beyond which a {@link RuntimeException} will be raised.
* @param context Additional context that is passed through the Http pipeline during the service call.
* @return A response containing status code and HTTP headers. If {@link Response}'s status code is 201, a new
* container was successfully created. If status code is 409, a container already existed at this location.
*/
@ServiceMethod(returns = ReturnType.SINGLE)
public Response createIfNotExistsWithResponse(BlobContainerCreateOptions options, Duration timeout,
Context context) {
return StorageImplUtils.blockWithOptionalTimeout(client.
createIfNotExistsWithResponse(options, context), timeout);
}
/**
* Marks the specified container for deletion. The container and any blobs contained within it are later deleted
* during garbage collection. For more information, see the
* Azure Docs.
*
* Code Samples
*
*
*
* try {
* client.delete();
* System.out.printf("Delete completed%n");
* } catch (BlobStorageException error) {
* if (error.getErrorCode().equals(BlobErrorCode.CONTAINER_NOT_FOUND)) {
* System.out.printf("Delete failed. Container was not found %n");
* }
* }
*
*
*/
@ServiceMethod(returns = ReturnType.SINGLE)
public void delete() {
deleteWithResponse(null, null, Context.NONE);
}
/**
* Marks the specified container for deletion. The container and any blobs contained within it are later deleted
* during garbage collection. For more information, see the
* Azure Docs.
*
* Code Samples
*
*
*
* BlobRequestConditions requestConditions = new BlobRequestConditions()
* .setLeaseId(leaseId)
* .setIfUnmodifiedSince(OffsetDateTime.now().minusDays(3));
* Context context = new Context("Key", "Value");
*
* System.out.printf("Delete completed with status %d%n", client.deleteWithResponse(
* requestConditions, timeout, context).getStatusCode());
*
*
*
* @param requestConditions {@link BlobRequestConditions}
* @param timeout An optional timeout value beyond which a {@link RuntimeException} will be raised.
* @param context Additional context that is passed through the Http pipeline during the service call.
* @return A response containing status code and HTTP headers
*/
@ServiceMethod(returns = ReturnType.SINGLE)
public Response deleteWithResponse(BlobRequestConditions requestConditions, Duration timeout,
Context context) {
Mono> response = client.deleteWithResponse(requestConditions, context);
return blockWithOptionalTimeout(response, timeout);
}
/**
* Marks the specified container for deletion if it exists. The container and any blobs contained within
* it are later deleted during garbage collection. For more information, see the
* Azure Docs.
*
* Code Samples
*
*
*
* boolean result = client.deleteIfExists();
* System.out.println("Delete completed: " + result);
*
*
* @return {@code true} if container is successfully deleted, {@code false} if container does not exist.
*/
@ServiceMethod(returns = ReturnType.SINGLE)
public boolean deleteIfExists() {
return deleteIfExistsWithResponse(null, null, Context.NONE).getValue();
}
/**
* Marks the specified container for deletion if it exists. The container and any blobs contained within it
* are later deleted during garbage collection. For more information, see the
* Azure Docs.
*
* Code Samples
*
*
*
* BlobRequestConditions requestConditions = new BlobRequestConditions()
* .setLeaseId(leaseId)
* .setIfUnmodifiedSince(OffsetDateTime.now().minusDays(3));
* Context context = new Context("Key", "Value");
*
* Response<Boolean> response = client.deleteIfExistsWithResponse(requestConditions, timeout, context);
* if (response.getStatusCode() == 404) {
* System.out.println("Does not exist.");
* } else {
* System.out.printf("Delete completed with status %d%n", response.getStatusCode());
* }
*
*
*
* @param requestConditions {@link BlobRequestConditions}
* @param timeout An optional timeout value beyond which a {@link RuntimeException} will be raised.
* @param context Additional context that is passed through the Http pipeline during the service call.
* @return A response containing status code and HTTP headers. If {@link Response}'s status code is 202, the container
* was successfully deleted. If status code is 404, the container does not exist.
*/
@ServiceMethod(returns = ReturnType.SINGLE)
public Response deleteIfExistsWithResponse(BlobRequestConditions requestConditions, Duration timeout,
Context context) {
return blockWithOptionalTimeout(client.deleteIfExistsWithResponse(requestConditions, context), timeout);
}
/**
* Returns the container's metadata and system properties. For more information, see the
* Azure Docs.
*
* Code Samples
*
*
*
* BlobContainerProperties properties = client.getProperties();
* System.out.printf("Public Access Type: %s, Legal Hold? %b, Immutable? %b%n",
* properties.getBlobPublicAccess(),
* properties.hasLegalHold(),
* properties.hasImmutabilityPolicy());
*
*
*
* @return The container properties.
*/
@ServiceMethod(returns = ReturnType.SINGLE)
public BlobContainerProperties getProperties() {
return getPropertiesWithResponse(null, null, Context.NONE).getValue();
}
/**
* Returns the container's metadata and system properties. For more information, see the
* Azure Docs.
*
* Code Samples
*
*
*
* Context context = new Context("Key", "Value");
*
* BlobContainerProperties properties = client.getPropertiesWithResponse(leaseId, timeout, context)
* .getValue();
* System.out.printf("Public Access Type: %s, Legal Hold? %b, Immutable? %b%n",
* properties.getBlobPublicAccess(),
* properties.hasLegalHold(),
* properties.hasImmutabilityPolicy());
*
*
*
* @param leaseId The lease ID the active lease on the container must match.
* @param timeout An optional timeout value beyond which a {@link RuntimeException} will be raised.
* @param context Additional context that is passed through the Http pipeline during the service call.
* @return The container properties.
*/
@ServiceMethod(returns = ReturnType.SINGLE)
public Response getPropertiesWithResponse(String leaseId, Duration timeout,
Context context) {
return blockWithOptionalTimeout(client.getPropertiesWithResponse(leaseId, context), timeout);
}
/**
* Sets the container's metadata. For more information, see the
* Azure Docs.
*
* Code Samples
*
*
*
* Map<String, String> metadata = Collections.singletonMap("metadata", "value");
* try {
* client.setMetadata(metadata);
* System.out.printf("Set metadata completed with status %n");
* } catch (UnsupportedOperationException error) {
* System.out.printf("Fail while setting metadata %n");
* }
*
*
*
* @param metadata Metadata to associate with the container. If there is leading or trailing whitespace in any
* metadata key or value, it must be removed or encoded.
*/
@ServiceMethod(returns = ReturnType.SINGLE)
public void setMetadata(Map metadata) {
setMetadataWithResponse(metadata, null, null, Context.NONE);
}
/**
* Sets the container's metadata. For more information, see the
* Azure Docs.
*
* Code Samples
*
*
*
* Map<String, String> metadata = Collections.singletonMap("metadata", "value");
* BlobRequestConditions requestConditions = new BlobRequestConditions()
* .setLeaseId(leaseId)
* .setIfUnmodifiedSince(OffsetDateTime.now().minusDays(3));
* Context context = new Context("Key", "Value");
*
* System.out.printf("Set metadata completed with status %d%n",
* client.setMetadataWithResponse(metadata, requestConditions, timeout, context).getStatusCode());
*
*
* @param metadata Metadata to associate with the container. If there is leading or trailing whitespace in any
* metadata key or value, it must be removed or encoded.
* @param requestConditions {@link BlobRequestConditions}
* @param timeout An optional timeout value beyond which a {@link RuntimeException} will be raised.
* @param context Additional context that is passed through the Http pipeline during the service call.
* @return A response containing status code and HTTP headers
*/
@ServiceMethod(returns = ReturnType.SINGLE)
public Response setMetadataWithResponse(Map metadata,
BlobRequestConditions requestConditions, Duration timeout, Context context) {
Mono> response = client.setMetadataWithResponse(metadata, requestConditions,
context);
return blockWithOptionalTimeout(response, timeout);
}
/**
* Returns the container's permissions. The permissions indicate whether container's blobs may be accessed publicly.
* For more information, see the
* Azure Docs.
*
* Code Samples
*
*
*
* BlobContainerAccessPolicies accessPolicies = client.getAccessPolicy();
* System.out.printf("Blob Access Type: %s%n", accessPolicies.getBlobAccessType());
*
* for (BlobSignedIdentifier identifier : accessPolicies.getIdentifiers()) {
* System.out.printf("Identifier Name: %s, Permissions %s%n",
* identifier.getId(),
* identifier.getAccessPolicy().getPermissions());
* }
*
*
*
* @return The container access policy.
*/
@ServiceMethod(returns = ReturnType.SINGLE)
public BlobContainerAccessPolicies getAccessPolicy() {
return getAccessPolicyWithResponse(null, null, Context.NONE).getValue();
}
/**
* Returns the container's permissions. The permissions indicate whether container's blobs may be accessed publicly.
* For more information, see the
* Azure Docs.
*
* Code Samples
*
*
*
* Context context = new Context("Key", "Value");
* BlobContainerAccessPolicies accessPolicies = client.getAccessPolicyWithResponse(leaseId, timeout, context)
* .getValue();
* System.out.printf("Blob Access Type: %s%n", accessPolicies.getBlobAccessType());
*
* for (BlobSignedIdentifier identifier : accessPolicies.getIdentifiers()) {
* System.out.printf("Identifier Name: %s, Permissions %s%n",
* identifier.getId(),
* identifier.getAccessPolicy().getPermissions());
* }
*
*
*
* @param leaseId The lease ID the active lease on the container must match.
* @param timeout An optional timeout value beyond which a {@link RuntimeException} will be raised.
* @param context Additional context that is passed through the Http pipeline during the service call.
* @return The container access policy.
*/
@ServiceMethod(returns = ReturnType.SINGLE)
public Response getAccessPolicyWithResponse(String leaseId, Duration timeout,
Context context) {
return blockWithOptionalTimeout(client.getAccessPolicyWithResponse(leaseId, context), timeout);
}
/**
* Sets the container's permissions. The permissions indicate whether blobs in a container may be accessed publicly.
* Note that, for each signed identifier, we will truncate the start and expiry times to the nearest second to
* ensure the time formatting is compatible with the service. For more information, see the
* Azure Docs.
*
* Code Samples
*
*
*
* BlobSignedIdentifier identifier = new BlobSignedIdentifier()
* .setId("name")
* .setAccessPolicy(new BlobAccessPolicy()
* .setStartsOn(OffsetDateTime.now())
* .setExpiresOn(OffsetDateTime.now().plusDays(7))
* .setPermissions("permissionString"));
*
* try {
* client.setAccessPolicy(PublicAccessType.CONTAINER, Collections.singletonList(identifier));
* System.out.printf("Set Access Policy completed %n");
* } catch (UnsupportedOperationException error) {
* System.out.printf("Set Access Policy completed %s%n", error);
* }
*
*
*
* @param accessType Specifies how the data in this container is available to the public. See the
* x-ms-blob-public-access header in the Azure Docs for more information. Pass null for no public access.
* @param identifiers A list of {@link BlobSignedIdentifier} objects that specify the permissions for the container.
* Please see
* here
* for more information. Passing null will clear all access policies.
*/
@ServiceMethod(returns = ReturnType.SINGLE)
public void setAccessPolicy(PublicAccessType accessType,
List identifiers) {
setAccessPolicyWithResponse(accessType, identifiers, null, null, Context.NONE);
}
/**
* Sets the container's permissions. The permissions indicate whether blobs in a container may be accessed publicly.
* Note that, for each signed identifier, we will truncate the start and expiry times to the nearest second to
* ensure the time formatting is compatible with the service. For more information, see the
* Azure Docs.
*
* Code Samples
*
*
*
* BlobSignedIdentifier identifier = new BlobSignedIdentifier()
* .setId("name")
* .setAccessPolicy(new BlobAccessPolicy()
* .setStartsOn(OffsetDateTime.now())
* .setExpiresOn(OffsetDateTime.now().plusDays(7))
* .setPermissions("permissionString"));
*
* BlobRequestConditions requestConditions = new BlobRequestConditions()
* .setLeaseId(leaseId)
* .setIfUnmodifiedSince(OffsetDateTime.now().minusDays(3));
*
* Context context = new Context("Key", "Value");
*
* System.out.printf("Set access policy completed with status %d%n",
* client.setAccessPolicyWithResponse(PublicAccessType.CONTAINER,
* Collections.singletonList(identifier),
* requestConditions,
* timeout,
* context).getStatusCode());
*
*
*
* @param accessType Specifies how the data in this container is available to the public. See the
* x-ms-blob-public-access header in the Azure Docs for more information. Pass null for no public access.
* @param identifiers A list of {@link BlobSignedIdentifier} objects that specify the permissions for the container.
* Please see
* here
* for more information. Passing null will clear all access policies.
* @param requestConditions {@link BlobRequestConditions}
* @param timeout An optional timeout value beyond which a {@link RuntimeException} will be raised.
* @param context Additional context that is passed through the Http pipeline during the service call.
* @return A response containing status code and HTTP headers
*/
@ServiceMethod(returns = ReturnType.SINGLE)
public Response setAccessPolicyWithResponse(PublicAccessType accessType,
List identifiers, BlobRequestConditions requestConditions,
Duration timeout, Context context) {
Mono> response = client
.setAccessPolicyWithResponse(accessType, identifiers, requestConditions, context);
return blockWithOptionalTimeout(response, timeout);
}
/**
* Returns a lazy loaded list of blobs in this container, with folder structures flattened. The returned {@link
* PagedIterable} can be consumed through while new items are automatically retrieved as needed.
*
*
* Blob names are returned in lexicographic order.
*
*
* For more information, see the
* Azure Docs.
*
*
Code Samples
*
*
*
* client.listBlobs().forEach(blob ->
* System.out.printf("Name: %s, Directory? %b%n", blob.getName(), blob.isPrefix()));
*
*
*
* @return The listed blobs, flattened.
*/
@ServiceMethod(returns = ReturnType.COLLECTION)
public PagedIterable listBlobs() {
return this.listBlobs(new ListBlobsOptions(), null);
}
/**
* Returns a lazy loaded list of blobs in this container, with folder structures flattened. The returned {@link
* PagedIterable} can be consumed through while new items are automatically retrieved as needed.
*
*
* Blob names are returned in lexicographic order.
*
*
* For more information, see the
* Azure Docs.
*
*
Code Samples
*
*
*
* ListBlobsOptions options = new ListBlobsOptions()
* .setPrefix("prefixToMatch")
* .setDetails(new BlobListDetails()
* .setRetrieveDeletedBlobs(true)
* .setRetrieveSnapshots(true));
*
* client.listBlobs(options, timeout).forEach(blob ->
* System.out.printf("Name: %s, Directory? %b, Deleted? %b, Snapshot ID: %s%n",
* blob.getName(),
* blob.isPrefix(),
* blob.isDeleted(),
* blob.getSnapshot()));
*
*
*
* @param options {@link ListBlobsOptions}. If iterating by page, the page size passed to byPage methods such as
* {@link PagedIterable#iterableByPage(int)} will be preferred over the value set on these options.
* @param timeout An optional timeout value beyond which a {@link RuntimeException} will be raised.
* @return The listed blobs, flattened.
*/
@ServiceMethod(returns = ReturnType.COLLECTION)
public PagedIterable listBlobs(ListBlobsOptions options, Duration timeout) {
return this.listBlobs(options, null, timeout);
}
/**
* Returns a lazy loaded list of blobs in this container, with folder structures flattened. The returned {@link
* PagedIterable} can be consumed through while new items are automatically retrieved as needed.
*
*
* Blob names are returned in lexicographic order.
*
*
* For more information, see the
* Azure Docs.
*
*
Code Samples
*
*
*
* ListBlobsOptions options = new ListBlobsOptions()
* .setPrefix("prefixToMatch")
* .setDetails(new BlobListDetails()
* .setRetrieveDeletedBlobs(true)
* .setRetrieveSnapshots(true));
*
* String continuationToken = "continuationToken";
*
* client.listBlobs(options, continuationToken, timeout).forEach(blob ->
* System.out.printf("Name: %s, Directory? %b, Deleted? %b, Snapshot ID: %s%n",
* blob.getName(),
* blob.isPrefix(),
* blob.isDeleted(),
* blob.getSnapshot()));
*
*
*
* @param options {@link ListBlobsOptions}. If iterating by page, the page size passed to byPage methods such as
* {@link PagedIterable#iterableByPage(int)} will be preferred over the value set on these options.
* @param continuationToken Identifies the portion of the list to be returned with the next list operation.
* @param timeout An optional timeout value beyond which a {@link RuntimeException} will be raised.
* @return The listed blobs, flattened.
*/
@ServiceMethod(returns = ReturnType.COLLECTION)
public PagedIterable listBlobs(ListBlobsOptions options, String continuationToken, Duration timeout) {
return new PagedIterable<>(client.listBlobsFlatWithOptionalTimeout(options, continuationToken, timeout));
}
/**
* Returns a reactive Publisher emitting all the blobs and directories (prefixes) under the given directory
* (prefix). Directories will have {@link BlobItem#isPrefix()} set to true.
*
*
* Blob names are returned in lexicographic order. For more information, see the
* Azure Docs.
*
*
* E.g. listing a container containing a 'foo' folder, which contains blobs 'foo1' and 'foo2', and a blob on the
* root level 'bar', will return the following results when prefix=null:
*
*
* - foo/ (isPrefix = true)
*
- bar (isPrefix = false)
*
*
* will return the following results when prefix="foo/":
*
*
* - foo/foo1 (isPrefix = false)
*
- foo/foo2 (isPrefix = false)
*
*
* Code Samples
*
*
*
* client.listBlobsByHierarchy("directoryName").forEach(blob ->
* System.out.printf("Name: %s, Directory? %b%n", blob.getName(), blob.isPrefix()));
*
*
*
* @param directory The directory to list blobs underneath
* @return A reactive response emitting the prefixes and blobs.
*/
@ServiceMethod(returns = ReturnType.COLLECTION)
public PagedIterable listBlobsByHierarchy(String directory) {
return this.listBlobsByHierarchy("/", new ListBlobsOptions().setPrefix(directory), null);
}
/**
* Returns a reactive Publisher emitting all the blobs and prefixes (directories) under the given prefix
* (directory). Directories will have {@link BlobItem#isPrefix()} set to true.
*
*
* Blob names are returned in lexicographic order. For more information, see the
* Azure Docs.
*
*
* E.g. listing a container containing a 'foo' folder, which contains blobs 'foo1' and 'foo2', and a blob on the
* root level 'bar', will return the following results when prefix=null:
*
*
* - foo/ (isPrefix = true)
*
- bar (isPrefix = false)
*
*
* will return the following results when prefix="foo/":
*
*
* - foo/foo1 (isPrefix = false)
*
- foo/foo2 (isPrefix = false)
*
*
* Code Samples
*
*
*
* ListBlobsOptions options = new ListBlobsOptions()
* .setPrefix("directoryName")
* .setDetails(new BlobListDetails()
* .setRetrieveDeletedBlobs(true)
* .setRetrieveSnapshots(false));
*
* client.listBlobsByHierarchy("/", options, timeout).forEach(blob ->
* System.out.printf("Name: %s, Directory? %b, Deleted? %b, Snapshot ID: %s%n",
* blob.getName(),
* blob.isPrefix(),
* blob.isDeleted(),
* blob.getSnapshot()));
*
*
*
* @param delimiter The delimiter for blob hierarchy, "/" for hierarchy based on directories
* @param options {@link ListBlobsOptions}. If iterating by page, the page size passed to byPage methods such as
* {@link PagedIterable#iterableByPage(int)} will be preferred over the value set on these options.
* @param timeout An optional timeout value beyond which a {@link RuntimeException} will be raised.
* @return A reactive response emitting the prefixes and blobs.
*/
@ServiceMethod(returns = ReturnType.COLLECTION)
public PagedIterable listBlobsByHierarchy(String delimiter, ListBlobsOptions options, Duration timeout) {
return new PagedIterable<>(client
.listBlobsHierarchyWithOptionalTimeout(delimiter, options, timeout));
}
/**
* Returns a lazy loaded list of blobs in this container whose tags match the query expression. The returned
* {@link PagedIterable} can be consumed while new items are automatically retrieved as needed. For more
* information, including information on the query syntax, see the Azure Docs.
*
* Code Samples
*
* TODO
*
*
* client.findBlobsByTags("where=tag=value").forEach(blob -> System.out.printf("Name: %s%n", blob.getName()));
*
*
*
* @param query Filters the results to return only blobs whose tags match the specified expression.
* @return The list of blobs.
*/
@ServiceMethod(returns = ReturnType.COLLECTION)
public PagedIterable findBlobsByTags(String query) {
return this.findBlobsByTags(new FindBlobsOptions(query), null, Context.NONE);
}
/**
* Returns a lazy loaded list of blobs in this account whose tags match the query expression. The returned
* {@link PagedIterable} can be consumed while new items are automatically retrieved as needed. For more
* information, including information on the query syntax, see the Azure Docs.
*
* Code Samples
*
*
*
* Context context = new Context("Key", "Value");
* client.findBlobsByTags(new FindBlobsOptions("where=tag=value").setMaxResultsPerPage(10), timeout, context)
* .forEach(blob -> System.out.printf("Name: %s%n", blob.getName()));
*
*
*
* @param options {@link FindBlobsOptions}. If iterating by page, the page size passed to byPage methods such as
* {@link PagedIterable#iterableByPage(int)} will be preferred over the value set on these options.
* @param timeout An optional timeout value beyond which a {@link RuntimeException} will be raised.
* @param context Additional context that is passed through the Http pipeline during the service call.
* @return The list of blobs.
*/
@ServiceMethod(returns = ReturnType.COLLECTION)
public PagedIterable findBlobsByTags(FindBlobsOptions options, Duration timeout, Context context) {
return new PagedIterable<>(client.findBlobsByTags(options, timeout, context));
}
/**
* Returns the sku name and account kind for the account. For more information, please see the
* Azure Docs.
*
* @param timeout An optional timeout value beyond which a {@link RuntimeException} will be raised.
*
* Code Samples
*
*
*
* StorageAccountInfo accountInfo = client.getAccountInfo(timeout);
* System.out.printf("Account Kind: %s, SKU: %s%n", accountInfo.getAccountKind(), accountInfo.getSkuName());
*
*
* @return The account info.
*/
@ServiceMethod(returns = ReturnType.SINGLE)
public StorageAccountInfo getAccountInfo(Duration timeout) {
return getAccountInfoWithResponse(timeout, Context.NONE).getValue();
}
/**
* Returns the sku name and account kind for the account. For more information, please see the
* Azure Docs.
*
* Code Samples
*
*
*
* Context context = new Context("Key", "Value");
* StorageAccountInfo accountInfo = client.getAccountInfoWithResponse(timeout, context).getValue();
* System.out.printf("Account Kind: %s, SKU: %s%n", accountInfo.getAccountKind(), accountInfo.getSkuName());
*
*
*
* @param timeout An optional timeout value beyond which a {@link RuntimeException} will be raised.
* @param context Additional context that is passed through the Http pipeline during the service call.
* @return The account info.
*/
@ServiceMethod(returns = ReturnType.SINGLE)
public Response getAccountInfoWithResponse(Duration timeout, Context context) {
Mono> response = client.getAccountInfoWithResponse(context);
return blockWithOptionalTimeout(response, timeout);
}
// TODO: Reintroduce this API once service starts supporting it.
// BlobContainerClient rename(String destinationContainerName) {
// return renameWithResponse(new BlobContainerRenameOptions(destinationContainerName
// ), null, Context.NONE).getValue();
// }
// TODO: Reintroduce this API once service starts supporting it.
// Response renameWithResponse(BlobContainerRenameOptions options, Duration timeout,
// Context context) {
// Mono> response = this.client.renameWithResponse(options, context)
// .map(r -> new SimpleResponse<>(r, new BlobContainerClient(r.getValue())));
//
// return StorageImplUtils.blockWithOptionalTimeout(response, timeout);
// }
/**
* Generates a user delegation SAS for the container using the specified {@link BlobServiceSasSignatureValues}.
* See {@link BlobServiceSasSignatureValues} for more information on how to construct a user delegation SAS.
*
* Code Samples
*
*
*
* OffsetDateTime myExpiryTime = OffsetDateTime.now().plusDays(1);
* BlobContainerSasPermission myPermission = new BlobContainerSasPermission().setReadPermission(true);
*
* BlobServiceSasSignatureValues myValues = new BlobServiceSasSignatureValues(expiryTime, permission)
* .setStartTime(OffsetDateTime.now());
*
* client.generateUserDelegationSas(values, userDelegationKey);
*
*
*
* @param blobServiceSasSignatureValues {@link BlobServiceSasSignatureValues}
* @param userDelegationKey A {@link UserDelegationKey} object used to sign the SAS values.
* See {@link BlobServiceClient#getUserDelegationKey(OffsetDateTime, OffsetDateTime)} for more information on
* how to get a user delegation key.
*
* @return A {@code String} representing the SAS query parameters.
*/
public String generateUserDelegationSas(BlobServiceSasSignatureValues blobServiceSasSignatureValues,
UserDelegationKey userDelegationKey) {
return this.client.generateUserDelegationSas(blobServiceSasSignatureValues, userDelegationKey);
}
/**
* Generates a user delegation SAS for the container using the specified {@link BlobServiceSasSignatureValues}.
* See {@link BlobServiceSasSignatureValues} for more information on how to construct a user delegation SAS.
*
* Code Samples
*
*
*
* OffsetDateTime myExpiryTime = OffsetDateTime.now().plusDays(1);
* BlobContainerSasPermission myPermission = new BlobContainerSasPermission().setReadPermission(true);
*
* BlobServiceSasSignatureValues myValues = new BlobServiceSasSignatureValues(expiryTime, permission)
* .setStartTime(OffsetDateTime.now());
*
* client.generateUserDelegationSas(values, userDelegationKey, accountName, new Context("key", "value"));
*
*
*
* @param blobServiceSasSignatureValues {@link BlobServiceSasSignatureValues}
* @param userDelegationKey A {@link UserDelegationKey} object used to sign the SAS values.
* See {@link BlobServiceClient#getUserDelegationKey(OffsetDateTime, OffsetDateTime)} for more information on
* how to get a user delegation key..
* @param accountName The account name.
* @param context Additional context that is passed through the code when generating a SAS.
*
* @return A {@code String} representing the SAS query parameters.
*/
public String generateUserDelegationSas(BlobServiceSasSignatureValues blobServiceSasSignatureValues,
UserDelegationKey userDelegationKey, String accountName, Context context) {
return this.client.generateUserDelegationSas(blobServiceSasSignatureValues, userDelegationKey, accountName,
context);
}
/**
* Generates a service SAS for the container using the specified {@link BlobServiceSasSignatureValues}
* Note : The client must be authenticated via {@link StorageSharedKeyCredential}
*
See {@link BlobServiceSasSignatureValues} for more information on how to construct a service SAS.
*
* Code Samples
*
*
*
* OffsetDateTime expiryTime = OffsetDateTime.now().plusDays(1);
* BlobContainerSasPermission permission = new BlobContainerSasPermission().setReadPermission(true);
*
* BlobServiceSasSignatureValues values = new BlobServiceSasSignatureValues(expiryTime, permission)
* .setStartTime(OffsetDateTime.now());
*
* client.generateSas(values); // Client must be authenticated via StorageSharedKeyCredential
*
*
*
* @param blobServiceSasSignatureValues {@link BlobServiceSasSignatureValues}
*
* @return A {@code String} representing the SAS query parameters.
*/
public String generateSas(BlobServiceSasSignatureValues blobServiceSasSignatureValues) {
return this.client.generateSas(blobServiceSasSignatureValues);
}
/**
* Generates a service SAS for the container using the specified {@link BlobServiceSasSignatureValues}
* Note : The client must be authenticated via {@link StorageSharedKeyCredential}
*
See {@link BlobServiceSasSignatureValues} for more information on how to construct a service SAS.
*
* Code Samples
*
*
*
* OffsetDateTime expiryTime = OffsetDateTime.now().plusDays(1);
* BlobContainerSasPermission permission = new BlobContainerSasPermission().setReadPermission(true);
*
* BlobServiceSasSignatureValues values = new BlobServiceSasSignatureValues(expiryTime, permission)
* .setStartTime(OffsetDateTime.now());
*
* // Client must be authenticated via StorageSharedKeyCredential
* client.generateSas(values, new Context("key", "value"));
*
*
*
* @param blobServiceSasSignatureValues {@link BlobServiceSasSignatureValues}
* @param context Additional context that is passed through the code when generating a SAS.
*
* @return A {@code String} representing the SAS query parameters.
*/
public String generateSas(BlobServiceSasSignatureValues blobServiceSasSignatureValues, Context context) {
return this.client.generateSas(blobServiceSasSignatureValues, context);
}
}