Skip to content

Commit 3e3c019

Browse files
author
shabtaisharon
authored
Merge pull request #323 from RachelTucker/pagination_headers_v2
Added pagination header parsing to GetObjectsDetails and GetUsers response handlers
2 parents 398bdb2 + f546fc7 commit 3e3c019

File tree

5 files changed

+98
-1
lines changed

5 files changed

+98
-1
lines changed

ds3-sdk-integration/src/test/java/com/spectralogic/ds3client/integration/Smoke_Test.java

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,38 @@ public void getObjects() throws IOException, SignatureException, URISyntaxExcept
141141
assertThat(response.getS3ObjectListResult().getS3Objects().size(), is(4));
142142
assertTrue(s3ObjectExists(response.getS3ObjectListResult().getS3Objects(), "beowulf.txt"));
143143

144+
assertThat(response.getPagingTruncated(), is(nullValue()));
145+
assertThat(response.getPagingTotalResultCount(), is(nullValue()));
146+
} finally {
147+
deleteAllContents(client,bucketName);
148+
}
149+
150+
}
151+
152+
@Test
153+
public void getObjectsWithPagination() throws IOException, SignatureException, URISyntaxException, XmlProcessingException {
154+
final String bucketName = "test_get_objs";
155+
try {
156+
HELPERS.ensureBucketExists(bucketName, envDataPolicyId);
157+
loadBookTestData(client, bucketName);
158+
159+
final HeadObjectResponse headResponse = client.headObject(new HeadObjectRequest(
160+
bucketName, "beowulf.txt"));
161+
assertThat(headResponse.getStatus(),
162+
is(HeadObjectResponse.Status.EXISTS));
163+
assertThat(headResponse.getObjectSize(), is(294059L));
164+
165+
final GetObjectsDetailsSpectraS3Response response = client
166+
.getObjectsDetailsSpectraS3(new GetObjectsDetailsSpectraS3Request()
167+
.withBucketId("test_get_objs")
168+
.withPageOffset(0));
169+
170+
assertFalse(response.getS3ObjectListResult().getS3Objects().isEmpty());
171+
assertThat(response.getS3ObjectListResult().getS3Objects().size(), is(4));
172+
assertTrue(s3ObjectExists(response.getS3ObjectListResult().getS3Objects(), "beowulf.txt"));
173+
174+
assertThat(response.getPagingTruncated(), is(0));
175+
assertThat(response.getPagingTotalResultCount(), is(4));
144176
} finally {
145177
deleteAllContents(client,bucketName);
146178
}

ds3-sdk/src/main/java/com/spectralogic/ds3client/commands/interfaces/AbstractResponse.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,18 @@ private String readResponseString() throws IOException {
154154
}
155155
}
156156

157+
protected Integer parseIntHeader(final String key) {
158+
final List<String> list = getResponse().getHeaders().get(key);
159+
switch (list.size()) {
160+
case 0:
161+
return null;
162+
case 1:
163+
return Integer.parseInt(list.get(0));
164+
default:
165+
throw new IllegalArgumentException("Response has more than one header value for " + key);
166+
}
167+
}
168+
157169
public String getChecksum() {
158170
return checksum;
159171
}

ds3-sdk/src/main/java/com/spectralogic/ds3client/commands/spectrads3/GetObjectsDetailsSpectraS3Response.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@
2626
public class GetObjectsDetailsSpectraS3Response extends AbstractResponse {
2727

2828
private S3ObjectList s3ObjectListResult;
29+
private Integer pagingTruncated;
30+
private Integer pagingTotalResultCount;
2931

3032
public GetObjectsDetailsSpectraS3Response(final WebResponse response) throws IOException {
3133
super(response);
@@ -38,6 +40,8 @@ protected void processResponse() throws IOException {
3840

3941
switch (this.getStatusCode()) {
4042
case 200:
43+
this.pagingTruncated = parseIntHeader("page-truncated");
44+
this.pagingTotalResultCount = parseIntHeader("total-result-count");
4145
try (final InputStream content = getResponse().getResponseStream()) {
4246
this.s3ObjectListResult = XmlOutput.fromXml(content, S3ObjectList.class);
4347
}
@@ -50,6 +54,14 @@ protected void processResponse() throws IOException {
5054
}
5155
}
5256

57+
public Integer getPagingTruncated() {
58+
return pagingTruncated;
59+
}
60+
61+
public Integer getPagingTotalResultCount() {
62+
return pagingTotalResultCount;
63+
}
64+
5365
public S3ObjectList getS3ObjectListResult() {
5466
return this.s3ObjectListResult;
5567
}

ds3-sdk/src/main/java/com/spectralogic/ds3client/commands/spectrads3/GetUsersSpectraS3Response.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@
2626
public class GetUsersSpectraS3Response extends AbstractResponse {
2727

2828
private SpectraUserList spectraUserListResult;
29+
private Integer pagingTruncated;
30+
private Integer pagingTotalResultCount;
2931

3032
public GetUsersSpectraS3Response(final WebResponse response) throws IOException {
3133
super(response);
@@ -38,6 +40,8 @@ protected void processResponse() throws IOException {
3840

3941
switch (this.getStatusCode()) {
4042
case 200:
43+
this.pagingTruncated = parseIntHeader("page-truncated");
44+
this.pagingTotalResultCount = parseIntHeader("total-result-count");
4145
try (final InputStream content = getResponse().getResponseStream()) {
4246
this.spectraUserListResult = XmlOutput.fromXml(content, SpectraUserList.class);
4347
}
@@ -50,6 +54,14 @@ protected void processResponse() throws IOException {
5054
}
5155
}
5256

57+
public Integer getPagingTruncated() {
58+
return pagingTruncated;
59+
}
60+
61+
public Integer getPagingTotalResultCount() {
62+
return pagingTotalResultCount;
63+
}
64+
5365
public SpectraUserList getSpectraUserListResult() {
5466
return this.spectraUserListResult;
5567
}

ds3-sdk/src/test/java/com/spectralogic/ds3client/Ds3Client_Test.java

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
package com.spectralogic.ds3client;
1717

18+
import com.google.common.collect.ImmutableMap;
1819
import com.google.common.collect.Lists;
1920
import com.google.common.collect.Multimap;
2021
import com.google.common.collect.TreeMultimap;
@@ -204,9 +205,13 @@ public void getObjectsSpectraS3() throws IOException, SignatureException, ParseE
204205
final String stringResponse = "<Data>" +
205206
"<S3Object><BucketId>a24d14f3-e2f0-4bfb-ab71-f99d5ef43745</BucketId><CreationDate>2015-09-21T20:06:47.694Z</CreationDate><Id>e37c3ce0-12aa-4f54-87e3-42532aca0e5e</Id><Name>beowulf.txt</Name><Type>DATA</Type><Version>1</Version></S3Object><S3Object><BucketId>a24d14f3-e2f0-4bfb-ab71-f99d5ef43745</BucketId><CreationDate>2015-09-21T20:06:47.779Z</CreationDate><Id>dc628815-c723-4c4e-b68b-5f5d10f38af5</Id><Name>sherlock_holmes.txt</Name><Type>DATA</Type><Version>1</Version></S3Object><S3Object><BucketId>a24d14f3-e2f0-4bfb-ab71-f99d5ef43745</BucketId><CreationDate>2015-09-21T20:06:47.772Z</CreationDate><Id>4f6985fd-fbae-4421-ba27-66fdb96187c5</Id><Name>tale_of_two_cities.txt</Name><Type>DATA</Type><Version>1</Version></S3Object><S3Object><BucketId>a24d14f3-e2f0-4bfb-ab71-f99d5ef43745</BucketId><CreationDate>2015-09-21T20:06:47.696Z</CreationDate><Id>82c18910-fadb-4461-a152-bf714ae91b55</Id><Name>ulysses.txt</Name><Type>DATA</Type><Version>1</Version></S3Object></Data>";
206207

208+
final ImmutableMap<String, String> responseHeaders = ImmutableMap.of(
209+
"page-truncated", "0",
210+
"total-result-count", "4");
211+
207212
final List<S3Object> objects = MockNetwork
208213
.expecting(HttpVerb.GET, "/_rest_/object", queryParams, null)
209-
.returning(200, stringResponse)
214+
.returning(200, stringResponse, responseHeaders)
210215
.asClient()
211216
.getObjectsDetailsSpectraS3(new GetObjectsDetailsSpectraS3Request().withBucketId(bucketId))
212217
.getS3ObjectListResult()
@@ -233,6 +238,30 @@ public void getObjectsSpectraS3() throws IOException, SignatureException, ParseE
233238
assertThat(s3ObjectExists(objects, notBeowulf), is(false));
234239
}
235240

241+
@Test (expected = IllegalArgumentException.class)
242+
public void getObjectsSpectraS3ParseHeaderException() throws IOException, SignatureException, ParseException {
243+
final Map<String, String> queryParams = new HashMap<>();
244+
final String bucketId = "a24d14f3-e2f0-4bfb-ab71-f99d5ef43745";
245+
queryParams.put("bucket_id", bucketId);
246+
247+
final String stringResponse = "<Data>" +
248+
"<S3Object><BucketId>a24d14f3-e2f0-4bfb-ab71-f99d5ef43745</BucketId><CreationDate>2015-09-21T20:06:47.694Z</CreationDate><Id>e37c3ce0-12aa-4f54-87e3-42532aca0e5e</Id><Name>beowulf.txt</Name><Type>DATA</Type><Version>1</Version></S3Object><S3Object><BucketId>a24d14f3-e2f0-4bfb-ab71-f99d5ef43745</BucketId><CreationDate>2015-09-21T20:06:47.779Z</CreationDate><Id>dc628815-c723-4c4e-b68b-5f5d10f38af5</Id><Name>sherlock_holmes.txt</Name><Type>DATA</Type><Version>1</Version></S3Object><S3Object><BucketId>a24d14f3-e2f0-4bfb-ab71-f99d5ef43745</BucketId><CreationDate>2015-09-21T20:06:47.772Z</CreationDate><Id>4f6985fd-fbae-4421-ba27-66fdb96187c5</Id><Name>tale_of_two_cities.txt</Name><Type>DATA</Type><Version>1</Version></S3Object><S3Object><BucketId>a24d14f3-e2f0-4bfb-ab71-f99d5ef43745</BucketId><CreationDate>2015-09-21T20:06:47.696Z</CreationDate><Id>82c18910-fadb-4461-a152-bf714ae91b55</Id><Name>ulysses.txt</Name><Type>DATA</Type><Version>1</Version></S3Object></Data>";
249+
250+
final ImmutableMap<String, String> responseHeaders = ImmutableMap.of(
251+
"page-truncated", "0",
252+
"page-truncated", "1",
253+
"total-result-count", "4");
254+
255+
MockNetwork
256+
.expecting(HttpVerb.GET, "/_rest_/object", queryParams, null)
257+
.returning(200, stringResponse, responseHeaders)
258+
.asClient()
259+
.getObjectsDetailsSpectraS3(new GetObjectsDetailsSpectraS3Request().withBucketId(bucketId))
260+
.getS3ObjectListResult()
261+
.getS3Objects();
262+
263+
}
264+
236265
private boolean s3ObjectExists(final List<S3Object> objects, final S3Object s3obj) {
237266
for (final S3Object obj : objects) {
238267
if (s3obj.equals(obj)) {

0 commit comments

Comments
 (0)