blob: 8edb6527d1665336ec8713b9ac34c7b560e7e4c7 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License 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 org.apache.jackrabbit.oak.api.blob;
import java.net.URI;
import org.apache.jackrabbit.oak.api.Blob;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.osgi.annotation.versioning.ProviderType;
/**
* Extension interface applied to a class that indicates that the class
* implements the direct upload and direct download feature for {@link Blob}s.
*/
@ProviderType
public interface BlobAccessProvider {
/**
* Begin a transaction to perform a direct blob upload to a storage
* location. This method will throw {@link IllegalArgumentException} if no
* valid upload can be arranged with the arguments specified. E.g. the max
* upload size specified divided by the number of URIs requested indicates
* the minimum size of each upload. If that size exceeds the maximum upload
* size supported by the service provider, {@link IllegalArgumentException}
* is thrown.
* <p>
* Each service provider has specific limitations with regard to maximum
* upload sizes, maximum overall blob sizes, numbers of URIs in multi-part
* uploads, etc. which can lead to {@link IllegalArgumentException} being
* thrown. You should consult the documentation for your specific service
* provider for details.
* <p>
* Beyond service provider limitations, the implementation may also choose
* to enforce its own limitations and may throw this exception based on
* those limitations. Configuration may also be used to set limitations so
* this exception may be thrown when configuration parameters are exceeded.
*
* @param maxUploadSizeInBytes the largest size of the blob to be
* uploaded, in bytes, based on the caller's best guess. If the
* actual size of the file to be uploaded is known, that value
* should be used.
* @param maxNumberOfURIs the maximum number of URIs the client is able to
* accept. If the client does not support multi-part uploading, this
* value should be 1. Note that the implementing class is not
* required to support multi-part uploading so it may return only a
* single upload URI regardless of the value passed in for this
* parameter. If the client is able to accept any number of URIs, a
* value of -1 may be passed in to indicate that the implementation
* is free to return as many URIs as it desires.
* @return A {@link BlobUpload} referencing this direct upload, or
* {@code null} if the underlying implementation doesn't support
* direct uploading.
* @throws IllegalArgumentException if {@code maxUploadSizeInBytes} is not
* a positive value, or if {@code maxNumberOfURIs} is not either a
* positive value or -1, or if the upload cannot be completed as
* requested, due to a mismatch between the request parameters and
* the capabilities of the service provider or the implementation.
*/
@Nullable
BlobUpload initiateBlobUpload(long maxUploadSizeInBytes,
int maxNumberOfURIs)
throws IllegalArgumentException;
/**
* Complete a transaction for uploading a blob to a storage location via
* direct blob upload.
* <p>
* This requires an {@code uploadToken} that can be obtained from the
* returned {@link BlobUpload} from a previous call to {@link
* #initiateBlobUpload(long, int)}. This token is required to complete
* the transaction for an upload to be valid and complete. The token
* includes encoded data about the transaction and may include a signature
* that will be verified by the implementation.
*
* @param uploadToken the upload token from a {@link BlobUpload} object
* returned from a previous call to {@link
* #initiateBlobUpload(long, int)}.
* @return The {@link Blob} that was created, or {@code null} if the object
* could not be created.
* @throws IllegalArgumentException if the {@code uploadToken} is null,
* empty, or cannot be parsed or is otherwise invalid, e.g. if the
* included signature does not match.
*/
@Nullable
Blob completeBlobUpload(@NotNull String uploadToken)
throws IllegalArgumentException;
/**
* Obtain a download URI for a {@link Blob}. This is usually a signed URI
* that can be used to directly download the blob corresponding to the
* provided {@link Blob}.
* <p>
* A caller must specify a {@link BlobDownloadOptions} instance. The
* implementation will attempt to apply the specified {@code
* downloadOptions} to the subsequent download. For example, if the caller
* knows that the URI refers to a specific type of content, the caller can
* specify that content type by setting it in the {@code downloadOptions}.
* The caller may also use a default instance obtained via {@link
* BlobDownloadOptions#DEFAULT} in which case the caller is indicating that
* the default behavior of the service provider is acceptable.
*
* @param blob The {@link Blob} to be downloaded.
* @param downloadOptions A {@link BlobDownloadOptions} instance that
* specifies any download options to be used for the download URI.
* @return A URI to download the blob directly or {@code null} if the blob
* cannot be downloaded directly.
*/
@Nullable
URI getDownloadURI(@NotNull Blob blob,
@NotNull BlobDownloadOptions downloadOptions);
}