@Override public Mono<ObjectId> store(AsyncInputStream content, @Nullable String filename, @Nullable String contentType, @Nullable Document metadata) { Assert.notNull(content, "InputStream must not be null!"); return Mono.from(getGridFs().uploadFromStream(filename, content, computeUploadOptionsFor(contentType, metadata))); }
@Override public Flux<GridFSFile> find(Query query) { return Flux.from(prepareQuery(query)); }
@Override public Mono<ObjectId> store(AsyncInputStream content, @Nullable String filename, @Nullable String contentType, @Nullable Object metadata) { return store(content, filename, contentType, toDocument(metadata)); }
protected GridFSFindPublisher prepareQuery(Query query) { Assert.notNull(query, "Query must not be null!"); Document queryObject = getMappedQuery(query.getQueryObject()); Document sortObject = getMappedQuery(query.getSortObject()); GridFSFindPublisher publisherToUse = getGridFs().find(queryObject).sort(sortObject); Integer cursorBatchSize = query.getMeta().getCursorBatchSize(); if (cursorBatchSize != null) { publisherToUse = publisherToUse.batchSize(cursorBatchSize); } return publisherToUse; }
@Override public Flux<ReactiveGridFsResource> getResources(String locationPattern) { if (!StringUtils.hasText(locationPattern)) { return Flux.empty(); } AntPath path = new AntPath(locationPattern); if (path.isPattern()) { Flux<GridFSFile> files = find(query(whereFilename().regex(path.toRegex()))); return files.flatMap(this::getResource); } return getResource(locationPattern).flux(); }
@Override public Mono<ObjectId> store(Publisher<DataBuffer> content, @Nullable String filename, @Nullable String contentType, @Nullable Document metadata) { Assert.notNull(content, "Content must not be null!"); return BinaryStreamAdapters.toAsyncInputStream(content).flatMap(it -> store(it, filename, contentType, metadata)); }
@Override public Mono<ReactiveGridFsResource> getResource(String location) { Assert.notNull(location, "Filename must not be null!"); return findOne(query(whereFilename().is(location))).flatMap(this::getResource) .defaultIfEmpty(ReactiveGridFsResource.absent(location)); }
@Override public Mono<ReactiveGridFsResource> getResource(GridFSFile file) { Assert.notNull(file, "GridFSFile must not be null!"); return Mono.fromSupplier(() -> { GridFSDownloadStream stream = getGridFs().openDownloadStream(file.getObjectId()); return new ReactiveGridFsResource(file, BinaryStreamAdapters.toPublisher(stream, dataBufferFactory)); }); }
@Override public Mono<ObjectId> store(Publisher<DataBuffer> content, @Nullable String filename, @Nullable String contentType, @Nullable Object metadata) { return store(content, filename, contentType, toDocument(metadata)); }
@Override public Mono<GridFSFile> findOne(Query query) { return Flux.from(prepareQuery(query).limit(2)) // .collectList() // .flatMap(it -> { if (it.isEmpty()) { return Mono.empty(); } if (it.size() > 1) { return Mono.error(new IncorrectResultSizeDataAccessException( "Query " + SerializationUtils.serializeToJsonSafely(query) + " returned non unique result.", 1)); } return Mono.just(it.get(0)); }); }
@Override public Mono<GridFSFile> findFirst(Query query) { return Flux.from(prepareQuery(query).limit(1)).next(); }