/cokoo-app/src/main/java/net/kolov/hs/modules/hs/server/FriendsServiceImpl.java

https://github.com/kolov/cokoo · Java · 167 lines · 123 code · 39 blank · 5 comment · 14 complexity · 58848ea4d56d2bbe7d98fc5214255b3d MD5 · raw file

  1. package net.kolov.hs.modules.hs.server;
  2. import com.google.gwt.user.server.rpc.RemoteServiceServlet;
  3. import net.kolov.hs.app.SessionData;
  4. import net.kolov.hs.modules.hs.assembler.ClientUserAssembler;
  5. import net.kolov.hs.modules.hs.assembler.TwitterUserAssembler;
  6. import net.kolov.hs.modules.hs.client.ClientStatus;
  7. import net.kolov.hs.modules.hs.client.ClientUser;
  8. import net.kolov.hs.modules.hs.client.SortedStatus;
  9. import net.kolov.hs.modules.hs.model.AppUser;
  10. import net.kolov.hs.modules.hs.model.TwitterUser;
  11. import org.springframework.beans.factory.annotation.Autowired;
  12. import org.springframework.stereotype.Component;
  13. import twitter4j.*;
  14. import javax.servlet.http.HttpServletRequest;
  15. import javax.servlet.http.HttpSession;
  16. import java.util.ArrayList;
  17. import java.util.HashMap;
  18. import java.util.List;
  19. import java.util.Map;
  20. /**
  21. * AppUser: assen
  22. * Date: 4/16/11
  23. */
  24. @Component
  25. public class FriendsServiceImpl extends RemoteServiceServlet {
  26. @Autowired
  27. private TwitterClient twitterClient;
  28. private net.kolov.twiscriminator.sc.ScalaAssembler clientUserAssembler = new net.kolov.twiscriminator.sc.ScalaAssembler();
  29. private TwitterUserAssembler twitterUserAssembler = new TwitterUserAssembler();
  30. private static final int FRIENDS_BLOCK = 30;
  31. public ClientUser[] askFriends(Integer fromLevel, Integer toLevel) {
  32. AppUser user = getSessionUser();
  33. return askFriends(fromLevel, toLevel, user);
  34. }
  35. ClientUser syncFriends(AppUser user) {
  36. Twitter twitter = twitterClient.createTwitter(user);
  37. Users users = new UserRepository();
  38. List<Integer> existingFriendIds = getExistingFriendIds(user);
  39. ArrayList<TwitterUser> newTwitterFriends = new ArrayList<TwitterUser>();
  40. List<ClientUser> allFriends = new ArrayList<ClientUser>();
  41. try {
  42. IDs twitterFriends = twitter.getFriendsIDs();
  43. int[] ids = twitterFriends.getIDs();
  44. List<Integer> idsToAsk = new ArrayList<Integer>();
  45. for (int pos = 0; pos < ids.length; pos++) {
  46. // if id present in knownFriends - do nothing
  47. int id = ids[pos];
  48. if (!existingFriendIds.contains(id)) {
  49. idsToAsk.add(id);
  50. }
  51. int size = idsToAsk.size();
  52. if (size == FRIENDS_BLOCK || size > 0 && pos == ids.length - 1) {
  53. ResponseList<User> newFriends = getTwitterUsers(twitter, idsToAsk);
  54. for (User usr : newFriends) {
  55. TwitterUser twitterUser = twitterUserAssembler.from(usr);
  56. newTwitterFriends.add(twitterUser);
  57. }
  58. idsToAsk.clear();
  59. }
  60. }
  61. users.storeFriends(user, newTwitterFriends);
  62. } catch (TwitterException e) {
  63. throw new RuntimeException(e);
  64. }
  65. return new ClientUserAssembler().from(user);
  66. }
  67. private List<Integer> getExistingFriendIds(AppUser user) {
  68. Users users = new UserRepository();
  69. List<ClientUser> knownFriends = users.getFriends(user, null, null);
  70. List<Integer> existingFriendIds = new ArrayList<Integer>();
  71. for (ClientUser knownFriend : knownFriends) {
  72. existingFriendIds.add(knownFriend.getTwitterId());
  73. }
  74. return existingFriendIds;
  75. }
  76. private ResponseList<User> getTwitterUsers(Twitter twitter, List<Integer> idsToAsk) throws TwitterException {
  77. int[] block = new int[idsToAsk.size()];
  78. int i = 0;
  79. for (Integer integer : idsToAsk) {
  80. block[i++] = integer.intValue();
  81. }
  82. return twitter.lookupUsers(block);
  83. }
  84. public ClientUser[] askFriends(Integer fromLevel, Integer toLevel, AppUser user) {
  85. Users users = new UserRepository();
  86. List<ClientUser> clientUsers = users.getFriends(user, fromLevel, toLevel);
  87. ClientUser[] result = new ClientUser[clientUsers.size()];
  88. return clientUsers.toArray(result);
  89. }
  90. private AppUser getSessionUser() {
  91. HttpServletRequest request = this.getThreadLocalRequest();
  92. HttpSession session = request.getSession();
  93. SessionData sessionData = SessionData.getSessionData(session);
  94. return sessionData.getUser();
  95. }
  96. public SortedStatus getHomeTimeline() {
  97. AppUser user = getSessionUser();
  98. return getHomeTimeline(user);
  99. }
  100. public SortedStatus getHomeTimeline(AppUser user) {
  101. Twitter twitter = twitterClient.createTwitter(user);
  102. List<ClientUser> friends = new UserRepository().getFriends(user, null, null);
  103. Map<Integer, ClientUser> usersById = new HashMap<Integer, ClientUser>();
  104. for (ClientUser friend : friends) {
  105. usersById.put(friend.getTwitterId(), friend);
  106. }
  107. SortedStatus result = new SortedStatus();
  108. try {
  109. ResponseList<Status> tweets = twitter.getHomeTimeline();
  110. for (Status tweet : tweets) {
  111. ClientStatus clientStatus = new ClientStatus(tweet.getText());
  112. User tweetUser = tweet.getUser();
  113. ClientUser cu = usersById.get(tweet.getUser().getId());
  114. if (cu != null) {
  115. clientStatus.setUser(cu);
  116. result.add(cu.getLevel(), clientStatus);
  117. }
  118. }
  119. } catch (TwitterException e) {
  120. throw new RuntimeException(e);
  121. }
  122. return result;
  123. }
  124. public void moveFriend(int id, Integer level, AppUser user) {
  125. Users users = new UserRepository();
  126. users.moveFriend(id, level, user);
  127. }
  128. }