Search in sources :

Example 16 with MongoGridFSException

use of com.mongodb.MongoGridFSException in project mongo-java-driver by mongodb.

the class GridFSDownloadStreamImpl method getBufferFromChunk.

private byte[] getBufferFromChunk(@Nullable final Document chunk, final int expectedChunkIndex) {
    if (chunk == null || chunk.getInteger("n") != expectedChunkIndex) {
        throw new MongoGridFSException(format("Could not find file chunk for file_id: %s at chunk index %s.", fileId, expectedChunkIndex));
    }
    if (!(chunk.get("data") instanceof Binary)) {
        throw new MongoGridFSException("Unexpected data format for the chunk");
    }
    byte[] data = chunk.get("data", Binary.class).getData();
    long expectedDataLength = 0;
    boolean extraChunk = false;
    if (expectedChunkIndex + 1 > numberOfChunks) {
        extraChunk = true;
    } else if (expectedChunkIndex + 1 == numberOfChunks) {
        expectedDataLength = length - (expectedChunkIndex * (long) chunkSizeInBytes);
    } else {
        expectedDataLength = chunkSizeInBytes;
    }
    if (extraChunk && data.length > expectedDataLength) {
        throw new MongoGridFSException(format("Extra chunk data for file_id: %s. Unexpected chunk at chunk index %s." + "The size was %s and it should be %s bytes.", fileId, expectedChunkIndex, data.length, expectedDataLength));
    } else if (data.length != expectedDataLength) {
        throw new MongoGridFSException(format("Chunk size data length is not the expected size. " + "The size was %s for file_id: %s chunk index %s it should be %s bytes.", data.length, fileId, expectedChunkIndex, expectedDataLength));
    }
    return data;
}
Also used : MongoGridFSException(com.mongodb.MongoGridFSException) Binary(org.bson.types.Binary)

Example 17 with MongoGridFSException

use of com.mongodb.MongoGridFSException in project mongo-java-driver by mongodb.

the class GridFSBucketImpl method getFileByName.

private GridFSFile getFileByName(@Nullable final ClientSession clientSession, final String filename, final GridFSDownloadOptions options) {
    int revision = options.getRevision();
    int skip;
    int sort;
    if (revision >= 0) {
        skip = revision;
        sort = 1;
    } else {
        skip = (-revision) - 1;
        sort = -1;
    }
    GridFSFile fileInfo = createGridFSFindIterable(clientSession, new Document("filename", filename)).skip(skip).sort(new Document("uploadDate", sort)).first();
    if (fileInfo == null) {
        throw new MongoGridFSException(format("No file found with the filename: %s and revision: %s", filename, revision));
    }
    return fileInfo;
}
Also used : GridFSFile(com.mongodb.client.gridfs.model.GridFSFile) MongoGridFSException(com.mongodb.MongoGridFSException) Document(org.bson.Document) BsonDocument(org.bson.BsonDocument)

Example 18 with MongoGridFSException

use of com.mongodb.MongoGridFSException in project mongo-java-driver by mongodb.

the class GridFSBucketImpl method downloadToStream.

private void downloadToStream(final GridFSDownloadStream downloadStream, final OutputStream destination) {
    byte[] buffer = new byte[downloadStream.getGridFSFile().getChunkSize()];
    int len;
    MongoGridFSException savedThrowable = null;
    try {
        while ((len = downloadStream.read(buffer)) != -1) {
            destination.write(buffer, 0, len);
        }
    } catch (IOException e) {
        savedThrowable = new MongoGridFSException("IOException when reading from the OutputStream", e);
    } catch (Exception e) {
        savedThrowable = new MongoGridFSException("Unexpected Exception when reading GridFS and writing to the Stream", e);
    } finally {
        try {
            downloadStream.close();
        } catch (Exception e) {
        // Do nothing
        }
        if (savedThrowable != null) {
            throw savedThrowable;
        }
    }
}
Also used : MongoGridFSException(com.mongodb.MongoGridFSException) IOException(java.io.IOException) MongoGridFSException(com.mongodb.MongoGridFSException) IOException(java.io.IOException)

Example 19 with MongoGridFSException

use of com.mongodb.MongoGridFSException in project mongo-java-driver by mongodb.

the class GridFSDownloadPublisherImpl method getChunkPublisher.

private Flux<ByteBuffer> getChunkPublisher(final GridFSFile gridFSFile) {
    Document filter = new Document("files_id", gridFSFile.getId());
    FindPublisher<Document> chunkPublisher;
    if (clientSession != null) {
        chunkPublisher = chunksCollection.find(clientSession, filter);
    } else {
        chunkPublisher = chunksCollection.find(filter);
    }
    AtomicInteger chunkCounter = new AtomicInteger(0);
    int numberOfChunks = (int) Math.ceil((double) gridFSFile.getLength() / gridFSFile.getChunkSize());
    Flux<ByteBuffer> byteBufferFlux = Flux.from(chunkPublisher.sort(new Document("n", 1))).map(chunk -> {
        int expectedChunkIndex = chunkCounter.getAndAdd(1);
        if (chunk == null || chunk.getInteger("n") != expectedChunkIndex) {
            throw new MongoGridFSException(format("Could not find file chunk for files_id: %s at chunk index %s.", gridFSFile.getId(), expectedChunkIndex));
        } else if (!(chunk.get("data") instanceof Binary)) {
            throw new MongoGridFSException("Unexpected data format for the chunk");
        }
        byte[] data = chunk.get("data", Binary.class).getData();
        long expectedDataLength = 0;
        if (numberOfChunks > 0) {
            expectedDataLength = expectedChunkIndex + 1 == numberOfChunks ? gridFSFile.getLength() - (expectedChunkIndex * (long) gridFSFile.getChunkSize()) : gridFSFile.getChunkSize();
        }
        if (data.length != expectedDataLength) {
            throw new MongoGridFSException(format("Chunk size data length is not the expected size. " + "The size was %s for file_id: %s chunk index %s it should be " + "%s bytes.", data.length, gridFSFile.getId(), expectedChunkIndex, expectedDataLength));
        }
        return ByteBuffer.wrap(data);
    }).doOnComplete(() -> {
        if (chunkCounter.get() < numberOfChunks) {
            throw new MongoGridFSException(format("Could not find file chunk for files_id: %s at chunk index %s.", gridFSFile.getId(), chunkCounter.get()));
        }
    });
    return bufferSizeBytes == null ? byteBufferFlux : new ResizingByteBufferFlux(byteBufferFlux, bufferSizeBytes);
}
Also used : Document(org.bson.Document) GridFSFile(com.mongodb.client.gridfs.model.GridFSFile) Binary(org.bson.types.Binary) Publisher(org.reactivestreams.Publisher) MongoGridFSException(com.mongodb.MongoGridFSException) Mono(reactor.core.publisher.Mono) MongoCollection(com.mongodb.reactivestreams.client.MongoCollection) ClientSession(com.mongodb.reactivestreams.client.ClientSession) Function(java.util.function.Function) ByteBuffer(java.nio.ByteBuffer) String.format(java.lang.String.format) GridFSDownloadPublisher(com.mongodb.reactivestreams.client.gridfs.GridFSDownloadPublisher) Flux(reactor.core.publisher.Flux) Assertions.notNull(com.mongodb.assertions.Assertions.notNull) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) FindPublisher(com.mongodb.reactivestreams.client.FindPublisher) Nullable(com.mongodb.lang.Nullable) Subscriber(org.reactivestreams.Subscriber) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) MongoGridFSException(com.mongodb.MongoGridFSException) Binary(org.bson.types.Binary) Document(org.bson.Document) ByteBuffer(java.nio.ByteBuffer)

Example 20 with MongoGridFSException

use of com.mongodb.MongoGridFSException in project mongo-java-driver by mongodb.

the class GridFSPublisherCreator method createDeletePublisher.

public static Publisher<Void> createDeletePublisher(final MongoCollection<GridFSFile> filesCollection, final MongoCollection<Document> chunksCollection, @Nullable final ClientSession clientSession, final BsonValue id) {
    notNull("filesCollection", filesCollection);
    notNull("chunksCollection", chunksCollection);
    notNull("id", id);
    BsonDocument filter = new BsonDocument("_id", id);
    Publisher<DeleteResult> fileDeletePublisher;
    if (clientSession == null) {
        fileDeletePublisher = filesCollection.deleteOne(filter);
    } else {
        fileDeletePublisher = filesCollection.deleteOne(clientSession, filter);
    }
    return Mono.from(fileDeletePublisher).flatMap(deleteResult -> {
        if (deleteResult.wasAcknowledged() && deleteResult.getDeletedCount() == 0) {
            throw new MongoGridFSException(format("No file found with the ObjectId: %s", id));
        }
        if (clientSession == null) {
            return Mono.from(chunksCollection.deleteMany(new BsonDocument("files_id", id)));
        } else {
            return Mono.from(chunksCollection.deleteMany(clientSession, new BsonDocument("files_id", id)));
        }
    }).flatMap(i -> Mono.empty());
}
Also used : Document(org.bson.Document) GridFSFile(com.mongodb.client.gridfs.model.GridFSFile) Publisher(org.reactivestreams.Publisher) MongoGridFSException(com.mongodb.MongoGridFSException) Mono(reactor.core.publisher.Mono) MongoCollection(com.mongodb.reactivestreams.client.MongoCollection) ClientSession(com.mongodb.reactivestreams.client.ClientSession) BsonString(org.bson.BsonString) ByteBuffer(java.nio.ByteBuffer) String.format(java.lang.String.format) BsonDocument(org.bson.BsonDocument) BsonValue(org.bson.BsonValue) Bson(org.bson.conversions.Bson) GridFSUploadOptions(com.mongodb.client.gridfs.model.GridFSUploadOptions) Assertions.notNull(com.mongodb.assertions.Assertions.notNull) UpdateResult(com.mongodb.client.result.UpdateResult) GridFSDownloadOptions(com.mongodb.client.gridfs.model.GridFSDownloadOptions) FindPublisher(com.mongodb.reactivestreams.client.FindPublisher) DeleteResult(com.mongodb.client.result.DeleteResult) GridFSFindPublisher(com.mongodb.reactivestreams.client.gridfs.GridFSFindPublisher) Nullable(com.mongodb.lang.Nullable) BsonDocument(org.bson.BsonDocument) MongoGridFSException(com.mongodb.MongoGridFSException) DeleteResult(com.mongodb.client.result.DeleteResult)

Aggregations

MongoGridFSException (com.mongodb.MongoGridFSException)22 BsonDocument (org.bson.BsonDocument)11 GridFSFile (com.mongodb.client.gridfs.model.GridFSFile)6 IOException (java.io.IOException)6 Document (org.bson.Document)6 BsonString (org.bson.BsonString)5 DeleteResult (com.mongodb.client.result.DeleteResult)4 SingleResultCallback (com.mongodb.async.SingleResultCallback)3 UpdateResult (com.mongodb.client.result.UpdateResult)3 ByteBuffer (java.nio.ByteBuffer)3 BsonValue (org.bson.BsonValue)3 Binary (org.bson.types.Binary)3 Assertions.notNull (com.mongodb.assertions.Assertions.notNull)2 Nullable (com.mongodb.lang.Nullable)2 ClientSession (com.mongodb.reactivestreams.client.ClientSession)2 FindPublisher (com.mongodb.reactivestreams.client.FindPublisher)2 MongoCollection (com.mongodb.reactivestreams.client.MongoCollection)2 String.format (java.lang.String.format)2 BsonArray (org.bson.BsonArray)2 BsonObjectId (org.bson.BsonObjectId)2