/dumbhippo/branches/linux-client-1-1-32-bugfix/server/src/com/dumbhippo/server/impl/FacebookSystemBean.java

https://gitlab.com/manoj-makkuboy/magnetism · Java · 166 lines · 131 code · 30 blank · 5 comment · 24 complexity · 88ae9f94b66de4bb6e027918b48346cf MD5 · raw file

  1. package com.dumbhippo.server.impl;
  2. import java.util.ArrayList;
  3. import java.util.Collections;
  4. import java.util.Comparator;
  5. import java.util.List;
  6. import javax.ejb.EJB;
  7. import javax.ejb.Stateless;
  8. import javax.persistence.EntityManager;
  9. import javax.persistence.PersistenceContext;
  10. import org.slf4j.Logger;
  11. import com.dumbhippo.GlobalSetup;
  12. import com.dumbhippo.TypeUtils;
  13. import com.dumbhippo.identity20.Guid;
  14. import com.dumbhippo.identity20.Guid.ParseException;
  15. import com.dumbhippo.persistence.ExternalAccount;
  16. import com.dumbhippo.persistence.ExternalAccountType;
  17. import com.dumbhippo.persistence.FacebookAccount;
  18. import com.dumbhippo.persistence.FacebookEvent;
  19. import com.dumbhippo.persistence.FacebookEventType;
  20. import com.dumbhippo.persistence.User;
  21. import com.dumbhippo.server.Configuration;
  22. import com.dumbhippo.server.ExternalAccountSystem;
  23. import com.dumbhippo.server.FacebookSystem;
  24. import com.dumbhippo.server.HippoProperty;
  25. import com.dumbhippo.server.NotFoundException;
  26. import com.dumbhippo.server.Configuration.PropertyNotFoundException;
  27. import com.dumbhippo.server.util.EJBUtil;
  28. import com.dumbhippo.server.views.Viewpoint;
  29. @Stateless
  30. public class FacebookSystemBean implements FacebookSystem {
  31. static private final Logger logger = GlobalSetup.getLogger(FacebookSystemBean.class);
  32. @PersistenceContext(unitName = "dumbhippo")
  33. private EntityManager em;
  34. @EJB
  35. private ExternalAccountSystem externalAccounts;
  36. @EJB
  37. private Configuration config;
  38. public List<FacebookAccount> getAllAccounts() {
  39. List list = em.createQuery("SELECT fa FROM FacebookAccount fa").getResultList();
  40. return TypeUtils.castList(FacebookAccount.class, list);
  41. }
  42. public FacebookAccount lookupFacebookAccount(Viewpoint viewpoint, String userId) throws ParseException, NotFoundException {
  43. User user = EJBUtil.lookupGuid(em, User.class, new Guid(userId));
  44. return lookupFacebookAccount(viewpoint, user);
  45. }
  46. public FacebookAccount lookupFacebookAccount(Viewpoint viewpoint, User user) throws NotFoundException {
  47. if (!em.contains(user.getAccount()))
  48. throw new RuntimeException("detached account in lookupExternalAccount()");
  49. ExternalAccount externalAccount = externalAccounts.lookupExternalAccount(viewpoint, user, ExternalAccountType.FACEBOOK);
  50. return lookupFacebookAccount(externalAccount);
  51. }
  52. private FacebookAccount lookupFacebookAccount(ExternalAccount externalAccount) throws NotFoundException {
  53. FacebookAccount facebookAccount;
  54. if (externalAccount.getExtra() == null) {
  55. throw new NotFoundException("No facebook account details for user " + externalAccount.getAccount().getOwner());
  56. } else {
  57. facebookAccount = em.find(FacebookAccount.class, Long.parseLong(externalAccount.getExtra()));
  58. if (facebookAccount == null)
  59. throw new RuntimeException("Invalid FacebookAccount id " + externalAccount.getExtra() + " is stored in externalAccount " + externalAccount);
  60. }
  61. return facebookAccount;
  62. }
  63. public FacebookEvent lookupFacebookEvent(Viewpoint viewpoint, long eventId) throws NotFoundException {
  64. FacebookEvent facebookEvent = em.find(FacebookEvent.class, eventId);
  65. // before we implement getting info about one's friends and network, we can only show
  66. // facebook blocks to their owners; later we can return it if the viewpoint is for someone
  67. // who is the owner's facebook friend or is in the same network with the owner and
  68. // facebookEvent.getEventType().getDisplayToOthers() is true
  69. if (viewpoint.isOfUser(facebookEvent.getFacebookAccount().getExternalAccount().getAccount().getOwner())) {
  70. return facebookEvent;
  71. } else {
  72. throw new NotFoundException("Viewpoint " + viewpoint + " can't view facebook event " + facebookEvent);
  73. }
  74. }
  75. public List<FacebookEvent> getLatestEvents(Viewpoint viewpoint, FacebookAccount facebookAccount, int eventsCount) {
  76. ArrayList<FacebookEvent> list = new ArrayList<FacebookEvent>();
  77. boolean viewpointIsOfOwner = viewpoint.isOfUser(facebookAccount.getExternalAccount().getAccount().getOwner());
  78. for (FacebookEvent event : facebookAccount.getFacebookEvents()) {
  79. if (event.getEventType().shouldDisplay(viewpointIsOfOwner)) {
  80. list.add(event);
  81. }
  82. }
  83. if (FacebookEventType.UNREAD_MESSAGES_UPDATE.shouldDisplay(viewpointIsOfOwner) &&
  84. facebookAccount.getMessageCountTimestampAsLong() > 0) {
  85. list.add(new FacebookEvent(facebookAccount, FacebookEventType.UNREAD_MESSAGES_UPDATE,
  86. facebookAccount.getUnreadMessageCount(), facebookAccount.getMessageCountTimestampAsLong()));
  87. }
  88. if (FacebookEventType.UNSEEN_POKES_UPDATE.shouldDisplay(viewpointIsOfOwner) &&
  89. facebookAccount.getPokeCountTimestampAsLong() > 0) {
  90. list.add(new FacebookEvent(facebookAccount, FacebookEventType.UNSEEN_POKES_UPDATE,
  91. facebookAccount.getUnseenPokeCount(), facebookAccount.getPokeCountTimestampAsLong()));
  92. }
  93. // we want newer(greater) timestamps to be in the front of the list
  94. Collections.sort(list, new Comparator<FacebookEvent>() {
  95. public int compare (FacebookEvent fe1, FacebookEvent fe2) {
  96. if (fe1.getEventTimestampAsLong() < fe2.getEventTimestampAsLong())
  97. return 1;
  98. else if (fe1.getEventTimestampAsLong() > fe2.getEventTimestampAsLong())
  99. return -1;
  100. else
  101. return 0;
  102. }
  103. });
  104. return list.subList(0, Math.min(eventsCount, list.size()));
  105. }
  106. public String getProfileLink(ExternalAccount externalAccount) {
  107. try {
  108. FacebookAccount facebookAccount = lookupFacebookAccount(externalAccount);
  109. return "http://www.facebook.com/profile.php?uid="
  110. + facebookAccount.getFacebookUserId() + "&api_key=" + getApiKey();
  111. } catch (NotFoundException e) {
  112. throw new RuntimeException("An ExternalAccount passed to getProfileLink() was not associated with a valid FacebookAccount.", e);
  113. }
  114. }
  115. public String getEventLink(FacebookEvent facebookEvent) {
  116. if ((facebookEvent.getEventType() == FacebookEventType.LOGIN_STATUS_EVENT) && (facebookEvent.getCount() == 0)) {
  117. return "http://api.facebook.com/login.php?api_key=" + getApiKey() + "&next=/";
  118. } else {
  119. return "http://www.facebook.com/" + facebookEvent.getEventType().getPageName() + ".php?uid="
  120. + facebookEvent.getFacebookAccount().getFacebookUserId() + "&api_key=" + getApiKey();
  121. }
  122. }
  123. public String getApiKey() {
  124. String apiKey;
  125. try {
  126. apiKey = config.getPropertyNoDefault(HippoProperty.FACEBOOK_API_KEY).trim();
  127. if (apiKey.length() == 0)
  128. apiKey = null;
  129. } catch (PropertyNotFoundException e) {
  130. apiKey = null;
  131. }
  132. if (apiKey == null)
  133. logger.warn("Facebook API key is not set, we can't use Facebook web services.");
  134. return apiKey;
  135. }
  136. }