Application.java 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. package controllers;
  2. import java.util.ArrayList;
  3. import java.util.Collections;
  4. import java.util.List;
  5. import java.util.Random;
  6. import java.util.concurrent.CompletableFuture;
  7. import java.util.concurrent.CompletionStage;
  8. import java.util.concurrent.ThreadLocalRandom;
  9. import javax.inject.Inject;
  10. import models.Fortune;
  11. import models.World;
  12. import play.libs.Json;
  13. import play.mvc.Controller;
  14. import play.mvc.Result;
  15. import utils.DatabaseExecutionContext;
  16. public class Application extends Controller {
  17. private final DatabaseExecutionContext dbEc;
  18. @Inject
  19. public Application(final DatabaseExecutionContext dbEc) {
  20. this.dbEc = dbEc;
  21. }
  22. public CompletionStage<Result> db() {
  23. return getRandomWorlds(1).thenApply(worlds -> ok(Json.toJson(worlds.get(0))));
  24. }
  25. public CompletionStage<Result> queries(final String queries) {
  26. return getRandomWorlds(queryCount(queries)).thenApply(worlds -> ok(Json.toJson(worlds)));
  27. }
  28. public CompletionStage<Result> fortunes() {
  29. return CompletableFuture.supplyAsync(() -> {
  30. final List<Fortune> fortunes = Fortune.findAll();
  31. fortunes.add(new Fortune("Additional fortune added at request time."));
  32. Collections.sort(fortunes, (f1, f2) -> f1.message.compareTo(f2.message));
  33. return ok(views.html.fortunes.render(fortunes));
  34. }, dbEc);
  35. }
  36. public CompletionStage<Result> update(final String queries) {
  37. return getRandomWorlds(queryCount(queries)).thenApplyAsync(worlds -> {
  38. final Random random = ThreadLocalRandom.current();
  39. for (final World world : worlds) {
  40. world.randomNumber = (long) (random.nextInt(10000) + 1);
  41. }
  42. final List<World> updatedWorlds = World.save(worlds);
  43. return ok(Json.toJson(updatedWorlds));
  44. }, dbEc);
  45. }
  46. private int queryCount(final String queryCountString) {
  47. int queryCount;
  48. try {
  49. queryCount = Integer.parseInt(queryCountString, 10);
  50. } catch (final NumberFormatException e) {
  51. queryCount = 1;
  52. }
  53. if (queryCount < 1) {
  54. queryCount = 1;
  55. } else if (queryCount > 500) {
  56. queryCount = 500;
  57. }
  58. return queryCount;
  59. }
  60. private CompletionStage<List<World>> getRandomWorlds(final int n) {
  61. return CompletableFuture.supplyAsync(() -> {
  62. final Random random = ThreadLocalRandom.current();
  63. final List<World> worlds = new ArrayList<>(n);
  64. for (int i = 0; i < n; ++i) {
  65. long randomId = random.nextInt(10000) + 1;
  66. final World world = World.find(randomId);
  67. worlds.add(world);
  68. }
  69. return worlds;
  70. }, dbEc);
  71. }
  72. }