/* * Copyright (C) 2006-2016 DLR, Germany * * All rights reserved * * http://www.rcenvironment.de/ */ package de.rcenvironment.core.datamanagement.commons; import java.io.IOException; import java.io.InputStream; import java.io.Serializable; import java.net.URI; import java.net.URISyntaxException; import de.rcenvironment.core.communication.common.InstanceNodeId; import de.rcenvironment.core.communication.fileaccess.api.RemoteInputStream; /** * Container class for {@link InputStream}s returned from or passed into a data management service. * * @author Doreen Seider */ public class DistributableInputStream extends InputStream implements Serializable { private static final long serialVersionUID = 3334370872679358011L; private transient InputStream inputStream; private URI uriToInputStream; private RemoteInputStream remoteInputStream; public DistributableInputStream(DataReference dataRef, InputStream inputStream) { this.inputStream = inputStream; try { InstanceNodeId nodeId = dataRef.getInstanceId(); // TODO review/encapsulate; but RCEFileURIUtils is currently an internal class, so it's not a trivial refactoring this.uriToInputStream = new URI("rce://" + nodeId.getInstanceNodeIdString() + "/" + dataRef.getDataReferenceKey()); } catch (URISyntaxException e) { throw new RuntimeException(e); } } @Override public int read(byte[] b, int off, int len) throws IOException { if (inputStream != null) { return inputStream.read(b, off, len); } else { if (remoteInputStream == null) { remoteInputStream = new RemoteInputStream(uriToInputStream); } return remoteInputStream.read(b, off, len); } } @Override public int read() throws IOException { if (inputStream != null) { return inputStream.read(); } else { if (remoteInputStream == null) { remoteInputStream = new RemoteInputStream(uriToInputStream); } return remoteInputStream.read(); } } @Override public long skip(long n) throws IOException { if (inputStream != null) { return inputStream.skip(n); } else { if (remoteInputStream == null) { remoteInputStream = new RemoteInputStream(uriToInputStream); } return remoteInputStream.skip(n); } } @Override public void close() throws IOException { if (inputStream != null) { inputStream.close(); } else { // TODO review: what is this for? - misc_ro if (remoteInputStream == null) { remoteInputStream = new RemoteInputStream(uriToInputStream); } remoteInputStream.close(); } } public InputStream getLocalInputStream() { return inputStream; } }