This is an automated email from the ASF dual-hosted git repository.

gaul pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/jclouds.git


The following commit(s) were added to refs/heads/master by this push:
     new 6455fd8518 Parse out of order ListBucket response elements
6455fd8518 is described below

commit 6455fd8518f3158c7bb1693f7489896a24bd88fa
Author: Mickael LANOE <[email protected]>
AuthorDate: Wed Nov 22 18:12:39 2023 +0100

    Parse out of order ListBucket response elements
    
    Currently, jclouds assumes that the <ID> must occur before the
    <DisplayName> tag. If the XML body does not adhere to this order, the
    parser throws a NullPointerException.
    
    Scaleway is a cloud provider that does not adhere to this order and
    returns the <DisplayName> tag before the <ID> tag. The patch changes the
    parser to not depend on the order of the tags.
    
    See commit 04feb8f8482e48b6c26166edb3d6fd5a607d858b for a similar fix
---
 .../main/java/org/jclouds/s3/xml/ListBucketHandler.java   |  5 +++--
 .../java/org/jclouds/s3/xml/ListBucketHandlerTest.java    | 15 +++++++++++++++
 2 files changed, 18 insertions(+), 2 deletions(-)

diff --git a/apis/s3/src/main/java/org/jclouds/s3/xml/ListBucketHandler.java 
b/apis/s3/src/main/java/org/jclouds/s3/xml/ListBucketHandler.java
index a548241fd3..27e21555d9 100644
--- a/apis/s3/src/main/java/org/jclouds/s3/xml/ListBucketHandler.java
+++ b/apis/s3/src/main/java/org/jclouds/s3/xml/ListBucketHandler.java
@@ -66,6 +66,7 @@ public class ListBucketHandler extends 
ParseSax.HandlerWithResult<ListBucketResp
    @Inject
    public ListBucketHandler(DateService dateParser) {
       this.dateParser = dateParser;
+      this.currentOwner = new CanonicalUser();
    }
 
    public ListBucketResponse getResult() {
@@ -87,7 +88,7 @@ public class ListBucketHandler extends 
ParseSax.HandlerWithResult<ListBucketResp
 
    public void endElement(String uri, String name, String qName) {
       if (qName.equals("ID")) {
-         currentOwner = new CanonicalUser(currentOrNull(currentText));
+        currentOwner.setId(currentOrNull(currentText));
       } else if (qName.equals("DisplayName")) {
          currentOwner.setDisplayName(currentOrNull(currentText));
       } else if (qName.equals("Key")) { // content stuff
@@ -112,7 +113,7 @@ public class ListBucketHandler extends 
ParseSax.HandlerWithResult<ListBucketResp
          builder.contentLength(Long.valueOf(currentOrNull(currentText)));
       } else if (qName.equals("Owner")) {
          builder.owner(currentOwner);
-         currentOwner = null;
+         currentOwner = new CanonicalUser();
       } else if (qName.equals("StorageClass")) {
          
builder.storageClass(ObjectMetadata.StorageClass.valueOf(currentOrNull(currentText)));
       } else if (qName.equals("Contents")) {
diff --git 
a/apis/s3/src/test/java/org/jclouds/s3/xml/ListBucketHandlerTest.java 
b/apis/s3/src/test/java/org/jclouds/s3/xml/ListBucketHandlerTest.java
index f420ec41ae..5295e72d0a 100644
--- a/apis/s3/src/test/java/org/jclouds/s3/xml/ListBucketHandlerTest.java
+++ b/apis/s3/src/test/java/org/jclouds/s3/xml/ListBucketHandlerTest.java
@@ -49,6 +49,7 @@ public class ListBucketHandlerTest extends BaseHandlerTest {
    public static final String listBucketWithPrefixAppsSlash = 
"<ListBucketResult 
xmlns=\"http://s3.amazonaws.com/doc/2006-03-01/\";><Name>adriancole.org.jclouds.s3.amazons3testdelimiter</Name><Prefix>apps/</Prefix><Marker></Marker><MaxKeys>1000</MaxKeys><IsTruncated>false</IsTruncated><Contents><Key>apps/0</Key><LastModified>2009-05-07T18:27:08.000Z</LastModified><ETag>&quot;c82e6a0025c31c5de5947fda62ac51ab&quot;</ETag><Size>8</Size><Owner><ID>e1a5f66a480ca99a4fdfe8e318c3020446c9989d7004e
 [...]
    public static final String listBucketWithSecondsDate = "<ListBucketResult 
xmlns=\"http://s3.amazonaws.com/doc/2006-03-01/\";><Name>adriancole.org.jclouds.s3.amazons3testdelimiter</Name><Prefix>apps/</Prefix><Marker></Marker><MaxKeys>1000</MaxKeys><IsTruncated>false</IsTruncated><Contents><Key>apps/9</Key><LastModified>2014-07-23T20:53:17+0000</LastModified><ETag>&quot;cd8a19b26fea8a827276df0ad11c580d&quot;</ETag><Size>8</Size><Owner><ID>e1a5f66a480ca99a4fdfe8e318c3020446c9989d7004e7778
 [...]
    public static final String listBucketWithSlashDelimiterAndCommonPrefixApps 
= "<ListBucketResult xmlns=\"http://s3.amazonaws.com/doc/2006-03-01/\";> 
<Delimiter>/</Delimiter> 
<CommonPrefixes><Prefix>apps/</Prefix></CommonPrefixes></ListBucketResult>";
+   public static final String listBucketWithDisplayNameFirst = 
"<ListBucketResult 
xmlns=\"http://s3.amazonaws.com/doc/2006-03-01/\";><Name>adriancole.org.jclouds.s3.amazons3testdelimiter</Name><Prefix>apps/</Prefix><Marker></Marker><MaxKeys>1000</MaxKeys><IsTruncated>false</IsTruncated><Contents><Key>apps/9</Key><LastModified>2014-07-23T20:53:17+0000</LastModified><ETag>&quot;cd8a19b26fea8a827276df0ad11c580d&quot;</ETag><Size>8</Size><Owner><DisplayName>ferncam</DisplayName><ID>e1a5f66a48
 [...]
    private DateService dateService = new SimpleDateFormatDateService();
 
    public void testApplyInputStream() {
@@ -151,4 +152,18 @@ public class ListBucketHandlerTest extends BaseHandlerTest 
{
       ObjectMetadata metadata = bucket.iterator().next();
       assertEquals(metadata.getLastModified(), expected.getLastModified());
    }
+   
+   @Test
+   public void testListMyBucketsWithDisplayNameFirst() {
+      ListBucketResponse bucket = createParser().parse(
+            Strings2.toInputStream(listBucketWithDisplayNameFirst));
+      ObjectMetadata expected = new CopyObjectResult(
+            new SimpleDateFormatDateService()
+                  .iso8601SecondsDateParse("2014-07-23T20:53:17+0000"),
+            "\"92836a3ea45a6984d1b4d23a747d46bb\"");
+
+      // Verify that the date was parsed successfully.
+      ObjectMetadata metadata = bucket.iterator().next();
+      assertEquals(metadata.getLastModified(), expected.getLastModified());
+   }
 }

Reply via email to