diff --git a/src/main/java/io/jenkins/plugins/artifact_manager_jclouds/JCloudsArtifactManager.java b/src/main/java/io/jenkins/plugins/artifact_manager_jclouds/JCloudsArtifactManager.java index f2a0ada6..60cc3b1f 100644 --- a/src/main/java/io/jenkins/plugins/artifact_manager_jclouds/JCloudsArtifactManager.java +++ b/src/main/java/io/jenkins/plugins/artifact_manager_jclouds/JCloudsArtifactManager.java @@ -157,28 +157,7 @@ public boolean delete() throws IOException, InterruptedException { LOGGER.log(Level.FINE, "Ignoring blob deletion: {0}", blobPath); return false; } - return delete(provider, getContext().getBlobStore(), blobPath); - } - - /** - * Delete all blobs starting with prefix - */ - public static boolean delete(BlobStoreProvider provider, BlobStore blobStore, String prefix) throws IOException, InterruptedException { - try { - Iterator it = new JCloudsVirtualFile.PageSetIterable(blobStore, provider.getContainer(), ListContainerOptions.Builder.prefix(prefix).recursive()); - boolean found = false; - while (it.hasNext()) { - StorageMetadata sm = it.next(); - String path = sm.getName(); - assert path.startsWith(prefix); - LOGGER.fine("deleting " + path); - blobStore.removeBlob(provider.getContainer(), path); - found = true; - } - return found; - } catch (RuntimeException x) { - throw new IOException(x); - } + return JCloudsVirtualFile.delete(provider, getContext().getBlobStore(), blobPath); } @Override diff --git a/src/main/java/io/jenkins/plugins/artifact_manager_jclouds/JCloudsVirtualFile.java b/src/main/java/io/jenkins/plugins/artifact_manager_jclouds/JCloudsVirtualFile.java index 4aec4edd..669a9fb7 100644 --- a/src/main/java/io/jenkins/plugins/artifact_manager_jclouds/JCloudsVirtualFile.java +++ b/src/main/java/io/jenkins/plugins/artifact_manager_jclouds/JCloudsVirtualFile.java @@ -35,11 +35,13 @@ import java.net.URI; import java.net.URL; import java.util.ArrayDeque; +import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.Deque; import java.util.HashMap; import java.util.Iterator; +import java.util.List; import java.util.Map; import java.util.NoSuchElementException; import java.util.Spliterator; @@ -402,4 +404,30 @@ private Deque cacheFrames() { return cacheFrames().stream().filter(frame -> key.startsWith(frame.root)).findFirst().orElse(null); } + /** + * Delete all blobs starting with a given prefix. + */ + public static boolean delete(BlobStoreProvider provider, BlobStore blobStore, String prefix) throws IOException, InterruptedException { + try { + Iterator it = new PageSetIterable(blobStore, provider.getContainer(), ListContainerOptions.Builder.prefix(prefix).recursive()); + List paths = new ArrayList<>(); + while (it.hasNext()) { + StorageMetadata sm = it.next(); + String path = sm.getName(); + assert path.startsWith(prefix); + paths.add(path); + } + if (paths.isEmpty()) { + LOGGER.log(Level.FINE, "nothing to delete under {0}", prefix); + return false; + } else { + LOGGER.log(Level.FINE, "deleting {0} blobs under {1}", new Object[] {paths.size(), prefix}); + blobStore.removeBlobs(provider.getContainer(), paths); + return true; + } + } catch (RuntimeException x) { + throw new IOException(x); + } + } + } diff --git a/src/test/java/io/jenkins/plugins/artifact_manager_s3/S3AbstractTest.java b/src/test/java/io/jenkins/plugins/artifact_manager_s3/S3AbstractTest.java index acdc5992..9bbd4987 100644 --- a/src/test/java/io/jenkins/plugins/artifact_manager_s3/S3AbstractTest.java +++ b/src/test/java/io/jenkins/plugins/artifact_manager_s3/S3AbstractTest.java @@ -26,7 +26,6 @@ import io.jenkins.plugins.artifact_manager_jclouds.BlobStoreProvider; import io.jenkins.plugins.artifact_manager_jclouds.JCloudsVirtualFile; -import io.jenkins.plugins.artifact_manager_jclouds.JCloudsArtifactManager; import com.amazonaws.SdkClientException; import com.amazonaws.services.s3.AmazonS3ClientBuilder; @@ -123,7 +122,7 @@ public void tearDown() throws Exception { @After public void deleteBlobs() throws Exception { - JCloudsArtifactManager.delete(provider, blobStore, prefix); + JCloudsVirtualFile.delete(provider, blobStore, prefix); } }