Application.java 2.9 KB

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