All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.apache.jackrabbit.api.JackrabbitValueFactory Maven / Gradle / Ivy

/*
 * 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.api;

import java.io.InputStream;
import javax.jcr.AccessDeniedException;
import javax.jcr.Binary;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.ValueFactory;

import org.apache.jackrabbit.api.binary.BinaryDownloadOptions;
import org.apache.jackrabbit.api.binary.BinaryUpload;
import org.apache.jackrabbit.api.binary.BinaryDownload;
import org.apache.jackrabbit.api.binary.BinaryUploadOptions;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.osgi.annotation.versioning.ProviderType;

/**
 * Defines optional functionality that a {@link ValueFactory} may choose to
 * provide. A {@link ValueFactory} may also implement this interface without
 * supporting all of the capabilities in this interface. Each method of the
 * interface describes the behavior of that method if the underlying capability
 * is not available.
 *
 * 

* This interface defines the following optional features: *

    *
  • * Direct Binary Access - enable a client to upload or download binaries * directly to/from a storage location *
  • *
* *

* The features are described in more detail below. * *

Direct Binary Access

* * The Direct Binary Access feature provides the capability for a client to * upload or download binaries directly to/from a storage location. For example, * this might be a cloud storage providing high-bandwidth direct network access. * This API allows for requests to be authenticated and for access permission * checks to take place within the repository, but for clients to then access * the storage location directly. * *

* The feature consists of two parts, download and upload. * *

Direct Binary Download

* * This feature enables remote clients to download binaries directly from a * storage location without streaming the binary through the Jackrabbit-based * application. * *

* For an existing {@link Binary} value that implements {@link BinaryDownload}, * a read-only URI (see {@link BinaryDownload#getURI(BinaryDownloadOptions)}) * can be retrieved and passed to a remote client, such as a browser. * *

Direct Binary Upload

* * This feature enables remote clients to upload binaries directly to a storage * location. * *

* Note: When adding binaries already present on the same JVM/server as * the JCR repository, for example because they were generated locally, please * use the regular JCR API {@link ValueFactory#createBinary(InputStream)} * instead. This feature is solely designed for remote clients. * *

* The direct binary upload process is split into 3 phases: *

    *
  1. * Initialize: A remote client makes request to the * Jackrabbit-based application to request an upload, which calls {@link * #initiateBinaryUpload(long, int)} and returns the resulting {@link * BinaryUpload instructions} to the remote client. A client may * optionally choose to provide a {@link BinaryUploadOptions} via * {@link #initiateBinaryUpload(long, int, BinaryUploadOptions)} if * additional options must be specified. *
  2. *
  3. * Upload: The remote client performs the actual binary upload * directly to the binary storage provider. The {@link BinaryUpload} * returned from the previous call to {@link * #initiateBinaryUpload(long, int)} contains detailed instructions on * how to complete the upload successfully. *
  4. *
  5. * Complete: The remote client notifies the Jackrabbit-based * application that step 2 is complete. The upload token returned in * the first step (obtained by calling {@link * BinaryUpload#getUploadToken()} is passed by the application to {@link * #completeBinaryUpload(String)}. This will provide the application * with a regular {@link Binary JCR Binary} that can then be used to * write JCR content including the binary (such as an nt:file structure) * and persist it using {@link Session#save}. *
  6. *
*/ @ProviderType public interface JackrabbitValueFactory extends ValueFactory { /** * Initiate a transaction to upload a binary directly to a storage * location and return {@link BinaryUpload} instructions for a remote client. * Returns {@code null} if the feature is not available. * *

* {@link IllegalArgumentException} will be thrown if an upload * cannot be supported for the required parameters, or if the parameters are * otherwise invalid. Each service provider has specific limitations. * * @param maxSize The exact size of the binary to be uploaded or the * estimated maximum size if the exact size is unknown. * If the estimation was too small, the transaction * should be restarted by invoking this method again * using the correct size. * @param maxURIs The maximum number of upload URIs that the client can * accept, for example due to message size limitations. * A value of -1 indicates no limit. * Upon a successful return, it is ensured that an upload * of {@code maxSize} can be completed by splitting the * binary into {@code maxURIs} parts, otherwise * {@link IllegalArgumentException} will be thrown. * * @return A {@link BinaryUpload} providing the upload instructions, * or {@code null} if the implementation does not support the direct * upload feature. * * @throws IllegalArgumentException if the provided arguments are * invalid or if an upload cannot be completed given the * provided arguments. For example, if the value of {@code maxSize} * exceeds the size limits for a single binary upload for the * implementation or the service provider, or if the value of * {@code maxSize} divided by {@code maxParts} exceeds the size * limit for an upload or upload part. * * @throws AccessDeniedException if the session has insufficient * permission to perform the upload. */ @Nullable BinaryUpload initiateBinaryUpload(long maxSize, int maxURIs) throws IllegalArgumentException, AccessDeniedException; /** * Initiate a transaction to upload a binary directly to a storage * location and return {@link BinaryUpload} instructions for a remote client. * Returns {@code null} if the feature is not available. * *

* {@link IllegalArgumentException} will be thrown if an upload * cannot be supported for the required parameters, or if the parameters are * otherwise invalid. Each service provider has specific limitations. * * @param maxSize The exact size of the binary to be uploaded or the * estimated maximum size if the exact size is unknown. * If the estimation was too small, the transaction * should be restarted by invoking this method again * using the correct size. * @param maxURIs The maximum number of upload URIs that the client can * accept, for example due to message size limitations. * A value of -1 indicates no limit. * Upon a successful return, it is ensured that an upload * of {@code maxSize} can be completed by splitting the * binary into {@code maxURIs} parts, otherwise * {@link IllegalArgumentException} will be thrown. * @param options A {@link BinaryUploadOptions} instance containing any * options for this call. * * @return A {@link BinaryUpload} providing the upload instructions, * or {@code null} if the implementation does not support the direct * upload feature. * * @throws IllegalArgumentException if the provided arguments are * invalid or if an upload cannot be completed given the * provided arguments. For example, if the value of {@code maxSize} * exceeds the size limits for a single binary upload for the * implementation or the service provider, or if the value of * {@code maxSize} divided by {@code maxParts} exceeds the size * limit for an upload or upload part. * * @throws AccessDeniedException if the session has insufficient * permission to perform the upload. */ @Nullable BinaryUpload initiateBinaryUpload(long maxSize, int maxURIs, BinaryUploadOptions options) throws IllegalArgumentException, AccessDeniedException; /** * Complete the transaction of uploading a binary directly to a storage * location and return a {@link Binary} to set as value for a binary * JCR property. The binary is not automatically associated with * any location in the JCR. * *

* The client must provide a valid upload token, obtained from * {@link BinaryUpload#getUploadToken()} when this transaction was initialized * using {@link #initiateBinaryUpload(long, int)}. * If the {@code uploadToken} is unreadable or invalid, * an {@link IllegalArgumentException} will be thrown. * * This method is idempotent. Calling the method more than one time with the * same upload token must not cause an existing binary to be modified; thus * if a prior call with this upload token succeeded in creating the binary, * subsequent calls with the same upload token have no effect on the binary. * This method should always return the binary that was uploaded with this * upload token, even in subsequent calls with the same upload token * (in other words, calling this method twice with the same upload token * results in the same binary being returned both times). * * @param uploadToken A String identifying the upload transaction. * * @return The uploaded {@link Binary}, or {@code null} if the * implementation does not support the direct upload feature. * * @throws IllegalArgumentException if the {@code uploadToken} is invalid or * does not identify a known binary upload. * @throws RepositoryException if another error occurs. */ @Nullable Binary completeBinaryUpload(@NotNull String uploadToken) throws IllegalArgumentException, RepositoryException; }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy