in blobstore/src/main/java/org/jclouds/blobstore/config/LocalBlobStore.java [225:310]
public PageSet<? extends StorageMetadata> list(final String containerName, ListContainerOptions options) {
if (options.getDir() != null && options.getPrefix() != null) {
throw new IllegalArgumentException("Cannot set both prefix and directory");
}
if ((options.getDir() != null || options.isRecursive()) && (options.getDelimiter() != null)) {
throw new IllegalArgumentException("Cannot set the delimiter if directory or recursive is set");
}
// Check if the container exists
if (!storageStrategy.containerExists(containerName))
throw cnfe(containerName);
// Loading blobs from container
Iterable<String> blobBelongingToContainer = null;
try {
blobBelongingToContainer = storageStrategy.getBlobKeysInsideContainer(containerName, options.getPrefix(), options.getDelimiter());
} catch (IOException e) {
logger.error(e, "An error occurred loading blobs contained into container %s", containerName);
propagate(e);
}
SortedSet<StorageMetadata> contents = newTreeSet(FluentIterable.from(blobBelongingToContainer)
.transform(new Function<String, StorageMetadata>() {
@Override
public StorageMetadata apply(String key) {
Blob oldBlob = loadBlob(containerName, key);
if (oldBlob == null) {
return null;
}
checkState(oldBlob.getMetadata() != null, "blob " + containerName + "/" + key + " has no metadata");
MutableBlobMetadata md = BlobStoreUtils.copy(oldBlob.getMetadata());
md.setSize(oldBlob.getMetadata().getSize());
return md;
}
})
.filter(Predicates.<StorageMetadata>notNull()));
String marker = null;
if (options != null) {
if (options.getDir() != null && !options.getDir().isEmpty()) {
contents = filterDirectory(contents, options);
} else if (!Strings.isNullOrEmpty(options.getPrefix())) {
contents = filterPrefix(contents, options);
} else if (!options.isRecursive() || (options.getDelimiter() != null)) {
String delimiter = options.getDelimiter() == null ? storageStrategy.getSeparator() : options.getDelimiter();
contents = extractCommonPrefixes(contents, delimiter, null);
}
if (options.getMarker() != null) {
final String finalMarker = options.getMarker();
String delimiter = storageStrategy.getSeparator();
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();
}
}
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();
}
}
// trim metadata, if the response isn't supposed to be detailed.
if (!options.isDetailed()) {
for (StorageMetadata md : contents) {
md.getUserMetadata().clear();
}
}
}
return new PageSetImpl<StorageMetadata>(contents, marker);
}