/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.core.datamanagement;
import java.io.File;
import java.io.IOException;
import java.util.Collection;
import de.rcenvironment.core.authorization.AuthorizationException;
import de.rcenvironment.core.communication.common.CommunicationException;
import de.rcenvironment.core.communication.common.ResolvableNodeId;
import de.rcenvironment.core.datamanagement.commons.MetaDataSet;
/**
* A data management API that provides more higher-level operations than the existing interfaces (like {@link RemotableFileDataService} or
* {@link RemotableMetaDataService}). Another difference is that, by default, UUIDs are passed as Strings instead of java UUID objects. This
* relaxes the assumptions about what is used as a data reference, which simplifies mocking scenarios (for example, by using path
* representations of temporary files as data references).
*
* @author Robert Mischke
* @author Doreen Seider
*/
public interface DataManagementService {
// TODO adapt Checkstyle to not complain if a javadoc @link is set to MetaDataKeys.Managed
/**
* Creates a new data management entry with the contents of the given file and returns a new and unique String id for it. For this new
* data management entry, the common managed metadata values are set automatically; additional metadata can be provided in an optional
* {@link MetaDataSet}. See [MetaDataKeys.Managed] for a list of the managed entries.
*
* Note that the name of the local file is not automatically added to the metadata of the new entry. If this is desired, create an
* appropriate entry in the {@link MetaDataSet} passed to this method.
*
* @param file the local file
* @param additionalMetaData additional metadata key/value pairs to add to the automatically generated metadata; can be null if not
* required
* @param nodeId the identifier of the platform to create the data management entry on; if null, the local platform is used
* @return the unique String reference to the created data management entry; its internal format is implementation-dependent
* @throws IOException on I/O errors in the data management, or related to the given file
* @throws AuthorizationException if the user or the extension has no create permission (copied from {@link RemotableFileDataService})
* @throws InterruptedException on thread interruption
* @throws CommunicationException in case of communication error
*/
String createReferenceFromLocalFile(File file, MetaDataSet additionalMetaData, // CheckStyle
ResolvableNodeId nodeId) throws IOException, AuthorizationException, InterruptedException, CommunicationException;
/**
* Creates a new data management entry with the utf-8 byte array form of the given String and returns a new and unique String id for it.
* For this new data management entry, the common managed metadata values are set automatically; additional metadata can be provided in
* an optional {@link MetaDataSet}. See [MetaDataKeys.Managed] for a list of the managed entries.
*
* @param object the object to serialize
* @param additionalMetaData additional metadata key/value pairs to add to the automatically generated metadata; can be null if not
* required
* @param nodeId the identifier of the platform to create the data management entry on; if null, the local platform is used
* @return the unique String reference to the created data management entry; its internal format is implementation-dependent
* @throws IOException on I/O errors in the data management, or related to the given file
* @throws AuthorizationException if the user or the extension has no create permission (copied from {@link RemotableFileDataService})
* @throws InterruptedException on thread interruption
* @throws CommunicationException in case of communication error
*/
String createReferenceFromString(String object, MetaDataSet additionalMetaData, // CheckStyle
ResolvableNodeId nodeId) throws IOException, AuthorizationException, InterruptedException, CommunicationException;
/**
* Creates a new data management entry with the contents of the given directory and returns a new and unique String id for it. For this
* new data management entry, the common managed metadata values are set automatically; additional metadata can be provided in an
* optional {@link MetaDataSet}. See [MetaDataKeys.Managed] for a list of the managed entries.
*
* Note that the name of the local directory is not automatically added to the metadata of the new entry. If this is desired, create an
* appropriate entry in the {@link MetaDataSet} passed to this method.
*
* @param dir the local directory
* @param additionalMetaData additional metadata key/value pairs to add to the automatically generated metadata; can be null if not
* required
* @param nodeId the identifier of the platform to create the data management entry on; if null, the local platform is used
* @return the unique String reference to the created data management entry; its internal format is implementation-dependent
* @throws IOException on I/O errors in the data management, or related to the given directory
* @throws AuthorizationException if the user or the extension has no create permission (copied from {@link RemotableFileDataService})
* @throws InterruptedException on thread interruption
* @throws CommunicationException in case of communication error
*/
String createReferenceFromLocalDirectory(File dir, MetaDataSet additionalMetaData, // CheckStyle
ResolvableNodeId nodeId) throws IOException, AuthorizationException, InterruptedException, CommunicationException;
/**
* Writes the data referenced by the given string id stored on a given platform to a local file.
*
* @param reference the String id referencing a data management entry, as created, for example, by
* {@link #createReferenceFromLocalFile(File, MetaDataSet, ResolvableNodeId)} ; its internal format is implementation-dependent
* @param targetFile the local file to copy the referenced data to
* @param nodeId platform where the data is stored
* @throws IOException on I/O errors in the data management, or related to the given file
* @throws CommunicationException in case of communication error
*/
void copyReferenceToLocalFile(String reference, File targetFile, // CheckStyle
ResolvableNodeId nodeId) throws IOException, CommunicationException;
/**
* Writes the data referenced by the given string id stored on a given platform to a local file.
*
* @param reference the String id referencing a data management entry, as created, for example, by
* {@link #createReferenceFromLocalFile(File, MetaDataSet, ResolvableNodeId)} ; its internal format is implementation-dependent
* @param targetFile the local file to copy the referenced data to
* @param platforms platforms where the data is queried
* @throws IOException on I/O errors in the data management, or related to the given file
* @throws CommunicationException in case of communication error
*/
void copyReferenceToLocalFile(String reference, File targetFile, // CheckStyle
Collection<? extends ResolvableNodeId> platforms) throws IOException, CommunicationException;
/**
* Retrieves a directory from the data management referred by the given {@link DirectoryReferenceTD}.
*
* @param reference the String id referencing a data management entry, as created, for example, by
* {@link #createReferenceFromLocalFile(File, MetaDataSet, ResolvableNodeId)} ; its internal format is implementation-dependent
* @param targetDir local target directory
* @param node source {@link ResolvableNodeId}
* @throws IOException on a local I/O or data management error
* @throws CommunicationException in case of communication error
*/
void copyReferenceToLocalDirectory(String reference, File targetDir, ResolvableNodeId node)
throws IOException, CommunicationException;
/**
* Retrieves the String referenced by the given string id.
*
* @param reference the String id referencing a data management entry, as created, for example, by
* {@link #createReferenceFromString(String, MetaDataSet, ResolvableNodeId)}; its internal format is implementation-dependent
* @param nodeId {@link ResolvableNodeId} to try to fetch data from
* @return the retrieved String
* @throws IOException on I/O errors in the data management, or related to the given file
* @throws CommunicationException in case of communication error
*/
String retrieveStringFromReference(String reference, ResolvableNodeId nodeId) throws IOException,
CommunicationException;
}