package com.yummynoodlebar.rest.domain; import com.yummynoodlebar.core.events.orders.OrderDetails; // {!begin import} import org.springframework.hateoas.ResourceSupport; // {!end import} import com.yummynoodlebar.rest.controller.*; import javax.xml.bind.annotation.XmlRootElement; import java.io.Serializable; import java.util.Collections; import java.util.Date; import java.util.Map; import java.util.UUID; import static org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo; //TODOCUMENT This is added so that we can do jaxb serialisation. //this type of annotation is fine here, as this //Order implementation is made for integration with things like this. @XmlRootElement // {!begin resourceSupport} public class Order extends ResourceSupport implements Serializable { // {!end resourceSupport} private Date dateTimeOfSubmission; private Map<String, Integer> items; private UUID key; public Date getDateTimeOfSubmission() { return dateTimeOfSubmission; } public UUID getKey() { return key; } public Map<String, Integer> getItems() { return items; } public void setItems(Map<String, Integer> items) { if (items == null) { this.items = Collections.emptyMap(); } else { this.items = Collections.unmodifiableMap(items); } } public void setDateTimeOfSubmission(Date dateTimeOfSubmission) { this.dateTimeOfSubmission = dateTimeOfSubmission; } public void setKey(UUID key) { this.key = key; } public OrderDetails toOrderDetails() { OrderDetails details = new OrderDetails(); details.setOrderItems(items); details.setKey(key); details.setDateTimeOfSubmission(dateTimeOfSubmission); return details; } // {!begin fromOrderDetails} public static Order fromOrderDetails(OrderDetails orderDetails) { Order order = new Order(); order.dateTimeOfSubmission = orderDetails.getDateTimeOfSubmission(); order.key = orderDetails.getKey(); order.setItems(orderDetails.getOrderItems()); //TODOCUMENT. Adding the library, the above extends ResourceSupport and //this section is all that is actually needed in our model to add hateoas support. //Much of the rest of the framework is helping deal with the blending of domains that happens in many spring apps //We have explicitly avoided that. // {!begin selfRel} order.add(linkTo(OrderQueriesController.class).slash(order.key).withSelfRel()); // {!end selfRel} // {!begin status} order.add(linkTo(OrderQueriesController.class).slash(order.key).slash("status").withRel("Order Status")); // {!end status} order.add(linkTo(OrderQueriesController.class).slash(order.key).slash("paymentdetails").withRel("Payment Details")); return order; } // {!end fromOrderDetails} }