/jacksonexampletest/src/main/java/csc375/jacksonexampletest/JacksonExampleTest.java

https://bitbucket.org/jdblake/csc375-18sp · Java · 113 lines · 89 code · 20 blank · 4 comment · 0 complexity · db7a2a0ae94a2145d32dc2893fd20196 MD5 · raw file

  1. import akka.Done;
  2. import akka.NotUsed;
  3. import akka.actor.ActorSystem;
  4. import akka.http.javadsl.ConnectHttp;
  5. import akka.http.javadsl.Http;
  6. import akka.http.javadsl.ServerBinding;
  7. import akka.http.javadsl.marshallers.jackson.Jackson;
  8. import akka.http.javadsl.model.HttpRequest;
  9. import akka.http.javadsl.model.HttpResponse;
  10. import akka.http.javadsl.model.StatusCodes;
  11. import akka.http.javadsl.server.AllDirectives;
  12. import akka.http.javadsl.server.Route;
  13. import akka.stream.ActorMaterializer;
  14. import akka.stream.javadsl.Flow;
  15. import com.fasterxml.jackson.annotation.JsonCreator;
  16. import com.fasterxml.jackson.annotation.JsonProperty;
  17. import java.util.List;
  18. import java.util.Optional;
  19. import java.util.concurrent.CompletableFuture;
  20. import java.util.concurrent.CompletionStage;
  21. import static akka.http.javadsl.server.PathMatchers.longSegment;
  22. public class JacksonExampleTest extends AllDirectives {
  23. public static void main(String[] args) throws Exception {
  24. // boot up server using the route as defined below
  25. ActorSystem system = ActorSystem.create("routes");
  26. final Http http = Http.get(system);
  27. final ActorMaterializer materializer = ActorMaterializer.create(system);
  28. //In order to access all directives we need an instance where the routes are define.
  29. JacksonExampleTest app = new JacksonExampleTest();
  30. final Flow<HttpRequest, HttpResponse, NotUsed> routeFlow = app.createRoute().flow(system, materializer);
  31. final CompletionStage<ServerBinding> binding = http.bindAndHandle(routeFlow,
  32. ConnectHttp.toHost("localhost", 8080), materializer);
  33. System.out.println("Server online at http://localhost:8080/\nPress RETURN to stop...");
  34. System.in.read(); // let it run until user presses return
  35. binding
  36. .thenCompose(ServerBinding::unbind) // trigger unbinding from the port
  37. .thenAccept(unbound -> system.terminate()); // and shutdown when done
  38. }
  39. // (fake) async database query api
  40. private CompletionStage<Optional<Item>> fetchItem(long itemId) {
  41. return CompletableFuture.completedFuture(Optional.of(new Item("foo", itemId)));
  42. }
  43. // (fake) async database query api
  44. private CompletionStage<Done> saveOrder(final Order order) {
  45. return CompletableFuture.completedFuture(Done.getInstance());
  46. }
  47. private Route createRoute() {
  48. return route(
  49. get(() ->
  50. pathPrefix("item", () ->
  51. path(longSegment(), (Long id) -> {
  52. final CompletionStage<Optional<Item>> futureMaybeItem = fetchItem(id);
  53. return onSuccess(futureMaybeItem, maybeItem ->
  54. maybeItem.map(item -> completeOK(item, Jackson.marshaller()))
  55. .orElseGet(() -> complete(StatusCodes.NOT_FOUND, "Not Found"))
  56. );
  57. }))),
  58. post(() ->
  59. path("create-order", () ->
  60. entity(Jackson.unmarshaller(Order.class), order -> {
  61. CompletionStage<Done> futureSaved = saveOrder(order);
  62. return onSuccess(futureSaved, done ->
  63. complete("order created")
  64. );
  65. })))
  66. );
  67. }
  68. private static class Item {
  69. final String name;
  70. final long id;
  71. @JsonCreator
  72. Item(@JsonProperty("name") String name, @JsonProperty("id") long id) {
  73. this.name = name;
  74. this.id = id;
  75. }
  76. public String getName() {
  77. return name;
  78. }
  79. public long getId() {
  80. return id;
  81. }
  82. }
  83. private static class Order {
  84. final List<Item> items;
  85. @JsonCreator
  86. Order(@JsonProperty("items") List<Item> items) {
  87. this.items = items;
  88. }
  89. public List<Item> getItems() {
  90. return items;
  91. }
  92. }
  93. }