From 2ad97a9a9a36516dca1780fa5952de48efd5621b Mon Sep 17 00:00:00 2001 From: paolobiavati Date: Fri, 9 Jan 2015 21:25:40 +0000 Subject: [PATCH 1/6] age_range field management MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit age_range comes as part of the public_profile permission, it indicates unspecific age range that this person's age fits into. values: min-max: (13-17 / 18-20 / 21-null) usage: Facebook facebook = new FacebookFactory().getInstance(); facebook.setOAuthAccessToken(new AccessToken(facebookToken, null)); User me = facebook.getMe(new Reading().fields(new String[] {“age_range”, "birthday", "email", … })); --- .../src/main/java/facebook4j/User.java | 8 +++ .../internal/json/UserJSONImpl.java | 62 ++++++++++++++++++- 2 files changed, 69 insertions(+), 1 deletion(-) diff --git a/facebook4j-core/src/main/java/facebook4j/User.java b/facebook4j-core/src/main/java/facebook4j/User.java index af9aba1d..b759d22d 100644 --- a/facebook4j-core/src/main/java/facebook4j/User.java +++ b/facebook4j-core/src/main/java/facebook4j/User.java @@ -60,6 +60,7 @@ public interface User { User.VideoUploadLimits getVideoUploadLimits(); URL getWebsite(); List getWork(); + User.AgeRange getAgeRange(); interface Education { IdNameEntity getYear(); @@ -90,6 +91,13 @@ interface Work { } + interface AgeRange { + // one value could be null (13-17 / 18-20 / 21 - null) + Long getMin(); + Long getMax(); + + } + String BIRTHDAY_DATE_FORMAT = "MM/dd/yyyy"; diff --git a/facebook4j-core/src/main/java/facebook4j/internal/json/UserJSONImpl.java b/facebook4j-core/src/main/java/facebook4j/internal/json/UserJSONImpl.java index 019ed40d..4f0aef5d 100644 --- a/facebook4j-core/src/main/java/facebook4j/internal/json/UserJSONImpl.java +++ b/facebook4j-core/src/main/java/facebook4j/internal/json/UserJSONImpl.java @@ -80,6 +80,7 @@ private User.VideoUploadLimits videoUploadLimits; private URL website; private List work; + private User.AgeRange ageRange; /*package*/UserJSONImpl(HttpResponse res, Configuration conf) throws FacebookException { if (conf.isJSONStoreEnabled()) { @@ -220,6 +221,10 @@ private void init(JSONObject json) throws FacebookException { } else { work = Collections.emptyList(); } + if (!json.isNull("age_range")) { + JSONObject ageRangeJSONObject = json.getJSONObject("age_range"); + ageRange = new AgeRangeJSONImpl(ageRangeJSONObject); + } } catch (JSONException jsone) { throw new FacebookException(jsone.getMessage() + ":" + json.toString(), jsone); } @@ -361,6 +366,10 @@ public List getWork() { return work; } + public User.AgeRange getAgeRange() { + return ageRange; + } + /*package*/ static ResponseList createUserList(HttpResponse res, Configuration conf) throws FacebookException { try { @@ -452,7 +461,7 @@ public String toString() { + relationshipStatus + ", religion=" + religion + ", significantOther=" + significantOther + ", videoUploadLimits=" + videoUploadLimits + ", website=" - + website + ", work=" + work + "]"; + + website + ", work=" + work + ", ageRange=" + ageRange + "]"; } @@ -857,4 +866,55 @@ public String toString() { } } + private final class AgeRangeJSONImpl implements User.AgeRange, java.io.Serializable { + private static final long serialVersionUID = -4890967721976343047L; + + private final Long min; + private final Long max; + + AgeRangeJSONImpl(JSONObject json) throws FacebookException { + min = getLong("min", json); + max = getLong("max", json); + } + + public Long getMin() { + return min; + } + + public Long getMax() { + return max; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + (int) (min ^ (min >>> 32)); + result = prime * result + (int) (max ^ (max >>> 32)); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + AgeRangeJSONImpl other = (AgeRangeJSONImpl) obj; + if (min != other.min) + return false; + if (max != other.max) + return false; + return true; + } + + @Override + public String toString() { + return "AgeRangeJSONImpl [min=" + min + ", max=" + max + + "]"; + } + } + } From 56bc63011e479c4e22b1d947b637210582f65c9d Mon Sep 17 00:00:00 2001 From: paolobiavati Date: Sun, 11 Jan 2015 02:16:02 +0000 Subject: [PATCH 2/6] getTestUsers implementation to manage paging new version of method getTestUsers /** * Returns test users associated with a particular app. * This method manage paging, call facebook.fetchNext to get next page * @param appId the ID of the app * @param limit number of elements per page (can be null to use default page size) * @return Test Users first page * @throws FacebookException when Facebook service or network is unavailable * @see Test Users - Facebook Developers */ ResponseList getTestUsers(String appId, Integer limit) throws FacebookException; usage: ResponseList testUsersResponseList = facebook.getTestUsers(appId, limit); Paging paging = testUsersResponseList.getPaging(); testUsersResponseList = facebook.fetchNext(paging); --- .../main/java/facebook4j/FacebookImpl.java | 6 ++++ .../java/facebook4j/api/TestUserMethods.java | 14 ++++++++ .../internal/json/TestUserJSONImpl.java | 34 +++++++++++++++++++ .../internal/json/z_F4JInternalFactory.java | 2 ++ .../json/z_F4JInternalJSONImplFactory.java | 7 ++++ 5 files changed, 63 insertions(+) diff --git a/facebook4j-core/src/main/java/facebook4j/FacebookImpl.java b/facebook4j-core/src/main/java/facebook4j/FacebookImpl.java index 8e183d84..0c095afb 100644 --- a/facebook4j-core/src/main/java/facebook4j/FacebookImpl.java +++ b/facebook4j-core/src/main/java/facebook4j/FacebookImpl.java @@ -2357,6 +2357,12 @@ public List getTestUsers(String appId) throws FacebookException { throw new FacebookException(jsone.getMessage(), jsone); } } + + public ResponseList getTestUsers(String appId, Integer limit) throws FacebookException { + ensureAuthorizationEnabled(); + HttpResponse res = get(conf.getRestBaseURL() + appId + "/accounts/test-users"+(limit != null? "?limit=" + limit : "")); + return factory.createTestUserList(res); + } public boolean deleteTestUser(String testUserId) throws FacebookException { ensureAuthorizationEnabled(); diff --git a/facebook4j-core/src/main/java/facebook4j/api/TestUserMethods.java b/facebook4j-core/src/main/java/facebook4j/api/TestUserMethods.java index 488bed42..88db82c1 100644 --- a/facebook4j-core/src/main/java/facebook4j/api/TestUserMethods.java +++ b/facebook4j-core/src/main/java/facebook4j/api/TestUserMethods.java @@ -19,6 +19,7 @@ import java.util.List; import facebook4j.FacebookException; +import facebook4j.ResponseList; import facebook4j.TestUser; /** @@ -49,6 +50,7 @@ public interface TestUserMethods { /** * Returns test users associated with a particular app. + * This method can't manage paging * @param appId the ID of the app * @return Test Users * @throws FacebookException when Facebook service or network is unavailable @@ -57,6 +59,18 @@ public interface TestUserMethods { List getTestUsers(String appId) throws FacebookException; + /** + * Returns test users associated with a particular app. + * This method manage paging, call facebook.fetchNext to get next page + * @param appId the ID of the app + * @param limit number of elements per page (can be null to use default page size) + * @return Test Users first page + * @throws FacebookException when Facebook service or network is unavailable + * @see Test Users - Facebook Developers + */ + ResponseList getTestUsers(String appId, Integer limit) throws FacebookException; + + /** * Deletes the test user. * @param testUserId the ID of the test user diff --git a/facebook4j-core/src/main/java/facebook4j/internal/json/TestUserJSONImpl.java b/facebook4j-core/src/main/java/facebook4j/internal/json/TestUserJSONImpl.java index 7d65f791..4b9e35af 100644 --- a/facebook4j-core/src/main/java/facebook4j/internal/json/TestUserJSONImpl.java +++ b/facebook4j-core/src/main/java/facebook4j/internal/json/TestUserJSONImpl.java @@ -18,8 +18,13 @@ import static facebook4j.internal.util.z_F4JInternalParseUtil.getRawString; import facebook4j.FacebookException; +import facebook4j.Interest; +import facebook4j.ResponseList; import facebook4j.TestUser; +import facebook4j.conf.Configuration; import facebook4j.internal.http.HttpResponse; +import facebook4j.internal.org.json.JSONArray; +import facebook4j.internal.org.json.JSONException; import facebook4j.internal.org.json.JSONObject; /** @@ -45,6 +50,35 @@ init(json); } + /*package*/ + static ResponseList createTestUserList(HttpResponse res, Configuration conf) throws FacebookException { + try { + if (conf.isJSONStoreEnabled()) { + DataObjectFactoryUtil.clearThreadLocalMap(); + } + JSONObject json = res.asJSONObject(); + JSONArray list = json.getJSONArray("data"); + final int size = list.length(); + ResponseList testUsers = new ResponseListImpl(size, json); + for (int i = 0; i < size; i++) { + JSONObject testUserJSONObject = list.getJSONObject(i); + TestUser testUser = new TestUserJSONImpl(testUserJSONObject); + if (conf.isJSONStoreEnabled()) { + DataObjectFactoryUtil.registerJSONObject(testUser, testUserJSONObject); + } + testUsers.add(testUser); + } + if (conf.isJSONStoreEnabled()) { + DataObjectFactoryUtil.registerJSONObject(testUsers, list); + } + return testUsers; + } catch (JSONException jsone) { + throw new FacebookException(jsone); + } + } + + + private void init(JSONObject json) throws FacebookException { id = getRawString("id", json); accessToken = getRawString("access_token", json); diff --git a/facebook4j-core/src/main/java/facebook4j/internal/json/z_F4JInternalFactory.java b/facebook4j-core/src/main/java/facebook4j/internal/json/z_F4JInternalFactory.java index 4f9b5417..ccf5d4bd 100644 --- a/facebook4j-core/src/main/java/facebook4j/internal/json/z_F4JInternalFactory.java +++ b/facebook4j-core/src/main/java/facebook4j/internal/json/z_F4JInternalFactory.java @@ -209,6 +209,8 @@ public interface z_F4JInternalFactory extends java.io.Serializable { TestUser createTestUser(JSONObject json) throws FacebookException; + ResponseList createTestUserList(HttpResponse res) throws FacebookException; + ResponseList createJSONObjectList(HttpResponse res) throws FacebookException; ResponseList createJSONObjectList(JSONObject json) throws FacebookException; diff --git a/facebook4j-core/src/main/java/facebook4j/internal/json/z_F4JInternalJSONImplFactory.java b/facebook4j-core/src/main/java/facebook4j/internal/json/z_F4JInternalJSONImplFactory.java index 442f157d..0eae2394 100644 --- a/facebook4j-core/src/main/java/facebook4j/internal/json/z_F4JInternalJSONImplFactory.java +++ b/facebook4j-core/src/main/java/facebook4j/internal/json/z_F4JInternalJSONImplFactory.java @@ -386,6 +386,10 @@ public TestUser createTestUser(JSONObject json) throws FacebookException { return new TestUserJSONImpl(json); } + public ResponseList createTestUserList(HttpResponse res) throws FacebookException { + return TestUserJSONImpl.createTestUserList(res, conf); + } + public ResponseList createJSONObjectList(HttpResponse res) throws FacebookException { return ResponseListImpl.createJSONObjectList(res, conf); } @@ -565,6 +569,9 @@ public ResponseList createResponseList(HttpResponse res, Class jsonObj if (jsonObjectType == Offer.class) { return (ResponseList) createOfferList(res); } + if (jsonObjectType == TestUser.class) { + return (ResponseList) createTestUserList(res); + } if (jsonObjectType == JSONObject.class) { return (ResponseList) createJSONObjectList(res); } From 81c9e215ebb4d3368d06833b20dabed98f3dffce Mon Sep 17 00:00:00 2001 From: paolobiavati Date: Mon, 12 Jan 2015 23:03:12 +0000 Subject: [PATCH 3/6] Revert 2ad97a9..56bc630 This rolls back to commit 2ad97a9a9a36516dca1780fa5952de48efd5621b. --- .../main/java/facebook4j/FacebookImpl.java | 6 ---- .../java/facebook4j/api/TestUserMethods.java | 14 -------- .../internal/json/TestUserJSONImpl.java | 34 ------------------- .../internal/json/z_F4JInternalFactory.java | 2 -- .../json/z_F4JInternalJSONImplFactory.java | 7 ---- 5 files changed, 63 deletions(-) diff --git a/facebook4j-core/src/main/java/facebook4j/FacebookImpl.java b/facebook4j-core/src/main/java/facebook4j/FacebookImpl.java index 0c095afb..8e183d84 100644 --- a/facebook4j-core/src/main/java/facebook4j/FacebookImpl.java +++ b/facebook4j-core/src/main/java/facebook4j/FacebookImpl.java @@ -2357,12 +2357,6 @@ public List getTestUsers(String appId) throws FacebookException { throw new FacebookException(jsone.getMessage(), jsone); } } - - public ResponseList getTestUsers(String appId, Integer limit) throws FacebookException { - ensureAuthorizationEnabled(); - HttpResponse res = get(conf.getRestBaseURL() + appId + "/accounts/test-users"+(limit != null? "?limit=" + limit : "")); - return factory.createTestUserList(res); - } public boolean deleteTestUser(String testUserId) throws FacebookException { ensureAuthorizationEnabled(); diff --git a/facebook4j-core/src/main/java/facebook4j/api/TestUserMethods.java b/facebook4j-core/src/main/java/facebook4j/api/TestUserMethods.java index 88db82c1..488bed42 100644 --- a/facebook4j-core/src/main/java/facebook4j/api/TestUserMethods.java +++ b/facebook4j-core/src/main/java/facebook4j/api/TestUserMethods.java @@ -19,7 +19,6 @@ import java.util.List; import facebook4j.FacebookException; -import facebook4j.ResponseList; import facebook4j.TestUser; /** @@ -50,7 +49,6 @@ public interface TestUserMethods { /** * Returns test users associated with a particular app. - * This method can't manage paging * @param appId the ID of the app * @return Test Users * @throws FacebookException when Facebook service or network is unavailable @@ -59,18 +57,6 @@ public interface TestUserMethods { List getTestUsers(String appId) throws FacebookException; - /** - * Returns test users associated with a particular app. - * This method manage paging, call facebook.fetchNext to get next page - * @param appId the ID of the app - * @param limit number of elements per page (can be null to use default page size) - * @return Test Users first page - * @throws FacebookException when Facebook service or network is unavailable - * @see Test Users - Facebook Developers - */ - ResponseList getTestUsers(String appId, Integer limit) throws FacebookException; - - /** * Deletes the test user. * @param testUserId the ID of the test user diff --git a/facebook4j-core/src/main/java/facebook4j/internal/json/TestUserJSONImpl.java b/facebook4j-core/src/main/java/facebook4j/internal/json/TestUserJSONImpl.java index 4b9e35af..7d65f791 100644 --- a/facebook4j-core/src/main/java/facebook4j/internal/json/TestUserJSONImpl.java +++ b/facebook4j-core/src/main/java/facebook4j/internal/json/TestUserJSONImpl.java @@ -18,13 +18,8 @@ import static facebook4j.internal.util.z_F4JInternalParseUtil.getRawString; import facebook4j.FacebookException; -import facebook4j.Interest; -import facebook4j.ResponseList; import facebook4j.TestUser; -import facebook4j.conf.Configuration; import facebook4j.internal.http.HttpResponse; -import facebook4j.internal.org.json.JSONArray; -import facebook4j.internal.org.json.JSONException; import facebook4j.internal.org.json.JSONObject; /** @@ -50,35 +45,6 @@ init(json); } - /*package*/ - static ResponseList createTestUserList(HttpResponse res, Configuration conf) throws FacebookException { - try { - if (conf.isJSONStoreEnabled()) { - DataObjectFactoryUtil.clearThreadLocalMap(); - } - JSONObject json = res.asJSONObject(); - JSONArray list = json.getJSONArray("data"); - final int size = list.length(); - ResponseList testUsers = new ResponseListImpl(size, json); - for (int i = 0; i < size; i++) { - JSONObject testUserJSONObject = list.getJSONObject(i); - TestUser testUser = new TestUserJSONImpl(testUserJSONObject); - if (conf.isJSONStoreEnabled()) { - DataObjectFactoryUtil.registerJSONObject(testUser, testUserJSONObject); - } - testUsers.add(testUser); - } - if (conf.isJSONStoreEnabled()) { - DataObjectFactoryUtil.registerJSONObject(testUsers, list); - } - return testUsers; - } catch (JSONException jsone) { - throw new FacebookException(jsone); - } - } - - - private void init(JSONObject json) throws FacebookException { id = getRawString("id", json); accessToken = getRawString("access_token", json); diff --git a/facebook4j-core/src/main/java/facebook4j/internal/json/z_F4JInternalFactory.java b/facebook4j-core/src/main/java/facebook4j/internal/json/z_F4JInternalFactory.java index ccf5d4bd..4f9b5417 100644 --- a/facebook4j-core/src/main/java/facebook4j/internal/json/z_F4JInternalFactory.java +++ b/facebook4j-core/src/main/java/facebook4j/internal/json/z_F4JInternalFactory.java @@ -209,8 +209,6 @@ public interface z_F4JInternalFactory extends java.io.Serializable { TestUser createTestUser(JSONObject json) throws FacebookException; - ResponseList createTestUserList(HttpResponse res) throws FacebookException; - ResponseList createJSONObjectList(HttpResponse res) throws FacebookException; ResponseList createJSONObjectList(JSONObject json) throws FacebookException; diff --git a/facebook4j-core/src/main/java/facebook4j/internal/json/z_F4JInternalJSONImplFactory.java b/facebook4j-core/src/main/java/facebook4j/internal/json/z_F4JInternalJSONImplFactory.java index 0eae2394..442f157d 100644 --- a/facebook4j-core/src/main/java/facebook4j/internal/json/z_F4JInternalJSONImplFactory.java +++ b/facebook4j-core/src/main/java/facebook4j/internal/json/z_F4JInternalJSONImplFactory.java @@ -386,10 +386,6 @@ public TestUser createTestUser(JSONObject json) throws FacebookException { return new TestUserJSONImpl(json); } - public ResponseList createTestUserList(HttpResponse res) throws FacebookException { - return TestUserJSONImpl.createTestUserList(res, conf); - } - public ResponseList createJSONObjectList(HttpResponse res) throws FacebookException { return ResponseListImpl.createJSONObjectList(res, conf); } @@ -569,9 +565,6 @@ public ResponseList createResponseList(HttpResponse res, Class jsonObj if (jsonObjectType == Offer.class) { return (ResponseList) createOfferList(res); } - if (jsonObjectType == TestUser.class) { - return (ResponseList) createTestUserList(res); - } if (jsonObjectType == JSONObject.class) { return (ResponseList) createJSONObjectList(res); } From 0ccdfe05a2f357d416386530710bec2501047156 Mon Sep 17 00:00:00 2001 From: paolobiavati Date: Tue, 13 Jan 2015 00:10:26 +0000 Subject: [PATCH 4/6] Test for age_range test for age_range support --- .../src/test/java/facebook4j/UserMethodsTest.java | 6 +++++- .../src/test/resources/mock_json/user/me_fields.json | 1 + 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/facebook4j-core/src/test/java/facebook4j/UserMethodsTest.java b/facebook4j-core/src/test/java/facebook4j/UserMethodsTest.java index 12083b89..0d1382f6 100644 --- a/facebook4j-core/src/test/java/facebook4j/UserMethodsTest.java +++ b/facebook4j-core/src/test/java/facebook4j/UserMethodsTest.java @@ -85,7 +85,7 @@ public void me() throws Exception { @Test public void reading() throws Exception { facebook.setMockJSON("mock_json/user/me_fields.json"); - User me = facebook.getMe(new Reading().fields("gender").fields("email")); + User me = facebook.getMe(new Reading().fields("gender").fields("email").fields("age_range")); assertThat(me.getGender(), is("male")); assertThat(me.getEmail(), is("roundrop@gmail.com")); @@ -94,6 +94,10 @@ public void reading() throws Exception { assertThat(me.getBirthday(), is(nullValue())); assertThat(me.getEducation().size(), is(0)); assertThat(me.getHometown(), is(nullValue())); + + assertThat(me.getAgeRange().getMin(), is(17L)); + assertThat(me.getAgeRange().getMax(), is(20L)); + } } diff --git a/facebook4j-core/src/test/resources/mock_json/user/me_fields.json b/facebook4j-core/src/test/resources/mock_json/user/me_fields.json index f94b1199..c4962bbf 100644 --- a/facebook4j-core/src/test/resources/mock_json/user/me_fields.json +++ b/facebook4j-core/src/test/resources/mock_json/user/me_fields.json @@ -2,4 +2,5 @@ "gender": "male", "email": "roundrop@gmail.com", "id": "6666", + "age_range":{"min": 17,"max": 20}, } \ No newline at end of file From cbf648c797c02fc1e352cdd7a8c8848dfadd76bf Mon Sep 17 00:00:00 2001 From: paolobiavati Date: Tue, 13 Jan 2015 01:04:43 +0000 Subject: [PATCH 5/6] getTestUsers implementation to manage paging new version of method getTestUsers (include test: TestUserMethods) /** * Returns test users associated with a particular app. * This method manage paging, call facebook.fetchNext to get next page * @param appId the ID of the app * @param limit number of elements per page (can be null to use default page size) * @return Test Users first page * @throws FacebookException when Facebook service or network is unavailable * @see Test Users - Facebook Developers */ ResponseList getTestUsers(String appId, Integer limit) throws FacebookException; usage: ResponseList testUsersResponseList = facebook.getTestUsers(appId, limit); Paging paging = testUsersResponseList.getPaging(); testUsersResponseList = facebook.fetchNext(paging); --- .../main/java/facebook4j/FacebookImpl.java | 7 ++ .../java/facebook4j/api/TestUserMethods.java | 13 ++++ .../internal/json/TestUserJSONImpl.java | 34 ++++++++++ .../internal/json/z_F4JInternalFactory.java | 2 + .../json/z_F4JInternalJSONImplFactory.java | 7 ++ .../java/facebook4j/TestUserMethodsTest.java | 65 +++++++++++++++++++ .../resources/mock_json/testUser/page1.json | 36 ++++++++++ .../resources/mock_json/testUser/page2.json | 37 +++++++++++ .../resources/mock_json/testUser/page3.json | 26 ++++++++ 9 files changed, 227 insertions(+) create mode 100644 facebook4j-core/src/test/java/facebook4j/TestUserMethodsTest.java create mode 100644 facebook4j-core/src/test/resources/mock_json/testUser/page1.json create mode 100644 facebook4j-core/src/test/resources/mock_json/testUser/page2.json create mode 100644 facebook4j-core/src/test/resources/mock_json/testUser/page3.json diff --git a/facebook4j-core/src/main/java/facebook4j/FacebookImpl.java b/facebook4j-core/src/main/java/facebook4j/FacebookImpl.java index 8e183d84..73fd3522 100644 --- a/facebook4j-core/src/main/java/facebook4j/FacebookImpl.java +++ b/facebook4j-core/src/main/java/facebook4j/FacebookImpl.java @@ -2358,6 +2358,13 @@ public List getTestUsers(String appId) throws FacebookException { } } + + public ResponseList getTestUsers(String appId, Integer limit) throws FacebookException { + ensureAuthorizationEnabled(); + HttpResponse res = get(conf.getRestBaseURL() + appId + "/accounts/test-users"+(limit != null? "?limit=" + limit : "")); + return factory.createTestUserList(res); + } + public boolean deleteTestUser(String testUserId) throws FacebookException { ensureAuthorizationEnabled(); HttpResponse res = delete(conf.getRestBaseURL() + testUserId); diff --git a/facebook4j-core/src/main/java/facebook4j/api/TestUserMethods.java b/facebook4j-core/src/main/java/facebook4j/api/TestUserMethods.java index 488bed42..166a6e61 100644 --- a/facebook4j-core/src/main/java/facebook4j/api/TestUserMethods.java +++ b/facebook4j-core/src/main/java/facebook4j/api/TestUserMethods.java @@ -19,6 +19,7 @@ import java.util.List; import facebook4j.FacebookException; +import facebook4j.ResponseList; import facebook4j.TestUser; /** @@ -49,6 +50,7 @@ public interface TestUserMethods { /** * Returns test users associated with a particular app. + * This method can't manage paging * @param appId the ID of the app * @return Test Users * @throws FacebookException when Facebook service or network is unavailable @@ -57,6 +59,17 @@ public interface TestUserMethods { List getTestUsers(String appId) throws FacebookException; + /** + * Returns test users associated with a particular app. + * This method manage paging, call facebook.fetchNext to get next page + * @param appId the ID of the app + * @param limit number of elements per page (can be null to use default page size) + * @return Test Users first page + * @throws FacebookException when Facebook service or network is unavailable + * @see Test Users - Facebook Developers + */ + ResponseList getTestUsers(String appId, Integer limit) throws FacebookException; + /** * Deletes the test user. * @param testUserId the ID of the test user diff --git a/facebook4j-core/src/main/java/facebook4j/internal/json/TestUserJSONImpl.java b/facebook4j-core/src/main/java/facebook4j/internal/json/TestUserJSONImpl.java index 7d65f791..4b9e35af 100644 --- a/facebook4j-core/src/main/java/facebook4j/internal/json/TestUserJSONImpl.java +++ b/facebook4j-core/src/main/java/facebook4j/internal/json/TestUserJSONImpl.java @@ -18,8 +18,13 @@ import static facebook4j.internal.util.z_F4JInternalParseUtil.getRawString; import facebook4j.FacebookException; +import facebook4j.Interest; +import facebook4j.ResponseList; import facebook4j.TestUser; +import facebook4j.conf.Configuration; import facebook4j.internal.http.HttpResponse; +import facebook4j.internal.org.json.JSONArray; +import facebook4j.internal.org.json.JSONException; import facebook4j.internal.org.json.JSONObject; /** @@ -45,6 +50,35 @@ init(json); } + /*package*/ + static ResponseList createTestUserList(HttpResponse res, Configuration conf) throws FacebookException { + try { + if (conf.isJSONStoreEnabled()) { + DataObjectFactoryUtil.clearThreadLocalMap(); + } + JSONObject json = res.asJSONObject(); + JSONArray list = json.getJSONArray("data"); + final int size = list.length(); + ResponseList testUsers = new ResponseListImpl(size, json); + for (int i = 0; i < size; i++) { + JSONObject testUserJSONObject = list.getJSONObject(i); + TestUser testUser = new TestUserJSONImpl(testUserJSONObject); + if (conf.isJSONStoreEnabled()) { + DataObjectFactoryUtil.registerJSONObject(testUser, testUserJSONObject); + } + testUsers.add(testUser); + } + if (conf.isJSONStoreEnabled()) { + DataObjectFactoryUtil.registerJSONObject(testUsers, list); + } + return testUsers; + } catch (JSONException jsone) { + throw new FacebookException(jsone); + } + } + + + private void init(JSONObject json) throws FacebookException { id = getRawString("id", json); accessToken = getRawString("access_token", json); diff --git a/facebook4j-core/src/main/java/facebook4j/internal/json/z_F4JInternalFactory.java b/facebook4j-core/src/main/java/facebook4j/internal/json/z_F4JInternalFactory.java index 4f9b5417..ccf5d4bd 100644 --- a/facebook4j-core/src/main/java/facebook4j/internal/json/z_F4JInternalFactory.java +++ b/facebook4j-core/src/main/java/facebook4j/internal/json/z_F4JInternalFactory.java @@ -209,6 +209,8 @@ public interface z_F4JInternalFactory extends java.io.Serializable { TestUser createTestUser(JSONObject json) throws FacebookException; + ResponseList createTestUserList(HttpResponse res) throws FacebookException; + ResponseList createJSONObjectList(HttpResponse res) throws FacebookException; ResponseList createJSONObjectList(JSONObject json) throws FacebookException; diff --git a/facebook4j-core/src/main/java/facebook4j/internal/json/z_F4JInternalJSONImplFactory.java b/facebook4j-core/src/main/java/facebook4j/internal/json/z_F4JInternalJSONImplFactory.java index 442f157d..0eae2394 100644 --- a/facebook4j-core/src/main/java/facebook4j/internal/json/z_F4JInternalJSONImplFactory.java +++ b/facebook4j-core/src/main/java/facebook4j/internal/json/z_F4JInternalJSONImplFactory.java @@ -386,6 +386,10 @@ public TestUser createTestUser(JSONObject json) throws FacebookException { return new TestUserJSONImpl(json); } + public ResponseList createTestUserList(HttpResponse res) throws FacebookException { + return TestUserJSONImpl.createTestUserList(res, conf); + } + public ResponseList createJSONObjectList(HttpResponse res) throws FacebookException { return ResponseListImpl.createJSONObjectList(res, conf); } @@ -565,6 +569,9 @@ public ResponseList createResponseList(HttpResponse res, Class jsonObj if (jsonObjectType == Offer.class) { return (ResponseList) createOfferList(res); } + if (jsonObjectType == TestUser.class) { + return (ResponseList) createTestUserList(res); + } if (jsonObjectType == JSONObject.class) { return (ResponseList) createJSONObjectList(res); } diff --git a/facebook4j-core/src/test/java/facebook4j/TestUserMethodsTest.java b/facebook4j-core/src/test/java/facebook4j/TestUserMethodsTest.java new file mode 100644 index 00000000..76ffe3ad --- /dev/null +++ b/facebook4j-core/src/test/java/facebook4j/TestUserMethodsTest.java @@ -0,0 +1,65 @@ +/* + * Copyright 2012 Ryuji Yamashita + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package facebook4j; + +import facebook4j.internal.http.RequestMethod; + +import org.junit.Test; +import org.junit.experimental.runners.Enclosed; +import org.junit.runner.RunWith; + +import java.net.URL; +import java.util.List; +import java.util.Locale; + +import static facebook4j.junit.ISO8601DateMatchers.*; +import static facebook4j.junit.URLMatchers.*; +import static org.hamcrest.CoreMatchers.*; +import static org.junit.Assert.*; + +@RunWith(Enclosed.class) +public class TestUserMethodsTest extends MockFacebookTestBase { + + public static class getTestUsers extends MockFacebookTestBase { + @Test + public void me() throws Exception { + int page = 1; + facebook.setMockJSON("mock_json/testUser/page" + page + ".json"); + + ResponseList testUsersResponseList = facebook.getTestUsers("appId_XXXXXXXXXXXX", 10); + while (testUsersResponseList != null && testUsersResponseList.size() > 0) { + for (TestUser u : testUsersResponseList) { + assertNotNull(u.getId()); + assertNotNull(u.getAccessToken()); + } + if (testUsersResponseList != null) { + Paging paging = testUsersResponseList.getPaging(); + if (paging != null && paging.getNext() != null) { + facebook.setMockJSON("mock_json/testUser/page" + ++page + ".json"); + testUsersResponseList = facebook.fetchNext(paging); + } else { + testUsersResponseList = null; + } + } + + } + + } + + } + +} diff --git a/facebook4j-core/src/test/resources/mock_json/testUser/page1.json b/facebook4j-core/src/test/resources/mock_json/testUser/page1.json new file mode 100644 index 00000000..dbb81860 --- /dev/null +++ b/facebook4j-core/src/test/resources/mock_json/testUser/page1.json @@ -0,0 +1,36 @@ +{ + "data": [ + { + "id": "1379885932316530", + "login_url": "https://developers.facebook.com/checkpoint/test-user-login/1379885932316530/", + "access_token": "CAAUs5XD3IK4BAPJnYxLqqKtpZBnNaqNGr4PfcCWuowZC1PWZAmCHsAW4OFhdwnz1B3ZARpCNR4ShuFoGUwZAZCAMquGfRWzvYCzpy0Q3Q6tikMpDhZCoyI3QUfuZCEdSEi8bbK9mFheRgAaWs0H4K0v1YZAKEg2j73QIeFWB3Ea7xRXuWJQUeEHvpSdRWBIAXXZAcZD" + }, + { + "id": "1377417215897043", + "login_url": "https://developers.facebook.com/checkpoint/test-user-login/1377417215897043/", + "access_token": "CAAUs5XD3IK4BAM7v3DsWbR00aCDcYxs6r67RoZByb6K1ooSouvcSP2jrTjmf6i28ZA1ZAqr4h2l3f6fFIzD0NvTMIpckvMJCHZAsnT16V079V2cPNPV8E3uRFjZCsae4k4PQyhCgWs3ieE9euCuHagC7puWTk8Q8ZBtuEETKA5anpNdgVbP2hRAgrEGZAwFRTQZD" + }, + { + "id": "1380020645636256", + "login_url": "https://developers.facebook.com/checkpoint/test-user-login/1380020645636256/", + "access_token": "CAAUs5XD3IK4BAElROpszysmhBYyqjLnUQGzkHaEdwcdb6wxAVmU2Ep83gCFNg1xjb0ZCFqhtJUZBa2oxc7IJZBw7YzdwHxDorDlqvGUenBNHC3nowwoI2dEH2ih3ZATKLAAS2O6c8a7mqGqZCrSjcR4cfqIWJd997EAbfpXZAPWY5MpXZBelfy1iQQJeZBFCVQQZD" + }, + { + "id": "1380064655632073", + "login_url": "https://developers.facebook.com/checkpoint/test-user-login/1380064655632073/", + "access_token": "CAAUs5XD3IK4BADcbXTFjihDSY5w4pjJjwkhQnqB9hnMy8M2ElR2kmM5ZCFCq7wZBa4lVOd40gRrXeC1SKxlRW9yUibbOR1eGeMNlbXmHFhHgP0tw1azlEXdBKGryJXZAWJiLBfIhfmVchZA1I0LaEhGInnkAWGvP982PaWbI7U86v1DYQWOeZCCb2SJuQLB0ZD" + }, + { + "id": "1377730512532504", + "login_url": "https://developers.facebook.com/checkpoint/test-user-login/1377730512532504/", + "access_token": "CAAUs5XD3IK4BABZCZBgNxZAMW90NEYz4cYtkgDCYoJL6rA80LfkLJnl8hFvY7LXQkASJWfTOk9IVkU9R7MWgumkgzCspfoMYaViqrR5VsJ7BWmg6265ANwSelTZAP3EdAc6w12H2ccvSEkkYroQEh9qENhCNy1dkTeJ7GDMLAKN4n2Qp4GyWsZAaZA7t7gCf0ZD" + } + ], + "paging": { + "cursors": { + "before": "MTM3OTg4NTkzMjMxNjUzMA==", + "after": "MTM3NzczMDUxMjUzMjUwNA==" + }, + "next": "https://graph.facebook.com/v2.2/1456738837930158/accounts?pretty=0&type=test-users&limit=5&after=MTM3NzczMDUxMjUzMjUwNA==" + } +} \ No newline at end of file diff --git a/facebook4j-core/src/test/resources/mock_json/testUser/page2.json b/facebook4j-core/src/test/resources/mock_json/testUser/page2.json new file mode 100644 index 00000000..5467188f --- /dev/null +++ b/facebook4j-core/src/test/resources/mock_json/testUser/page2.json @@ -0,0 +1,37 @@ +{ + "data": [ + { + "id": "1379557692348933", + "login_url": "https://developers.facebook.com/checkpoint/test-user-login/1379557692348933/", + "access_token": "CAAUs5XD3IK4BAKvIx4xLQgryk2cEr0fanjm6Xec7I0hsmMA8knkt5oHxky3kDddZBmiwEEcTZCLjclcKgd3TnKhffRs63KMGAhHlsxNIAJ7Msls57SIoovqAZC2RgZClSGgjTSKTwurF9G4xhy9ys7QPZA5sDpjjIVZCcCtG36Pe0WYUFmmH5RrSk5mRDLHZAQcTkqZBRPtXAwZDZD" + }, + { + "id": "1376859759286323", + "login_url": "https://developers.facebook.com/checkpoint/test-user-login/1376859759286323/", + "access_token": "CAAUs5XD3IK4BAPu6ZAffMsitpYFgD0hCQ1Sj5pgTTdleQCI3IhZBp4dlmPBWWFEhPWjgSpc6QKUyOVXLlhGbjzaoL0nbZAb3ucl74CPu4CMrjhj0tD48N0tOtfdrjxHm27bLoPw6nsYO8sZC2zNz4VjS9XlzDKY1aP9SNFOH1B945iwLTGzsBwC8UWne2sVorbZBwKI4hCgZDZD" + }, + { + "id": "1377686682536648", + "login_url": "https://developers.facebook.com/checkpoint/test-user-login/1377686682536648/", + "access_token": "CAAUs5XD3IK4BAORsfolBBmZChJBljLrFIrAEP2du1C58lqWiSbzNyCGt5h79Au00O2idR0hqWGsMA4pqkIHyCTWhZALTMbGGybXEpb6jxFa8zMi6ihTqABScBJ13PefpaOviKZAjSVd7svft06oOGHtYzZCeiB31gOtRM5AaLwKatohzZCIZB4l04TbqOsY6UmphuD6ZAF0RQZDZD" + }, + { + "id": "1376700812635927", + "login_url": "https://developers.facebook.com/checkpoint/test-user-login/1376700812635927/", + "access_token": "CAAUs5XD3IK4BAAqlWwqUKr7NQZAUPZBsV4aTToNQBvcFlMsLWFpDrv3cxO122baKnkL9xjZCdtNiUiUGZAfikS2x5kbGVzSQo1S0ySeDKlonVx1E4JCpnqsIrUNKioBxY6JKTZCIPZCqmL5IZBTXZA2fYVX0c66lzNkntlCP8X73Mt2qyZBZCZBGC91TDF0JZBEpm6iu73ggaPRbDwZDZD" + }, + { + "id": "1377571719214873", + "login_url": "https://developers.facebook.com/checkpoint/test-user-login/1377571719214873/", + "access_token": "CAAUs5XD3IK4BAIgnVkU4xsDtXZARP208BKIgp2Xo7Lw93nCCZC5J4cX4BZBqhMGA2lieJzgvymVc4D5Rvaq5hpC1SQtlmIKvbnTZC1ygBLzZB9aCYU7lZAWBNjtHoGUgvgRZAsjS0avsCdQB0Nk8kHvNeZB5pL6Pti4l1fIhQfhOC4EJXvXfYYqRvamVvWpZBiFF9pgsm51Xn0QZDZD" + } + ], + "paging": { + "cursors": { + "before": "MTM3OTU1NzY5MjM0ODkzMw==", + "after": "MTM3NzU3MTcxOTIxNDg3Mw==" + }, + "next": "https://graph.facebook.com/v2.2/1456738837930158/accounts?pretty=0&type=test-users&limit=5&after=MTM3NzU3MTcxOTIxNDg3Mw==", + "previous": "https://graph.facebook.com/v2.2/1456738837930158/accounts?pretty=0&type=test-users&limit=5&before=MTM3OTU1NzY5MjM0ODkzMw==" + } +} \ No newline at end of file diff --git a/facebook4j-core/src/test/resources/mock_json/testUser/page3.json b/facebook4j-core/src/test/resources/mock_json/testUser/page3.json new file mode 100644 index 00000000..e6d0e3ad --- /dev/null +++ b/facebook4j-core/src/test/resources/mock_json/testUser/page3.json @@ -0,0 +1,26 @@ +{ + "data": [ + { + "id": "1388984414734356", + "login_url": "https://developers.facebook.com/checkpoint/test-user-login/1388984414734356/", + "access_token": "CAAUs5XD3IK4BAEahfBK29wEdVLtaknVikDLlJP7pfbF6vydac2L1xakqQQZAZB6tLqwYrWpugcTVMkN3Dh6kJaWGW37nCs4mtRrnHb9RjTsyWVdTL7S815InIbexSRduPUNl6uynrSZBBIb0zhISXTxC2d6GHBEYajZCHUfzOKtyOF4DjGRnKpqFdapbFJsB36VpfhqH0QZDZD" + }, + { + "id": "100008692577545", + "login_url": "https://developers.facebook.com/checkpoint/test-user-login/100008692577545/", + "access_token": "CAAUs5XD3IK4BAMPfbmEIH4xYur34vNDw0i4g5EDAbqmGQJquJjNA1zlneh3WW13u6X3q3Jq9hrrgpcB7scYHLwdjhjiVys8436hy9GmrOHnu5Wd6ZAU6diGyHSyvze9sYpkqBlmGRC78hirNwl2ZCITb2ksiJpwpOphZA4ZBEEYBZBGGVMUoZBU19GIgqt10vHGgTI58mc0wZDZD" + }, + { + "id": "1379332385701086", + "login_url": "https://developers.facebook.com/checkpoint/test-user-login/1379332385701086/", + "access_token": "CAAUs5XD3IK4BAGujfCzcLYYGr067rFhpW9iDIsOVAJJlmM3Om43aThZAbuVvzNajO3RRstx18kHQZB0CU8OQN36zfbeL7nYHRALrCLXEnN1vq9OwV3XJUMJ7CBVdbiVxmHdHO3t7AB1St8rZCSmXQPe9xVZBsKhxNngwUdvpxZB8gHKzosNAj7upiWesp2hpKwP2qy2r5LAZDZD" + } + ], + "paging": { + "cursors": { + "before": "MTM3NzU3MzY4MjU0NDk3NQ==", + "after": "MTM3OTMzMjM4NTcwMTA4Ng==" + }, + "previous": "https://graph.facebook.com/v2.2/1456738837930158/accounts?pretty=0&type=test-users&limit=50&before=MTM3NzU3MzY4MjU0NDk3NQ==" + } +} \ No newline at end of file From 331fb41e55509878b137809bb16ed131d1bf4551 Mon Sep 17 00:00:00 2001 From: paolobiavati Date: Wed, 14 Jan 2015 16:58:33 +0000 Subject: [PATCH 6/6] removed age_range managing from this branch --- .../src/main/java/facebook4j/User.java | 8 --- .../internal/json/UserJSONImpl.java | 62 +------------------ .../test/java/facebook4j/UserMethodsTest.java | 6 +- .../resources/mock_json/user/me_fields.json | 1 - 4 files changed, 2 insertions(+), 75 deletions(-) diff --git a/facebook4j-core/src/main/java/facebook4j/User.java b/facebook4j-core/src/main/java/facebook4j/User.java index b759d22d..af9aba1d 100644 --- a/facebook4j-core/src/main/java/facebook4j/User.java +++ b/facebook4j-core/src/main/java/facebook4j/User.java @@ -60,7 +60,6 @@ public interface User { User.VideoUploadLimits getVideoUploadLimits(); URL getWebsite(); List getWork(); - User.AgeRange getAgeRange(); interface Education { IdNameEntity getYear(); @@ -91,13 +90,6 @@ interface Work { } - interface AgeRange { - // one value could be null (13-17 / 18-20 / 21 - null) - Long getMin(); - Long getMax(); - - } - String BIRTHDAY_DATE_FORMAT = "MM/dd/yyyy"; diff --git a/facebook4j-core/src/main/java/facebook4j/internal/json/UserJSONImpl.java b/facebook4j-core/src/main/java/facebook4j/internal/json/UserJSONImpl.java index 4f0aef5d..019ed40d 100644 --- a/facebook4j-core/src/main/java/facebook4j/internal/json/UserJSONImpl.java +++ b/facebook4j-core/src/main/java/facebook4j/internal/json/UserJSONImpl.java @@ -80,7 +80,6 @@ private User.VideoUploadLimits videoUploadLimits; private URL website; private List work; - private User.AgeRange ageRange; /*package*/UserJSONImpl(HttpResponse res, Configuration conf) throws FacebookException { if (conf.isJSONStoreEnabled()) { @@ -221,10 +220,6 @@ private void init(JSONObject json) throws FacebookException { } else { work = Collections.emptyList(); } - if (!json.isNull("age_range")) { - JSONObject ageRangeJSONObject = json.getJSONObject("age_range"); - ageRange = new AgeRangeJSONImpl(ageRangeJSONObject); - } } catch (JSONException jsone) { throw new FacebookException(jsone.getMessage() + ":" + json.toString(), jsone); } @@ -366,10 +361,6 @@ public List getWork() { return work; } - public User.AgeRange getAgeRange() { - return ageRange; - } - /*package*/ static ResponseList createUserList(HttpResponse res, Configuration conf) throws FacebookException { try { @@ -461,7 +452,7 @@ public String toString() { + relationshipStatus + ", religion=" + religion + ", significantOther=" + significantOther + ", videoUploadLimits=" + videoUploadLimits + ", website=" - + website + ", work=" + work + ", ageRange=" + ageRange + "]"; + + website + ", work=" + work + "]"; } @@ -866,55 +857,4 @@ public String toString() { } } - private final class AgeRangeJSONImpl implements User.AgeRange, java.io.Serializable { - private static final long serialVersionUID = -4890967721976343047L; - - private final Long min; - private final Long max; - - AgeRangeJSONImpl(JSONObject json) throws FacebookException { - min = getLong("min", json); - max = getLong("max", json); - } - - public Long getMin() { - return min; - } - - public Long getMax() { - return max; - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + (int) (min ^ (min >>> 32)); - result = prime * result + (int) (max ^ (max >>> 32)); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - AgeRangeJSONImpl other = (AgeRangeJSONImpl) obj; - if (min != other.min) - return false; - if (max != other.max) - return false; - return true; - } - - @Override - public String toString() { - return "AgeRangeJSONImpl [min=" + min + ", max=" + max - + "]"; - } - } - } diff --git a/facebook4j-core/src/test/java/facebook4j/UserMethodsTest.java b/facebook4j-core/src/test/java/facebook4j/UserMethodsTest.java index 0d1382f6..12083b89 100644 --- a/facebook4j-core/src/test/java/facebook4j/UserMethodsTest.java +++ b/facebook4j-core/src/test/java/facebook4j/UserMethodsTest.java @@ -85,7 +85,7 @@ public void me() throws Exception { @Test public void reading() throws Exception { facebook.setMockJSON("mock_json/user/me_fields.json"); - User me = facebook.getMe(new Reading().fields("gender").fields("email").fields("age_range")); + User me = facebook.getMe(new Reading().fields("gender").fields("email")); assertThat(me.getGender(), is("male")); assertThat(me.getEmail(), is("roundrop@gmail.com")); @@ -94,10 +94,6 @@ public void reading() throws Exception { assertThat(me.getBirthday(), is(nullValue())); assertThat(me.getEducation().size(), is(0)); assertThat(me.getHometown(), is(nullValue())); - - assertThat(me.getAgeRange().getMin(), is(17L)); - assertThat(me.getAgeRange().getMax(), is(20L)); - } } diff --git a/facebook4j-core/src/test/resources/mock_json/user/me_fields.json b/facebook4j-core/src/test/resources/mock_json/user/me_fields.json index c4962bbf..f94b1199 100644 --- a/facebook4j-core/src/test/resources/mock_json/user/me_fields.json +++ b/facebook4j-core/src/test/resources/mock_json/user/me_fields.json @@ -2,5 +2,4 @@ "gender": "male", "email": "roundrop@gmail.com", "id": "6666", - "age_range":{"min": 17,"max": 20}, } \ No newline at end of file