Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,12 @@
import com.azure.storage.file.share.implementation.models.DirectoriesListFilesAndDirectoriesSegmentResponse;
import com.azure.storage.file.share.implementation.models.DirectoriesSetMetadataResponse;
import com.azure.storage.file.share.implementation.models.DirectoriesSetPropertiesResponse;
import com.azure.storage.file.share.implementation.models.ListFilesIncludeType;
import com.azure.storage.file.share.implementation.util.ModelHelper;
import com.azure.storage.file.share.implementation.util.ShareSasImplUtil;
import com.azure.storage.file.share.models.CloseHandlesInfo;
import com.azure.storage.file.share.models.HandleItem;
import com.azure.storage.file.share.models.NtfsFileAttributes;
import com.azure.storage.file.share.models.ShareDirectoryInfo;
import com.azure.storage.file.share.models.ShareDirectoryProperties;
import com.azure.storage.file.share.models.ShareDirectorySetMetadataInfo;
Expand All @@ -37,6 +40,7 @@
import com.azure.storage.file.share.models.ShareFileItem;
import com.azure.storage.file.share.models.ShareRequestConditions;
import com.azure.storage.file.share.models.ShareStorageException;
import com.azure.storage.file.share.options.ShareListFilesAndDirectoriesOptions;
import com.azure.storage.file.share.sas.ShareServiceSasSignatureValues;
import reactor.core.publisher.Mono;

Expand All @@ -46,6 +50,7 @@
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
Expand Down Expand Up @@ -605,18 +610,66 @@ public PagedFlux<ShareFileItem> listFilesAndDirectories() {
@ServiceMethod(returns = ReturnType.COLLECTION)
public PagedFlux<ShareFileItem> listFilesAndDirectories(String prefix, Integer maxResultsPerPage) {
try {
return listFilesAndDirectoriesWithOptionalTimeout(prefix, maxResultsPerPage, null, Context.NONE);
return listFilesAndDirectoriesWithOptionalTimeout(new ShareListFilesAndDirectoriesOptions()
.setPrefix(prefix).setMaxResultsPerPage(maxResultsPerPage), null, Context.NONE);
} catch (RuntimeException ex) {
return pagedFluxError(logger, ex);
}
}

PagedFlux<ShareFileItem> listFilesAndDirectoriesWithOptionalTimeout(String prefix, Integer maxResultsPerPage,
Duration timeout, Context context) {
/**
* Lists all sub-directories and files in this directory with their prefix or snapshots.
*
* <p><strong>Code Samples</strong></p>
*
* <p>List all sub-directories with "subdir" prefix and return 10 results in the account</p>
*
* {@codesnippet com.azure.storage.file.share.ShareDirectoryAsyncClient.listFilesAndDirectories#ShareListFilesAndDirectoriesOptions}
*
* <p>For more information, see the
* <a href="https://docs.microsoft.com/rest/api/storageservices/list-directories-and-files">Azure
* Docs</a>.</p>
*
* @param options Optional parameters.
* the server will return up to 5,000 items.
* @return {@link ShareFileItem File info} in this directory with prefix and max number of return results.
*/
@ServiceMethod(returns = ReturnType.COLLECTION)
public PagedFlux<ShareFileItem> listFilesAndDirectories(ShareListFilesAndDirectoriesOptions options) {
try {
return listFilesAndDirectoriesWithOptionalTimeout(options, null, Context.NONE);
} catch (RuntimeException ex) {
return pagedFluxError(logger, ex);
}
}

PagedFlux<ShareFileItem> listFilesAndDirectoriesWithOptionalTimeout(
ShareListFilesAndDirectoriesOptions options, Duration timeout, Context context) {
final ShareListFilesAndDirectoriesOptions modifiedOptions = options == null
? new ShareListFilesAndDirectoriesOptions() : options;

List<ListFilesIncludeType> includeTypes = new LinkedList<>();

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure why we'd choose LinkedList here. It should matter much with this size of data but we should by default pick ArrayList unless we hava a good reason to use LinkedList.

if (modifiedOptions.includeAttributes()) {
includeTypes.add(ListFilesIncludeType.ATTRIBUTES);
}
if (modifiedOptions.includeETag()) {
includeTypes.add(ListFilesIncludeType.ETAG);
}
if (modifiedOptions.includeTimestamps()) {
includeTypes.add(ListFilesIncludeType.TIMESTAMPS);
}
if (modifiedOptions.includePermissionKey()) {
includeTypes.add(ListFilesIncludeType.PERMISSION_KEY);
}

// these options must be absent from request if empty or false
final List<ListFilesIncludeType> finalIncludeTypes = includeTypes.size() == 0 ? null : includeTypes;

BiFunction<String, Integer, Mono<PagedResponse<ShareFileItem>>> retriever =
(marker, pageSize) -> StorageImplUtils.applyOptionalTimeout(this.azureFileStorageClient.getDirectories()
.listFilesAndDirectoriesSegmentWithResponseAsync(shareName, directoryPath, prefix, snapshot,
marker, pageSize == null ? maxResultsPerPage : pageSize, null, context), timeout)
.listFilesAndDirectoriesSegmentWithResponseAsync(shareName, directoryPath, modifiedOptions.getPrefix(),
snapshot, marker, pageSize == null ? modifiedOptions.getMaxResultsPerPage() : pageSize, null,
finalIncludeTypes, modifiedOptions.includeExtendedInfo(), context), timeout)
.map(response -> new PagedResponseBase<>(response.getRequest(),
response.getStatusCode(),
response.getHeaders(),
Expand Down Expand Up @@ -1224,10 +1277,14 @@ private List<ShareFileItem> convertResponseAndGetNumOfResults(
Set<ShareFileItem> shareFileItems = new TreeSet<>(Comparator.comparing(ShareFileItem::getName));
if (response.getValue().getSegment() != null) {
response.getValue().getSegment().getDirectoryItems()
.forEach(directoryItem -> shareFileItems.add(new ShareFileItem(directoryItem.getName(),
true, null)));
.forEach(directoryItem -> shareFileItems.add(new ShareFileItem(directoryItem.getName(), true,
directoryItem.getFileId(), ModelHelper.transformFileProperty(directoryItem.getProperties()),
NtfsFileAttributes.toAttributes(directoryItem.getAttributes()), directoryItem.getPermissionKey(),
null)));
response.getValue().getSegment().getFileItems()
.forEach(fileItem -> shareFileItems.add(new ShareFileItem(fileItem.getName(), false,
fileItem.getFileId(), ModelHelper.transformFileProperty(fileItem.getProperties()),
NtfsFileAttributes.toAttributes(fileItem.getAttributes()), fileItem.getPermissionKey(),
fileItem.getProperties().getContentLength())));
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
import com.azure.storage.file.share.models.ShareRequestConditions;
import com.azure.storage.file.share.models.ShareStorageException;
import com.azure.storage.file.share.models.ShareFileItem;
import com.azure.storage.file.share.options.ShareListFilesAndDirectoriesOptions;
import com.azure.storage.file.share.sas.ShareServiceSasSignatureValues;
import reactor.core.publisher.Mono;

Expand Down Expand Up @@ -438,8 +439,36 @@ public PagedIterable<ShareFileItem> listFilesAndDirectories() {
@ServiceMethod(returns = ReturnType.COLLECTION)
public PagedIterable<ShareFileItem> listFilesAndDirectories(String prefix, Integer maxResultsPerPage,
Duration timeout, Context context) {
return listFilesAndDirectories(new ShareListFilesAndDirectoriesOptions().setPrefix(prefix)
.setMaxResultsPerPage(maxResultsPerPage), timeout, context);
}

/**
* Lists all sub-directories and files in this directory with their prefix or snapshots.
*
* <p><strong>Code Samples</strong></p>
*
* <p>List all sub-directories and files in this directory with "subdir" prefix and return 10 results in the
* account</p>
*
* {@codesnippet com.azure.storage.file.share.ShareDirectoryClient.listFilesAndDirectories#ShareListFilesAndDirectoriesOptions-duration-context}
*
* <p>For more information, see the
* <a href="https://docs.microsoft.com/rest/api/storageservices/list-directories-and-files">Azure
* Docs</a>.</p>
*
* @param options Optional parameters.
* @param timeout An optional timeout applied to the operation. If a response is not returned before the timeout
* concludes a {@link RuntimeException} will be thrown.
* @param context Additional context that is passed through the Http pipeline during the service call.
* @return {@link ShareFileItem File info} in this directory with prefix and max number of return results.
* @throws RuntimeException if the operation doesn't complete before the timeout concludes.
*/
@ServiceMethod(returns = ReturnType.COLLECTION)
public PagedIterable<ShareFileItem> listFilesAndDirectories(ShareListFilesAndDirectoriesOptions options,
Duration timeout, Context context) {
return new PagedIterable<>(shareDirectoryAsyncClient
.listFilesAndDirectoriesWithOptionalTimeout(prefix, maxResultsPerPage, timeout, context));
.listFilesAndDirectoriesWithOptionalTimeout(options, timeout, context));
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@
import com.azure.core.annotation.UnexpectedResponseExceptionType;
import com.azure.core.http.rest.RestProxy;
import com.azure.core.util.Context;
import com.azure.core.util.serializer.CollectionFormat;
import com.azure.core.util.serializer.JacksonAdapter;
import com.azure.storage.file.share.implementation.models.DirectoriesCreateResponse;
import com.azure.storage.file.share.implementation.models.DirectoriesDeleteResponse;
import com.azure.storage.file.share.implementation.models.DirectoriesForceCloseHandlesResponse;
Expand All @@ -27,7 +29,9 @@
import com.azure.storage.file.share.implementation.models.DirectoriesListHandlesResponse;
import com.azure.storage.file.share.implementation.models.DirectoriesSetMetadataResponse;
import com.azure.storage.file.share.implementation.models.DirectoriesSetPropertiesResponse;
import com.azure.storage.file.share.implementation.models.ListFilesIncludeType;
import com.azure.storage.file.share.implementation.models.StorageErrorException;
import java.util.List;
import java.util.Map;
import reactor.core.publisher.Mono;

Expand Down Expand Up @@ -152,6 +156,8 @@ Mono<DirectoriesListFilesAndDirectoriesSegmentResponse> listFilesAndDirectoriesS
@QueryParam("maxresults") Integer maxresults,
@QueryParam("timeout") Integer timeout,
@HeaderParam("x-ms-version") String version,
@QueryParam("include") String include,
@HeaderParam("x-ms-file-extended-info") Boolean includeExtendedInfo,
@HeaderParam("Accept") String accept,
Context context);

Expand Down Expand Up @@ -417,6 +423,8 @@ public Mono<DirectoriesSetMetadataResponse> setMetadataWithResponseAsync(
* @param timeout The timeout parameter is expressed in seconds. For more information, see &lt;a
* href="https://docs.microsoft.com/en-us/rest/api/storageservices/Setting-Timeouts-for-File-Service-Operations?redirectedfrom=MSDN"&gt;Setting
* Timeouts for File Service Operations.&lt;/a&gt;.
* @param include Include this parameter to specify one or more datasets to include in the response.
* @param includeExtendedInfo The includeExtendedInfo parameter.
* @param context The context to associate with this operation.
* @throws IllegalArgumentException thrown if parameters fail the validation.
* @throws StorageErrorException thrown if the request is rejected by server.
Expand All @@ -432,10 +440,14 @@ public Mono<DirectoriesListFilesAndDirectoriesSegmentResponse> listFilesAndDirec
String marker,
Integer maxresults,
Integer timeout,
List<ListFilesIncludeType> include,
Boolean includeExtendedInfo,
Context context) {
final String restype = "directory";
final String comp = "list";
final String accept = "application/xml";
String includeConverted =
JacksonAdapter.createDefaultSerializerAdapter().serializeList(include, CollectionFormat.CSV);
return service.listFilesAndDirectoriesSegment(
this.client.getUrl(),
restype,
Expand All @@ -448,6 +460,8 @@ public Mono<DirectoriesListFilesAndDirectoriesSegmentResponse> listFilesAndDirec
maxresults,
timeout,
this.client.getVersion(),
includeConverted,
includeExtendedInfo,
accept,
context);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,11 +45,10 @@
import com.azure.storage.file.share.models.PermissionCopyModeType;
import com.azure.storage.file.share.models.ShareFileHttpHeaders;
import com.azure.storage.file.share.models.SourceModifiedAccessConditions;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

import java.nio.ByteBuffer;
import java.util.Map;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

/** An instance of this class provides access to all the operations defined in Files. */
public final class FilesImpl {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,30 @@ public final class DirectoryItem {
@JsonProperty(value = "Name", required = true)
private String name;

/*
* The FileId property.
*/
@JsonProperty(value = "FileId")
private String fileId;

/*
* File properties.
*/
@JsonProperty(value = "Properties")
private FileProperty properties;

/*
* The Attributes property.
*/
@JsonProperty(value = "Attributes")
private String attributes;

/*
* The PermissionKey property.
*/
@JsonProperty(value = "PermissionKey")
private String permissionKey;

/**
* Get the name property: The Name property.
*
Expand All @@ -37,4 +61,84 @@ public DirectoryItem setName(String name) {
this.name = name;
return this;
}

/**
* Get the fileId property: The FileId property.
*
* @return the fileId value.
*/
public String getFileId() {
return this.fileId;
}

/**
* Set the fileId property: The FileId property.
*
* @param fileId the fileId value to set.
* @return the DirectoryItem object itself.
*/
public DirectoryItem setFileId(String fileId) {
this.fileId = fileId;
return this;
}

/**
* Get the properties property: File properties.
*
* @return the properties value.
*/
public FileProperty getProperties() {
return this.properties;
}

/**
* Set the properties property: File properties.
*
* @param properties the properties value to set.
* @return the DirectoryItem object itself.
*/
public DirectoryItem setProperties(FileProperty properties) {
this.properties = properties;
return this;
}

/**
* Get the attributes property: The Attributes property.
*
* @return the attributes value.
*/
public String getAttributes() {
return this.attributes;
}

/**
* Set the attributes property: The Attributes property.
*
* @param attributes the attributes value to set.
* @return the DirectoryItem object itself.
*/
public DirectoryItem setAttributes(String attributes) {
this.attributes = attributes;
return this;
}

/**
* Get the permissionKey property: The PermissionKey property.
*
* @return the permissionKey value.
*/
public String getPermissionKey() {
return this.permissionKey;
}

/**
* Set the permissionKey property: The PermissionKey property.
*
* @param permissionKey the permissionKey value to set.
* @return the DirectoryItem object itself.
*/
public DirectoryItem setPermissionKey(String permissionKey) {
this.permissionKey = permissionKey;
return this;
}
}
Loading