From 0a033b36a2be7e1d92c8b2f7323f2851005034cf Mon Sep 17 00:00:00 2001 From: davidmandle Date: Wed, 5 Apr 2023 09:47:14 -0700 Subject: [PATCH] feat: handle generation numbers in BlobId#{to,from}GsUtilUri (#1929) --- .../java/com/google/cloud/storage/BlobId.java | 20 ++++++++++++------- .../com/google/cloud/storage/BlobIdTest.java | 9 +++++++++ 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/BlobId.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/BlobId.java index 22eb3ded1..c1914d6a1 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/BlobId.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/BlobId.java @@ -21,6 +21,7 @@ import com.google.common.base.MoreObjects; import java.io.Serializable; import java.util.Objects; +import java.util.regex.Matcher; import java.util.regex.Pattern; /** @@ -31,6 +32,7 @@ public final class BlobId implements Serializable { private static final long serialVersionUID = 8201580858265557469L; + private static final Pattern gsUtilUriPattern = Pattern.compile("^gs://(.+?)/(.+?)(?:#(\\d+))?$"); private final String bucket; private final String name; private final Long generation; @@ -58,7 +60,7 @@ public Long getGeneration() { /** Returns this blob's Storage url which can be used with gsutil */ public String toGsUtilUri() { - return "gs://" + bucket + "/" + name; + return "gs://" + bucket + "/" + name + (generation == null ? "" : ("#" + generation)); } @Override @@ -117,14 +119,18 @@ public static BlobId of(String bucket, String name, Long generation) { * @param gsUtilUri the Storage url to create the blob from */ public static BlobId fromGsUtilUri(String gsUtilUri) { - if (!Pattern.matches("gs://.*/.*", gsUtilUri)) { + Matcher m = gsUtilUriPattern.matcher(gsUtilUri); + if (!m.matches()) { throw new IllegalArgumentException( - gsUtilUri + " is not a valid gsutil URI (i.e. \"gs://bucket/blob\")"); + gsUtilUri + + " is not a valid gsutil URI (i.e. \"gs://bucket/blob\" or \"gs://bucket/blob#generation\")"); } - int blobNameStartIndex = gsUtilUri.indexOf('/', 5); - String bucketName = gsUtilUri.substring(5, blobNameStartIndex); - String blobName = gsUtilUri.substring(blobNameStartIndex + 1); - return BlobId.of(bucketName, blobName); + String bucket = m.group(1); + String name = m.group(2); + String generationGroup = m.group(3); + Long generation = generationGroup == null ? null : Long.parseLong(generationGroup); + + return BlobId.of(bucket, name, generation); } } diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/BlobIdTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/BlobIdTest.java index 0c13fa420..03bf2218f 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/BlobIdTest.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/BlobIdTest.java @@ -39,6 +39,15 @@ public void testToFromGsUtilUri() { assertEquals("gs://bucket/path/to/blob", blobId.toGsUtilUri()); } + @Test + public void testToFromGsUtilUriWithGeneration() { + BlobId blobId = BlobId.fromGsUtilUri("gs://bucket/path/to/blob#1360887697105000"); + assertEquals("bucket", blobId.getBucket()); + assertEquals("path/to/blob", blobId.getName()); + assertEquals(Long.valueOf(1360887697105000L), blobId.getGeneration()); + assertEquals("gs://bucket/path/to/blob#1360887697105000", blobId.toGsUtilUri()); + } + @Test public void testEquals() { compareBlobIds(BLOB, BlobId.of("b", "n"));