private GridFSDownloadStream createGridFSDownloadStream(@Nullable final ClientSession clientSession, final GridFSFile gridFSFile) { return new GridFSDownloadStreamImpl(clientSession, gridFSFile, chunksCollection); }
@Override public synchronized void reset() { checkClosed(); if (currentPosition == markPosition) { return; } bufferOffset = (int) (markPosition % chunkSizeInBytes); currentPosition = markPosition; int markChunkIndex = (int) Math.floor(markPosition / (double) chunkSizeInBytes); if (markChunkIndex != chunkIndex) { chunkIndex = markChunkIndex; buffer = null; discardCursor(); } }
@Override public int read(final byte[] b, final int off, final int len) { checkClosed(); if (currentPosition == length) { return -1; } else if (buffer == null) { buffer = getBuffer(chunkIndex); } else if (bufferOffset == buffer.length) { chunkIndex += 1; buffer = getBuffer(chunkIndex); bufferOffset = 0; } int r = Math.min(len, buffer.length - bufferOffset); System.arraycopy(buffer, bufferOffset, b, off, r); bufferOffset += r; currentPosition += r; return r; }
private byte[] getBuffer(final int chunkIndexToFetch) { return getBufferFromChunk(getChunk(chunkIndexToFetch), chunkIndexToFetch); } }
@Nullable private Document getChunk(final int startChunkIndex) { if (cursor == null) { cursor = getCursor(startChunkIndex); } Document chunk = null; if (cursor.hasNext()) { chunk = cursor.next(); if (batchSize == 1) { discardCursor(); } if (chunk.getInteger("n") != startChunkIndex) { throw new MongoGridFSException(format("Could not find file chunk for file_id: %s at chunk index %s.", fileId, startChunkIndex)); } } return chunk; }
@Override public int read() { byte[] b = new byte[1]; int res = read(b); if (res < 0) { return -1; } return b[0] & 0xFF; }
@Override public void close() { synchronized (closeLock) { if (!closed) { closed = true; } discardCursor(); } }
@Override public int available() { checkClosed(); if (buffer == null) { return 0; } else { return buffer.length - bufferOffset; } }
@Override public void mark() { mark(Integer.MAX_VALUE); }
private byte[] getBuffer(final int chunkIndexToFetch) { return getBufferFromChunk(getChunk(chunkIndexToFetch), chunkIndexToFetch); } }
@Nullable private Document getChunk(final int startChunkIndex) { if (cursor == null) { cursor = getCursor(startChunkIndex); } Document chunk = null; if (cursor.hasNext()) { chunk = cursor.next(); if (batchSize == 1) { discardCursor(); } if (chunk.getInteger("n") != startChunkIndex) { throw new MongoGridFSException(format("Could not find file chunk for file_id: %s at chunk index %s.", fileId, startChunkIndex)); } } return chunk; }
@Override public int read(final byte[] b) { return read(b, 0, b.length); }
@Override public GridFSDownloadStream batchSize(final int batchSize) { isTrueArgument("batchSize cannot be negative", batchSize >= 0); this.batchSize = batchSize; discardCursor(); return this; }
@Override public int available() { checkClosed(); if (buffer == null) { return 0; } else { return buffer.length - bufferOffset; } }
@Override public void mark() { mark(Integer.MAX_VALUE); }
@Override public long skip(final long bytesToSkip) { checkClosed(); if (bytesToSkip <= 0) { return 0; } long skippedPosition = currentPosition + bytesToSkip; bufferOffset = (int) (skippedPosition % chunkSizeInBytes); if (skippedPosition >= length) { long skipped = length - currentPosition; chunkIndex = numberOfChunks - 1; currentPosition = length; buffer = null; discardCursor(); return skipped; } else { int newChunkIndex = (int) Math.floor(skippedPosition / (double) chunkSizeInBytes); if (chunkIndex != newChunkIndex) { chunkIndex = newChunkIndex; buffer = null; discardCursor(); } currentPosition += bytesToSkip; return bytesToSkip; } }
private byte[] getBuffer(final int chunkIndexToFetch) { return getBufferFromChunk(getChunk(chunkIndexToFetch), chunkIndexToFetch); } }
@Override public int read(final byte[] b, final int off, final int len) { checkClosed(); if (currentPosition == length) { return -1; } else if (buffer == null) { buffer = getBuffer(chunkIndex); } else if (bufferOffset == buffer.length) { chunkIndex += 1; buffer = getBuffer(chunkIndex); bufferOffset = 0; } int r = Math.min(len, buffer.length - bufferOffset); System.arraycopy(buffer, bufferOffset, b, off, r); bufferOffset += r; currentPosition += r; return r; }
@Nullable private Document getChunk(final int startChunkIndex) { if (cursor == null) { cursor = getCursor(startChunkIndex); } Document chunk = null; if (cursor.hasNext()) { chunk = cursor.next(); if (batchSize == 1) { discardCursor(); } if (chunk.getInteger("n") != startChunkIndex) { throw new MongoGridFSException(format("Could not find file chunk for file_id: %s at chunk index %s.", fileId, startChunkIndex)); } } return chunk; }
@Override public int read() { byte[] b = new byte[1]; int res = read(b); if (res < 0) { return -1; } return b[0] & 0xFF; }