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 {