Application.java 4.0 KB

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