UpdatesMongoHandler.java 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. package hello;
  2. import com.fasterxml.jackson.databind.ObjectMapper;
  3. import com.mongodb.BasicDBObject;
  4. import com.mongodb.DB;
  5. import com.mongodb.DBObject;
  6. import io.undertow.server.HttpHandler;
  7. import io.undertow.server.HttpServerExchange;
  8. import io.undertow.util.Headers;
  9. import java.util.Objects;
  10. import static hello.HelloWebServer.JSON_UTF8;
  11. /**
  12. * Handles the updates test using MongoDB.
  13. */
  14. final class UpdatesMongoHandler implements HttpHandler {
  15. private final ObjectMapper objectMapper;
  16. private final DB database;
  17. UpdatesMongoHandler(ObjectMapper objectMapper, DB database) {
  18. this.objectMapper = Objects.requireNonNull(objectMapper);
  19. this.database = Objects.requireNonNull(database);
  20. }
  21. @Override
  22. public void handleRequest(HttpServerExchange exchange) throws Exception {
  23. if (exchange.isInIoThread()) {
  24. exchange.dispatch(this);
  25. return;
  26. }
  27. int queries = Helper.getQueries(exchange);
  28. World[] worlds = new World[queries];
  29. for (int i = 0; i < queries; i++) {
  30. int id = Helper.randomWorld();
  31. DBObject key = new BasicDBObject("_id", id);
  32. //
  33. // The requirements for the test dictate that we must fetch the World
  34. // object from the data store and read its randomNumber field, even though
  35. // we could technically avoid doing either of those things and still
  36. // produce the correct output and side effects.
  37. //
  38. DBObject object = database.getCollection("world").findOne(key);
  39. @SuppressWarnings("unused")
  40. // Per test requirement the old value must be read
  41. int oldRandomNumber = ((Number) object.get("randomNumber")).intValue();
  42. int newRandomNumber = Helper.randomWorld();
  43. object.put("randomNumber", newRandomNumber);
  44. database.getCollection("world").update(key, object);
  45. worlds[i] = new World(id, newRandomNumber);
  46. }
  47. exchange.getResponseHeaders().put(
  48. Headers.CONTENT_TYPE, JSON_UTF8);
  49. exchange.getResponseSender().send(objectMapper.writeValueAsString(worlds));
  50. }
  51. }