/* * Copyright (C) 2006-2016 DLR, Germany * * All rights reserved * * http://www.rcenvironment.de/ */ package de.rcenvironment.core.communication.fileaccess.api; import java.io.IOException; import java.io.InputStream; import java.io.Serializable; import java.net.URI; import de.rcenvironment.core.communication.common.CommunicationException; import de.rcenvironment.core.communication.fileaccess.internal.RemoteFileConnectionSupport; import de.rcenvironment.core.utils.common.StringUtils; import de.rcenvironment.core.utils.incubator.Assertions; /** * This class provides access to remote file by using a specified {@link RemoteFileConnection} * implementation got from the supportive class {@link RemoteFileConnectionSupport}. * * This class is not meant to be thread safe! * * @author Heinrich Wendel * @author Doreen Seider */ public class RemoteInputStream extends InputStream implements Serializable { private static final long serialVersionUID = 8592687526532347895L; private static final String ERROR_PARAMETERS_NULL = "The parameter \"%s\" must not be null."; private static final String REMOTE_STREAMS_SHOULD_NOT_CALL_THIS_METHOD = "Remote streams should not call this method"; private final RemoteFileConnection remoteFileConnection; /** * Creates a new {@link RemoteInputStream} of a remote file. * * @param uri URI pointing to remote file. (rce://host:platformNo/dataReferenceUUID/revision or * file://host:platformNo/absolutePathToFile) * @throws IOException if the file could not be accessed remotely. */ public RemoteInputStream(URI uri) throws IOException { Assertions.isDefined(uri, StringUtils.format(ERROR_PARAMETERS_NULL, "uri")); Assertions.isDefined(uri, StringUtils.format(ERROR_PARAMETERS_NULL, "certificate")); try { remoteFileConnection = RemoteFileConnectionSupport.getRemoteFileConnection(uri); } catch (CommunicationException e) { throw new IOException(e); } } @Override public int read(byte[] b, int off, int len) throws IOException { return remoteFileConnection.read(b, off, len); } @Override public int read(byte[] b) throws IOException { // delegate return read(b, 0, b.length); } @Override public int read() throws IOException { throw new UnsupportedOperationException(REMOTE_STREAMS_SHOULD_NOT_CALL_THIS_METHOD); } @Override public long skip(long n) throws IOException { return remoteFileConnection.skip(n); } @Override public void close() throws IOException { remoteFileConnection.close(); } }