Skip to content

Commit

Permalink
examples: Implement console progress bar for GetObject
Browse files Browse the repository at this point in the history
Progress bar is of the following form

```
Uploading...    2% [=>                         ]   ...
```
  • Loading branch information
harshavardhana authored and minio-trusted committed Apr 15, 2017
1 parent 832d0e4 commit 7e54a7b
Show file tree
Hide file tree
Showing 2 changed files with 106 additions and 9 deletions.
78 changes: 78 additions & 0 deletions examples/GetObjectProgressBar.java
Original file line number Diff line number Diff line change
@@ -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);
}
}
}
37 changes: 28 additions & 9 deletions examples/ProgressStream.java
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down

0 comments on commit 7e54a7b

Please sign in to comment.