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>"c82e6a0025c31c5de5947fda62ac51ab"</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>"cd8a19b26fea8a827276df0ad11c580d"</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>"cd8a19b26fea8a827276df0ad11c580d"</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());
+ }
}