diff --git a/pom.xml b/pom.xml
index 22414f50..c1b5fd87 100644
--- a/pom.xml
+++ b/pom.xml
@@ -86,6 +86,10 @@
aws-java-sdk
1.6.3
+
+ com.google.guava
+ guava
+
commons-io
commons-io
diff --git a/src/main/java/com/jcabi/s3/AwsBucket.java b/src/main/java/com/jcabi/s3/AwsBucket.java
index 305b8d76..fad26c3a 100644
--- a/src/main/java/com/jcabi/s3/AwsBucket.java
+++ b/src/main/java/com/jcabi/s3/AwsBucket.java
@@ -32,6 +32,7 @@
import com.amazonaws.AmazonServiceException;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.model.DeleteObjectRequest;
+import com.amazonaws.services.s3.model.ListObjectsRequest;
import com.amazonaws.services.s3.model.ObjectListing;
import com.amazonaws.services.s3.model.S3ObjectSummary;
import com.jcabi.aspects.Immutable;
@@ -101,7 +102,7 @@ public void remove(@NotNull(message = "key can't be NULL")
aws.deleteObject(new DeleteObjectRequest(this.bkt, key));
Logger.info(
this,
- "ocket %s removed in bucket %s",
+ "ocket '%s' removed in bucket '%s'",
key, this.bkt
);
} catch (AmazonServiceException ex) {
@@ -122,14 +123,18 @@ public Iterable list(@NotNull(message = "prefix can't be NULL")
final String pfx) throws IOException {
try {
final AmazonS3 aws = this.regn.aws();
- final ObjectListing listing = aws.listObjects(this.bkt, pfx);
+ final ObjectListing listing = aws.listObjects(
+ new ListObjectsRequest()
+ .withBucketName(this.bkt)
+ .withPrefix(pfx)
+ );
final Collection list = new LinkedList();
for (final S3ObjectSummary sum : listing.getObjectSummaries()) {
list.add(sum.getKey());
}
Logger.info(
this,
- "listed %d ocket(s) with prefix '%s' in bucket %s",
+ "listed %d ocket(s) with prefix '%s' in bucket '%s'",
listing.getObjectSummaries().size(), pfx, this.bkt
);
return list;
diff --git a/src/main/java/com/jcabi/s3/AwsOcket.java b/src/main/java/com/jcabi/s3/AwsOcket.java
index acef0136..6b95134b 100644
--- a/src/main/java/com/jcabi/s3/AwsOcket.java
+++ b/src/main/java/com/jcabi/s3/AwsOcket.java
@@ -101,7 +101,7 @@ public ObjectMetadata meta() throws IOException {
);
Logger.info(
this,
- "metadata loaded for ocket %s in bucket %s, etag=%s",
+ "metadata loaded for ocket '%s' in bucket '%s', etag=%s",
this.name, this.bkt.name(), meta.getETag()
);
return meta;
@@ -123,7 +123,7 @@ public void read(@NotNull(message = "output stream can't be NULL")
input.close();
Logger.info(
this,
- "loaded %d byte(s) from ocket %s in bucket %s, etag=%s",
+ "loaded %d byte(s) from ocket '%s' in bucket '%s', etag=%s",
bytes, this.name, this.bkt.name(),
obj.getObjectMetadata().getETag()
);
@@ -152,7 +152,7 @@ public void write(
);
Logger.info(
this,
- "saved %d byte(s) to ocket %s in bucket %s, etag=%s",
+ "saved %d byte(s) to ocket '%s' in bucket '%s', etag=%s",
cnt.getByteCount(), this.name, this.bkt.name(),
result.getETag()
);
diff --git a/src/main/java/com/jcabi/s3/Bucket.java b/src/main/java/com/jcabi/s3/Bucket.java
index c28cadc0..c4a7ceff 100644
--- a/src/main/java/com/jcabi/s3/Bucket.java
+++ b/src/main/java/com/jcabi/s3/Bucket.java
@@ -29,10 +29,12 @@
*/
package com.jcabi.s3;
+import com.google.common.base.Function;
+import com.google.common.base.Predicate;
+import com.google.common.collect.Iterables;
import com.jcabi.aspects.Immutable;
import com.jcabi.aspects.Loggable;
import java.io.IOException;
-import java.util.Iterator;
import javax.validation.constraints.NotNull;
import lombok.EqualsAndHashCode;
import lombok.ToString;
@@ -132,35 +134,25 @@ public void remove(final String key) throws IOException {
}
@Override
public Iterable list(final String pfx) throws IOException {
- // @checkstyle AnonInnerLength (50 lines)
- return new Iterable() {
- @Override
- public Iterator iterator() {
- final Iterator list;
- try {
- list = Bucket.Prefixed.this.origin
- .list(Bucket.Prefixed.this.extend(pfx)).iterator();
- } catch (IOException ex) {
- throw new IllegalStateException(ex);
- }
- return new Iterator() {
- @Override
- public boolean hasNext() {
- return list.hasNext();
- }
+ return Iterables.filter(
+ Iterables.transform(
+ this.origin.list(this.extend(pfx)),
+ new Function() {
@Override
- public String next() {
- return list.next().substring(
+ public String apply(final String input) {
+ return input.substring(
Bucket.Prefixed.this.prefix.length()
);
}
- @Override
- public void remove() {
- list.remove();
- }
- };
+ }
+ ),
+ new Predicate() {
+ @Override
+ public boolean apply(final String input) {
+ return !input.isEmpty();
+ }
}
- };
+ );
}
/**
* Extend name with a prefix.
diff --git a/src/test/java/com/jcabi/s3/AwsBucketITCase.java b/src/test/java/com/jcabi/s3/AwsBucketITCase.java
index 8909742d..e3172c35 100644
--- a/src/test/java/com/jcabi/s3/AwsBucketITCase.java
+++ b/src/test/java/com/jcabi/s3/AwsBucketITCase.java
@@ -127,9 +127,9 @@ public void listsObjectsInPrefixedBucket() throws Exception {
public void listsInPrefixedBucketWithouCollisions() throws Exception {
final Bucket bucket = this.rule.bucket();
// @checkstyle MultipleStringLiterals (1 line)
- final String[] names = {"alpha/alpha.xml", "alpha.xml"};
+ final String[] names = {"alpha/", "alpha/beta.xml"};
for (final String name : names) {
- new Ocket.Text(bucket.ocket(name)).write("whatsup");
+ new Ocket.Text(bucket.ocket(name)).write("");
}
final Bucket bkt = new Bucket.Prefixed(bucket, "alpha/");
try {
@@ -137,7 +137,7 @@ public void listsInPrefixedBucketWithouCollisions() throws Exception {
bkt.list(""),
Matchers.allOf(
Matchers.iterableWithSize(1),
- Matchers.hasItem("alpha.xml")
+ Matchers.hasItem("beta.xml")
)
);
} finally {