/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.core.communication.file.service.legacy.internal;
import java.io.IOException;
import java.io.InputStream;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import de.rcenvironment.core.communication.common.CommunicationException;
import de.rcenvironment.core.communication.file.service.legacy.api.RemotableFileStreamAccessService;
import de.rcenvironment.core.communication.fileaccess.api.RemoteFileConnection.FileType;
import de.rcenvironment.core.datamanagement.FileDataService;
import de.rcenvironment.core.datamanagement.backend.MetaDataBackendService;
import de.rcenvironment.core.utils.common.StringUtils;
import de.rcenvironment.core.utils.common.security.AllowRemoteAccess;
import de.rcenvironment.core.utils.incubator.Assertions;
/**
*
* Implementation of the {@link RemotableFileStreamAccessService}.
*
* @author Doreen Seider
* @author Robert Mischke (adapted for 7.0.0)
*/
@Deprecated
public class RemotableFileStreamAccessServiceImpl implements RemotableFileStreamAccessService {
private static final String PARAMETER_UUID = "uuid";
private static final String ERROR_INPUT_STREAM_NOT_FOUND = "The input stream could not be found: ";
private static final String ERROR_PARAMETERS_NULL = "The parameter \"%s\" must not be null.";
private static final Log LOGGER = LogFactory.getLog(RemotableFileStreamAccessServiceImpl.class);
/**
* The {@link Map} to store the open {@link InputStream} objects.
*/
private static Map<String, InputStream> inputStreamMap = Collections.synchronizedMap(new HashMap<String, InputStream>());
private FileDataService dataService;
private MetaDataBackendService metaDataBackendService;
protected void bindMetadataBackendService(MetaDataBackendService newService) {
metaDataBackendService = newService;
}
protected void bindFileDataService(FileDataService newFileDataService) {
dataService = newFileDataService;
}
@Override
@AllowRemoteAccess
public void close(String uuid) throws IOException {
Assertions.isDefined(uuid, StringUtils.format(ERROR_PARAMETERS_NULL, PARAMETER_UUID));
if (inputStreamMap.containsKey(uuid)) {
inputStreamMap.get(uuid).close();
inputStreamMap.remove(uuid);
}
}
@Override
@AllowRemoteAccess
public String open(FileType type, String uri) throws IOException {
Assertions.isDefined(type, StringUtils.format(ERROR_PARAMETERS_NULL, "type"));
Assertions.isDefined(uri, StringUtils.format(ERROR_PARAMETERS_NULL, "uri"));
LOGGER.debug("Received request for file: " + uri);
String uuid = UUID.randomUUID().toString();
if (type == FileType.RCE_DM) {
InputStream inputStream;
try {
inputStream = dataService.getStreamFromDataReference(
metaDataBackendService.getDataReference(uri));
} catch (CommunicationException e) {
throw new RuntimeException(StringUtils.format("Failed to get data reference from %s: ", uri), e.getCause());
}
if (inputStream == null) {
throw new IOException("The file could not be found in the RCE data management: " + uri);
}
inputStreamMap.put(uuid, inputStream);
} else {
throw new IOException("Only the RCE data management and the file system are supported.");
}
return uuid;
}
@Override
public int read(String uuid) throws IOException {
Assertions.isDefined(uuid, StringUtils.format(ERROR_PARAMETERS_NULL, PARAMETER_UUID));
InputStream inputStream = inputStreamMap.get(uuid);
if (inputStream == null) {
throw new IOException(ERROR_INPUT_STREAM_NOT_FOUND + uuid);
} else {
return inputStream.read();
}
}
@Override
@AllowRemoteAccess
public byte[] read(String uuid, Integer len) throws IOException {
Assertions.isDefined(uuid, StringUtils.format(ERROR_PARAMETERS_NULL, PARAMETER_UUID));
Assertions.isDefined(len, StringUtils.format(ERROR_PARAMETERS_NULL, "len"));
InputStream inputStream = inputStreamMap.get(uuid);
if (inputStream == null) {
throw new IOException(ERROR_INPUT_STREAM_NOT_FOUND + uuid);
} else {
byte[] buffer = new byte[len];
int nRead = inputStream.read(buffer, 0, len);
if (nRead == len) {
return buffer;
} else if (nRead < 0) {
// FIXME: must not be closed here. remove if side effects are known and handle them if needed -seid_do
inputStream.close();
inputStreamMap.remove(uuid);
return new byte[0];
} else {
byte[] resultBuffer = new byte[nRead];
System.arraycopy(buffer, 0, resultBuffer, 0, nRead);
return resultBuffer;
}
}
}
@Override
public long skip(String uuid, Long n) throws IOException {
Assertions.isDefined(uuid, StringUtils.format(ERROR_PARAMETERS_NULL, PARAMETER_UUID));
Assertions.isDefined(n, StringUtils.format(ERROR_PARAMETERS_NULL, "n"));
InputStream inputStream = inputStreamMap.get(uuid);
if (inputStream == null) {
throw new IOException(ERROR_INPUT_STREAM_NOT_FOUND + uuid);
} else {
return inputStream.skip(n.longValue());
}
}
}