/* * Copyright (C) 2006-2016 DLR, Germany * * All rights reserved * * http://www.rcenvironment.de/ */ package de.rcenvironment.core.datamanagement; import java.io.IOException; import java.io.InputStream; import de.rcenvironment.core.datamanagement.commons.DataReference; import de.rcenvironment.core.datamanagement.commons.MetaDataSet; import de.rcenvironment.core.utils.common.rpc.RemotableService; import de.rcenvironment.core.utils.common.rpc.RemoteOperationException; /** * Interface for the RCE user data system for file support. * * @author Sandra Schroedter * @author Juergen Klein * @author Robert Mischke (chunked upload) */ @RemotableService public interface RemotableFileDataService { /** * Returns the InputStream of the given revision of dataReference. * * @param dataReference DataReference which contains the needed revision. * @param calledFromRemote <code>true</code> if this method is called from remote node, otherwise <code>false</code> * @return InputStream of the given revision * @throws RemoteOperationException standard remote operation exception */ InputStream getStreamFromDataReference(DataReference dataReference, Boolean calledFromRemote) throws RemoteOperationException; /** * Creates a new DataReference from the given inputStream on the Platform targetDataManagement. The new dataReference will contain the * given MetaData and reserved MetaData, that the DataInterface adds automatically. * * @param inputStream InputStream that shall be saved. * @param metaDataSet MetaDataSet that shall be saved. * @return DataReference for the given InputStream and MetaData. * @throws RemoteOperationException standard remote operation exception */ DataReference newReferenceFromStream(InputStream inputStream, MetaDataSet metaDataSet) throws RemoteOperationException; /** * Initializes an id/handle that subsequent {@link #appendToUpload(String, byte[])} calls can use to upload data. The normal use case is * that this method is called via RPC from the uploader's node. * * @return the generated upload id * @throws IOException if the upload could not be set up (for example, no disk space left at receiver) * @throws RemoteOperationException standard remote operation exception */ String initializeUpload() throws IOException, RemoteOperationException; /** * Appends a chunk of data to a virtual file identified by an upload id.The normal use case is that this method is called once or more * via RPC from the uploader's node. * * @param id the assigned upload id * @param data the byte array to append * @return the total number of bytes written so far * * @throws IOException on I/O errors on the receiver's side * @throws RemoteOperationException standard remote operation exception */ long appendToUpload(String id, byte[] data) throws IOException, RemoteOperationException; /** * Signals that all data has been written via {@link #appendToUpload(String, byte[])} and initiates the asynchronous conversion into a * {@link DataReference} with the given {@link MetaDataSet} attached. This conversion is performed asynchronously to avoid RPC timeouts * on large uploads. Use {@link #pollUploadForDataReference(String)} to fetch the generated {@link DataReference}. * * @param id the assigned upload id * @param metaDataSet the data management metadata to append to the {@link DataReference}; the behaviour is the same as * {@link #newReferenceFromStream(InputStream, MetaDataSet)} * @throws IOException on I/O errors on the receiver's side * @throws RemoteOperationException standard remote operation exception */ void finishUpload(String id, MetaDataSet metaDataSet) throws IOException, RemoteOperationException; /** * Attempt to fetch the generated {@link DataReference} for a given upload id. If the reference is not available yet, null is returned. * * TODO add {@link IOException} to signal a permanent conversion failure? - misc_ro * * @param id the assigned upload id * @return the generated {@link DataReference}, or null if it is not available yet * @throws IOException on asynchronous I/O errors on the receiver's side * @throws RemoteOperationException standard remote operation exception */ DataReference pollUploadForDataReference(String id) throws IOException, RemoteOperationException; /** * Perform an upload as a single synchronous operation. Is called via RPC from the uploader's node. Suitable for very small pieces of * data. * * @param data the byte array to append * @param metaDataSet the data management metadata to append to the {@link DataReference}; * @return the generated {@link DataReference} * @throws IOException IOException on I/O errors on the receiver's side * @throws RemoteOperationException standard remote operation exception * @throws RemoteOperationException standard remote operation exception */ DataReference uploadInSingleStep(byte[] data, MetaDataSet metaDataSet) throws IOException, RemoteOperationException; /** * Deletes a whole local {@link DataReference} with all {@link Revision}s. * * @param binaryReferenceKey Key of the binary reference that shall be deleted. * @throws RemoteOperationException standard remote operation exception */ void deleteReference(String binaryReferenceKey) throws RemoteOperationException; }