Skip to content

Commit

Permalink
Migrate to new pagination API
Browse files Browse the repository at this point in the history
  • Loading branch information
paddybyers committed Apr 17, 2015
1 parent 0275671 commit 1b9747f
Show file tree
Hide file tree
Showing 10 changed files with 394 additions and 400 deletions.
39 changes: 22 additions & 17 deletions src/io/ably/http/PaginatedQuery.java
Original file line number Diff line number Diff line change
@@ -1,20 +1,18 @@
package io.ably.http;

import io.ably.http.Http.BodyHandler;
import io.ably.http.Http.ResponseHandler;
import io.ably.types.AblyException;
import io.ably.types.PaginatedResult;
import io.ably.types.Param;

import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import io.ably.http.Http.BodyHandler;
import io.ably.http.Http.ResponseHandler;
import io.ably.types.AblyException;
import io.ably.types.PaginatedResult;
import io.ably.types.Param;

/**
* An object that encapsulates parameters of a REST query with a paginated response
*
Expand Down Expand Up @@ -69,21 +67,19 @@ private ResultPage(T[] contents, String[] linkHeaders) throws AblyException {
}

@Override
public T[] asArray() { return contents; }
public T[] items() { return contents; }

@Override
public List<T> asList() { return Arrays.asList(contents); }
public PaginatedResult<T> first() throws AblyException { return getRel(relFirst); }

@Override
public Param[] getFirst() throws AblyException { return getRel(relFirst); }
public PaginatedResult<T> current() throws AblyException { return getRel(relCurrent); }

@Override
public Param[] getCurrent() throws AblyException { return getRel(relCurrent); }
public PaginatedResult<T> next() throws AblyException { return getRel(relNext); }

@Override
public Param[] getNext() throws AblyException { return getRel(relNext); }

private Param[] getRel(String linkUrl) throws AblyException {
@SuppressWarnings("unchecked")
private PaginatedResult<T> getRel(String linkUrl) throws AblyException {
if(linkUrl == null) return null;
/* we're expecting the format to be ./path-component?name=value&name=value... */
Matcher urlMatch = urlPattern.matcher(linkUrl);
Expand All @@ -96,12 +92,21 @@ private Param[] getRel(String linkUrl) throws AblyException {
params[i] = new Param(split[0], URLDecoder.decode(split[1], "UTF-8"));
}
} catch(UnsupportedEncodingException uee) {}
return params;
return (ResultPage)http.get(path, headers, params, PaginatedQuery.this);
}
throw new AblyException("Unexpected link URL format", 500, 50000);
}

private String relFirst, relCurrent, relNext;

@Override
public boolean hasFirst() { return relFirst != null; }

@Override
public boolean hasCurrent() { return relCurrent != null; }

@Override
public boolean hasNext() { return relNext != null; }
}

@Override
Expand Down
19 changes: 8 additions & 11 deletions src/io/ably/types/PaginatedResult.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
package io.ably.types;

import java.util.List;

/**
* A type that represents a page of results from a paginated query.
* The response is accompanied by metadata that indicates the relative
Expand All @@ -14,17 +12,16 @@ public interface PaginatedResult<T> {
/**
* Get the contents as an array of component type
*/
public T[] asArray();

/**
* Get the contents as an list of component type
*/
public List<T> asList();
public T[] items();

/**
* Obtain params required to perform the given relative query
*/
public abstract Param[] getFirst() throws AblyException;
public abstract Param[] getCurrent() throws AblyException;
public abstract Param[] getNext() throws AblyException;
public abstract PaginatedResult<T> first() throws AblyException;
public abstract PaginatedResult<T> current() throws AblyException;
public abstract PaginatedResult<T> next() throws AblyException;

public abstract boolean hasFirst();
public abstract boolean hasCurrent();
public abstract boolean hasNext();
}
178 changes: 89 additions & 89 deletions test/io/ably/test/realtime/RealtimeChannelHistory.java

Large diffs are not rendered by default.

24 changes: 12 additions & 12 deletions test/io/ably/test/realtime/RealtimePresence.java
Original file line number Diff line number Diff line change
Expand Up @@ -982,7 +982,7 @@ public void rest_get_simple() {
assertTrue("Verify enter callback called on completion", enterComplete.success);

/* get presence set and verify client present */
PresenceMessage[] presences = restPresenceChannel.presence.get(null).asArray();
PresenceMessage[] presences = restPresenceChannel.presence.get(null).items();
PresenceMessage expectedPresent = contains(presences, testClientId1, Action.PRESENT);
assertNotNull("Verify expected client is in presence set", expectedPresent);
assertEquals(expectedPresent.data, enterString);
Expand Down Expand Up @@ -1041,7 +1041,7 @@ public void rest_get_leave() {
assertTrue("Verify leave callback called on completion", leaveComplete.success);

/* get presence set and verify client absent */
PresenceMessage[] presences = restPresenceChannel.presence.get(null).asArray();
PresenceMessage[] presences = restPresenceChannel.presence.get(null).items();
assertNull("Verify expected client is in presence set", contains(presences, testClientId1));

} catch(AblyException e) {
Expand Down Expand Up @@ -1099,7 +1099,7 @@ public void rest_enter_multiple() {
assertTrue("Verify enter callback called on completion", enter2Complete.success);

/* get presence set and verify client present */
PresenceMessage[] presences = restPresenceChannel.presence.get(null).asArray();
PresenceMessage[] presences = restPresenceChannel.presence.get(null).items();
PresenceMessage expectedPresent1 = contains(presences, testClientId1, Action.PRESENT);
PresenceMessage expectedPresent2 = contains(presences, testClientId2, Action.PRESENT);
assertNotNull("Verify expected clients are in presence set", expectedPresent1);
Expand Down Expand Up @@ -1156,38 +1156,38 @@ public void rest_paginated_get() {
HashMap<String, PresenceMessage> memberIndex = new HashMap<String, PresenceMessage>();
PaginatedResult<PresenceMessage> members = restPresenceChannel.presence.get(new Param[] { new Param("limit", "10") });
assertNotNull("Expected non-null messages", members);
assertEquals("Expected 10 messages", members.asArray().length, 10);
assertEquals("Expected 10 messages", members.items().length, 10);

/* index received messages */
for(int i = 0; i < 10; i++) {
PresenceMessage member = members.asArray()[i];
PresenceMessage member = members.items()[i];
memberIndex.put(member.clientId, member);
}

/* get next page */
members = restPresenceChannel.presence.get(members.getNext());
members = members.next();
assertNotNull("Expected non-null messages", members);
assertEquals("Expected 10 messages", members.asArray().length, 10);
assertEquals("Expected 10 messages", members.items().length, 10);

/* index received messages */
for(int i = 0; i < 10; i++) {
PresenceMessage member = members.asArray()[i];
PresenceMessage member = members.items()[i];
memberIndex.put(member.clientId, member);
}

/* get next page */
members = restPresenceChannel.presence.get(members.getNext());
members = members.next();
assertNotNull("Expected non-null messages", members);
assertEquals("Expected 10 messages", members.asArray().length, 10);
assertEquals("Expected 10 messages", members.items().length, 10);

/* index received messages */
for(int i = 0; i < 10; i++) {
PresenceMessage member = members.asArray()[i];
PresenceMessage member = members.items()[i];
memberIndex.put(member.clientId, member);
}

/* verify there is no next page */
assertNull("Expected null next page", members.getNext());
assertFalse("Expected null next page", members.hasNext());

/* verify that all clientIds were received */
assertEquals("Expected " + clientCount + " members", memberIndex.size(), clientCount);
Expand Down
Loading

1 comment on commit 1b9747f

@mattheworiordan
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice

Please sign in to comment.