1+ /*
2+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3+ *
4+ * Licensed under the Apache License, Version 2.0 (the "License").
5+ * You may not use this file except in compliance with the License.
6+ * A copy of the License is located at
7+ *
8+ * http://aws.amazon.com/apache2.0
9+ *
10+ * or in the "license" file accompanying this file. This file is distributed
11+ * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
12+ * express or implied. See the License for the specific language governing
13+ * permissions and limitations under the License.
14+ */
15+
16+ package software .amazon .awssdk .core ;
17+
18+ import java .nio .file .Path ;
19+ import java .util .Objects ;
20+ import software .amazon .awssdk .annotations .SdkPublicApi ;
21+ import software .amazon .awssdk .core .async .AsyncRequestBody ;
22+ import software .amazon .awssdk .utils .Validate ;
23+ import software .amazon .awssdk .utils .builder .CopyableBuilder ;
24+ import software .amazon .awssdk .utils .builder .ToCopyableBuilder ;
25+
26+ /**
27+ * Configuration options for {@link AsyncRequestBody#fromFile(FileRequestBodyConfiguration)} to configure how the SDK
28+ * should read the file.
29+ *
30+ * @see #builder()
31+ */
32+ @ SdkPublicApi
33+ public final class FileRequestBodyConfiguration implements ToCopyableBuilder <FileRequestBodyConfiguration .Builder ,
34+ FileRequestBodyConfiguration > {
35+ private final Integer chunkSizeInBytes ;
36+ private final Long position ;
37+ private final Long numBytesToRead ;
38+ private final Path path ;
39+
40+ private FileRequestBodyConfiguration (DefaultBuilder builder ) {
41+ this .path = Validate .notNull (builder .path , "path" );
42+ this .chunkSizeInBytes = Validate .isPositiveOrNull (builder .chunkSizeInBytes , "chunkSizeInBytes" );
43+ this .position = Validate .isNotNegativeOrNull (builder .position , "position" );
44+ this .numBytesToRead = Validate .isNotNegativeOrNull (builder .numBytesToRead , "numBytesToRead" );
45+ }
46+
47+ /**
48+ * Create a {@link Builder}, used to create a {@link FileRequestBodyConfiguration}.
49+ */
50+ public static Builder builder () {
51+ return new DefaultBuilder ();
52+ }
53+
54+ /**
55+ * @return the size of each chunk to read from the file
56+ */
57+ public Integer chunkSizeInBytes () {
58+ return chunkSizeInBytes ;
59+ }
60+
61+ /**
62+ * @return the file position at which the request body begins.
63+ */
64+ public Long position () {
65+ return position ;
66+ }
67+
68+ /**
69+ * @return the number of bytes to read from this file.
70+ */
71+ public Long numBytesToRead () {
72+ return numBytesToRead ;
73+ }
74+
75+ /**
76+ * @return the file path
77+ */
78+ public Path path () {
79+ return path ;
80+ }
81+
82+ @ Override
83+ public boolean equals (Object o ) {
84+ if (this == o ) {
85+ return true ;
86+ }
87+ if (o == null || getClass () != o .getClass ()) {
88+ return false ;
89+ }
90+
91+ FileRequestBodyConfiguration that = (FileRequestBodyConfiguration ) o ;
92+
93+ if (!Objects .equals (chunkSizeInBytes , that .chunkSizeInBytes )) {
94+ return false ;
95+ }
96+ if (!Objects .equals (position , that .position )) {
97+ return false ;
98+ }
99+ if (!Objects .equals (numBytesToRead , that .numBytesToRead )) {
100+ return false ;
101+ }
102+ return Objects .equals (path , that .path );
103+ }
104+
105+ @ Override
106+ public int hashCode () {
107+ int result = chunkSizeInBytes != null ? chunkSizeInBytes .hashCode () : 0 ;
108+ result = 31 * result + (position != null ? position .hashCode () : 0 );
109+ result = 31 * result + (numBytesToRead != null ? numBytesToRead .hashCode () : 0 );
110+ result = 31 * result + (path != null ? path .hashCode () : 0 );
111+ return result ;
112+ }
113+
114+ @ Override
115+ public Builder toBuilder () {
116+ return new DefaultBuilder (this );
117+ }
118+
119+ public interface Builder extends CopyableBuilder <Builder , FileRequestBodyConfiguration > {
120+
121+ /**
122+ * Sets the {@link Path} to the file containing data to send to the service
123+ *
124+ * @param path Path to file to read.
125+ * @return This builder for method chaining.
126+ */
127+ Builder path (Path path );
128+
129+ /**
130+ * Sets the size of chunks read from the file. Increasing this will cause more data to be buffered into memory but
131+ * may yield better latencies. Decreasing this will reduce memory usage but may cause reduced latency. Setting this value
132+ * is very dependent on upload speed and requires some performance testing to tune.
133+ *
134+ * <p>The default chunk size is 16 KiB</p>
135+ *
136+ * @param chunkSize New chunk size in bytes.
137+ * @return This builder for method chaining.
138+ */
139+ Builder chunkSizeInBytes (Integer chunkSize );
140+
141+ /**
142+ * Sets the file position at which the request body begins.
143+ *
144+ * <p>By default, it's 0, i.e., reading from the beginning.
145+ *
146+ * @param position the position of the file
147+ * @return The builder for method chaining.
148+ */
149+ Builder position (Long position );
150+
151+ /**
152+ * Sets the number of bytes to read from this file.
153+ *
154+ * <p>By default, it's same as the file length.
155+ *
156+ * @param numBytesToRead number of bytes to read
157+ * @return The builder for method chaining.
158+ */
159+ Builder numBytesToRead (Long numBytesToRead );
160+ }
161+
162+ private static final class DefaultBuilder implements Builder {
163+ private Long position ;
164+ private Path path ;
165+ private Integer chunkSizeInBytes ;
166+ private Long numBytesToRead ;
167+
168+ private DefaultBuilder (FileRequestBodyConfiguration configuration ) {
169+ this .position = configuration .position ;
170+ this .path = configuration .path ;
171+ this .chunkSizeInBytes = configuration .chunkSizeInBytes ;
172+ this .numBytesToRead = configuration .numBytesToRead ;
173+ }
174+
175+ private DefaultBuilder () {
176+
177+ }
178+
179+ @ Override
180+ public Builder path (Path path ) {
181+ this .path = path ;
182+ return this ;
183+ }
184+
185+ @ Override
186+ public Builder chunkSizeInBytes (Integer chunkSizeInBytes ) {
187+ this .chunkSizeInBytes = chunkSizeInBytes ;
188+ return this ;
189+ }
190+
191+ @ Override
192+ public Builder position (Long position ) {
193+ this .position = position ;
194+ return this ;
195+ }
196+
197+ @ Override
198+ public Builder numBytesToRead (Long numBytesToRead ) {
199+ this .numBytesToRead = numBytesToRead ;
200+ return this ;
201+ }
202+
203+ @ Override
204+ public FileRequestBodyConfiguration build () {
205+ return new FileRequestBodyConfiguration (this );
206+ }
207+ }
208+
209+ }
0 commit comments