@Override List<S3ObjectVersion> loadVersions(final String key) { List<S3ObjectVersion> versions = new ArrayList<>(); boolean directory = false; // delete markers won't have any metadata, so keep track of directory status for (AbstractVersion aVersion : getS3Versions(key)) { S3ObjectVersion version; if (aVersion instanceof DeleteMarker) { version = new S3ObjectVersion(this, getRelativePath(key, directory), new com.emc.ecs.sync.model.ObjectMetadata().withModificationTime(aVersion.getLastModified()) .withContentLength(0).withDirectory(directory)); version.setDeleteMarker(true); } else { version = (S3ObjectVersion) loadObject(key, aVersion.getVersionId()); directory = version.getMetadata().isDirectory(); version.setETag(((Version) aVersion).getETag()); } version.setVersionId(aVersion.getVersionId()); version.setLatest(aVersion.isLatest()); versions.add(version); } Collections.sort(versions, new S3VersionComparator()); return versions; }
private List<AbstractVersion> getS3Versions(final String key) { List<AbstractVersion> versions = new ArrayList<>(); ListVersionsResult listing = null; do { final ListVersionsResult fListing = listing; listing = time(new Function<ListVersionsResult>() { @Override public ListVersionsResult call() { if (fListing == null) { return s3.listVersions(new ListVersionsRequest(config.getBucketName()).withPrefix(key).withDelimiter("/")); } else { return s3.listMoreVersions(fListing); } } }, OPERATION_LIST_VERSIONS); listing.setMaxKeys(1000); // Google Storage compatibility for (final AbstractVersion version : listing.getVersions()) { if (version.getKey().equals(key)) versions.add(version); } } while (listing.isTruncated()); return versions; }