PageRenderTime 53ms CodeModel.GetById 25ms RepoModel.GetById 0ms app.codeStats 0ms

/contribs/bill-burke-book/ex09_2/src/main/java/com/restfully/shop/services/OrderResource.java

https://github.com/imyousuf/jersey
Java | 196 lines | 163 code | 16 blank | 17 comment | 16 complexity | 0141ceb7eea6ab10124ed84b8a741f55 MD5 | raw file
Possible License(s): Apache-2.0, BSD-3-Clause-No-Nuclear-License-2014, GPL-2.0
  1. /*
  2. * This library is free software; you can redistribute it and/or modify it under the terms of
  3. * the GNU Lesser General Public License as published by the Free Software Foundation;
  4. * either version 2.1 of the License, or (at your option) any later version.
  5. *
  6. * This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
  7. * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
  8. * PURPOSE. See the GNU Lesser General Public License for more details.
  9. *
  10. * You should have received a copy of the GNU Lesser General Public License along with this
  11. * library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
  12. * Boston, MA 02110-1301 USA
  13. */
  14. package com.restfully.shop.services;
  15. import com.restfully.shop.domain.Link;
  16. import com.restfully.shop.domain.Order;
  17. import com.restfully.shop.domain.Orders;
  18. //import org.jboss.resteasy.annotations.providers.jaxb.Formatted;
  19. import javax.ws.rs.Consumes;
  20. import javax.ws.rs.DefaultValue;
  21. import javax.ws.rs.GET;
  22. import javax.ws.rs.HEAD;
  23. import javax.ws.rs.POST;
  24. import javax.ws.rs.Path;
  25. import javax.ws.rs.PathParam;
  26. import javax.ws.rs.Produces;
  27. import javax.ws.rs.QueryParam;
  28. import javax.ws.rs.WebApplicationException;
  29. import javax.ws.rs.core.Context;
  30. import javax.ws.rs.core.Response;
  31. import javax.ws.rs.core.UriBuilder;
  32. import javax.ws.rs.core.UriInfo;
  33. import java.net.URI;
  34. import java.util.ArrayList;
  35. import java.util.Hashtable;
  36. import java.util.List;
  37. import java.util.Map;
  38. import java.util.concurrent.atomic.AtomicInteger;
  39. @Path("/orders")
  40. public class OrderResource
  41. {
  42. private Map<Integer, Order> orderDB = new Hashtable<Integer, Order>();
  43. private AtomicInteger idCounter = new AtomicInteger();
  44. @POST
  45. @Consumes("application/xml")
  46. public Response createOrder(Order order, @Context UriInfo uriInfo)
  47. {
  48. order.setId(idCounter.incrementAndGet());
  49. orderDB.put(order.getId(), order);
  50. System.out.println("Created order " + order.getId());
  51. UriBuilder builder = uriInfo.getAbsolutePathBuilder();
  52. builder.path(Integer.toString(order.getId()));
  53. return Response.created(builder.build()).build();
  54. }
  55. @GET
  56. @Path("{id}")
  57. @Produces("application/xml")
  58. public Response getOrder(@PathParam("id") int id, @Context UriInfo uriInfo)
  59. {
  60. Order order = orderDB.get(id);
  61. if (order == null)
  62. {
  63. throw new WebApplicationException(Response.Status.NOT_FOUND);
  64. }
  65. Response.ResponseBuilder builder = Response.ok(order);
  66. if (!order.isCancelled()) addCancelHeader(uriInfo, builder);
  67. return builder.build();
  68. }
  69. protected void addCancelHeader(UriInfo uriInfo, Response.ResponseBuilder builder)
  70. {
  71. UriBuilder absolute = uriInfo.getAbsolutePathBuilder();
  72. String cancelUrl = absolute.clone().path("cancel").build().toString();
  73. builder.header("Link", new Link("cancel", cancelUrl, null));
  74. }
  75. @POST
  76. @Path("{id}/cancel")
  77. public void cancelOrder(@PathParam("id") int id)
  78. {
  79. Order order = orderDB.get(id);
  80. if (order == null)
  81. {
  82. throw new WebApplicationException(Response.Status.NOT_FOUND);
  83. }
  84. order.setCancelled(true);
  85. }
  86. @HEAD
  87. @Path("{id}")
  88. @Produces("application/xml")
  89. public Response getOrderHeaders(@PathParam("id") int id, @Context UriInfo uriInfo)
  90. {
  91. Order order = orderDB.get(id);
  92. if (order == null)
  93. {
  94. throw new WebApplicationException(Response.Status.NOT_FOUND);
  95. }
  96. Response.ResponseBuilder builder = Response.ok();
  97. builder.type("application/xml");
  98. if (!order.isCancelled()) addCancelHeader(uriInfo, builder);
  99. return builder.build();
  100. }
  101. @GET
  102. @Produces("application/xml")
  103. // @Formatted
  104. public Response getOrders(@QueryParam("start") int start,
  105. @QueryParam("size") @DefaultValue("2") int size,
  106. @Context UriInfo uriInfo)
  107. {
  108. UriBuilder builder = uriInfo.getAbsolutePathBuilder();
  109. builder.queryParam("start", "{start}");
  110. builder.queryParam("size", "{size}");
  111. ArrayList<Order> list = new ArrayList<Order>();
  112. ArrayList<Link> links = new ArrayList<Link>();
  113. synchronized (orderDB)
  114. {
  115. int i = 0;
  116. for (Order order : orderDB.values())
  117. {
  118. if (i >= start && i < start + size) list.add(order);
  119. i++;
  120. }
  121. // next link
  122. if (start + size < orderDB.size())
  123. {
  124. int next = start + size;
  125. URI nextUri = builder.clone().build(next, size);
  126. Link nextLink = new Link("next", nextUri.toString(), "application/xml");
  127. links.add(nextLink);
  128. }
  129. // previous link
  130. if (start > 0)
  131. {
  132. int previous = start - size;
  133. if (previous < 0) previous = 0;
  134. URI previousUri = builder.clone().build(previous, size);
  135. Link previousLink = new Link("previous", previousUri.toString(), "application/xml");
  136. links.add(previousLink);
  137. }
  138. }
  139. Orders orders = new Orders();
  140. orders.setOrders(list);
  141. orders.setLinks(links);
  142. Response.ResponseBuilder responseBuilder = Response.ok(orders);
  143. addPurgeLinkHeader(uriInfo, responseBuilder);
  144. return responseBuilder.build();
  145. }
  146. protected void addPurgeLinkHeader(UriInfo uriInfo, Response.ResponseBuilder builder)
  147. {
  148. UriBuilder absolute = uriInfo.getAbsolutePathBuilder();
  149. String purgeUrl = absolute.clone().path("purge").build().toString();
  150. builder.header("Link", new Link("purge", purgeUrl, null));
  151. }
  152. @POST
  153. @Path("purge")
  154. public void purgeOrders()
  155. {
  156. synchronized (orderDB)
  157. {
  158. List<Order> orders = new ArrayList<Order>();
  159. orders.addAll(orderDB.values());
  160. for (Order order : orders)
  161. {
  162. if (order.isCancelled())
  163. {
  164. orderDB.remove(order.getId());
  165. }
  166. }
  167. }
  168. }
  169. @HEAD
  170. @Produces("application/xml")
  171. public Response getOrdersHeaders(@QueryParam("start") int start,
  172. @QueryParam("size") @DefaultValue("2") int size,
  173. @Context UriInfo uriInfo)
  174. {
  175. Response.ResponseBuilder builder = Response.ok();
  176. builder.type("application/xml");
  177. addPurgeLinkHeader(uriInfo, builder);
  178. return builder.build();
  179. }
  180. }