package de.escalon.hypermedia.sample.store; import de.escalon.hypermedia.affordance.TypedResource; import de.escalon.hypermedia.sample.beans.store.Offer; import de.escalon.hypermedia.sample.beans.store.Product; import de.escalon.hypermedia.sample.beans.store.Store; import de.escalon.hypermedia.spring.AffordanceBuilder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.hateoas.Resources; import org.springframework.http.HttpEntity; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Currency; import java.util.List; import static de.escalon.hypermedia.spring.AffordanceBuilder.linkTo; import static de.escalon.hypermedia.spring.AffordanceBuilder.methodOn; /** * Created by Dietrich on 17.02.2015. */ @RequestMapping("/store") @Controller public class StoreController { @Autowired ProductController productController; @RequestMapping public @ResponseBody Store getStoreWithOffers() { Store store = createStoreWithOffers(); List<Offer> offers = store.getMakesOffer(); for (Offer offer : offers) { Product itemOffered = offer.getItemOffered(); itemOffered.add(linkTo(methodOn(OrderController.class).makeOrder(itemOffered)) .rel(new TypedResource("Order"), "orderedItem") .build()); } // TODO: support rev for links and make hydra collection aware of @reverse terms in context - both should work store.add(linkTo(methodOn(OrderController.class).getOrders(null)).reverseRel("seller", "orders") .build()); return store; } public HttpEntity<Resources<Offer>> getOffers() { Resources<Offer> offers = new Resources<Offer>( mockOffers()); return new HttpEntity<Resources<Offer>>(offers); } private List<Offer> mockOffers() { List<Offer> offers = new ArrayList<Offer>(); offers.add(createOffer(productController.getProduct("9052001"), 2.80)); offers.add(createOffer(productController.getProduct("9052002"), 1.40)); offers.add(createOffer(productController.getProduct("9052003"), 1.10)); offers.add(createOffer(productController.getProduct("9052004"), 1.50)); offers.add(createOffer(productController.getProduct("9052005"), 2.20)); return offers; } public Store createStoreWithOffers() { Store store = createStoreWithoutOffers(); List<Offer> offers = mockOffers(); for (Offer offer : offers) { store.addOffer(offer); } return store; } public Store createStoreWithoutOffers() { Store store = new Store(); store.add(AffordanceBuilder.linkTo(methodOn(this .getClass()).getStoreWithOffers()) .withSelfRel()); // make it an error if manages blcok is incompliet return store; } private Offer createOffer(Product product, double val) { Offer offer = new Offer(); offer.setItemOffered(product); BigDecimal price = BigDecimal.valueOf(val) .setScale(2); offer.setPrice(price); offer.setPriceCurrency(Currency.getInstance("EUR")); return offer; } }