package com.androidrocks.bex.server.manager; import com.androidrocks.bex.client.json.Book; import com.androidrocks.bex.client.json.Friend; import com.androidrocks.bex.server.persistent.BEXFriend; import com.androidrocks.bex.server.persistent.TradeBook; import com.androidrocks.bex.server.persistent.TwitFriend; import com.androidrocks.bex.server.persistent.User; import com.androidrocks.bex.server.persistent.WishBook; import com.google.appengine.api.datastore.Entity; import com.google.appengine.api.datastore.Key; import twitter4j.TwitterException; import javax.jdo.PersistenceManager; import javax.jdo.Query; import javax.jdo.Transaction; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.logging.Logger; public final class UserManager { private static final Logger log = Logger.getLogger(UserManager.class .getName()); private UserManager() { } public static List<Friend> fetchTwitFriends(User user) { Map<Key, Entity> entities = PMF.get(PMF.chopSetToPaging(user.getTwitFriends())); List<Friend> friends = TypeFactory.entitiesToJsonFriends(entities); return friends; } public static List<Friend> fetchBEXFriends(User user) { Map<Key, Entity> entities = PMF.get(PMF.chopSetToPaging(user.getBexFriends())); List<Friend> friends = TypeFactory.entitiesToJsonFriends(entities); return friends; } public static List<Book> fetchWishBook(User user) { Map<Key, Entity> entities = PMF.get(PMF.chopSetToPaging(user.getWishList())); List<Book> books = TypeFactory.entitiesToJsonBooks(entities); return books; } public static List<Book> fetchTradeBook(User user) { Map<Key, Entity> entities = PMF.get(PMF.chopSetToPaging(user.getTradeList())); List<Book> books = TypeFactory.entitiesToJsonBooks(entities); return books; } public static void fetchTwitterFollowers(User user) throws TwitterException { // if refresh is requested.. then do this Map<Key, Entity> friends = TwitterFactory.getTwitFollowerEntities(user); // save the twit friends in the system first List<Key> friendKeys = PMF.put(friends.values()); // now setup the relation with user and save user UserManager.saveTwitFriends(user, friendKeys); // the friends need to be checked in the system, if they are registered with bex FriendManager.filterFriends(user, friends); } public static void fetchTwitterFriends(User user) throws TwitterException { // if refresh is requested.. then do this Map<Key, Entity> friends = TwitterFactory.getTwitFriendEntities(user); // save the twit friends in the system first List<Key> friendKeys = PMF.put(friends.values()); // now setup the relation with user and save user UserManager.saveTwitFriends(user, friendKeys); // the friends need to be checked in the system, if they are registered with bex FriendManager.filterFriends(user, friends); } public static void saveUserWithCustomKey(User user) { // saveUserWithCustomKey user only if brand new.. existing users should use update instead // if (null == PMF.loadUser(user.getScreenName(), user.getTwitterId(), user.getToken(), user.getTokenSecret())){ PersistenceManager pm = PMF.get().getPersistenceManager(); // pm.setDetachAllOnCommit(true); Transaction tx = pm.currentTransaction(); try { tx.begin(); // set the key to twitter id, so retrieval is easier user.setKey(TypeFactory.createUserKeyWithPrefix(user.getTwitterId())); pm.makePersistent(user); log.info("#saveUserWithCustomKey: " + user); tx.commit(); } finally { if (tx.isActive()) { tx.rollback(); } pm.close(); } /* } else { log.info("SKIPPED User saveUserWithCustomKey - User already in Database" + user); } */ } static void addWishList(User user, WishBook book) { user.getWishList().add(book.getKey()); book.getUsers().add(user.getKey()); } static void removeWishList(User user, WishBook book) { user.getWishList().remove(book.getKey()); book.getUsers().remove(user.getKey()); } static void addTradeList(User user, TradeBook book) { user.getTradeList().add(book.getKey()); book.getUsers().add(user.getKey()); } static void removeTradeList(User user, TradeBook book) { user.getTradeList().remove(book.getKey()); book.getUsers().remove(user.getKey()); } static void addBEXFriend(User user, BEXFriend friend) { user.getBexFriends().add(friend.getKey()); friend.getUsers().add(user.getKey()); } static void removeBEXFriend(User user, BEXFriend friend) { user.getBexFriends().remove(friend.getKey()); friend.getUsers().remove(user.getKey()); } static void addTwitFriend(User user, TwitFriend friend) { user.getTwitFriends().add(friend.getKey()); friend.getUsers().add(user.getKey()); } static void removeTwitFriend(User user, TwitFriend friend) { user.getTwitFriends().remove(friend.getKey()); friend.getUsers().remove(user.getKey()); } public static void saveTwitFriend(User user, TwitFriend friend) { /* user.getTwitFriends().add(friend.getKey()); List<Key> keys = (List<Key>) PMF.get().getPersistenceManager().detachCopyAll(friend.getUsers()); keys.add(user.getKey()); friend.setUsers(new HashSet<Key>(keys)); */ addTwitFriend(user, friend); PMF.makePersistent(friend); PMF.makePersistent(user); } public static void saveBEXFriend(User user, BEXFriend friend) { addBEXFriend(user, friend); PMF.makePersistent(friend); PMF.makePersistent(user); } public static void saveBEXFriends(User user, List<Entity> friends) { List<Key> keys = PMF.put(friends); user.setBexFriends(new HashSet<Key>(keys)); PMF.makePersistent(user); } public static void saveTwitFriends(User user, List<Key> friendKeys) { user.setTwitFriends(new HashSet<Key>(friendKeys)); PMF.makePersistent(user); } public static void saveTradeList(User user, List<TradeBook> books) { for (TradeBook book : books) { addTradeList(user, book); PMF.makePersistent(book); } PMF.makePersistent(user); } public static void saveWishList(User user, List<WishBook> books) { for (WishBook book : books) { addWishList(user, book); PMF.makePersistent(book); } PMF.makePersistent(user); } public static User loadUser(String name) { User user = null; PersistenceManager pm = PMF.get().getPersistenceManager(); Query query = pm.newQuery(User.class, "screenName == nameParam"); query.declareParameters("String nameParam"); List<User> results = (List<User>) query.execute(name); if (null != results && !results.isEmpty()) { user = results.get(0); log.info("#loadUser: " + user); } pm.close(); return user; } public static User loadUser(String name, String token) { log.info("#loadUser: " + name); User user = null; PersistenceManager pm = PMF.get().getPersistenceManager(); Query query = pm.newQuery(User.class, "screenName == nameParam"); query.setFilter("token == tokenParam"); query.declareParameters("String nameParam, String tokenParam"); List<User> results = (List<User>) query.execute(name, token); if (null != results && !results.isEmpty()) { user = results.get(0); log.info("#loadUser: " + user); } pm.close(); return user; } public static User loadUser(String name, String twitterId, String token, String tokenSecret) { log.info("#loadUser: " + name); User user = null; PersistenceManager pm = PMF.get().getPersistenceManager(); Query query = pm.newQuery(User.class, "screenName == screenNameParam"); query.setFilter("twitterId == twitterIdParam"); query.setFilter("token == tokenParam"); query.setFilter("tokenSecret == tokenSecretParam"); query.declareParameters("String screenNameParam, String twitterIdParam, String tokenParam, String tokenSecretParam"); List<User> results = (List<User>) query.executeWithArray(name, twitterId, token, tokenSecret); if (null != results && !results.isEmpty()) { user = results.get(0); log.info("#loadUser: " + user); } pm.close(); return user; } /* public static User loadUserWithTwitFriends(User user) { PersistenceManager pm = PMF.get().getPersistenceManager(); Transaction tx = pm.currentTransaction(); try { tx.begin(); user = pm.getObjectById(User.class, user.getKey()); log.info("#loadUser: TwitFriends: " + user.getTwitFriends()); log.info("#loadUser: TwitFriends size: " + user.getTwitFriends().size()); tx.commit(); } finally { if (tx.isActive()) { tx.rollback(); } pm.close(); } return user; } */ public static User loadUserWithTwitFriends(String name, String token) { log.info("#loadUser: " + name); User user = null; PersistenceManager pm = PMF.get().getPersistenceManager(); Query query = pm.newQuery(User.class, "screenName == nameParam"); query.setFilter("token == tokenParam"); query.declareParameters("String nameParam, String tokenParam"); List<User> results = (List<User>) query.execute(name, token); if (null != results && !results.isEmpty()) { user = results.get(0); pm.retrieveAll(user.getTwitFriends()); log.info("#loadUser: " + user); } pm.close(); return user; } public static User loadUserWithFriends(String name, String token) { log.info("#loadUser: " + name); User user = null; PersistenceManager pm = PMF.get().getPersistenceManager(); Query query = pm.newQuery(User.class, "screenName == nameParam"); query.setFilter("token == tokenParam"); query.declareParameters("String nameParam, String tokenParam"); List<User> results = (List<User>) query.execute(name, token); if (null != results && !results.isEmpty()) { user = results.get(0); pm.retrieveAll(user.getTwitFriends()); pm.retrieveAll(user.getBexFriends()); log.info("#loadUser: " + user); } pm.close(); return user; } public static User loadUserWithBEXFriends(String name, String token) { log.info("#loadUser: " + name); User user = null; PersistenceManager pm = PMF.get().getPersistenceManager(); Query query = pm.newQuery(User.class, "screenName == nameParam"); query.setFilter("token == tokenParam"); query.declareParameters("String nameParam, String tokenParam"); List<User> results = (List<User>) query.execute(name, token); if (null != results && !results.isEmpty()) { user = results.get(0); pm.retrieveAll(user.getBexFriends()); log.info("#loadUser: " + user); } pm.close(); return user; } }