/src/com/facebook/app/server/facebook/FacebookImporter.java

http://tum-sophomore-web-hackathon.googlecode.com/ · Java · 146 lines · 103 code · 34 blank · 9 comment · 3 complexity · 3c74bd7dc5bb32af4dd3743e15cf872f MD5 · raw file

  1. package com.facebook.app.server.facebook;
  2. import java.io.IOException;
  3. import java.io.InputStreamReader;
  4. import java.io.Reader;
  5. import java.io.UnsupportedEncodingException;
  6. import java.net.MalformedURLException;
  7. import java.net.URL;
  8. import java.net.URLEncoder;
  9. import javax.jdo.PersistenceManager;
  10. import com.facebook.app.shared.facebookData.FacebookFriend;
  11. import com.facebook.app.shared.facebookData.FacebookLike;
  12. import com.google.gson.Gson;
  13. public class FacebookImporter {
  14. private static class FriendData {
  15. private FacebookFriend[] data = new FacebookFriend[0];
  16. // to avoid a NullPointerException if the user has just logged out, but the Facebook cookie is still "alive".
  17. // TODO has to be fixed
  18. }
  19. private static class LikeData {
  20. private FacebookLike[] data;
  21. }
  22. private static final int MAX_NUMBER_OF_CONNECTION_ERRORS = 20;
  23. private final String baseUrl = "https://graph.facebook.com";
  24. private final String accessToken;
  25. private final Gson gson = new Gson();
  26. private int numberOfConnectionErrors = 0;
  27. public FacebookImporter(String accessToken) {
  28. this.accessToken = accessToken;
  29. }
  30. private Reader downloadData(String url) {
  31. if(numberOfConnectionErrors > MAX_NUMBER_OF_CONNECTION_ERRORS) {
  32. System.out.println("Connection errors have exceeded limit of " + MAX_NUMBER_OF_CONNECTION_ERRORS);
  33. return null;
  34. }
  35. try {
  36. URL dataURL = new URL(url);
  37. return new InputStreamReader(dataURL.openStream());
  38. } catch (MalformedURLException e) {
  39. e.printStackTrace();
  40. return null;
  41. } catch (IOException e) {
  42. System.out.println("Catched IOE : " + e.toString());
  43. // TODO Check whether IOE is cause by open URL connection.
  44. numberOfConnectionErrors++;
  45. return downloadData(url);
  46. }
  47. }
  48. private FacebookFriend[] importFriendsForFriend(FacebookFriend friend) {
  49. StringBuilder req = new StringBuilder(baseUrl);
  50. req.append("/");
  51. req.append(friend.getId());
  52. req.append("/friends");
  53. try {
  54. req.append("?access_token="
  55. + URLEncoder.encode(accessToken, "UTF-8"));
  56. } catch (UnsupportedEncodingException e1) {
  57. e1.printStackTrace();
  58. }
  59. FriendData friendData = gson.fromJson(downloadData(req.toString()), FriendData.class);
  60. return friendData.data;
  61. }
  62. FacebookLike[] importLikesForFriend(FacebookFriend friend) {
  63. StringBuilder req = new StringBuilder(baseUrl);
  64. req.append("/");
  65. req.append(friend.getId());
  66. req.append("/likes");
  67. try {
  68. req.append("?access_token="
  69. + URLEncoder.encode(accessToken, "UTF-8"));
  70. } catch (UnsupportedEncodingException e1) {
  71. e1.printStackTrace();
  72. }
  73. LikeData likeData = gson.fromJson(downloadData(req.toString()), LikeData.class);
  74. return likeData.data;
  75. }
  76. public FacebookFriend[] importFriends() {
  77. StringBuilder req = new StringBuilder(baseUrl);
  78. req.append("/me?access_token=");
  79. try {
  80. req.append(URLEncoder.encode(accessToken, "UTF-8"));
  81. } catch (UnsupportedEncodingException e) {
  82. e.printStackTrace();
  83. }
  84. FacebookFriend me = gson.fromJson(downloadData(req.toString()), FacebookFriend.class);
  85. FacebookFriend[] myFriends = importFriendsForFriend(me);
  86. FacebookFriend[] friendsWithMe = new FacebookFriend[myFriends.length + 1];
  87. for (int i = 0; i < myFriends.length; i++) {
  88. friendsWithMe[i] = myFriends[i];
  89. }
  90. friendsWithMe[friendsWithMe.length - 1] = me;
  91. return friendsWithMe;
  92. }
  93. /**
  94. * Imports the FacebookLikes for a certain number of FacebookFriends
  95. * and saves those friends on the datastore.
  96. *
  97. * @param friends
  98. */
  99. public void importAndSaveFacebookData(FacebookFriend[] friends) {
  100. for (FacebookFriend friend: friends) {
  101. System.out.print(".");
  102. friend.setLikesWithArray(importLikesForFriend(friend));
  103. }
  104. PersistenceManager pm = PersistenceManagerFactorySingleton
  105. .getPersistenceManagerFactoryInstance().getPersistenceManager();
  106. try {
  107. pm.makePersistentAll(friends);
  108. } finally {
  109. pm.close();
  110. }
  111. }
  112. }