/*
* Copyright 2015 MongoDB, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package gridfs;
import com.mongodb.Block;
import com.mongodb.async.SingleResultCallback;
import com.mongodb.async.client.MongoClient;
import com.mongodb.async.client.MongoClients;
import com.mongodb.async.client.MongoDatabase;
import com.mongodb.async.client.gridfs.AsyncInputStream;
import com.mongodb.async.client.gridfs.GridFSBucket;
import com.mongodb.async.client.gridfs.GridFSBuckets;
import com.mongodb.async.client.gridfs.GridFSDownloadStream;
import com.mongodb.async.client.gridfs.GridFSUploadStream;
import com.mongodb.client.gridfs.model.GridFSDownloadOptions;
import com.mongodb.client.gridfs.model.GridFSFile;
import com.mongodb.client.gridfs.model.GridFSUploadOptions;
import org.bson.Document;
import org.bson.types.ObjectId;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.AsynchronousFileChannel;
import java.nio.charset.StandardCharsets;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.atomic.AtomicReference;
import static com.mongodb.async.client.gridfs.helpers.AsyncStreamHelper.toAsyncInputStream;
import static com.mongodb.async.client.gridfs.helpers.AsynchronousChannelHelper.channelToOutputStream;
import static com.mongodb.client.model.Filters.eq;
/**
* The GridFS code example see: https://mongodb.github.io/mongo-java-driver/3.1/driver/reference/gridfs
*/
public final class GridFSTour {
/**
* Run this main method to see the output of this quick example.
*
* @param args takes an optional single argument for the connection string
* @throws FileNotFoundException if the sample file cannot be found
* @throws IOException if there was an exception closing an input stream
* @throws InterruptedException if a latch was interrupted
*/
public static void main(final String[] args) throws FileNotFoundException, InterruptedException, IOException {
MongoClient mongoClient;
if (args.length == 0) {
// connect to the local database server
mongoClient = MongoClients.create();
} else {
mongoClient = MongoClients.create(args[0]);
}
// get handle to "mydb" database
MongoDatabase database = mongoClient.getDatabase("mydb");
final CountDownLatch dropLatch = new CountDownLatch(1);
database.drop(new SingleResultCallback<Void>() {
@Override
public void onResult(final Void result, final Throwable t) {
dropLatch.countDown();
}
});
dropLatch.await();
GridFSBucket gridFSBucket = GridFSBuckets.create(database);
/*
* UploadFromStream Example
*/
// Get the input stream
final AsyncInputStream streamToUploadFrom = toAsyncInputStream("MongoDB Tutorial..".getBytes(StandardCharsets.UTF_8));
// Create some custom options
GridFSUploadOptions options = new GridFSUploadOptions()
.chunkSizeBytes(1024)
.metadata(new Document("type", "presentation"));
final AtomicReference<ObjectId> fileIdRef = new AtomicReference<ObjectId>();
final CountDownLatch uploadLatch = new CountDownLatch(1);
gridFSBucket.uploadFromStream("mongodb-tutorial", streamToUploadFrom, options, new SingleResultCallback<ObjectId>() {
@Override
public void onResult(final ObjectId result, final Throwable t) {
fileIdRef.set(result);
System.out.println("The fileId of the uploaded file is: " + result.toHexString());
streamToUploadFrom.close(new SingleResultCallback<Void>() {
@Override
public void onResult(final Void result, final Throwable t) {
uploadLatch.countDown();
}
});
}
});
uploadLatch.await();
ObjectId fileId = fileIdRef.get();
/*
* OpenUploadStream Example
*/
// Get some data to write
ByteBuffer data = ByteBuffer.wrap("Data to upload into GridFS".getBytes(StandardCharsets.UTF_8));
final CountDownLatch uploadLatch2 = new CountDownLatch(2);
final GridFSUploadStream uploadStream = gridFSBucket.openUploadStream("sampleData");
uploadStream.write(data, new SingleResultCallback<Integer>() {
@Override
public void onResult(final Integer result, final Throwable t) {
uploadLatch2.countDown();
System.out.println("The fileId of the uploaded file is: " + uploadStream.getObjectId().toHexString());
uploadStream.close(new SingleResultCallback<Void>() {
@Override
public void onResult(final Void result, final Throwable t) {
uploadLatch2.countDown();
}
});
}
});
uploadLatch2.await();
/*
* Find documents
*/
final CountDownLatch findLatch = new CountDownLatch(1);
System.out.println("File names:");
gridFSBucket.find().forEach(new Block<GridFSFile>() {
@Override
public void apply(final GridFSFile gridFSFile) {
System.out.println(" - " + gridFSFile.getFilename());
}
}, new SingleResultCallback<Void>() {
@Override
public void onResult(final Void result, final Throwable t) {
findLatch.countDown();
}
});
findLatch.await();
/*
* Find documents with a filter
*/
final CountDownLatch findLatch2 = new CountDownLatch(1);
gridFSBucket.find(eq("metadata.contentType", "image/png")).forEach(
new Block<GridFSFile>() {
@Override
public void apply(final GridFSFile gridFSFile) {
System.out.println(gridFSFile.getFilename());
}
},
new SingleResultCallback<Void>() {
@Override
public void onResult(final Void result, final Throwable t) {
findLatch2.countDown();
}
});
findLatch2.await();
/*
* DownloadToStream
*/
Path outputPath = Paths.get("/tmp/mongodb-tutorial.txt");
AsynchronousFileChannel streamToDownloadTo = AsynchronousFileChannel.open(outputPath, StandardOpenOption.CREATE_NEW,
StandardOpenOption.WRITE, StandardOpenOption.DELETE_ON_CLOSE);
final CountDownLatch downloadLatch = new CountDownLatch(1);
gridFSBucket.downloadToStream(fileId, channelToOutputStream(streamToDownloadTo), new SingleResultCallback<Long>() {
@Override
public void onResult(final Long result, final Throwable t) {
downloadLatch.countDown();
System.out.println("downloaded file sized: " + result);
}
});
downloadLatch.await();
streamToDownloadTo.close();
/*
* DownloadToStreamByName
*/
final CountDownLatch downloadLatch2 = new CountDownLatch(1);
streamToDownloadTo = AsynchronousFileChannel.open(outputPath, StandardOpenOption.CREATE_NEW, StandardOpenOption.WRITE,
StandardOpenOption.DELETE_ON_CLOSE);
GridFSDownloadOptions downloadOptions = new GridFSDownloadOptions().revision(0);
gridFSBucket.downloadToStream("mongodb-tutorial", channelToOutputStream(streamToDownloadTo), downloadOptions,
new SingleResultCallback<Long>() {
@Override
public void onResult(final Long result, final Throwable t) {
downloadLatch2.countDown();
System.out.println("downloaded file sized: " + result);
}
});
downloadLatch2.await();
streamToDownloadTo.close();
/*
* OpenDownloadStream
*/
final CountDownLatch downloadLatch3 = new CountDownLatch(1);
final ByteBuffer dstByteBuffer = ByteBuffer.allocate(1024 * 1024);
final GridFSDownloadStream downloadStream = gridFSBucket.openDownloadStream(fileId);
downloadStream.read(dstByteBuffer, new SingleResultCallback<Integer>() {
@Override
public void onResult(final Integer result, final Throwable t) {
dstByteBuffer.flip();
byte[] bytes = new byte[result];
dstByteBuffer.get(bytes);
System.out.println(new String(bytes, StandardCharsets.UTF_8));
downloadStream.close(new SingleResultCallback<Void>() {
@Override
public void onResult(final Void result, final Throwable t) {
downloadLatch3.countDown();
}
});
}
});
downloadLatch3.await();
/*
* OpenDownloadStreamByName
*/
System.out.println("ByName");
dstByteBuffer.clear();
final CountDownLatch downloadLatch4 = new CountDownLatch(1);
final GridFSDownloadStream downloadStreamByName = gridFSBucket.openDownloadStream("sampleData");
downloadStreamByName.read(dstByteBuffer, new SingleResultCallback<Integer>() {
@Override
public void onResult(final Integer result, final Throwable t) {
dstByteBuffer.flip();
byte[] bytes = new byte[result];
dstByteBuffer.get(bytes);
System.out.println(new String(bytes, StandardCharsets.UTF_8));
downloadStreamByName.close(new SingleResultCallback<Void>() {
@Override
public void onResult(final Void result, final Throwable t) {
downloadLatch4.countDown();
}
});
}
});
downloadLatch4.await();
/*
* Rename
*/
final CountDownLatch renameLatch = new CountDownLatch(1);
gridFSBucket.rename(fileId, "mongodbTutorial", new SingleResultCallback<Void>() {
@Override
public void onResult(final Void result, final Throwable t) {
System.out.println("Renamed file");
renameLatch.countDown();
}
});
renameLatch.await();
/*
* Delete
*/
final CountDownLatch deleteLatch = new CountDownLatch(1);
gridFSBucket.delete(fileId, new SingleResultCallback<Void>() {
@Override
public void onResult(final Void result, final Throwable t) {
System.out.println("Deleted file");
deleteLatch.countDown();
}
});
deleteLatch.await();
// Final cleanup
final CountDownLatch dropLatch2 = new CountDownLatch(1);
database.drop(new SingleResultCallback<Void>() {
@Override
public void onResult(final Void result, final Throwable t) {
dropLatch2.countDown();
}
});
dropLatch2.await();
System.out.println("Finished");
}
private GridFSTour() {
}
}