@@ -31,7 +31,7 @@ public final class RangeProjectionConfigs {
3131
3232 abstract static class BaseConfig <Projection , Read extends ObjectReadSessionStreamRead <Projection >>
3333 extends RangeProjectionConfig <Projection > {
34- abstract Read newRead (long readId , RangeSpec range , RetryContext retryContext );
34+ abstract Read newRead (long readId , RetryContext retryContext );
3535
3636 @ Override
3737 ProjectionType getType () {
@@ -100,8 +100,7 @@ SeekableChannelConfig withCrc32cValidationEnabled(boolean enabled) {
100100 }
101101
102102 @ Override
103- SeekableByteChannel project (
104- RangeSpec range , ObjectReadSession session , IOAutoCloseable closeAlongWith ) {
103+ SeekableByteChannel project (ObjectReadSession session , IOAutoCloseable closeAlongWith ) {
105104 return StorageByteChannels .seekable (
106105 new ObjectReadSessionSeekableByteChannel (session , this , closeAlongWith ));
107106 }
@@ -138,15 +137,30 @@ public String toString() {
138137
139138 public static final class RangeAsChannel
140139 extends BaseConfig <ScatteringByteChannel , StreamingRead > {
141- private static final RangeAsChannel INSTANCE = new RangeAsChannel (Hasher .enabled ());
140+ private static final RangeAsChannel INSTANCE =
141+ new RangeAsChannel (RangeSpec .all (), Hasher .enabled ());
142142
143+ private final RangeSpec range ;
143144 private final Hasher hasher ;
144145
145- private RangeAsChannel (Hasher hasher ) {
146+ private RangeAsChannel (RangeSpec range , Hasher hasher ) {
146147 super ();
148+ this .range = range ;
147149 this .hasher = hasher ;
148150 }
149151
152+ public RangeSpec getRange () {
153+ return range ;
154+ }
155+
156+ public RangeAsChannel withRangeSpec (RangeSpec range ) {
157+ requireNonNull (range , "range must be non null" );
158+ if (this .range .equals (range )) {
159+ return this ;
160+ }
161+ return new RangeAsChannel (range , hasher );
162+ }
163+
150164 boolean getCrc32cValidationEnabled () {
151165 return Hasher .enabled ().equals (hasher );
152166 }
@@ -157,7 +171,7 @@ RangeAsChannel withCrc32cValidationEnabled(boolean enabled) {
157171 } else if (!enabled && Hasher .noop ().equals (hasher )) {
158172 return this ;
159173 }
160- return new RangeAsChannel (enabled ? Hasher .enabled () : Hasher .noop ());
174+ return new RangeAsChannel (range , enabled ? Hasher .enabled () : Hasher .noop ());
161175 }
162176
163177 @ Override
@@ -166,22 +180,62 @@ RangeAsChannel withCrc32cValidationEnabled(boolean enabled) {
166180 }
167181
168182 @ Override
169- StreamingRead newRead (long readId , RangeSpec range , RetryContext retryContext ) {
183+ StreamingRead newRead (long readId , RetryContext retryContext ) {
170184 return ObjectReadSessionStreamRead .streamingRead (readId , range , hasher , retryContext );
171185 }
186+
187+ @ Override
188+ public boolean equals (Object o ) {
189+ if (this == o ) {
190+ return true ;
191+ }
192+ if (!(o instanceof RangeAsChannel )) {
193+ return false ;
194+ }
195+ RangeAsChannel that = (RangeAsChannel ) o ;
196+ return Objects .equals (range , that .range ) && Objects .equals (hasher , that .hasher );
197+ }
198+
199+ @ Override
200+ public int hashCode () {
201+ return Objects .hash (range , hasher );
202+ }
203+
204+ @ Override
205+ public String toString () {
206+ return MoreObjects .toStringHelper (this )
207+ .add ("range" , range )
208+ .add ("crc32cValidationEnabled" , getCrc32cValidationEnabled ())
209+ .toString ();
210+ }
172211 }
173212
174213 public static final class RangeAsFutureBytes
175214 extends BaseConfig <ApiFuture <byte []>, AccumulatingRead <byte []>> {
176- private static final RangeAsFutureBytes INSTANCE = new RangeAsFutureBytes (Hasher .enabled ());
215+ private static final RangeAsFutureBytes INSTANCE =
216+ new RangeAsFutureBytes (RangeSpec .all (), Hasher .enabled ());
177217
218+ private final RangeSpec range ;
178219 private final Hasher hasher ;
179220
180- private RangeAsFutureBytes (Hasher hasher ) {
221+ private RangeAsFutureBytes (RangeSpec range , Hasher hasher ) {
181222 super ();
223+ this .range = range ;
182224 this .hasher = hasher ;
183225 }
184226
227+ public RangeSpec getRange () {
228+ return range ;
229+ }
230+
231+ public RangeAsFutureBytes withRangeSpec (RangeSpec range ) {
232+ requireNonNull (range , "range must be non null" );
233+ if (this .range .equals (range )) {
234+ return this ;
235+ }
236+ return new RangeAsFutureBytes (range , hasher );
237+ }
238+
185239 boolean getCrc32cValidationEnabled () {
186240 return Hasher .enabled ().equals (hasher );
187241 }
@@ -192,7 +246,7 @@ RangeAsFutureBytes withCrc32cValidationEnabled(boolean enabled) {
192246 } else if (!enabled && Hasher .noop ().equals (hasher )) {
193247 return this ;
194248 }
195- return new RangeAsFutureBytes (enabled ? Hasher .enabled () : Hasher .noop ());
249+ return new RangeAsFutureBytes (range , enabled ? Hasher .enabled () : Hasher .noop ());
196250 }
197251
198252 @ Override
@@ -201,24 +255,63 @@ RangeAsFutureBytes withCrc32cValidationEnabled(boolean enabled) {
201255 }
202256
203257 @ Override
204- AccumulatingRead <byte []> newRead (long readId , RangeSpec range , RetryContext retryContext ) {
258+ AccumulatingRead <byte []> newRead (long readId , RetryContext retryContext ) {
205259 return ObjectReadSessionStreamRead .createByteArrayAccumulatingRead (
206260 readId , range , hasher , retryContext );
207261 }
262+
263+ @ Override
264+ public boolean equals (Object o ) {
265+ if (this == o ) {
266+ return true ;
267+ }
268+ if (!(o instanceof RangeAsFutureBytes )) {
269+ return false ;
270+ }
271+ RangeAsFutureBytes that = (RangeAsFutureBytes ) o ;
272+ return Objects .equals (range , that .range ) && Objects .equals (hasher , that .hasher );
273+ }
274+
275+ @ Override
276+ public int hashCode () {
277+ return Objects .hash (range , hasher );
278+ }
279+
280+ @ Override
281+ public String toString () {
282+ return MoreObjects .toStringHelper (this )
283+ .add ("range" , range )
284+ .add ("crc32cValidationEnabled" , getCrc32cValidationEnabled ())
285+ .toString ();
286+ }
208287 }
209288
210289 static final class RangeAsFutureByteString
211290 extends BaseConfig <ApiFuture <DisposableByteString >, AccumulatingRead <DisposableByteString >> {
212291 private static final RangeAsFutureByteString INSTANCE =
213- new RangeAsFutureByteString (Hasher .enabled ());
292+ new RangeAsFutureByteString (RangeSpec . all (), Hasher .enabled ());
214293
294+ private final RangeSpec range ;
215295 private final Hasher hasher ;
216296
217- private RangeAsFutureByteString (Hasher hasher ) {
297+ private RangeAsFutureByteString (RangeSpec range , Hasher hasher ) {
218298 super ();
299+ this .range = range ;
219300 this .hasher = hasher ;
220301 }
221302
303+ public RangeSpec getRange () {
304+ return range ;
305+ }
306+
307+ public RangeAsFutureByteString withRangeSpec (RangeSpec range ) {
308+ requireNonNull (range , "range must be non null" );
309+ if (this .range .equals (range )) {
310+ return this ;
311+ }
312+ return new RangeAsFutureByteString (range , hasher );
313+ }
314+
222315 boolean getCrc32cValidationEnabled () {
223316 return Hasher .enabled ().equals (hasher );
224317 }
@@ -229,7 +322,7 @@ RangeAsFutureByteString withCrc32cValidationEnabled(boolean enabled) {
229322 } else if (!enabled && Hasher .noop ().equals (hasher )) {
230323 return this ;
231324 }
232- return new RangeAsFutureByteString (enabled ? Hasher .enabled () : Hasher .noop ());
325+ return new RangeAsFutureByteString (range , enabled ? Hasher .enabled () : Hasher .noop ());
233326 }
234327
235328 @ Override
@@ -238,10 +331,34 @@ RangeAsFutureByteString withCrc32cValidationEnabled(boolean enabled) {
238331 }
239332
240333 @ Override
241- AccumulatingRead <DisposableByteString > newRead (
242- long readId , RangeSpec range , RetryContext retryContext ) {
334+ AccumulatingRead <DisposableByteString > newRead (long readId , RetryContext retryContext ) {
243335 return ObjectReadSessionStreamRead .createZeroCopyByteStringAccumulatingRead (
244336 readId , range , hasher , retryContext );
245337 }
338+
339+ @ Override
340+ public boolean equals (Object o ) {
341+ if (this == o ) {
342+ return true ;
343+ }
344+ if (!(o instanceof RangeAsFutureByteString )) {
345+ return false ;
346+ }
347+ RangeAsFutureByteString that = (RangeAsFutureByteString ) o ;
348+ return Objects .equals (range , that .range ) && Objects .equals (hasher , that .hasher );
349+ }
350+
351+ @ Override
352+ public int hashCode () {
353+ return Objects .hash (range , hasher );
354+ }
355+
356+ @ Override
357+ public String toString () {
358+ return MoreObjects .toStringHelper (this )
359+ .add ("range" , range )
360+ .add ("crc32cValidationEnabled" , getCrc32cValidationEnabled ())
361+ .toString ();
362+ }
246363 }
247364}
0 commit comments