Application.java 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. package hello;
  2. import com.hellokaton.blade.Blade;
  3. import com.hellokaton.blade.mvc.RouteContext;
  4. import com.hellokaton.blade.mvc.http.StringBody;
  5. import com.hellokaton.blade.mvc.BladeConst;
  6. import hello.model.Fortune;
  7. import hello.model.Message;
  8. import hello.model.World;
  9. import java.util.List;
  10. import java.util.concurrent.ThreadLocalRandom;
  11. import java.util.stream.Stream;
  12. import static com.hellokaton.anima.Anima.select;
  13. import static com.hellokaton.anima.Anima.update;
  14. import static com.hellokaton.blade.mvc.BladeConst.ENV_KEY_REQUEST_LOG;
  15. import static java.util.Comparator.comparing;
  16. import static java.util.stream.Collectors.toList;
  17. /**
  18. * Blade Application
  19. *
  20. * @author hellokaton
  21. * @date 2022/5/10
  22. */
  23. public class Application {
  24. private static final StringBody PLAINTEXT = StringBody.of("Hello, World!");
  25. private static final String JSON_CONTENT_TYPE = "application/json";
  26. private static final String ADDITIONAL_FORTUNE = "Additional fortune added at request time.";
  27. private static final int DB_ROWS = 10000;
  28. private static int getQueries(String queries) {
  29. try {
  30. int count = Integer.valueOf(queries);
  31. return Math.min(500, Math.max(1, count));
  32. } catch (Exception e) {
  33. return 1;
  34. }
  35. }
  36. private static Integer generateId() {
  37. return 1 + ThreadLocalRandom.current().nextInt(DB_ROWS);
  38. }
  39. private static List<Integer> generateIdList(int size) {
  40. return Stream.iterate(0, num -> num + 1).limit(size)
  41. .map(i -> generateId())
  42. .collect(toList());
  43. }
  44. private static void db(RouteContext ctx) {
  45. World world = select().from(World.class).byId(generateId());
  46. ctx.contentType(JSON_CONTENT_TYPE)
  47. .json(world);
  48. }
  49. private static void queries(RouteContext ctx) {
  50. int queries = getQueries(ctx.query("queries", "1"));
  51. List<Integer> idList = generateIdList(queries);
  52. List<World> worlds = idList.stream()
  53. .map(id -> select().from(World.class).byId(id))
  54. .collect(toList());
  55. ctx.contentType(JSON_CONTENT_TYPE)
  56. .json(worlds);
  57. }
  58. private static void updates(RouteContext ctx) {
  59. int queries = getQueries(ctx.query("queries", "1"));
  60. List<Integer> idList = generateIdList(queries);
  61. List<World> worlds = idList.stream()
  62. .map(id -> select().from(World.class).byId(id))
  63. .peek(Application::updateWorld).collect(toList());
  64. ctx.contentType(JSON_CONTENT_TYPE)
  65. .json(worlds);
  66. }
  67. private static void updateWorld(World world) {
  68. int number = generateId();
  69. update().from(World.class)
  70. .set("randomNumber", number)
  71. .where("id", world.getId())
  72. .execute();
  73. world.setRandomNumber(number);
  74. }
  75. private static void fortunes(RouteContext ctx) {
  76. List<Fortune> fortunes = select().from(Fortune.class).all();
  77. fortunes.add(new Fortune(0, ADDITIONAL_FORTUNE));
  78. fortunes.sort(comparing(Fortune::getMessage));
  79. ctx.attribute("fortunes", fortunes);
  80. ctx.render("fortunes.html");
  81. }
  82. public static void main(String[] args) {
  83. Blade.create()
  84. .get("/json", ctx ->
  85. ctx.contentType(JSON_CONTENT_TYPE)
  86. .json(new Message())
  87. )
  88. .get("/plaintext", ctx ->
  89. ctx.contentType("text/plain")
  90. .body(PLAINTEXT)
  91. )
  92. .get("/db", Application::db)
  93. .get("/queries", Application::queries)
  94. .get("/updates", Application::updates)
  95. .get("/fortunes", Application::fortunes)
  96. .disableSession()
  97. .setEnv(ENV_KEY_REQUEST_LOG, false)
  98. .start(Application.class, args);
  99. }
  100. }