diff options
Diffstat (limited to 'src/main/java/com/android/vts/api/UserFavoriteRestServlet.java')
-rw-r--r-- | src/main/java/com/android/vts/api/UserFavoriteRestServlet.java | 133 |
1 files changed, 101 insertions, 32 deletions
diff --git a/src/main/java/com/android/vts/api/UserFavoriteRestServlet.java b/src/main/java/com/android/vts/api/UserFavoriteRestServlet.java index f863051..bbb95da 100644 --- a/src/main/java/com/android/vts/api/UserFavoriteRestServlet.java +++ b/src/main/java/com/android/vts/api/UserFavoriteRestServlet.java @@ -25,11 +25,11 @@ import com.google.appengine.api.datastore.EntityNotFoundException; import com.google.appengine.api.datastore.Key; import com.google.appengine.api.datastore.KeyFactory; import com.google.appengine.api.datastore.Query; -import com.google.appengine.api.datastore.Transaction; import com.google.appengine.api.datastore.Query.CompositeFilterOperator; import com.google.appengine.api.datastore.Query.Filter; import com.google.appengine.api.datastore.Query.FilterOperator; import com.google.appengine.api.datastore.Query.FilterPredicate; +import com.google.appengine.api.datastore.Transaction; import com.google.appengine.api.users.User; import com.google.appengine.api.users.UserService; import com.google.appengine.api.users.UserServiceFactory; @@ -50,40 +50,37 @@ public class UserFavoriteRestServlet extends HttpServlet { Logger.getLogger(UserFavoriteRestServlet.class.getName()); /** - * Add a test to the user's favorites. + * Add a new favorite entity. + * + * @param user The user for which to add a favorite. + * @param test The name of the test. + * @param muteNotifications True if the subscriber has muted notifications, false otherwise. + * @param response The servlet response object. + * @return a json object with the generated key to the new favorite entity. + * @throws IOException */ - @Override - public void doPost(HttpServletRequest request, HttpServletResponse response) + private static JsonObject addFavorite( + User user, String test, boolean muteNotifications, HttpServletResponse response) throws IOException { - UserService userService = UserServiceFactory.getUserService(); - User currentUser = userService.getCurrentUser(); DatastoreService datastore = DatastoreServiceFactory.getDatastoreService(); - - // Retrieve the added tests from the request. - String test = request.getPathInfo(); - if (test == null) { - response.setStatus(HttpServletResponse.SC_BAD_REQUEST); - return; - } - if (test.startsWith("/")) { - test = test.substring(1); - } Key addedTestKey = KeyFactory.createKey(TestEntity.KIND, test); // Filter the tests that exist from the set of tests to add try { datastore.get(addedTestKey); } catch (EntityNotFoundException e) { response.setStatus(HttpServletResponse.SC_BAD_REQUEST); - return; + return null; } Filter userFilter = - new FilterPredicate(UserFavoriteEntity.USER, FilterOperator.EQUAL, currentUser); - Filter testFilter = new FilterPredicate( - UserFavoriteEntity.TEST_KEY, FilterOperator.EQUAL, addedTestKey); - Query q = new Query(UserFavoriteEntity.KIND) - .setFilter(CompositeFilterOperator.and(userFilter, testFilter)) - .setKeysOnly(); + new FilterPredicate(UserFavoriteEntity.USER, FilterOperator.EQUAL, user); + Filter testFilter = + new FilterPredicate( + UserFavoriteEntity.TEST_KEY, FilterOperator.EQUAL, addedTestKey); + Query q = + new Query(UserFavoriteEntity.KIND) + .setFilter(CompositeFilterOperator.and(userFilter, testFilter)) + .setKeysOnly(); Key favoriteKey = null; @@ -94,7 +91,8 @@ public class UserFavoriteRestServlet extends HttpServlet { break; } if (favoriteKey == null) { - UserFavoriteEntity favorite = new UserFavoriteEntity(currentUser, addedTestKey); + UserFavoriteEntity favorite = + new UserFavoriteEntity(user, addedTestKey, muteNotifications); Entity entity = favorite.toEntity(); datastore.put(entity); favoriteKey = entity.getKey(); @@ -102,24 +100,95 @@ public class UserFavoriteRestServlet extends HttpServlet { txn.commit(); } finally { if (txn.isActive()) { - logger.log(Level.WARNING, + logger.log( + Level.WARNING, "Transaction rollback forced for favorite creation: " + test); txn.rollback(); } } - - response.setContentType("application/json"); - PrintWriter writer = response.getWriter(); JsonObject json = new JsonObject(); json.add("key", new JsonPrimitive(KeyFactory.keyToString(favoriteKey))); - writer.print(new Gson().toJson(json)); - writer.flush(); - response.setStatus(HttpServletResponse.SC_OK); + return json; } /** - * Remove a test from the user's favorites. + * @param user The user for which to add a favorite. + * @param favoriteKey The database key to the favorite entity to update. + * @param muteNotifications True if the subscriber has muted notifications, false otherwise. + * @param response The servlet response object. + * @return a json object with the generated key to the new favorite entity. + * @throws IOException */ + private static JsonObject updateFavorite( + User user, Key favoriteKey, boolean muteNotifications, HttpServletResponse response) + throws IOException { + DatastoreService datastore = DatastoreServiceFactory.getDatastoreService(); + Entity favoriteEntity; + try { + favoriteEntity = datastore.get(favoriteKey); + } catch (EntityNotFoundException e) { + response.setStatus(HttpServletResponse.SC_BAD_REQUEST); + return null; + } + UserFavoriteEntity favorite = UserFavoriteEntity.fromEntity(favoriteEntity); + if (favorite.user.getUserId() == user.getUserId()) { + response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); + return null; + } + if (favorite.muteNotifications != muteNotifications) { + Transaction txn = datastore.beginTransaction(); + try { + favorite.muteNotifications = muteNotifications; + datastore.put(favorite.toEntity()); + txn.commit(); + } finally { + if (txn.isActive()) { + logger.log( + Level.WARNING, + "Transaction rollback forced for favorite update: " + favoriteKey); + txn.rollback(); + } + } + } + JsonObject json = new JsonObject(); + json.add("key", new JsonPrimitive(KeyFactory.keyToString(favoriteKey))); + return json; + } + + /** Add a test to the user's favorites. */ + @Override + public void doPost(HttpServletRequest request, HttpServletResponse response) + throws IOException { + UserService userService = UserServiceFactory.getUserService(); + User currentUser = userService.getCurrentUser(); + + boolean muteNotifications = false; + if (request.getParameter(UserFavoriteEntity.MUTE_NOTIFICATIONS) != null) { + muteNotifications = + Boolean.parseBoolean( + request.getParameter(UserFavoriteEntity.MUTE_NOTIFICATIONS)); + } + + String userFavoritesKeyString = request.getParameter("userFavoritesKey"); + String testName = request.getParameter("testName"); + + JsonObject returnData = null; + if (userFavoritesKeyString != null) { + Key userFavoritesKey = KeyFactory.stringToKey(userFavoritesKeyString); + returnData = updateFavorite(currentUser, userFavoritesKey, muteNotifications, response); + } else if (testName != null) { + returnData = addFavorite(currentUser, testName, muteNotifications, response); + } + + if (returnData != null) { + response.setContentType("application/json"); + PrintWriter writer = response.getWriter(); + writer.print(new Gson().toJson(returnData)); + writer.flush(); + } + } + + /** Remove a test from the user's favorites. */ @Override public void doDelete(HttpServletRequest request, HttpServletResponse response) throws IOException { |