/* * Copyright 2010-2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"). * You may not use this file except in compliance with the License. * A copy of the License is located at * * http://aws.amazon.com/apache2.0 * * or in the "license" file accompanying this file. This file is distributed * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either * express or implied. See the License for the specific language governing * permissions and limitations under the License. */ package com.amazonaws.services.s3.model; import com.amazonaws.AmazonWebServiceRequest; import com.amazonaws.event.ProgressListener; import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.internal.Constants; import java.io.Serializable; import java.util.ArrayList; import java.util.Date; import java.util.List; /** *
* Provides options for downloading an Amazon S3 object. *
*
* All GetObjectRequests
must specify a bucket name and key.
* Beyond that, requests can also specify:
*
*
* If you are uploading or accessing KMS-encrypted objects, you need to * specify the correct region of the bucket on your client and configure AWS * Signature Version 4 for added security. For more information on how to do * this, see * http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingAWSSDK.html#specify * -signature-version *
* * @see GetObjectRequest#GetObjectRequest(String, String) * @see GetObjectRequest#GetObjectRequest(String, String, String) * @see GetObjectMetadataRequest */ public class GetObjectRequest extends AmazonWebServiceRequest implements SSECustomerKeyProvider, Serializable { /** * Builder of an S3 object identifier. This member field is never null. */ private S3ObjectIdBuilder s3ObjectIdBuilder = new S3ObjectIdBuilder(); /** Optional member indicating the byte range of data to retrieve */ private long[] range; /** * Optional list of ETag values that constrain this request to only be * executed if the object's ETag matches one of the specified ETag values. */ private List* Gets the optional version ID specifying which version of the object to * download. If not specified, the most recent version will be downloaded. *
*
* Objects created before versioning was enabled or when versioning is
* suspended are given the default null
version ID (see
* {@link Constants#NULL_VERSION_ID}). Note that the
* null
version ID is a valid version ID and is not the
* same as not having a version ID.
*
* For more information about enabling versioning for a bucket, see * {@link AmazonS3#setBucketVersioningConfiguration(SetBucketVersioningConfigurationRequest)}. *
* * @return The optional version ID specifying which version of the object to * download. If not specified, the most recent version will be * downloaded. * * @see GetObjectRequest#setVersionId(String) * @see GetObjectRequest#withVersionId(String) */ public String getVersionId() { return s3ObjectIdBuilder.getVersionId(); } /** * Sets the optional version ID specifying which version of the object to * download. If not specified, the most recent version will be downloaded. *
* Objects created before versioning was enabled or when versioning is
* suspended will be given the default null
version ID (see
* {@link Constants#NULL_VERSION_ID}). Note that the
* null
version ID is a valid version ID and is not the
* same as not having a version ID.
*
* For more information about enabling versioning for a bucket, see * {@link AmazonS3#setBucketVersioningConfiguration(SetBucketVersioningConfigurationRequest)}. *
* * @param versionId * The optional version ID specifying which version of the object * to download. * * @see GetObjectRequest#getVersionId() * @see GetObjectRequest#withVersionId(String) */ public void setVersionId(String versionId) { s3ObjectIdBuilder.setVersionId(versionId); } /** ** Sets the optional version ID specifying which version of the object to * download and returns this object, enabling additional method calls to be * chained together. If not specified, the most recent version will be * downloaded. *
*
* Objects created before versioning was enabled or when versioning is
* suspended will be given the default or null
version ID (see
* {@link Constants#NULL_VERSION_ID}). Note that the
* null
version ID is a valid version ID and is not the
* same as not having a version ID.
*
* For more information about enabling versioning for a bucket, see * {@link AmazonS3#setBucketVersioningConfiguration(SetBucketVersioningConfigurationRequest)}. *
* * @param versionId * The optional version ID specifying which version of the object * to download. * * @return The updated request object, enabling additional method calls to be * chained together. * * @see GetObjectRequest#getVersionId() * @see GetObjectRequest#setVersionId(String) */ public GetObjectRequest withVersionId(String versionId) { setVersionId(versionId); return this; } /* * Optional Request Parameters */ /** ** Gets the optional inclusive byte range within the desired object * that will be downloaded by this request. *
*
* The range is returned as
* a two element array, containing the start and end index of the byte range.
* If no byte range has been specified, the entire object is downloaded and
* this method returns null
.
*
null
if no range has been specified,
* and the whole object is
* to be downloaded.
*
* @see #setRange(long, long)
* @see #withRange(long, long)
*/
public long[] getRange() {
return range == null ? null : range.clone();
}
/**
* * Sets the optional inclusive byte range within the desired object that * will be downloaded by this request. *
** The first byte in an object has * position 0; as an example, the first ten bytes of an object can be * downloaded by specifying a range of 0 to 9. *
** If no byte range is specified, this request downloads the entire * object from Amazon S3. *
* * @param start * The start of the inclusive byte range to download. * @param end * The end of the inclusive byte range to download. * * @see #getRange() * @see #withRange(long, long) */ public void setRange(long start, long end) { range = new long[] {start, end}; } /** ** Sets the optional inclusive start range within the desired object that the * rest of which will be downloaded by this request. *
** The first byte in an object has * position 0; as an example, the object is of 10 bytes in length, the last * 4 bytes can be downloaded by specifying the start range as 6. *
** If no byte range is specified, this request downloads the entire * object from Amazon S3. *
* * @param start * The start of the inclusive byte range to download. * * @see #setRange(long, long) * @see #withRange(long) */ public void setRange(long start) { setRange(start, Long.MAX_VALUE - 1); } /** ** Sets the optional inclusive byte range within the desired object that * will be downloaded by this request. * Returns this {@link GetObjectRequest}, enabling additional method * calls to be chained together. *
** The first byte in an object has * position 0; as an example, the first ten bytes of an object can be * downloaded by specifying a range of 0 to 9. *
** If no byte range is specified, this request downloads the entire * object from Amazon S3. *
* * @param start * The start of the inclusive byte range to download. * @param end * The end of the inclusive byte range to download. * * @return This {@link GetObjectRequest}, enabling additional method * calls to be chained together. * * @see GetObjectRequest#getRange() * @see GetObjectRequest#setRange(long, long) */ public GetObjectRequest withRange(long start, long end) { setRange(start, end); return this; } /** ** Sets the optional inclusive start range within the desired object that the * rest of which will be downloaded by this request. *
* Returns this {@link GetObjectRequest}, enabling additional method * calls to be chained together. ** The first byte in an object has * position 0; as an example, the object is of 10 bytes in length, the last * 4 bytes can be downloaded by specifying the start range as 6. *
** If no byte range is specified, this request downloads the entire * object from Amazon S3. *
* * @param start * The start of the inclusive byte range to download. * * @return This {@link GetObjectRequest}, enabling additional method * calls to be chained together. * * @see #withRange(long, long) * @see #setRange(long) */ public GetObjectRequest withRange(long start) { setRange(start); return this; } /** * Gets the optional list of ETag constraints that, when present, must * include a match for the object's current ETag in order for this * request to be executed. Only one ETag in the list needs to match for this * request to be executed by Amazon S3. * * @return The optional list of ETag constraints that when present must * include a match for the object's current ETag in order for this * request to be executed. * * @see GetObjectRequest#setMatchingETagConstraints(List) * @see GetObjectRequest#withMatchingETagConstraint(String) */ public List* Multiple ETag constraints can be added to a request, but one must match the object's * current ETag in order for this request to be executed. If none of the * ETag constraints added to this request match the object's current ETag, * this request will not be executed by Amazon S3. *
* * @param eTag * The matching ETag constraint to add to this request. * * @return This {@link GetObjectRequest}, enabling additional method * calls to be chained together. * * @see GetObjectRequest#getMatchingETagConstraints() * @see GetObjectRequest#setMatchingETagConstraints(List) */ public GetObjectRequest withMatchingETagConstraint(String eTag) { this.matchingETagConstraints.add(eTag); return this; } /** * Gets the optional list of ETag constraints that when present, must * not include a match for the object's current ETag in order for this * request to be executed. If any entry in the non-matching ETag constraint * list matches the object's current ETag, this request will not be * executed by Amazon S3. * * @return The optional list of ETag constraints that when present, must * not include a match for the object's current ETag in order * for this request to be executed. * * @see GetObjectRequest#setNonmatchingETagConstraints(List) * @see GetObjectRequest#withNonmatchingETagConstraint(String) */ public List* Multiple ETag * constraints can be added to a request, but all ETag constraints must * not match the object's current ETag in order for this request to be * executed. If any entry in the non-matching ETag constraint list matches * the object's current ETag, this request will not be executed by * Amazon S3. *
* * @param eTag * The non-matching ETag constraint to add to this request. * * @return This {@link GetObjectRequest}, enabling additional method * calls to be chained together. * * @see GetObjectRequest#getNonmatchingETagConstraints() * @see GetObjectRequest#setNonmatchingETagConstraints(List) */ public GetObjectRequest withNonmatchingETagConstraint(String eTag) { this.nonmatchingEtagConstraints.add(eTag); return this; } /** * Gets the optional unmodified constraint that restricts this * request to executing only if the object has not been * modified after the specified date. * * @return The optional unmodified constraint that restricts this * request to executing only if the object has not * been modified after the specified date. * * @see GetObjectRequest#setUnmodifiedSinceConstraint(Date) * @see GetObjectRequest#withUnmodifiedSinceConstraint(Date) */ public Date getUnmodifiedSinceConstraint() { return unmodifiedSinceConstraint; } /** * Sets the optional unmodified constraint that restricts this request * to executing only if the object has not been modified after * the specified date. ** Note that Amazon S3 will ignore any dates occurring in the future. * * @param date * The unmodified constraint that restricts this request to * executing only if the object has not been * modified after this date. * * @see GetObjectRequest#getUnmodifiedSinceConstraint() * @see GetObjectRequest#withUnmodifiedSinceConstraint(Date) */ public void setUnmodifiedSinceConstraint(Date date) { this.unmodifiedSinceConstraint = date; } /** * Sets the optional unmodified constraint that restricts this request * to executing only if the object has not been modified after * the specified date. * Returns this {@link GetObjectRequest}, enabling additional method * calls to be chained together. *
* Note that Amazon S3 will ignore any dates occurring in the future. * * @param date * The unmodified constraint that restricts this request to * executing only if the object has not been * modified after this date. * * @return This {@link GetObjectRequest}, enabling additional method * calls to be chained together. * * @see GetObjectRequest#getUnmodifiedSinceConstraint() * @see GetObjectRequest#setUnmodifiedSinceConstraint(Date) */ public GetObjectRequest withUnmodifiedSinceConstraint(Date date) { setUnmodifiedSinceConstraint(date); return this; } /** * Gets the optional modified constraint that restricts this * request to executing only if the object has been * modified after the specified date. * * @return The optional modified constraint that restricts this * request to executing only if the object has * been modified after the specified date. * * @see GetObjectRequest#setModifiedSinceConstraint(Date) * @see GetObjectRequest#withModifiedSinceConstraint(Date) */ public Date getModifiedSinceConstraint() { return modifiedSinceConstraint; } /** * Sets the optional modified constraint that restricts this request * to executing only if the object has been modified after the * specified date. *
* Note that Amazon S3 will ignore any dates occurring in the future. *
* * @param date * The modified constraint that restricts this request to * executing only if the object has been modified * after the specified date. * * @see GetObjectRequest#getModifiedSinceConstraint() * @see GetObjectRequest#withModifiedSinceConstraint(Date) */ public void setModifiedSinceConstraint(Date date) { this.modifiedSinceConstraint = date; } /** * Sets the optional modified constraint that restricts this request * to executing only if the object has been modified after the * specified date. * Returns this {@link GetObjectRequest}, enabling additional method * calls to be chained together. ** Note that Amazon S3 will ignore any dates occurring in the future. * * @param date * The modified constraint that restricts this request to * executing only if the object has been modified * after the specified date. * * @return This {@link GetObjectRequest}, enabling additional method * calls to be chained together. * * @see GetObjectRequest#getModifiedSinceConstraint() * @see GetObjectRequest#setModifiedSinceConstraint(Date) */ public GetObjectRequest withModifiedSinceConstraint(Date date) { setModifiedSinceConstraint(date); return this; } /** * Returns the headers to be overridden in the service response. * * @return the headers to be overridden in the service response. */ public ResponseHeaderOverrides getResponseHeaders() { return responseHeaders; } /** * Sets the headers to be overridden in the service response. * * @param responseHeaders * The headers to be overridden in the service response. */ public void setResponseHeaders(ResponseHeaderOverrides responseHeaders) { this.responseHeaders = responseHeaders; } /** * Sets the headers to be overridden in the service response and returns * this object, for method chaining. * * @param responseHeaders * The headers to be overridden in the service response. * * @return This {@link GetObjectRequest} for method chaining. */ public GetObjectRequest withResponseHeaders(ResponseHeaderOverrides responseHeaders) { setResponseHeaders(responseHeaders); return this; } /** * Sets the optional progress listener for receiving updates about object * download status. * * @param progressListener * The legacy progress listener that is used exclusively for Amazon S3 client. * * @deprecated use {@link #setGeneralProgressListener(ProgressListener)} * instead. */ @Deprecated public void setProgressListener(com.amazonaws.services.s3.model.ProgressListener progressListener) { setGeneralProgressListener(new LegacyS3ProgressListener(progressListener)); } /** * Returns the optional progress listener for receiving updates about object * download status. * * @return the optional progress listener for receiving updates about object * download status. * * @deprecated use {@link #getGeneralProgressListener()} instead. */ @Deprecated public com.amazonaws.services.s3.model.ProgressListener getProgressListener() { if (generalProgressListener instanceof LegacyS3ProgressListener) { return ((LegacyS3ProgressListener) generalProgressListener).unwrap(); } else { return null; } } /** * Sets the optional progress listener for receiving updates about object * download status, and returns this updated object so that additional method * calls can be chained together. * * @param progressListener * The legacy progress listener that is used exclusively for Amazon S3 client. * * @return This updated GetObjectRequest object. * * @deprecated use {@link #withGeneralProgressListener(ProgressListener)} * instead. */ @Deprecated public GetObjectRequest withProgressListener( com.amazonaws.services.s3.model.ProgressListener progressListener) { setProgressListener(progressListener); return this; } /** * Sets the optional progress listener for receiving updates about object * download status. * * @param generalProgressListener The new progress listener. */ public void setGeneralProgressListener(ProgressListener generalProgressListener) { this.generalProgressListener = generalProgressListener; } /** * Returns the optional progress listener for receiving updates about object * download status. * * @return the optional progress listener for receiving updates about object * download status. */ public ProgressListener getGeneralProgressListener() { return generalProgressListener; } /** * Sets the optional progress listener for receiving updates about object * download status, and returns this updated object so that additional * method calls can be chained together. * * @param generalProgressListener The new progress listener. * @return This updated GetObjectRequest object. */ public GetObjectRequest withGeneralProgressListener(ProgressListener progressListener) { setGeneralProgressListener(progressListener); return this; } /** * Returns true if the user has enabled Requester Pays option when * downloading an object from Requester Pays Bucket; else false. * *
* If a bucket is enabled for Requester Pays, then any attempt to read an * object from it without Requester Pays enabled will result in a 403 error * and the bucket owner will be charged for the request. * *
* Enabling Requester Pays disables the ability to have anonymous access to * this bucket * * @return true if the user has enabled Requester Pays option for * downloading an object from Requester Pays Bucket. */ public boolean isRequesterPays() { return isRequesterPays; } /** * Used for downloading an Amazon S3 Object from a Requester Pays Bucket. If * set the requester is charged for downloading the data from the bucket. * *
* If a bucket is enabled for Requester Pays, then any attempt to read an * object from it without Requester Pays enabled will result in a 403 error * and the bucket owner will be charged for the request. * *
* Enabling Requester Pays disables the ability to have anonymous access to * this bucket * * @param isRequesterPays * Enable Requester Pays option for the operation. */ public void setRequesterPays(boolean isRequesterPays) { this.isRequesterPays = isRequesterPays; } /** * Used for conducting this operation from a Requester Pays Bucket. If * set the requester is charged for requests from the bucket. It returns this * updated GetObjectRequest object so that additional method calls can be * chained together. * *
* If a bucket is enabled for Requester Pays, then any attempt to upload or * download an object from it without Requester Pays enabled will result in * a 403 error and the bucket owner will be charged for the request. * *
* Enabling Requester Pays disables the ability to have anonymous access to * this bucket. * * @param isRequesterPays * Enable Requester Pays option for the operation. * * @return The updated GetObjectRequest object. */ public GetObjectRequest withRequesterPays(boolean isRequesterPays) { setRequesterPays(isRequesterPays); return this; } @Override public SSECustomerKey getSSECustomerKey() { return sseCustomerKey; } /** * Sets the optional customer-provided server-side encryption key to use to * decrypt this object. * * @param sseKey * The optional customer-provided server-side encryption key to * use to decrypt this object. */ public void setSSECustomerKey(SSECustomerKey sseKey) { this.sseCustomerKey = sseKey; } /** * Sets the optional customer-provided server-side encryption key to use to * decrypt this object, and returns the updated GetObjectRequest so that * additional method calls may be chained together. * * @param sseKey * The optional customer-provided server-side encryption key to * use to decrypt this object. * * @return The optional customer-provided server-side encryption key to use * to decrypt this object. */ public GetObjectRequest withSSECustomerKey(SSECustomerKey sseKey) { setSSECustomerKey(sseKey); return this; } /** *
* Returns the optional part number that indicates the part to be downloaded in a multipart object. *
* * @return The part number representing a part in a multipart object. * * @see GetObjectRequest#setPartNumber(Integer) * @see GetObjectRequest#withPartNumber(Integer) */ public Integer getPartNumber() { return partNumber; } /** ** Sets the optional part number that indicates the part to be downloaded in a multipart object. *
** The valid range for part number is 1 - 10000 inclusive. * Part numbers are 1 based. If an object has 1 part, partNumber=1 would be the correct not 0. * For partNumber < 1, an AmazonS3Exception is thrown with response code 400 bad request. * For partNumber larger than actual part count, an AmazonS3Exception is thrown with response code 416 Request Range Not Satisfiable. *
* * @param partNumber * The part number representing a part in a multipart object. * * @see GetObjectRequest#getPartNumber() * @see GetObjectRequest#withPartNumber(Integer) */ public void setPartNumber(Integer partNumber) { this.partNumber = partNumber; } /** ** Sets the optional part number that indicates the part to be downloaded in a multipart object. *
** The valid range for part number is 1 - 10000 inclusive. * Part numbers are 1 based. If an object has 1 part, partNumber=1 would be the correct not 0. * For partNumber < 1, an AmazonS3Exception is thrown with response code 400 bad request. * For partNumber larger than actual part count, an AmazonS3Exception is thrown with response code 416 Request Range Not Satisfiable. *
* * @param partNumber * The part number representing a part in a multipart object. * * @return This {@link GetObjectRequest}, enabling additional method * calls to be chained together. * * @see GetObjectRequest#getPartNumber() * @see GetObjectRequest#setPartNumber(Integer) */ public GetObjectRequest withPartNumber(Integer partNumber) { setPartNumber(partNumber); return this; } /** * Returns an immutable S3 object id. */ public S3ObjectId getS3ObjectId() { return s3ObjectIdBuilder.build(); } /** * Sets the S3 object id for this request. */ public void setS3ObjectId(S3ObjectId s3ObjectId) { this.s3ObjectIdBuilder = new S3ObjectIdBuilder(s3ObjectId); } /** * Fluent API to set the S3 object id for this request. */ public GetObjectRequest withS3ObjectId(S3ObjectId s3ObjectId) { setS3ObjectId(s3ObjectId); return this; } }