Skip to content

Commit 6c65537

Browse files
committed
Create UploadDirectoryWithResponse api
1 parent e96d4a6 commit 6c65537

File tree

10 files changed

+1607
-27
lines changed

10 files changed

+1607
-27
lines changed
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
{
2+
"services": [
3+
{
4+
"serviceName": "S3",
5+
"type": "minor",
6+
"changeLogMessages": [
7+
"Added DownloadDirectoryInitiatedEvent, DownloadDirectoryCompletedEvent, and DownloadDirectoryFailedEvent for Amazon.S3.Transfer.TransferUtility.DownloadDirectory."
8+
]
9+
}
10+
]
11+
}

sdk/src/Services/S3/Custom/Transfer/Internal/UploadDirectoryCommand.cs

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,43 @@ internal partial class UploadDirectoryCommand : BaseCommand<TransferUtilityUploa
4545
int _numberOfFilesUploaded;
4646
int _numberOfFilesSuccessfullyUploaded;
4747
long _totalBytes;
48-
long _transferredBytes;
48+
long _transferredBytes;
49+
50+
#region Event Firing Methods
51+
52+
private void FireTransferInitiatedEvent()
53+
{
54+
var eventArgs = new UploadDirectoryInitiatedEventArgs(
55+
_request,
56+
_totalNumberOfFiles,
57+
_totalBytes);
58+
_request.OnRaiseUploadDirectoryInitiatedEvent(eventArgs);
59+
}
60+
61+
private void FireTransferCompletedEvent(TransferUtilityUploadDirectoryResponse response)
62+
{
63+
var eventArgs = new UploadDirectoryCompletedEventArgs(
64+
_request,
65+
response,
66+
_numberOfFilesSuccessfullyUploaded,
67+
_totalNumberOfFiles,
68+
Interlocked.Read(ref _transferredBytes),
69+
_totalBytes);
70+
_request.OnRaiseUploadDirectoryCompletedEvent(eventArgs);
71+
}
72+
73+
private void FireTransferFailedEvent()
74+
{
75+
var eventArgs = new UploadDirectoryFailedEventArgs(
76+
_request,
77+
_numberOfFilesSuccessfullyUploaded,
78+
_totalNumberOfFiles,
79+
Interlocked.Read(ref _transferredBytes),
80+
_totalBytes);
81+
_request.OnRaiseUploadDirectoryFailedEvent(eventArgs);
82+
}
83+
84+
#endregion
4985

5086
internal UploadDirectoryCommand(TransferUtility utility, TransferUtilityConfig config, TransferUtilityUploadDirectoryRequest request)
5187
{

sdk/src/Services/S3/Custom/Transfer/Internal/_bcl+netstandard/UploadDirectoryCommand.cs

Lines changed: 39 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -31,38 +31,51 @@ internal partial class UploadDirectoryCommand : BaseCommand<TransferUtilityUploa
3131

3232
public override async Task<TransferUtilityUploadDirectoryResponse> ExecuteAsync(CancellationToken cancellationToken)
3333
{
34-
// Step 1: Setup paths and discover files
35-
string prefix = GetKeyPrefix();
36-
string basePath = new DirectoryInfo(this._request.Directory).FullName;
34+
try
35+
{
36+
// Step 1: Setup paths and discover files
37+
string prefix = GetKeyPrefix();
38+
string basePath = new DirectoryInfo(this._request.Directory).FullName;
3739

38-
_logger.DebugFormat("UploadDirectoryCommand.ExecuteAsync: Starting - BasePath={0}, Prefix={1}, UploadFilesConcurrently={2}, ConcurrentServiceRequests={3}",
39-
basePath, prefix, UploadFilesConcurrently, this._config.ConcurrentServiceRequests);
40+
_logger.DebugFormat("UploadDirectoryCommand.ExecuteAsync: Starting - BasePath={0}, Prefix={1}, UploadFilesConcurrently={2}, ConcurrentServiceRequests={3}",
41+
basePath, prefix, UploadFilesConcurrently, this._config.ConcurrentServiceRequests);
4042

41-
// Step 2: Discover files to upload
42-
string[] filePaths = await DiscoverFilesAsync(basePath, cancellationToken)
43-
.ConfigureAwait(false);
43+
// Step 2: Discover files to upload
44+
string[] filePaths = await DiscoverFilesAsync(basePath, cancellationToken)
45+
.ConfigureAwait(false);
4446

45-
this._totalNumberOfFiles = filePaths.Length;
46-
_logger.DebugFormat("UploadDirectoryCommand.ExecuteAsync: Discovered {0} file(s) to upload. TotalBytes={1}",
47-
_totalNumberOfFiles, _totalBytes);
47+
this._totalNumberOfFiles = filePaths.Length;
48+
_logger.DebugFormat("UploadDirectoryCommand.ExecuteAsync: Discovered {0} file(s) to upload. TotalBytes={1}",
49+
_totalNumberOfFiles, _totalBytes);
4850

49-
// Step 3: Setup resources and execute uploads
50-
using (var resources = CreateUploadResources(cancellationToken))
51-
{
52-
await ExecuteParallelUploadsAsync(
53-
filePaths,
54-
basePath,
55-
prefix,
56-
resources,
57-
cancellationToken)
58-
.ConfigureAwait(false);
59-
}
51+
FireTransferInitiatedEvent();
6052

61-
// Step 4: Build and return response
62-
_logger.DebugFormat("UploadDirectoryCommand.ExecuteAsync: Completed - FilesSuccessfullyUploaded={0}, FilesFailed={1}",
63-
_numberOfFilesSuccessfullyUploaded, _errors.Count);
6453

65-
return BuildResponse();
54+
// Step 3: Setup resources and execute uploads
55+
using (var resources = CreateUploadResources(cancellationToken))
56+
{
57+
await ExecuteParallelUploadsAsync(
58+
filePaths,
59+
basePath,
60+
prefix,
61+
resources,
62+
cancellationToken)
63+
.ConfigureAwait(false);
64+
}
65+
66+
// Step 4: Build and return response
67+
_logger.DebugFormat("UploadDirectoryCommand.ExecuteAsync: Completed - FilesSuccessfullyUploaded={0}, FilesFailed={1}",
68+
_numberOfFilesSuccessfullyUploaded, _errors.Count);
69+
70+
var response = BuildResponse();
71+
FireTransferCompletedEvent(response);
72+
return response;
73+
}
74+
catch
75+
{
76+
FireTransferFailedEvent();
77+
throw;
78+
}
6679
}
6780

6881
/// <summary>

sdk/src/Services/S3/Custom/Transfer/TransferUtilityUploadDirectoryRequest.cs

Lines changed: 205 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,33 @@ public FailurePolicy FailurePolicy
5555
set { this.failurePolicy = value; }
5656
}
5757

58+
/// <summary>
59+
/// Occurs when the upload directory operation is initiated.
60+
/// </summary>
61+
/// <remarks>
62+
/// This event is raised before any files are uploaded, providing information about
63+
/// the total number of files and bytes that will be uploaded.
64+
/// </remarks>
65+
public event EventHandler<UploadDirectoryInitiatedEventArgs> UploadDirectoryInitiatedEvent;
66+
67+
/// <summary>
68+
/// Occurs when the upload directory operation completes successfully.
69+
/// </summary>
70+
/// <remarks>
71+
/// This event is raised after all files have been processed (successfully or with failures),
72+
/// providing the final response and statistics.
73+
/// </remarks>
74+
public event EventHandler<UploadDirectoryCompletedEventArgs> UploadDirectoryCompletedEvent;
75+
76+
/// <summary>
77+
/// Occurs when the upload directory operation fails.
78+
/// </summary>
79+
/// <remarks>
80+
/// This event is raised when the entire operation fails (not individual file failures).
81+
/// Individual file failures are reported through <see cref="ObjectUploadFailedEvent"/>.
82+
/// </remarks>
83+
public event EventHandler<UploadDirectoryFailedEventArgs> UploadDirectoryFailedEvent;
84+
5885
/// <summary>
5986
/// Occurs when an individual object fails to upload during an UploadDirectory operation.
6087
/// </summary>
@@ -72,6 +99,33 @@ public FailurePolicy FailurePolicy
7299
/// </example>
73100
public event EventHandler<ObjectUploadFailedEventArgs> ObjectUploadFailedEvent;
74101

102+
/// <summary>
103+
/// Internal helper used by the transfer implementation to raise the <see cref="UploadDirectoryInitiatedEvent"/>.
104+
/// </summary>
105+
/// <param name="args">The event args.</param>
106+
internal void OnRaiseUploadDirectoryInitiatedEvent(UploadDirectoryInitiatedEventArgs args)
107+
{
108+
UploadDirectoryInitiatedEvent?.Invoke(this, args);
109+
}
110+
111+
/// <summary>
112+
/// Internal helper used by the transfer implementation to raise the <see cref="UploadDirectoryCompletedEvent"/>.
113+
/// </summary>
114+
/// <param name="args">The event args.</param>
115+
internal void OnRaiseUploadDirectoryCompletedEvent(UploadDirectoryCompletedEventArgs args)
116+
{
117+
UploadDirectoryCompletedEvent?.Invoke(this, args);
118+
}
119+
120+
/// <summary>
121+
/// Internal helper used by the transfer implementation to raise the <see cref="UploadDirectoryFailedEvent"/>.
122+
/// </summary>
123+
/// <param name="args">The event args.</param>
124+
internal void OnRaiseUploadDirectoryFailedEvent(UploadDirectoryFailedEventArgs args)
125+
{
126+
UploadDirectoryFailedEvent?.Invoke(this, args);
127+
}
128+
75129
/// <summary>
76130
/// Internal helper used by the transfer implementation to raise the <see cref="ObjectUploadFailedEvent"/>.
77131
/// </summary>
@@ -421,6 +475,157 @@ public UploadDirectoryFileRequestArgs(TransferUtilityUploadRequest request)
421475
public TransferUtilityUploadRequest UploadRequest { get; set; }
422476
}
423477

478+
/// <summary>
479+
/// Provides data for <see cref="TransferUtilityUploadDirectoryRequest.UploadDirectoryInitiatedEvent"/>.
480+
/// </summary>
481+
public class UploadDirectoryInitiatedEventArgs : EventArgs
482+
{
483+
/// <summary>
484+
/// Initializes a new instance of the <see cref="UploadDirectoryInitiatedEventArgs"/> class.
485+
/// </summary>
486+
/// <param name="request">The upload directory request.</param>
487+
/// <param name="totalFiles">The total number of files to upload.</param>
488+
/// <param name="totalBytes">The total number of bytes to upload.</param>
489+
internal UploadDirectoryInitiatedEventArgs(
490+
TransferUtilityUploadDirectoryRequest request,
491+
long totalFiles,
492+
long totalBytes)
493+
{
494+
Request = request;
495+
TotalFiles = totalFiles;
496+
TotalBytes = totalBytes;
497+
}
498+
499+
/// <summary>
500+
/// Gets the upload directory request.
501+
/// </summary>
502+
public TransferUtilityUploadDirectoryRequest Request { get; private set; }
503+
504+
/// <summary>
505+
/// Gets the total number of files to upload.
506+
/// </summary>
507+
public long TotalFiles { get; private set; }
508+
509+
/// <summary>
510+
/// Gets the total number of bytes to upload.
511+
/// </summary>
512+
public long TotalBytes { get; private set; }
513+
}
514+
515+
/// <summary>
516+
/// Provides data for <see cref="TransferUtilityUploadDirectoryRequest.UploadDirectoryCompletedEvent"/>.
517+
/// </summary>
518+
public class UploadDirectoryCompletedEventArgs : EventArgs
519+
{
520+
/// <summary>
521+
/// Initializes a new instance of the <see cref="UploadDirectoryCompletedEventArgs"/> class.
522+
/// </summary>
523+
/// <param name="request">The upload directory request.</param>
524+
/// <param name="response">The upload directory response.</param>
525+
/// <param name="transferredFiles">The number of files successfully uploaded.</param>
526+
/// <param name="totalFiles">The total number of files attempted.</param>
527+
/// <param name="transferredBytes">The number of bytes transferred.</param>
528+
/// <param name="totalBytes">The total number of bytes.</param>
529+
internal UploadDirectoryCompletedEventArgs(
530+
TransferUtilityUploadDirectoryRequest request,
531+
TransferUtilityUploadDirectoryResponse response,
532+
long transferredFiles,
533+
long totalFiles,
534+
long transferredBytes,
535+
long totalBytes)
536+
{
537+
Request = request;
538+
Response = response;
539+
TransferredFiles = transferredFiles;
540+
TotalFiles = totalFiles;
541+
TransferredBytes = transferredBytes;
542+
TotalBytes = totalBytes;
543+
}
544+
545+
/// <summary>
546+
/// Gets the upload directory request.
547+
/// </summary>
548+
public TransferUtilityUploadDirectoryRequest Request { get; private set; }
549+
550+
/// <summary>
551+
/// Gets the upload directory response.
552+
/// </summary>
553+
public TransferUtilityUploadDirectoryResponse Response { get; private set; }
554+
555+
/// <summary>
556+
/// Gets the number of files successfully uploaded.
557+
/// </summary>
558+
public long TransferredFiles { get; private set; }
559+
560+
/// <summary>
561+
/// Gets the total number of files attempted.
562+
/// </summary>
563+
public long TotalFiles { get; private set; }
564+
565+
/// <summary>
566+
/// Gets the number of bytes transferred.
567+
/// </summary>
568+
public long TransferredBytes { get; private set; }
569+
570+
/// <summary>
571+
/// Gets the total number of bytes.
572+
/// </summary>
573+
public long TotalBytes { get; private set; }
574+
}
575+
576+
/// <summary>
577+
/// Provides data for <see cref="TransferUtilityUploadDirectoryRequest.UploadDirectoryFailedEvent"/>.
578+
/// </summary>
579+
public class UploadDirectoryFailedEventArgs : EventArgs
580+
{
581+
/// <summary>
582+
/// Initializes a new instance of the <see cref="UploadDirectoryFailedEventArgs"/> class.
583+
/// </summary>
584+
/// <param name="request">The upload directory request.</param>
585+
/// <param name="transferredFiles">The number of files successfully uploaded before failure.</param>
586+
/// <param name="totalFiles">The total number of files attempted.</param>
587+
/// <param name="transferredBytes">The number of bytes transferred before failure.</param>
588+
/// <param name="totalBytes">The total number of bytes.</param>
589+
internal UploadDirectoryFailedEventArgs(
590+
TransferUtilityUploadDirectoryRequest request,
591+
long transferredFiles,
592+
long totalFiles,
593+
long transferredBytes,
594+
long totalBytes)
595+
{
596+
Request = request;
597+
TransferredFiles = transferredFiles;
598+
TotalFiles = totalFiles;
599+
TransferredBytes = transferredBytes;
600+
TotalBytes = totalBytes;
601+
}
602+
603+
/// <summary>
604+
/// Gets the upload directory request.
605+
/// </summary>
606+
public TransferUtilityUploadDirectoryRequest Request { get; private set; }
607+
608+
/// <summary>
609+
/// Gets the number of files successfully uploaded before failure.
610+
/// </summary>
611+
public long TransferredFiles { get; private set; }
612+
613+
/// <summary>
614+
/// Gets the total number of files attempted.
615+
/// </summary>
616+
public long TotalFiles { get; private set; }
617+
618+
/// <summary>
619+
/// Gets the number of bytes transferred before failure.
620+
/// </summary>
621+
public long TransferredBytes { get; private set; }
622+
623+
/// <summary>
624+
/// Gets the total number of bytes.
625+
/// </summary>
626+
public long TotalBytes { get; private set; }
627+
}
628+
424629
/// <summary>
425630
/// Provides data for <see cref="TransferUtilityUploadDirectoryRequest.ObjectUploadFailedEvent"/>
426631
/// which is raised when an individual object fails to upload during an

0 commit comments

Comments
 (0)