Paging Bug fix and Junit updated.

BUG : feedResponse.getResponseContinuation(); used to throw NullPointerException. Hence continuation token could not be used to fetch subsequent pages.

Sample code:

FeedOptions options = new FeedOptions();
              options.setPageSize(5);
              FeedResponse<Document> feedResponse;
              Iterator<Document> iterator;
              int i;
              String continuationToken = null;
              
              System.out.println("REQUEST : 1");
              feedResponse = client.queryDocuments(collectionLink, "SELECT r.id FROM root r", options);
              iterator = feedResponse.getQueryIterator();
              i = 0;
              while (iterator.hasNext()) {
                     i++;
                     System.out.println(iterator.next());
                     if (i == 5) {
                           break;
                     }
              }
              
              continuationToken = feedResponse.getResponseContinuation();
              System.out.println("TOKEN : " + continuationToken);
              options.setRequestContinuation(continuationToken);
              
              System.out.println("REQUEST : 2");
              feedResponse = client.queryDocuments(collectionLink, "SELECT r.id FROM root r", options);
              iterator = feedResponse.getQueryIterator();
              i = 0;
              while (iterator.hasNext()) {
                     i++;
                     System.out.println(iterator.next());
                     if (i == 5) {
                           break;
                     }
              }

Exception Stack trace:

java.lang.NullPointerException
at com.microsoft.azure.documentdb.FeedResponse.getResponseContinuation(FeedResponse.java:222)
at com.microsoft.azure.documentdb.test.GatewayTests.testQueryIterableCrud(GatewayTests.java:289)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
It's OK to add a getContinuation method to QueryIterable, if you think it's useful for you.

But here to be consistent, please use QueryIterable's existing getResponseHeaders() method and apply this change to other getters of FeedResponse. getActivityId(), getSessionToken() etc.  The definition and references to this.responseHeaders then can be completely removed.


public String getResponseContinuation() {
    return FeedResponse.getValueOrNull(
            this.inner.getResponseHeaders(), HttpConstants.HttpHeaders.CONTINUATION);
}

private static String getValueOrNull(Map<String, String> map, String key) {
    if (map != null) {
      return map.get(key);
    }
    return null;
}