From 7e54a7bd7266c79b4ec1368602b40802d6abff6d Mon Sep 17 00:00:00 2001 From: Harshavardhana Date: Sat, 15 Apr 2017 08:15:07 -0700 Subject: [PATCH] examples: Implement console progress bar for GetObject Progress bar is of the following form ``` Uploading... 2% [=> ] ... ``` --- examples/GetObjectProgressBar.java | 78 ++++++++++++++++++++++++++++++ examples/ProgressStream.java | 37 ++++++++++---- 2 files changed, 106 insertions(+), 9 deletions(-) create mode 100644 examples/GetObjectProgressBar.java diff --git a/examples/GetObjectProgressBar.java b/examples/GetObjectProgressBar.java new file mode 100644 index 000000000..c1aea50d9 --- /dev/null +++ b/examples/GetObjectProgressBar.java @@ -0,0 +1,78 @@ +/* + * Minio Java SDK for Amazon S3 Compatible Cloud Storage, (C) 2017 Minio, 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 + * + * https://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. + */ + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.StandardOpenOption; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; + +import org.xmlpull.v1.XmlPullParserException; + +import com.google.common.io.ByteStreams; + +import io.minio.MinioClient; +import io.minio.ObjectStat; +import io.minio.errors.MinioException; +import me.tongfei.progressbar.ProgressBarStyle; + +public class GetObjectProgressBar { + /** + * MinioClient.getObjectProgressBar() example. + */ + public static void main(String[] args) + throws IOException, NoSuchAlgorithmException, InvalidKeyException, XmlPullParserException { + try { + /* play.minio.io for test and development. */ + MinioClient minioClient = new MinioClient("https://play.minio.io:9000", + "Q3AM3UQ867SPQQA43P2F", "zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG"); + + /* Amazon S3: */ + // MinioClient minioClient = new MinioClient("https://s3.amazonaws.com", "YOUR-ACCESSKEYID", + // "YOUR-SECRETACCESSKEY"); + + // Check whether the object exists using statObject(). If the object is not found, + // statObject() throws an exception. It means that the object exists when statObject() + // execution is successful. + + // Get object stat information. + ObjectStat objectStat = minioClient.statObject("testbucket", "resumes/4.original.pdf"); + + // Get input stream to have content of 'my-objectname' from 'my-bucketname' + InputStream is = new ProgressStream("Downloading .. ", ProgressBarStyle.ASCII, + objectStat.length(), minioClient.getObject("my-bucketname", "my-objectname")); + + Path path = Paths.get("my-filename"); + OutputStream os = Files.newOutputStream(path, StandardOpenOption.CREATE); + + long bytesWritten = ByteStreams.copy(is, os); + is.close(); + os.close(); + + if (bytesWritten != objectStat.length()) { + throw new IOException(path + ": unexpected data written. expected = " + objectStat.length() + + ", written = " + bytesWritten); + } + + } catch (MinioException e) { + System.out.println("Error occurred: " + e); + } + } +} diff --git a/examples/ProgressStream.java b/examples/ProgressStream.java index ceb6d36e3..75ea4a3db 100644 --- a/examples/ProgressStream.java +++ b/examples/ProgressStream.java @@ -25,23 +25,40 @@ public class ProgressStream extends InputStream { private ProgressBar pb; /** - * ProgressStream implements an extends InputStream while - * also writing out the read progress on console. ProgressStream - * can be used as a direct replacement for any InputStream compatible + * ProgressStream implements an extends InputStream while also writing out the read progress on + * console. ProgressStream can be used as a direct replacement for any InputStream compatible * input. + * + * @param msg Custom message string. + * @param style Custom progress bar style. * @param stream InputStream to be wrapped. * @throws IOException For any exception generated by the InputStream. */ public ProgressStream(String msg, ProgressBarStyle style, InputStream stream) throws IOException { + this(msg, style, (long)stream.available(), stream); + } + + /** + * ProgressStream implements an extends InputStream while also writing out the read progress on + * console. ProgressStream can be used as a direct replacement for any InputStream compatible + * input. + * + * @param msg Custom message string. + * @param style Custom progress bar style. + * @param size Size of the progress bar. + * @param stream InputStream to be wrapped. + * @throws IOException For any exception generated by the InputStream. + */ + public ProgressStream(String msg, ProgressBarStyle style, long size, InputStream stream) + throws IOException { super(); // Allocate the reader. this.in = stream; // Initialize progress bar. - this.pb = new ProgressBar(msg, stream.available(), style); + this.pb = new ProgressBar(msg, size, style); this.pb.start(); - } @Override @@ -64,14 +81,16 @@ public int read() throws IOException { @Override public int read(byte[] toStore) throws IOException { - this.pb.stepBy(toStore.length); // Update progress bar. - return this.in.read(toStore); + int readBytes = this.in.read(toStore); + this.pb.stepBy(readBytes); // Update progress bar. + return readBytes; } @Override public int read(byte[] toStore, int off, int len) throws IOException { - this.pb.stepBy(toStore.length); - return this.in.read(toStore, off, len); + int readBytes = this.in.read(toStore, off, len); + this.pb.stepBy(readBytes); + return readBytes; } @Override