package thredds.crawlabledataset.s3;
import java.io.File;
import java.io.IOException;
import com.amazonaws.services.s3.model.ObjectListing;
import com.amazonaws.services.s3.model.ObjectMetadata;
/**
* Provides an interface for accessing the Amazon S3 web service. It is a basic version of the
* {@link com.amazonaws.services.s3.AmazonS3} interface that is much simpler to use from within THREDDS.
*
* @author cwardgar
* @since 2015/08/26
*/
public interface ThreddsS3Client {
/**
* Gets the metadata for the specified Amazon S3 object without actually fetching the object itself.
* The object metadata contains information such as content type, content disposition, etc.,
* as well as custom user metadata that can be associated with an object in Amazon S3.
*
* @param s3uri the Amazon S3 URI of the object whose metadata is being retrieved.
* @return all Amazon S3 object metadata for the specified object.
* Will be {@code null} if there is no S3 bucket with the specified name that has the specified key.
*/
ObjectMetadata getObjectMetadata(S3URI s3uri);
/**
* Returns a listing of the objects located in the "virtual filesystem" at the specified URI.
* {@code s3uri.getKey()} is interpreted as a path, and only objects (accessible via
* {@link ObjectListing#getObjectSummaries}) or "directories" (accessible via
* {@link ObjectListing#getCommonPrefixes}) that have that prefix will be part of the returned listing.
* <p>
* NOTE: To manage large result sets, Amazon S3 uses pagination to split them into multiple responses.
* As a consequence, this listing will only include the first 1000-or-so results.
* <p>
* TODO: Extend this API so that it allows the retrieval of more than 1000 results.
*
* @param s3uri the Amazon S3 URI of the "virtual directory" whose objects are being retrieved.
* @return a listing of objects. Will be {@code null} if the specified URI does not denote an existing virtual
* directory. Otherwise, the result will be non-null and non-empty. That is, it will have at least one
* object summary or at least one common prefix.
* @see com.amazonaws.services.s3.AmazonS3#listObjects(String)
*/
ObjectListing listObjects(S3URI s3uri);
/**
* Gets the object metadata for the object stored in Amazon S3 under the specified bucket and key,
* and saves the object contents to the specified file.
*
* @param s3uri the Amazon S3 URI of the object whose content is being saved.
* @param file indicates the file (which might already exist) where to save the object content being downloading
* from Amazon S3.
* @return the file in which the Amazon S3 object's content was saved.
* Returns {@code null} if there is no S3 bucket with the specified name that has the specified key.
* @throws IOException if some I/O error occurred on the local filesystem while writing to file.
*/
File saveObjectToFile(S3URI s3uri, File file) throws IOException;
}