Repository: jclouds Updated Branches: refs/heads/master 46f4a4e45 -> 49d7d9d3b
Reorder list option handling for local blobstores We should apply the prefix first, recursive second, marker third, and max keys last. Also add some fixes to pass delimiter tests. Project: http://git-wip-us.apache.org/repos/asf/jclouds/repo Commit: http://git-wip-us.apache.org/repos/asf/jclouds/commit/49d7d9d3 Tree: http://git-wip-us.apache.org/repos/asf/jclouds/tree/49d7d9d3 Diff: http://git-wip-us.apache.org/repos/asf/jclouds/diff/49d7d9d3 Branch: refs/heads/master Commit: 49d7d9d3b7d9677dc46c1105324c51e3f30842ab Parents: c770ffb Author: Andrew Gaul <[email protected]> Authored: Sat Jan 17 00:45:35 2015 -0800 Committer: Andrew Gaul <[email protected]> Committed: Thu Jan 22 11:37:46 2015 -0800 ---------------------------------------------------------------------- .../blobstore/config/LocalBlobStore.java | 72 +++++++++++++------- 1 file changed, 47 insertions(+), 25 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/jclouds/blob/49d7d9d3/blobstore/src/main/java/org/jclouds/blobstore/config/LocalBlobStore.java ---------------------------------------------------------------------- diff --git a/blobstore/src/main/java/org/jclouds/blobstore/config/LocalBlobStore.java b/blobstore/src/main/java/org/jclouds/blobstore/config/LocalBlobStore.java index 1466c4a..5f3c6c1 100644 --- a/blobstore/src/main/java/org/jclouds/blobstore/config/LocalBlobStore.java +++ b/blobstore/src/main/java/org/jclouds/blobstore/config/LocalBlobStore.java @@ -234,21 +234,6 @@ public final class LocalBlobStore implements BlobStore { String marker = null; if (options != null) { - if (options.getMarker() != null) { - final String finalMarker = options.getMarker(); - Optional<StorageMetadata> lastMarkerMetadata = tryFind(contents, new Predicate<StorageMetadata>() { - public boolean apply(StorageMetadata metadata) { - return metadata.getName().compareTo(finalMarker) > 0; - } - }); - if (lastMarkerMetadata.isPresent()) { - contents = contents.tailSet(lastMarkerMetadata.get()); - } else { - // marker is after last key or container is empty - contents.clear(); - } - } - final String prefix = options.getDir(); if (prefix != null && !prefix.isEmpty()) { final String dirPrefix = prefix.endsWith(File.separator) ? @@ -261,16 +246,6 @@ public final class LocalBlobStore implements BlobStore { })); } - int maxResults = options.getMaxResults() != null ? options.getMaxResults() : 1000; - if (!contents.isEmpty()) { - StorageMetadata lastElement = contents.last(); - contents = newTreeSet(Iterables.limit(contents, maxResults)); - if (maxResults != 0 && !contents.contains(lastElement)) { - // Partial listing - marker = contents.last().getName(); - } - } - if (!options.isRecursive()) { String delimiter = storageStrategy.getSeparator(); SortedSet<String> commonPrefixes = newTreeSet( @@ -282,11 +257,58 @@ public final class LocalBlobStore implements BlobStore { for (String o : commonPrefixes) { MutableStorageMetadata md = new MutableStorageMetadataImpl(); md.setType(StorageType.RELATIVE_PATH); + if (prefix != null) { + if (!prefix.endsWith(delimiter)) { + o = prefix + delimiter + o; + } else { + o = prefix + o; + } + } md.setName(o); contents.add(md); } } + if (options.getMarker() != null) { + final String finalMarker = options.getMarker(); + String delimiter = storageStrategy.getSeparator(); + Optional<StorageMetadata> lastMarkerMetadata; + if (finalMarker.endsWith(delimiter)) { + lastMarkerMetadata = tryFind(contents, new Predicate<StorageMetadata>() { + public boolean apply(StorageMetadata metadata) { + int length = finalMarker.length() - 1; + return metadata.getName().substring(0, length).compareTo(finalMarker.substring(0, length)) > 0; + } + }); + } else { + lastMarkerMetadata = tryFind(contents, new Predicate<StorageMetadata>() { + public boolean apply(StorageMetadata metadata) { + return metadata.getName().compareTo(finalMarker) > 0; + } + }); + } + if (lastMarkerMetadata.isPresent()) { + contents = contents.tailSet(lastMarkerMetadata.get()); + } else { + // marker is after last key or container is empty + contents.clear(); + } + } + + int maxResults = options.getMaxResults() != null ? options.getMaxResults() : 1000; + if (!contents.isEmpty()) { + StorageMetadata lastElement = contents.last(); + contents = newTreeSet(Iterables.limit(contents, maxResults)); + if (maxResults != 0 && !contents.contains(lastElement)) { + // Partial listing + lastElement = contents.last(); + marker = lastElement.getName(); + if (lastElement.getType() == StorageType.RELATIVE_PATH) { + marker += "/"; + } + } + } + // trim metadata, if the response isn't supposed to be detailed. if (!options.isDetailed()) { for (StorageMetadata md : contents) {
