public class S3Tap extends cascading.tap.Tap<java.util.Properties,java.io.InputStream,java.io.OutputStream> implements cascading.tap.type.FileType<java.util.Properties>, cascading.tap.type.TapWith<java.util.Properties,java.io.InputStream,java.io.OutputStream>
Tap providing read and write access to data stored in Amazon S3 buckets.
This Tap is not intended to be used with any of the other Cascading planners unless they specify they are local-mode compatible.
S3Tap can read a single key, all objects underneath a key-prefix, or all objects under a key-prefix that match a given globbing pattern.
See the various constructors for the available access parametrizations. Of note are the constructors that take
a URI instance. The URI should be in the following format:
s3://[bucket]/<key|key-prefix><?glob>
Where bucket is the only required value. The key references a single object, the key-prefix is used to access a set of objects with a common prefix value. The glob value is use to further narrow the resulting object set.
The globbing pattern is specified by the FileSystem.getPathMatcher(java.lang.String) method.
This Tap was designed to allow applications to effectively poll an S3 bucket for new keys to be processed.
When used with the S3FileCheckpointer class, a map of keys last consumed by each bucket will be tracked
on disk, with the map surviving JVM restarts allowing for applications to exit and restart safely without
retrieving duplicate data.
The S3Checkpointer.commit() method is only called during a graceful shutdown of the Flow or JVM, but every
consumed key is passed to the S3Checkpointer, so custom implementations can choose to persist the key more
frequently.
AWS Credentials are handled by DefaultAWSCredentialsProviderChain.
| Modifier and Type | Field and Description |
|---|---|
static java.lang.String |
DEFAULT_DELIMITER
Field DEFAULT_DELIMITER
|
static java.lang.String |
MIME_DIRECTORY
Field MIME_DIRECTORY
|
static java.lang.String |
SEQUENCE_TOKEN
Field SEQUENCE_TOKEN
|
| Constructor and Description |
|---|
S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme,
com.amazonaws.services.s3.AmazonS3 s3Client,
S3Checkpointer checkpointer,
java.lang.String bucketName)
Constructor S3Tap creates a new S3Tap instance.
|
S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme,
com.amazonaws.services.s3.AmazonS3 s3Client,
S3Checkpointer checkpointer,
java.lang.String bucketName,
cascading.tap.SinkMode sinkMode)
Constructor S3Tap creates a new S3Tap instance.
|
S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme,
com.amazonaws.services.s3.AmazonS3 s3Client,
S3Checkpointer checkpointer,
java.lang.String bucketName,
java.lang.String key)
Constructor S3Tap creates a new S3Tap instance.
|
S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme,
com.amazonaws.services.s3.AmazonS3 s3Client,
S3Checkpointer checkpointer,
java.lang.String bucketName,
java.lang.String key,
cascading.tap.SinkMode sinkMode)
Constructor S3Tap creates a new S3Tap instance.
|
S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme,
com.amazonaws.services.s3.AmazonS3 s3Client,
S3Checkpointer checkpointer,
java.lang.String bucketName,
java.lang.String key,
java.lang.String delimiter)
Constructor S3Tap creates a new S3Tap instance.
|
S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme,
com.amazonaws.services.s3.AmazonS3 s3Client,
S3Checkpointer checkpointer,
java.lang.String bucketName,
java.lang.String key,
java.lang.String delimiter,
java.util.function.Predicate<java.lang.String> filter)
Constructor S3Tap creates a new S3Tap instance.
|
S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme,
com.amazonaws.services.s3.AmazonS3 s3Client,
S3Checkpointer checkpointer,
java.lang.String bucketName,
java.lang.String key,
java.lang.String delimiter,
java.util.function.Predicate<java.lang.String> filter,
cascading.tap.SinkMode sinkMode)
Constructor S3Tap creates a new S3Tap instance.
|
S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme,
com.amazonaws.services.s3.AmazonS3 s3Client,
S3Checkpointer checkpointer,
java.lang.String bucketName,
java.lang.String key,
java.lang.String delimiter,
cascading.tap.SinkMode sinkMode)
Constructor S3Tap creates a new S3Tap instance.
|
S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme,
com.amazonaws.services.s3.AmazonS3 s3Client,
S3Checkpointer checkpointer,
java.net.URI identifier)
Constructor S3Tap creates a new S3Tap instance.
|
S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme,
com.amazonaws.services.s3.AmazonS3 s3Client,
S3Checkpointer checkpointer,
java.net.URI identifier,
cascading.tap.SinkMode sinkMode)
Constructor S3Tap creates a new S3Tap instance.
|
S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme,
com.amazonaws.services.s3.AmazonS3 s3Client,
java.lang.String bucketName)
Constructor S3Tap creates a new S3Tap instance.
|
S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme,
com.amazonaws.services.s3.AmazonS3 s3Client,
java.lang.String bucketName,
cascading.tap.SinkMode sinkMode)
Constructor S3Tap creates a new S3Tap instance.
|
S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme,
com.amazonaws.services.s3.AmazonS3 s3Client,
java.lang.String bucketName,
java.lang.String key)
Constructor S3Tap creates a new S3Tap instance.
|
S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme,
com.amazonaws.services.s3.AmazonS3 s3Client,
java.lang.String bucketName,
java.lang.String key,
cascading.tap.SinkMode sinkMode)
Constructor S3Tap creates a new S3Tap instance.
|
S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme,
com.amazonaws.services.s3.AmazonS3 s3Client,
java.lang.String bucketName,
java.lang.String key,
java.lang.String delimiter)
Constructor S3Tap creates a new S3Tap instance.
|
S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme,
com.amazonaws.services.s3.AmazonS3 s3Client,
java.lang.String bucketName,
java.lang.String key,
java.lang.String delimiter,
java.util.function.Predicate<java.lang.String> filter)
Constructor S3Tap creates a new S3Tap instance.
|
S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme,
com.amazonaws.services.s3.AmazonS3 s3Client,
java.lang.String bucketName,
java.lang.String key,
java.lang.String delimiter,
java.util.function.Predicate<java.lang.String> filter,
cascading.tap.SinkMode sinkMode)
Constructor S3Tap creates a new S3Tap instance.
|
S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme,
com.amazonaws.services.s3.AmazonS3 s3Client,
java.lang.String bucketName,
java.lang.String key,
java.lang.String delimiter,
cascading.tap.SinkMode sinkMode)
Constructor S3Tap creates a new S3Tap instance.
|
S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme,
com.amazonaws.services.s3.AmazonS3 s3Client,
java.net.URI identifier)
Constructor S3Tap creates a new S3Tap instance.
|
S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme,
com.amazonaws.services.s3.AmazonS3 s3Client,
java.net.URI identifier,
cascading.tap.SinkMode sinkMode)
Constructor S3Tap creates a new S3Tap instance.
|
S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme,
S3Checkpointer checkpointer,
java.lang.String bucketName)
Constructor S3Tap creates a new S3Tap instance.
|
S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme,
S3Checkpointer checkpointer,
java.lang.String bucketName,
java.util.function.Predicate<java.lang.String> filter)
Constructor S3Tap creates a new S3Tap instance.
|
S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme,
S3Checkpointer checkpointer,
java.lang.String bucketName,
java.util.function.Predicate<java.lang.String> filter,
cascading.tap.SinkMode sinkMode)
Constructor S3Tap creates a new S3Tap instance.
|
S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme,
S3Checkpointer checkpointer,
java.lang.String bucketName,
cascading.tap.SinkMode sinkMode)
Constructor S3Tap creates a new S3Tap instance.
|
S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme,
S3Checkpointer checkpointer,
java.lang.String bucketName,
java.lang.String key)
Constructor S3Tap creates a new S3Tap instance.
|
S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme,
S3Checkpointer checkpointer,
java.lang.String bucketName,
java.lang.String key,
java.util.function.Predicate<java.lang.String> filter)
Constructor S3Tap creates a new S3Tap instance.
|
S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme,
S3Checkpointer checkpointer,
java.lang.String bucketName,
java.lang.String key,
java.util.function.Predicate<java.lang.String> filter,
cascading.tap.SinkMode sinkMode)
Constructor S3Tap creates a new S3Tap instance.
|
S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme,
S3Checkpointer checkpointer,
java.lang.String bucketName,
java.lang.String key,
cascading.tap.SinkMode sinkMode)
Constructor S3Tap creates a new S3Tap instance.
|
S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme,
S3Checkpointer checkpointer,
java.lang.String bucketName,
java.lang.String key,
java.lang.String delimiter)
Constructor S3Tap creates a new S3Tap instance.
|
S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme,
S3Checkpointer checkpointer,
java.lang.String bucketName,
java.lang.String key,
java.lang.String delimiter,
java.util.function.Predicate<java.lang.String> filter)
Constructor S3Tap creates a new S3Tap instance.
|
S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme,
S3Checkpointer checkpointer,
java.lang.String bucketName,
java.lang.String key,
java.lang.String delimiter,
java.util.function.Predicate<java.lang.String> filter,
cascading.tap.SinkMode sinkMode)
Constructor S3Tap creates a new S3Tap instance.
|
S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme,
S3Checkpointer checkpointer,
java.lang.String bucketName,
java.lang.String key,
java.lang.String delimiter,
cascading.tap.SinkMode sinkMode)
Constructor S3Tap creates a new S3Tap instance.
|
S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme,
S3Checkpointer checkpointer,
java.net.URI identifier)
Constructor S3Tap creates a new S3Tap instance.
|
S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme,
S3Checkpointer checkpointer,
java.net.URI identifier,
cascading.tap.SinkMode sinkMode)
Constructor S3Tap creates a new S3Tap instance.
|
S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme,
java.lang.String bucketName)
Constructor S3Tap creates a new S3Tap instance.
|
S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme,
java.lang.String bucketName,
java.util.function.Predicate<java.lang.String> filter)
Constructor S3Tap creates a new S3Tap instance.
|
S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme,
java.lang.String bucketName,
java.util.function.Predicate<java.lang.String> filter,
cascading.tap.SinkMode sinkMode)
Constructor S3Tap creates a new S3Tap instance.
|
S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme,
java.lang.String bucketName,
cascading.tap.SinkMode sinkMode)
Constructor S3Tap creates a new S3Tap instance.
|
S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme,
java.lang.String bucketName,
java.lang.String key)
Constructor S3Tap creates a new S3Tap instance.
|
S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme,
java.lang.String bucketName,
java.lang.String key,
java.util.function.Predicate<java.lang.String> filter)
Constructor S3Tap creates a new S3Tap instance.
|
S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme,
java.lang.String bucketName,
java.lang.String key,
java.util.function.Predicate<java.lang.String> filter,
cascading.tap.SinkMode sinkMode)
Constructor S3Tap creates a new S3Tap instance.
|
S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme,
java.lang.String bucketName,
java.lang.String key,
cascading.tap.SinkMode sinkMode)
Constructor S3Tap creates a new S3Tap instance.
|
S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme,
java.lang.String bucketName,
java.lang.String key,
java.lang.String delimiter)
Constructor S3Tap creates a new S3Tap instance.
|
S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme,
java.lang.String bucketName,
java.lang.String key,
java.lang.String delimiter,
java.util.function.Predicate<java.lang.String> filter)
Constructor S3Tap creates a new S3Tap instance.
|
S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme,
java.lang.String bucketName,
java.lang.String key,
java.lang.String delimiter,
java.util.function.Predicate<java.lang.String> filter,
cascading.tap.SinkMode sinkMode)
Constructor S3Tap creates a new S3Tap instance.
|
S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme,
java.lang.String bucketName,
java.lang.String key,
java.lang.String delimiter,
cascading.tap.SinkMode sinkMode)
Constructor S3Tap creates a new S3Tap instance.
|
S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme,
java.net.URI identifier)
Constructor S3Tap creates a new S3Tap instance.
|
S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme,
java.net.URI identifier,
cascading.tap.SinkMode sinkMode)
Constructor S3Tap creates a new S3Tap instance.
|
| Modifier and Type | Method and Description |
|---|---|
protected java.lang.String |
cleanKey(java.net.URI identifier) |
protected void |
commitMarker() |
protected cascading.tap.type.TapWith<java.util.Properties,java.io.InputStream,java.io.OutputStream> |
create(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme,
com.amazonaws.services.s3.AmazonS3 s3Client,
java.lang.String bucketName,
java.lang.String key,
java.lang.String delimiter,
java.util.function.Predicate<java.lang.String> filter,
cascading.tap.SinkMode sinkMode) |
protected cascading.tap.type.TapWith<java.util.Properties,java.io.InputStream,java.io.OutputStream> |
create(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme,
com.amazonaws.services.s3.AmazonS3 s3Client,
java.net.URI identifier,
cascading.tap.SinkMode sinkMode) |
boolean |
createResource(java.util.Properties conf) |
protected com.amazonaws.services.s3.transfer.Upload |
createUpload(java.lang.String key,
com.amazonaws.services.s3.transfer.TransferManager transferManager,
com.amazonaws.services.s3.model.PutObjectRequest request) |
boolean |
deleteResource(java.util.Properties conf) |
java.lang.String |
getBucketName()
Method getBucketName returns the bucketName of this S3Tap object.
|
protected java.lang.String |
getBucketNameFor(java.net.URI identifier) |
S3Checkpointer |
getCheckpointer()
Method getCheckpointer returns the checkpointer of this S3Tap object.
|
java.lang.String[] |
getChildIdentifiers(cascading.flow.FlowProcess<? extends java.util.Properties> flowProcess) |
java.lang.String[] |
getChildIdentifiers(cascading.flow.FlowProcess<? extends java.util.Properties> flowProcess,
int depth,
boolean fullyQualified) |
java.lang.String[] |
getChildIdentifiers(java.util.Properties conf) |
java.lang.String[] |
getChildIdentifiers(java.util.Properties conf,
int depth,
boolean fullyQualified) |
java.lang.String |
getDelimiter()
Method getDelimiter returns the delimiter of this S3Tap object.
|
java.util.function.Predicate<java.lang.String> |
getFilter()
Method getFilter returns the filter of this S3Tap object.
|
java.lang.String |
getFullIdentifier(java.util.Properties conf) |
java.lang.String |
getIdentifier() |
java.lang.String |
getKey()
Method getKey returns the key of this S3Tap object.
|
protected java.lang.String |
getMarker() |
long |
getModifiedTime(java.util.Properties conf) |
protected com.amazonaws.services.s3.model.ObjectMetadata |
getObjectMetadata(java.util.Properties conf) |
protected com.amazonaws.services.s3.AmazonS3 |
getS3Client(java.util.Properties properties) |
long |
getSize(cascading.flow.FlowProcess<? extends java.util.Properties> flowProcess) |
long |
getSize(java.util.Properties conf) |
protected com.amazonaws.services.s3.model.AmazonS3Exception |
handleException(com.amazonaws.services.s3.AmazonS3 s3Client,
com.amazonaws.services.s3.model.AmazonS3Exception exception) |
protected void |
handleResult(com.amazonaws.services.s3.transfer.Upload upload,
com.amazonaws.services.s3.transfer.model.UploadResult uploadResult,
java.lang.String loggableIdentifier) |
boolean |
isDirectory(cascading.flow.FlowProcess<? extends java.util.Properties> flowProcess) |
boolean |
isDirectory(java.util.Properties conf) |
protected java.lang.String |
makePath(java.util.Iterator<com.amazonaws.services.s3.model.S3ObjectSummary> iterator,
boolean fullyQualified) |
protected static java.lang.String |
makeStringIdentifier(java.lang.String bucketName,
java.lang.String keyPrefix) |
static java.net.URI |
makeURI(java.lang.String bucketName,
java.lang.String keyPrefix)
Method makeURI creates a new S3 URI from the given parameters.
|
static java.net.URI |
makeURI(java.lang.String bucketName,
java.lang.String keyPrefix,
java.lang.String glob)
Method makeURI creates a new S3 URI from the given parameters.
|
cascading.tuple.TupleEntryIterator |
openForRead(cascading.flow.FlowProcess<? extends java.util.Properties> flowProcess,
java.io.InputStream input) |
cascading.tuple.TupleEntryCollector |
openForWrite(cascading.flow.FlowProcess<? extends java.util.Properties> flowProcess,
java.io.OutputStream outputStream) |
protected java.io.InputStream |
openInputStream(com.google.common.io.ByteSource byteSource,
java.lang.String loggableIdentifier) |
protected java.lang.String |
resolveKey(cascading.flow.FlowProcess<? extends java.util.Properties> flowProcess,
java.lang.String key) |
boolean |
resourceExists(java.util.Properties conf) |
protected void |
setLastMarker(java.lang.String marker) |
cascading.tap.type.TapWith<java.util.Properties,java.io.InputStream,java.io.OutputStream> |
withChildIdentifier(java.lang.String identifier) |
cascading.tap.type.TapWith<java.util.Properties,java.io.InputStream,java.io.OutputStream> |
withScheme(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme) |
cascading.tap.type.TapWith<java.util.Properties,java.io.InputStream,java.io.OutputStream> |
withSinkMode(cascading.tap.SinkMode sinkMode) |
commitResource, createResource, deleteResource, entryStream, entryStream, entryStreamCopy, entryStreamCopy, equals, flowConfInit, getConfigDef, getFullIdentifier, getModifiedTime, getNodeConfigDef, getScheme, getSinkFields, getSinkMode, getSourceFields, getStepConfigDef, getTrace, hasConfigDef, hashCode, hasNodeConfigDef, hasStepConfigDef, id, isKeep, isReplace, isSink, isSource, isTemporary, isUpdate, openForRead, openForReadUnchecked, openForWrite, outgoingScopeFor, prepareResourceForRead, prepareResourceForWrite, presentSinkFields, presentSourceFields, resolveIncomingOperationArgumentFields, resolveIncomingOperationPassThroughFields, resourceExists, retrieveSinkFields, retrieveSourceFields, rollbackResource, setScheme, sinkConfInit, sourceConfInit, spliterator, splititerator, taps, toString, tupleStream, tupleStream, tupleStreamCopy, tupleStreamCopypublic static final java.lang.String SEQUENCE_TOKEN
public static final java.lang.String MIME_DIRECTORY
public static final java.lang.String DEFAULT_DELIMITER
public S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme, java.lang.String bucketName)
scheme - of SchemebucketName - of Stringpublic S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme, java.lang.String bucketName, java.lang.String key)
scheme - of SchemebucketName - of Stringkey - of Stringpublic S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme, java.lang.String bucketName, java.lang.String key, java.lang.String delimiter)
scheme - of SchemebucketName - of Stringkey - of Stringdelimiter - of Stringpublic S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme, java.lang.String bucketName, java.util.function.Predicate<java.lang.String> filter)
scheme - of SchemebucketName - of Stringfilter - of Predicatepublic S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme, java.lang.String bucketName, java.lang.String key, java.util.function.Predicate<java.lang.String> filter)
scheme - of SchemebucketName - of Stringkey - of Stringfilter - of Predicatepublic S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme, java.lang.String bucketName, java.lang.String key, java.lang.String delimiter, java.util.function.Predicate<java.lang.String> filter)
scheme - of SchemebucketName - of Stringkey - of Stringdelimiter - of Stringfilter - of Predicatepublic S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme, com.amazonaws.services.s3.AmazonS3 s3Client, java.lang.String bucketName)
scheme - of Schemes3Client - of AmazonS3bucketName - of Stringpublic S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme, com.amazonaws.services.s3.AmazonS3 s3Client, java.lang.String bucketName, java.lang.String key)
scheme - of Schemes3Client - of AmazonS3bucketName - of Stringkey - of Stringpublic S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme, com.amazonaws.services.s3.AmazonS3 s3Client, java.lang.String bucketName, java.lang.String key, java.lang.String delimiter)
scheme - of Schemes3Client - of AmazonS3bucketName - of Stringkey - of Stringdelimiter - of Stringpublic S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme, com.amazonaws.services.s3.AmazonS3 s3Client, java.lang.String bucketName, java.lang.String key, java.lang.String delimiter, java.util.function.Predicate<java.lang.String> filter)
scheme - of Schemes3Client - of AmazonS3bucketName - of Stringkey - of Stringdelimiter - of Stringfilter - of Predicatepublic S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme, S3Checkpointer checkpointer, java.lang.String bucketName)
scheme - of Schemecheckpointer - of S3CheckpointerbucketName - of Stringpublic S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme, S3Checkpointer checkpointer, java.lang.String bucketName, java.lang.String key)
scheme - of Schemecheckpointer - of S3CheckpointerbucketName - of Stringkey - of Stringpublic S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme, S3Checkpointer checkpointer, java.lang.String bucketName, java.lang.String key, java.lang.String delimiter)
scheme - of Schemecheckpointer - of S3CheckpointerbucketName - of Stringkey - of Stringdelimiter - of Stringpublic S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme, S3Checkpointer checkpointer, java.lang.String bucketName, java.util.function.Predicate<java.lang.String> filter)
scheme - of Schemecheckpointer - of S3CheckpointerbucketName - of Stringfilter - of Predicatepublic S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme, S3Checkpointer checkpointer, java.lang.String bucketName, java.lang.String key, java.util.function.Predicate<java.lang.String> filter)
scheme - of Schemecheckpointer - of S3CheckpointerbucketName - of Stringkey - of Stringfilter - of Predicatepublic S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme, S3Checkpointer checkpointer, java.lang.String bucketName, java.lang.String key, java.lang.String delimiter, java.util.function.Predicate<java.lang.String> filter)
scheme - of Schemecheckpointer - of S3CheckpointerbucketName - of Stringkey - of Stringdelimiter - of Stringfilter - of Predicatepublic S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme, com.amazonaws.services.s3.AmazonS3 s3Client, S3Checkpointer checkpointer, java.lang.String bucketName)
scheme - of Schemes3Client - of AmazonS3checkpointer - of S3CheckpointerbucketName - of Stringpublic S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme, com.amazonaws.services.s3.AmazonS3 s3Client, S3Checkpointer checkpointer, java.lang.String bucketName, java.lang.String key)
scheme - of Schemes3Client - of AmazonS3checkpointer - of S3CheckpointerbucketName - of Stringkey - of Stringpublic S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme, com.amazonaws.services.s3.AmazonS3 s3Client, S3Checkpointer checkpointer, java.lang.String bucketName, java.lang.String key, java.lang.String delimiter)
scheme - of Schemes3Client - of AmazonS3checkpointer - of S3CheckpointerbucketName - of Stringkey - of Stringdelimiter - of Stringpublic S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme, com.amazonaws.services.s3.AmazonS3 s3Client, S3Checkpointer checkpointer, java.lang.String bucketName, java.lang.String key, java.lang.String delimiter, java.util.function.Predicate<java.lang.String> filter)
scheme - of Schemes3Client - of AmazonS3checkpointer - of S3CheckpointerbucketName - of Stringkey - of Stringdelimiter - of Stringfilter - of Predicatepublic S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme, java.lang.String bucketName, cascading.tap.SinkMode sinkMode)
scheme - of SchemebucketName - of Stringpublic S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme, java.lang.String bucketName, java.lang.String key, cascading.tap.SinkMode sinkMode)
scheme - of SchemebucketName - of Stringkey - of Stringpublic S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme, java.lang.String bucketName, java.lang.String key, java.lang.String delimiter, cascading.tap.SinkMode sinkMode)
scheme - of SchemebucketName - of Stringkey - of Stringdelimiter - of Stringpublic S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme, java.lang.String bucketName, java.util.function.Predicate<java.lang.String> filter, cascading.tap.SinkMode sinkMode)
scheme - of SchemebucketName - of Stringfilter - of Predicatepublic S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme, java.lang.String bucketName, java.lang.String key, java.util.function.Predicate<java.lang.String> filter, cascading.tap.SinkMode sinkMode)
scheme - of SchemebucketName - of Stringkey - of Stringfilter - of Predicatepublic S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme, java.lang.String bucketName, java.lang.String key, java.lang.String delimiter, java.util.function.Predicate<java.lang.String> filter, cascading.tap.SinkMode sinkMode)
scheme - of SchemebucketName - of Stringkey - of Stringdelimiter - of Stringfilter - of PredicatesinkMode - of SinkModepublic S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme, com.amazonaws.services.s3.AmazonS3 s3Client, java.lang.String bucketName, cascading.tap.SinkMode sinkMode)
scheme - of Schemes3Client - of AmazonS3bucketName - of StringsinkMode - of SinkModepublic S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme, com.amazonaws.services.s3.AmazonS3 s3Client, java.lang.String bucketName, java.lang.String key, cascading.tap.SinkMode sinkMode)
scheme - of Schemes3Client - of AmazonS3bucketName - of Stringkey - of StringsinkMode - of SinkModepublic S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme, com.amazonaws.services.s3.AmazonS3 s3Client, java.lang.String bucketName, java.lang.String key, java.lang.String delimiter, cascading.tap.SinkMode sinkMode)
scheme - of Schemes3Client - of AmazonS3bucketName - of Stringkey - of Stringdelimiter - of StringsinkMode - of SinkModepublic S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme, com.amazonaws.services.s3.AmazonS3 s3Client, java.lang.String bucketName, java.lang.String key, java.lang.String delimiter, java.util.function.Predicate<java.lang.String> filter, cascading.tap.SinkMode sinkMode)
scheme - of Schemes3Client - of AmazonS3bucketName - of Stringkey - of Stringdelimiter - of Stringfilter - of PredicatesinkMode - of SinkModepublic S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme, S3Checkpointer checkpointer, java.lang.String bucketName, cascading.tap.SinkMode sinkMode)
scheme - of Schemecheckpointer - of S3CheckpointerbucketName - of StringsinkMode - of SinkModepublic S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme, S3Checkpointer checkpointer, java.lang.String bucketName, java.lang.String key, cascading.tap.SinkMode sinkMode)
scheme - of Schemecheckpointer - of S3CheckpointerbucketName - of Stringkey - of StringsinkMode - of SinkModepublic S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme, S3Checkpointer checkpointer, java.lang.String bucketName, java.lang.String key, java.lang.String delimiter, cascading.tap.SinkMode sinkMode)
scheme - of Schemecheckpointer - of S3CheckpointerbucketName - of Stringkey - of Stringdelimiter - of StringsinkMode - of SinkModepublic S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme, S3Checkpointer checkpointer, java.lang.String bucketName, java.util.function.Predicate<java.lang.String> filter, cascading.tap.SinkMode sinkMode)
scheme - of Schemecheckpointer - of S3CheckpointerbucketName - of Stringfilter - of PredicatesinkMode - of SinkModepublic S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme, S3Checkpointer checkpointer, java.lang.String bucketName, java.lang.String key, java.util.function.Predicate<java.lang.String> filter, cascading.tap.SinkMode sinkMode)
scheme - of Schemecheckpointer - of S3CheckpointerbucketName - of Stringkey - of Stringfilter - of PredicatesinkMode - of SinkModepublic S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme, S3Checkpointer checkpointer, java.lang.String bucketName, java.lang.String key, java.lang.String delimiter, java.util.function.Predicate<java.lang.String> filter, cascading.tap.SinkMode sinkMode)
scheme - of Schemecheckpointer - of S3CheckpointerbucketName - of Stringkey - of Stringdelimiter - of Stringfilter - of PredicatesinkMode - of SinkModepublic S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme, com.amazonaws.services.s3.AmazonS3 s3Client, S3Checkpointer checkpointer, java.lang.String bucketName, cascading.tap.SinkMode sinkMode)
scheme - of Schemes3Client - of AmazonS3checkpointer - of S3CheckpointerbucketName - of StringsinkMode - of SinkModepublic S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme, com.amazonaws.services.s3.AmazonS3 s3Client, S3Checkpointer checkpointer, java.lang.String bucketName, java.lang.String key, cascading.tap.SinkMode sinkMode)
scheme - of Schemes3Client - of AmazonS3checkpointer - of S3CheckpointerbucketName - of Stringkey - of StringsinkMode - of SinkModepublic S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme, com.amazonaws.services.s3.AmazonS3 s3Client, S3Checkpointer checkpointer, java.lang.String bucketName, java.lang.String key, java.lang.String delimiter, cascading.tap.SinkMode sinkMode)
scheme - of Schemes3Client - of AmazonS3checkpointer - of S3CheckpointerbucketName - of Stringkey - of Stringdelimiter - of StringsinkMode - of SinkModepublic S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme, com.amazonaws.services.s3.AmazonS3 s3Client, S3Checkpointer checkpointer, java.lang.String bucketName, java.lang.String key, java.lang.String delimiter, java.util.function.Predicate<java.lang.String> filter, cascading.tap.SinkMode sinkMode)
scheme - of Schemes3Client - of AmazonS3checkpointer - of S3CheckpointerbucketName - of Stringkey - of Stringdelimiter - of Stringfilter - of PredicatesinkMode - of SinkModepublic S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme, java.net.URI identifier)
scheme - of Schemeidentifier - of URIpublic S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme, com.amazonaws.services.s3.AmazonS3 s3Client, java.net.URI identifier)
scheme - of Schemes3Client - of AmazonS3identifier - of URIpublic S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme, S3Checkpointer checkpointer, java.net.URI identifier)
scheme - of Schemecheckpointer - of S3Checkpointeridentifier - of URIpublic S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme, com.amazonaws.services.s3.AmazonS3 s3Client, S3Checkpointer checkpointer, java.net.URI identifier)
scheme - of Schemes3Client - of AmazonS3checkpointer - of S3Checkpointeridentifier - of URIpublic S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme, java.net.URI identifier, cascading.tap.SinkMode sinkMode)
scheme - of Schemeidentifier - of URIsinkMode - of SinkModepublic S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme, com.amazonaws.services.s3.AmazonS3 s3Client, java.net.URI identifier, cascading.tap.SinkMode sinkMode)
scheme - of Schemes3Client - of AmazonS3identifier - of URIsinkMode - of SinkModepublic S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme, S3Checkpointer checkpointer, java.net.URI identifier, cascading.tap.SinkMode sinkMode)
scheme - of Schemecheckpointer - of S3Checkpointeridentifier - of URIsinkMode - of SinkModepublic S3Tap(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme, com.amazonaws.services.s3.AmazonS3 s3Client, S3Checkpointer checkpointer, java.net.URI identifier, cascading.tap.SinkMode sinkMode)
scheme - of Schemes3Client - of AmazonS3checkpointer - of S3Checkpointeridentifier - of URIsinkMode - of SinkModepublic static java.net.URI makeURI(java.lang.String bucketName, java.lang.String keyPrefix)
bucketName - the S3 bucket namekeyPrefix - the S3 object key or key-prefixpublic static java.net.URI makeURI(java.lang.String bucketName, java.lang.String keyPrefix, java.lang.String glob)
bucketName - the S3 bucket namekeyPrefix - the S3 object key or key-prefixglob - the globbing pattern to apply to the keysprotected java.lang.String getBucketNameFor(java.net.URI identifier)
public cascading.tap.type.TapWith<java.util.Properties,java.io.InputStream,java.io.OutputStream> withScheme(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme)
withScheme in interface cascading.tap.type.TapWith<java.util.Properties,java.io.InputStream,java.io.OutputStream>public cascading.tap.type.TapWith<java.util.Properties,java.io.InputStream,java.io.OutputStream> withChildIdentifier(java.lang.String identifier)
withChildIdentifier in interface cascading.tap.type.TapWith<java.util.Properties,java.io.InputStream,java.io.OutputStream>protected cascading.tap.type.TapWith<java.util.Properties,java.io.InputStream,java.io.OutputStream> create(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme, com.amazonaws.services.s3.AmazonS3 s3Client, java.net.URI identifier, cascading.tap.SinkMode sinkMode)
public cascading.tap.type.TapWith<java.util.Properties,java.io.InputStream,java.io.OutputStream> withSinkMode(cascading.tap.SinkMode sinkMode)
withSinkMode in interface cascading.tap.type.TapWith<java.util.Properties,java.io.InputStream,java.io.OutputStream>protected cascading.tap.type.TapWith<java.util.Properties,java.io.InputStream,java.io.OutputStream> create(cascading.scheme.Scheme<java.util.Properties,java.io.InputStream,java.io.OutputStream,?,?> scheme, com.amazonaws.services.s3.AmazonS3 s3Client, java.lang.String bucketName, java.lang.String key, java.lang.String delimiter, java.util.function.Predicate<java.lang.String> filter, cascading.tap.SinkMode sinkMode)
protected java.lang.String cleanKey(java.net.URI identifier)
protected com.amazonaws.services.s3.AmazonS3 getS3Client(java.util.Properties properties)
public S3Checkpointer getCheckpointer()
public java.lang.String getBucketName()
public java.lang.String getKey()
protected java.lang.String getMarker()
protected void setLastMarker(java.lang.String marker)
protected void commitMarker()
public java.util.function.Predicate<java.lang.String> getFilter()
public java.lang.String getDelimiter()
public java.lang.String getIdentifier()
getIdentifier in class cascading.tap.Tap<java.util.Properties,java.io.InputStream,java.io.OutputStream>public java.lang.String getFullIdentifier(java.util.Properties conf)
getFullIdentifier in class cascading.tap.Tap<java.util.Properties,java.io.InputStream,java.io.OutputStream>public boolean deleteResource(java.util.Properties conf) throws java.io.IOException
deleteResource in class cascading.tap.Tap<java.util.Properties,java.io.InputStream,java.io.OutputStream>java.io.IOExceptionpublic boolean createResource(java.util.Properties conf) throws java.io.IOException
createResource in class cascading.tap.Tap<java.util.Properties,java.io.InputStream,java.io.OutputStream>java.io.IOExceptionprotected com.amazonaws.services.s3.model.ObjectMetadata getObjectMetadata(java.util.Properties conf)
public cascading.tuple.TupleEntryIterator openForRead(cascading.flow.FlowProcess<? extends java.util.Properties> flowProcess, java.io.InputStream input) throws java.io.IOException
openForRead in class cascading.tap.Tap<java.util.Properties,java.io.InputStream,java.io.OutputStream>java.io.IOExceptionpublic cascading.tuple.TupleEntryCollector openForWrite(cascading.flow.FlowProcess<? extends java.util.Properties> flowProcess, java.io.OutputStream outputStream) throws java.io.IOException
openForWrite in class cascading.tap.Tap<java.util.Properties,java.io.InputStream,java.io.OutputStream>java.io.IOExceptionprotected void handleResult(com.amazonaws.services.s3.transfer.Upload upload, com.amazonaws.services.s3.transfer.model.UploadResult uploadResult, java.lang.String loggableIdentifier)
protected java.io.InputStream openInputStream(com.google.common.io.ByteSource byteSource, java.lang.String loggableIdentifier)
protected com.amazonaws.services.s3.transfer.Upload createUpload(java.lang.String key, com.amazonaws.services.s3.transfer.TransferManager transferManager, com.amazonaws.services.s3.model.PutObjectRequest request)
protected java.lang.String resolveKey(cascading.flow.FlowProcess<? extends java.util.Properties> flowProcess, java.lang.String key)
public boolean resourceExists(java.util.Properties conf) throws java.io.IOException
resourceExists in class cascading.tap.Tap<java.util.Properties,java.io.InputStream,java.io.OutputStream>java.io.IOExceptionprotected com.amazonaws.services.s3.model.AmazonS3Exception handleException(com.amazonaws.services.s3.AmazonS3 s3Client, com.amazonaws.services.s3.model.AmazonS3Exception exception)
public long getModifiedTime(java.util.Properties conf) throws java.io.IOException
getModifiedTime in class cascading.tap.Tap<java.util.Properties,java.io.InputStream,java.io.OutputStream>java.io.IOExceptionpublic boolean isDirectory(cascading.flow.FlowProcess<? extends java.util.Properties> flowProcess) throws java.io.IOException
isDirectory in interface cascading.tap.type.FileType<java.util.Properties>java.io.IOExceptionpublic boolean isDirectory(java.util.Properties conf) throws java.io.IOException
isDirectory in interface cascading.tap.type.FileType<java.util.Properties>java.io.IOExceptionpublic java.lang.String[] getChildIdentifiers(cascading.flow.FlowProcess<? extends java.util.Properties> flowProcess) throws java.io.IOException
getChildIdentifiers in interface cascading.tap.type.FileType<java.util.Properties>java.io.IOExceptionpublic java.lang.String[] getChildIdentifiers(java.util.Properties conf) throws java.io.IOException
getChildIdentifiers in interface cascading.tap.type.FileType<java.util.Properties>java.io.IOExceptionpublic java.lang.String[] getChildIdentifiers(cascading.flow.FlowProcess<? extends java.util.Properties> flowProcess, int depth, boolean fullyQualified) throws java.io.IOException
getChildIdentifiers in interface cascading.tap.type.FileType<java.util.Properties>java.io.IOExceptionpublic java.lang.String[] getChildIdentifiers(java.util.Properties conf, int depth, boolean fullyQualified) throws java.io.IOException
getChildIdentifiers in interface cascading.tap.type.FileType<java.util.Properties>java.io.IOExceptionprotected java.lang.String makePath(java.util.Iterator<com.amazonaws.services.s3.model.S3ObjectSummary> iterator, boolean fullyQualified)
public long getSize(cascading.flow.FlowProcess<? extends java.util.Properties> flowProcess) throws java.io.IOException
getSize in interface cascading.tap.type.FileType<java.util.Properties>java.io.IOExceptionpublic long getSize(java.util.Properties conf) throws java.io.IOException
getSize in interface cascading.tap.type.FileType<java.util.Properties>java.io.IOExceptionprotected static java.lang.String makeStringIdentifier(java.lang.String bucketName, java.lang.String keyPrefix)
Copyright © 2007-2021 Cascading Maintainers. All Rights Reserved.