View Javadoc
1   package ordertracker.rs;
2   
3   import java.util.ArrayList;
4   import java.util.List;
5   
6   import javax.ws.rs.GET;
7   import javax.ws.rs.POST;
8   import javax.ws.rs.PUT;
9   import javax.ws.rs.Path;
10  import javax.ws.rs.PathParam;
11  import javax.ws.rs.Produces;
12  import javax.ws.rs.QueryParam;
13  import javax.ws.rs.core.MediaType;
14  import javax.ws.rs.core.Response;
15  
16  import ordertracker.Depot;
17  import ordertracker.Order;
18  
19  @Path("/")
20  public class Service {
21  
22  	@POST
23  	@Path("/order/{orderId}/create")
24  	public Response createOrder(@PathParam("orderId") String orderId,
25  			@QueryParam("description") String description,
26  			@QueryParam("fromAddress") String fromAddress,
27  			@QueryParam("toAddress") String toAddress,
28  			@QueryParam("destinationEmail") String destinationEmail,
29  			@QueryParam("senderEmail") String senderEmail,
30  			@QueryParam("maxAttempts") Integer maxAttempts,
31  			@QueryParam("comment") String comment) {
32  		Order.create(new Order.Events.Create(orderId, description, fromAddress,
33  				toAddress, destinationEmail, senderEmail, maxAttempts, comment));
34  		return Response.ok("order created").build();
35  	}
36  
37  	@PUT
38  	@Path("/order/{orderId}/send")
39  	public Response sendOrder(@PathParam("orderId") String orderId) {
40  		Order order = Order.find(orderId).get();
41  		order.signal(new Order.Events.Send());
42  		return Response.ok("order sent").build();
43  	}
44  
45  	@PUT
46  	@Path("/order/{orderId}/assign")
47  	public Response assignToCourier(@PathParam("orderId") String orderId) {
48  		Order order = Order.find(orderId).get();
49  		order.signal(new Order.Events.Assign());
50  		return Response.ok("order assigned to a courier").build();
51  	}
52  
53  	@PUT
54  	@Path("/order/{orderId}/pickedUp")
55  	public Response pickedUpByCourier(@PathParam("orderId") String orderId) {
56  		Order order = Order.find(orderId).get();
57  		order.signal(new Order.Events.PickedUp());
58  		return Response.ok("order picked up by a courier").build();
59  	}
60  
61  	@PUT
62  	@Path("/order/{orderId}/arrivedDepot")
63  	public Response arrivedDepot(@PathParam("orderId") String orderId,
64  			@QueryParam("depotId") String depotId) {
65  		Order order = Order.find(orderId).get();
66  		order.signal(new Order.Events.ArrivedDepot(depotId));
67  		return Response.ok("arrived depot " + depotId).build();
68  	}
69  
70  	@PUT
71  	@Path("/order/{orderId}/arrivedFinalDepot")
72  	public Response arrivedFinalDepot(@PathParam("orderId") String orderId,
73  			@QueryParam("depotId") String depotId) {
74  		Order order = Order.find(orderId).get();
75  		order.signal(new Order.Events.ArrivedFinalDepot(depotId));
76  		return Response.ok("arrived final depot " + depotId).build();
77  	}
78  
79  	@PUT
80  	@Path("/order/{orderId}/delivering")
81  	public Response delivering(@PathParam("orderId") String orderId) {
82  		Order order = Order.find(orderId).get();
83  		order.signal(new Order.Events.Delivering());
84  		return Response.ok("delivering").build();
85  	}
86  
87  	@PUT
88  	@Path("/order/{orderId}/delivered")
89  	public Response delivered(@PathParam("orderId") String orderId) {
90  		Order order = Order.find(orderId).get();
91  		order.signal(new Order.Events.Delivered());
92  		return Response.ok("delivered").build();
93  	}
94  
95  	@PUT
96  	@Path("/order/{orderId}/deliveryFailed")
97  	public Response deliveryFailed(@PathParam("orderId") String orderId) {
98  		Order order = Order.find(orderId).get();
99  		order.signal(new Order.Events.DeliveryFailed());
100 		return Response.ok("delivery failed").build();
101 	}
102 
103 	@PUT
104 	@Path("/order/{orderId}/deliveryAgain")
105 	public Response deliverAgain(@PathParam("orderId") String orderId) {
106 		Order order = Order.find(orderId).get();
107 		order.signal(new Order.Events.DeliverAgain());
108 		return Response.ok("marked for delivery again").build();
109 	}
110 
111 	@GET
112 	@Path("/depot/{depotId}/ordersReadyForDelivery")
113 	@Produces(MediaType.APPLICATION_JSON)
114 	public Response getOrdersReadyForDelivery(
115 			@PathParam("depotId") String depotId) {
116 		Depot depot = Depot.find(depotId).get();
117 		List<Order> list = new ArrayList<Order>();
118 		for (Order order : depot.getOrder_R1())
119 			if (Order.State.READY_FOR_DELIVERY.toString().equals(
120 					order.getStatus()))
121 				list.add(order);
122 
123 		return Response.ok("{ \"count\" : \"" + list.size() + "\"}",
124 				MediaType.APPLICATION_JSON).build();
125 	}
126 
127 	@GET
128 	@Path("/order/{orderId}/status")
129 	@Produces("text/plain")
130 	public Response getOrderStatus(@PathParam("orderId") String orderId) {
131 		Order order = Order.find(orderId).get();
132 		return Response.ok(order.getState(), MediaType.TEXT_PLAIN).build();
133 	}
134 
135 	// @GET
136 	// @Path("/sse")
137 	// @Produces(SseFeature.SERVER_SENT_EVENTS)
138 	// public EventOutput getEvents() {
139 	// System.out.println("starting to get server-side events");
140 	// final EventOutput eventOutput = new EventOutput();
141 	// EventService.instance().events()
142 	// .subscribe(new Subscriber<String>() {
143 	//
144 	// @Override
145 	// public void onCompleted() {
146 	// // do nothing
147 	// }
148 	//
149 	// @Override
150 	// public void onError(Throwable e) {
151 	// e.printStackTrace();
152 	// }
153 	//
154 	// @Override
155 	// public void onNext(String data) {
156 	// try {
157 	// OutboundEvent event = new OutboundEvent.Builder()
158 	// .data(String.class, data).build();
159 	// eventOutput.write(event);
160 	// System.out.println("sent message " + data);
161 	// } catch (IOException e) {
162 	// onError(e);
163 	// } finally {
164 	// unsubscribe();
165 	// }
166 	//
167 	// }
168 	// });
169 	// return eventOutput;
170 	// }
171 
172 }