/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.core.component.datamanagement.stateful;
import java.io.File;
import java.io.IOException;
import java.io.Serializable;
import java.util.Collection;
import de.rcenvironment.core.communication.common.InstanceNodeSessionId;
import de.rcenvironment.core.communication.common.ResolvableNodeId;
import de.rcenvironment.core.component.datamanagement.api.ComponentDataManagementService;
import de.rcenvironment.core.datamanagement.commons.MetaDataKeys;
import de.rcenvironment.core.datamodel.types.api.DirectoryReferenceTD;
import de.rcenvironment.core.datamodel.types.api.FileReferenceTD;
/**
* A stateful version of {@link ComponentDataManagementService}. Implementations will usually store
* a relevant {@link ComponentInstanceInformation} internally.
*
* This interface allows clients to use implementations like
* {@link SimpleComponentDataManagementService} and also pass them as parameters, while still
* allowing replacement with mock objects for test runs or integration tests.
*
* @author Robert Mischke
*/
public interface StatefulComponentDataManagementService {
/**
* Creates a reference from a local file and automatically sets component-related metadata.
*
* The following {@link MetaDataKeys} are automatically filled in:
* <ul>
* <li>COMPONENT_CONTEXT_UUID</li>
* <li>COMPONENT_CONTEXT_NAME</li>
* <li>COMPONENT_UUID</li>
* <li>COMPONENT_NAME</li>
* <li>FILENAME (if the "filename" parameter is not null; see below)</li>
* </ul>
*
* TODO add parameter for automatic/custom/empty associated filename?
*
* TODO add revision parameter?
*
* TODO add parameter to add custom metadata?
*
* @param file the local file
* @param filename either a custom filename to attach to the reference, or the constant
* {@link ComponentDataManagementService#SAME_FILENAME} to use the filename of the local
* file, or "null" to attach no filename
* @return the created reference
* @throws IOException on a local I/O or data management error
*
*/
String createTaggedReferenceFromLocalFile(File file, String filename) throws IOException;
/**
*
* @param object the object
* @return the created reference
* @throws IOException on a local I/O or data management error
*/
String createTaggedReferenceFromString(String object) throws IOException;
/**
* Copies the data "body" identified by a data management reference to a local file.
*
* @param reference the reference
* @param targetFile the local file to write to
* @param platforms The platforms to try to fetch data from
* @throws IOException on a local I/O or data management error
*/
void copyReferenceToLocalFile(String reference, File targetFile, Collection<ResolvableNodeId> platforms) throws IOException;
/**
* Copies the data "body" identified by a data management reference to a local file.
*
* @param reference the reference
* @param targetFile the local file to write to
* @param platform platform the data is stored
* @throws IOException on a local I/O or data management error
*/
void copyReferenceToLocalFile(String reference, File targetFile, ResolvableNodeId platform) throws IOException;
/**
* Retrieved the String "body" identified by a data management reference.
*
* @param reference the reference
* @param nodeId The node to try to fetch data from
* @return the retrieved String
* @throws IOException on a local I/O or data management error
*/
String retrieveStringFromReference(String reference, InstanceNodeSessionId nodeId) throws IOException;
/**
* Creates a "history" point in the data management with appropriate metadata entries.
*
* @param historyData the {@link Serializable} object that represents the history entry; is
* decoded by an appropriate subtree builder (see
* de.rcenvironment.rce.gui.datamanagement.browser.spi package for details)
* @param userInfoText a user description for this history entry; used as title for GUI entries
* representing this history entry
* @throws IOException on a data management error
*/
void addHistoryDataPoint(Serializable historyData, String userInfoText) throws IOException;
/**
* Creates {@link FileReferenceTD} object from given file by creating a new data management
* reference.
*
* @param file given file
* @param filename name of file
* @return {@link FileReferenceTD}
* @throws IOException if given file doesn't exist or on data management error
*/
FileReferenceTD createFileReferenceTDFromLocalFile(File file, String filename) throws IOException;
/**
* Creates {@link DirectoryReferenceTD} object from given directory by creating a new data
* management reference.
*
* @param dir given directory
* @param dirname name of directory
* @return {@link DirectoryReferenceTD}
* @throws IOException if given directory doesn't exist, is no directory, or on data management
* error
*/
DirectoryReferenceTD createDirectoryReferenceTDFromLocalDirectory(File dir, String dirname) throws IOException;
/**
* Retrieves a file from the data management referred by the given {@link FileReferenceTD}.
*
* @param fileReference {@link FileReferenceTD}
* @param targetFile local target file
* @param node source {@link InstanceNodeSessionId}
* @throws IOException on a local I/O or data management error
*/
void copyFileReferenceTDToLocalFile(FileReferenceTD fileReference, File targetFile, InstanceNodeSessionId node) throws IOException;
/**
* Retrieves a directory from the data management referred by the given
* {@link DirectoryReferenceTD}.
*
* @param dirReference {@link DirectoryReferenceTD}
* @param targetDir local target directory
* @param node source {@link InstanceNodeSessionId}
* @throws IOException on a local I/O or data management error
*/
void copyDirectoryReferenceTDToLocalDirectory(DirectoryReferenceTD dirReference, File targetDir, InstanceNodeSessionId node)
throws IOException;
}